forked from axiom-team/astroport
1 line
1.6 MiB
1 line
1.6 MiB
{"version":3,"sources":["../dist/dist_js/app/entities/peer.js","../dist/dist_js/app/entities/block.js","../dist/dist_js/app/entities/ws2pmessage.js","../dist/dist_js/app/controllers/login-controllers.js","../dist/dist_js/app/controllers/help-controllers.js","../dist/dist_js/app/platform.js","../dist/dist_js/app/services/settings-services.js","../dist/dist_js/app/services/network-services.js","../dist/dist_js/app/services/desktop-services.js","../dist/dist_js/app/services/crypto-services.js","../dist/dist_js/app/services/utils-services.js","../dist/dist_js/app/services/cache-services.js","../dist/dist_js/app/services/modal-services.js","../dist/dist_js/app/services/http-services.js","../dist/dist_js/app/services/storage-services.js","../dist/dist_js/app/services/device-services.js","../dist/dist_js/app/services/currency-services.js","../dist/dist_js/app/services/bma-services.js","../dist/dist_js/app/services/wot-services.js","../dist/dist_js/app/services/tx-services.js","../dist/dist_js/app/services/wallet-services.js","../dist/dist_js/app/services/help-services.js","../dist/dist_js/app/services/plugin-services.js","../dist/dist_js/app/services.js","../dist/dist_js/app/api/api-demo-services.js","../dist/dist_js/app/templates.js","../dist/dist_js/app/translations.js","../dist/dist_js/app/api/app.js","../dist/dist_js/app/directives.js","../dist/dist_js/app/filters.js"],"names":["Peer","json","that","this","Object","keys","forEach","key","endpoints","Block","attributes","length","_","identitiesCount","identities","joinersCount","joiners","activesCount","actives","leaversCount","leavers","revokedCount","revoked","excludedCount","excluded","certificationsCount","certifications","transactionsCount","transactions","empty","isEmpty","id","number","hash","join","Ws2pMessage","message","parts","split","startsWith","Error","pubkey","buid","prefix","matches","regexp","WS2P_PREFIX","exec","privateOptions","private","useTor","mode","substring","publicOptions","public","ws2pid","software","version","powPrefix","LoginController","$scope","$timeout","$controller","csWallet","angular","extend","showLoginModal","loading","isLogin","error","login","$on","LoginModalController","$q","$ionicPopover","$window","CryptoUtils","csCrypto","ionicReady","UIUtils","BMA","Modals","csConfig","csSettings","Device","parameters","demo","method","computing","formData","showPubkey","showComputePubkeyButton","autoComputePubkey","pubkeyPattern","format","constants","PUBKEY","PUBKEY_WITH_CHECKSUM","isAuth","auth","okText","title","showMethods","isDefined","showNewAccountLink","expectedPubkey","expectedUid","uid","scryptParamsValues","SCRYPT_PARAMS","reduce","res","concat","label","params","init","then","ionic","Platform","grade","toLowerCase","screen","isSmall","rememberMe","data","keepAuthIdle","keepAuth","KEEP_AUTH_IDLE_SESSION","changeMethod","enter","hide","ink","selector","leave","methods","doLogin","skipForm","form","$valid","promise","username","password","scryptPrams","scrypt","show","scryptKeypair","keypair","util","encode_base58","signPk","pubkeyError","undefined","catch","onError","file","valid","readKeyFile","withSecret","trim","showWotLookupModal","pkChecksum","$error","checksum","rememberMeChanged","equals","keepAuthIdleChanged","methodChanged","paramsChanged","useLocalStorage","store","success","silent","closeModal","console","warn","onScryptFormChanged","computePubkey","$watch","salt","pwd","scryptSignPk","err","showJoinModal","showJoin","showAccountSecurityModal","showAccountSecurity","showHelpModal","showHelp","doScan","barcode","scan","when","uri","parse","debug","keyfile","parseData","signSk","base58","encode","hideMethodsPopover","alert","$submitted","find","item","findWhere","changeScrypt","copy","options","showPassword","subTitle","scope","read","ucode","errorCodes","BAD_PASSWORD","onFileChanged","fileData","name","size","content","fileContent","validatingFile","removeKeyFile","searchText","showWotLookup","q","showMethodsPopover","event","defaultPrevented","popover","templateUrl","autoremove","afterShow","methodsPopover","AuthController","config","readonly","setForm","HelpController","$state","$anchorScroll","e","locale","stateParams","anchor","HelpModalController","itemsClass","listClass","HelpTipController","$ionicSideMenuDelegate","csCurrency","csHelpConstants","tour","continue","executeStep","partName","steps","index","step","next","isUndefined","showHelpTip","bindings","value","hasNext","timeout","enable","backdropClickToClose","helptip","helpAnchor","startHelpTour","startWalletNoLoginTour","startWalletTour","endIndex","wallet","startWalletCertTour","walletCerts","startTxTour","tx","startWalletsTour","wallets","startHeaderTour","startSettingsTour","startWotLookupTour","cancelled","wotLookup","startWotTour","wot","startWotCertTour","wotCerts","startCurrencyTour","currency","startNetworkTour","network","finishTour","startIndex","contentParams","toggleLeft","icon","position","isOpen","go","useRelative","glyph","is","retry","get","showNetworkTabIfNeed","tabs","document","querySelectorAll","element","triggerHandler","installDocUrl","getElementById","currentUD","hasCertificationsItem","isMember","requirements","pendingMembership","stepCount","skipAll","_getProfilBtnElement","elements","el","offsetWidth","style","closeProfilePopover","all","showHome","HelpTourController","state","module","factory","$rootScope","Api","localStorage","$translate","locales","flag","fallbackLocale","fallbackLanguage","fixLocale","localeParts","similarLocale","l","String","prototype","call","previousData","startPromise","fixedLocale","STORAGE_KEY","fixedSettings","cacheTimeMs","timeWarningExpireMembership","timeWarningExpire","minVersion","sourceUrl","sourceLicenseUrl","newIssueUrl","userForumUrl","latestReleaseUrl","duniterLatestReleaseUrl","httpsMode","defaultSettings","merge","useLocalStorageEncryption","persistCache","walletHistoryTimeSecond","walletHistorySliceSecond","walletHistoryAutoRefresh","showUDHistory","expertMode","decimalCount","uiEffects","blockValidityWindow","header","settings","allRules","allWotRules","alertIfUnusedWallet","defaultLanguage","use","license","en","fr-FR","es-ES","started","api","emitChangedEvent","raise","changed","node","temporary","getObject","previousSettings","savedData","setObject","raisePromise","start","applyData","newData","localeChanged","localeId","restore","now","Date","storedData","ready","moment","substr","numeral","language","registerEvent","isStarted","apply","getByPath","path","defaultValue","obj","each","reset","getLicenseUrl","getFeedUrl","feed","jsonFeed","$interval","csHttp","interval","isHttpsMode","location","protocol","bma","listeners","peers","filter","member","mirror","endpoint","online","ssl","tor","sort","type","asc","compact","groupBy","knownBlocks","mainBlock","minOnlineBlockNumber","uidsByPubkeys","searchingPeersOnNetwork","difficulties","ws2pHeads","block","loadW2spHeads","ws2p","heads","hit","sig","head","HTTP_LIMITATION","loadDifficulties","blockchain","stats","levels","level","loadPeers","newPeers","cancel","flushNewPeersAndSort","sortPeers","initJobs","uids","push","addOrRefreshPeerFromJson","jobs","status","blockNumber","parseInt","ep","hasEndpoint","privateWs2pHeads","values","privateEPCount","hasEndPoint","currentNumber","peer","useWs2p","keyID","difficulty","applyPeerFilter","oldBlock","isBma","isWs2p","isSsl","isTor","list","createPeerEntities","hasUpdates","existingPeer","existingMainBuid","existingOnline","refreshPeer","refreshedPeer","existingIndex","indexOf","server","splice","useBma","endpointsAsString","getEndpoints","epStr","parseEndPoint","getServer","dns","getDns","getHost","ws2pHeadKey","useSsl","lightInstance","getPort","current","medianTime","NO_CURRENT_BLOCK","ROOT_BLOCK_HASH","secondTry","getBMA","port","hardship","summary","duniter","updateMainBuid","ids","map","newPeersAdded","computeScoreAlphaValue","nbChars","score","charCodeAt","i","Math","pow","buids","memberPeersCount","count","previousPeer","pct","max","hasMainConsensusBlock","hasConsensusBlock","consensusBlockDelta","uniq","sortBy","compacted","mainBlockChanged","close","info","websocket","onListener","remove","$q_started","callback","hasPeers","getPeers","getTrustedPeers","resolve","reject","getKnownBlocks","getMainBlockUid","mainBuid","isBusy","isDesktop","CryptoAbstractService","loaded","source","isLoaded","array_to_string","buf","bb","Blob","Uint8Array","f","FileReader","onload","target","result","readAsText","crypto_sign_BYTES","crypto_secretbox_NONCEBYTES","crypto_box_MACBYTES","SEED_LENGTH","SIMPLE","N","r","p","memory","DEFAULT","async_load_base58","on_ready","Base58","async_load_scrypt","scrypt_module_factory","async_load_nacl_js","nacl_factory","instantiate","async_load_base64","Base64","async_load_sha256","sha256","seed_from_signSk","seed","crypto","window","msCrypto","Crypto","FullJSServiceFactory","nacl","base64","check","function_name","check_injectBytes","what","thing","expected_length","leftPadding","check_length","bs","address","MALLOC","nacl_raw","HEAPU8","set","injectBytes","nbytes","_malloc","FREE","pointer","_free","Target","decode_utf8","s","d","unescape","encodeURIComponent","b","encode_utf8","a","decode_base58","decode","decode_base64","encode_base64","hash_sha256","msg","to_hex","crypto_hash_sha256","toUpperCase","random_nonce","getRandomValues","nonce","crypto_box_random_nonce","msg_int8","crypto_scrypt","seedLength","box_keypair_from_sign","signKeyPair","boxSk","boxPk","ska","_crypto_sign_secretkeybytes","skb","_crypto_box_secretkeybytes","_crypto_sign_ed25519_sk_to_curve25519","crypto_box_keypair_from_raw_sk","extractBytes","box_pk_from_sign","pka","_crypto_sign_publickeybytes","pkb","_crypto_box_publickeybytes","_crypto_sign_ed25519_pk_to_curve25519","box_sk_from_sign","box","recipientPk","senderSk","messageBin","ciphertextBin","crypto_box","box_open","cypherText","senderPk","recipientSk","crypto_box_open","scryptParams","signKeypair","crypto_sign_seed_keypair","boxKeypair","crypto_box_seed_keypair","seedKeypair","verify","signature","pub","sm","crypto_sign_open","sign","m","sk","signedMsg","crypto_sign","load","deferred","defer","naclOptions","scryptOptions","requested_total_memory","loadedLib","checkAllLibLoaded","lib","fromSignKeypair","skFromSignSk","pkFromSignPk","pack","open","offset","subarray","service","serviceImpl","test","regexpContent","RegExp","xor","buffer","concat_Uint8Array","buffer1","buffer2","tmp","byteLength","WIF","DATA_LENGTH","EWIF","SALT_LENGTH","DERIVED_HALF_LENGTH","REGEXP","SECKEY","FILE","TYPE_LINE","VERSION","PUB","SEC","DATA","BAD_CHECKSUM","parseKeyFileContent","defaultType","typeMatch","parseWIF_or_EWIF","data_base58","data_int8","wif_base58","wif_int8","wif_int8_no_checksum","slice","expectedChecksum","parseWIF_v1","parseEWIF_v1","ewif_base58","ewif_int8","ewif_int8_no_checksum","encryptedhalf1","encryptedhalf2","scrypt_seed","derivedhalf1","derivedhalf2","aesEcb","aesjs","ModeOfOperation","ecb","decryptedhalf1","decrypt","decryptedhalf2","expectedSalt","getBoxKeypair","signPk_int8","reader","parseKeyFileData","generateContent","generateKeyFileContent","fi","seed_fi","wif_v1_from_keypair","seed1_xor_derivedhalf1_1","seed2_xor_derivedhalf1_2","encrypt","ewif_v1_from_keypair","getKeypair","record","recipientFieldName","cypherFieldNames","boxRecipientPk","fieldName","cypherTexts","cypherFieldName","records","issuerFieldName","issuerBoxPks","issuer","issuerBoxPk","text","$ionicPlatform","readyPromise","$ionicLoading","$ionicPopup","$ionicConfig","$ionicHistory","ionicMaterialInk","ionicMaterialMotion","Fullscreen","screenmatch","exports","loadingTextCache","smallscreen","bind","raw","alertError","subtitle","translations","template","buttons","onTap","alertInfo","cssClass","hideLoading","showLoading","translation","isSmallScreen","active","imageOnLoadResize","thumbnail","ctx","width","height","maxWidth","maxHeight","canvas","createElement","getContext","xoffset","trunc","yoffset","drawImage","dataurl","toDataURL","showPopover","popovers","autoselect","focusFirstInput","_show","isResolved","getSelection","toString","setSelectionRange","focus","autofocus","$parent","$emit","_cleanup","removeClass","fromTemplateUrl","closePopover","afterHidden","motionDelegate","delegate","ionListClass","motionTimeout","defaultSelector","startVelocity","createQRCodeObj","typeNumber","errorCorrectionLevel","mb","qrcode","stringToBytes","stringToBytesFuncs","qr","addData","make","toggleOn","classList","toggle","toggleOff","motion","default","ripple","blinds","fadeSlideIn","fadeSlideInRight","panInLeft","pushDown","slideUp","fadeIn","confirm","cancelText","cancelType","okType","notImplemented","update","_getLoader","loader","isShown","toast","duration","noBackdrop","fullMsg","fullscreen","displayEffect","setEffects","views","transition","nothing","class","clearCache","svg","createSvgTag","img","createImgTag","fab","fabs","getElementsByClassName","rows","share","url","href","absolute","postUrl","postMessage","titleKey","showHelptip","querySelector","preAction","postAction","retryTimeout","selection","select","selectElementText","childNodes","range","createRange","selectNodeContents","removeAllRanges","addRange","selectedText","image","resizeFile","src","readAsDataURL","resizeSrc","imageSrc","rotateSrc","angle","PI","rotate","imageOnLoadRotate","$http","CacheFactory","VERY_LONG","LONG","MEDIUM","SHORT","storageMode","getSettingsStorageMode","cacheNames","getCacheOptions","deleteOnExpire","onExpire","cacheFlushInterval","onSettingsChanged","newStorageMode","cacheName","cache","setOptions","on","addListeners","maxAge","counter","createCache","clear","cachePrefix","removeAll","clearAll","controller","filterTranslations","openLink","buildDate","build","DATE_PATTERN","$ionicModal","$injector","DefaultModalController","resolved","openModal","modal","hideModal","body","propName","getParameters","hideDelay","ctrlName","fragments","animation","$new","locals","ctrlEval","isControllerAs","controllerName","ctrlInstance","ModalUtils","showJoinMember","showJoinWallet","showTransfer","useDigitKeyboard","showLogin","showNetworkLookup","showAbout","accountType","showLicense","showSelectPubkeyIdentity","showSelectWallet","submit","preventDefault","popup","afterShowSaved","$destroy","csCache","sockets","allCachePrefixes","host","getUrl","processError","prepare","pkeys","queryParams","newUri","pkey","replace","parseUri","parser","pathname","hostname","search","compareVersionNumbers","v1","v2","v1parts","v2parts","validateParts","x","NaN","forcedTimeout","responseType","headers","getWithCache","autoRefresh","done","put","post","Content-Type","ws","getWsUrl","_waitOpen","self","readyState","waitDuration","waitRetryDelay","min","round","_open","callbacks","WebSocket","onerror","onmessage","JSON","onopen","openTime","onclose","closeEvent","findIndex","socket","closing","code","_close","_remove","send","isClosed","closeAllWs","sock","nw","Shell","openExternal","openOptions","openTarget","win","moveTo","date","utc","unix","compare","isCompatible","actualVersion","storage","sessionStorage","stringify","$log","standard","secure","removeItem","n","cordova","plugins","barcodeScanner","clipboard","$cordovaClipboard","camera","getPicture","sourceType","navigator","PictureSourceType","PHOTOLIBRARY","CAMERA","quality","destinationType","DestinationType","DATA_URL","encodingType","EncodingType","PNG","targetWidth","targetHeight","$cordovaCamera","keyboard","Keyboard","digit","bindModel","modelScope","modelPath","getModelValue","setModelValue","paths","property","action","decimal","decimalSeparator","leftButton","html","rightButton","isIOS","userAgent","match","isOSX","process","isWeb","InAppBrowser","WELL_KNOWN_CURRENCIES","g1","firstBlockTime","medianTimeOffset","resetData","membersCount","loadData","avgGenTime","medianTimeBlocks","currencyName","BLOCK_NOT_FOUND","initPhase","ud","blocks","_safeLoadCurrentUD","blockIndex","ud0","lastBlockWithUD","amount","base","dividend","unitbase","getData","getDataField","field","onBlock","cleanData","currentBlock","receivedAt","newBlock","stop","restart","bmaAlive","alive","currentBlockField","getCurrent","lastValid","useCache","SIG","OUTPUT_OBJ","REGEX_ENDPOINT_PARAMS","BMAS","WS2P","BMATOR","WS2PTOR","USER_ID","CURRENCY","COMMENT","INVALID_COMMENT_CHARS","URI_WITH_AT","URI_WITH_PATH","BMA_ENDPOINT","BMAS_ENDPOINT","WS2P_ENDPOINT","BMATOR_ENDPOINT","WS2PTOR_ENDPOINT","PROTOCOL_VERSION","LIMIT_REQUEST_COUNT","LIMIT_REQUEST_DELAY","forceUseSsl","exact","closeWs","wsByPath","cacheTime","requestKey","getRequestFn","_startPromise","request","execCount","postRequest","postByPath","isAlive","REVOCATION_ALREADY_REGISTERED","IDENTITY_SANDBOX_FULL","NO_MATCHING_IDENTITY","UID_ALREADY_USED","NO_MATCHING_MEMBER","NO_IDTY_MATCHING_PUB_OR_UID","WRONG_SIGNATURE_MEMBERSHIP","MEMBERSHIP_ALREADY_SEND","SOURCE_ALREADY_CONSUMED","TX_INPUTS_OUTPUTS_NOT_EQUAL","TX_OUTPUT_SUM_NOT_EQUALS_PREV_DELTAS","TX_ALREADY_PROCESSED","URI","TX_OUTPUT_SIG","TX_OUTPUT_FUNCTION","TX_OUTPUT_OBJ_OPERATOR_AND","TX_OUTPUT_OBJ_OPERATOR_OR","TX_OUTPUT_OBJ","TX_OUTPUT_OBJ_OPERATOR","TX_OUTPUT_OBJ_PARENTHESIS","TX_OUTPUT_FUNCTIONS","OUTPUT_FUNCTION","same","node2","port2","peering","lookup","certifiedBy","certifiersOf","pending","requirementsWithCache","add","certify","revoke","blocksSlice","currentWithCache","membership","newcomers","sources","history","sending","pendings","times","timesWithCache","parseUnlockCondition","unlockCondition","treeItem","treeItemId","childrenContent","childrenMatches","convertedOutput","treeItems","functions","loop","children","unlockFunctions","unlockTree","output","epPrefix","ipv4","ipv6","otherNode","wasStarted","results","memberUidsByPubkey","getByUid","blockNumbers","getHttpRecursive","peersByLeaves","leaves","httpGetRequest","paramName","paramValues","paramValue","requestParams","getHttpWithRetryIfLimitation","lastUd","pathCount","getLatestRelease","latest","html_url","tag_name","instance","identityCache","requirementsCache","_addUniqueIds","idties","idtyKeys","idty","_sortAndSliceIdentities","_resetRequirements","meta","hasSelf","needSelf","needMembership","canMembershipOut","needRenew","wasMember","certificationCount","needCertifications","needCertificationCount","willNeedCertificationCount","alternatives","blockUid","sigDate","_fillRequirements","currencyParameters","timestamp","invalid","membershipExpiresIn","membershipPendingExpiresIn","expired","willExpireCertificationCount","cert","expiresIn","willExpire","pendingRevocation","revocation_sig","pendingCertificationCount","pendingCerts","certifiers","union","pluck","sigQty","_fillIdentitiesMeta","identity","time","loadRequirements","inputData","withCache","cacheKey","outdistanced","certCount","loadIdentityByLookup","revoked_on","certPubkeys","certsMap","idtyFullKey","others","certs","certFullKey","cert_time","block_number","block_hash","givenCertifications","signed","loadCertifications","getFunction","lookupCertifications","_certId","lookupHasCertTime","lookupCerticationsByCertId","certId","written","certTime","sigWindow","sigValidity","pendingCertifications","pendingCertByBlocks","validBuid","writtenCertByPubkey","_sortCertifications","errorCertifications","force","dataByLookup","received_cert","received_cert_pending","received_cert_error","given_cert","given_cert_pending","given_cert_error","addEvent","messageParams","revocationTime","addEvents","safeText","addUniqueId","allowExtension","excludeRevoked","blocUid","lookupResultCount","getNewcomersRecursive","maxResultSize","joiner","idtyKey","memberDate","getAllRecursive","letters","pubkeys","letter","extendAll","pubkeyAttributeName","skipAddUid","uidsByPubkey","events","total","hits","memberships","idtiesByBlock","idtiesByPubkey","ms","blockHash","otherIdtySamePubkey","aidty","$filter","FileSaver","csWot","reduceTxAndPush","txArray","processedTxMap","allowPendings","outputBase","lockedOutputs","walletIsIssuer","otherIssuers","issuers","otherRecipients","outputs","sum","noffset","outputArray","conditions","outputAmount","powBase","outputCondition","sigMatches","outputPubkey","identifier","consumed","contains","lockedOutput","txPubkeys","blockstampTime","txKey","newTx","comment","isUD","locktime","inputs","loadTx","fromTime","nowInSec","validating","errors","reduceTxFn","sent","received","sliceTime","from","to","loadUDs","tx1","tx2","firstValidatedTxIndex","toTime","addSources","sourcesIndexByKey","srcKey","addSource","loadSourcesAndBalance","balance","txPendings","txErrors","balanceFromSource","balanceWithPending","_processPendingTx","consumedSources","input","inputKey","srcIndex","txs","allTx","loadSources","downloadHistoryFile","currentTime","filename","formatDecimal","medianDate","formatSymbol","saveAs","Idle","csTx","defaultBMA","CsWallet","loadPromise","enableAuthIdle","localName","isNew","sigStock","encryptedData","resetKeypair","resetTxAndSources","isDefault","hasEncryptedData","needLogin","needAuth","forceAuth","isDataLoaded","authData","loginCheck","restoreData","openEncryptedData","checkAuthIdle","loadOptions","minData","logout","wasAuth","resetStore","unauth","isNeverUsed","avatar","storeData","secureContent","useEncryption","storageKey","notifications","invitations","childrenCount","contentStr","cypherContent","seckey","sessionStorageData","localStorageData","applyRestoredData","oldChildrenCount","oldChildren","removeAllChildrenWallets","child","newChildInstance","addChildWallet","cleanEventsByContext","loadTxAndSources","context","loadSigStock","loadQrCode","refreshData","loadMinData","loadFullData","unused","setSelf","skipData","truncBase","getInputs","filterBase","sourcesAmount","minBase","maxBase","lowerInputs","transfer","destPub","comments","restPub","floor","logs","amountBase","UD","unit","subUnit","rest","isBase","truncBaseOrMinBase","createAndSendTx","pendingTx","unshift","balanceChanged","es","firstSlice","secondSlice","outputOffset","newSources","signedTx","transaction","txHash","getIdentityDocument","sideIn","signedMembership","insertAtFirst","getkeypairSaveId","nbCharSalt","answer","getRevocationDocument","identityLines","idtySignature","revocation","setParent","removedChildren","getChildWalletByPubkey","isUserPubkey","walletId","getAllChildrenWallet","isAuthResult","newEnableAuthIdle","setIdle","watch","unwatch","getIdle","getWalletSettings","allSettings","newSettings","useEncryptionChanged","useStorageChanged","removeListeners","internal","addListener","listener","transferAll","needToLoadRequirements","revokeWithFile","signedCert","downloadSaveId","saveId","questions","getSaveIDDocument","saveIdFile","getCryptedId","recoverId","recover","cypherNonce","cypherSalt","cypherPwd","downloadRevocation","revocationFile","fileName","downloadKeyFile","getByPubkey","inside","out","cleanByContext","create","childIndex","parentWallet","hasPubkey","downloadFile","constant","startWalletHelpTip","isTour","helptipScope","helpController","createHelptipScope","provider","eagerLoadingServices","extensionByStates","registerEagerLoadingService","serviceName","extendState","stateName","extension","extendStates","stateNames","$get","currentExtensionPointName","extensions","points","getActivesByName","extensionPointName","includes","demoPubkey","BMA_REGEXP","BMAS_REGEXP","WS2P_REGEXP","LOCAL_IP_ADDRESS","regex","copyValues","copyValuesFrom","getRaw","bmaRegex","bmasRegex","regExp","getIPv4","getIPv6","hasValid4","getURL","isReachable","hasBma","parseArrayValues","parseTransactions","array","itemObjProperties","arrayProperty","toHimself","$inject","$stateProvider","menuContent","run","$templateCache","$translateProvider","COMMON","APP_NAME","APP_VERSION","APP_BUILD","MEMBER","BLOCK","BTN_OK","BTN_YES","BTN_NO","BTN_SEND","BTN_SEND_MONEY","BTN_SEND_MONEY_SHORT","BTN_SAVE","BTN_YES_SAVE","BTN_YES_CONTINUE","BTN_SHOW","BTN_SHOW_PUBKEY","BTN_RELATIVE_UNIT","BTN_BACK","BTN_NEXT","BTN_IMPORT","BTN_CANCEL","BTN_CLOSE","BTN_LATER","BTN_LOGIN","BTN_LOGOUT","BTN_ADD_ACCOUNT","BTN_SHARE","BTN_EDIT","BTN_DELETE","BTN_ADD","BTN_SEARCH","BTN_REFRESH","BTN_RETRY","BTN_START","BTN_CONTINUE","BTN_CREATE","BTN_UNDERSTOOD","BTN_OPTIONS","BTN_HELP_TOUR","BTN_HELP_TOUR_SCREEN","BTN_DOWNLOAD","BTN_DOWNLOAD_ACCOUNT_STATEMENT","BTN_MODIFY","CHOOSE_FILE","DAYS","NO_ACCOUNT_QUESTION","SEARCH_NO_RESULT","LOADING","LOADING_WAIT","SEARCHING","FROM","TO","COPY","LANGUAGE","UNIVERSAL_DIVIDEND","DATE_FILE_PATTERN","DATE_SHORT_PATTERN","DATE_MONTH_YEAR_PATTERN","EMPTY_PARENTHESIS","UID","ENABLE","DISABLE","RESULTS_LIST","RESULTS_COUNT","EXECUTION_TIME","SHOW_VALUES","POPOVER_ACTIONS_TITLE","POPOVER_FILTER_TITLE","SHOW_MORE","SHOW_MORE_COUNT","POPOVER_SHARE","TITLE","SHARE_ON_TWITTER","SHARE_ON_FACEBOOK","SHARE_ON_DIASPORA","SHARE_ON_GOOGLEPLUS","DATE","TYPE","SIZE","VALIDATING","SYSTEM","PICTURE_CHOOSE_TYPE","BTN_PICTURE_GALLERY","BTN_PICTURE_CAMERA","MENU","HOME","WOT","ACCOUNT","WALLETS","SETTINGS","NETWORK","TRANSACTIONS","ABOUT","LICENSE","LATEST_RELEASE","PLEASE_UPDATE","CODE","OFFICIAL_WEB_SITE","DEVELOPERS","FORUM","PLEASE_REPORT_ISSUE","REPORT_ISSUE","BTN_OPEN_DEV_WINDOW","WELCOME","WELCOME_READONLY","MESSAGE","MESSAGE_READONLY","BTN_CURRENCY","BTN_ABOUT","BTN_HELP","BTN_NETWORK","FREE_SOFTWARE","FORK_ME","SHOW_LICENSE","NOT_YOUR_ACCOUNT_QUESTION","BTN_CHANGE_ACCOUNT","CONNECTION_ERROR","SHOW_ALL_FEED","READ_MORE","FEED_SOURCE","DISPLAY_DIVIDER","STORAGE_DIVIDER","NETWORK_SETTINGS","PEER","PEER_SHORT","PEER_CHANGED_TEMPORARY","PERSIST_CACHE","PERSIST_CACHE_HELP","USE_LOCAL_STORAGE","USE_LOCAL_STORAGE_HELP","WALLETS_SETTINGS","USE_WALLETS_ENCRYPTION","USE_WALLETS_ENCRYPTION_HELP","ENABLE_HELPTIP","DISABLE_HELPTIP","ENABLE_UI_EFFECTS","HISTORY_SETTINGS","DISPLAY_UD_HISTORY","TX_HISTORY_AUTO_REFRESH","TX_HISTORY_AUTO_REFRESH_HELP","AUTHENTICATION_SETTINGS","KEEP_AUTH","KEEP_AUTH_SHORT","KEEP_AUTH_HELP","KEEP_AUTH_OPTION","NEVER","SECONDS","MINUTE","MINUTES","HOUR","ALWAYS","KEYRING_FILE","KEYRING_FILE_HELP","REMEMBER_ME","REMEMBER_ME_HELP","PLUGINS_SETTINGS","BTN_RESET","EXPERT_MODE","EXPERT_MODE_HELP","BLOCK_VALIDITY_WINDOW","BLOCK_VALIDITY_WINDOW_SHORT","BLOCK_VALIDITY_WINDOW_HELP","BLOCK_VALIDITY_OPTION","NONE","POPUP_PEER","HOST","HOST_HELP","USE_SSL","USE_SSL_HELP","BTN_SHOW_LIST","BLOCKCHAIN","HASH","VIEW","HEADER_TITLE","TITLE_CURRENT","COMPUTED_BY","SHOW_RAW","TECHNICAL_DIVIDER","UNIVERSAL_DIVIDEND_HELP","EMPTY","POW_MIN","POW_MIN_HELP","DATA_DIVIDER","IDENTITIES_COUNT","JOINERS_COUNT","ACTIVES_COUNT","ACTIVES_COUNT_HELP","LEAVERS_COUNT","LEAVERS_COUNT_HELP","EXCLUDED_COUNT","EXCLUDED_COUNT_HELP","REVOKED_COUNT","REVOKED_COUNT_HELP","TX_COUNT","CERT_COUNT","TX_TO_HIMSELF","TX_OUTPUT_UNLOCK_CONDITIONS","TX_OUTPUT_OPERATOR","AND","OR","XHX","CSV","CLTV","LOOKUP","NO_BLOCK","LAST_BLOCKS","BTN_COMPACT","TAB_CURRENCY","TAB_WOT","TAB_NETWORK","TAB_BLOCKS","CURRENCY_SHORT_DESCRIPTION","NETWORK_RULES_DIVIDER","CURRENCY_NAME","MEMBERS","MEMBERS_VARIATION","MONEY_DIVIDER","MASS","SHARE","C_ACTUAL","MEDIAN_TIME","MONEY_RULES_DIVIDER","C_RULE","UD_RULE","DT_REEVAL","REEVAL_SYMBOL","DT_REEVAL_VALUE","UD_REEVAL_TIME0","SIG_QTY_RULE","SIG_STOCK","SIG_PERIOD","SIG_WINDOW","SIG_VALIDITY","MS_WINDOW","MS_VALIDITY","STEP_MAX","WOT_RULES_DIVIDER","SENTRIES","SENTRIES_FORMULA","XPERCENT","AVG_GEN_TIME","CURRENT","MATH_CEILING","DISPLAY_ALL_RULES","BTN_SHOW_LICENSE","WOT_DIVIDER","NO_LICENSE_FILE","LOADING_PEERS","NODE_ADDRESS","SOFTWARE","WARN_PRE_RELEASE","WARN_NEW_RELEASE","WS2PID","PRIVATE_ACCESS","POW_PREFIX","ENDPOINTS","ES_USER_API","INFO","ONLY_SSL_PEERS","PEERS","SIGNED_ON_BLOCK","MIRROR","MIRRORS","MIRROR_PEERS","PEER_LIST","MEMBER_PEERS","ALL_PEERS","DIFFICULTY","API","CURRENT_BLOCK","OFFLINE","OFFLINE_PEERS","BTN_SHOW_PEER","OWNER","SHOW_RAW_PEERING","SHOW_RAW_CURRENT_BLOCK","KNOWN_PEERS","GENERAL_DIVIDER","ERROR","LOADING_TOR_NODE_ERROR","LOADING_NODE_ERROR","SEARCH_HELP","SEARCH_INIT_PHASE_WARNING","REGISTERED_SINCE","REGISTERED_SINCE_BLOCK","NO_CERTIFICATION","NO_GIVEN_CERTIFICATION","NOT_MEMBER_PARENTHESIS","IDENTITY_REVOKED_PARENTHESIS","MEMBER_PENDING_REVOCATION_PARENTHESIS","EXPIRE_IN","NOT_WRITTEN_EXPIRE_IN","EXPIRED","PSEUDO","WRITTEN_ON_BLOCK","NOT_MEMBER_ACCOUNT","NOT_MEMBER_ACCOUNT_HELP","BTN_CERTIFY","BTN_YES_CERTIFY","BTN_SELECT_AND_CERTIFY","ACCOUNT_OPERATIONS","POPOVER_SHARE_TITLE","NEWCOMERS","NEWCOMERS_COUNT","PENDING","PENDING_COUNT","REGISTERED","MEMBER_FROM","BTN_NEWCOMERS","BTN_PENDING","NO_PENDING","NO_NEWCOMERS","CONTACTS","MODAL","CERTIFICATIONS","SUMMARY","LIST","PENDING_LIST","RECEIVED","RECEIVED_BY","SENTRY_MEMBER","OPERATIONS","GIVEN_CERTIFICATIONS","SENT","SENT_BY","LOGIN","SCRYPT_FORM_HELP","PUBKEY_FORM_HELP","FILE_FORM_HELP","SCAN_FORM_HELP","SALT","SALT_HELP","SHOW_SALT","PASSWORD","PASSWORD_HELP","PUBKEY_HELP","HAVE_ACCOUNT_QUESTION","CREATE_ACCOUNT","CREATE_FREE_ACCOUNT","FORGOTTEN_ID","ASSOCIATED_PUBKEY","BTN_METHODS","BTN_METHODS_DOTS","METHOD_POPOVER_TITLE","MEMORIZE_AUTH_FILE","SCRYPT_PARAMETERS","AUTO_LOGOUT","BTN_RELOGIN","IDLE_WARNING","METHOD","SCRYPT_DEFAULT","SCRYPT_ADVANCED","SCAN","SCRYPT","SECURE","HARDEST","EXTREME","USER","HELP","AUTH","BTN_AUTH","GENERAL_HELP","EXPECTED_UID_HELP","EXPECTED_PUBKEY_HELP","BALANCE","LAST_TX","BALANCE_ACCOUNT","NO_TX","SHOW_MORE_TX","SHOW_ALL_TX","TX_FROM_DATE","PENDING_TX","VALIDATING_TX","ERROR_TX","ERROR_TX_SENT","PENDING_TX_RECEIVED","EVENTS","OUT_DISTANCED","WAITING_MEMBERSHIP","WAITING_CERTIFICATIONS","WAITING_CERTIFICATIONS_HELP","WILL_MISSING_CERTIFICATIONS","WILL_NEED_RENEW_MEMBERSHIP","NEED_RENEW_MEMBERSHIP","NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED","NO_WAITING_MEMBERSHIP","CERTIFICATION_COUNT","CERTIFICATION_COUNT_SHORT","BTN_RECEIVE_MONEY","BTN_SELECT_ALTERNATIVES_IDENTITIES","BTN_FIX_MEMBERSHIP","BTN_MEMBERSHIP_RENEW","BTN_MEMBERSHIP_RENEW_DOTS","BTN_MEMBERSHIP_OUT_DOTS","BTN_SECURITY_DOTS","BTN_SHOW_DETAILS","LOCKED_OUTPUTS_POPOVER","DESCRIPTION","DESCRIPTION_MANY","LOCKED_AMOUNT","NEW","INTRO_WARNING_TIME","INTRO_WARNING_SECURITY","INTRO_WARNING_SECURITY_HELP","INTRO_HELP","REGISTRATION_NODE","REGISTRATION_NODE_HELP","SELECT_ACCOUNT_TYPE","MEMBER_ACCOUNT","MEMBER_ACCOUNT_TITLE","MEMBER_ACCOUNT_HELP","WALLET_ACCOUNT","WALLET_ACCOUNT_TITLE","WALLET_ACCOUNT_HELP","SALT_WARNING","PASSWORD_WARNING","PSEUDO_WARNING","PSEUDO_HELP","SALT_CONFIRM","SALT_CONFIRM_HELP","PASSWORD_CONFIRM","PASSWORD_CONFIRM_HELP","SLIDE_6_TITLE","COMPUTING_PUBKEY","LAST_SLIDE_CONGRATULATION","CONFIRMATION_MEMBER_ACCOUNT","CONFIRMATION_WALLET_ACCOUNT","CHECKING_PSEUDO","PSEUDO_AVAILABLE","PSEUDO_NOT_AVAILABLE","INFO_LICENSE","BTN_ACCEPT","BTN_ACCEPT_LICENSE","POPUP_REGISTER","SELECT_IDENTITY_MODAL","SELECT_WALLET_MODAL","WALLET_LIST","BTN_NEW","BTN_IMPORT_FILE_DOTS","NO_WALLET","BTN_RENAME","EXPORT_FILENAME","TOTAL_DOTS","EDIT_POPOVER","NAME_HELP","IMPORT_MODAL","WALLET_COUNT","NO_NEW_WALLET","SECURITY","ADD_QUESTION","BTN_CLEAN","DOWNLOAD_REVOKE","DOWNLOAD_REVOKE_HELP","GENERATE_KEYFILE","GENERATE_KEYFILE_HELP","KEYFILE_FILENAME","MEMBERSHIP_IN","MEMBERSHIP_IN_HELP","SEND_IDENTITY","SEND_IDENTITY_HELP","HELP_LEVEL","LEVEL","LOW_LEVEL","MEDIUM_LEVEL","QUESTION_1","QUESTION_2","QUESTION_3","QUESTION_4","QUESTION_5","QUESTION_6","QUESTION_7","QUESTION_8","QUESTION_9","QUESTION_10","QUESTION_11","QUESTION_12","QUESTION_13","QUESTION_14","QUESTION_15","QUESTION_16","QUESTION_17","QUESTION_18","QUESTION_19","RECOVER_ID","RECOVER_ID_HELP","RECOVER_ID_SELECT_FILE","REVOCATION_WITH_FILE","REVOCATION_WITH_FILE_DESCRIPTION","REVOCATION_WITH_FILE_HELP","REVOCATION_WALLET","REVOCATION_WALLET_HELP","REVOCATION_FILENAME","SAVE_ID","SAVE_ID_HELP","STRONG_LEVEL","KEYFILE","PUBSEC_FORMAT","PUBSEC_FORMAT_HELP","WIF_FORMAT","WIF_FORMAT_HELP","EWIF_FORMAT","EWIF_FORMAT_HELP","PASSWORD_POPUP","FILE_NAME","HEADERS","TIME","AMOUNT","TRANSFER","SUB_TITLE","SUB_TITLE_ALL","AMOUNT_HELP","COMMENT_HELP","BTN_ADD_COMMENT","REST","REST_TO","WARN_COMMENT_IS_PUBLIC","UNKNOWN_URI_FORMAT","PUBKEY_INVALID_CHECKSUM","POPUP_TITLE","UNKNOWN_ERROR","CRYPTO_UNKNOWN_ERROR","DOWNLOAD_KEYFILE_FAILED","EQUALS_TO_PSEUDO","EQUALS_TO_SALT","FIELD_REQUIRED","FIELD_TOO_SHORT","FIELD_TOO_SHORT_WITH_LENGTH","FIELD_TOO_LONG","FIELD_TOO_LONG_WITH_LENGTH","FIELD_MIN","FIELD_MAX","FIELD_ACCENT","FIELD_NOT_NUMBER","FIELD_NOT_INT","FIELD_NOT_EMAIL","PASSWORD_NOT_CONFIRMED","SALT_NOT_CONFIRMED","SEND_IDENTITY_FAILED","SEND_CERTIFICATION_FAILED","NEED_MEMBER_ACCOUNT_TO_CERTIFY","NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF","IDENTITY_TO_CERTIFY_HAS_NO_SELF","LOGIN_FAILED","LOAD_IDENTITY_FAILED","LOAD_REQUIREMENTS_FAILED","SEND_MEMBERSHIP_IN_FAILED","SEND_MEMBERSHIP_OUT_FAILED","REFRESH_WALLET_DATA","GET_CURRENCY_PARAMETER","GET_CURRENCY_FAILED","SEND_TX_FAILED","ALL_SOURCES_USED","NOT_ENOUGH_SOURCES","ACCOUNT_CREATION_FAILED","RESTORE_WALLET_DATA_ERROR","LOAD_WALLET_DATA_ERROR","COPY_CLIPBOARD_FAILED","TAKE_PICTURE_FAILED","SCAN_FAILED","SCAN_UNKNOWN_FORMAT","WOT_LOOKUP_FAILED","LOAD_PEER_DATA_FAILED","NEED_LOGIN_FIRST","AMOUNT_REQUIRED","AMOUNT_NEGATIVE","NOT_ENOUGH_CREDIT","INVALID_NODE_SUMMARY","INVALID_USER_ID","INVALID_COMMENT","INVALID_PUBKEY","INVALID_PUBKEY_CHECKSUM","IDENTITY_REVOKED","IDENTITY_REVOKED_WITH_TIME","IDENTITY_PENDING_REVOCATION","IDENTITY_INVALID_BLOCK_HASH","IDENTITY_EXPIRED","IDENTITY_NOT_FOUND","IDENTITY_TX_FAILED","WOT_PENDING_INVALID_BLOCK_HASH","WALLET_INVALID_BLOCK_HASH","WALLET_IDENTITY_EXPIRED","WALLET_REVOKED","WALLET_HAS_NO_SELF","AUTH_REQUIRED","AUTH_INVALID_PUBKEY","AUTH_INVALID_SCRYPT","AUTH_INVALID_FILE","AUTH_FILE_ERROR","IDENTITY_ALREADY_CERTIFY","IDENTITY_ALREADY_CERTIFY_PENDING","UNABLE_TO_CERTIFY_TITLE","LOAD_NEWCOMERS_FAILED","LOAD_PENDING_FAILED","ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION","ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION","ONLY_SELF_CAN_EXECUTE_THIS_ACTION","GET_BLOCK_FAILED","INVALID_BLOCK_HASH","DOWNLOAD_REVOCATION_FAILED","REVOCATION_FAILED","SALT_OR_PASSWORD_NOT_CONFIRMED","RECOVER_ID_FAILED","LOAD_FILE_FAILED","NOT_VALID_REVOCATION_FILE","NOT_VALID_SAVE_ID_FILE","NOT_VALID_KEY_FILE","EXISTING_ACCOUNT","EXISTING_ACCOUNT_REQUEST","GET_LICENSE_FILE_FAILED","CHECK_NETWORK_CONNECTION","ISSUE_524_TX_FAILED","ADD_SECONDARY_WALLET_FAILED","REMOVE_SECONDARY_WALLET_FAILED","UPDATE_WALLET_LIST_FAILED","LOAD_WALLET_LIST_FAILED","SAVE_WALLET_LIST_FAILED","COULD_NOT_ADD_MAIN_WALLET","COULD_NOT_ADD_EXISTING_WALLET","UNKNOWN_WALLET_ID","RESTORE_WALLET_LIST_FAILED","INVALID_FILE_FORMAT","SAME_TX_RECIPIENT","CERTIFICATION_DONE","TRANSFER_SENT","COPY_TO_CLIPBOARD_DONE","MEMBERSHIP_OUT_SENT","NOT_NEED_MEMBERSHIP","IDENTITY_WILL_MISSING_CERTIFICATIONS","IDENTITY_NEED_MEMBERSHIP","HAS_ALTERNATIVE_IDENTITIES","REVOCATION_SENT","REVOCATION_SENT_WAITING_PROCESS","FEATURES_NOT_IMPLEMENTED","EMPTY_TX_HISTORY","CONFIRM","POPUP_WARNING_TITLE","POPUP_SECURITY_WARNING_TITLE","CERTIFY_RULES_TITLE_UID","CERTIFY_RULES","FULLSCREEN","EXIT_APP","TRANSFER_ALL","MEMBERSHIP_OUT","MEMBERSHIP_OUT_2","LOGIN_UNUSED_WALLET_TITLE","LOGIN_UNUSED_WALLET","FIX_IDENTITY","FIX_MEMBERSHIP","MEMBERSHIP","RENEW_MEMBERSHIP","REVOKE_IDENTITY","REVOKE_IDENTITY_2","NOT_NEED_RENEW_MEMBERSHIP","SAVE_BEFORE_LEAVE","SAVE_BEFORE_LEAVE_TITLE","LOGOUT","USE_FALLBACK_NODE","ISSUE_524_SEND_LOG","MODE","DEMO","BADGE","FEATURE_NOT_AVAILABLE","MODE_HELP","INSTALL_HELP","READONLY","DOWNLOAD","POPUP_REVOKE_MESSAGE","JOIN","SECTION","PUBKEY_DEF","METHOD_DEF","GLOSSARY","MEMBER_DEF","CURRENCY_RULES","CURRENCY_RULES_DEF","BLOCKCHAIN_DEF","UNIVERSAL_DIVIDEND_DEF","WOT_DEF","DISTANCE_RULE","DISTANCE_RULE_DEF","TIP","MENU_BTN_CURRENCY","CURRENCY_WOT","CURRENCY_MASS","CURRENCY_UNIT_RELATIVE","CURRENCY_CHANGE_UNIT","CURRENCY_CHANGE_UNIT_TO_RELATIVE","MENU_BTN_NETWORK","NETWORK_BLOCKCHAIN","NETWORK_PEERS","NETWORK_PEERS_BLOCK_NUMBER","NETWORK_PEERS_PARTICIPATE","MENU_BTN_ACCOUNT","MENU_BTN_ACCOUNT_MEMBER","WALLET_CERTIFICATIONS","WALLET_RECEIVED_CERTIFICATIONS","WALLET_GIVEN_CERTIFICATIONS","WALLET_BALANCE","WALLET_BALANCE_RELATIVE","WALLET_BALANCE_CHANGE_UNIT","WALLET_PUBKEY","WALLET_SEND","WALLET_SEND_NO_MONEY","WALLET_OPTIONS","WALLET_RECEIVED_CERTS","WALLET_CERTIFY","WALLET_CERT_STOCK","MENU_BTN_WALLETS","MENU_BTN_TX","MENU_BTN_WOT","WOT_SEARCH_TEXT_XS","WOT_SEARCH_TEXT","WOT_SEARCH_RESULT","WOT_VIEW_CERTIFICATIONS","WOT_VIEW_CERTIFICATIONS_COUNT","WOT_VIEW_CERTIFICATIONS_CLICK","WOT_VIEW_CERTIFY","MENU_BTN_SETTINGS","HEADER_BAR_BTN_PROFILE","SETTINGS_CHANGE_UNIT","END_LOGIN","END_NOT_LOGIN","END_READONLY","LINK_DOC","LINK_DOC_HELP","LINK_STANDARD_APP","LINK_STANDARD_APP_HELP","MESSAGE_SHORT","DOC_HEADER","TITLE_SHORT","AMOUNTS_HELP","NAME","NODE","BAD_CREDENTIALS","SUCCESS_REDIRECTING_WITH_NAME","SUCCESS_REDIRECTING","CANCEL_REDIRECTING_WITH_NAME","CANCEL_REDIRECTING","TRANSFER_FAILED","DOC","DESCRIPTION_DIVIDER","URL_DIVIDER","PARAMETERS_DIVIDER","AVAILABLE_PARAMETERS","DEMO_DIVIDER","DEMO_HELP","DEMO_RESULT","DEMO_RESULT_PEER","DEMO_SUCCEED","DEMO_CANCELLED","INTEGRATE_DIVIDER","INTEGRATE_CODE","INTEGRATE_RESULT","INTEGRATE_PARAMETERS","PARAM_PUBKEY","PARAM_PUBKEY_HELP","PARAM_AMOUNT","PARAM_AMOUNT_HELP","PARAM_COMMENT","PARAM_COMMENT_HELP","PARAM_NAME","PARAM_NAME_HELP","PARAM_REDIRECT_URL","PARAM_REDIRECT_URL_HELP","PARAM_CANCEL_URL","PARAM_CANCEL_URL_HELP","PARAM_PREFERRED_NODE","PARAM_PREFERRED_NODE_HELP","EXAMPLES_HELP","EXAMPLE_BUTTON","EXAMPLE_BUTTON_DEFAULT_TEXT","EXAMPLE_BUTTON_DEFAULT_STYLE","EXAMPLE_BUTTON_TEXT_HELP","EXAMPLE_BUTTON_BG_COLOR","EXAMPLE_BUTTON_BG_COLOR_HELP","EXAMPLE_BUTTON_FONT_COLOR","EXAMPLE_BUTTON_FONT_COLOR_HELP","EXAMPLE_BUTTON_TEXT_ICON","EXAMPLE_BUTTON_TEXT_WIDTH","EXAMPLE_BUTTON_TEXT_WIDTH_HELP","EXAMPLE_BUTTON_ICON_NONE","EXAMPLE_BUTTON_ICON_DUNITER","EXAMPLE_BUTTON_ICON_CESIUM","EXAMPLE_BUTTON_ICON_G1_COLOR","EXAMPLE_BUTTON_ICON_G1_BLACK","CURRENCIES","DEV_WARNING","DEV_WARNING_MESSAGE","DEV_WARNING_MESSAGE_SHORT","BTN_REGISTRY","SELECT","MEMBERS_COUNT","ERROR_TX_RECEIVED","BTN_MEMBERSHIP_IN_DOTS","BTN_SEND_IDENTITY_DOTS","BTN_REVOKE","SLIDE_1_TITLE","SLIDE_2_TITLE","FEATURE_NOT_AVAILABLE_ON_DEMO","LICENCE","$urlRouterProvider","abstract","otherwise","showAboutModal","changeLanguage","langKey","hideLocalesPopover","showLocalesPopover","localesPopover","$sce","transferData","preferred_node","redirect_url","cancel_url","transferButton","showParameters","icons","bgColor","fontColor","transferDemoUrl","rootPath","buttonText","computeTransferButtonHtml","$broadcast","csPlatform","csDemoWallet","normalizeAmount","amountStr","parseFloat","toFixed","amounts","errorState","preferredNode","fallbackNodes","starting","unsubscribe","askTransferConfirm","walletData","onSuccess","txRes","encodeURI","redirectToUrl","onCancel","top","parent","assign","directive","require","link","ngModel","compareTo","$validators","modelValue","$eval","$validate","differentTo","NUMBER_REGEXP","numberFloat","$isEmpty","INT_REGEXP","attrs","numberInt","EMAIL_REGEXP","email","requiredIf","required","geoPoint","lat","lon","restrict","showCopyPopover","copyOnClick","$location","clazz","activeLink","activeLinkPathPrefix","newPath","addClass","returnClose","onReturn","onFocus","onBlur","attr","which","blur","$compile","$parse","compile","tElement","tAttrs","ngBindHtmlGetter","trustAsHtml","ngBindHtmlWatch","$$addBindingClass","$$addBindingInfo","getTrustedHtml","contents","$element","nextViewOptions","historyRoot","disableAnimate","expire","PluginService","tAttributes","extensionPoints","extensionPoint","append","getTemplate","pre","iElement","iAttrs","fn","onReadFile","onChangeEvent","files","onLoadEvent","$applyAsync","srcElement","elem","dropZone","stopPropagation","dataTransfer","$apply","transclude","fileSelect","fileInput","accept","click","attachEvent","addEventListener","onLocaleChange","onCurrencyChange","MEDIAN_TIME_OFFSET","pattern","Array","currencySymbol","patternRelative","minValueRelative","abs","formatRelative","formatQuantitative","minValue","Infinity","local","fromNow","separator","day","hour","_cache","sepChars","c","charAt","uniformLanguageTag","determinePreferredLanguage","useSanitizeValueStrategy","useLoaderCache","$httpProvider","defaults","useXDomain","common","$compileProvider","debugInfoEnabled","imgSrcSanitizationWhitelist","$animateProvider","classNameFilter","CacheFactoryProvider","recycleFreq","storagePrefix","capacity","screenmatchConfigProvider","rules","$ionicConfigProvider","enableJsScrolling","scrolling","jsScrolling","maxCache","IdleProvider","idle","logoutIdle","logoutTimeout","exception","cause","defaultSettingsNode","removeChangeStateListener","fallbackNodeIndex","disableChangeState","nextParams","fromState","enableChangeState","checkBmaNodeAlive","fallbackNode","newServer","messageParam","old","new","latestRelease","isNewer","$urlRouter","device","hashIndex","httpsModeDebug","hideKeyboardAccessoryBar","disableScroll","StatusBar","release","newRelease","registerBackButtonAction","backView","goBack","exitApp","rtrim","args","arguments"],"mappings":"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","file":"../../dist_js/cesium-api.js","sourcesContent":["\n\nfunction Peer(json) {\n\n var that = this;\n\n Object.keys(json).forEach(function (key) {\n that[key] = json[key];\n });\n\n that.endpoints = that.endpoints || [];\n}\n\n\nPeer.prototype.regexp = {\n BMA: /^BASIC_MERKLED_API[ ]?/,\n BMAS: /^BMAS[ ]?/,\n WS2P: /^WS2P[ ]?/,\n BMA_REGEXP: /^BASIC_MERKLED_API([ ]+([a-z_][a-z0-9-_.ğĞ]*))?([ ]+([0-9.]+))?([ ]+([0-9a-f:]+))?([ ]+([0-9]+))$/,\n BMAS_REGEXP: /^BMAS([ ]+([a-z_][a-z0-9-_.ğĞ]*))?([ ]+([0-9.]+))?([ ]+([0-9a-f:]+))?([ ]+([0-9]+))$/,\n WS2P_REGEXP: /^WS2P[ ]+([a-z0-9]+)([ ]+([a-z_][a-z0-9-_.ğĞ]*))?([ ]+([0-9.]+))?([ ]+([0-9a-f:]+))?([ ]+([0-9]+))([ ]+([a-z0-9/.&#!]+))?$/,\n LOCAL_IP_ADDRESS: /^127[.]0[.]0.|192[.]168[.]|10[.]0[.]0[.]|172[.]16[.]/\n};\nPeer.prototype.regex = Peer.prototype.regexp; // for backward compat\n\nPeer.prototype.keyID = function () {\n var bma = this.bma || this.getBMA();\n if (bma.useBma) {\n return [this.pubkey || \"Unknown\", bma.dns, bma.ipv4, bma.ipv6, bma.port, bma.useSsl, bma.path].join('-');\n }\n return [this.pubkey || \"Unknown\", bma.ws2pid, bma.path].join('-');\n};\n\nPeer.prototype.copyValues = function(to) {\n var obj = this;\n [\"version\", \"currency\", \"pub\", \"endpoints\", \"hash\", \"status\", \"block\", \"signature\"].forEach(function (key) {\n to[key] = obj[key];\n });\n};\n\nPeer.prototype.copyValuesFrom = function(from) {\n var obj = this;\n [\"version\", \"currency\", \"pub\", \"endpoints\", \"block\", \"signature\"].forEach(function (key) {\n obj[key] = from[key];\n });\n};\n\nPeer.prototype.json = function() {\n var obj = this;\n var json = {};\n [\"version\", \"currency\", \"endpoints\", \"status\", \"block\", \"signature\"].forEach(function (key) {\n json[key] = obj[key];\n });\n json.raw = this.raw && this.getRaw();\n json.pubkey = this.pubkey;\n return json;\n};\n\nPeer.prototype.getBMA = function() {\n if (this.bma) return this.bma;\n var bma = null;\n var bmaRegex = this.regexp.BMA_REGEXP;\n var bmasRegex = this.regexp.BMAS_REGEXP;\n this.endpoints.forEach(function(ep){\n var matches = !bma && bmaRegex.exec(ep);\n if (matches) {\n bma = {\n \"dns\": matches[2] || '',\n \"ipv4\": matches[4] || '',\n \"ipv6\": matches[6] || '',\n \"port\": matches[8] || 80,\n \"useSsl\": matches[8] == 443,\n \"useBma\": true\n };\n }\n matches = !bma && bmasRegex.exec(ep);\n if (matches) {\n bma = {\n \"dns\": matches[2] || '',\n \"ipv4\": matches[4] || '',\n \"ipv6\": matches[6] || '',\n \"port\": matches[8] || 80,\n \"useSsl\": true,\n \"useBma\": true\n };\n }\n });\n return bma || {};\n};\n\nPeer.prototype.getEndpoints = function(regex) {\n if (!regex) return this.endpoints;\n return this.endpoints.reduce(function(res, ep){\n return ep.match(regex) ? res.concat(ep) : res;\n }, []);\n};\n\nPeer.prototype.hasEndpoint = function(endpoint){\n //console.debug('testing if hasEndpoint:' + endpoint);\n var regExp = this.regexp[endpoint] || new RegExp('^' + endpoint);\n var endpoints = this.getEndpoints(regExp);\n if (!endpoints.length) return false;\n else return true;\n};\n\nPeer.prototype.getDns = function() {\n var bma = this.bma || this.getBMA();\n return bma.dns ? bma.dns : null;\n};\n\nPeer.prototype.getIPv4 = function() {\n var bma = this.bma || this.getBMA();\n return bma.ipv4 ? bma.ipv4 : null;\n};\n\nPeer.prototype.getIPv6 = function() {\n var bma = this.bma || this.getBMA();\n return bma.ipv6 ? bma.ipv6 : null;\n};\n\nPeer.prototype.getPort = function() {\n var bma = this.bma || this.getBMA();\n return bma.port ? bma.port : null;\n};\n\nPeer.prototype.getHost = function(getHost) {\n bma = getHost || this.bma || this.getBMA();\n return ((bma.port == 443 || bma.useSsl) && bma.dns) ? bma.dns :\n (this.hasValid4(bma) ? bma.ipv4 :\n (bma.dns ? bma.dns :\n (bma.ipv6 ? '[' + bma.ipv6 + ']' :'')));\n};\n\nPeer.prototype.getURL = function(bma) {\n bma = bma || this.bma || this.getBMA();\n var host = this.getHost(bma);\n var protocol = (bma.port == 443 || bma.useSsl) ? 'https' : 'http';\n return protocol + '://' + host + (bma.port ? (':' + bma.port) : '');\n};\n\nPeer.prototype.getServer = function(bma) {\n bma = bma || this.bma || this.getBMA();\n var host = this.getHost(bma);\n return host + (host && bma.port ? (':' + bma.port) : '');\n};\n\nPeer.prototype.hasValid4 = function(bma) {\n return bma.ipv4 &&\n /* exclude private address - see https://fr.wikipedia.org/wiki/Adresse_IP */\n !bma.ipv4.match(this.regexp.LOCAL_IP_ADDRESS) ?\n true : false;\n};\n\nPeer.prototype.isReachable = function () {\n return !!this.getServer();\n};\n\nPeer.prototype.isSsl = function() {\n var bma = this.bma || this.getBMA();\n return bma.useSsl;\n};\n\nPeer.prototype.isTor = function() {\n var bma = this.bma || this.getBMA();\n return bma.useTor;\n};\n\nPeer.prototype.isWs2p = function() {\n var bma = this.bma || this.getBMA();\n return bma.useWs2p;\n};\n\nPeer.prototype.isBma = function() {\n var bma = this.bma || this.getBMA();\n return !bma.useWs2p && !bma.useTor;\n};\n\nPeer.prototype.hasBma = function() {\n return this.hasEndpoint('(BASIC_MERKLE_API|BMAS|BMATOR)');\n};\n","/**\n * Created by blavenie on 01/02/17.\n */\nfunction Block(json, attributes) {\n \"use strict\";\n\n var that = this;\n\n // Copy default fields\n if (!attributes || !attributes.length) {\n [\"currency\", \"issuer\", \"medianTime\", \"number\", \"version\", \"powMin\", \"dividend\", \"membersCount\", \"hash\", \"identities\", \"joiners\", \"actives\", \"leavers\", \"revoked\", \"excluded\", \"certifications\", \"transactions\", \"unitbase\"]\n .forEach(function (key) {\n that[key] = json[key];\n });\n }\n // or just given\n else {\n _.forEach(attributes, function (key) {\n that[key] = json[key];\n });\n\n }\n\n that.identitiesCount = that.identities ? that.identities.length : 0;\n that.joinersCount = that.joiners ? that.joiners.length : 0;\n that.activesCount = that.actives ? that.actives.length : 0;\n that.leaversCount = that.leavers ? that.leavers.length : 0;\n that.revokedCount = that.revoked ? that.revoked.length : 0;\n that.excludedCount = that.excluded ? that.excluded.length : 0;\n that.certificationsCount = that.certifications ? that.certifications.length : 0;\n that.transactionsCount = that.transactions ? that.transactions.length : 0;\n\n that.empty = that.isEmpty();\n\n that.id = [that.number, that.hash].join('-');\n}\n\nBlock.prototype.isEmpty = function(){\n \"use strict\";\n return !this.transactionsCount &&\n !this.certificationsCount &&\n !this.joinersCount &&\n !this.dividend &&\n !this.activesCount &&\n !this.identitiesCount &&\n !this.leaversCount &&\n !this.excludedCount &&\n !this.revokedCount;\n};\n\nBlock.prototype.parseData = function() {\n this.identities = this.parseArrayValues(this.identities, ['pubkey', 'signature', 'buid', 'uid']);\n this.joiners = this.parseArrayValues(this.joiners, ['pubkey', 'signature', 'mBuid', 'iBuid', 'uid']);\n this.actives = this.parseArrayValues(this.actives, ['pubkey', 'signature', 'mBuid', 'iBuid', 'uid']);\n this.leavers = this.parseArrayValues(this.leavers, ['pubkey', 'signature', 'mBuid', 'iBuid', 'uid']);\n this.revoked = this.parseArrayValues(this.revoked, ['pubkey', 'signature']);\n this.excluded = this.parseArrayValues(this.excluded, ['pubkey']);\n\n // certifications\n this.certifications = this.parseArrayValues(this.certifications, ['from', 'to', 'block', 'signature']);\n //this.certifications = _.groupBy(this.certifications, 'to');\n\n // TX\n this.transactions = this.parseTransactions(this.transactions);\n\n delete this.raw; // not need\n};\n\nBlock.prototype.cleanData = function() {\n delete this.identities;\n delete this.joiners;\n delete this.actives;\n delete this.leavers;\n delete this.revoked;\n delete this.excluded;\n delete this.certifications;\n delete this.transactions;\n\n delete this.raw; // not need\n};\n\nBlock.prototype.parseArrayValues = function(array, itemObjProperties){\n if (!array || !array.length) return [];\n return array.reduce(function(res, raw) {\n var parts = raw.split(':');\n if (parts.length != itemObjProperties.length) {\n console.debug('[block] Bad format for \\'{0}\\': [{1}]. Expected {1} parts. Skipping'.format(arrayProperty, raw, itemObjProperties.length));\n return res;\n }\n var obj = {};\n for (var i=0; i<itemObjProperties.length; i++) {\n obj[itemObjProperties[i]] = parts[i];\n }\n return res.concat(obj);\n }, []);\n};\n\nfunction exact(regexpContent) {\n return new RegExp(\"^\" + regexpContent + \"$\");\n}\n\nBlock.prototype.regexp = {\n TX_OUTPUT_SIG: exact(\"SIG\\\\(([0-9a-zA-Z]{43,44})\\\\)\")\n};\n\nBlock.prototype.parseTransactions = function(transactions) {\n if (!transactions || !transactions.length) return [];\n return transactions.reduce(function (res, tx) {\n var obj = {\n issuers: tx.issuers,\n time: tx.time\n };\n\n obj.outputs = tx.outputs.reduce(function(res, output) {\n var parts = output.split(':');\n if (parts.length != 3) {\n console.debug('[block] Bad format a \\'transactions\\': [{0}]. Expected 3 parts. Skipping'.format(output));\n return res;\n }\n\n var amount = parts[0];\n var unitbase = parts[1];\n var unlockCondition = parts[2];\n\n var matches = Block.prototype.regexp.TX_OUTPUT_SIG.exec(parts[2]);\n\n // Simple expression SIG(x)\n if (matches) {\n var pubkey = matches[1];\n if (!tx.issuers || tx.issuers.indexOf(pubkey) != -1) return res;\n return res.concat({\n amount: unitbase <= 0 ? amount : amount * Math.pow(10, unitbase),\n unitbase: unitbase,\n pubkey: pubkey\n });\n }\n\n // Parse complex unlock condition\n else {\n //console.debug('[block] [TX] Detecting unlock condition: {0}.'.format(output));\n return res.concat({\n amount: unitbase <= 0 ? amount : amount * Math.pow(10, unitbase),\n unitbase: unitbase,\n unlockCondition: unlockCondition\n });\n }\n }, []);\n\n // Special cas for TX to himself\n if (!obj.error && !obj.outputs.length) {\n obj.toHimself = true;\n }\n\n return res.concat(obj);\n }, []);\n};\n","\n\nfunction Ws2pMessage(message) {\n\n var that = this;\n\n var parts = message.split(':');\n if (parts.length < 3 || !parts[0].startsWith('WS2P')) {\n throw Error('Invalid format: ' + message);\n }\n // Head message\n if (parts[1] == 'HEAD') {\n if (parts.length < 4) {\n throw Error('Invalid format: ' + message);\n }\n // Duniter version < 1.6.9\n if (parts.length == 4) {\n that.pubkey = parts[2];\n that.buid = parts[3];\n }\n else {\n var version = parts[2];\n if (version >= 1) {\n var prefix = parts[0];\n\n // Private/public options\n if (prefix.length > 4) {\n var matches = this.regexp.WS2P_PREFIX.exec(prefix);\n if (!matches) {\n throw Error('Invalid format: ' + message);\n }\n\n // Private options\n var privateOptions = matches[1];\n if (privateOptions) {\n that.private = {\n useTor: privateOptions.startsWith('T')\n };\n var mode = privateOptions.substring(1);\n if (mode == 'A') {\n that.private.mode = 'all';\n }\n else if (mode == 'M') {\n that.private.mode = 'mixed';\n }\n else if (mode == 'S') {\n that.private.mode = 'strict';\n }\n }\n\n // Public options\n var publicOptions = matches[2];\n if (publicOptions) {\n that.public = {\n useTor: publicOptions.startsWith('T'),\n mode: 'all'\n };\n }\n\n // For DEBUG only:\n /*\n console.log('[http] private {0}, public {1}'.format(\n (that.private && (that.private.useTor ? 'TOR ' : '' ) + (that.private.mode || 'false')) || 'false',\n that.public && ((that.public.useTor ? 'TOR ' : '' ) + (that.public.mode || 'false')) || 'false'\n ), prefix);*/\n }\n\n that.pubkey=parts[3];\n that.buid=parts[4];\n that.ws2pid=parts[5];\n that.software=parts[6];\n that.version=parts[7];\n that.powPrefix=parts[8];\n }\n }\n }\n\n}\n\n\nWs2pMessage.prototype.regexp = {\n WS2P_PREFIX: /^WS2P(?:O([CT][SAM]))?(?:I([CT]))?$/,\n};\n\n\n","\nLoginController.$inject = ['$scope', '$timeout', '$controller', 'csWallet'];\nLoginModalController.$inject = ['$scope', '$timeout', '$q', '$ionicPopover', '$window', 'CryptoUtils', 'csCrypto', 'ionicReady', 'UIUtils', 'BMA', 'Modals', 'csConfig', 'csSettings', 'Device', 'parameters'];\nAuthController.$inject = ['$scope', '$controller', 'csConfig'];\nangular.module('cesium.login.controllers', ['cesium.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n .state('app.login', {\n url: \"/login\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/home/home.html\",\n controller: 'LoginCtrl'\n }\n }\n })\n ;\n }])\n\n .controller('LoginCtrl', LoginController)\n\n .controller('LoginModalCtrl', LoginModalController)\n\n .controller('AuthCtrl', AuthController)\n\n;\n\n\nfunction LoginController($scope, $timeout, $controller, csWallet) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('HomeCtrl', {$scope: $scope}));\n\n $scope.showLoginModal = function() {\n if ($scope.loading) return $timeout($scope.showLoginModal, 500); // recursive call\n\n if (!csWallet.isLogin() && !$scope.error) {\n return $timeout(csWallet.login, 300);\n }\n };\n $scope.$on('$ionicView.enter', $scope.showLoginModal);\n\n}\n\nfunction LoginModalController($scope, $timeout, $q, $ionicPopover, $window, CryptoUtils, csCrypto, ionicReady,\n UIUtils, BMA, Modals, csConfig, csSettings, Device, parameters) {\n 'ngInject';\n\n parameters = parameters || {};\n\n // Demo mode: force PUBKEY method\n if (csConfig.demo) {\n parameters.method = 'PUBKEY';\n }\n\n $scope.computing = false;\n $scope.pubkey = null;\n $scope.formData = {};\n $scope.showPubkey = false;\n $scope.showComputePubkeyButton = false;\n $scope.autoComputePubkey = false;\n $scope.pubkeyPattern = '^(:?{0}|{1})$'.format(BMA.constants.regexp.PUBKEY, BMA.constants.regexp.PUBKEY_WITH_CHECKSUM);\n\n $scope.isAuth = parameters.auth;\n $scope.okText = parameters.okText;\n $scope.title = parameters.title || ($scope.isAuth ? 'AUTH.TITLE' : 'LOGIN.TITLE');\n $scope.showMethods = angular.isDefined(parameters.showMethods) ? parameters.showMethods : true;\n $scope.showNewAccountLink = angular.isDefined(parameters.showNewAccountLink) ? parameters.showNewAccountLink : true;\n $scope.expectedPubkey = parameters.expectedPubkey;\n $scope.expectedUid = parameters.uid;\n\n $scope.scryptParamsValues = _.keys(CryptoUtils.constants.SCRYPT_PARAMS)\n .reduce(function(res, key) {\n return res.concat({id: key, label: 'LOGIN.SCRYPT.' + key, params: CryptoUtils.constants.SCRYPT_PARAMS[key]});\n }, [{id: 'USER', label: 'LOGIN.SCRYPT.USER', params: {}}]);\n\n // modal init\n $scope.init = function() {\n\n ionicReady().then(function(){\n // Should auto-compute pubkey ?\n $scope.autoComputePubkey = ionic.Platform.grade.toLowerCase()==='a' &&\n !UIUtils.screen.isSmall();\n });\n\n // Init remember me\n $scope.formData.rememberMe = csSettings.data.rememberMe;\n\n // Init keep auth, from idle time\n $scope.formData.keepAuthIdle = csSettings.data.keepAuthIdle;\n $scope.formData.keepAuth = ($scope.formData.keepAuthIdle == csSettings.constants.KEEP_AUTH_IDLE_SESSION);\n\n // Init method\n var method = parameters.method || csSettings.data.login && csSettings.data.login.method || 'SCRYPT_DEFAULT';\n var params = csSettings.data.login && csSettings.data.login.params;\n // used default method, when PUBKEY + auth, or SCAN, or if ask for 'default'\n if (($scope.isAuth && method === 'PUBKEY') || (method === 'SCAN') || (method === 'default')) {\n method = 'SCRYPT_DEFAULT';\n }\n $scope.changeMethod(method, params);\n };\n\n // modal enter\n $scope.enter = function() {\n UIUtils.loading.hide();\n // Ink effect\n UIUtils.ink({selector: '.modal-login .ink'});\n };\n $scope.$on('modal.shown', $scope.enter);\n\n // modal leave\n $scope.leave = function() {\n $scope.formData = {};\n $scope.computing = false;\n $scope.pubkey = null;\n $scope.methods = [];\n };\n $scope.$on('modal.hide', $scope.leave);\n\n // Login form submit\n $scope.doLogin = function(skipForm) {\n var method = $scope.formData.method;\n\n if(!$scope.form.$valid && method !== 'SCAN') return;\n\n var keepAuthIdle = $scope.formData.keepAuthIdle;\n var promise;\n\n // Scrypt\n if (method === 'SCRYPT_DEFAULT' || method === 'SCRYPT_ADVANCED') {\n if (!$scope.formData.username || !$scope.formData.password) return;\n var scryptPrams = $scope.formData.scrypt && $scope.formData.scrypt.params;\n UIUtils.loading.show();\n promise = CryptoUtils.scryptKeypair($scope.formData.username, $scope.formData.password, scryptPrams)\n .then(function(keypair) {\n if (!keypair) return UIUtils.loading.hide(10);\n var pubkey = CryptoUtils.util.encode_base58(keypair.signPk);\n // Check pubkey\n if (parameters.expectedPubkey && parameters.expectedPubkey != pubkey) {\n $scope.pubkey = pubkey;\n $scope.showPubkey = true;\n $scope.pubkeyError = true;\n return UIUtils.loading.hide(10);\n }\n\n $scope.pubkeyError = false;\n\n return {\n pubkey: pubkey,\n keypair: keypair,\n params: ($scope.formData.scrypt && $scope.formData.scrypt.id != 'SCRYPT_DEFAULT') ? scryptPrams : undefined\n };\n })\n .catch(UIUtils.onError('ERROR.CRYPTO_UNKNOWN_ERROR'));\n }\n\n // File\n else if (method === 'FILE') {\n if (!$scope.formData.file || !$scope.formData.file.valid || !$scope.formData.file.pubkey) return;\n\n // If checkbox keep auth checked: set idle time to session\n keepAuthIdle = ($scope.formData.keepAuth && csSettings.constants.KEEP_AUTH_IDLE_SESSION) || keepAuthIdle;\n\n promise =\n UIUtils.loading.show()\n .then(function() {\n return $scope.readKeyFile($scope.formData.file, {\n withSecret: ($scope.isAuth || $scope.formData.keepAuth)\n });\n })\n .then(function(keypair) {\n if (!keypair) return UIUtils.loading.hide(10);\n var pubkey = CryptoUtils.util.encode_base58(keypair.signPk);\n\n // Check pubkey\n if (parameters.expectedPubkey && parameters.expectedPubkey != pubkey) {\n $scope.formData.file.valid = false;\n return UIUtils.loading.hide(10);\n }\n\n $scope.pubkeyError = false;\n\n return {\n pubkey: pubkey,\n keypair: keypair\n };\n })\n .catch(UIUtils.onError('ERROR.AUTH_FILE_ERROR'));\n }\n\n // Pubkey\n else if (method === 'PUBKEY') {\n var pubkey = $scope.formData.pubkey && $scope.formData.pubkey.trim();\n var uid = $scope.formData.uid && $scope.formData.uid.trim() || undefined;\n if (!pubkey) return;\n var matches = BMA.regexp.PUBKEY.exec(pubkey);\n // valid pubkey: use it\n if (matches) {\n promise = UIUtils.loading.show()\n .then(function() {\n return {\n pubkey: pubkey,\n uid : uid\n };\n });\n }\n\n // Check checksum\n else {\n\n matches = BMA.regexp.PUBKEY_WITH_CHECKSUM.exec(pubkey);\n if (matches) {\n\n pubkey = matches[1];\n var checksum = matches[2];\n var expectedChecksum = csCrypto.util.pkChecksum(pubkey);\n if (checksum != expectedChecksum) {\n $scope.form.pubkey.$error = {checksum: true};\n }\n else {\n promise = UIUtils.loading.show()\n .then(function() {\n return {\n pubkey: pubkey,\n uid : uid\n };\n });\n }\n }\n // Not a pubkey: launch search on\n else {\n return $scope.showWotLookupModal(pubkey);\n }\n }\n }\n\n // Scan QR code\n else if (method === 'SCAN') {\n var valid = $scope.formData.pubkey && (!$scope.isAuth || !!$scope.formData.keypair);\n if (!valid) return;\n\n promise = UIUtils.loading.show()\n .then(function() {\n return {\n pubkey: $scope.formData.pubkey,\n keypair: $scope.formData.keypair\n };\n });\n }\n\n if (!promise) {\n console.warn('[login] unknown method: ', method);\n return;\n }\n\n return promise.then(function(res) {\n if (!res) return;\n\n // Update settings (if need)\n var rememberMeChanged = !angular.equals(csSettings.data.rememberMe, $scope.formData.rememberMe);\n var keepAuthIdleChanged = !angular.equals(csSettings.data.keepAuthIdle, keepAuthIdle);\n var methodChanged = !angular.equals(csSettings.data.login && csSettings.data.login.method, method);\n var paramsChanged = !angular.equals(csSettings.data.login && csSettings.data.login.params, res.params);\n if (rememberMeChanged || keepAuthIdleChanged || methodChanged || paramsChanged) {\n csSettings.data.rememberMe = $scope.formData.rememberMe;\n csSettings.data.keepAuthIdle = keepAuthIdle;\n csSettings.data.useLocalStorage = csSettings.data.rememberMe ? true : csSettings.data.useLocalStorage;\n csSettings.data.login = csSettings.data.login || {};\n csSettings.data.login.method = method;\n csSettings.data.login.params = res.params;\n $timeout(csSettings.store, 500);\n }\n\n if (parameters.success) {\n parameters.success($scope.formData);\n }\n\n // hide loading\n if (parameters.silent) {\n UIUtils.loading.hide();\n }\n\n // Return result then close\n return $scope.closeModal(res);\n });\n };\n\n $scope.onScryptFormChanged = function() {\n if ($scope.computing) return; // avoid multiple call\n $scope.pubkey = null;\n $scope.pubkeyError = false;\n $scope.showPubkey = !!$scope.formData.username && !!$scope.formData.password;\n if ($scope.autoComputePubkey && $scope.showPubkey) {\n $scope.computePubkey();\n $scope.showComputePubkeyButton = false;\n }\n else {\n $scope.showComputePubkeyButton = !$scope.autoComputePubkey && $scope.showPubkey;\n }\n };\n $scope.$watch('formData.username + formData.password', $scope.onScryptFormChanged, true);\n\n $scope.computePubkey = function() {\n $scope.showComputePubkeyButton = false;\n $scope.computing = true;\n $scope.pubkey = null;\n return $timeout(function() {\n var salt = $scope.formData.username;\n var pwd = $scope.formData.password;\n var scryptPrams = $scope.formData.scrypt && $scope.formData.scrypt.params;\n return CryptoUtils.scryptSignPk(salt, pwd, scryptPrams)\n .then(function (signPk) {\n\n // If model has changed before the response, then retry\n if (salt !== $scope.formData.username || pwd !== $scope.formData.password) {\n return $scope.computePubkey();\n }\n\n $scope.pubkey = CryptoUtils.util.encode_base58(signPk);\n if ($scope.expectedPubkey && $scope.expectedPubkey != $scope.pubkey) {\n $scope.pubkeyError = true;\n }\n\n $scope.computing = false;\n }\n )\n .catch(function (err) {\n UIUtils.onError('ERROR.CRYPTO_UNKNOWN_ERROR')(err);\n $scope.computing = false;\n $scope.autoComputePubkey = false; // Avoid a infinite loop (computePubkey -> onScryptFormChanged -> computePubkey)\n $scope.onScryptFormChanged();\n });\n }, 100);\n };\n\n $scope.showJoinModal = function() {\n $scope.closeModal();\n $timeout(function() {\n Modals.showJoin();\n }, 300);\n };\n\n $scope.showAccountSecurityModal = function() {\n $scope.closeModal();\n $timeout(function() {\n Modals.showAccountSecurity();\n }, 300);\n };\n\n $scope.showHelpModal = function(parameters) {\n return Modals.showHelp(parameters);\n };\n\n $scope.doScan = function() {\n if ($scope.computing) return;\n\n $scope.computing = true;\n $scope.formData.pubkey = null;\n $scope.formData.keypair = null;\n\n // Run scan cordova plugin, on device\n return Device.barcode.scan()\n .then(function(data) {\n if (!data) return;\n\n // Skip simple parsing, if auth if need\n if ($scope.isAuth) return $q.when(data);\n\n // Try to parse as an URI\n return BMA.uri.parse(data)\n .then(function (res) {\n if (!res || !res.pubkey) throw {message: 'ERROR.SCAN_UNKNOWN_FORMAT'};\n // If simple pubkey\n return res;\n })\n .catch(function(err) {\n console.debug('[login] Error while parsing as URI: ' + (err && err.message || err));\n return data;\n });\n })\n .then(function(data) {\n if (!data) return;\n // Parse success: continue\n if (data && data.pubkey) return data;\n\n // Try to read as WIF format\n return csCrypto.keyfile.parseData(data, {silent: true})\n .then(function(keypair) {\n if (!keypair || !keypair.signPk || !keypair.signSk) throw {message: 'ERROR.SCAN_UNKNOWN_FORMAT'}; // rethrow an error\n\n var pubkey = CryptoUtils.base58.encode(keypair.signPk);\n\n // Login using keypair\n return {\n pubkey: pubkey,\n keypair: keypair\n };\n })\n // Unknown format (nor URI, nor WIF/EWIF)\n .catch(UIUtils.onError('ERROR.SCAN_UNKNOWN_FORMAT'));\n })\n .then(function(res) {\n if (!res || !res.pubkey) return; // no data\n\n $scope.pubkeyError = $scope.expectedPubkey && $scope.expectedPubkey != res.pubkey;\n $scope.formData.pubkey = res.pubkey;\n $scope.formData.keypair = res.keypair;\n })\n .then(function() {\n $scope.computing = false;\n UIUtils.loading.hide(10);\n })\n .catch(function(err) {\n $scope.computing = false;\n UIUtils.onError('ERROR.SCAN_FAILED')(err);\n });\n };\n\n $scope.changeMethod = function(method, params){\n $scope.hideMethodsPopover();\n\n if (method !== 'PUBKEY' && csConfig.demo) {\n return UIUtils.alert.demo();\n }\n\n if (!method || method === $scope.formData.method) return; // same method\n\n console.debug(\"[login] method is: \" + method);\n $scope.formData.method = method;\n $scope.formData.uid = null;\n\n if ($scope.form) {\n // hide form's fields errors on the form\n delete $scope.form.$submitted;\n }\n\n // Scrypt (advanced or not)\n if (method === 'SCRYPT_DEFAULT' || method === 'SCRYPT_ADVANCED') {\n $scope.pubkey = null;\n\n\n // Search scrypt object\n var scrypt;\n if (params) {\n scrypt = _.find($scope.scryptParamsValues, function(item){\n return item.params && angular.equals(item.params, params);\n });\n if (!scrypt) {\n scrypt = _.findWhere($scope.scryptParamsValues, {id: 'USER'}) || {};\n scrypt.params = params;\n }\n }\n else {\n scrypt = _.findWhere($scope.scryptParamsValues, {id: 'DEFAULT'});\n }\n $scope.changeScrypt(scrypt);\n\n $scope.autoComputePubkey = $scope.autoComputePubkey && (method === 'SCRYPT_DEFAULT');\n }\n else if (method === 'SCAN') {\n return $scope.doScan();\n }\n else {\n $scope.formData.username = null;\n $scope.formData.password = null;\n $scope.formData.pubkey = null;\n $scope.pubkey = null;\n $scope.computing = false;\n }\n };\n\n $scope.changeScrypt = function(scrypt) {\n // Protect params against changes\n $scope.formData.scrypt = angular.copy(scrypt||{});\n $scope.onScryptFormChanged();\n };\n\n $scope.readKeyFile = function(file, options) {\n options = options || {};\n\n options.password = options.password || $scope.formData.file.password || function() {\n $scope.formData.file.password = undefined;\n return Modals.showPassword({\n title: 'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.TITLE',\n subTitle: 'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.HELP',\n error: options.error,\n scope: $scope\n })\n .then(function (password) {\n // Remember password (for validation)\n $scope.formData.file.password = password;\n // Timeout is need to force popup to be hide\n return $timeout(function() {\n return password;\n }, 150);\n });\n };\n\n return csCrypto.keyfile.read($scope.formData.file, options)\n .catch(function(err) {\n $scope.formData.file.password = undefined;\n if (err === 'CANCELLED') {\n UIUtils.loading.hide(10);\n }\n if (err && err.ucode == csCrypto.errorCodes.BAD_PASSWORD) {\n // Recursive call\n return $scope.readKeyFile($scope.formData.file, {withSecret: options.withSecret, error: 'ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD'});\n }\n throw err;\n });\n };\n\n $scope.onFileChanged = function(file) {\n if (!file || !file.fileData) {\n $scope.validatingFile = false;\n return; // Skip\n }\n $scope.formData.file = {\n name: file.fileData.name,\n size: file.fileData.size,\n content: file.fileContent\n };\n $scope.validatingFile = true;\n $timeout(function() {\n console.debug(\"[login] key file changed: \", $scope.formData.file);\n $scope.validatingFile = true;\n\n return $scope.readKeyFile($scope.formData.file, {withSecret: false, password: $scope.formData.file.password})\n .then(function(keypair) {\n if (!keypair || !keypair.signPk) {\n $scope.formData.file.valid = false;\n $scope.formData.file.pubkey = undefined;\n }\n else {\n $scope.formData.file.pubkey = CryptoUtils.util.encode_base58(keypair.signPk);\n $scope.formData.file.valid = !$scope.expectedPubkey || $scope.expectedPubkey === $scope.formData.file.pubkey;\n $scope.validatingFile = false;\n }\n\n })\n .catch(function(err) {\n if (err && err === 'CANCELLED') {\n $scope.removeKeyFile();\n return;\n }\n $scope.validatingFile = false;\n $scope.formData.file.valid = false;\n $scope.formData.file.pubkey = undefined;\n UIUtils.onError('ERROR.AUTH_FILE_ERROR')(err);\n });\n });\n };\n\n $scope.removeKeyFile = function() {\n $scope.formData.file = undefined;\n };\n\n /* -- modals -- */\n\n $scope.showWotLookupModal = function(searchText) {\n return Modals.showWotLookup({q: searchText})\n .then(function(res){\n if (res && res.pubkey) {\n $scope.formData.pubkey = res.pubkey;\n $scope.formData.uid = res.uid || undefined;\n return $timeout($scope.doLogin, 300);\n }\n });\n };\n\n /* -- popover -- */\n $scope.showMethodsPopover = function(event) {\n if (event.defaultPrevented) return;\n UIUtils.popover.show(event, {\n templateUrl :'templates/login/popover_methods.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.methodsPopover = popover;\n UIUtils.ink({selector: '.popover-login-methods .item'});\n }\n });\n };\n\n $scope.hideMethodsPopover = function() {\n if ($scope.methodsPopover) {\n $scope.methodsPopover.hide();\n $scope.methodsPopover = null;\n }\n };\n\n // Default action\n $scope.init();\n\n\n // TODO : for DEV only\n /*$timeout(function() {\n $scope.formData = {\n method: 'SCRYPT_DEFAULT',\n username: 'abc',\n password: 'def'\n };\n $scope.form = {$valid:true};\n\n $timeout($scope.doLogin, 500);\n }, 900); */\n}\n\n\nfunction AuthController($scope, $controller, csConfig){\n\n var config = angular.copy(csConfig);\n config.demo = false;\n config.readonly = false;\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('LoginModalCtrl', {$scope: $scope, parameters: {auth: true}, csConfig: config}));\n\n $scope.setForm = function(form) {\n $scope.form = form;\n };\n\n}\n","\nHelpController.$inject = ['$scope', '$state', '$timeout', '$anchorScroll', 'csSettings'];\nHelpModalController.$inject = ['$scope', '$timeout', '$anchorScroll', 'csSettings', 'parameters'];\nHelpTipController.$inject = ['$scope', '$state', '$window', '$ionicSideMenuDelegate', '$timeout', '$q', '$anchorScroll', 'UIUtils', 'csConfig', 'csSettings', 'csCurrency', 'csHelpConstants', 'Device', 'csWallet'];\nHelpTourController.$inject = ['$scope'];\nangular.module('cesium.help.controllers', ['cesium.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n\n .state('app.help_tour', {\n url: \"/tour\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/home/home.html\",\n controller: 'HelpTourCtrl'\n }\n }\n })\n\n .state('app.help', {\n url: \"/help?anchor\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/help/view_help.html\",\n controller: 'HelpCtrl'\n }\n }\n })\n\n .state('app.help_anchor', {\n url: \"/help/:anchor\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/help/view_help.html\",\n controller: 'HelpCtrl'\n }\n }\n })\n\n ;\n\n\n }])\n\n .controller('HelpCtrl', HelpController)\n\n .controller('HelpModalCtrl', HelpModalController)\n\n .controller('HelpTipCtrl', HelpTipController)\n\n .controller('HelpTourCtrl', HelpTourController)\n\n\n;\n\n\nfunction HelpController($scope, $state, $timeout, $anchorScroll, csSettings) {\n 'ngInject';\n\n $scope.$on('$ionicView.enter', function(e) {\n $scope.locale = csSettings.data.locale.id;\n if ($state.stateParams && $state.stateParams.anchor) {\n $scope.anchor = $state.stateParams.anchor;\n $timeout(function () {\n $anchorScroll($state.stateParams.anchor);\n }, 100);\n }\n });\n}\n\nfunction HelpModalController($scope, $timeout, $anchorScroll, csSettings, parameters) {\n 'ngInject';\n\n $scope.itemsClass = {};\n $scope.locale = csSettings.data.locale.id;\n\n parameters = parameters || {};\n if (parameters && typeof parameters == \"string\") {\n parameters = {anchor: parameters};\n }\n\n if (parameters.anchor) {\n\n $timeout(function() {\n $anchorScroll(parameters.anchor);\n }, 100);\n\n // Change CSS classes\n $scope.itemsClass = {};\n $scope.itemsClass[parameters.anchor] = 'selected';\n $scope.listClass = 'selection';\n }\n\n}\n\n\n/* ----------------------------\n* Help Tip\n* ---------------------------- */\nfunction HelpTipController($scope, $state, $window, $ionicSideMenuDelegate, $timeout, $q, $anchorScroll,\n UIUtils, csConfig, csSettings, csCurrency, csHelpConstants, Device, csWallet) {\n\n $scope.tour = false; // Is a tour or a helptip ?\n $scope.continue = true;\n\n $scope.executeStep = function(partName, steps, index) {\n index = angular.isDefined(index) ? index : 0;\n\n if (index >= steps.length) {\n return $q.when(true); // end\n }\n\n var step = steps[index];\n if (typeof step !== 'function') {\n throw new Error('[helptip] Invalid step at index {0} of \\'{1}\\' tour: step must be a function'.format(index, partName));\n }\n var promise = step();\n if (typeof promise === 'boolean') {\n promise = $q.when(promise);\n }\n return promise\n .then(function(next) {\n if (angular.isUndefined(next)) {\n $scope.continue = false;\n return index; // keep same index (no button press: popover just closed)\n }\n if (!next || index === steps.length - 1) {\n return next ? -1 : index+1; // last step OK, so mark has finished\n }\n return $scope.executeStep(partName, steps, index+1);\n })\n .catch(function(err) {\n if (err && err.message === 'transition prevented') {\n console.error('ERROR: in help tour [{0}], in step [{1}] -> use large if exists, to prevent [transition prevented] error'.format(partName, index));\n }\n else {\n console.error('ERROR: in help tour [{0}], in step [{1}] : {2}'.format(partName, index, err));\n }\n $scope.continue = false;\n return index;\n });\n };\n\n $scope.showHelpTip = function(id, options) {\n options = options || {};\n options.bindings = options.bindings || {};\n options.bindings.value =options.bindings.value || '';\n options.bindings.hasNext = angular.isDefined(options.bindings.hasNext) ? options.bindings.hasNext : true;\n options.timeout = options.timeout || (Device.enable ? 900 : 500);\n options.autoremove = true; // avoid memory leak\n options.bindings.tour = $scope.tour;\n options.backdropClickToClose = !$scope.tour;\n return UIUtils.popover.helptip(id, options);\n };\n\n $scope.showHelpModal = function(helpAnchor) {\n Modals.showHelp({anchor: helpAnchor});\n };\n\n $scope.startHelpTour = function() {\n $scope.tour = true;\n $scope.continue = true;\n\n console.debug(\"[help] Starting help tour... {demo: {0}, readonly: {1}, isLogin: {2}}\".format(\n csConfig.demo, csConfig.readonly, csWallet.isLogin()));\n\n // Wallet (if NOT readonly and NOT login)\n return ((!csConfig.readonly && csWallet.isLogin()) ? $scope.startWalletNoLoginTour(0, true) : $q.when(true))\n\n // Wallet (if login)\n .then(function(next){\n if (!next) return false;\n if (csConfig.readonly || !csWallet.isLogin()) return true; // not login or readonly: continue\n return $scope.startWalletTour(0, true)\n .then(function(endIndex){\n if (!endIndex) return false;\n csSettings.data.helptip.wallet=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // Wallet certifications\n .then(function(next){\n if (!next) return false;\n if (csConfig.readonly || !csWallet.isLogin()) return true; // not login or readonly: continue\n return $scope.startWalletCertTour(0, true)\n .then(function(endIndex){\n if (!endIndex) return false;\n csSettings.data.helptip.walletCerts=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // My operations (if login)\n .then(function(next){\n if (!next) return false;\n if (csConfig.readonly || !csWallet.isLogin()) return true; // not login or readonly: continue\n return $scope.startTxTour(0, true)\n .then(function(endIndex){\n if (!endIndex) return false;\n csSettings.data.helptip.tx=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // My wallets (if login)\n .then(function(next){\n if (!next) return false;\n if (csConfig.readonly || !csWallet.isLogin()) return true; // not login or readonly: continue\n return $scope.startWalletsTour(0, true)\n .then(function(endIndex){\n if (!endIndex) return false;\n csSettings.data.helptip.wallets=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // Header tour\n .then(function(next){\n if (!next) return false;\n if (csConfig.readonly) return true; // readonly: continue\n return $scope.startHeaderTour(0, true);\n })\n\n // Settings tour (if not readonly mode)\n .then(function(next){\n if (!next) return false;\n if (csConfig.readonly) return true; // Skip if readonly mode (will be play later)\n return $scope.startSettingsTour(0, true);\n })\n\n // Wot lookup tour\n .then(function(next){\n if (!next) return false;\n return $scope.startWotLookupTour(0, true)\n .then(function(endIndex){\n if (!endIndex || $scope.cancelled) return false;\n csSettings.data.helptip.wotLookup=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // Wot identity\n .then(function(next){\n if (!next) return false;\n return $scope.startWotTour(0, true)\n .then(function(endIndex){\n if (!endIndex || $scope.cancelled) return false;\n csSettings.data.helptip.wot=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // Identity certifications\n .then(function(next){\n if (!next) return false;\n return $scope.startWotCertTour(0, true)\n .then(function(endIndex){\n if (!endIndex) return false;\n csSettings.data.helptip.wotCerts=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // Currency tour\n .then(function(next){\n if (!next) return false;\n\n return $scope.startCurrencyTour(0, true)\n .then(function(endIndex){\n if (!endIndex || $scope.cancelled) return false;\n csSettings.data.helptip.currency=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // Network tour\n .then(function(next){\n if (!next) return false;\n return $scope.startNetworkTour(0, true)\n .then(function(endIndex){\n if (!endIndex || $scope.cancelled) return false;\n csSettings.data.helptip.network=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // Settings tour (if readonly mode)\n .then(function(next){\n if (!next) return false;\n if (!csConfig.readonly) return true; // Skip if NOT readonly\n return $scope.startSettingsTour(0, true);\n })\n\n // Finish tour\n .then(function(next){\n if (!next) return false;\n return $scope.finishTour();\n });\n };\n\n /**\n * Features tour on currency\n * @returns {*}\n */\n $scope.startCurrencyTour = function(startIndex, hasNext) {\n\n var showWotTabIfNeed = function() {\n if ($state.is('app.currency.tab_parameters')) {\n $state.go('app.currency.tab_wot');\n }\n };\n\n var contentParams;\n\n var steps = [\n\n function(){\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-currency', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_CURRENCY',\n icon: {\n position: UIUtils.screen.isSmall() || csConfig.readonly ? 'left' : 'bottom-left'\n }\n }\n });\n },\n\n function () {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n return $state.go(UIUtils.screen.isSmall() ? 'app.currency' : 'app.currency_lg')\n .then(function () {\n return $scope.showHelpTip('helptip-currency-mass-member', {\n bindings: {\n content: 'HELP.TIP.CURRENCY_MASS',\n icon: {\n position: 'center'\n }\n }\n });\n });\n },\n\n function () {\n if (!csSettings.data.useRelative) return true; //skip but continue\n return $scope.showHelpTip('helptip-currency-mass-member-unit', {\n bindings: {\n content: 'HELP.TIP.CURRENCY_UNIT_RELATIVE',\n contentParams: contentParams,\n icon: {\n position: UIUtils.screen.isSmall() ? 'right' : 'center'\n }\n }\n });\n },\n\n // function () {\n // if (!csSettings.data.useRelative) return true; //skip but continue\n // $anchorScroll('helptip-currency-change-unit');\n // return $scope.showHelpTip('helptip-currency-change-unit', {\n // bindings: {\n // content: 'HELP.TIP.CURRENCY_CHANGE_UNIT',\n // contentParams: contentParams,\n // icon: {\n // position: UIUtils.screen.isSmall() ? 'right' : undefined\n // }\n // }\n // });\n // },\n //\n // function () {\n // if (csSettings.data.useRelative) return true; //skip but continue\n // $anchorScroll('helptip-currency-change-unit');\n // return $scope.showHelpTip('helptip-currency-change-unit', {\n // bindings: {\n // content: 'HELP.TIP.CURRENCY_CHANGE_UNIT_TO_RELATIVE',\n // contentParams: contentParams,\n // icon: {\n // position: UIUtils.screen.isSmall() ? 'right' : undefined\n // }\n // }\n // });\n // },\n\n function () {\n $anchorScroll('helptip-currency-rules-anchor');\n return $scope.showHelpTip('helptip-currency-rules', {\n bindings: {\n content: 'HELP.TIP.CURRENCY_RULES',\n icon: {\n position: 'center',\n glyph: 'ion-information-circled'\n }\n }\n });\n },\n\n function () {\n showWotTabIfNeed();\n $anchorScroll('helptip-currency-newcomers-anchor');\n return $scope.showHelpTip('helptip-currency-newcomers', {\n bindings: {\n content: 'HELP.TIP.CURRENCY_WOT',\n icon: {\n position: 'center'\n },\n hasNext: hasNext\n },\n timeout: 1200, // need for Firefox\n retry: 2\n });\n }\n ];\n\n // Get currency parameters, with currentUD\n return csCurrency.get().then(function(currency) {\n contentParams = currency.parameters;\n // Launch steps\n return $scope.executeStep('currency', steps, startIndex);\n });\n };\n\n /**\n * Features tour on network\n * @returns {*}\n */\n $scope.startNetworkTour = function(startIndex, hasNext) {\n\n var showNetworkTabIfNeed = function() {\n if ($state.is('app.currency')) {\n // Select the second tabs\n $timeout(function () {\n var tabs = $window.document.querySelectorAll('ion-tabs .tabs a');\n if (tabs && tabs.length === 3) {\n angular.element(tabs[2]).triggerHandler('click');\n }\n }, 100);\n }\n };\n\n var contentParams;\n\n var steps = [\n\n function(){\n if (UIUtils.screen.isSmall()) return true; // skip but continue\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-network', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_NETWORK',\n icon: {\n position: UIUtils.screen.isSmall() || csConfig.readonly ? 'left' : 'bottom-left'\n }\n }\n });\n },\n\n function () {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n return $state.go(UIUtils.screen.isSmall() ? 'app.currency.tab_network' : 'app.network')\n .then(function () {\n showNetworkTabIfNeed();\n return $scope.showHelpTip('helptip-network-peers', {\n bindings: {\n content: 'HELP.TIP.NETWORK_BLOCKCHAIN',\n icon: {\n position: 'center',\n glyph: 'ion-information-circled'\n }\n },\n timeout: 1200 // need for Firefox\n });\n });\n },\n\n function() {\n showNetworkTabIfNeed();\n return $scope.showHelpTip('helptip-network-peer-0', {\n bindings: {\n content: 'HELP.TIP.NETWORK_PEERS',\n icon: {\n position: UIUtils.screen.isSmall() ? undefined : 'center'\n }\n },\n timeout: 1000,\n retry: 20\n });\n },\n\n\n function() {\n showNetworkTabIfNeed();\n return $scope.showHelpTip('helptip-network-peer-0-block', {\n bindings: {\n content: 'HELP.TIP.NETWORK_PEERS_BLOCK_NUMBER',\n icon: {\n position: UIUtils.screen.isSmall() ? undefined : 'center'\n }\n }\n });\n },\n\n function() {\n showNetworkTabIfNeed();\n var locale = csSettings.data.locale.id;\n return $scope.showHelpTip('helptip-network-peers', {\n bindings: {\n content: 'HELP.TIP.NETWORK_PEERS_PARTICIPATE',\n contentParams: {\n installDocUrl: (csConfig.helptip && csConfig.helptip.installDocUrl) ?\n (csConfig.helptip.installDocUrl[locale] ? csConfig.helptip.installDocUrl[locale] : csConfig.helptip.installDocUrl) :\n 'http://duniter.org'\n },\n icon: {\n position: 'center',\n glyph: 'ion-information-circled'\n },\n hasNext: hasNext\n }\n });\n }\n ];\n\n // Get currency parameters, with currentUD\n return csCurrency.parameters().then(function(parameters) {\n contentParams = parameters;\n // Launch steps\n return $scope.executeStep('network', steps, startIndex);\n });\n };\n\n /**\n * Features tour on WOT lookup\n * @returns {*}\n */\n $scope.startWotLookupTour = function(startIndex, hasNext) {\n\n var steps = [\n function() {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-wot', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_WOT',\n icon: {\n position: UIUtils.screen.isSmall() || csConfig.readonly ? 'left' : 'bottom-left'\n }\n },\n onError: 'continue'\n });\n },\n\n function() {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n return $state.go(UIUtils.screen.isSmall() ? 'app.wot_lookup.tab_search' : 'app.wot_lookup_lg')\n .then(function(){\n return $scope.showHelpTip('helptip-wot-search-text', {\n bindings: {\n content: UIUtils.screen.isSmall() ? 'HELP.TIP.WOT_SEARCH_TEXT_XS' : 'HELP.TIP.WOT_SEARCH_TEXT',\n icon: {\n position: 'center'\n }\n }\n });\n });\n },\n\n function() {\n return $scope.showHelpTip('helptip-wot-search-result-0', {\n bindings: {\n content: 'HELP.TIP.WOT_SEARCH_RESULT',\n icon: {\n position: 'center'\n }\n },\n timeout: 700,\n retry: 15\n });\n },\n\n function() {\n var element = $window.document.getElementById('helptip-wot-search-result-0');\n if (!element) return true;\n $timeout(function() {\n angular.element(element).triggerHandler('click');\n });\n return $scope.showHelpTip('helptip-wot-view-certifications', {\n bindings: {\n content: 'HELP.TIP.WOT_VIEW_CERTIFICATIONS',\n hasNext: hasNext\n },\n timeout: 2500\n });\n }\n ];\n\n // Launch steps\n return $scope.executeStep('wotLookup', steps, startIndex);\n };\n\n /**\n * Features tour on WOT identity\n * @returns {*}\n */\n $scope.startWotTour = function(startIndex, hasNext) {\n var contentParams;\n\n var steps = [\n function() {\n return $scope.showHelpTip('helptip-wot-view-certifications', {\n bindings: {\n content: 'HELP.TIP.WOT_VIEW_CERTIFICATIONS_COUNT',\n contentParams: contentParams,\n icon: {\n position: 'center',\n glyph: 'ion-information-circled'\n }\n }\n });\n },\n\n function() {\n return $scope.showHelpTip('helptip-wot-view-certifications-count', {\n bindings: {\n content: 'HELP.TIP.WOT_VIEW_CERTIFICATIONS_CLICK',\n icon: {\n position: 'center'\n },\n hasNext: hasNext\n }\n });\n }\n ];\n\n // Get currency parameters, with currentUD\n return csCurrency.get().then(function(currency) {\n contentParams = currency.parameters;\n contentParams.currentUD = currency.currentUD;\n // Launch steps\n return $scope.executeStep('wot', steps, startIndex);\n });\n };\n\n /**\n * Features tour on wot certifications\n * @returns {*}\n */\n $scope.startWotCertTour = function(startIndex, hasNext) {\n if (csConfig.readonly) return $q.when(true);\n\n var steps = [\n\n function() {\n // If on identity: click on certifications\n if ($state.is('app.wot_identity')) {\n var element = $window.document.getElementById('helptip-wot-view-certifications');\n if (!element) return true;\n $timeout(function() {\n angular.element(element).triggerHandler('click');\n });\n }\n return $scope.showHelpTip(UIUtils.screen.isSmall() ? 'fab-certify': 'helptip-certs-certify', {\n bindings: {\n content: 'HELP.TIP.WOT_VIEW_CERTIFY',\n icon: {\n position: UIUtils.screen.isSmall() ? 'bottom-right' : 'center'\n }\n },\n timeout: UIUtils.screen.isSmall() ? 2000 : 1000,\n retry: 10\n });\n },\n\n function() {\n return $scope.showHelpTip(UIUtils.screen.isSmall() ? 'fab-certify': 'helptip-certs-certify', {\n bindings: {\n content: 'HELP.TIP.CERTIFY_RULES',\n icon: {\n position: 'center',\n glyph: 'ion-alert-circled'\n },\n hasNext: hasNext\n }\n });\n }\n ];\n\n return $scope.executeStep('certs', steps, startIndex);\n };\n\n /**\n * Features tour on wallet (if not login)\n * @returns {*}\n */\n $scope.startWalletNoLoginTour = function(startIndex, hasNext) {\n if (csWallet.isLogin()) return $q.when(true); // skip if login\n\n var steps = [\n function () {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-account', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_ACCOUNT',\n icon: {\n position: 'left'\n },\n hasNext: hasNext\n }\n });\n },\n\n function () {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-tx', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_TX',\n icon: {\n position: 'left'\n },\n hasNext: hasNext\n }\n });\n },\n\n function () {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-wallets', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_WALLETS',\n icon: {\n position: 'left'\n },\n hasNext: hasNext\n }\n });\n }\n ];\n\n return $scope.executeStep('wallet-no-login', steps, startIndex);\n };\n\n /**\n * Features tour on wallet screens\n * @returns {*}\n */\n $scope.startWalletTour = function(startIndex, hasNext) {\n if (!csWallet.isLogin()) return $q.when(true); // skip if not login\n\n var hasCertificationsItem = csWallet.data.isMember||(csWallet.data.requirements && csWallet.data.requirements.pendingMembership);\n var contentParams;\n\n var steps = [\n function () {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-account', {\n bindings: {\n content: csWallet.data.isMember ? 'HELP.TIP.MENU_BTN_ACCOUNT_MEMBER' : 'HELP.TIP.MENU_BTN_ACCOUNT',\n icon: {\n position: 'left'\n }\n }\n });\n },\n\n function () {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n\n // Go to wallet\n return $state.go('app.view_wallet')\n .then(function () {\n return $scope.showHelpTip(UIUtils.screen.isSmall() ? 'helptip-wallet-options-xs' : 'helptip-wallet-options', {\n bindings: {\n content: 'HELP.TIP.WALLET_OPTIONS',\n icon: {\n position: UIUtils.screen.isSmall() ? 'right' : 'center'\n }\n },\n timeout: UIUtils.screen.isSmall() ? 2000 : 1000,\n retry: 10\n });\n });\n },\n\n // Wallet pubkey\n function () {\n $anchorScroll('helptip-wallet-pubkey');\n return $scope.showHelpTip('helptip-wallet-pubkey', {\n bindings: {\n content: 'HELP.TIP.WALLET_PUBKEY',\n icon: {\n position: 'center'\n },\n hasNext: !hasCertificationsItem && hasNext\n },\n timeout: UIUtils.screen.isSmall() ? 2000 : 500,\n retry: 10\n });\n },\n\n function () {\n if (!hasCertificationsItem) return hasNext;\n $anchorScroll('helptip-wallet-certifications');\n return $scope.showHelpTip('helptip-wallet-certifications', {\n bindings: {\n content: UIUtils.screen.isSmall() ? 'HELP.TIP.WALLET_RECEIVED_CERTIFICATIONS': 'HELP.TIP.WALLET_CERTIFICATIONS',\n icon: {\n position: 'center'\n },\n hasNext: hasNext\n },\n timeout: 500,\n onError: 'continue' // if simple wallet: no certification item, so continue\n });\n }\n ];\n\n // Check that constants are well configured\n if (steps.length != csHelpConstants.wallet.stepCount) {\n console.error(\"[help] Invalid value of 'csHelpConstants.wallet.stepCount'. Please update to {0}\".format(steps.length));\n }\n\n // Get currency parameters, with currentUD\n return csCurrency.get()\n .then(function(currency) {\n contentParams = currency.parameters;\n contentParams.currentUD = currency.currentUD;\n // Launch steps\n return $scope.executeStep('wallet', steps, startIndex);\n });\n };\n\n /**\n * Features tour on wallet certifications\n * @returns {*}\n */\n $scope.startWalletCertTour = function(startIndex, hasNext) {\n if (!csWallet.isLogin()) return $q.when(true);\n\n var contentParams;\n var skipAll = false;\n\n var steps = [\n\n function() {\n // If on wallet : click on certifications\n if ($state.is('app.view_wallet')) {\n var element = $window.document.getElementById('helptip-wallet-certifications');\n if (!element) {\n skipAll = true;\n return true;\n }\n $timeout(function() {\n angular.element(element).triggerHandler('click');\n });\n }\n if (!UIUtils.screen.isSmall()) return true; // skip this helptip if not in tabs mode\n return $scope.showHelpTip('helptip-received-certs', {\n bindings: {\n content: 'HELP.TIP.WALLET_RECEIVED_CERTS'\n }\n });\n },\n\n function() {\n if (skipAll || !UIUtils.screen.isSmall()) return true;\n return $state.go('app.view_wallet') // go back to wallet (small device only)\n .then(function() {\n return $scope.showHelpTip('helptip-wallet-given-certifications', {\n bindings: {\n content: 'HELP.TIP.WALLET_GIVEN_CERTIFICATIONS',\n icon: {\n position: 'center'\n }\n },\n timeout: 500\n });\n });\n },\n\n function() {\n if (skipAll) return true;\n\n // Click on given cert link (small device only)\n if ($state.is('app.view_wallet')) {\n var element = $window.document.getElementById('helptip-wallet-given-certifications');\n if (!element) {\n skipAll = true;\n return true;\n }\n $timeout(function() {\n angular.element(element).triggerHandler('click');\n }, 500);\n }\n return $scope.showHelpTip(UIUtils.screen.isSmall() ? 'fab-select-certify': 'helptip-certs-select-certify', {\n bindings: {\n content: 'HELP.TIP.WALLET_CERTIFY',\n icon: {\n position: UIUtils.screen.isSmall() ? 'bottom-right' : 'center'\n }\n },\n timeout: UIUtils.screen.isSmall() ? 2000 : 500,\n retry: 10\n });\n },\n\n function() {\n if ($scope.tour || skipAll) return hasNext; // skip Rules if features tour (already display)\n return $scope.showHelpTip('helptip-certs-stock', {\n bindings: {\n content: 'HELP.TIP.CERTIFY_RULES',\n icon: {\n position: 'center',\n glyph: 'ion-alert-circled'\n },\n hasNext: hasNext\n }\n });\n }\n\n /* FIXME : how to select the left tab ?\n ,function() {\n return $scope.showHelpTip('helptip-certs-stock', {\n bindings: {\n content: 'HELP.TIP.WALLET_CERT_STOCK',\n contentParams: contentParams,\n icon: {\n position: 'center'\n },\n hasNext: hasNext\n }\n });\n }*/\n ];\n\n return csCurrency.parameters().then(function(parameters) {\n contentParams = parameters;\n return $scope.executeStep('certs', steps, startIndex);\n });\n };\n\n /**\n * Features tour on TX screen\n * @returns {*}\n */\n $scope.startTxTour = function(startIndex, hasNext) {\n if (!csWallet.isLogin()) return $q.when(true); // skip if not login\n\n var contentParams;\n\n var steps = [\n function () {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-tx', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_TX',\n icon: {\n position: 'left'\n }\n }\n });\n },\n\n function () {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n\n // Go to wallet\n return $state.go('app.view_wallet_tx')\n .then(function () {\n return $scope.showHelpTip('helptip-wallet-balance', {\n bindings: {\n content: csSettings.data.useRelative ? 'HELP.TIP.WALLET_BALANCE_RELATIVE' : 'HELP.TIP.WALLET_BALANCE',\n contentParams: contentParams,\n icon: {\n position: 'center'\n }\n },\n retry: 20 // 10 * 500 = 5s max\n });\n });\n },\n\n function () {\n return $scope.showHelpTip('helptip-wallet-balance', {\n bindings: {\n content: 'HELP.TIP.WALLET_BALANCE_CHANGE_UNIT',\n contentParams: contentParams,\n icon: {\n position: 'center',\n glyph: 'ion-information-circled'\n }\n }\n });\n }\n ];\n\n // Get currency parameters, with currentUD\n return csCurrency.get()\n .then(function(currency) {\n contentParams = currency.parameters;\n contentParams.currentUD = currency.currentUD;\n // Launch steps\n return $scope.executeStep('tx', steps, startIndex);\n });\n };\n\n /**\n * Features tour on My wallets\n * @returns {*}\n */\n $scope.startWalletsTour = function(startIndex, hasNext) {\n\n var steps = [\n function () {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-wallets', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_WALLETS',\n icon: {\n position: 'left'\n },\n hasNext: hasNext\n }\n });\n }\n ];\n\n return $scope.executeStep('my-wallets', steps, startIndex);\n };\n\n /**\n * header tour\n * @returns {*}\n */\n $scope.startHeaderTour = function(startIndex, hasNext) {\n if (UIUtils.screen.isSmall() || csConfig.readonly) return $q.when(true);\n\n function _getProfilBtnElement() {\n var elements = $window.document.querySelectorAll('#helptip-header-bar-btn-profile');\n if (!elements || !elements.length) return null;\n return _.find(elements, function(el) {return el.offsetWidth > 0;});\n }\n\n var steps = [\n function () {\n\n if (UIUtils.screen.isSmall()) return true; // skip for small screen\n var element = _getProfilBtnElement();\n if (!element) return true;\n\n return $scope.showHelpTip(element, {\n bindings: {\n content: 'HELP.TIP.HEADER_BAR_BTN_PROFILE',\n icon: {\n position: 'right',\n // If home; add offset because of locales button\n style: $state.is('app.home') ? 'margin-right: 60px' : undefined\n }\n }\n });\n },\n\n function () {\n // small screens\n if (UIUtils.screen.isSmall()) {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-settings', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_SETTINGS',\n icon: {\n position: 'left'\n },\n hasNext: hasNext\n },\n timeout: 1000\n });\n }\n // wide screens\n else {\n var element = _getProfilBtnElement();\n if (!element) return true;\n $timeout(function() {\n angular.element(element).triggerHandler('click');\n });\n return $scope.showHelpTip('helptip-popover-profile-btn-settings', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_SETTINGS',\n icon: {\n position: 'center'\n },\n hasNext: hasNext\n },\n timeout: 1000\n })\n .then(function(res) {\n // close profile popover\n $scope.closeProfilePopover();\n return res;\n });\n }\n }\n ];\n\n return $scope.executeStep('header', steps, startIndex);\n };\n\n /**\n * Settings tour\n * @returns {*}\n */\n $scope.startSettingsTour = function(startIndex, hasNext) {\n var contentParams;\n var steps = [\n\n function () {\n if (!UIUtils.screen.isSmall() && !csConfig.readonly) return true;\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip(UIUtils.screen.isSmall() ? 'helptip-menu-btn-settings' : 'menu-btn-settings', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_SETTINGS',\n icon: {\n position: UIUtils.screen.isSmall() ? 'left' : 'bottom-left'\n }\n },\n timeout: 1000\n });\n },\n\n function () {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n\n // Go to settings\n return $state.go('app.settings')\n .then(function () {\n return $scope.showHelpTip('helptip-settings-btn-unit-relative', {\n bindings: {\n content: 'HELP.TIP.SETTINGS_CHANGE_UNIT',\n contentParams: contentParams,\n icon: UIUtils.screen.isSmall() ? {\n position: 'right',\n style: 'margin-right: 60px'\n } : {position: 'center'},\n hasNext: hasNext\n },\n timeout: 1000\n });\n });\n }\n ];\n\n return csCurrency.parameters()\n .then(function(parameters) {\n contentParams = parameters;\n return $scope.executeStep('settings', steps, startIndex);\n });\n };\n\n\n /**\n * Finish the features tour (last step)\n * @returns {*}\n */\n $scope.finishTour = function() {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n\n // If login: redirect to wallet\n if (csWallet.isLogin()) {\n return $state.go('app.view_wallet')\n .then(function(){\n return $scope.showHelpTip('helptip-wallet-pubkey', {\n bindings: {\n content: 'HELP.TIP.END_LOGIN',\n hasNext: false\n },\n timeout: 1200\n });\n });\n }\n\n // If not login: redirect to home\n else {\n var contentParams;\n return $q.all([\n $scope.showHome(),\n\n csCurrency.parameters()\n .then(function(parameters) {\n contentParams = parameters;\n })\n ])\n .then(function(){\n return $scope.showHelpTip('helptip-home-logo', {\n bindings: {\n content: !csConfig.readonly ? 'HELP.TIP.END_NOT_LOGIN' : 'HELP.TIP.END_READONLY',\n contentParams: contentParams,\n hasNext: false\n }\n });\n });\n }\n };\n}\n\n/* ----------------------------\n * Help tour (auto start from home page)\n * ---------------------------- */\nfunction HelpTourController($scope) {\n\n $scope.$on('$ionicView.enter', function(e, state) {\n $scope.startHelpTour();\n });\n\n}\n","\nangular.module('cesium.platform', ['ngIdle', 'cesium.config', 'cesium.services'])\n\n // Translation i18n\n .config(['$translateProvider', 'csConfig', function ($translateProvider, csConfig) {\n 'ngInject';\n\n $translateProvider\n .uniformLanguageTag('bcp47')\n .determinePreferredLanguage()\n // Cela fait bugger les placeholder (pb d'affichage des accents en FR)\n //.useSanitizeValueStrategy('sanitize')\n .useSanitizeValueStrategy(null)\n .fallbackLanguage([csConfig.fallbackLanguage ? csConfig.fallbackLanguage : 'en'])\n .useLoaderCache(true);\n }])\n\n .config(['$httpProvider', 'csConfig', function($httpProvider, csConfig) {\n 'ngInject';\n\n // Set default timeout\n $httpProvider.defaults.timeout = !!csConfig.timeout ? csConfig.timeout : 300000 /* default timeout */;\n\n //Enable cross domain calls\n $httpProvider.defaults.useXDomain = true;\n\n //Remove the header used to identify ajax call that would prevent CORS from working\n delete $httpProvider.defaults.headers.common['X-Requested-With'];\n\n }])\n\n .config(['$compileProvider', 'csConfig', function($compileProvider, csConfig) {\n 'ngInject';\n\n $compileProvider.debugInfoEnabled(csConfig.debug === true);\n\n // Fix issue #893\n // See https://stackoverflow.com/questions/31859257/firefox-addon-using-angularjs-ng-src-not-working\n $compileProvider.imgSrcSanitizationWhitelist(/^\\s*(filesystem:resource|resource|moz-extension|chrome-extension|file|data):/);\n }])\n\n .config(['$animateProvider', function($animateProvider) {\n 'ngInject';\n\n $animateProvider.classNameFilter( /\\banimate-/ );\n }])\n\n // Configure cache (used by HTTP requests) default options\n .config(['CacheFactoryProvider', 'csConfig', function (CacheFactoryProvider, csConfig) {\n 'ngInject';\n\n angular.extend(CacheFactoryProvider.defaults, {\n // Fixed options:\n recycleFreq: 60 * 1000, // Scan expired items every 1min\n storagePrefix: 'caches.', // Override storage key prefix\n capacity: 100, // Force to use a LRU cache, to avoid size exceed max\n\n // Options overwritten by the csCache service:\n maxAge: csConfig.cacheTimeMs || 60 * 1000, // from config if exists, or 1min\n storageMode: 'memory' // Do NOT use local Storage by default\n });\n }])\n\n // Configure screen size detection\n .config(['screenmatchConfigProvider', function(screenmatchConfigProvider) {\n 'ngInject';\n\n screenmatchConfigProvider.config.rules = 'bootstrap';\n }])\n\n .config(['$ionicConfigProvider', function($ionicConfigProvider) {\n 'ngInject';\n\n // JS scrolling need for iOs (see http://blog.ionic.io/native-scrolling-in-ionic-a-tale-in-rhyme/)\n var enableJsScrolling = ionic.Platform.isIOS();\n $ionicConfigProvider.scrolling.jsScrolling(enableJsScrolling);\n\n // Configure the view cache\n $ionicConfigProvider.views.maxCache(5);\n }])\n\n .config(['IdleProvider', 'csConfig', function(IdleProvider, csConfig) {\n 'ngInject';\n\n IdleProvider.idle(csConfig.logoutIdle||10*60/*10min*/);\n IdleProvider.timeout(csConfig.logoutTimeout||15); // display warning during 15s\n }])\n\n .factory('$exceptionHandler', ['$log', function($log) {\n 'ngInject';\n\n return function(exception, cause) {\n if (cause) $log.error(exception, cause);\n else $log.error(exception);\n };\n }])\n\n\n .factory('csPlatform', ['ionicReady', '$rootScope', '$q', '$state', '$translate', '$timeout', 'UIUtils', 'BMA', 'Device', 'csHttp', 'csConfig', 'csCache', 'csSettings', 'csCurrency', 'csWallet', function (ionicReady, $rootScope, $q, $state, $translate, $timeout, UIUtils,\n BMA, Device, csHttp, csConfig, csCache, csSettings, csCurrency, csWallet) {\n\n 'ngInject';\n var\n fallbackNodeIndex = 0,\n defaultSettingsNode,\n started = false,\n startPromise,\n listeners,\n removeChangeStateListener;\n\n // Fix csConfig values\n csConfig.demo = csConfig.demo === true || csConfig.demo === 'true' || false;\n csConfig.readonly = csConfig.readonly === true || csConfig.readonly === 'true' || false;\n\n function disableChangeState() {\n if (removeChangeStateListener) return; // make sure to call this once\n\n var remove = $rootScope.$on('$stateChangeStart', function (event, next, nextParams, fromState) {\n if (!event.defaultPrevented && next.name !== 'app.home' && next.name !== 'app.settings') {\n event.preventDefault();\n if (startPromise) {\n startPromise.then(function() {\n $state.go(next.name, nextParams);\n });\n }\n else {\n UIUtils.loading.hide();\n }\n }\n });\n\n // store remove listener function\n removeChangeStateListener = remove;\n }\n\n function enableChangeState() {\n if (removeChangeStateListener) removeChangeStateListener();\n removeChangeStateListener = null;\n }\n\n // Alert user if node not reached - fix issue #\n function checkBmaNodeAlive(alive) {\n if (alive) return true;\n\n // Remember the default node\n defaultSettingsNode = defaultSettingsNode || csSettings.data.node;\n\n var fallbackNode = csSettings.data.fallbackNodes && fallbackNodeIndex < csSettings.data.fallbackNodes.length && csSettings.data.fallbackNodes[fallbackNodeIndex++];\n if (!fallbackNode) {\n throw 'ERROR.CHECK_NETWORK_CONNECTION';\n }\n var newServer = fallbackNode.host + ((!fallbackNode.port && fallbackNode.port != 80 && fallbackNode.port != 443) ? (':' + fallbackNode.port) : '');\n\n // Skip is same as actual node\n if (BMA.node.same(fallbackNode)) {\n console.debug('[platform] Skipping fallback node [{0}]: same as actual node'.format(newServer));\n return checkBmaNodeAlive(); // loop (= go to next node)\n }\n\n // Try to get summary\n return csHttp.get(fallbackNode.host, fallbackNode.port, '/node/summary', fallbackNode.port==443 || BMA.node.forceUseSsl)()\n .catch(function(err) {\n console.error('[platform] Could not reach fallback node [{0}]: skipping'.format(newServer));\n // silent, but return no result (will loop to the next fallback node)\n })\n .then(function(res) {\n if (!res) return checkBmaNodeAlive(); // Loop\n\n // Force to show port/ssl, if this is the only difference\n var messageParam = {old: BMA.server, new: newServer};\n if (messageParam.old === messageParam.new) {\n if (BMA.port != fallbackNode.port) {\n messageParam.new += ':' + fallbackNode.port;\n }\n else if (BMA.useSsl == false && (fallbackNode.useSsl || fallbackNode.port==443)) {\n messageParam.new += ' (SSL)';\n }\n }\n\n return $translate('CONFIRM.USE_FALLBACK_NODE', messageParam)\n .then(function(msg) {\n return UIUtils.alert.confirm(msg);\n })\n .then(function (confirm) {\n if (!confirm) return;\n\n // Only change BMA node in settings\n csSettings.data.node = fallbackNode;\n\n // Add a marker, for UI\n csSettings.data.node.temporary = true;\n\n csHttp.cache.clear();\n\n // loop\n return BMA.copy(fallbackNode)\n .then(checkBmaNodeAlive);\n });\n });\n }\n\n function isStarted() {\n return started;\n }\n\n function getLatestRelease() {\n var latestRelease = csSettings.data.latestReleaseUrl && csHttp.uri.parse(csSettings.data.latestReleaseUrl);\n if (latestRelease) {\n return csHttp.getWithCache(latestRelease.host, latestRelease.protocol === 'https:' ? 443 : latestRelease.port, \"/\" + latestRelease.pathname, undefined, csCache.constants.LONG)()\n .then(function (json) {\n if (json && json.name && json.tag_name && json.html_url) {\n return {\n version: json.name,\n url: json.html_url,\n isNewer: (csHttp.version.compare(csConfig.version, json.name) < 0)\n };\n }\n })\n .catch(function(err) {\n // silent (just log it)\n console.error('[platform] Failed to get Cesium latest version', err);\n })\n ;\n }\n return $q.when();\n }\n\n function addListeners() {\n listeners = [\n // Listen if node changed\n BMA.api.node.on.restart($rootScope, restart, this)\n ];\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function ready() {\n if (started) return $q.when();\n return startPromise || start();\n }\n\n function restart() {\n console.debug('[platform] restarting csPlatform');\n return stop()\n .then(function () {\n return $timeout(start, 200);\n });\n }\n\n function start() {\n\n // Avoid change state\n disableChangeState();\n\n // We use 'ionicReady()' instead of '$ionicPlatform.ready()', because this one is callable many times\n startPromise = ionicReady()\n\n .then($q.all([\n // Load device\n Device.ready(),\n\n // Start settings\n csSettings.ready()\n ]))\n\n // Load BMA\n .then(function(){\n return BMA.ready().then(checkBmaNodeAlive);\n })\n\n // Load currency\n .then(csCurrency.ready)\n\n // Trying to restore wallet\n .then(csWallet.ready)\n\n .then(function(){\n enableChangeState();\n addListeners();\n startPromise = null;\n started = true;\n })\n .catch(function(err) {\n startPromise = null;\n started = false;\n if($state.current.name !== $rootScope.errorState) {\n $state.go($rootScope.errorState, {error: 'peer'});\n }\n throw err;\n });\n\n return startPromise;\n }\n\n function stop() {\n if (!started) return $q.when();\n removeListeners();\n\n csWallet.stop();\n csCurrency.stop();\n BMA.stop();\n\n return $timeout(function() {\n enableChangeState();\n started = false;\n startPromise = null;\n }, 500);\n }\n\n return {\n disableChangeState: disableChangeState,\n isStarted: isStarted,\n ready: ready,\n restart: restart,\n start: start,\n stop: stop,\n version: {\n latest: getLatestRelease\n }\n };\n }])\n\n .run(['$rootScope', '$state', '$window', '$urlRouter', 'ionicReady', '$ionicPlatform', '$ionicHistory', 'Device', 'UIUtils', '$ionicConfig', 'PluginService', 'csPlatform', 'csWallet', 'csSettings', 'csConfig', 'csCurrency', function($rootScope, $state, $window, $urlRouter, ionicReady, $ionicPlatform, $ionicHistory,\n Device, UIUtils, $ionicConfig, PluginService, csPlatform, csWallet, csSettings, csConfig, csCurrency) {\n 'ngInject';\n\n // Allow access to service data, from HTML templates\n $rootScope.config = csConfig;\n $rootScope.settings = csSettings.data;\n $rootScope.currency = csCurrency.data;\n $rootScope.device = Device;\n $rootScope.errorState = 'app.home';\n $rootScope.smallscreen = UIUtils.screen.isSmall();\n\n // Compute the root path\n var hashIndex = $window.location.href.indexOf('#');\n $rootScope.rootPath = (hashIndex !== -1) ? $window.location.href.substr(0, hashIndex) : $window.location.href;\n console.debug('[app] Root path is [' + $rootScope.rootPath + ']');\n\n // removeIf(device)\n // -- Automatic redirection to HTTPS\n if ((csConfig.httpsMode === true || csConfig.httpsMode == 'true' ||csConfig.httpsMode === 'force') &&\n $window.location.protocol !== 'https:') {\n $rootScope.$on('$stateChangeStart', function (event, next, nextParams, fromState) {\n var path = 'https' + $rootScope.rootPath.substr(4) + $state.href(next, nextParams);\n if (csConfig.httpsModeDebug) {\n console.debug('[app] [httpsMode] --- Should redirect to: ' + path);\n // continue\n }\n else {\n $window.location.href = path;\n }\n });\n }\n // endRemoveIf(device)\n\n // We use 'ionicReady()' instead of '$ionicPlatform.ready()', because this one is callable many times\n ionicReady().then(function() {\n\n // Keyboard\n if (Device.keyboard.enable) {\n // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard\n // for form inputs)\n Device.keyboard.hideKeyboardAccessoryBar(true);\n\n // iOS: do not push header up when opening keyboard\n // (see http://ionicframework.com/docs/api/page/keyboard/)\n if (ionic.Platform.isIOS()) {\n Device.keyboard.disableScroll(true);\n }\n }\n\n // Ionic Platform Grade is not A, disabling views transitions\n if (ionic.Platform.grade.toLowerCase() !== 'a') {\n console.info('[app] Disabling UI effects, because plateform\\'s grade is [' + ionic.Platform.grade + ']');\n UIUtils.setEffects(false);\n }\n\n // Status bar style\n if (window.StatusBar) {\n console.debug(\"[app] Status bar plugin enable\");\n }\n\n // Get latest release\n csPlatform.version.latest()\n .then(function(release) {\n if (release && release.isNewer) {\n console.info('[app] New release detected [{0}]'.format(release.version));\n $rootScope.newRelease = release;\n }\n else {\n console.info('[app] Current version [{0}] is the latest release'.format(csConfig.version));\n }\n });\n\n // Prevent BACK button to exit without confirmation\n $ionicPlatform.registerBackButtonAction(function(event) {\n if ($ionicHistory.backView()) {\n return $ionicHistory.goBack();\n }\n event.preventDefault();\n return UIUtils.alert.confirm('CONFIRM.EXIT_APP')\n .then(function (confirm) {\n if (!confirm) return; // user cancelled\n ionic.Platform.exitApp();\n });\n }, 100);\n\n // Make sure platform is started\n return csPlatform.ready();\n });\n }])\n;\n\n// Workaround to add \"\".startsWith() if not present\nif (typeof String.prototype.startsWith !== 'function') {\n console.debug(\"Adding String.prototype.startsWith() -> was missing on this platform\");\n String.prototype.startsWith = function(prefix, position) {\n return this.indexOf(prefix, position) === 0;\n };\n}\n\n// Workaround to add \"\".startsWith() if not present\nif (typeof String.prototype.trim !== 'function') {\n console.debug(\"Adding String.prototype.trim() -> was missing on this platform\");\n // Make sure we trim BOM and NBSP\n var rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n String.prototype.trim = function() {\n return this.replace(rtrim, '');\n };\n}\n\n// Workaround to add Math.trunc() if not present - fix #144\nif (Math && typeof Math.trunc !== 'function') {\n console.debug(\"Adding Math.trunc() -> was missing on this platform\");\n Math.trunc = function(number) {\n return parseInt((number - 0.5).toFixed());\n };\n}\n\n// Workaround to add \"\".format() if not present\nif (typeof String.prototype.format !== 'function') {\n console.debug(\"Adding String.prototype.format() -> was missing on this platform\");\n String.prototype.format = function() {\n var args = arguments;\n return this.replace(/{(\\d+)}/g, function(match, number) {\n return typeof args[number] != 'undefined' ? args[number] : match;\n });\n };\n}\n","\nangular.module('cesium.settings.services', ['ngApi', 'cesium.config'])\n\n.factory('csSettings', ['$rootScope', '$q', '$window', 'Api', 'localStorage', '$translate', 'csConfig', function($rootScope, $q, $window, Api, localStorage, $translate, csConfig) {\n 'ngInject';\n\n // Define app locales\n var locales = [\n {id:'en', label:'English', flag: 'us'},\n {id:'en-GB', label:'English (UK)', flag: 'gb'},\n {id:'eo-EO', label:'Esperanto', flag: 'eo'},\n {id:'fr-FR', label:'Français', flag: 'fr'},\n {id:'nl-NL', label:'Nederlands', flag: 'nl'},\n {id:'es-ES', label:'Spanish', flag: 'es'},\n {id:'it-IT', label:'Italiano', flag: 'it'}\n ];\n var fallbackLocale = csConfig.fallbackLanguage ? fixLocale(csConfig.fallbackLanguage) : 'en';\n\n // Convert browser locale to app locale (fix #140)\n function fixLocale (locale) {\n if (!locale) return fallbackLocale;\n\n // exists in app locales: use it\n if (_.findWhere(locales, {id: locale})) return locale;\n\n // not exists: reiterate with the root (e.g. 'fr-XX' -> 'fr')\n var localeParts = locale.split('-');\n if (localeParts.length > 1) {\n return fixLocale(localeParts[0]);\n }\n\n // If another locale exists with the same root: use it\n var similarLocale = _.find(locales, function(l) {\n return String.prototype.startsWith.call(l.id, locale);\n });\n if (similarLocale) return similarLocale.id;\n\n return fallbackLocale;\n }\n\n // Convert browser locale to app locale (fix #140)\n function fixLocaleWithLog (locale) {\n var fixedLocale = fixLocale(locale);\n if (locale !== fixedLocale) {\n console.debug('[settings] Fix locale [{0}] -> [{1}]'.format(locale, fixedLocale));\n }\n return fixedLocale;\n }\n\n var\n constants = {\n STORAGE_KEY: 'settings', // for version >= v1.1.0\n KEEP_AUTH_IDLE_SESSION: 9999\n },\n // Settings that user cannot change himself (only config can override this values)\n fixedSettings = {\n timeout : 4000,\n cacheTimeMs: 60000, /*1 min*/\n timeWarningExpireMembership: 2592000 * 2 /*=2 mois*/,\n timeWarningExpire: 2592000 * 3 /*=3 mois*/,\n minVersion: '1.1.0',\n sourceUrl: 'https://git.duniter.org/clients/cesium-grp/cesium',\n sourceLicenseUrl: 'https://git.duniter.org/clients/cesium-grp/cesium/-/raw/master/LICENSE',\n newIssueUrl: \"https://git.duniter.org/clients/cesium-grp/cesium/issues/new\",\n userForumUrl: \"https://forum.monnaie-libre.fr\",\n latestReleaseUrl: \"https://api.github.com/repos/duniter/cesium/releases/latest\",\n duniterLatestReleaseUrl: \"https://api.github.com/repos/duniter/duniter/releases/latest\",\n httpsMode: false\n },\n defaultSettings = angular.merge({\n useRelative: false,\n useLocalStorage: !!$window.localStorage, // override to false if no device\n useLocalStorageEncryption: false,\n persistCache: false, // disable by default (waiting resolution of issue #885)\n walletHistoryTimeSecond: 30 * 24 * 60 * 60 /*30 days*/,\n walletHistorySliceSecond: 5 * 24 * 60 * 60 /*download using 5 days slice*/,\n walletHistoryAutoRefresh: true, // override to false if device\n rememberMe: true,\n keepAuthIdle: 10 * 60,\n showUDHistory: true,\n expertMode: false,\n decimalCount: 4,\n uiEffects: true,\n blockValidityWindow: 6,\n helptip: {\n enable: true,\n installDocUrl: \"https://duniter.org/en/wiki/duniter/install/\",\n currency: 0,\n network: 0,\n wotLookup: 0,\n wot: 0,\n wotCerts: 0,\n wallet: 0,\n walletCerts: 0,\n wallets: 0,\n header: 0,\n settings: 0\n },\n currency: {\n allRules: false,\n allWotRules: false\n },\n wallet: {\n showPubkey: true,\n alertIfUnusedWallet: true\n },\n locale: {\n id: fixLocaleWithLog(csConfig.defaultLanguage || $translate.use()) // use config locale if set, or browser default\n },\n license: {\n \"en\": \"license/license_g1-en\",\n \"fr-FR\": \"license/license_g1-fr-FR\",\n \"es-ES\": \"license/license_g1-es-ES\"\n }\n },\n fixedSettings,\n csConfig),\n\n data = {},\n previousData,\n started = false,\n startPromise,\n api = new Api(this, \"csSettings\");\n\n var\n reset = function() {\n _.keys(data).forEach(function(key){\n delete data[key];\n });\n\n applyData(defaultSettings);\n\n return api.data.raisePromise.reset(data)\n .then(store);\n },\n\n getByPath = function(path, defaultValue) {\n var obj = data;\n _.each(path.split('.'), function(key) {\n obj = obj[key];\n if (angular.isUndefined(obj)) {\n obj = defaultValue;\n return; // stop\n }\n });\n\n return obj;\n },\n\n emitChangedEvent = function() {\n var hasChanged = angular.isUndefined(previousData) || !angular.equals(previousData, data);\n if (hasChanged) {\n previousData = angular.copy(data);\n return api.data.raise.changed(data);\n }\n },\n\n store = function() {\n if (!started) {\n console.debug('[setting] Waiting start finished...');\n return (startPromise || start()).then(store);\n }\n\n var promise;\n if (data.useLocalStorage) {\n // When node is temporary (fallback node): keep previous node address - issue #476\n if (data.node.temporary === true) {\n promise = localStorage.getObject(constants.STORAGE_KEY)\n .then(function(previousSettings) {\n var savedData = angular.copy(data);\n savedData.node = previousSettings && previousSettings.node || {};\n delete savedData.temporary; // never store temporary flag\n return localStorage.setObject(constants.STORAGE_KEY, savedData);\n });\n }\n else {\n promise = localStorage.setObject(constants.STORAGE_KEY, data);\n }\n }\n else {\n promise = localStorage.setObject(constants.STORAGE_KEY, null);\n }\n\n return promise\n .then(function() {\n if (data.useLocalStorage) {\n console.debug('[setting] Saved locally');\n }\n\n // Emit event on store\n return api.data.raisePromise.store(data);\n })\n\n // Emit event on store\n .then(emitChangedEvent);\n },\n\n /**\n * Apply new settings (can be partial)\n * @param newData\n */\n applyData = function(newData) {\n if (!newData) return; // skip empty\n\n var localeChanged = false;\n if (newData.locale && newData.locale.id) {\n // Fix previously stored locale (could use bad format)\n var localeId = fixLocale(newData.locale.id);\n newData.locale = _.findWhere(locales, {id: localeId});\n localeChanged = !data.locale || newData.locale.id !== data.locale.id || newData.locale.id !== $translate.use();\n }\n\n // Force some fixed settings, before merging\n _.keys(fixedSettings).forEach(function(key) {\n newData[key] = defaultSettings[key]; // This will apply fixed value (override by config.js file)\n });\n\n // Apply new settings\n angular.merge(data, newData);\n\n // Delete temporary properties, if false\n if (newData && newData.node && !newData.node.temporary || !data.node.temporary) delete data.node.temporary;\n\n // Apply the new locale (only if need)\n // will produce an event cached by onLocaleChange();\n if (localeChanged) {\n $translate.use(data.locale.id);\n }\n\n },\n\n restore = function() {\n var now = Date.now();\n\n return localStorage.getObject(constants.STORAGE_KEY)\n .then(function(storedData) {\n // No settings stored\n if (!storedData) {\n console.debug(\"[settings] No settings in local storage. Using defaults.\");\n applyData(defaultSettings);\n emitChangedEvent();\n return;\n }\n\n // Apply stored data\n applyData(storedData);\n\n console.debug('[settings] Loaded from local storage in '+(Date.now()-now)+'ms');\n emitChangedEvent();\n });\n },\n\n getLicenseUrl = function() {\n var locale = data.locale && data.locale.id || csConfig.defaultLanguage || 'en';\n return (csConfig.license) ?\n (csConfig.license[locale] ? csConfig.license[locale] : defaultSettings.license[csConfig.defaultLanguage || 'en'] || csConfig.license) : undefined;\n },\n\n getFeedUrl = function() {\n var locale = data.locale && data.locale.id || csConfig.defaultLanguage || 'en';\n return (csConfig.feed && csConfig.feed.jsonFeed) ?\n (csConfig.feed.jsonFeed[locale] ? csConfig.feed.jsonFeed[locale] : defaultSettings.feed.jsonFeed[csConfig.defaultLanguage || 'en'] || csConfig.feed) : undefined;\n },\n\n // Detect locale successful changes, then apply to vendor libs\n onLocaleChange = function() {\n var locale = $translate.use();\n console.debug('[settings] Locale ['+locale+']');\n\n // config moment lib\n try {\n moment.locale(locale.toLowerCase());\n }\n catch(err) {\n try {\n moment.locale(locale.substr(0,2));\n }\n catch(err) {\n moment.locale('en-gb');\n console.warn('[settings] Unknown local for moment lib. Using default [en]');\n }\n }\n\n // config numeral lib\n try {\n numeral.language(locale.toLowerCase());\n }\n catch(err) {\n try {\n numeral.language(locale.substring(0, 2));\n }\n catch(err) {\n numeral.language('en-gb');\n console.warn('[settings] Unknown local for numeral lib. Using default [en]');\n }\n }\n\n // Emit event\n api.locale.raise.changed(locale);\n },\n\n isStarted = function() {\n return started;\n },\n\n ready = function() {\n if (started) return $q.when();\n return startPromise || start();\n },\n\n start = function() {\n console.debug('[settings] Starting...');\n\n startPromise = localStorage.ready()\n\n // Restore\n .then(restore)\n\n // Emit ready event\n .then(function() {\n console.debug('[settings] Started');\n started = true;\n startPromise = null;\n // Emit event (used by plugins)\n api.data.raise.ready(data);\n });\n\n return startPromise;\n };\n\n $rootScope.$on('$translateChangeSuccess', onLocaleChange);\n\n api.registerEvent('data', 'reset');\n api.registerEvent('data', 'changed');\n api.registerEvent('data', 'store');\n api.registerEvent('data', 'ready');\n api.registerEvent('locale', 'changed');\n\n // Apply default settings. This is required on some browser (web or mobile - see #361)\n applyData(defaultSettings);\n\n // Default action\n //start();\n\n return {\n isStarted: isStarted,\n ready: ready,\n start: start,\n data: data,\n apply: applyData,\n getByPath: getByPath,\n reset: reset,\n store: store,\n restore: restore,\n getLicenseUrl: getLicenseUrl,\n getFeedUrl: getFeedUrl,\n defaultSettings: defaultSettings,\n // api extension\n api: api,\n locales: locales,\n constants: constants\n };\n}]);\n","\nangular.module('cesium.network.services', ['ngApi', 'cesium.currency.services', 'cesium.http.services'])\n\n.factory('csNetwork', ['$rootScope', '$q', '$interval', '$timeout', '$window', 'csConfig', 'BMA', 'csHttp', 'csCurrency', 'Api', function($rootScope, $q, $interval, $timeout, $window, csConfig, BMA, csHttp, csCurrency, Api) {\n 'ngInject';\n\n var\n interval,\n constants = {\n UNKNOWN_BUID: -1,\n MAX_BLOCK_OFFSET: 1000\n },\n isHttpsMode = $window.location.protocol === 'https:',\n api = new Api(this, \"csNetwork\"),\n\n data = {\n bma: null,\n listeners: [],\n loading: true,\n peers: [],\n filter: {\n member: true,\n mirror: true,\n endpoint: null,\n online: false,\n bma: false,\n ssl: undefined,\n tor: undefined\n },\n sort:{\n type: null,\n asc: true,\n compact: true\n },\n groupBy: 'pubkey',\n expertMode: false,\n knownBlocks: [],\n mainBlock: null,\n minOnlineBlockNumber: 0,\n uidsByPubkeys: null,\n searchingPeersOnNetwork: false,\n difficulties: null,\n ws2pHeads: null,\n timeout: csConfig.timeout\n },\n\n // Return the block uid\n buid = function(block) {\n return block && [block.number, block.hash].join('-');\n },\n\n resetData = function() {\n data.bma = null;\n data.listeners = [];\n data.peers.splice(0);\n data.filter = {\n member: true,\n mirror: true,\n endpoint: null,\n online: true,\n bma: false,\n ssl: undefined,\n tor: undefined\n };\n data.sort = {\n type: null,\n asc: true\n };\n data.groupBy = 'pubkey';\n data.expertMode = false;\n data.memberPeersCount = 0;\n data.knownBlocks = [];\n data.mainBlock = null;\n data.minOnlineBlockNumber = 0;\n data.uidsByPubkeys = {};\n data.loading = true;\n data.searchingPeersOnNetwork = false;\n data.difficulties = null;\n data.ws2pHeads = null;\n data.timeout = csConfig.timeout;\n },\n\n hasPeers = function() {\n return data.peers && data.peers.length > 0;\n },\n\n getPeers = function() {\n return data.peers;\n },\n\n isBusy = function() {\n return data.loading;\n },\n\n getKnownBlocks = function() {\n return data.knownBlocks;\n },\n\n // Load WS2P heads\n loadW2spHeads = function() {\n return data.bma.network.ws2p.heads()\n .then(function (res) {\n data.ws2pHeads = res.heads ? res.heads.reduce(function (res, hit) {\n if (hit.message && hit.sig) {\n try {\n var head = new Ws2pMessage(hit.message);\n res[[head.pubkey, head.ws2pid].join('-')] = head;\n }\n catch(err) {\n // just log, then ignore\n console.error('[network] Ignoring WS2P head.', err && err.message || err);\n }\n }\n return res;\n }, {}) : {};\n })\n .catch(function(err) {\n // When too many request, retry in 3s\n if (err && err.ucode == BMA.errorCodes.HTTP_LIMITATION) {\n return $timeout(function() {\n return loadW2spHeads();\n }, 3000);\n }\n console.error(err); // can occur on duniter v1.6\n data.ws2pHeads = {};\n });\n },\n\n // Load personal difficulties\n loadDifficulties = function() {\n return data.bma.blockchain.stats.difficulties()\n .then(function (res) {\n data.difficulties = res.levels ? res.levels.reduce(function (res, hit) {\n if (hit.uid && hit.level) res[hit.uid] = hit.level;\n return res;\n }, {}) : {};\n })\n .catch(function(err) {\n // When too many request, retry in 3s\n if (err && err.ucode == BMA.errorCodes.HTTP_LIMITATION) {\n return $timeout(function() {\n return loadDifficulties();\n }, 3000);\n }\n console.error(err);\n data.difficulties = {};\n });\n },\n\n loadPeers = function() {\n data.peers = [];\n data.searchingPeersOnNetwork = true;\n data.loading = true;\n data.bma = data.bma || BMA;\n var newPeers = [];\n\n if (interval) {\n $interval.cancel(interval);\n }\n\n interval = $interval(function() {\n // not same job instance\n if (newPeers.length) {\n flushNewPeersAndSort(newPeers);\n }\n else if (data.loading && !data.searchingPeersOnNetwork) {\n data.loading = false;\n $interval.cancel(interval);\n // The peer lookup end, we can make a clean final report\n sortPeers(true/*update main buid*/);\n\n console.debug('[network] Finish: {0} peers found.'.format(data.peers.length));\n }\n }, 1000);\n\n var initJobs = [\n // Load uids\n data.bma.wot.member.uids()\n .then(function(uids) {\n data.uidsByPubkeys = uids;\n })\n .catch(function(err) {\n console.error(err);\n data.uidsByPubkeys = {};\n }),\n\n // Load WS2P heads\n loadW2spHeads()\n ];\n\n // Get difficulties (expert mode only)\n if (data.expertMode) {\n initJobs.push(loadDifficulties());\n }\n\n return $q.all(initJobs)\n .then(function() {\n return data.bma && data.bma.network.peers();\n })\n .then(function(res){\n if (!res || !res.peers || !res.peers.length) return;\n\n // If filter online peers\n if (data.filter.online) {\n var jobs = [];\n _.forEach(res.peers, function(json) {\n // Exclude, if not UP or on a too old block\n if (json.status !== 'UP') return;\n json.blockNumber = json.block && parseInt(json.block.split('-')[0]);\n if (json.blockNumber && json.blockNumber < data.minOnlineBlockNumber) {\n console.debug(\"[network] Exclude a too old peer document, on pubkey {0}\".format(json.pubkey.substring(0,6)));\n return;\n }\n\n jobs.push(addOrRefreshPeerFromJson(json, newPeers));\n\n // Mark WS2P\n _.forEach(json.endpoints||[], function(ep) {\n if (ep.startsWith('WS2P')) {\n var key = json.pubkey + '-' + ep.split(' ')[1];\n if (data.ws2pHeads[key]) {\n data.ws2pHeads[key].hasEndpoint = true;\n }\n }\n });\n });\n\n // Add private WS2P endpoints\n var privateWs2pHeads = _.values(data.ws2pHeads);\n if (privateWs2pHeads && privateWs2pHeads.length) {\n var privateEPCount = 0;\n //console.debug(\"[http] Found WS2P endpoints without endpoint:\", data.ws2pHeads);\n _.forEach(privateWs2pHeads, function(head) {\n\n if (!head.hasEndPoint) {\n var currentNumber = head.buid && parseInt(head.buid.split('-')[0]);\n // Exclude if on a too old block\n if (currentNumber && currentNumber < data.minOnlineBlockNumber) {\n console.debug(\"[network] Exclude a too old WS2P message, on pubkey {0}\".format(head.pubkey.substring(0,6)));\n return;\n }\n\n var peer = new Peer({\n buid: head.buid,\n currentNumber: currentNumber,\n pubkey: head.pubkey,\n version: head.version,\n powPrefix: head.powPrefix,\n online: true,\n uid: data.uidsByPubkeys[head.pubkey],\n bma: {\n useWs2p: true,\n private: true,\n ws2pid: head.ws2pid\n },\n endpoints: [\n // fake endpoint\n 'WS2P ' + head.ws2pid\n ]\n });\n peer.id = peer.keyID();\n if (peer.uid && data.expertMode && data.difficulties) {\n peer.difficulty = data.difficulties[peer.uid];\n }\n if (applyPeerFilter(peer)) {\n newPeers.push(peer);\n privateEPCount++;\n }\n }\n });\n\n if (privateEPCount) {\n console.debug(\"[http] Found {0} WS2P endpoints without endpoint (private ?)\".format(privateEPCount));\n }\n }\n\n if (jobs.length) return $q.all(jobs);\n }\n\n // If filter offline peers\n else {\n return $q.all(_(res && res.peers || []).reduce(function(res, json) {\n return res.concat(addOrRefreshPeerFromJson(json, newPeers));\n }, []));\n }\n })\n .then(function(){\n data.searchingPeersOnNetwork = false;\n })\n .catch(function(err){\n console.error(err);\n data.searchingPeersOnNetwork = false;\n });\n },\n\n /**\n * Apply filter on a peer. (peer uid should have been filled BEFORE)\n */\n applyPeerFilter = function(peer) {\n // no filter\n if (!data.filter) return true;\n\n // Filter member and mirror\n if ((data.filter.member && !data.filter.mirror && !peer.uid) ||\n (data.filter.mirror && !data.filter.member && peer.uid)) {\n return false;\n }\n\n // Filter on endpoint\n if (data.filter.endpoint && !peer.hasEndpoint(data.filter.endpoint)) {\n return false;\n }\n\n // Filter on status\n if ((data.filter.online && peer.status !== 'UP' && peer.oldBlock) || (!data.filter.online && peer.status === 'UP' && !peer.oldBlock)) {\n return false;\n }\n\n // Filter on bma\n if (angular.isDefined(data.filter.bma) && peer.isBma() != data.filter.bma) {\n return false;\n }\n\n // Filter on ws2p\n if (angular.isDefined(data.filter.ws2p) && peer.isWs2p() != data.filter.ws2p) {\n return false;\n }\n\n // Filter on ssl\n if (angular.isDefined(data.filter.ssl) && peer.isSsl() != data.filter.ssl) {\n return false;\n }\n\n // Filter on tor\n if (angular.isDefined(data.filter.tor) && peer.isTor() != data.filter.tor) {\n return false;\n }\n\n return true;\n },\n\n addOrRefreshPeerFromJson = function(json, list) {\n list = list || data.newPeers;\n\n // Analyze the peer document, and exclude using the online filter\n json.blockNumber = json.block && parseInt(json.block.split('-')[0]);\n json.oldBlock = (json.status === 'UP' && json.blockNumber && json.blockNumber < data.minOnlineBlockNumber);\n\n var peers = createPeerEntities(json);\n var hasUpdates = false;\n\n var jobs = peers.reduce(function(jobs, peer) {\n var existingPeer = _.findWhere(data.peers, {id: peer.id});\n var existingMainBuid = existingPeer ? existingPeer.buid : null;\n var existingOnline = existingPeer ? existingPeer.online : false;\n\n return jobs.concat(\n refreshPeer(peer)\n .then(function (refreshedPeer) {\n if (existingPeer) {\n // remove existing peers, when reject or offline\n if (!refreshedPeer || (refreshedPeer.online !== data.filter.online && data.filter.online !== 'all')) {\n var existingIndex = data.peers.indexOf(existingPeer);\n if (existingIndex !== -1) {\n console.debug('[network] Peer [{0}] removed (cause: {1})'.format(peer.server, !refreshedPeer ? 'filtered' : (refreshedPeer.online ? 'UP' : 'DOWN')));\n data.peers.splice(existingIndex, 1);\n hasUpdates = true;\n }\n }\n else if (refreshedPeer.buid !== existingMainBuid){\n console.debug('[network] {0} endpoint [{1}] new current block'.format(\n refreshedPeer.bma && (refreshedPeer.bma.useBma ? 'BMA' : 'WS2P') || 'null',\n refreshedPeer.server));\n hasUpdates = true;\n }\n else if (existingOnline !== refreshedPeer.online){\n console.debug('[network] {0} endpoint [{1}] is now {2}'.format(\n refreshedPeer.bma && (refreshedPeer.bma.useBma ? 'BMA' : 'WS2P') || 'null',\n refreshedPeer.server,\n refreshedPeer.online ? 'UP' : 'DOWN'));\n hasUpdates = true;\n }\n else {\n console.debug(\"[network] {0} endpoint [{1}] unchanged\".format(\n refreshedPeer.bma && (refreshedPeer.bma.useBma ? 'BMA' : 'WS2P') || 'null',\n refreshedPeer.server));\n }\n }\n else if (refreshedPeer && (refreshedPeer.online === data.filter.online || data.filter.online === 'all')) {\n console.debug(\"[network] {0} endpoint [{1}] is {2}\".format(\n refreshedPeer.bma && (refreshedPeer.bma.useBma ? 'BMA' : 'WS2P') || 'null',\n refreshedPeer.server,\n refreshedPeer.online ? 'UP' : 'DOWN'\n ));\n list.push(refreshedPeer);\n hasUpdates = true;\n }\n })\n );\n }, []);\n return (jobs.length === 1 ? jobs[0] : $q.all(jobs))\n .then(function() {\n return hasUpdates;\n });\n },\n\n createPeerEntities = function(json, ep) {\n if (!json) return [];\n var peer = new Peer(json);\n\n // Read bma endpoints\n if (!ep) {\n var endpointsAsString = peer.getEndpoints();\n if (!endpointsAsString) return []; // no BMA\n\n var endpoints = endpointsAsString.reduce(function (res, epStr) {\n var ep = BMA.node.parseEndPoint(epStr);\n return ep ? res.concat(ep) : res;\n }, []);\n\n // recursive call, on each endpoint\n if (endpoints.length > 1) {\n return endpoints.reduce(function (res, ep) {\n return res.concat(createPeerEntities(json, ep));\n }, []);\n }\n else {\n // if only one endpoint: use it and continue\n ep = endpoints[0];\n }\n }\n peer.bma = ep;\n peer.server = peer.getServer();\n peer.dns = peer.getDns();\n peer.buid = peer.buid || peer.block;\n peer.blockNumber = peer.buid && parseInt(peer.buid.split('-')[0]);\n peer.uid = peer.pubkey && data.uidsByPubkeys[peer.pubkey];\n peer.id = peer.keyID();\n return [peer];\n },\n\n refreshPeer = function(peer) {\n\n // Apply filter\n if (!applyPeerFilter(peer)) return $q.when();\n\n if (!data.filter.online || (!data.filter.online && peer.status === 'DOWN') || !peer.getHost() /*fix #537*/) {\n peer.online = false;\n return $q.when(peer);\n }\n\n if (peer.bma.useWs2p && data.ws2pHeads) {\n var ws2pHeadKey = [peer.pubkey, peer.bma.ws2pid].join('-');\n var head = data.ws2pHeads[ws2pHeadKey];\n delete data.ws2pHeads[ws2pHeadKey];\n if (head) {\n peer.buid = head.buid;\n peer.currentNumber=head.buid && parseInt(head.buid.split('-')[0]);\n peer.version = head.version;\n peer.powPrefix = head.powPrefix;\n }\n peer.online = !!peer.buid;\n\n if (peer.uid && data.expertMode && data.difficulties) {\n peer.difficulty = data.difficulties[peer.uid];\n }\n\n return $q.when(peer);\n }\n\n // Cesium running in SSL: Do not try to access not SSL node,\n if (!peer.bma.useWs2p && isHttpsMode && !peer.bma.useSsl) {\n peer.online = (peer.status === 'UP');\n peer.buid = constants.UNKNOWN_BUID;\n delete peer.version;\n\n if (peer.uid && data.expertMode && data.difficulties) {\n peer.difficulty = data.difficulties[peer.uid];\n }\n\n return $q.when(peer);\n }\n\n // Do not try to access TOR or WS2P endpoints\n if (peer.bma.useTor || peer.bma.useWs2p) {\n peer.online = (peer.status === 'UP');\n peer.buid = constants.UNKNOWN_BUID;\n delete peer.version;\n\n if (peer.uid && data.expertMode && data.difficulties) {\n peer.difficulty = data.difficulties[peer.uid];\n }\n return $q.when(peer);\n }\n\n peer.api = peer.api || BMA.lightInstance(peer.getHost(), peer.getPort(), peer.isSsl(), data.timeout);\n\n // Get current block\n return peer.api.blockchain.current(false/*no cache*/)\n .then(function(block) {\n if (!block) throw new Error('Wrong response for /blockchain/current (empty)');\n peer.currentNumber = block.number;\n peer.online = true;\n peer.buid = buid(block);\n peer.medianTime = block.medianTime;\n if (data.knownBlocks.indexOf(peer.buid) === -1) {\n data.knownBlocks.push(peer.buid);\n }\n return peer;\n })\n .catch(function(err) {\n // Special case for currency init (root block not exists): use fixed values\n if (err && err.ucode == BMA.errorCodes.NO_CURRENT_BLOCK) {\n peer.online = true;\n peer.buid = buid({number:0, hash: BMA.constants.ROOT_BLOCK_HASH});\n peer.difficulty = 0;\n return peer;\n }\n if (!peer.secondTry) {\n var bma = peer.bma || peer.getBMA();\n if (bma.dns && peer.server.indexOf(bma.dns) === -1) {\n // try again, using DNS instead of IPv4 / IPV6\n peer.secondTry = true;\n peer.api = BMA.lightInstance(bma.dns, bma.port, bma.useSsl);\n return refreshPeer(peer); // recursive call\n }\n }\n\n peer.buid = null;\n peer.blockNumber = null;\n peer.currentNumber = null;\n peer.online=false;\n peer.uid = data.uidsByPubkeys[peer.pubkey];\n return peer;\n })\n .then(function(peer) {\n // Exit if offline, or not expert mode or too small device\n if (!data.filter.online || !peer || !peer.online || !data.expertMode) return peer;\n var jobs = [];\n\n // Get hardship (only for a member peer)\n if (peer.uid) {\n jobs.push(peer.api.blockchain.stats.hardship({pubkey: peer.pubkey})\n .then(function (res) {\n peer.difficulty = res ? res.level : null;\n })\n .catch(function() {\n peer.difficulty = null; // continue\n }));\n }\n\n // Get Version\n jobs.push(peer.api.node.summary()\n .then(function(res){\n peer.software = res && res.duniter && res.duniter.software || undefined;\n peer.version = res && res.duniter && res.duniter.version || '?';\n })\n .catch(function() {\n peer.software = undefined;\n peer.version = '?'; // continue\n }));\n\n return $q.all(jobs)\n .then(function(){\n return peer;\n });\n });\n },\n\n flushNewPeersAndSort = function(newPeers, updateMainBuid) {\n newPeers = newPeers || data.newPeers;\n if (!newPeers.length) return;\n var ids = _.map(data.peers, function(peer){\n return peer.id;\n });\n var hasUpdates = false;\n var newPeersAdded = 0;\n _.forEach(newPeers.splice(0), function(peer) {\n if (!ids[peer.id]) {\n data.peers.push(peer);\n ids[peer.id] = peer;\n hasUpdates = true;\n newPeersAdded++;\n }\n });\n if (hasUpdates) {\n console.debug('[network] Flushing {0} new peers...'.format(newPeersAdded));\n sortPeers(updateMainBuid);\n }\n },\n\n computeScoreAlphaValue = function(value, nbChars, asc) {\n if (!value) return 0;\n var score = 0;\n value = value.toLowerCase();\n if (nbChars > value.length) {\n nbChars = value.length;\n }\n score += value.charCodeAt(0);\n for (var i=1; i < nbChars; i++) {\n score += Math.pow(0.001, i) * value.charCodeAt(i);\n }\n return asc ? (1000 - score) : score;\n },\n\n sortPeers = function(updateMainBuid) {\n // Construct a map of buid, with peer count and medianTime\n var buids = {};\n data.memberPeersCount = 0;\n _.forEach(data.peers, function(peer){\n if (peer.buid) {\n var buid = buids[peer.buid];\n if (!buid || !buid.medianTime) {\n buid = {\n buid: peer.buid,\n medianTime: peer.medianTime,\n count: 0\n };\n buids[peer.buid] = buid;\n }\n // If not already done, try to fill medianTime (need to compute consensusBlockDelta)\n else if (!buid.medianTime && peer.medianTime) {\n buid.medianTime = peer.medianTime;\n }\n if (buid.buid !== constants.UNKNOWN_BUID) {\n buid.count++;\n }\n }\n data.memberPeersCount += peer.uid ? 1 : 0;\n });\n var mainBlock = data.mainBlock;\n if (data.filter.online) {\n // Compute pct of use, per buid\n _.forEach(_.values(buids), function(buid) {\n buid.pct = buid.count * 100 / data.peers.length;\n });\n mainBlock = _.max(buids, function(obj) {\n return obj.count;\n });\n _.forEach(data.peers, function(peer){\n peer.hasMainConsensusBlock = peer.buid === mainBlock.buid;\n peer.hasConsensusBlock = peer.buid && !peer.hasMainConsensusBlock && buids[peer.buid].count > 1;\n if (peer.hasConsensusBlock) {\n peer.consensusBlockDelta = buids[peer.buid].medianTime - mainBlock.medianTime;\n }\n });\n }\n data.peers = _.uniq(data.peers, false, function(peer) {\n return peer.id;\n });\n data.peers = _.sortBy(data.peers, function(peer) {\n var score = 0;\n if (data.sort.type) {\n score += (data.sort.type === 'uid' ? computeScoreAlphaValue(peer.uid||peer.pubkey, 3, data.sort.asc) : 0);\n score += (data.sort.type === 'api') &&\n ((peer.isWs2p() && (data.sort.asc ? 1 : -1) || 0) +\n (peer.hasEndpoint('ES_USER_API') && (data.sort.asc ? 0.01 : -0.01) || 0) +\n (peer.isSsl() && (data.sort.asc ? 0.75 : -0.75) || 0)) || 0;\n score += (data.sort.type === 'difficulty' ? (peer.difficulty ? (data.sort.asc ? (10000-peer.difficulty) : peer.difficulty): 0) : 0);\n score += (data.sort.type === 'current_block' ? (peer.currentNumber ? (data.sort.asc ? (1000000000 - peer.currentNumber) : peer.currentNumber) : 0) : 0);\n }\n score = (10000000000 * score);\n score += (1000000000 * (peer.online ? 1 : 0));\n score += (100000000 * (peer.hasMainConsensusBlock ? 1 : 0));\n score += (1000000 * (peer.hasConsensusBlock ? buids[peer.buid].pct : 0));\n if (data.expertMode) {\n score += (100 * (peer.difficulty ? (10000-peer.difficulty) : 0));\n score += (1 * (peer.uid ? computeScoreAlphaValue(peer.uid, 2, true) : 0));\n score += (0.001 * (!peer.uid ? computeScoreAlphaValue(peer.pubkey, 3, true) : 0));\n }\n else {\n score += (100 * (peer.uid ? computeScoreAlphaValue(peer.uid, 2, true) : 0));\n score += (0.001 * (!peer.uid ? computeScoreAlphaValue(peer.pubkey, 3, true) : 0));\n }\n score += (0.00001 * (peer.isBma() ? (peer.isSsl() ? 1 : 0.5) :0)); // If many endpoints: BMAS first, then BMA\n\n peer.score = score;\n\n return -score;\n });\n\n if (data.groupBy) {\n var previousPeer;\n data.peers.forEach(function(peer) {\n peer.compacted = (previousPeer && peer[data.groupBy] && peer[data.groupBy] === previousPeer[data.groupBy]);\n previousPeer = peer;\n });\n }\n\n // Raise event on new main block\n if (updateMainBuid && mainBlock && mainBlock.buid && (!data.mainBlock || data.mainBlock.buid !== mainBlock.buid)) {\n data.mainBlock = mainBlock;\n api.data.raise.mainBlockChanged(mainBlock);\n }\n\n // Raise event when changed\n api.data.raise.changed(data); // raise event\n },\n\n removeListeners = function() {\n _.forEach(data.listeners, function(remove){\n remove();\n });\n data.listeners = [];\n },\n\n addListeners = function() {\n data.listeners = [\n\n // Listen for new block\n data.bma.websocket.block().onListener(function(block) {\n if (!block || data.loading) return;\n var buid = [block.number, block.hash].join('-');\n if (data.knownBlocks.indexOf(buid) === -1) {\n console.debug('[network] Receiving block: ' + buid.substring(0, 20));\n data.knownBlocks.push(buid);\n // If first block: do NOT refresh peers (will be done in start() method)\n var skipRefreshPeers = data.knownBlocks.length === 1;\n if (!skipRefreshPeers) {\n data.loading = true;\n // We wait 2s when a new block is received, just to wait for network propagation\n $timeout(function() {\n console.debug('[network] new block received by WS: will refresh peers');\n loadPeers();\n }, 2000, false /*invokeApply*/);\n }\n }\n }),\n\n // Listen for new peer\n data.bma.websocket.peer().onListener(function(json) {\n if (!json || data.loading) return;\n var newPeers = [];\n addOrRefreshPeerFromJson(json, newPeers)\n .then(function(hasUpdates) {\n if (!hasUpdates) return;\n if (newPeers.length>0) {\n flushNewPeersAndSort(newPeers, true);\n }\n else {\n console.debug('[network] [ws] Peers updated received');\n sortPeers(true);\n }\n });\n })\n ];\n },\n\n sort = function(options) {\n options = options || {};\n data.filter = options.filter ? angular.merge(data.filter, options.filter) : data.filter;\n data.sort = options.sort ? angular.merge(data.sort, options.sort) : data.sort;\n sortPeers(false);\n },\n\n start = function(bma, options) {\n options = options || {};\n return BMA.ready()\n .then(function() {\n close();\n\n data.bma = bma || BMA;\n data.filter = options.filter ? angular.merge(data.filter, options.filter) : data.filter;\n data.sort = options.sort ? angular.merge(data.sort, options.sort) : data.sort;\n data.expertMode = angular.isDefined(options.expertMode) ? options.expertMode : data.expertMode;\n data.timeout = angular.isDefined(options.timeout) ? options.timeout : csConfig.timeout;\n\n // Init a min block number\n data.minOnlineBlockNumber = data.mainBlock && data.mainBlock.buid && (parseInt(data.mainBlock.buid.split('-')[0]) - constants.MAX_BLOCK_OFFSET) || undefined;\n if (data.minOnlineBlockNumber === undefined) {\n return csCurrency.blockchain.current(true/*use cache*/)\n .then(function(current) {\n data.minOnlineBlockNumber = current.number - constants.MAX_BLOCK_OFFSET;\n });\n }\n })\n .then(function() {\n console.info('[network] Starting network from [{0}]'.format(bma.server));\n var now = Date.now();\n\n addListeners();\n\n return loadPeers()\n .then(function(peers){\n console.debug('[network] Started in '+(Date.now() - now)+'ms');\n return peers;\n });\n });\n },\n\n close = function() {\n if (data.bma) {\n console.info('[network-service] Stopping...');\n removeListeners();\n resetData();\n }\n },\n\n isStarted = function() {\n return !data.bma;\n },\n\n $q_started = function(callback) {\n if (!isStarted()) { // start first\n return start()\n .then(function() {\n return $q(callback);\n });\n }\n else {\n return $q(callback);\n }\n },\n\n getMainBlockUid = function() {\n return $q_started(function(resolve, reject){\n resolve (data.mainBuid);\n });\n },\n\n // Get peers on the main consensus blocks\n getTrustedPeers = function() {\n return $q_started(function(resolve, reject){\n resolve(data.peers.reduce(function(res, peer){\n return (peer.hasMainConsensusBlock && peer.uid) ? res.concat(peer) : res;\n }, []));\n });\n }\n ;\n\n // Register extension points\n api.registerEvent('data', 'changed');\n api.registerEvent('data', 'mainBlockChanged');\n api.registerEvent('data', 'rollback');\n\n return {\n data: data,\n start: start,\n close: close,\n hasPeers: hasPeers,\n getPeers: getPeers,\n sort: sort,\n getTrustedPeers: getTrustedPeers,\n getKnownBlocks: getKnownBlocks,\n getMainBlockUid: getMainBlockUid,\n loadPeers: loadPeers,\n isBusy: isBusy,\n // api extension\n api: api\n };\n}]);\n","var App, nw;\n\nangular.module('cesium.desktop.services', ['cesium.device.services', 'cesium.settings.services'])\n\n .factory('csDesktop', ['$rootScope', 'Device', function($rootScope, Device) {\n 'ngInject';\n\n if (!Device.isDesktop()) return;\n\n console.info(\"Starting desktop mode...\");\n }]);\n","//var Base58, Base64, scrypt_module_factory = null, nacl_factory = null;\n\nangular.module('cesium.crypto.services', ['cesium.utils.services'])\n\n .factory('CryptoUtils', ['$q', '$timeout', 'ionicReady', function($q, $timeout, ionicReady) {\n 'ngInject';\n\n /**\n * CryptoAbstract, abstract class with useful methods\n * @type {number}\n */\n function CryptoAbstractService() {\n this.loaded = false;\n var that = this;\n\n this.copy = function(source) {\n _.forEach(_.keys(source), function(key) {\n that[key] = source[key];\n });\n };\n\n this.isLoaded = function() {\n return this.loaded;\n };\n\n this.util = this.util || {};\n\n /**\n * Converts an array buffer to a string\n *\n * @private\n * @param {ArrayBuffer} buf The buffer to convert\n * @param {Function} callback The function to call when conversion is complete\n */\n this.util.array_to_string = function(buf, callback) {\n var bb = new Blob([new Uint8Array(buf)]);\n var f = new FileReader();\n f.onload = function(e) {\n callback(e.target.result);\n };\n f.readAsText(bb);\n };\n }\n\n CryptoAbstractService.prototype.constants = {\n crypto_sign_BYTES: 64,\n crypto_secretbox_NONCEBYTES: 24,\n crypto_box_MACBYTES: 16,\n SEED_LENGTH: 32, // Length of the key\n SCRYPT_PARAMS:{\n SIMPLE: {\n N: 2048,\n r: 8,\n p: 1,\n memory: -1 // default\n },\n DEFAULT: {\n N: 4096,\n r: 16,\n p: 1,\n memory: -1 // default\n },\n }\n };\n\n CryptoAbstractService.prototype.async_load_base58 = function(on_ready) {\n var that = this;\n if (Base58 !== null){return on_ready(Base58);}\n else {$timeout(function(){that.async_load_base58(on_ready);}, 100);}\n };\n\n CryptoAbstractService.prototype.async_load_scrypt = function(on_ready, options) {\n var that = this;\n if (scrypt_module_factory !== null){scrypt_module_factory(on_ready, options);}\n else {$timeout(function(){that.async_load_scrypt(on_ready, options);}, 100);}\n };\n\n CryptoAbstractService.prototype.async_load_nacl_js = function(on_ready, options) {\n var that = this;\n if (nacl_factory !== null) {nacl_factory.instantiate(on_ready, options);}\n else {$timeout(function(){that.async_load_nacl_js(on_ready, options);}, 100);}\n };\n\n CryptoAbstractService.prototype.async_load_base64 = function(on_ready) {\n var that = this;\n if (Base64 !== null) {on_ready(Base64);}\n else {$timeout(function(){that.async_load_base64(on_ready);}, 100);}\n };\n\n CryptoAbstractService.prototype.async_load_sha256 = function(on_ready) {\n var that = this;\n if (sha256 !== null){return on_ready(sha256);}\n else {$timeout(function(){that.async_load_sha256(on_ready);}, 100);}\n };\n\n CryptoAbstractService.prototype.seed_from_signSk = function(signSk) {\n var seed = new Uint8Array(this.constants.SEED_LENGTH);\n for (var i = 0; i < seed.length; i++) seed[i] = signSk[i];\n return seed;\n };\n\n // Web crypto API - see https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API\n var crypto = window.crypto || window.msCrypto || window.Crypto;\n if (crypto && crypto.getRandomValues) {\n CryptoAbstractService.prototype.crypto = crypto;\n CryptoAbstractService.prototype.util = {};\n CryptoAbstractService.prototype.util.random_nonce = function() {\n var nonce = new Uint8Array(crypto_secretbox_NONCEBYTES);\n this.crypto.getRandomValues(nonce);\n return $q.when(nonce);\n };\n }\n\n function FullJSServiceFactory() {\n this.id = 'FullJS';\n\n // libraries handlers\n this.scrypt = null;\n this.nacl = null;\n this.base58 = null;\n this.base64 = null;\n var that = this;\n\n this.util = this.util || {};\n this.util.decode_utf8 = function (s) {\n var i, d = unescape(encodeURIComponent(s)), b = new Uint8Array(d.length);\n for (i = 0; i < d.length; i++) b[i] = d.charCodeAt(i);\n return b;\n };\n this.util.encode_utf8 = function (s) {\n return that.nacl.encode_utf8(s);\n };\n this.util.encode_base58 = function (a) { // TODO : move to abstract factory\n return that.base58.encode(a);\n };\n this.util.decode_base58 = function (a) { // TODO : move to abstract factory\n var i;\n var d = that.base58.decode(a);\n var b = new Uint8Array(d.length);\n for (i = 0; i < d.length; i++) b[i] = d[i];\n return b;\n };\n this.util.decode_base64 = function (a) {\n return that.base64.decode(a);\n };\n this.util.encode_base64 = function (b) {\n return that.base64.encode(b);\n };\n\n this.util.hash_sha256 = function (message) {\n return $q(function (resolve) {\n var msg = that.util.decode_utf8(message);\n var hash = that.nacl.to_hex(that.nacl.crypto_hash_sha256(msg));\n resolve(hash.toUpperCase());\n });\n };\n this.util.random_nonce = function () {\n if (that.crypto && that.crypto.getRandomValues) {\n var nonce = new Uint8Array(that.constants.crypto_secretbox_NONCEBYTES);\n that.crypto.getRandomValues(nonce);\n return $q.when(nonce);\n }\n else {\n return $q.when(that.nacl.crypto_box_random_nonce());\n }\n };\n this.util.crypto_hash_sha256 = function(msg_int8) {\n return that.nacl.crypto_hash_sha256(msg_int8);\n };\n this.util.crypto_scrypt = function(password, salt, N, r, p, seedLength) {\n\n return $q(function(resolve, reject) {\n try {\n var seed = that.scrypt.crypto_scrypt(\n password,\n salt,\n N,\n r,\n p,\n seedLength);\n resolve(seed);\n }\n catch(err) {\n reject(err);\n }\n });\n };\n\n /**\n * Compute the box key pair, from a sign key pair\n */\n this.box_keypair_from_sign = function (signKeyPair) {\n if (signKeyPair.boxSk && signKeyPair.boxPk) return $q.when(signKeyPair);\n return $q(function (resolve, reject) {\n try {\n // TODO: waiting for a new version of js-nacl, with missing functions expose\n //resolve(that.nacl.crypto_box_keypair_from_sign_sk(signKeyPair.signSk);\n\n resolve(crypto_box_keypair_from_sign_sk(signKeyPair.signSk));\n }\n catch(err) {\n reject(err);\n }\n });\n };\n\n /**\n * Compute the box public key, from a sign public key\n */\n this.box_pk_from_sign = function (signPk) {\n return $q(function(resolve, reject) {\n try {\n // TODO: waiting for a new version of js-nacl, with missing functions expose\n //resolve(that.nacl.crypto_box_pk_from_sign_pk(signPk));\n\n resolve(crypto_box_pk_from_sign_pk(signPk));\n }\n catch(err) {\n reject(err);\n }\n });\n };\n\n this.box_sk_from_sign = function (signSk) {\n return $q(function(resolve, reject) {\n try {\n // TODO: waiting for a new version of js-nacl, with missing functions expose\n //resolve(that.nacl.crypto_box_sk_from_sign_sk(signSk));\n resolve(crypto_box_sk_from_sign_sk(signSk));\n }\n catch(err) {\n reject(err);\n }\n });\n };\n\n /**\n * Encrypt a message, from a key pair\n */\n this.box = function(message, nonce, recipientPk, senderSk) {\n return $q(function (resolve, reject) {\n if (!message) {\n resolve(message);\n return;\n }\n var messageBin = that.nacl.encode_utf8(message);\n if (typeof recipientPk === \"string\") {\n recipientPk = that.util.decode_base58(recipientPk);\n }\n\n try {\n var ciphertextBin = that.nacl.crypto_box(messageBin, nonce, recipientPk, senderSk);\n var ciphertext = that.util.encode_base64(ciphertextBin);\n resolve(ciphertext);\n }\n catch (err) {\n reject(err);\n }\n });\n };\n\n /**\n * Decrypt a message, from a key pair\n */\n this.box_open = function (cypherText, nonce, senderPk, recipientSk) {\n return $q(function (resolve, reject) {\n if (!cypherText) {\n resolve(cypherText);\n return;\n }\n\n var ciphertextBin = that.util.decode_base64(cypherText);\n if (typeof senderPk === \"string\") {\n senderPk = that.util.decode_base58(senderPk);\n }\n\n try {\n var message = that.nacl.crypto_box_open(ciphertextBin, nonce, senderPk, recipientSk);\n resolve(that.nacl.decode_utf8(message));\n }\n catch (err) {\n reject(err);\n }\n\n });\n };\n\n /**\n * Create key pairs (sign and box), from salt+password (Scrypt auth)\n */\n this.scryptKeypair = function(salt, password, scryptParams) {\n return that.util.crypto_scrypt(\n that.util.encode_utf8(password),\n that.util.encode_utf8(salt),\n scryptParams && scryptParams.N || that.constants.SCRYPT_PARAMS.DEFAULT.N,\n scryptParams && scryptParams.r || that.constants.SCRYPT_PARAMS.DEFAULT.r,\n scryptParams && scryptParams.p || that.constants.SCRYPT_PARAMS.DEFAULT.p,\n that.constants.SEED_LENGTH)\n .then(function(seed){\n var signKeypair = that.nacl.crypto_sign_seed_keypair(seed);\n var boxKeypair = that.nacl.crypto_box_seed_keypair(seed);\n return {\n signPk: signKeypair.signPk,\n signSk: signKeypair.signSk,\n boxPk: boxKeypair.boxPk,\n boxSk: boxKeypair.boxSk\n };\n });\n };\n\n /**\n * Create key pairs from a seed\n */\n this.seedKeypair = function(seed) {\n return $q(function(resolve, reject) {\n var signKeypair = that.nacl.crypto_sign_seed_keypair(seed);\n var boxKeypair = that.nacl.crypto_box_seed_keypair(seed);\n resolve({\n signPk: signKeypair.signPk,\n signSk: signKeypair.signSk,\n boxPk: boxKeypair.boxPk,\n boxSk: boxKeypair.boxSk\n });\n });\n };\n\n /**\n * Get sign pk from salt+password (scrypt auth)\n */\n this.scryptSignPk = function(salt, password, scryptParams) {\n return $q(function(resolve, reject) {\n try {\n var seed = that.scrypt.crypto_scrypt(\n that.util.encode_utf8(password),\n that.util.encode_utf8(salt),\n scryptParams && scryptParams.N || that.constants.SCRYPT_PARAMS.DEFAULT.N,\n scryptParams && scryptParams.r || that.constants.SCRYPT_PARAMS.DEFAULT.r,\n scryptParams && scryptParams.p || that.constants.SCRYPT_PARAMS.DEFAULT.p,\n that.constants.SEED_LENGTH);\n var signKeypair = that.nacl.crypto_sign_seed_keypair(seed);\n resolve(signKeypair.signPk);\n }\n catch(err) {\n reject(err);\n }\n });\n };\n\n /**\n * Verify a signature of a message, for a pubkey\n */\n this.verify = function (message, signature, pubkey) {\n return $q(function(resolve, reject) {\n var msg = that.util.decode_utf8(message);\n var sig = that.util.decode_base64(signature);\n var pub = that.util.decode_base58(pubkey);\n var sm = new Uint8Array(that.constants.crypto_sign_BYTES + msg.length);\n var i;\n for (i = 0; i < that.constants.crypto_sign_BYTES; i++) sm[i] = sig[i];\n for (i = 0; i < msg.length; i++) sm[i+that.constants.crypto_sign_BYTES] = msg[i];\n\n // Call to verification lib...\n var verified = that.nacl.crypto_sign_open(sm, pub) !== null;\n resolve(verified);\n });\n };\n\n /**\n * Sign a message, from a key pair\n */\n this.sign = function(message, keypair) {\n return $q(function(resolve, reject) {\n var m = that.util.decode_utf8(message);\n var sk = keypair.signSk;\n var signedMsg = that.nacl.crypto_sign(m, sk);\n var sig = new Uint8Array(that.constants.crypto_sign_BYTES);\n for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i];\n var signature = that.base64.encode(sig);\n resolve(signature);\n });\n };\n\n this.load = function() {\n var deferred = $q.defer();\n var naclOptions = {};\n var scryptOptions = {};\n if (ionic.Platform.grade.toLowerCase()!='a') {\n console.info('Reduce NaCl memory to 16mb, because plateform grade is not [a] but [{0}]'.format(ionic.Platform.grade));\n naclOptions.requested_total_memory = 16 * 1048576; // 16 Mo\n }\n var loadedLib = 0;\n var checkAllLibLoaded = function() {\n loadedLib++;\n if (loadedLib === 4) {\n that.loaded = true;\n deferred.resolve();\n }\n };\n this.async_load_nacl_js(function(lib) {\n that.nacl = lib;\n checkAllLibLoaded();\n }, naclOptions);\n this.async_load_scrypt(function(lib) {\n that.scrypt = lib;\n that.scrypt.requested_total_memory = scryptOptions.requested_total_memory;\n checkAllLibLoaded();\n }, scryptOptions);\n this.async_load_base58(function(lib) {\n that.base58 = lib;\n checkAllLibLoaded();\n });\n that.async_load_base64(function(lib) {\n that.base64 = lib;\n checkAllLibLoaded();\n });\n return deferred.promise;\n };\n\n // Shortcuts\n this.util.hash = that.util.hash_sha256;\n this.box = {\n keypair: {\n fromSignKeypair: that.box_keypair_from_sign,\n skFromSignSk: that.box_sk_from_sign,\n pkFromSignPk: that.box_pk_from_sign\n },\n pack: that.box,\n open: that.box_open\n };\n\n /*--\n start WORKAROUND - Publish missing functions (see PR js-nacl: https://github.com/tonyg/js-nacl/pull/54)\n -- */\n\n function crypto_box_keypair_from_sign_sk(sk) {\n var ska = check_injectBytes(\"crypto_box_keypair_from_sign_sk\", \"sk\", sk,\n that.nacl.nacl_raw._crypto_sign_secretkeybytes());\n var skb = new Target(that.nacl.nacl_raw._crypto_box_secretkeybytes());\n check(\"_crypto_sign_ed25519_sk_to_curve25519\",\n that.nacl.nacl_raw._crypto_sign_ed25519_sk_to_curve25519(skb.address, ska));\n FREE(ska);\n return that.nacl.crypto_box_keypair_from_raw_sk(skb.extractBytes());\n }\n\n function crypto_box_pk_from_sign_pk(pk) {\n var pka = check_injectBytes(\"crypto_box_pk_from_sign_pk\", \"pk\", pk,\n that.nacl.nacl_raw._crypto_sign_publickeybytes());\n var pkb = new Target(that.nacl.nacl_raw._crypto_box_publickeybytes());\n check(\"_crypto_sign_ed25519_pk_to_curve25519\",\n that.nacl.nacl_raw._crypto_sign_ed25519_pk_to_curve25519(pkb.address, pka));\n FREE(pka);\n return pkb.extractBytes();\n }\n\n function crypto_box_sk_from_sign_sk(sk) {\n var ska = check_injectBytes(\"crypto_box_sk_from_sign_sk\", \"sk\", sk,\n that.nacl.nacl_raw._crypto_sign_secretkeybytes());\n var skb = new Target(that.nacl.nacl_raw._crypto_box_secretkeybytes());\n check(\"_crypto_sign_ed25519_sk_to_curve25519\",\n that.nacl.nacl_raw._crypto_sign_ed25519_sk_to_curve25519(skb.address, ska));\n FREE(ska);\n return skb.extractBytes();\n }\n\n function check_length(function_name, what, thing, expected_length) {\n if (thing.length !== expected_length) {\n throw {message: \"nacl.\" + function_name + \" expected \" +\n expected_length + \"-byte \" + what + \" but got length \" + thing.length};\n }\n }\n\n function check(function_name, result) {\n if (result !== 0) {\n throw {message: \"nacl_raw.\" + function_name + \" signalled an error\"};\n }\n }\n\n function check_injectBytes(function_name, what, thing, expected_length, leftPadding) {\n check_length(function_name, what, thing, expected_length);\n return injectBytes(thing, leftPadding);\n }\n\n function injectBytes(bs, leftPadding) {\n var p = leftPadding || 0;\n var address = MALLOC(bs.length + p);\n that.nacl.nacl_raw.HEAPU8.set(bs, address + p);\n for (var i = address; i < address + p; i++) {\n that.nacl.nacl_raw.HEAPU8[i] = 0;\n }\n return address;\n }\n\n function MALLOC(nbytes) {\n var result = that.nacl.nacl_raw._malloc(nbytes);\n if (result === 0) {\n throw {message: \"malloc() failed\", nbytes: nbytes};\n }\n return result;\n }\n\n function FREE(pointer) {\n that.nacl.nacl_raw._free(pointer);\n }\n\n function free_all(addresses) {\n for (var i = 0; i < addresses.length; i++) {\n FREE(addresses[i]);\n }\n }\n\n function extractBytes(address, length) {\n var result = new Uint8Array(length);\n result.set(that.nacl.nacl_raw.HEAPU8.subarray(address, address + length));\n return result;\n }\n\n function Target(length) {\n this.length = length;\n this.address = MALLOC(length);\n }\n\n Target.prototype.extractBytes = function (offset) {\n var result = extractBytes(this.address + (offset || 0), this.length - (offset || 0));\n FREE(this.address);\n this.address = null;\n return result;\n };\n\n /*--\n end of WORKAROUND\n -- */\n\n }\n FullJSServiceFactory.prototype = new CryptoAbstractService();\n\n\n /* -----------------------------------------------------------------------------------------------------------------\n * Service that use Cordova MiniSodium plugin\n * ----------------------------------------------------------------------------------------------------------------*/\n\n /***\n * Factory for crypto, using Cordova plugin\n */\n function CordovaServiceFactory() {\n\n this.id = 'MiniSodium';\n\n // libraries handlers\n this.nacl = null; // the cordova plugin\n this.base58= null;\n this.sha256= null;\n var that = this;\n\n // functions\n this.util = this.util || {};\n this.util.decode_utf8 = function(s) {\n return that.nacl.to_string(s);\n };\n this.util.encode_utf8 = function(s) {\n return that.nacl.from_string(s);\n };\n this.util.encode_base58 = function(a) {\n return that.base58.encode(a);\n };\n this.util.decode_base58 = function(a) {\n var i;\n var d = that.base58.decode(a);\n var b = new Uint8Array(d.length);\n for (i = 0; i < d.length; i++) b[i] = d[i];\n return b;\n };\n this.util.decode_base64 = function (a) {\n return that.nacl.from_base64(a);\n };\n this.util.encode_base64 = function (b) {\n return that.nacl.to_base64(b);\n };\n this.util.hash_sha256 = function(message) {\n return $q.when(that.sha256(message).toUpperCase());\n };\n this.util.random_nonce = function() {\n var nonce = new Uint8Array(that.constants.crypto_secretbox_NONCEBYTES);\n that.crypto.getRandomValues(nonce);\n return $q.when(nonce);\n };\n this.util.crypto_hash_sha256 = function (message) {\n return that.nacl.from_hex(that.sha256(message));\n };\n\n this.util.crypto_scrypt = function(password, salt, N, r, p, seedLength) {\n var deferred = $q.defer();\n that.nacl.crypto_pwhash_scryptsalsa208sha256_ll(\n password,\n salt,\n N,\n r,\n p,\n seedLength,\n function (err, seed) {\n if (err) { deferred.reject(err); return;}\n deferred.resolve(seed);\n }\n );\n return deferred.promise;\n };\n\n /**\n * Create key pairs (sign and box), from salt+password (Scrypt), using cordova\n */\n this.scryptKeypair = function(salt, password, scryptParams) {\n var deferred = $q.defer();\n\n that.nacl.crypto_pwhash_scryptsalsa208sha256_ll(\n that.nacl.from_string(password),\n that.nacl.from_string(salt),\n scryptParams && scryptParams.N || that.constants.SCRYPT_PARAMS.DEFAULT.N,\n scryptParams && scryptParams.r || that.constants.SCRYPT_PARAMS.DEFAULT.r,\n scryptParams && scryptParams.p || that.constants.SCRYPT_PARAMS.DEFAULT.p,\n that.constants.SEED_LENGTH,\n function (err, seed) {\n if (err) { deferred.reject(err); return;}\n\n that.nacl.crypto_sign_seed_keypair(seed, function (err, signKeypair) {\n if (err) { deferred.reject(err); return;}\n var result = {\n signPk: signKeypair.pk,\n signSk: signKeypair.sk\n };\n that.box_keypair_from_sign(result)\n .then(function(boxKeypair) {\n result.boxPk = boxKeypair.pk;\n result.boxSk = boxKeypair.sk;\n deferred.resolve(result);\n })\n .catch(function(err) {\n deferred.reject(err);\n });\n });\n\n }\n );\n\n return deferred.promise;\n };\n\n /**\n * Create key pairs from a seed\n */\n this.seedKeypair = function(seed) {\n var deferred = $q.defer();\n\n that.nacl.crypto_sign_seed_keypair(seed, function (err, signKeypair) {\n if (err) { deferred.reject(err); return;}\n deferred.resolve({\n signPk: signKeypair.pk,\n signSk: signKeypair.sk\n });\n });\n return deferred.promise;\n };\n\n\n /**\n * Get sign PK from salt+password (Scrypt), using cordova\n */\n this.scryptSignPk = function(salt, password, scryptParams) {\n var deferred = $q.defer();\n\n that.nacl.crypto_pwhash_scryptsalsa208sha256_ll(\n that.nacl.from_string(password),\n that.nacl.from_string(salt),\n scryptParams && scryptParams.N || that.constants.SCRYPT_PARAMS.DEFAULT.N,\n scryptParams && scryptParams.r || that.constants.SCRYPT_PARAMS.DEFAULT.r,\n scryptParams && scryptParams.p || that.constants.SCRYPT_PARAMS.DEFAULT.p,\n that.constants.SEED_LENGTH,\n function (err, seed) {\n if (err) { deferred.reject(err); return;}\n\n that.nacl.crypto_sign_seed_keypair(seed, function (err, signKeypair) {\n if (err) { deferred.reject(err); return;}\n deferred.resolve(signKeypair.pk);\n });\n\n }\n );\n\n return deferred.promise;\n };\n\n /**\n * Verify a signature of a message, for a pubkey\n */\n this.verify = function (message, signature, pubkey) {\n var deferred = $q.defer();\n that.nacl.crypto_sign_verify_detached(\n that.nacl.from_base64(signature),\n that.nacl.from_string(message),\n that.nacl.from_base64(pubkey),\n function(err, verified) {\n if (err) { deferred.reject(err); return;}\n deferred.resolve(verified);\n });\n return deferred.promise;\n };\n\n /**\n * Sign a message, from a key pair\n */\n this.sign = function(message, keypair) {\n var deferred = $q.defer();\n\n that.nacl.crypto_sign(\n that.nacl.from_string(message), // message\n keypair.signSk, // sk\n function(err, signedMsg) {\n if (err) { deferred.reject(err); return;}\n var sig;\n if (signedMsg.length > that.constants.crypto_sign_BYTES) {\n sig = new Uint8Array(that.constants.crypto_sign_BYTES);\n for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i];\n }\n else {\n sig = signedMsg;\n }\n var signature = that.nacl.to_base64(sig);\n deferred.resolve(signature);\n });\n\n return deferred.promise;\n };\n\n /**\n * Compute the box key pair, from a sign key pair\n */\n this.box_keypair_from_sign = function(signKeyPair) {\n if (signKeyPair.boxSk && signKeyPair.boxPk) return $q.when(signKeyPair);\n var deferred = $q.defer();\n var result = {};\n that.nacl.crypto_sign_ed25519_pk_to_curve25519(signKeyPair.signPk, function(err, boxPk) {\n if (err) { deferred.reject(err); return;}\n result.boxPk = boxPk;\n if (result.boxSk) deferred.resolve(result);\n });\n that.nacl.crypto_sign_ed25519_sk_to_curve25519(signKeyPair.signSk, function(err, boxSk) {\n if (err) { deferred.reject(err); return;}\n result.boxSk = boxSk;\n if (result.boxPk) deferred.resolve(result);\n });\n\n return deferred.promise;\n };\n\n /**\n * Compute the box public key, from a sign public key\n */\n this.box_pk_from_sign = function(signPk) {\n var deferred = $q.defer();\n that.nacl.crypto_sign_ed25519_pk_to_curve25519(signPk, function(err, boxPk) {\n if (err) { deferred.reject(err); return;}\n deferred.resolve(boxPk);\n });\n return deferred.promise;\n };\n\n /**\n * Compute the box secret key, from a sign secret key\n */\n this.box_sk_from_sign = function(signSk) {\n var deferred = $q.defer();\n that.nacl.crypto_sign_ed25519_sk_to_curve25519(signSk, function(err, boxSk) {\n if (err) { deferred.reject(err); return;}\n deferred.resolve(boxSk);\n });\n return deferred.promise;\n };\n\n /**\n * Encrypt a message, from a key pair\n */\n this.box = function(message, nonce, recipientPk, senderSk) {\n if (!message) {\n return $q.reject('No message');\n }\n var deferred = $q.defer();\n\n var messageBin = that.nacl.from_string(message);\n if (typeof recipientPk === \"string\") {\n recipientPk = that.util.decode_base58(recipientPk);\n }\n\n that.nacl.crypto_box_easy(messageBin, nonce, recipientPk, senderSk, function(err, ciphertextBin) {\n if (err) { deferred.reject(err); return;}\n var ciphertext = that.util.encode_base64(ciphertextBin);\n //console.debug('Encrypted message: ' + ciphertext);\n deferred.resolve(ciphertext);\n });\n return deferred.promise;\n };\n\n /**\n * Decrypt a message, from a key pair\n */\n this.box_open = function(cypherText, nonce, senderPk, recipientSk) {\n if (!cypherText) {\n return $q.reject('No cypherText');\n }\n var deferred = $q.defer();\n\n var ciphertextBin = that.nacl.from_base64(cypherText);\n if (typeof senderPk === \"string\") {\n senderPk = that.util.decode_base58(senderPk);\n }\n\n // Avoid crash if content has not the minimal length - Fix #346\n if (ciphertextBin.length < that.constants.crypto_box_MACBYTES) {\n deferred.reject('Invalid cypher content length');\n return;\n }\n\n that.nacl.crypto_box_open_easy(ciphertextBin, nonce, senderPk, recipientSk, function(err, message) {\n if (err) { deferred.reject(err); return;}\n that.util.array_to_string(message, function(result) {\n //console.debug('Decrypted text: ' + result);\n deferred.resolve(result);\n });\n });\n\n return deferred.promise;\n };\n\n this.load = function() {\n var deferred = $q.defer();\n if (!window.plugins || !window.plugins.MiniSodium) {\n deferred.reject(\"Cordova plugin 'MiniSodium' not found. Please load Full JS implementation instead.\");\n }\n else {\n that.nacl = window.plugins.MiniSodium;\n\n var loadedLib = 0;\n var checkAllLibLoaded = function() {\n loadedLib++;\n if (loadedLib == 2) {\n that.loaded = true;\n deferred.resolve();\n }\n };\n that.async_load_base58(function(lib) {\n that.base58 = lib;\n checkAllLibLoaded();\n });\n that.async_load_sha256(function(lib) {\n that.sha256 = lib;\n checkAllLibLoaded();\n });\n }\n\n return deferred.promise;\n };\n\n // Shortcuts\n this.util.hash = that.util.hash_sha256;\n this.box = {\n keypair: {\n fromSignKeypair: that.box_keypair_from_sign,\n skFromSignSk: that.box_sk_from_sign,\n pkFromSignPk: that.box_pk_from_sign\n },\n pack: that.box,\n open: that.box_open\n };\n }\n CordovaServiceFactory.prototype = new CryptoAbstractService();\n\n /* -----------------------------------------------------------------------------------------------------------------\n * Create service instance\n * ----------------------------------------------------------------------------------------------------------------*/\n\n\n var service = new CryptoAbstractService();\n\n var isDevice = true;\n // removeIf(android)\n // removeIf(ios)\n isDevice = false;\n // endRemoveIf(ios)\n // endRemoveIf(android)\n\n //console.debug(\"[crypto] Created CryptotUtils service. device=\" + isDevice);\n\n ionicReady().then(function() {\n console.debug('[crypto] Starting...');\n var now = Date.now();\n\n var serviceImpl;\n\n // Use Cordova plugin implementation, when exists\n if (isDevice && window.plugins && window.plugins.MiniSodium && crypto && crypto.getRandomValues) {\n console.debug('[crypto] Loading \\'MiniSodium\\' implementation...');\n serviceImpl = new CordovaServiceFactory();\n }\n else {\n console.debug('[crypto] Loading \\'FullJS\\' implementation...');\n serviceImpl = new FullJSServiceFactory();\n }\n\n // Load (async lib)\n serviceImpl.load()\n .catch(function(err) {\n console.error(err);\n throw err;\n })\n .then(function() {\n service.copy(serviceImpl);\n console.debug('[crypto] Loaded \\'{0}\\' implementation in {1}ms'.format(service.id, Date.now() - now));\n });\n\n });\n\n return service;\n }])\n\n\n /* -----------------------------\n Crypto advanced service for Cesium\n */\n\n .factory('csCrypto', ['$q', '$rootScope', '$timeout', 'CryptoUtils', 'UIUtils', 'Modals', function($q, $rootScope, $timeout, CryptoUtils, UIUtils, Modals) {\n 'ngInject';\n\n function test(regexpContent) {\n return new RegExp(regexpContent);\n }\n\n function xor(a, b) {\n var length = Math.max(a.length, b.length);\n var buffer = new Uint8Array(length);\n for (var i = 0; i < length; ++i) {\n buffer[i] = a[i] ^ b[i];\n }\n return buffer;\n }\n\n function concat_Uint8Array( buffer1, buffer2 ) {\n var tmp = new Uint8Array( buffer1.byteLength + buffer2.byteLength );\n tmp.set( new Uint8Array( buffer1 ), 0 );\n tmp.set( new Uint8Array( buffer2 ), buffer1.byteLength );\n return tmp;\n }\n\n var constants = {\n WIF: {\n DATA_LENGTH: 35\n },\n EWIF: {\n SALT_LENGTH: 4,\n DERIVED_HALF_LENGTH: 16,\n DATA_LENGTH: 39,\n SCRYPT_PARAMS: {\n N: 16384,\n r: 8,\n p: 8\n }\n },\n REGEXP: {\n PUBKEY: '[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44}',\n SECKEY: '[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{86,88}',\n FILE: {\n TYPE_LINE: '^Type: ([a-zA-Z0-9]+)\\n',\n VERSION: 'Version: ([0-9]+)\\n',\n PUB: '[Pp]ub: ([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44})\\n',\n SEC: '[Ss]ec: ([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{86,88})(\\n|$)',\n DATA: '[Dd]ata: ([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+)(\\n|$)'\n }\n }\n },\n regexp = {\n FILE: {\n TYPE_LINE: test(constants.REGEXP.FILE.TYPE_LINE),\n VERSION: test(constants.REGEXP.FILE.VERSION),\n PUB: test(constants.REGEXP.FILE.PUB),\n SEC: test(constants.REGEXP.FILE.SEC),\n DATA: test(constants.REGEXP.FILE.DATA)\n }\n },\n errorCodes = {\n BAD_PASSWORD: 3001,\n BAD_CHECKSUM: 3002\n };\n\n /* -- keyfile -- */\n\n function readKeyFile(file, options) {\n\n if (file && file.content) {\n return parseKeyFileContent(file.content, options);\n }\n\n return $q(function(resolve, reject) {\n if (!file) {\n return reject('Argument [file] is missing');\n }\n\n //console.debug('[crypto] [keypair] reading file: ', file);\n var reader = new FileReader();\n reader.onload = function (event) {\n parseKeyFileContent(event.target.result, options)\n .then(resolve)\n .catch(reject);\n };\n reader.readAsText(file, 'utf8');\n });\n }\n\n function parseKeyFileContent(content, options) {\n\n if (!content) return $q.reject('Argument [content] is missing');\n\n options = options || {};\n options.withSecret = angular.isDefined(options.withSecret) ? options.withSecret : false;\n options.defaultType = options.defaultType || 'PubSec';\n\n var matches;\n\n var typeMatch = regexp.FILE.TYPE_LINE.exec(content);\n\n // If no Type field: add default type\n var type = typeMatch && typeMatch[1];\n if (!type && options.defaultType) {\n return parseKeyFileContent('Type: {0}\\n{1}'.format(options.defaultType, content), options);\n }\n\n // Type: PubSec\n if (type == 'PubSec') {\n\n // Read Pub field\n matches = regexp.FILE.PUB.exec(content);\n if (!matches) return $q.reject('Missing [pub] field in file, or invalid public key value');\n var signKeypair = {\n signPk: CryptoUtils.base58.decode(matches[1])\n };\n if (!options.withSecret) return $q.resolve(signKeypair);\n\n // Read Sec field\n matches= regexp.FILE.SEC.exec(content);\n if (!matches) return $q.reject('Missing [sec] field in file, or invalid secret key value');\n signKeypair.signSk = CryptoUtils.base58.decode(matches[1]);\n return $q.resolve(signKeypair);\n }\n\n // Type: WIF or EWIF\n else if (type == 'WIF' || type == 'EWIF') {\n matches = regexp.FILE.DATA.exec(content);\n if (!matches) {\n return $q.reject('Missing [Data] field in file. This is required for WIF or EWIF format');\n }\n\n return parseWIF_or_EWIF(matches[1], {\n type: type,\n password: options.password\n })\n .then(function(signKeypair) {\n return signKeypair && !options.withSecret ? {signPk: signKeypair.signPk} : signKeypair;\n });\n }\n\n // Type: unknown\n if (options.defaultType) {\n return $q.reject('Bad file format: missing Type field');\n }\n else {\n return $q.reject('Bad file format, unknown type [' + type + ']');\n }\n }\n\n\n /**\n *\n * @param data_base58\n * @param options\n * @returns {*}\n */\n function parseWIF_or_EWIF(data_base58, options) {\n options = options || {};\n\n var data_int8 = data_base58 && CryptoUtils.base58.decode(data_base58);\n if (!data_int8 || data_int8.length != constants.EWIF.DATA_LENGTH && data_int8.length != constants.WIF.DATA_LENGTH) {\n return $q.reject('Invalid WIF or EWIF format (invalid bytes count).');\n }\n\n // Detect the type from the first byte\n options.type = options.type || (data_int8[0] == 1 && 'WIF') || (data_int8[0] == 2 && 'EWIF');\n\n // Type: WIF\n if (options.type == 'WIF') {\n return parseWIF_v1(data_base58);\n }\n\n // Type: EWIF\n if (options.type == 'EWIF') {\n\n // If not set, resolve password using the given callback\n if (typeof options.password == \"function\") {\n //console.debug(\"[crypto] [EWIF] Executing 'options.password()' to resolve the password...\");\n options.password = options.password();\n if (!options.password) {\n return $q.reject({message: \"Invalid callback result for 'options.password()': must return a promise or a string.\"});\n }\n }\n\n // If password is a promise, get the result then read data\n if (typeof options.password === \"object\" && options.password.then) {\n return options.password.then(function(password) {\n if (!password) throw 'CANCELLED';\n return parseEWIF_v1(data_base58, password);\n });\n }\n\n // If password is a valid string, read data\n if (typeof options.password == \"string\") {\n return parseEWIF_v1(data_base58, options.password);\n }\n\n return $q.reject({message: 'Invalid EWIF options.password. Waiting a callback function, a promise or a string.'});\n }\n\n // Unknown type\n return $q.reject({message: 'Invalid WIF or EWIF format: unknown first byte identifier.'});\n }\n\n\n function parseWIF_v1(wif_base58) {\n var wif_int8 = CryptoUtils.util.decode_base58(wif_base58);\n\n // Check identifier byte = 0x01\n if (wif_int8[0] != 1) {\n return $q.reject({message: 'Invalid WIF v1 format: expected [0x01] as first byte'});\n }\n\n // Check length\n if (wif_int8.length != constants.WIF.DATA_LENGTH) {\n return $q.reject({message: 'Invalid WIF v1 format: Data must be a '+constants.WIF.DATA_LENGTH+' bytes array, encoded in base 58.'});\n }\n\n var wif_int8_no_checksum = wif_int8.slice(0, -2),\n seed = wif_int8.slice(1, -2),\n checksum = wif_int8.slice(-2);\n\n // Compute expected checksum\n var expectedChecksum = CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(wif_int8_no_checksum)).slice(0,2);\n if (CryptoUtils.util.encode_base58(checksum) != CryptoUtils.util.encode_base58(expectedChecksum)) {\n $q.reject({message: 'Invalid WIF format: bad checksum'});\n }\n\n // Generate keypair from seed\n return CryptoUtils.seedKeypair(seed);\n }\n\n function parseEWIF_v1(ewif_base58, password) {\n var ewif_int8 = CryptoUtils.util.decode_base58(ewif_base58);\n\n // Check identifier byte = 0x02\n if (ewif_int8[0] != 2) {\n return $q.reject({message: 'Invalid EWIF v1 format: Expected [0x02] as first byte'});\n }\n\n // Check length\n if (ewif_int8.length != constants.EWIF.DATA_LENGTH) {\n return $q.reject({message: 'Invalid EWIF v1 format: Expected {0} bytes, encoded in base 58.'.format(constants.EWIF.DATA_LENGTH)});\n }\n\n var ewif_int8_no_checksum = ewif_int8.slice(0,-2);\n var checksum = ewif_int8.slice(-2);\n var salt = ewif_int8.slice(1,5);\n var encryptedhalf1 = ewif_int8.slice(5,21);\n var encryptedhalf2 = ewif_int8.slice(21,37);\n\n // Retrieve the scrypt_seed\n return CryptoUtils.util.crypto_scrypt(\n CryptoUtils.util.encode_utf8(password),\n salt,\n constants.EWIF.SCRYPT_PARAMS.N,\n constants.EWIF.SCRYPT_PARAMS.r,\n constants.EWIF.SCRYPT_PARAMS.p,\n 64)\n\n // Compute the final seed\n .then(function(scrypt_seed) {\n\n var derivedhalf1 = scrypt_seed.slice(0, 32);\n var derivedhalf2 = scrypt_seed.slice(32, 64);\n\n //AES\n var aesEcb = new aesjs.ModeOfOperation.ecb(derivedhalf2);\n var decryptedhalf1 = aesEcb.decrypt(encryptedhalf1);\n var decryptedhalf2 = aesEcb.decrypt(encryptedhalf2);\n\n decryptedhalf1 = new Uint8Array(decryptedhalf1);\n decryptedhalf2 = new Uint8Array(decryptedhalf2);\n\n //xor\n var seed1 = xor(decryptedhalf1, derivedhalf1.slice(0, 16));\n var seed2 = xor(decryptedhalf2, derivedhalf1.slice(16, 32));\n var seed = concat_Uint8Array(seed1, seed2);\n\n return seed;\n })\n\n // Get the keypair, from the seed\n .then(CryptoUtils.seedKeypair)\n\n // Do some controls\n .then(function(keypair) {\n\n // Check salt\n var expectedSalt = CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(keypair.signPk)).slice(0,4);\n if(CryptoUtils.util.encode_base58(salt) !== CryptoUtils.util.encode_base58(expectedSalt)) {\n throw {ucode: errorCodes.BAD_PASSWORD, message: 'ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD'};\n }\n\n // Check checksum\n var expectedChecksum = CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(ewif_int8_no_checksum)).slice(0,2);\n if (CryptoUtils.util.encode_base58(checksum) != CryptoUtils.util.encode_base58(expectedChecksum)) {\n throw {ucode: errorCodes.BAD_CHECKSUM, message: 'ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_CHECKSUM'};\n }\n\n return keypair;\n });\n }\n\n\n function wif_v1_from_keypair(keypair) {\n\n var seed = CryptoUtils.seed_from_signSk(keypair.signSk);\n if (!seed || seed.byteLength !== CryptoUtils.constants.SEED_LENGTH)\n throw \"Bad see format. Expected {0} bytes\".format(CryptoUtils.constants.SEED_LENGTH);\n\n var fi = new Uint8Array(1);\n fi[0] = 0x01;\n var seed_fi = concat_Uint8Array(fi, seed);\n\n // checksum\n var checksum = CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(seed_fi)).slice(0,2);\n\n var wif_int8 = concat_Uint8Array(seed_fi, checksum);\n return $q.when(CryptoUtils.util.encode_base58(wif_int8));\n }\n\n function ewif_v1_from_keypair(keypair, password) {\n\n var seed = CryptoUtils.seed_from_signSk(keypair.signSk);\n if (!seed || seed.byteLength !== CryptoUtils.constants.SEED_LENGTH)\n return $q.reject({message: \"Bad see format. Expected {0} bytes\".format(CryptoUtils.constants.SEED_LENGTH)});\n\n // salt\n var salt = CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(keypair.signPk)).slice(0,4);\n\n // scrypt_seed\n return CryptoUtils.util.crypto_scrypt(\n CryptoUtils.util.encode_utf8(password),\n salt,\n constants.EWIF.SCRYPT_PARAMS.N,\n constants.EWIF.SCRYPT_PARAMS.r,\n constants.EWIF.SCRYPT_PARAMS.p,\n 64)\n .then(function(scrypt_seed) {\n var derivedhalf1 = scrypt_seed.slice(0,32);\n var derivedhalf2 = scrypt_seed.slice(32,64);\n\n //XOR & AES\n var seed1_xor_derivedhalf1_1 = xor(seed.slice(0,16), derivedhalf1.slice(0,16));\n var seed2_xor_derivedhalf1_2 = xor(seed.slice(16,32), derivedhalf1.slice(16,32));\n\n var aesEcb = new aesjs.ModeOfOperation.ecb(derivedhalf2);\n var encryptedhalf1 = aesEcb.encrypt(seed1_xor_derivedhalf1_1);\n var encryptedhalf2 = aesEcb.encrypt(seed2_xor_derivedhalf1_2);\n\n encryptedhalf1 = new Uint8Array(encryptedhalf1);\n encryptedhalf2 = new Uint8Array(encryptedhalf2);\n\n // concatenate ewif\n var ewif_int8 = new Uint8Array(1);\n ewif_int8[0] = 0x02;\n ewif_int8 = concat_Uint8Array(ewif_int8,salt);\n ewif_int8 = concat_Uint8Array(ewif_int8,encryptedhalf1);\n ewif_int8 = concat_Uint8Array(ewif_int8,encryptedhalf2);\n\n var checksum = CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(ewif_int8)).slice(0,2);\n ewif_int8 = concat_Uint8Array(ewif_int8,checksum);\n\n return CryptoUtils.util.encode_base58(ewif_int8);\n });\n }\n\n function generateKeyFileContent(keypair, options) {\n options = options || {};\n options.type = options.type || \"PubSec\";\n\n switch(options.type) {\n\n // PubSec\n case \"PubSec\" :\n return $q.resolve(\n \"Type: PubSec\\n\" +\n \"Version: 1\\n\" +\n \"pub: \" + CryptoUtils.base58.encode(keypair.signPk) + \"\\n\" +\n \"sec: \" + CryptoUtils.base58.encode(keypair.signSk) + \"\\n\");\n\n // WIF - v1\n case \"WIF\" :\n return wif_v1_from_keypair(keypair)\n .then(function(data) {\n return \"Type: WIF\\n\" +\n \"Version: 1\\n\" +\n \"Data: \" + data + \"\\n\";\n });\n\n // EWIF - v1\n case \"EWIF\" :\n\n if (!options.password) return $q.reject({message: 'Missing EWIF options.password.'});\n\n // If not set, resolve password using the given callback\n if (options.password && typeof options.password == \"function\") {\n console.debug(\"[crypto] [EWIF] Executing 'options.password()' to resolve the password...\");\n options.password = options.password();\n if (!options.password) {\n return $q.reject({message: \"Invalid callback result for 'options.password()': must return a promise or a string.\"});\n }\n }\n\n // If password is a promise, get the result then read data\n if (options.password && typeof options.password == \"object\" && options.password.then) {\n return options.password.then(function(password) {\n if (!password) throw 'CANCELLED';\n // Recursive call, with the string password in options\n return generateKeyFileContent(keypair, angular.merge({}, options, {password: password}));\n });\n }\n\n // If password is a valid string, read data\n if (options.password && typeof options.password == \"string\") {\n return ewif_v1_from_keypair(keypair, options.password)\n .then(function(data) {\n return \"Type: EWIF\\n\" +\n \"Version: 1\\n\" +\n \"Data: \" + data + \"\\n\";\n });\n }\n\n return $q.reject({message: 'Invalid EWIF options.password. Waiting a callback function, a promise or a string.'});\n\n default:\n return $q.reject({message: \"Unknown keyfile format: \" + options.type});\n }\n }\n\n\n\n /* -- usefull methods -- */\n\n function pkChecksum(pubkey) {\n var signPk_int8 = CryptoUtils.util.decode_base58(pubkey);\n return CryptoUtils.util.encode_base58(CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(signPk_int8))).substring(0,3);\n }\n\n /* -- box (pack/unpack a record) -- */\n\n function getBoxKeypair(keypair) {\n if (!keypair) {\n throw new Error('Missing keypair');\n }\n if (keypair.boxPk && keypair.boxSk) {\n return $q.when(keypair);\n }\n\n return $q.all([\n CryptoUtils.box.keypair.skFromSignSk(keypair.signSk),\n CryptoUtils.box.keypair.pkFromSignPk(keypair.signPk)\n ])\n .then(function(res) {\n return {\n boxSk: res[0],\n boxPk: res[1]\n };\n });\n }\n\n function packRecordFields(record, keypair, recipientFieldName, cypherFieldNames, nonce) {\n\n recipientFieldName = recipientFieldName || 'recipient';\n if (!record[recipientFieldName]) {\n return $q.reject({message:'ES_WALLET.ERROR.RECIPIENT_IS_MANDATORY'});\n }\n\n cypherFieldNames = cypherFieldNames || 'content';\n if (typeof cypherFieldNames == 'string') {\n cypherFieldNames = [cypherFieldNames];\n }\n\n // Work on a copy, to keep the original record (as it could be use again - fix #382)\n record = angular.copy(record);\n\n // Get recipient\n var recipientPk = CryptoUtils.util.decode_base58(record[recipientFieldName]);\n\n return $q.all([\n getBoxKeypair(keypair),\n CryptoUtils.box.keypair.pkFromSignPk(recipientPk),\n nonce ? $q.when(nonce) : CryptoUtils.util.random_nonce()\n ])\n .then(function(res) {\n //var senderSk = res[0];\n var boxKeypair = res[0];\n var senderSk = boxKeypair.boxSk;\n var boxRecipientPk = res[1];\n var nonce = res[2];\n\n return $q.all(\n cypherFieldNames.reduce(function(res, fieldName) {\n if (!record[fieldName]) return res; // skip undefined fields\n return res.concat(\n CryptoUtils.box.pack(record[fieldName], nonce, boxRecipientPk, senderSk)\n );\n }, []))\n\n .then(function(cypherTexts){\n // Replace field values with cypher texts\n var i = 0;\n _.forEach(cypherFieldNames, function(cypherFieldName) {\n if (!record[cypherFieldName]) {\n // Force undefined fields to be present in object\n // This is better for ES storage, that always works on lazy update mode\n record[cypherFieldName] = null;\n }\n else {\n record[cypherFieldName] = cypherTexts[i++];\n }\n });\n\n // Set nonce\n record.nonce = CryptoUtils.util.encode_base58(nonce);\n\n return record;\n });\n });\n }\n\n function openRecordFields(records, keypair, issuerFieldName, cypherFieldNames) {\n\n issuerFieldName = issuerFieldName || 'issuer';\n cypherFieldNames = cypherFieldNames || 'content';\n if (typeof cypherFieldNames == 'string') {\n cypherFieldNames = [cypherFieldNames];\n }\n\n var now = Date.now();\n var issuerBoxPks = {}; // a map used as cache\n\n var jobs = [getBoxKeypair(keypair)];\n return $q.all(records.reduce(function(jobs, message) {\n var issuer = message[issuerFieldName];\n if (!issuer) {throw 'Record has no ' + issuerFieldName;}\n if (issuerBoxPks[issuer]) return res;\n return jobs.concat(\n CryptoUtils.box.keypair.pkFromSignPk(CryptoUtils.util.decode_base58(issuer))\n .then(function(issuerBoxPk) {\n issuerBoxPks[issuer] = issuerBoxPk; // fill box pk cache\n }));\n }, jobs))\n .then(function(res){\n var boxKeypair = res[0];\n return $q.all(records.reduce(function(jobs, record) {\n var issuerBoxPk = issuerBoxPks[record[issuerFieldName]];\n var nonce = CryptoUtils.util.decode_base58(record.nonce);\n record.valid = true;\n\n return jobs.concat(\n cypherFieldNames.reduce(function(res, cypherFieldName) {\n if (!record[cypherFieldName]) return res;\n return res.concat(CryptoUtils.box.open(record[cypherFieldName], nonce, issuerBoxPk, boxKeypair.boxSk)\n .then(function(text) {\n record[cypherFieldName] = text;\n })\n .catch(function(err){\n console.error(err);\n console.warn('[ES] [crypto] a record may have invalid cypher ' + cypherFieldName);\n record.valid = false;\n }));\n }, []));\n }, []));\n })\n .then(function() {\n console.debug('[ES] [crypto] All record decrypted in ' + (Date.now() - now) + 'ms');\n return records;\n });\n\n }\n\n function parseKeyFileData(data, options){\n options = options || {};\n options.withSecret = angular.isDefined(options.withSecret) ? options.withSecret : true;\n options.silent = angular.isDefined(options.withSecret) ? options.silent : false;\n options.password = function() {\n return UIUtils.loading.hide(100)\n .then(function() {\n return Modals.showPassword({\n title: 'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.TITLE',\n subTitle: 'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.HELP',\n error: options.error,\n scope: options.scope\n });\n })\n .then(function(password) {\n // Timeout is need to force popup to be hide\n return $timeout(function() {\n if (password) UIUtils.loading.show();\n return password;\n }, 150);\n });\n };\n\n if (!options.silent) {\n UIUtils.loading.show();\n }\n\n return parseWIF_or_EWIF(data, options)\n .then(function(res){\n return res;\n })\n .catch(function(err) {\n if (err && err === 'CANCELLED') return;\n if (err && err.ucode == errorCodes.BAD_PASSWORD) {\n // recursive call\n return parseKeyFileData(data, {withSecret: options.withSecret, error: 'ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD'});\n }\n console.error(\"[crypto] Unable to parse as WIF or EWIF format: \" + (err && err.message || err));\n throw err; // rethrow\n });\n }\n\n // exports\n return {\n errorCodes: errorCodes,\n constants: constants,\n // copy CryptoUtils\n util: angular.extend({\n pkChecksum: pkChecksum\n }, CryptoUtils.util),\n keyfile: {\n read: readKeyFile,\n parseData: parseKeyFileData,\n generateContent: generateKeyFileContent\n },\n box: {\n getKeypair: getBoxKeypair,\n pack: packRecordFields,\n open: openRecordFields\n }\n };\n }])\n;\n","// var qrcode;\n\nangular.module('cesium.utils.services', ['angular-fullscreen-toggle'])\n\n// Replace the '$ionicPlatform.ready()', to enable multiple calls\n// See http://stealthcode.co/multiple-calls-to-ionicplatform-ready/\n.factory('ionicReady', ['$ionicPlatform', function($ionicPlatform) {\n 'ngInject';\n\n var readyPromise;\n\n return function () {\n if (!readyPromise) {\n readyPromise = $ionicPlatform.ready();\n }\n return readyPromise;\n };\n}])\n\n.factory('UIUtils', ['$ionicLoading', '$ionicPopup', '$ionicConfig', '$ionicHistory', '$translate', '$q', 'ionicMaterialInk', 'ionicMaterialMotion', '$window', '$timeout', 'Fullscreen', '$ionicPopover', '$state', '$rootScope', 'screenmatch', function($ionicLoading, $ionicPopup, $ionicConfig, $ionicHistory, $translate, $q,\n ionicMaterialInk, ionicMaterialMotion, $window, $timeout, Fullscreen,\n $ionicPopover, $state, $rootScope, screenmatch) {\n 'ngInject';\n\n\n var\n loadingTextCache=null,\n CONST = {\n MAX_HEIGHT: 480,\n MAX_WIDTH: 640,\n THUMB_MAX_HEIGHT: 200,\n THUMB_MAX_WIDTH: 200\n },\n data = {\n smallscreen: screenmatch.bind('xs, sm', $rootScope)\n },\n exports,\n raw = {}\n ;\n\n function alertError(err, subtitle) {\n if (!err) {\n return $q.when(); // Silent\n }\n\n return $q(function(resolve) {\n $translate([err, 'ERROR.POPUP_TITLE', 'ERROR.UNKNOWN_ERROR', 'COMMON.BTN_OK'].concat(subtitle ? [subtitle] : []))\n .then(function (translations) {\n var message = err.message || translations[err];\n return $ionicPopup.show({\n template: '<p>' + (message || translations['ERROR.UNKNOWN_ERROR']) + '</p>',\n title: translations['ERROR.POPUP_TITLE'],\n subTitle: subtitle && translations[subtitle] || undefined,\n buttons: [\n {\n text: '<b>'+translations['COMMON.BTN_OK']+'</b>',\n type: 'button-assertive',\n onTap: function(e) {\n resolve(e);\n }\n }\n ]\n });\n });\n });\n }\n\n function alertInfo(message, subtitle, options) {\n if (!message) return $q.reject(\"Missing 'message' argument\");\n options = options || {};\n options.cssClass = options.cssClass || 'info';\n options.okText = options.okText || 'COMMON.BTN_OK';\n\n return $q(function(resolve) {\n $translate([message, 'INFO.POPUP_TITLE', options.okText].concat(subtitle ? [subtitle] : []))\n .then(function (translations) {\n $ionicPopup.show({\n template: '<p>' + translations[message] + '</p>',\n title: translations['INFO.POPUP_TITLE'],\n subTitle: subtitle && translations[subtitle] || undefined,\n cssClass: options.cssClass,\n buttons: [\n {\n text: translations[options.okText],\n type: 'button-positive',\n onTap: function(e) {\n resolve(e);\n }\n }\n ]\n });\n });\n });\n }\n\n function alertNotImplemented() {\n return alertInfo('INFO.FEATURES_NOT_IMPLEMENTED');\n }\n\n function alertDemo() {\n return $translate([\"MODE.DEMO.FEATURE_NOT_AVAILABLE\", \"MODE.DEMO.INSTALL_HELP\"])\n .then(function(translations) {\n var message = translations[\"MODE.DEMO.FEATURE_NOT_AVAILABLE\"] + \"<br/><br/>\" + translations[\"MODE.DEMO.INSTALL_HELP\"];\n return alertInfo(message, undefined, {cssClass: 'large'});\n });\n }\n\n function askConfirm(message, title, options) {\n title = title || 'CONFIRM.POPUP_TITLE';\n\n options = options || {};\n options.cssClass = options.cssClass || 'confirm';\n options.okText = options.okText || 'COMMON.BTN_OK';\n options.cancelText = options.cancelText || 'COMMON.BTN_CANCEL';\n\n return $translate([message, title, options.cancelText, options.okText])\n .then(function (translations) {\n return $ionicPopup.confirm({\n template: translations[message],\n cssClass: options.cssClass,\n title: translations[title],\n cancelText: translations[options.cancelText],\n cancelType: options.cancelType,\n okText: translations[options.okText],\n okType: options.okType\n });\n });\n }\n\n function hideLoading(timeout){\n if (timeout) {\n return $timeout(function(){\n return $ionicLoading.hide();\n }, timeout);\n }\n else {\n return $ionicLoading.hide();\n }\n }\n\n function showLoading(options) {\n if (!loadingTextCache) {\n return $translate('COMMON.LOADING')\n .then(function(translation){\n loadingTextCache = translation;\n return showLoading(options);\n });\n }\n options = options || {};\n options.template = options.template||loadingTextCache;\n\n return $ionicLoading.show(options);\n }\n\n function updateLoading(options) {\n return $ionicLoading._getLoader().then(function(loader) {\n if (!loader || !loader.isShown) return;\n // Translate template (if exists)\n if (options && options.template) {\n return $translate(options && options.template)\n .then(function(template) {\n options.template = template;\n return loader;\n });\n }\n })\n .then(function(loader) {\n if (loader && loader.isShown) return showLoading(options);\n });\n }\n\n function showToast(message, duration, position) {\n if (!message) return $q.reject(\"Missing 'message' argument\");\n duration = duration || 'short';\n position = position || 'bottom';\n\n return $translate([message])\n .then(function(translations){\n\n // removeIf(device)\n // Use the $ionicLoading toast.\n // First, make sure to convert duration in number\n if (typeof duration == 'string') {\n if (duration == 'short') {\n duration = 2000;\n }\n else {\n duration = 5000;\n }\n }\n return $ionicLoading.show({ template: translations[message], noBackdrop: true, duration: duration });\n // endRemoveIf(device)\n });\n }\n\n function onError(msg, reject/*optional*/) {\n return function(err) {\n var fullMsg = msg;\n var subtitle;\n if (!!err && !!err.message) {\n fullMsg = err.message;\n subtitle = msg;\n }\n else if (!msg){\n fullMsg = err;\n }\n // If reject has been given, use it\n if (!!reject) {\n reject(fullMsg);\n }\n // If just a user cancellation: silent\n else if (fullMsg === 'CANCELLED') {\n return hideLoading(10); // timeout, to avoid bug on transfer (when error on reference)\n }\n\n // Otherwise, log to console and display error\n else {\n hideLoading(10); // timeout, to avoid bug on transfer (when error on reference)\n return alertError(fullMsg, subtitle);\n }\n };\n }\n\n function isSmallScreen() {\n return data.smallscreen.active;\n }\n\n function selectElementText(el) {\n if (el.value || el.type == \"text\" || el.type == \"textarea\") {\n // Source: http://stackoverflow.com/questions/14995884/select-text-on-input-focus\n if ($window.getSelection && !$window.getSelection().toString()) {\n el.setSelectionRange(0, el.value.length);\n }\n }\n else {\n if (el.childNodes && el.childNodes.length > 0) {\n selectElementText(el.childNodes[0]);\n }\n else {\n // See http://www.javascriptkit.com/javatutors/copytoclipboard.shtml\n var range = $window.document.createRange(); // create new range object\n range.selectNodeContents(el); // set range to encompass desired element text\n var selection = $window.getSelection(); // get Selection object from currently user selected text\n selection.removeAllRanges(); // unselect any user selected text (if any)\n selection.addRange(range); // add range to Selection object to select it\n }\n }\n }\n\n function getSelectionText(){\n var selectedText = \"\";\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = $window.getSelection().toString();\n }\n return selectedText;\n }\n\n function imageOnLoadResize(resolve, reject, thumbnail) {\n return function(event) {\n var width = event.target.width,\n height = event.target.height,\n maxWidth = (thumbnail ? CONST.THUMB_MAX_WIDTH : CONST.MAX_WIDTH),\n maxHeight = (thumbnail ? CONST.THUMB_MAX_HEIGHT : CONST.MAX_HEIGHT)\n ;\n\n var canvas = document.createElement(\"canvas\");\n var ctx;\n\n // Thumbnail: resize and crop (to the expected size)\n if (thumbnail) {\n\n // landscape\n if (width > height) {\n width *= maxHeight / height;\n height = maxHeight;\n }\n\n // portrait\n else {\n height *= maxWidth / width;\n width = maxWidth;\n }\n canvas.width = maxWidth;\n canvas.height = maxHeight;\n ctx = canvas.getContext(\"2d\");\n var xoffset = Math.trunc((maxWidth - width) / 2 + 0.5);\n var yoffset = Math.trunc((maxHeight - height) / 2 + 0.5);\n ctx.drawImage(event.target,\n xoffset, // x1\n yoffset, // y1\n maxWidth + -2 * xoffset, // x2\n maxHeight + -2 * yoffset // y2\n );\n }\n\n // Resize, but keep the full image\n else {\n\n // landscape\n if (width > height) {\n if (width > maxWidth) {\n height *= maxWidth / width;\n width = maxWidth;\n }\n }\n\n // portrait\n else {\n if (height > maxHeight) {\n width *= maxHeight / height;\n height = maxHeight;\n }\n }\n\n canvas.width = width;\n canvas.height = height;\n ctx = canvas.getContext(\"2d\");\n\n // Resize the whole image\n ctx.drawImage(event.target, 0, 0, canvas.width, canvas.height);\n }\n\n var dataurl = canvas.toDataURL();\n\n canvas.remove();\n\n resolve(dataurl);\n };\n }\n\n function resizeImageFromFile(file, thumbnail) {\n var img = document.createElement(\"img\");\n return $q(function(resolve, reject) {\n\n if (file) {\n var reader = new FileReader();\n reader.onload = function(event){\n img.onload = imageOnLoadResize(resolve, reject, thumbnail);\n img.src = event.target.result;\n };\n reader.readAsDataURL(file);\n }\n else {\n reject('no file to resize');\n }\n })\n .then(function(dataurl) {\n img.remove();\n return dataurl;\n })\n ;\n }\n\n function resizeImageFromSrc(imageSrc, thumbnail) {\n var img = document.createElement(\"img\");\n return $q(function(resolve, reject) {\n img.onload = imageOnLoadResize(resolve, reject, thumbnail);\n img.src = imageSrc;\n })\n .then(function(data){\n img.remove();\n return data;\n });\n }\n\n function imageOnLoadRotate(resolve, reject) {\n var deg = Math.PI / 180;\n var angle = 90 * deg;\n return function(event) {\n var width = event.target.width;\n var height = event.target.height;\n var maxWidth = CONST.MAX_WIDTH;\n var maxHeight = CONST.MAX_HEIGHT;\n\n if (width > height) {\n if (width > maxWidth) {\n height *= maxWidth / width;\n width = maxWidth;\n }\n } else {\n if (height > maxHeight) {\n width *= maxHeight / height;\n height = maxHeight;\n }\n }\n\n var canvas = document.createElement(\"canvas\");\n canvas.width = height;\n canvas.height = width;\n\n var ctx = canvas.getContext(\"2d\");\n ctx.rotate(angle);\n ctx.drawImage(event.target, 0, (-1) * canvas.width);\n\n var dataurl = canvas.toDataURL();\n\n canvas.remove();\n\n resolve(dataurl);\n };\n }\n\n function rotateFromSrc(imageSrc, angle) {\n var img = document.createElement(\"img\");\n return $q(function(resolve, reject) {\n img.onload = imageOnLoadRotate(resolve, reject, angle);\n img.src = imageSrc;\n })\n .then(function(data){\n img.remove();\n return data;\n });\n }\n\n function showPopover(event, options) {\n\n var deferred = $q.defer();\n\n options = options || {};\n options.templateUrl = options.templateUrl ? options.templateUrl : 'templates/common/popover_copy.html';\n options.scope = options.scope || $rootScope;\n options.scope.popovers = options.scope.popovers || {};\n options.autoselect = options.autoselect || false;\n options.autoremove = angular.isDefined(options.autoremove) ? options.autoremove : true;\n options.backdropClickToClose = angular.isDefined(options.backdropClickToClose) ? options.backdropClickToClose : true;\n options.focusFirstInput = angular.isDefined(options.focusFirstInput) ? options.focusFirstInput : false;\n\n var _show = function(popover) {\n popover = popover || options.scope.popovers[options.templateUrl];\n popover.isResolved=false;\n popover.deferred=deferred;\n popover.options=options;\n // Fill the popover scope\n if (options.bindings) {\n angular.merge(popover.scope, options.bindings);\n }\n $timeout(function() { // This is need for Firefox\n popover.show(event)\n .then(function() {\n var element;\n // Auto select text\n if (options.autoselect) {\n element = document.querySelectorAll(options.autoselect)[0];\n if (element) {\n if ($window.getSelection && !$window.getSelection().toString()) {\n element.setSelectionRange(0, element.value.length);\n element.focus();\n }\n else {\n element.focus();\n }\n }\n }\n else {\n // Auto focus on a element\n if (options.autofocus) {\n element = document.querySelectorAll(options.autofocus)[0];\n if (element) element.focus();\n }\n }\n\n popover.scope.$parent.$emit('popover.shown');\n\n // Callback 'afterShow'\n if (options.afterShow) options.afterShow(popover);\n });\n });\n };\n\n var _cleanup = function(popover) {\n popover = popover || options.scope.popovers[options.templateUrl];\n if (popover) {\n delete options.scope.popovers[options.templateUrl];\n // Remove the popover\n popover.remove()\n // Workaround for issue #244\n // See also https://github.com/driftyco/ionic-v1/issues/71\n // and https://github.com/driftyco/ionic/issues/9069\n .then(function() {\n var bodyEl = angular.element($window.document.querySelectorAll('body')[0]);\n bodyEl.removeClass('popover-open');\n });\n }\n };\n\n var popover = options.scope.popovers[options.templateUrl];\n if (!popover) {\n\n $ionicPopover.fromTemplateUrl(options.templateUrl, {\n scope: options.scope,\n backdropClickToClose: options.backdropClickToClose\n })\n .then(function (popover) {\n popover.isResolved = false;\n\n popover.scope.closePopover = function(result) {\n var autoremove = popover.options && popover.options.autoremove;\n if (popover.options) delete popover.options.autoremove; // remove to avoid to trigger 'popover.hidden'\n popover.hide()\n .then(function() {\n if (autoremove) {\n return _cleanup(popover);\n }\n })\n .then(function() {\n if (popover.deferred) {\n popover.deferred.resolve(result);\n }\n delete popover.deferred;\n delete popover.options;\n });\n };\n\n // Execute action on hidden popover\n popover.scope.$on('popover.hidden', function() {\n if (popover.options && popover.options.afterHidden) {\n popover.options.afterHidden();\n }\n if (popover.options && popover.options.autoremove) {\n _cleanup(popover);\n }\n });\n\n // Cleanup the popover when hidden\n options.scope.$on('$remove', function() {\n if (popover.deferred) {\n popover.deferred.resolve();\n }\n _cleanup();\n });\n\n options.scope.popovers[options.templateUrl] = popover;\n _show(popover);\n });\n }\n else {\n _show(popover);\n }\n\n return deferred.promise;\n }\n\n function showCopyPopover(event, value) {\n var rows = value && value.indexOf('\\n') >= 0 ? value.split('\\n').length : 1;\n return showPopover(event, {\n templateUrl: 'templates/common/popover_copy.html',\n bindings: {\n value: value,\n rows: rows\n },\n autoselect: '.popover-copy ' + (rows <= 1 ? 'input' : 'textarea')\n });\n }\n\n function showSharePopover(event, options) {\n options = options || {};\n options.templateUrl = options.templateUrl ? options.templateUrl : 'templates/common/popover_share.html';\n options.autoselect = options.autoselect || '.popover-share input';\n options.bindings = options.bindings || {};\n options.bindings.value = options.bindings.value || options.bindings.url ||\n $state.href($state.current, $state.params, {absolute: true});\n options.bindings.postUrl = options.bindings.postUrl || options.bindings.value;\n options.bindings.postMessage = options.bindings.postMessage || '';\n options.bindings.titleKey = options.bindings.titleKey || 'COMMON.POPOVER_SHARE.TITLE';\n return showPopover(event, options);\n }\n\n function showHelptip(id, options) {\n var element = (typeof id == 'string') && id ? $window.document.getElementById(id) : id;\n if (!id && !element && options.selector) {\n element = $window.document.querySelector(options.selector);\n }\n\n options = options || {};\n var deferred = options.deferred || $q.defer();\n\n if(element && !options.timeout) {\n if (options.preAction) {\n element[options.preAction]();\n }\n options.templateUrl = options.templateUrl ? options.templateUrl : 'templates/common/popover_helptip.html';\n options.autofocus = options.autofocus || '#helptip-btn-ok';\n options.bindings = options.bindings || {};\n options.bindings.icon = options.bindings.icon || {};\n options.bindings.icon.position = options.bindings.icon.position || false;\n options.bindings.icon.glyph = options.bindings.icon.glyph ||\n (options.bindings.icon.position && options.bindings.icon.position.startsWith('bottom-') ? 'ion-arrow-down-c' :'ion-arrow-up-c');\n options.bindings.icon.class = options.bindings.icon.class || 'calm icon ' + options.bindings.icon.glyph;\n options.bindings.tour = angular.isDefined(options.bindings.tour) ? options.bindings.tour : false;\n showPopover(element, options)\n .then(function(result){\n if (options.postAction) {\n element[options.postAction]();\n }\n deferred.resolve(result);\n })\n .catch(function(err){\n if (options.postAction) {\n element[options.postAction]();\n }\n deferred.reject(err);\n });\n }\n else {\n\n // Do timeout if ask\n if (options.timeout) {\n var timeout = options.timeout;\n options.retryTimeout = options.retryTimeout || timeout;\n delete options.timeout;\n options.deferred = deferred;\n $timeout(function () {\n showHelptip(id, options);\n }, timeout);\n }\n\n // No element: reject\n else if (angular.isDefined(options.retry) && !options.retry) {\n\n if (options.onError === 'continue') {\n $timeout(function () {\n deferred.resolve(true);\n });\n }\n else {\n $timeout(function () {\n deferred.reject(\"[helptip] element now found: \" + id);\n });\n }\n }\n\n // Retry until element appears\n else {\n options.retry = angular.isUndefined(options.retry) ? 2 : (options.retry-1);\n options.deferred = deferred;\n $timeout(function() {\n showHelptip(id, options);\n }, options.timeout || options.retryTimeout || 100);\n }\n }\n\n return deferred.promise;\n }\n\n function showFab(id, timeout) {\n if (!timeout) {\n timeout = 900;\n }\n $timeout(function () {\n // Could not use 'getElementById', because it return only once element,\n // but many fabs can have the same id (many view could be loaded at the same time)\n var fabs = document.getElementsByClassName('button-fab');\n _.forEach(fabs, function(fab){\n if (fab.id == id) {\n fab.classList.toggle('on', true);\n }\n });\n }, timeout);\n }\n\n function hideFab(id, timeout) {\n if (!timeout) {\n timeout = 10;\n }\n $timeout(function () {\n // Could not use 'getElementById', because it return only once element,\n // but many fabs can have the same id (many view could be loaded at the same time)\n var fabs = document.getElementsByClassName('button-fab');\n _.forEach(fabs, function(fab){\n if (fab.id == id) {\n fab.classList.toggle('on', false);\n }\n });\n }, timeout);\n }\n\n function motionDelegate(delegate, ionListClass) {\n var motionTimeout = isSmallScreen() ? 100 : 10;\n var defaultSelector = '.list.{0} .item, .list .{0} .item'.format(ionListClass, ionListClass);\n return {\n ionListClass: ionListClass,\n show: function(options) {\n options = options || {};\n options.selector = options.selector || defaultSelector;\n options.ink = angular.isDefined(options.ink) ? options.ink : true;\n options.startVelocity = options.startVelocity || (isSmallScreen() ? 1100 : 3000);\n return $timeout(function(){\n\n // Display ink effect (no selector need)\n if (options.ink) exports.ink();\n\n // Display the delegated motion effect\n delegate(options);\n }, options.timeout || motionTimeout);\n }\n };\n }\n\n function setEffects(enable) {\n if (exports.motion.enable === enable) return; // same\n console.debug('[UI] [effects] ' + (enable ? 'Enable' : 'Disable'));\n\n exports.motion.enable = enable;\n if (enable) {\n $ionicConfig.views.transition('platform');\n angular.merge(exports.motion, raw.motion);\n }\n else {\n $ionicConfig.views.transition('none');\n var nothing = {\n class: undefined,\n show: function(){}\n };\n angular.merge(exports.motion, {\n enable : false,\n default: nothing,\n fadeSlideIn: nothing,\n fadeSlideInRight: nothing,\n panInLeft: nothing,\n pushDown: nothing,\n ripple: nothing,\n slideUp: nothing,\n fadeIn: nothing,\n toggleOn: toggleOn,\n toggleOff: toggleOff\n });\n $rootScope.motion = nothing;\n }\n $ionicHistory.clearCache();\n }\n\n raw.motion = {\n enable: true,\n default: motionDelegate(ionicMaterialMotion.ripple, 'animate-ripple'),\n blinds: motionDelegate(ionicMaterialMotion.blinds, 'animate-blinds'),\n fadeSlideIn: motionDelegate(ionicMaterialMotion.fadeSlideIn, 'animate-fade-slide-in'),\n fadeSlideInRight: motionDelegate(ionicMaterialMotion.fadeSlideInRight, 'animate-fade-slide-in-right'),\n panInLeft: motionDelegate(ionicMaterialMotion.panInLeft, 'animate-pan-in-left'),\n pushDown: motionDelegate(ionicMaterialMotion.pushDown, 'push-down'),\n ripple: motionDelegate(ionicMaterialMotion.ripple, 'animate-ripple'),\n slideUp: motionDelegate(ionicMaterialMotion.slideUp, 'slide-up'),\n fadeIn: motionDelegate(function(options) {\n toggleOn(options);\n }, 'fade-in'),\n toggleOn: toggleOn,\n toggleOff: toggleOff\n };\n\n function createQRCodeObj(text, typeNumber,\n errorCorrectionLevel, mode, mb) {\n\n mb = mb || 'default'; // default | SJIS | UTF-8\n qrcode.stringToBytes = qrcode.stringToBytesFuncs[mb];\n\n var qr = qrcode(typeNumber || 4, errorCorrectionLevel || 'M');\n qr.addData(text, mode);\n qr.make();\n\n return qr;\n }\n\n /**\n * Create a QRCode as an <svg> tag\n * @param text\n * @param typeNumber\n * @param errorCorrectionLevel\n * @param mode\n * @param mb multibyte ? value: 'default' | 'SJIS' | 'UTF-8'\n * @returns {string}\n */\n function getSvgQRCode(text, typeNumber,\n errorCorrectionLevel, mode, mb) {\n\n var qr = createQRCodeObj(text, typeNumber, errorCorrectionLevel, mode, mb);\n return qr.createSvgTag();\n }\n\n /**\n * Create a QRCode as an <img> tag\n * @param text\n * @param typeNumber\n * @param errorCorrectionLevel\n * @param mode\n * @param mb multibyte ? value: 'default' | 'SJIS' | 'UTF-8'\n * @returns {string}\n */\n function getImgQRCode(text, typeNumber,\n errorCorrectionLevel, mode, mb) {\n\n var qr = createQRCodeObj(text, typeNumber, errorCorrectionLevel, mode, mb);\n return qr.createImgTag();\n }\n\n function toggleOn(options, timeout) {\n // We have a single option, so it may be passed as a string or property\n if (typeof options === 'string') {\n options = {\n selector: options\n };\n }\n\n // Fail early & silently log\n var isInvalidSelector = typeof options.selector === 'undefined' || options.selector === '';\n\n if (isInvalidSelector) {\n console.error('invalid toggleOn selector');\n return false;\n }\n\n $timeout(function () {\n var elements = document.querySelectorAll(options.selector);\n if (elements) _.forEach(elements, function(element){\n element.classList.toggle('on', true);\n });\n }, timeout || 100);\n }\n\n function toggleOff(options, timeout) {\n // We have a single option, so it may be passed as a string or property\n if (typeof options === 'string') {\n options = {\n selector: options\n };\n }\n\n // Fail early & silently log\n var isInvalidSelector = typeof options.selector === 'undefined' || options.selector === '';\n\n if (isInvalidSelector) {\n console.error('invalid toggleOff selector');\n return false;\n }\n\n $timeout(function () {\n var elements = document.querySelectorAll(options.selector);\n if (elements) _.forEach(elements, function(element){\n element.classList.toggle('on', false);\n });\n }, timeout || 900);\n }\n\n exports = {\n alert: {\n error: alertError,\n info: alertInfo,\n confirm: askConfirm,\n notImplemented: alertNotImplemented,\n demo: alertDemo\n },\n loading: {\n show: showLoading,\n hide: hideLoading,\n update: updateLoading\n },\n toast: {\n show: showToast\n },\n onError: onError,\n screen: {\n isSmall: isSmallScreen,\n fullscreen: Fullscreen\n },\n ink: ionicMaterialInk.displayEffect,\n motion: raw.motion,\n setEffects: setEffects,\n qrcode: {\n svg: getSvgQRCode,\n img: getImgQRCode\n },\n fab: {\n show: showFab,\n hide: hideFab\n },\n popover: {\n show: showPopover,\n copy: showCopyPopover,\n share: showSharePopover,\n helptip: showHelptip\n },\n selection: {\n select: selectElementText,\n get: getSelectionText\n },\n image: {\n resizeFile: resizeImageFromFile,\n resizeSrc: resizeImageFromSrc,\n rotateSrc: rotateFromSrc\n },\n raw: raw\n };\n\n return exports;\n}])\n\n\n// See http://plnkr.co/edit/vJQXtsZiX4EJ6Uvw9xtG?p=preview\n.factory('$focus', ['$timeout', '$window', function($timeout, $window) {\n 'ngInject';\n\n return function(id) {\n // timeout makes sure that it is invoked after any other event has been triggered.\n // e.g. click events that need to run before the focus or\n // inputs elements that are in a disabled state but are enabled when those events\n // are triggered.\n $timeout(function() {\n var element = $window.document.getElementById(id);\n if(element)\n element.focus();\n });\n };\n}])\n\n;\n","angular.module('cesium.cache.services', ['angular-cache'])\n\n.factory('csCache', ['$rootScope', '$http', '$window', 'csSettings', 'CacheFactory', function($rootScope, $http, $window, csSettings, CacheFactory) {\n 'ngInject';\n\n var\n constants = {\n VERY_LONG: 54000000, /*15 days*/\n LONG: 1 * 60 * 60 * 1000 /*1 hour*/,\n MEDIUM: 5 * 60 * 1000 /*5 min*/,\n SHORT: csSettings.defaultSettings.cacheTimeMs // around 1min\n },\n storageMode = getSettingsStorageMode(),\n cacheNames = []\n ;\n\n function getSettingsStorageMode(settings) {\n settings = settings || csSettings.data;\n return settings && settings.useLocalStorage && settings.persistCache && $window.localStorage ? 'localStorage' : 'memory';\n }\n\n function getCacheOptions(options) {\n options = options || {};\n options.storageMode = getSettingsStorageMode();\n options.deleteOnExpire = (options.storageMode === 'localStorage' || options.onExpire) ? 'aggressive' : 'passive';\n options.cacheFlushInterval = options.deleteOnExpire === 'passive' ?\n (60 * 60 * 1000) : // If passive mode, remove all items every hour\n null;\n return options;\n }\n\n function getOrCreateCache(prefix, maxAge, onExpire){\n prefix = prefix || '';\n maxAge = maxAge || constants.SHORT;\n var cacheName = prefix + ((maxAge / 1000) + 's');\n\n // If onExpire fn, generate a new cache key\n var cache;\n if (onExpire && typeof onExpire == 'function') {\n var counter = 1;\n while (CacheFactory.get(cacheName + counter)) {\n counter++;\n }\n cacheName = cacheName + counter;\n }\n else {\n cache = CacheFactory.get(cacheName);\n }\n\n // Add to cache names map\n if (!cacheNames[cacheName]) cacheNames[cacheName] = true;\n\n // Already exists: use it\n if (cache) return cache;\n\n // Not exists yet: create a new cache\n var options = getCacheOptions({\n maxAge: maxAge,\n onExpire: onExpire || null\n });\n console.debug(\"[cache] Creating cache {{0}} with {storageMode: {1}}...\".format(cacheName, options.storageMode));\n return CacheFactory.createCache(cacheName, options);\n }\n\n function clearAllCaches() {\n console.debug(\"[cache] Cleaning all caches...\");\n _.forEach(_.keys(cacheNames), function(cacheName) {\n var cache = CacheFactory.get(cacheName);\n if (cache) {\n cache.removeAll();\n }\n });\n }\n\n function clearFromPrefix(cachePrefix) {\n _.forEach(_.keys(cacheNames), function(cacheName) {\n if (cacheName.startsWith(cachePrefix)) {\n var cache = CacheFactory.get(cacheName);\n if (cache) {\n cache.removeAll();\n }\n }\n });\n }\n\n function onSettingsChanged(settings) {\n var newStorageMode = getSettingsStorageMode(settings);\n var hasChanged = (newStorageMode !== storageMode);\n if (hasChanged) {\n storageMode = newStorageMode;\n console.debug(\"[cache] Updating caches with {storageMode: {0}}\".format(storageMode));\n _.forEach(_.keys(cacheNames), function(cacheName) {\n var cache = CacheFactory.get(cacheName);\n if (cache) {\n cache.setOptions(getCacheOptions(), true);\n }\n });\n }\n }\n\n function addListeners() {\n listeners = [\n // Listen if node changed\n csSettings.api.data.on.changed($rootScope, onSettingsChanged, this)\n ];\n }\n\n addListeners();\n\n return {\n get: getOrCreateCache,\n clear: clearFromPrefix,\n clearAll: clearAllCaches,\n constants: constants\n };\n}])\n;\n","angular.module('cesium.modal.services', ['cesium.utils.services'])\n\n// Useful for modal with no controller\n.controller('EmptyModalCtrl', function () {\n 'ngInject';\n\n})\n\n.controller('AboutModalCtrl', ['$scope', 'csConfig', 'UIUtils', 'csHttp', 'filterTranslations', function ($scope, csConfig, UIUtils, csHttp, filterTranslations) {\n 'ngInject';\n\n $scope.openLink = function(event, uri, options) {\n options = options || {};\n\n // If unable to open, just copy value\n options.onError = function() {\n return UIUtils.popover.copy(event, uri);\n };\n\n return csHttp.uri.open(uri, options);\n };\n\n // Change UTC date into user date\n $scope.buildDate = moment(csConfig.build).format(filterTranslations.DATE_PATTERN || 'YYYY-MM-DD HH:mm');\n}])\n\n.factory('ModalUtils', ['$ionicModal', '$rootScope', '$q', '$injector', '$controller', '$timeout', 'Device', function($ionicModal, $rootScope, $q, $injector, $controller, $timeout, Device) {\n 'ngInject';\n\n\n function _evalController(ctrlName) {\n var result = {\n isControllerAs: false,\n controllerName: '',\n propName: ''\n };\n var fragments = (ctrlName || '').trim().split(/\\s+/);\n result.isControllerAs = fragments.length === 3 && (fragments[1] || '').toLowerCase() === 'as';\n if (result.isControllerAs) {\n result.controllerName = fragments[0];\n result.propName = fragments[2];\n } else {\n result.controllerName = ctrlName;\n }\n\n return result;\n }\n\n function DefaultModalController($scope, deferred, parameters) {\n\n $scope.deferred = deferred || $q.defer();\n $scope.resolved = false;\n\n $scope.openModal = function () {\n return $scope.modal.show();\n };\n\n $scope.hideModal = function () {\n return $scope.modal.hide();\n };\n\n $scope.closeModal = function (result) {\n $scope.resolved = true;\n\n return $scope.modal.remove()\n .then(function() {\n // Workaround modal-open not removed\n document.body.classList.remove('modal-open');\n $scope.deferred.resolve(result);\n return result;\n });\n };\n\n\n // Useful method for modal with forms\n $scope.setForm = function (form, propName) {\n if (propName) {\n $scope[propName] = form;\n }\n else {\n $scope.form = form;\n }\n };\n\n // Useful method for modal to get input parameters\n $scope.getParameters = function () {\n return parameters;\n };\n\n $scope.$on('modal.hidden', function () {\n // If not resolved yet: send result\n // (after animation out)\n if (!$scope.resolved) {\n $scope.resolved = true;\n\n $timeout(function() {\n $scope.deferred.resolve();\n return $scope.modal.remove().then(function() {\n // Workaround modal-open not removed\n document.body.classList.remove('modal-open');\n });\n }, ($scope.modal.hideDelay || 320) + 20);\n }\n });\n }\n\n function show(templateUrl, controller, parameters, options) {\n var deferred = $q.defer();\n\n options = options ? options : {} ;\n options.animation = options.animation || 'slide-in-up';\n\n var focusFirstInput = false;\n // removeIf(device)\n focusFirstInput = angular.isDefined(options.focusFirstInput) ? options.focusFirstInput : false;\n // endRemoveIf(device)\n options.focusFirstInput = focusFirstInput;\n\n // If modal has a controller\n if (controller) {\n // If a controller defined, always use a new scope\n options.scope = options.scope ? options.scope.$new() : $rootScope.$new();\n DefaultModalController.call({}, options.scope, deferred, parameters);\n\n // Invoke the controller on this new scope\n var locals = { '$scope': options.scope, 'parameters': parameters };\n var ctrlEval = _evalController(controller);\n var ctrlInstance = $controller(controller, locals);\n if (ctrlEval.isControllerAs) {\n ctrlInstance.openModal = options.scope.openModal;\n ctrlInstance.closeModal = options.scope.closeModal;\n }\n }\n\n $ionicModal.fromTemplateUrl(templateUrl, options)\n .then(function (modal) {\n if (controller) {\n // Set modal into the controller's scope\n modal.scope.$parent.modal = modal;\n }\n else {\n var scope = modal.scope;\n // Define default scope functions\n DefaultModalController.call({}, scope, deferred, parameters);\n // Set modal\n scope.modal = modal;\n }\n\n // Show the modal\n return modal.show();\n },\n function (err) {\n deferred.reject(err);\n });\n\n return deferred.promise;\n }\n\n return {\n show: show\n };\n}])\n\n.factory('Modals', ['$rootScope', '$translate', '$ionicPopup', '$timeout', 'ModalUtils', 'UIUtils', function($rootScope, $translate, $ionicPopup, $timeout, ModalUtils, UIUtils) {\n 'ngInject';\n\n function showTransfer(parameters) {\n var useDigitKeyboard = UIUtils.screen.isSmall();\n return ModalUtils.show('templates/wallet/modal_transfer.html','TransferModalCtrl',\n parameters, {\n focusFirstInput: !useDigitKeyboard\n });\n }\n\n function showLogin(parameters) {\n return ModalUtils.show('templates/login/modal_login.html','LoginModalCtrl',\n parameters, {focusFirstInput: true, backdropClickToClose: false});\n }\n\n function showWotLookup(parameters) {\n return ModalUtils.show('templates/wot/modal_lookup.html','WotLookupModalCtrl',\n parameters || {}, {focusFirstInput: true});\n }\n\n function showNetworkLookup(parameters) {\n return ModalUtils.show('templates/network/modal_network.html', 'NetworkLookupModalCtrl',\n parameters, {focusFirstInput: true});\n }\n\n function showAbout(parameters) {\n return ModalUtils.show('templates/modal_about.html','AboutModalCtrl',\n parameters);\n }\n\n function showAccountSecurity(parameters) {\n return ModalUtils.show('templates/wallet/modal_security.html', 'WalletSecurityModalCtrl',\n parameters);\n }\n\n function showJoin(parameters) {\n return ModalUtils.show('templates/join/modal_choose_account_type.html','JoinChooseAccountTypeModalCtrl',\n parameters)\n .then(function(res){\n if (!res) return;\n return (res.accountType == 'member') ?\n showJoinMember(res) :\n showJoinWallet(res);\n });\n }\n\n function showJoinMember(parameters) {\n return ModalUtils.show('templates/join/modal_join_member.html','JoinModalCtrl',\n parameters);\n }\n\n function showJoinWallet(parameters) {\n return ModalUtils.show('templates/join/modal_join_wallet.html','JoinModalCtrl',\n parameters);\n }\n\n function showHelp(parameters) {\n return ModalUtils.show('templates/help/modal_help.html','HelpModalCtrl',\n parameters);\n }\n\n function showLicense(parameters) {\n return ModalUtils.show('templates/currency/modal_license.html','CurrencyLicenseModalCtrl',\n parameters);\n }\n\n function showSelectPubkeyIdentity(parameters) {\n return ModalUtils.show('templates/wot/modal_select_pubkey_identity.html', 'WotSelectPubkeyIdentityModalCtrl',\n parameters);\n }\n\n function showSelectWallet(parameters) {\n return ModalUtils.show('templates/wallet/list/modal_wallets.html','WalletSelectModalCtrl',\n parameters);\n }\n\n function showPassword(options) {\n options = options || {};\n options.title = options.title || 'COMMON.SET_PASSWORD_TITLE';\n options.subTitle = options.subTitle || 'COMMON.SET_PASSWORD_SUBTITLE';\n var scope = options.scope ? options.scope.$new() : $rootScope.$new();\n scope.formData = {password: undefined};\n scope.setForm = function(form) {\n scope.form=form;\n };\n scope.submit = function(e) {\n scope.form.$submitted=true;\n if (e && e.preventDefault) e.preventDefault();\n if(scope.form.$valid && scope.formData.password) {\n options.popup.close(scope.formData.password);\n }\n };\n\n scope.error = options.error || undefined;\n\n // Choose password popup\n return $translate([options.title, options.subTitle, 'COMMON.BTN_OK', 'COMMON.BTN_CANCEL'])\n .then(function (translations) {\n options.popup = $ionicPopup.show({\n templateUrl: 'templates/common/popup_password.html',\n title: translations[options.title],\n subTitle: translations[options.subTitle],\n scope: scope,\n buttons: [\n { text: translations['COMMON.BTN_CANCEL'] },\n { text: translations['COMMON.BTN_OK'],\n type: 'button-positive',\n onTap: scope.submit\n }\n ]\n });\n return options.popup;\n });\n\n }\n\n return {\n showTransfer: showTransfer,\n showLogin: showLogin,\n showWotLookup: showWotLookup,\n showNetworkLookup: showNetworkLookup,\n showAbout: showAbout,\n showJoin: showJoin,\n showJoinMember: showJoinMember,\n showJoinWallet: showJoinWallet,\n showHelp: showHelp,\n showAccountSecurity: showAccountSecurity,\n showLicense: showLicense,\n showSelectPubkeyIdentity: showSelectPubkeyIdentity,\n showSelectWallet: showSelectWallet,\n showPassword: showPassword\n };\n\n}])\n\n.factory('csPopovers', ['$rootScope', '$translate', '$ionicPopup', '$timeout', 'UIUtils', '$controller', function($rootScope, $translate, $ionicPopup, $timeout, UIUtils, $controller) {\n 'ngInject';\n\n function showSelectWallet(event, options) {\n options = options || {};\n\n var parameters = options.parameters || {};\n delete options.parameters;\n\n var scope = options.scope && options.scope.$new() || $rootScope.$new(true);\n options.scope = scope;\n options.templateUrl = 'templates/wallet/list/popover_wallets.html';\n options.autoremove = true;\n\n // Initialize the popover controller, with parameters\n angular.extend(this, $controller('WalletSelectPopoverCtrl', {$scope: options.scope, parameters: parameters}));\n\n var afterShowSaved = options.afterShow;\n options.afterShow = function(popover) {\n\n // Add a missing method, to close the popover\n scope.closePopover = function(res) {\n popover.scope.closePopover(res);\n };\n\n // Execute default afterShow fn, if any\n if (afterShowSaved) afterShowSaved(popover);\n };\n // Show the popover\n return UIUtils.popover.show(event, options)\n .then(function(res) {\n // Then destroy the scope\n scope.$destroy();\n return res;\n });\n }\n\n return {\n showSelectWallet: showSelectWallet\n };\n\n }]);\n","angular.module('cesium.http.services', ['cesium.cache.services'])\n\n.factory('csHttp', ['$http', '$q', '$timeout', '$window', 'csSettings', 'csCache', 'Device', function($http, $q, $timeout, $window, csSettings, csCache, Device) {\n 'ngInject';\n\n var timeout = csSettings.data.timeout;\n\n var\n sockets = [],\n defaultCachePrefix = 'csHttp-',\n allCachePrefixes = {};\n\n if (!timeout) {\n timeout=4000; // default\n }\n\n function getServer(host, port) {\n // Remove port if 80 or 443\n return !host ? null : (host + (port && port != 80 && port != 443 ? ':' + port : ''));\n }\n\n function getUrl(host, port, path, useSsl) {\n var protocol = (port == 443 || useSsl) ? 'https' : 'http';\n return protocol + '://' + getServer(host, port) + (path ? path : '');\n }\n\n function getWsUrl(host, port, path, useSsl) {\n var protocol = (port == 443 || useSsl) ? 'wss' : 'ws';\n return protocol + '://' + getServer(host, port) + (path ? path : '');\n }\n\n function processError(reject, data, url, status) {\n if (data && data.message) {\n reject(data);\n }\n else {\n if (status == 403) {\n reject({ucode: 403, message: 'Resource is forbidden' + (url ? ' ('+url+')' : '')});\n }\n else if (status == 404) {\n reject({ucode: 404, message: 'Resource not found' + (url ? ' ('+url+')' : '')});\n }\n else if (url) {\n console.error('[http] Get HTTP error {status: ' + status + '} on [' + url + ']');\n reject('Error while requesting [' + url + ']');\n }\n else {\n reject('Unknown error from node');\n }\n }\n }\n\n function prepare(url, params, config, callback) {\n var pkeys = [], queryParams = {}, newUri = url;\n if (typeof params === 'object') {\n pkeys = _.keys(params);\n }\n\n _.forEach(pkeys, function(pkey){\n var prevURI = newUri;\n newUri = newUri.replace(':' + pkey, params[pkey]);\n if (prevURI === newUri) {\n queryParams[pkey] = params[pkey];\n }\n });\n config.params = queryParams;\n return callback(newUri, config);\n }\n\n function getResource(host, port, path, useSsl, forcedTimeout) {\n // Make sure host is defined - fix #537\n if (!host) {\n return $q.reject('[http] invalid URL from host: ' + host);\n }\n var url = getUrl(host, port, path, useSsl);\n return function(params) {\n return $q(function(resolve, reject) {\n var config = {\n timeout: forcedTimeout || timeout,\n responseType: 'json'\n };\n\n prepare(url, params, config, function(url, config) {\n $http.get(url, config)\n .success(function(data, status, headers, config) {\n resolve(data);\n })\n .error(function(data, status, headers, config) {\n processError(reject, data, url, status);\n });\n });\n });\n };\n }\n\n function getResourceWithCache(host, port, path, useSsl, maxAge, autoRefresh, forcedTimeout, cachePrefix) {\n var url = getUrl(host, port, path, useSsl);\n cachePrefix = cachePrefix || defaultCachePrefix;\n maxAge = maxAge || csCache.constants.LONG;\n allCachePrefixes[cachePrefix] = true;\n\n //console.debug('[http] will cache ['+url+'] ' + maxAge + 'ms' + (autoRefresh ? ' with auto-refresh' : ''));\n\n return function(params) {\n return $q(function(resolve, reject) {\n var config = {\n timeout: forcedTimeout || timeout,\n responseType: 'json'\n };\n if (autoRefresh) { // redo the request if need\n config.cache = csCache.get(cachePrefix, maxAge, function (key, value, done) {\n console.debug('[http] Refreshing cache for {{0}} '.format(key));\n $http.get(key, config)\n .success(function (data) {\n config.cache.put(key, data);\n if (done) done(key, data);\n });\n });\n }\n else {\n config.cache = csCache.get(cachePrefix, maxAge);\n }\n\n prepare(url, params, config, function(url, config) {\n $http.get(url, config)\n .success(function(data) {\n resolve(data);\n })\n .error(function(data, status) {\n processError(reject, data, url, status);\n });\n });\n });\n };\n }\n\n function postResource(host, port, path, useSsl, forcedTimeout) {\n var url = getUrl(host, port, path, useSsl);\n return function(data, params) {\n return $q(function(resolve, reject) {\n var config = {\n timeout: forcedTimeout || timeout,\n headers : {'Content-Type' : 'application/json;charset=UTF-8'}\n };\n\n prepare(url, params, config, function(url, config) {\n $http.post(url, data, config)\n .success(function(data) {\n resolve(data);\n })\n .error(function(data, status) {\n processError(reject, data, url, status);\n });\n });\n });\n };\n }\n\n function ws(host, port, path, useSsl, timeout) {\n if (!path) {\n console.error('calling csHttp.ws without path argument');\n throw 'calling csHttp.ws without path argument';\n }\n var uri = getWsUrl(host, port, path, useSsl);\n timeout = timeout || csSettings.data.timeout;\n\n function _waitOpen(self) {\n if (!self.delegate) {\n throw new Error('Websocket {0} was closed!'.format(uri));\n }\n if (self.delegate.readyState == 1) {\n return $q.when(self.delegate);\n }\n if (self.delegate.readyState == 3) {\n return $q.reject('Unable to connect to websocket ['+self.delegate.url+']');\n }\n\n if (self.waitDuration >= timeout) {\n self.waitRetryDelay = self.waitRetryDelay && Math.min(self.waitRetryDelay + 2000, 30000) || 2000; // add 2 seconds, until 30s)\n console.debug(\"[http] Will retry websocket [{0}] in {1}s...\".format(self.path, Math.round(self.waitRetryDelay/1000)));\n }\n else if (Math.round(self.waitDuration / 1000) % 10 === 0){\n console.debug('[http] Waiting websocket ['+self.path+']...');\n }\n\n return $timeout(function(){\n self.waitDuration += self.waitRetryDelay;\n return _waitOpen(self);\n }, self.waitRetryDelay);\n }\n\n function _open(self, callback, params) {\n if (!self.delegate) {\n self.path = path;\n self.callbacks = [];\n self.waitDuration = 0;\n self.waitRetryDelay = 200;\n\n prepare(uri, params, {}, function(uri) {\n self.delegate = new WebSocket(uri);\n self.delegate.onerror = function(e) {\n self.delegate.readyState=3;\n };\n self.delegate.onmessage = function(e) {\n var obj = JSON.parse(e.data);\n _.forEach(self.callbacks, function(callback) {\n callback(obj);\n });\n };\n self.delegate.onopen = function(e) {\n console.debug('[http] Listening on websocket ['+self.path+']...');\n sockets.push(self);\n self.delegate.openTime = Date.now();\n };\n self.delegate.onclose = function(closeEvent) {\n\n // Remove from sockets arrays\n var index = _.findIndex(sockets, function(socket){return socket.path === self.path;});\n if (index >= 0) {\n sockets.splice(index,1);\n }\n\n // If close event comes from Cesium\n if (self.delegate.closing) {\n self.delegate = null;\n }\n\n // If unexpected close event, reopen the socket (fix #535)\n else {\n if (self.delegate.openTime) {\n console.debug('[http] Unexpected close of websocket [{0}] (open {1} ms ago): re-opening...', path, (Date.now() - self.delegate.openTime));\n\n // Force new connection\n self.delegate = null;\n\n // Loop, but without the already registered callback\n _open(self, null, params);\n }\n else if (closeEvent) {\n console.debug('[http] Unexpected close of websocket [{0}]: error code: '.format(path), closeEvent && closeEvent.code || closeEvent);\n\n // Force new connection\n self.delegate = null;\n\n // Loop, but without the already registered callback\n _open(self, null, params);\n }\n }\n };\n });\n }\n\n if (callback) self.callbacks.push(callback);\n return _waitOpen(self);\n }\n\n function _close(self) {\n if (self.delegate) {\n self.delegate.closing = true;\n console.debug('[http] Closing websocket ['+self.path+']...');\n self.delegate.close();\n self.callbacks = [];\n if (self.onclose) self.onclose();\n }\n }\n\n function _remove(self, callback) {\n self.callbacks = _.reject(self.callbacks, function(item) {\n return item === callback;\n });\n if (!self.callbacks.length) {\n _close(self);\n }\n }\n\n return {\n open: function(params) {\n return _open(this, null, params);\n },\n on: function(callback, params) {\n return _open(this, callback, params);\n },\n onListener: function(callback, params) {\n var self = this;\n _open(self, callback, params);\n return function() {\n _remove(self, callback);\n };\n },\n send: function(data) {\n var self = this;\n return _waitOpen(self)\n .then(function(){\n if (self.delegate) self.delegate.send(data);\n });\n },\n close: function() {\n var self = this;\n _close(self);\n },\n isClosed: function() {\n var self = this;\n return !self.delegate || self.delegate.closing;\n }\n };\n }\n\n function closeAllWs() {\n if (sockets.length > 0) {\n console.debug('[http] Closing all websocket...');\n _.forEach(sockets, function(sock) {\n sock.close();\n });\n sockets = []; // Reset socks list\n }\n }\n\n // See doc : https://gist.github.com/jlong/2428561\n function parseUri(uri) {\n var protocol;\n if (uri.startsWith('duniter://')) {\n protocol = 'duniter';\n uri = uri.replace('duniter://', 'http://');\n }\n\n var parser = document.createElement('a');\n parser.href = uri;\n\n var pathname = parser.pathname;\n if (pathname && pathname.startsWith('/')) {\n pathname = pathname.substring(1);\n }\n\n var result = {\n protocol: protocol ? protocol : parser.protocol,\n hostname: parser.hostname,\n host: parser.host,\n port: parser.port,\n username: parser.username,\n password: parser.password,\n pathname: pathname,\n search: parser.search,\n hash: parser.hash\n };\n parser.remove();\n return result;\n }\n\n /**\n * Open a URI (url, email, phone, ...)\n * @param event\n * @param link\n * @param type\n */\n function openUri(uri, options) {\n options = options || {};\n\n if (!uri.startsWith('http://') && !uri.startsWith('https://')) {\n var parts = parseUri(uri);\n\n if (!parts.protocol && options.type) {\n parts.protocol = (options.type == 'email') ? 'mailto:' :\n ((options.type == 'phone') ? 'tel:' : '');\n uri = parts.protocol + uri;\n }\n\n // On desktop, open into external tool\n if (parts.protocol == 'mailto:' && Device.isDesktop()) {\n try {\n nw.Shell.openExternal(uri);\n return;\n }\n catch(err) {\n console.error(\"[http] Failed not open 'mailto:' URI into external tool.\");\n }\n }\n\n // Check if device is enable, on special tel: or mailto: protocole\n var validProtocol = (parts.protocol == 'mailto:' || parts.protocol == 'tel:') && Device.enable;\n if (!validProtocol) {\n if (options.onError && typeof options.onError == 'function') {\n options.onError(uri);\n }\n return;\n }\n }\n\n // Note: If device enable, then target=_system will use InAppBrowser cordova plugin\n var openTarget = (options.target || (Device.enable ? '_system' : '_blank'));\n\n // If desktop, try to open into external browser\n if (openTarget === '_blank' || openTarget === '_system' && Device.isDesktop()) {\n try {\n nw.Shell.openExternal(uri);\n return;\n }\n catch(err) {\n console.error(\"[http] Failed not open URI into external browser.\");\n }\n }\n\n // If desktop, should always open in new window (no tabs)\n var openOptions;\n if (openTarget === '_blank' && Device.isDesktop()) {\n\n if (nw && nw.Shell) {\n nw.Shell.openExternal(uri);\n return false;\n }\n // Override default options\n openOptions= \"location=1,titlebar=1,status=1,menubar=1,toolbar=1,resizable=1,scrollbars=1\";\n // Add width/height\n if ($window.screen && $window.screen.width && $window.screen.height) {\n openOptions += \",width={0},height={1}\".format(Math.trunc($window.screen.width/2), Math.trunc($window.screen.height/2));\n }\n }\n\n var win = $window.open(uri,\n openTarget,\n openOptions);\n\n // Center the opened window\n if (openOptions && $window.screen && $window.screen.width && $window.screen.height) {\n win.moveTo($window.screen.width/2/2, $window.screen.height/2/2);\n win.focus();\n }\n\n }\n\n // Get time in second (UTC)\n function getDateNow() {\n return moment().utc().unix();\n }\n\n function isPositiveInteger(x) {\n // http://stackoverflow.com/a/1019526/11236\n return /^\\d+$/.test(x);\n }\n\n /**\n * Compare two software version numbers (e.g. 1.7.1)\n * Returns:\n *\n * 0 if they're identical\n * negative if v1 < v2\n * positive if v1 > v2\n * Nan if they in the wrong format\n *\n * E.g.:\n *\n * assert(version_number_compare(\"1.7.1\", \"1.6.10\") > 0);\n * assert(version_number_compare(\"1.7.1\", \"1.7.10\") < 0);\n *\n * \"Unit tests\": http://jsfiddle.net/ripper234/Xv9WL/28/\n *\n * Taken from http://stackoverflow.com/a/6832721/11236\n */\n function compareVersionNumbers(v1, v2){\n var v1parts = v1.split('.');\n var v2parts = v2.split('.');\n\n // First, validate both numbers are true version numbers\n function validateParts(parts) {\n for (var i = 0; i < parts.length; ++i) {\n if (!isPositiveInteger(parts[i])) {\n return false;\n }\n parts[i] = parseInt(parts[i]);\n }\n return true;\n }\n if (!validateParts(v1parts) || !validateParts(v2parts)) {\n return NaN;\n }\n\n for (var i = 0; i < v1parts.length; ++i) {\n if (v2parts.length === i) {\n return 1;\n }\n\n if (v1parts[i] === v2parts[i]) {\n continue;\n }\n if (v1parts[i] > v2parts[i]) {\n return 1;\n }\n return -1;\n }\n\n if (v1parts.length != v2parts.length) {\n return -1;\n }\n\n return 0;\n }\n\n function isVersionCompatible(minVersion, actualVersion) {\n console.debug('[http] Checking actual version [{0}] is compatible with min expected version [{1}]'.format(actualVersion, minVersion));\n return compareVersionNumbers(minVersion, actualVersion) <= 0;\n }\n\n function clearCache(cachePrefix) {\n cachePrefix = cachePrefix || defaultCachePrefix;\n console.debug(\"[http] Cleaning cache {prefix: '{0}'}...\".format(cachePrefix));\n csCache.clear(cachePrefix);\n }\n\n function clearAllCache() {\n console.debug('[http] Cleaning all caches...');\n _.keys(allCachePrefixes).forEach(function(cachePrefix) {\n csCache.clear(cachePrefix);\n });\n }\n\n return {\n get: getResource,\n getWithCache: getResourceWithCache,\n post: postResource,\n ws: ws,\n closeAllWs: closeAllWs,\n getUrl : getUrl,\n getServer: getServer,\n uri: {\n parse: parseUri,\n open: openUri\n },\n date: {\n now: getDateNow\n },\n version: {\n compare: compareVersionNumbers,\n isCompatible: isVersionCompatible\n },\n cache: angular.merge({\n clear: clearCache,\n clearAll: clearAllCache\n }, csCache.constants)\n };\n}])\n;\n","angular.module('cesium.storage.services', [ 'cesium.config'])\n\n\n .factory('sessionStorage', ['$window', '$q', function($window, $q) {\n 'ngInject';\n\n var\n exports = {\n storage: $window.sessionStorage || {}\n };\n\n exports.put = function(key, value) {\n exports.storage[key] = value;\n return $q.when();\n };\n\n exports.get = function(key, defaultValue) {\n return $q.when(exports.storage[key] || defaultValue);\n };\n\n exports.setObject = function(key, value) {\n exports.storage[key] = JSON.stringify(value);\n return $q.when();\n };\n\n exports.getObject = function(key) {\n return $q.when(JSON.parse(exports.storage[key] || 'null'));\n };\n\n return exports;\n }])\n\n .factory('localStorage', ['$window', '$q', '$log', 'sessionStorage', function($window, $q, $log, sessionStorage) {\n 'ngInject';\n\n var\n appName = \"Cesium\",\n started = false,\n startPromise,\n isDevice = true, // default for device (override later)\n exports = {\n standard: {\n storage: null\n },\n secure: {\n storage: null\n }\n };\n\n // removeIf(device)\n // Use this workaround to avoid to wait ionicReady() event\n isDevice = false;\n // endRemoveIf(device)\n\n /* -- Use standard browser implementation -- */\n\n exports.standard.put = function(key, value) {\n if (angular.isDefined(value) && value != null) {\n exports.standard.storage[key] = value;\n }\n else {\n exports.standard.storage.removeItem(key);\n }\n return $q.when();\n };\n\n exports.standard.remove = function(key, value) {\n exports.standard.storage.removeItem(key);\n return $q.when();\n };\n\n exports.standard.get = function(key, defaultValue) {\n return $q.when(exports.standard.storage[key] || defaultValue);\n };\n\n exports.standard.setObject = function(key, value) {\n exports.standard.storage[key] = JSON.stringify(value);\n return $q.when();\n };\n\n exports.standard.getObject = function(key) {\n return $q.when(JSON.parse(exports.standard.storage[key] || 'null'));\n };\n\n /* -- Use secure storage (using a cordova plugin) -- */\n\n // Set a value to the secure storage (or remove if value is not defined)\n exports.secure.put = function(key, value) {\n return $q(function(resolve, reject) {\n if (value !== undefined && value !== null) {\n exports.secure.storage.set(\n function (key) {\n resolve();\n },\n function (err) {\n $log.error(err);\n reject(err);\n },\n key, value);\n }\n // Remove\n else {\n exports.secure.storage.remove(\n function () {\n resolve();\n },\n function (err) {\n $log.error(err);\n resolve(); // Error = not found\n },\n key);\n }\n });\n };\n\n // Get a value from the secure storage\n exports.secure.get = function(key, defaultValue) {\n return $q(function(resolve, reject) {\n exports.secure.storage.get(\n function (value) {\n if (!value && defaultValue) {\n resolve(defaultValue);\n }\n else {\n resolve(value);\n }\n },\n function (err) {\n $log.error(err);\n resolve(); // Error = not found\n },\n key);\n });\n };\n\n // Set a object to the secure storage\n exports.secure.setObject = function(key, value) {\n $log.debug(\"[storage] Setting object into secure storage, using key=\" + key);\n return $q(function(resolve, reject){\n exports.secure.storage.set(\n resolve,\n reject,\n key,\n value ? JSON.stringify(value) : undefined);\n });\n };\n\n // Get a object from the secure storage\n exports.secure.getObject = function(key) {\n $log.debug(\"[storage] Getting object from secure storage, using key=\" + key);\n return $q(function(resolve, reject){\n exports.secure.storage.get(\n function(value) {resolve(JSON.parse(value||'null'));},\n function(err) {\n $log.error(err);\n resolve(); // Error = not found\n },\n key);\n });\n };\n\n function initStandardStorage() {\n // use local browser storage\n if ($window.localStorage) {\n console.debug('[storage] Starting {local} storage...');\n exports.standard.storage = $window.localStorage;\n // Set standard storage as default\n _.forEach(_.keys(exports.standard), function(key) {\n exports[key] = exports.standard[key];\n });\n }\n\n // Fallback to session storage (localStorage could have been disabled on some browser)\n else {\n console.debug('[storage] Starting {session} storage...');\n // Set standard storage as default\n _.forEach(_.keys(sessionStorage), function(key) {\n exports[key] = sessionStorage[key];\n });\n }\n return $q.when();\n }\n\n function initSecureStorage() {\n console.debug('[storage] Starting {secure} storage...');\n // Set secure storage as default\n _.forEach(_.keys(exports.secure), function(key) {\n exports[key] = exports.secure[key];\n });\n\n var deferred = $q.defer();\n\n // No secure storage plugin: fall back to standard storage\n if (!cordova.plugins || !cordova.plugins.SecureStorage) {\n initStandardStorage();\n deferred.resolve();\n }\n else {\n\n exports.secure.storage = new cordova.plugins.SecureStorage(\n function () {\n deferred.resolve();\n },\n function (err) {\n console.error('[storage] Could not use secure storage. Will use standard.', err);\n initStandardStorage();\n deferred.resolve();\n },\n appName);\n }\n return deferred.promise;\n }\n\n exports.isStarted = function() {\n return started;\n };\n\n exports.ready = function() {\n if (started) return $q.when();\n return startPromise || start();\n };\n\n function start() {\n if (startPromise) return startPromise;\n\n var now = Date.now();\n\n // Use Cordova secure storage plugin\n if (isDevice) {\n startPromise = initSecureStorage();\n }\n\n // Use default browser local storage\n else {\n startPromise = initStandardStorage();\n }\n\n return startPromise\n .then(function() {\n console.debug('[storage] Started in ' + (Date.now() - now) + 'ms');\n started = true;\n startPromise = null;\n });\n }\n\n // default action\n start();\n\n return exports;\n }])\n\n\n;\n","var App;\n\nangular.module('cesium.device.services', ['cesium.utils.services', 'cesium.settings.services'])\n\n .factory('Device', ['$rootScope', '$translate', '$ionicPopup', '$q', 'ionicReady', function($rootScope, $translate, $ionicPopup, $q,\n ionicReady) {\n 'ngInject';\n\n var\n CONST = {\n MAX_HEIGHT: 400,\n MAX_WIDTH: 400\n },\n exports = {\n // workaround to quickly no is device or not (even before the ready() event)\n enable: true\n },\n cache = {},\n started = false,\n startPromise;\n\n // removeIf(device)\n // workaround to quickly no is device or not (even before the ready() event)\n exports.enable = false;\n // endRemoveIf(device)\n\n function getPicture(options) {\n if (!exports.camera.enable) {\n return $q.reject(\"Camera not enable. Please call 'ionicReady()' once before use (e.g in app.js).\");\n }\n\n // Options is the sourceType by default\n if (options && (typeof options === \"string\")) {\n options = {\n sourceType: options\n };\n }\n options = options || {};\n\n // Make sure a source type has been given (if not, ask user)\n if (angular.isUndefined(options.sourceType)) {\n return $translate(['SYSTEM.PICTURE_CHOOSE_TYPE', 'SYSTEM.BTN_PICTURE_GALLERY', 'SYSTEM.BTN_PICTURE_CAMERA'])\n .then(function(translations){\n return $ionicPopup.show({\n title: translations['SYSTEM.PICTURE_CHOOSE_TYPE'],\n buttons: [\n {\n text: translations['SYSTEM.BTN_PICTURE_GALLERY'],\n type: 'button',\n onTap: function(e) {\n return navigator.camera.PictureSourceType.PHOTOLIBRARY;\n }\n },\n {\n text: translations['SYSTEM.BTN_PICTURE_CAMERA'],\n type: 'button button-positive',\n onTap: function(e) {\n return navigator.camera.PictureSourceType.CAMERA;\n }\n }\n ]\n })\n .then(function(sourceType){\n console.info('[camera] User select sourceType:' + sourceType);\n options.sourceType = sourceType;\n return exports.camera.getPicture(options);\n });\n });\n }\n\n options.quality = options.quality || 50;\n options.destinationType = options.destinationType || navigator.camera.DestinationType.DATA_URL;\n options.encodingType = options.encodingType || navigator.camera.EncodingType.PNG;\n options.targetWidth = options.targetWidth || CONST.MAX_WIDTH;\n options.targetHeight = options.targetHeight || CONST.MAX_HEIGHT;\n return $cordovaCamera.getPicture(options);\n }\n\n function scan(n) {\n if (!exports.enable) {\n return $q.reject(\"Barcode scanner not enable. Please call 'ionicReady()' once before use (e.g in app.js).\");\n }\n var deferred = $q.defer();\n cordova.plugins.barcodeScanner.scan(\n function(result) {\n if (!result.cancelled) {\n console.debug('[device] barcode scanner scan: ' + result.text);\n deferred.resolve(result.text); // make sure to convert into String\n }\n else {\n console.debug('[device] barcode scanner scan: CANCELLED');\n deferred.resolve();\n }\n },\n function(err) {\n console.error('[device] Error while using barcode scanner: ' + err);\n deferred.reject(err);\n },\n n);\n return deferred.promise;\n }\n\n function copy(text, callback) {\n if (!exports.enable) {\n return $q.reject('Device disabled');\n }\n var deferred = $q.defer();\n $cordovaClipboard\n .copy(text)\n .then(function () {\n // success\n if (callback) {\n callback();\n }\n deferred.resolve();\n }, function () {\n // error\n deferred.reject({message: 'ERROR.COPY_CLIPBOARD'});\n });\n return deferred.promise;\n }\n\n exports.clipboard = {copy: copy};\n exports.camera = {\n getPicture : getPicture,\n scan: function(n){\n console.warn('Deprecated use of Device.camera.scan(). Use Device.barcode.scan() instead');\n return scan(n);\n }\n };\n exports.barcode = {\n enable : false,\n scan: scan\n };\n exports.keyboard = {\n enable: false,\n close: function() {\n if (!exports.keyboard.enable) return;\n cordova.plugins.Keyboard.close();\n }\n };\n\n // Numerical keyboard - fix #30\n exports.keyboard.digit = {\n settings: {\n bindModel: function(modelScope, modelPath, settings) {\n settings = settings || {};\n modelScope = modelScope || $rootScope;\n var getModelValue = function() {\n return (modelPath||'').split('.').reduce(function(res, path) {\n return res ? res[path] : undefined;\n }, modelScope);\n };\n var setModelValue = function(value) {\n var paths = (modelPath||'').split('.');\n var property = paths.length && paths[paths.length-1];\n paths.reduce(function(res, path) {\n if (path == property) {\n res[property] = value;\n return;\n }\n return res[path];\n }, modelScope);\n };\n\n settings.animation = settings.animation || 'pop';\n settings.action = settings.action || function(number) {\n setModelValue((getModelValue() ||'') + number);\n };\n if (settings.decimal) {\n settings.decimalSeparator = settings.decimalSeparator || '.';\n settings.leftButton = {\n html: '<span>.</span>',\n action: function () {\n var text = getModelValue() || '';\n // only one '.' allowed\n if (text.indexOf(settings.decimalSeparator) >= 0) return;\n // Auto add zero when started with '.'\n if (!text.trim().length) {\n text = '0';\n }\n setModelValue(text + settings.decimalSeparator);\n }\n };\n }\n settings.rightButton = settings.rightButton || {\n html: '<i class=\"icon ion-backspace-outline\"></i>',\n action: function() {\n var text = getModelValue();\n if (text && text.length) {\n text = text.slice(0, -1);\n setModelValue(text);\n }\n }\n };\n return settings;\n }\n }\n };\n\n exports.isIOS = function() {\n return !!navigator.userAgent.match(/iPhone | iPad | iPod/i) || ionic.Platform.isIOS();\n };\n\n exports.isOSX = function() {\n return !!navigator.userAgent.match(/Macintosh/i) || ionic.Platform.is(\"osx\");\n };\n\n exports.isDesktop = function() {\n if (!angular.isDefined(cache.isDesktop)) {\n try {\n // Should have NodeJs and NW\n cache.isDesktop = !exports.enable && !!process && !!nw && !!nw.App;\n } catch (err) {\n cache.isDesktop = false;\n }\n }\n return cache.isDesktop;\n };\n\n exports.isWeb = function() {\n return !exports.enable && !exports.isDesktop();\n };\n\n exports.ready = function() {\n if (started) return $q.when();\n return startPromise || exports.start();\n };\n\n exports.start = function() {\n\n startPromise = ionicReady()\n .then(function(){\n\n exports.enable = window.cordova && cordova && cordova.plugins;\n\n if (exports.enable){\n exports.camera.enable = !!navigator.camera;\n exports.keyboard.enable = cordova && cordova.plugins && !!cordova.plugins.Keyboard;\n exports.barcode.enable = cordova && cordova.plugins && !!cordova.plugins.barcodeScanner && !exports.isOSX();\n exports.clipboard.enable = cordova && cordova.plugins && !!cordova.plugins.clipboard;\n\n if (exports.keyboard.enable) {\n angular.extend(exports.keyboard, cordova.plugins.Keyboard);\n }\n\n console.debug('[device] Ionic platform ready, with [camera: {0}] [barcode scanner: {1}] [keyboard: {2}] [clipboard: {3}]'\n .format(exports.camera.enable, exports.barcode.enable, exports.keyboard.enable, exports.clipboard.enable));\n\n if (cordova.InAppBrowser) {\n console.debug('[device] Enabling InAppBrowser');\n }\n }\n else {\n console.debug('[device] Ionic platform ready - no device detected.');\n }\n\n started = true;\n startPromise = null;\n });\n\n return startPromise;\n };\n\n return exports;\n }])\n\n ;\n","\nangular.module('cesium.currency.services', ['ngApi', 'cesium.bma.services'])\n\n.factory('csCurrency', ['$rootScope', '$q', '$timeout', 'BMA', 'Api', 'csSettings', function($rootScope, $q, $timeout, BMA, Api, csSettings) {\n 'ngInject';\n\n var\n constants = {\n // Avoid to many call on well known currencies\n WELL_KNOWN_CURRENCIES: {\n g1: {\n firstBlockTime: 1488987127,\n medianTimeOffset: 3600\n }\n }\n },\n\n data = {},\n started = false,\n startPromise,\n listeners,\n api = new Api(this, \"csCurrency\");\n\n function powBase(amount, base) {\n return base <= 0 ? amount : amount * Math.pow(10, base);\n }\n\n function resetData() {\n data.name = null;\n data.parameters = null;\n data.firstBlockTime = null;\n data.membersCount = null;\n data.cache = {};\n data.node = BMA;\n data.currentUD = null;\n data.medianTimeOffset = 0;\n started = false;\n startPromise = undefined;\n api.data.raise.reset(data);\n }\n\n function loadData() {\n\n // Load currency from default node\n return $q.all([\n\n // get parameters\n loadParameters()\n .then(function(parameters) {\n // load first block info\n return loadFirstBlock(parameters.currency);\n }),\n\n // get current UD\n loadCurrentUD(),\n\n // call extensions\n api.data.raisePromise.load(data)\n ])\n .catch(function(err) {\n resetData();\n throw err;\n });\n }\n\n function loadParameters() {\n return BMA.blockchain.parameters()\n .then(function(res){\n data.name = res.currency;\n data.parameters = res;\n data.medianTimeOffset = res.avgGenTime * res.medianTimeBlocks / 2;\n return res;\n });\n }\n\n function loadFirstBlock(currencyName) {\n // Well known currencies\n if (constants.WELL_KNOWN_CURRENCIES[currencyName]){\n angular.merge(data, constants.WELL_KNOWN_CURRENCIES[currencyName]);\n return $q.when();\n }\n\n return BMA.blockchain.block({block:0})\n .then(function(json) {\n // Need by graph plugin\n data.firstBlockTime = json.medianTime;\n })\n .catch(function(err) {\n // Special case, when currency not started yet\n if (err && err.ucode === BMA.errorCodes.BLOCK_NOT_FOUND) {\n data.firstBlockTime = 0;\n data.initPhase = true;\n console.warn('[currency] Blockchain not launched: Enable init phase mode');\n return;\n }\n throw err;\n });\n }\n\n function loadCurrentUD() {\n return BMA.blockchain.stats.ud()\n .then(function(res) {\n // Special case for currency init\n if (!res.result.blocks.length) {\n data.currentUD = data.parameters ? data.parameters.ud0 : -1;\n return data.currentUD ;\n }\n return _safeLoadCurrentUD(res, res.result.blocks.length - 1);\n })\n .catch(function(err) {\n data.currentUD = null;\n throw err;\n });\n }\n\n /**\n * Load the last UD, with a workaround if last block with UD is not found in the node\n * @param res\n * @param blockIndex\n * @returns {*}\n * @private\n */\n function _safeLoadCurrentUD(res, blockIndex) {\n // Special case for currency init\n if (!res.result.blocks.length || blockIndex < 0) {\n data.currentUD = data.parameters ? data.parameters.ud0 : -1;\n return data.currentUD ;\n }\n else {\n var lastBlockWithUD = res.result.blocks[blockIndex];\n return BMA.blockchain.block({ block: lastBlockWithUD })\n .then(function(block){\n data.currentUD = powBase(block.dividend, block.unitbase);\n return data.currentUD;\n })\n .catch(function(err) {\n console.error(\"[currency] Unable to load last block with UD, with number {0}\".format(lastBlockWithUD));\n if (blockIndex > 0) {\n console.error(\"[currency] Retrying to load UD from a previous block...\");\n return _safeLoadCurrentUD(res, blockIndex-1);\n }\n data.currentUD = null;\n throw err;\n });\n }\n }\n\n function getData() {\n\n if (started) { // load only once\n return $q.when(data);\n }\n\n // Previous load not finished: return the existing promise - fix #452\n return startPromise || start();\n }\n\n function getDataField(field) {\n return function() {\n if (started) { // load only once\n return $q.when(data[field]);\n }\n\n // Previous load not finished: return the existing promise - fix #452\n return startPromise || start() // load only once\n .then(function(){\n return data[field];\n });\n };\n }\n\n function onBlock(json) {\n var block = new Block(json);\n block.cleanData(); // Remove unused content (arrays...) and keep items count\n\n //console.debug('[currency] Received new block', block);\n console.debug('[currency] Received new block {' + block.number + '-' + block.hash + '}');\n\n data.currentBlock = block;\n data.currentBlock.receivedAt = moment().utc().unix();\n\n data.medianTime = block.medianTime;\n data.membersCount = block.membersCount;\n\n // Update UD\n if (block.dividend) {\n data.currentUD = block.dividend;\n }\n\n // Dispatch to extensions\n api.data.raise.newBlock(block);\n }\n\n function addListeners() {\n listeners = [\n // Listen if node changed\n BMA.api.node.on.restart($rootScope, restart, this),\n // open web socket on block\n BMA.websocket.block().onListener(onBlock)\n ];\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function ready() {\n if (started) return $q.when(data);\n return (startPromise || start());\n }\n\n function stop() {\n console.debug('[currency] Stopping...');\n removeListeners();\n resetData();\n }\n\n function restart() {\n stop();\n return $timeout(start, 200);\n }\n\n function start(bmaAlive) {\n if (startPromise) return startPromise;\n if (started) return $q.when(data);\n\n if (!bmaAlive) {\n return BMA.ready()\n .then(function(alive) {\n if (alive) return start(alive); // Loop\n return $timeout(start, 500); // Loop, after a delay, because BMA node seems to be not alive...\n });\n }\n\n console.debug('[currency] Starting...');\n var now = Date.now();\n\n startPromise = BMA.ready()\n .then(function(started) {\n if (started) return true;\n return $timeout(function() {return start(true);}, 500);\n })\n\n // Load data\n .then(loadData)\n\n // Emit ready event\n .then(function() {\n addListeners();\n\n console.debug('[currency] Started in ' + (Date.now() - now) + 'ms');\n\n started = true;\n startPromise = null;\n\n // Emit event (used by plugins)\n api.data.raise.ready(data);\n })\n .then(function(){\n return data;\n });\n\n return startPromise;\n }\n\n var currentBlockField = getDataField('currentBlock');\n\n function getCurrent(cache) {\n // Get field (and make sure service is started)\n return currentBlockField()\n\n .then(function(currentBlock) {\n\n var now = moment().utc().unix();\n\n if (cache) {\n if (currentBlock && currentBlock.receivedAt && (now - currentBlock.receivedAt) < 60/*1min*/) {\n //console.debug('[currency] Use current block #'+ currentBlock.number +' from cache (age='+ (now - currentBlock.receivedAt) + 's)');\n return currentBlock;\n }\n\n if (!currentBlock) {\n // Should never occur, if websocket /ws/block works !\n console.warn('[currency] No current block in cache: get it from network. Websocket [/ws/block] may not be started ?');\n }\n }\n\n return BMA.blockchain.current(false)\n .catch(function(err){\n // Special case for currency init (root block not exists): use fixed values\n if (err && err.ucode == BMA.errorCodes.NO_CURRENT_BLOCK) {\n return {number: 0, hash: BMA.constants.ROOT_BLOCK_HASH, medianTime: now};\n }\n throw err;\n })\n .then(function(current) {\n data.currentBlock = current;\n data.currentBlock.receivedAt = now;\n return current;\n });\n });\n }\n\n function getLastValidBlock() {\n if (csSettings.data.blockValidityWindow <= 0) {\n return getCurrent(true);\n }\n\n return getCurrent(true)\n .then(function(current) {\n var number = current.number - csSettings.data.blockValidityWindow;\n return (number > 0) ? BMA.blockchain.block({block: number}) : current;\n });\n }\n\n // Get time in second (UTC - medianTimeOffset)\n function getDateNow() {\n return moment().utc().unix() - (data.medianTimeOffset || constants.WELL_KNOWN_CURRENCIES.g1.medianTimeOffset);\n }\n\n // TODO register new block event, to get new UD value\n\n // Register extension points\n api.registerEvent('data', 'ready');\n api.registerEvent('data', 'load');\n api.registerEvent('data', 'reset');\n api.registerEvent('data', 'newBlock');\n\n // init data\n resetData();\n\n // Default action\n //start();\n\n return {\n ready: ready,\n start: start,\n stop: stop,\n data: data,\n get: getData,\n name: getDataField('name'),\n parameters: getDataField('parameters'),\n currentUD: getDataField('currentUD'),\n medianTimeOffset: getDataField('medianTimeOffset'),\n blockchain: {\n current: getCurrent,\n lastValid: getLastValidBlock\n },\n date: {\n now: getDateNow\n },\n // api extension\n api: api,\n // deprecated methods\n default: function() {\n console.warn('[currency] \\'csCurrency.default()\\' has been DEPRECATED - Please use \\'csCurrency.get()\\' instead.');\n return getData();\n }\n };\n}]);\n","//var Base58, Base64, scrypt_module_factory = null, nacl_factory = null;\n\nangular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.settings.services'])\n\n.factory('BMA', ['$q', '$window', '$rootScope', '$timeout', 'csCrypto', 'Api', 'Device', 'UIUtils', 'csConfig', 'csSettings', 'csCache', 'csHttp', function($q, $window, $rootScope, $timeout, csCrypto, Api, Device, UIUtils, csConfig, csSettings, csCache, csHttp) {\n 'ngInject';\n\n function BMA(host, port, useSsl, useCache) {\n\n var\n id = (!host ? 'default' : '{0}:{1}'.format(host, (port || (useSsl ? '443' : '80')))), // Unique id of this instance\n cachePrefix = \"BMA-\",\n pubkey = \"[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44}\",\n // TX output conditions\n SIG = \"SIG\\\\((\" + pubkey + \")\\\\)\",\n XHX = 'XHX\\\\(([A-F0-9]{1,64})\\\\)',\n CSV = 'CSV\\\\(([0-9]{1,8})\\\\)',\n CLTV = 'CLTV\\\\(([0-9]{1,10})\\\\)',\n OUTPUT_FUNCTION = SIG+'|'+XHX+'|'+CSV+'|'+CLTV,\n OUTPUT_OPERATOR = '(&&)|(\\\\|\\\\|)',\n OUTPUT_FUNCTIONS = OUTPUT_FUNCTION+'([ ]*' + OUTPUT_OPERATOR + '[ ]*' + OUTPUT_FUNCTION +')*',\n OUTPUT_OBJ = 'OBJ\\\\(([0-9]+)\\\\)',\n OUTPUT_OBJ_OPERATOR = OUTPUT_OBJ + '[ ]*' + OUTPUT_OPERATOR + '[ ]*' + OUTPUT_OBJ,\n REGEX_ENDPOINT_PARAMS = \"( ([a-z_][a-z0-9-_.ğĞ]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))( (.+))?\",\n api = {\n BMA: 'BASIC_MERKLED_API',\n BMAS: 'BMAS',\n WS2P: 'WS2P',\n BMATOR: 'BMATOR',\n WS2PTOR: 'WS2PTOR'\n },\n regexp = {\n USER_ID: \"[0-9a-zA-Z-_]+\",\n CURRENCY: \"[0-9a-zA-Z-_]+\",\n PUBKEY: pubkey,\n PUBKEY_WITH_CHECKSUM: \"(\" + pubkey +\"):([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{3})\",\n COMMENT: \"[ a-zA-Z0-9-_:/;*\\\\[\\\\]()?!^\\\\+=@&~#{}|\\\\\\\\<>%.]*\",\n INVALID_COMMENT_CHARS: \"[^ a-zA-Z0-9-_:/;*\\\\[\\\\]()?!^\\\\+=@&~#{}|\\\\\\\\<>%.]*\",\n // duniter://[uid]:[pubkey]@[host]:[port]\n URI_WITH_AT: \"duniter://(?:([A-Za-z0-9_-]+):)?(\"+pubkey+\"@([a-zA-Z0-9-.]+.[ a-zA-Z0-9-_:/;*?!^\\\\+=@&~#|<>%.]+)\",\n URI_WITH_PATH: \"duniter://([a-zA-Z0-9-.]+.[a-zA-Z0-9-_:.]+)/(\"+pubkey+\")(?:/([A-Za-z0-9_-]+))?\",\n BMA_ENDPOINT: api.BMA + REGEX_ENDPOINT_PARAMS,\n BMAS_ENDPOINT: api.BMAS + REGEX_ENDPOINT_PARAMS,\n WS2P_ENDPOINT: api.WS2P + \" ([a-f0-9]{8})\"+ REGEX_ENDPOINT_PARAMS,\n BMATOR_ENDPOINT: api.BMATOR + \" ([a-z0-9-_.]*|[0-9.]+|[0-9a-f:]+.onion)(?: ([0-9]+))?\",\n WS2PTOR_ENDPOINT: api.WS2PTOR + \" ([a-f0-9]{8}) ([a-z0-9-_.]*|[0-9.]+|[0-9a-f:]+.onion)(?: ([0-9]+))?(?: (.+))?\"\n },\n errorCodes = {\n REVOCATION_ALREADY_REGISTERED: 1002,\n HTTP_LIMITATION: 1006,\n IDENTITY_SANDBOX_FULL: 1007,\n NO_MATCHING_IDENTITY: 2001,\n UID_ALREADY_USED: 2003,\n NO_MATCHING_MEMBER: 2004,\n NO_IDTY_MATCHING_PUB_OR_UID: 2021,\n WRONG_SIGNATURE_MEMBERSHIP: 2006,\n MEMBERSHIP_ALREADY_SEND: 2007,\n NO_CURRENT_BLOCK: 2010,\n BLOCK_NOT_FOUND: 2011,\n SOURCE_ALREADY_CONSUMED: 2015,\n TX_INPUTS_OUTPUTS_NOT_EQUAL: 2024,\n TX_OUTPUT_SUM_NOT_EQUALS_PREV_DELTAS: 2025,\n TX_ALREADY_PROCESSED: 2030\n },\n constants = {\n PROTOCOL_VERSION: 10,\n ROOT_BLOCK_HASH: 'E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855',\n LIMIT_REQUEST_COUNT: 5, // simultaneous async request to a Duniter node\n LIMIT_REQUEST_DELAY: 1000, // time (in ms) to wait between to call of a rest request\n regexp: regexp,\n api: api\n },\n listeners,\n that = this;\n\n that.raw = {\n getByPath: {},\n postByPath: {},\n wsByPath: {}\n };\n that.api = new Api(this, 'BMA-' + id);\n that.started = false;\n that.init = init;\n\n // Allow to force SSL connection with port different from 443\n that.forceUseSsl = (csConfig.httpsMode === 'true' || csConfig.httpsMode === true || csConfig.httpsMode === 'force') ||\n ($window.location && $window.location.protocol === 'https:') ? true : false;\n if (that.forceUseSsl) {\n console.debug('[BMA] Enable SSL (forced by config or detected in URL)');\n }\n\n if (host) init(host, port, useSsl);\n that.useCache = angular.isDefined(useCache) ? useCache : true; // need here because used in get() function\n\n function init(host, port, useSsl) {\n if (that.started) that.stop();\n that.alive = false;\n\n // Use settings as default, if exists\n if (csSettings.data && csSettings.data.node) {\n host = host || csSettings.data.node.host;\n port = port || csSettings.data.node.port;\n\n useSsl = angular.isDefined(useSsl) ? useSsl : (port == 443 || csSettings.data.node.useSsl || that.forceUseSsl);\n }\n\n if (!host) {\n return; // could not init yet\n }\n that.host = host;\n that.port = port || 80;\n that.useSsl = angular.isDefined(useSsl) ? useSsl : (that.port == 443 || that.forceUseSsl);\n that.server = csHttp.getServer(host, port);\n that.url = csHttp.getUrl(host, port, ''/*path*/, useSsl);\n }\n\n function exact(regexpContent) {\n return new RegExp(\"^\" + regexpContent + \"$\");\n }\n\n function test(regexpContent) {\n return new RegExp(regexpContent);\n }\n\n function closeWs() {\n if (!that.raw) return;\n\n console.warn('[BMA] Closing all websockets...');\n _.keys(that.raw.wsByPath||{}).forEach(function(key) {\n var sock = that.raw.wsByPath[key];\n sock.close();\n });\n that.raw.wsByPath = {};\n }\n\n function cleanCache() {\n console.debug(\"[BMA] Cleaning cache {prefix: '{0}'}...\".format(cachePrefix));\n csCache.clear(cachePrefix);\n\n // Clean raw requests by path cache\n that.raw.getByPath = {};\n that.raw.postByPath = {};\n that.raw.wsByPath = {};\n }\n\n function get(path, cacheTime) {\n\n cacheTime = that.useCache && cacheTime || 0 /* no cache*/ ;\n var requestKey = path + (cacheTime ? ('#'+cacheTime) : '');\n\n var getRequestFn = function(params) {\n\n if (!that.started) {\n if (!that._startPromise) {\n console.warn('[BMA] Trying to get [{0}] before start(). Waiting...'.format(path));\n }\n return that.ready().then(function() {\n return getRequestFn(params);\n });\n }\n\n var request = that.raw.getByPath[requestKey];\n if (!request) {\n if (cacheTime) {\n request = csHttp.getWithCache(that.host, that.port, path, that.useSsl, cacheTime, null, null, cachePrefix);\n }\n else {\n request = csHttp.get(that.host, that.port, path, that.useSsl);\n }\n that.raw.getByPath[requestKey] = request;\n }\n var execCount = 1;\n return request(params)\n .catch(function(err){\n // If node return too many requests error\n if (err && err.ucode === exports.errorCodes.HTTP_LIMITATION) {\n // If max number of retry not reach\n if (execCount <= exports.constants.LIMIT_REQUEST_COUNT) {\n if (execCount === 1) {\n console.warn(\"[BMA] Too many HTTP requests: Will wait then retry...\");\n // Update the loading message (if exists)\n UIUtils.loading.update({template: \"COMMON.LOADING_WAIT\"});\n }\n // Wait 1s then retry\n return $timeout(function() {\n execCount++;\n return request(params);\n }, exports.constants.LIMIT_REQUEST_DELAY);\n }\n }\n throw err;\n });\n };\n\n return getRequestFn;\n }\n\n function post(path) {\n var postRequest = function(obj, params) {\n if (!that.started) {\n if (!that._startPromise) {\n console.error('[BMA] Trying to post [{0}] before start()...'.format(path));\n }\n return that.ready().then(function() {\n return postRequest(obj, params);\n });\n }\n\n var request = that.raw.postByPath[path];\n if (!request) {\n request = csHttp.post(that.host, that.port, path, that.useSsl);\n that.raw.postByPath[path] = request;\n }\n return request(obj, params);\n };\n\n return postRequest;\n }\n\n function ws(path) {\n return function() {\n var sock = that.raw.wsByPath[path];\n if (!sock || sock.isClosed()) {\n sock = csHttp.ws(that.host, that.port, path, that.useSsl);\n\n // When close, remove from cache\n sock.onclose = function() {\n delete that.raw.wsByPath[path];\n };\n\n that.raw.wsByPath[path] = sock;\n }\n return sock;\n };\n }\n\n that.isAlive = function(node) {\n node = node || that;\n // WARN:\n // - Cannot use previous get() function, because\n // node can be !=that, or not be started yet\n // - Do NOT use cache here\n return csHttp.get(node.host, node.port, '/node/summary', node.useSsl)()\n .then(function(json) {\n var software = json && json.duniter && json.duniter.software;\n var isCompatible = true;\n\n // Check duniter min version\n if (software === 'duniter' && json.duniter.version) {\n isCompatible = csHttp.version.isCompatible(csSettings.data.minVersion, json.duniter.version);\n }\n // TODO: check version of other software (DURS, Juniter, etc.)\n else {\n console.debug('[BMA] Unknown node software [{0} v{1}]: could not check compatibility.'.format(software || '?', json.duniter.version || '?'));\n }\n if (!isCompatible) {\n console.error('[BMA] Incompatible node [{0} v{1}]: expected at least v{2}'.format(software, json.duniter.version, csSettings.data.minVersion));\n }\n return isCompatible;\n })\n .catch(function() {\n return false;\n });\n };\n\n function isSameNode(node2) {\n node2 = node2 || {};\n node2.useSsl = angular.isDefined(node2.useSsl) ? node2.useSsl : (node2.port && node2.port == 443);\n // Same host\n return that.host === node2.host &&\n // Same port\n ((!that.port && !node2.port2) || (that.port == node2.port2||80)) &&\n // Same useSsl\n (that.useSsl === node2.useSsl);\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n listeners = [\n // Listen if node changed\n csSettings.api.data.on.changed($rootScope, onSettingsChanged, this)\n ];\n }\n\n function onSettingsChanged(settings) {\n // Wait 1s (because settings controller can have restart the service), then copy the settings node\n $timeout(function() {\n exports.copy(settings.node);\n }, 1000);\n }\n\n that.isStarted = function() {\n return that.started;\n };\n\n that.ready = function() {\n if (that.started) return $q.when(that.alive);\n return (that._startPromise || that.start());\n };\n\n that.start = function() {\n if (that._startPromise) return that._startPromise;\n if (that.started) return $q.when(that.alive);\n\n if (!that.host) {\n return csSettings.ready()\n .then(function() {\n that.init();\n\n // Always enable cache\n that.useCache = true;\n\n return that.start(); // recursive call\n });\n }\n\n console.debug(\"[BMA] Starting {0} {ssl: {1})...\".format(that.server, that.useSsl));\n var now = Date.now();\n\n that._startPromise = $q.all([\n csSettings.ready(),\n that.isAlive()\n ])\n .then(function(res) {\n that.alive = res[1];\n if (!that.alive) {\n console.error(\"[BMA] Could not start {0} : unreachable\".format(that.server));\n that.started = true;\n delete that._startPromise;\n return false;\n }\n\n // Add listeners\n if (!listeners || !listeners.length) {\n addListeners();\n }\n console.debug('[BMA] Started in '+(Date.now()-now)+'ms');\n\n that.api.node.raise.start();\n that.started = true;\n delete that._startPromise;\n return true;\n });\n return that._startPromise;\n };\n\n that.stop = function() {\n if (!that.started && !that._startPromise) return $q.when(); // Skip multiple call\n\n console.debug('[BMA] Stopping...');\n\n removeListeners();\n delete that._startPromise;\n\n if (that.alive) {\n closeWs();\n cleanCache();\n that.alive = false;\n that.started = false;\n that.api.node.raise.stop();\n }\n else {\n that.started = false;\n }\n return $q.when();\n };\n\n that.restart = function() {\n that.stop();\n return $timeout(that.start, 200)\n .then(function(alive) {\n if (alive) {\n that.api.node.raise.restart();\n }\n return alive;\n });\n };\n\n that.api.registerEvent('node', 'start');\n that.api.registerEvent('node', 'stop');\n that.api.registerEvent('node', 'restart');\n\n var exports = {\n errorCodes: errorCodes,\n constants: constants,\n regexp: {\n USER_ID: exact(regexp.USER_ID),\n COMMENT: exact(regexp.COMMENT),\n PUBKEY: exact(regexp.PUBKEY),\n PUBKEY_WITH_CHECKSUM: exact(regexp.PUBKEY_WITH_CHECKSUM),\n CURRENCY: exact(regexp.CURRENCY),\n URI: exact(regexp.URI),\n BMA_ENDPOINT: exact(regexp.BMA_ENDPOINT),\n BMAS_ENDPOINT: exact(regexp.BMAS_ENDPOINT),\n WS2P_ENDPOINT: exact(regexp.WS2P_ENDPOINT),\n BMATOR_ENDPOINT: exact(regexp.BMATOR_ENDPOINT),\n WS2PTOR_ENDPOINT: exact(regexp.WS2PTOR_ENDPOINT),\n // TX output conditions\n TX_OUTPUT_SIG: exact(SIG),\n TX_OUTPUT_FUNCTION: test(OUTPUT_FUNCTION),\n TX_OUTPUT_OBJ_OPERATOR_AND: test(OUTPUT_OBJ + '([ ]*&&[ ]*(' + OUTPUT_OBJ + '))+'),\n TX_OUTPUT_OBJ_OPERATOR_OR: test(OUTPUT_OBJ + '([ ]*\\\\|\\\\|[ ]*(' + OUTPUT_OBJ + '))+'),\n TX_OUTPUT_OBJ: test(OUTPUT_OBJ),\n TX_OUTPUT_OBJ_OPERATOR: test(OUTPUT_OBJ_OPERATOR),\n TX_OUTPUT_OBJ_PARENTHESIS: test('\\\\(('+OUTPUT_OBJ+')\\\\)'),\n TX_OUTPUT_FUNCTIONS: test(OUTPUT_FUNCTIONS)\n },\n node: {\n summary: get('/node/summary', csCache.constants.LONG),\n same: isSameNode,\n forceUseSsl: that.forceUseSsl\n },\n network: {\n peering: {\n self: get('/network/peering'),\n peers: get('/network/peering/peers')\n },\n peers: get('/network/peers'),\n ws2p: {\n info: get('/network/ws2p/info'),\n heads: get('/network/ws2p/heads')\n }\n },\n wot: {\n lookup: get('/wot/lookup/:search'),\n certifiedBy: get('/wot/certified-by/:pubkey', csCache.constants.SHORT),\n certifiersOf: get('/wot/certifiers-of/:pubkey', csCache.constants.SHORT),\n member: {\n all: get('/wot/members', csCache.constants.LONG),\n pending: get('/wot/pending', csCache.constants.SHORT)\n },\n requirements: function(params, cache) {\n // No cache by default\n if (cache !== true) return exports.raw.wot.requirements(params);\n return exports.raw.wot.requirementsWithCache(params);\n },\n add: post('/wot/add'),\n certify: post('/wot/certify'),\n revoke: post('/wot/revoke')\n },\n blockchain: {\n parameters: get('/blockchain/parameters', csCache.constants.VERY_LONG),\n block: get('/blockchain/block/:block', csCache.constants.SHORT),\n blocksSlice: get('/blockchain/blocks/:count/:from'),\n current: function(cache) {\n // No cache by default\n return (cache !== true) ? exports.raw.blockchain.current() : exports.raw.blockchain.currentWithCache();\n },\n membership: post('/blockchain/membership'),\n stats: {\n ud: get('/blockchain/with/ud', csCache.constants.MEDIUM),\n tx: get('/blockchain/with/tx'),\n newcomers: get('/blockchain/with/newcomers', csCache.constants.MEDIUM),\n hardship: get('/blockchain/hardship/:pubkey'),\n difficulties: get('/blockchain/difficulties')\n }\n },\n tx: {\n sources: get('/tx/sources/:pubkey', csCache.constants.SHORT),\n process: post('/tx/process'),\n history: {\n all: function(params) {\n return exports.raw.tx.history.all(params)\n .then(function(res) {\n res.history = res.history || {};\n // Clean sending and pendings, because already returned by tx/history/:pubkey/pending\n res.history.sending = [];\n res.history.pendings = [];\n return res;\n });\n },\n times: function(params, cache) {\n // No cache by default\n return ((cache !== true) ? exports.raw.tx.history.times(params) : exports.raw.tx.history.timesWithCache(params))\n .then(function(res) {\n res.history = res.history || {};\n // Clean sending and pendings, because already returned by tx/history/:pubkey/pending\n res.history.sending = [];\n res.history.pendings = [];\n return res;\n });\n },\n blocks: get('/tx/history/:pubkey/blocks/:from/:to', csCache.constants.LONG),\n pending: get('/tx/history/:pubkey/pending')\n }\n },\n ud: {\n history: get('/ud/history/:pubkey')\n },\n uri: {},\n version: {},\n raw: {\n blockchain: {\n currentWithCache: get('/blockchain/current', csCache.constants.SHORT),\n current: get('/blockchain/current')\n },\n wot: {\n requirementsWithCache: get('/wot/requirements/:pubkey', csCache.constants.LONG),\n requirements: get('/wot/requirements/:pubkey')\n },\n tx: {\n history: {\n timesWithCache: get('/tx/history/:pubkey/times/:from/:to', csCache.constants.LONG),\n times: get('/tx/history/:pubkey/times/:from/:to'),\n all: get('/tx/history/:pubkey')\n }\n },\n }\n };\n\n exports.tx.parseUnlockCondition = function(unlockCondition) {\n\n //console.debug('[BMA] Parsing unlock condition: {0}.'.format(unlockCondition));\n var convertedOutput = unlockCondition;\n var treeItems = [];\n var treeItem;\n var treeItemId;\n var childrenContent;\n var childrenMatches;\n var functions = {};\n\n // Parse functions, then replace with an 'OBJ()' generic function, used to build a object tree\n var matches = exports.regexp.TX_OUTPUT_FUNCTION.exec(convertedOutput);\n while(matches) {\n treeItem = {};\n treeItemId = 'OBJ(' + treeItems.length + ')';\n treeItem.type = convertedOutput.substr(matches.index, matches[0].indexOf('('));\n treeItem.value = matches[1] || matches[2] || matches[3] || matches[4]; // get value from regexp OUTPUT_FUNCTION\n treeItems.push(treeItem);\n\n functions[treeItem.type] = functions[treeItem.type]++ || 1;\n\n convertedOutput = convertedOutput.replace(matches[0], treeItemId);\n matches = exports.regexp.TX_OUTPUT_FUNCTION.exec(convertedOutput);\n }\n\n var loop = true;\n while(loop) {\n // Parse AND operators\n matches = exports.regexp.TX_OUTPUT_OBJ_OPERATOR_AND.exec(convertedOutput);\n loop = !!matches;\n while (matches) {\n treeItem = {};\n treeItemId = 'OBJ(' + treeItems.length + ')';\n treeItem.type = 'AND';\n treeItem.children = [];\n treeItems.push(treeItem);\n\n childrenContent = matches[0];\n childrenMatches = exports.regexp.TX_OUTPUT_OBJ.exec(childrenContent);\n while(childrenMatches) {\n\n treeItem.children.push(treeItems[childrenMatches[1]]);\n childrenContent = childrenContent.replace(childrenMatches[0], '');\n childrenMatches = exports.regexp.TX_OUTPUT_OBJ.exec(childrenContent);\n }\n\n convertedOutput = convertedOutput.replace(matches[0], treeItemId);\n matches = exports.regexp.TX_OUTPUT_OBJ_OPERATOR_AND.exec(childrenContent);\n }\n\n // Parse OR operators\n\n matches = exports.regexp.TX_OUTPUT_OBJ_OPERATOR_OR.exec(convertedOutput);\n loop = loop || !!matches;\n while (matches) {\n treeItem = {};\n treeItemId = 'OBJ(' + treeItems.length + ')';\n treeItem.type = 'OR';\n treeItem.children = [];\n treeItems.push(treeItem);\n\n childrenContent = matches[0];\n childrenMatches = exports.regexp.TX_OUTPUT_OBJ.exec(childrenContent);\n while(childrenMatches) {\n treeItem.children.push(treeItems[childrenMatches[1]]);\n childrenContent = childrenContent.replace(childrenMatches[0], '');\n childrenMatches = exports.regexp.TX_OUTPUT_OBJ.exec(childrenContent);\n }\n\n convertedOutput = convertedOutput.replace(matches[0], treeItemId);\n matches = exports.regexp.TX_OUTPUT_OBJ_OPERATOR_AND.exec(convertedOutput);\n }\n\n // Remove parenthesis\n matches = exports.regexp.TX_OUTPUT_OBJ_PARENTHESIS.exec(convertedOutput);\n loop = loop || !!matches;\n while (matches) {\n convertedOutput = convertedOutput.replace(matches[0], matches[1]);\n matches = exports.regexp.TX_OUTPUT_OBJ_PARENTHESIS.exec(convertedOutput);\n }\n }\n\n functions = _.keys(functions);\n if (functions.length === 0) {\n console.error('[BMA] Unparseable unlock condition: ', output);\n return;\n }\n console.debug('[BMA] Unlock conditions successfully parsed:', treeItem);\n return {\n unlockFunctions: functions,\n unlockTree: treeItem\n };\n };\n\n exports.node.parseEndPoint = function(endpoint, epPrefix) {\n // Try BMA\n var matches = exports.regexp.BMA_ENDPOINT.exec(endpoint);\n if (matches) {\n return {\n \"dns\": matches[2] || '',\n \"ipv4\": matches[4] || '',\n \"ipv6\": matches[6] || '',\n \"port\": matches[8] || 80,\n \"useSsl\": matches[8] && matches[8] == 443,\n \"path\": matches[10],\n \"useBma\": true\n };\n }\n // Try BMAS\n matches = exports.regexp.BMAS_ENDPOINT.exec(endpoint);\n if (matches) {\n return {\n \"dns\": matches[2] || '',\n \"ipv4\": matches[4] || '',\n \"ipv6\": matches[6] || '',\n \"port\": matches[8] || 80,\n \"useSsl\": true,\n \"path\": matches[10],\n \"useBma\": true\n };\n }\n // Try BMATOR\n matches = exports.regexp.BMATOR_ENDPOINT.exec(endpoint);\n if (matches) {\n return {\n \"dns\": matches[1] || '',\n \"port\": matches[2] || 80,\n \"useSsl\": false,\n \"useTor\": true,\n \"useBma\": true\n };\n }\n // Try WS2P\n matches = exports.regexp.WS2P_ENDPOINT.exec(endpoint);\n if (matches) {\n return {\n \"ws2pid\": matches[1] || '',\n \"dns\": matches[3] || '',\n \"ipv4\": matches[5] || '',\n \"ipv6\": matches[7] || '',\n \"port\": matches[9] || 80,\n \"useSsl\": matches[9] && matches[9] == 443,\n \"path\": matches[11] || '',\n \"useWs2p\": true\n };\n }\n // Try WS2PTOR\n matches = exports.regexp.WS2PTOR_ENDPOINT.exec(endpoint);\n if (matches) {\n return {\n \"ws2pid\": matches[1] || '',\n \"dns\": matches[2] || '',\n \"port\": matches[3] || 80,\n \"path\": matches[4] || '',\n \"useSsl\": false,\n \"useTor\": true,\n \"useWs2p\": true\n };\n }\n\n // Use generic match\n if (epPrefix) {\n matches = exact(epPrefix + REGEX_ENDPOINT_PARAMS).exec(endpoint);\n if (matches) {\n return {\n \"dns\": matches[2] || '',\n \"ipv4\": matches[4] || '',\n \"ipv6\": matches[6] || '',\n \"port\": matches[8] || 80,\n \"useSsl\": matches[8] && matches[8] == 443,\n \"path\": matches[10],\n \"useBma\": false\n };\n }\n }\n\n };\n\n exports.copy = function(otherNode) {\n\n var server = csHttp.getUrl(otherNode.host, otherNode.port, ''/*path*/, otherNode.useSsl);\n var hasChanged = (server !== that.url);\n if (hasChanged) {\n var wasStarted = that.started;\n if (wasStarted) that.stop();\n that.init(otherNode.host, otherNode.port, otherNode.useSsl, that.useCache/*keep original value*/);\n if (wasStarted) {\n return $timeout(function () {\n return that.start()\n .then(function (alive) {\n if (alive) {\n that.api.node.raise.restart();\n }\n return alive;\n });\n }, 200); // Wait stop finished\n }\n }\n };\n\n exports.wot.member.uids = function() {\n return exports.wot.member.all()\n .then(function(res){\n return res.results.reduce(function(res, member){\n res[member.pubkey] = member.uid;\n return res;\n }, {});\n });\n };\n\n exports.wot.member.get = function(pubkey) {\n return exports.wot.member.uids()\n .then(function(memberUidsByPubkey){\n var uid = memberUidsByPubkey[pubkey];\n return {\n pubkey: pubkey,\n uid: (uid ? uid : null)\n };\n });\n };\n\n exports.wot.member.getByUid = function(uid) {\n return exports.wot.member.all()\n .then(function(res){\n return _.findWhere(res.results, {uid: uid});\n });\n };\n\n /**\n * Return all expected blocks\n * @param blockNumbers a rray of block number\n */\n exports.blockchain.blocks = function(blockNumbers){\n return exports.raw.getHttpRecursive(exports.blockchain.block, 'block', blockNumbers);\n };\n\n /**\n * Return all expected blocks\n * @param blockNumbers a rray of block number\n */\n exports.network.peering.peersByLeaves = function(leaves){\n return exports.raw.getHttpRecursive(exports.network.peering.peers, 'leaf', leaves, 0, 10);\n };\n\n exports.raw.getHttpRecursive = function(httpGetRequest, paramName, paramValues, offset, size) {\n offset = angular.isDefined(offset) ? offset : 0;\n size = size || exports.constants.LIMIT_REQUEST_COUNT;\n return $q(function(resolve, reject) {\n var result = [];\n var jobs = [];\n _.each(paramValues.slice(offset, offset+size), function(paramValue) {\n var requestParams = {};\n requestParams[paramName] = paramValue;\n jobs.push(\n httpGetRequest(requestParams)\n .then(function(res){\n if (!res) return;\n result.push(res);\n })\n );\n });\n\n $q.all(jobs)\n .then(function() {\n if (offset < paramValues.length - 1) {\n $timeout(function() {\n exports.raw.getHttpRecursive(httpGetRequest, paramName, paramValues, offset+size, size)\n .then(function(res) {\n if (!res || !res.length) {\n resolve(result);\n return;\n }\n\n resolve(result.concat(res));\n })\n .catch(function(err) {\n reject(err);\n });\n }, exports.constants.LIMIT_REQUEST_DELAY);\n }\n else {\n resolve(result);\n }\n })\n .catch(function(err){\n if (err && err.ucode === exports.errorCodes.HTTP_LIMITATION) {\n resolve(result);\n }\n else {\n reject(err);\n }\n });\n });\n };\n\n exports.raw.getHttpWithRetryIfLimitation = function(exec) {\n return exec()\n .catch(function(err){\n // When too many request, retry in 3s\n if (err && err.ucode == exports.errorCodes.HTTP_LIMITATION) {\n return $timeout(function() {\n // retry\n return exports.raw.getHttpWithRetryIfLimitation(exec);\n }, exports.constants.LIMIT_REQUEST_DELAY);\n }\n });\n };\n\n exports.blockchain.lastUd = function() {\n return exports.blockchain.stats.ud()\n .then(function(res) {\n if (!res.result.blocks || !res.result.blocks.length) {\n return null;\n }\n var lastBlockWithUD = res.result.blocks[res.result.blocks.length - 1];\n return exports.blockchain.block({block: lastBlockWithUD})\n .then(function(block){\n return (block.unitbase > 0) ? block.dividend * Math.pow(10, block.unitbase) : block.dividend;\n });\n });\n };\n\n exports.uri.parse = function(uri) {\n return $q(function(resolve, reject) {\n var pubkey;\n\n // If pubkey: not need to parse\n if (exact(regexp.PUBKEY).test(uri)) {\n resolve({\n pubkey: uri\n });\n }\n // If pubkey+checksum\n else if (exact(regexp.PUBKEY_WITH_CHECKSUM).test(uri)) {\n console.debug(\"[BMA.parse] Detecting a pubkey with checksum: \" + uri);\n var matches = exports.regexp.PUBKEY_WITH_CHECKSUM.exec(uri);\n pubkey = matches[1];\n var checksum = matches[2];\n console.debug(\"[BMA.parse] Detecting a pubkey {\"+pubkey+\"} with checksum {\" + checksum + \"}\");\n var expectedChecksum = csCrypto.util.pkChecksum(pubkey);\n console.debug(\"[BMA.parse] Expecting checksum for pubkey is {\" + expectedChecksum + \"}\");\n if (checksum != expectedChecksum) {\n reject( {message: 'ERROR.PUBKEY_INVALID_CHECKSUM'});\n }\n else {\n resolve({\n pubkey: pubkey\n });\n }\n }\n else if(uri.startsWith('duniter://')) {\n var parser = csHttp.uri.parse(uri),\n uid,\n currency = parser.host.indexOf('.') === -1 ? parser.host : null,\n host = parser.host.indexOf('.') !== -1 ? parser.host : null;\n if (parser.username) {\n if (parser.password) {\n uid = parser.username;\n pubkey = parser.password;\n }\n else {\n pubkey = parser.username;\n }\n }\n if (parser.pathname) {\n var paths = parser.pathname.split('/');\n var pathCount = !paths ? 0 : paths.length;\n var index = 0;\n if (!currency && pathCount > index) {\n currency = paths[index++];\n }\n if (!pubkey && pathCount > index) {\n pubkey = paths[index++];\n }\n if (!uid && pathCount > index) {\n uid = paths[index++];\n }\n if (pathCount > index) {\n reject( {message: 'Bad Duniter URI format. Invalid path (incomplete or redundant): '+ parser.pathname}); return;\n }\n }\n\n if (!currency){\n if (host) {\n csHttp.get(host + '/blockchain/parameters')()\n .then(function(parameters){\n resolve({\n uid: uid,\n pubkey: pubkey,\n host: host,\n currency: parameters.currency\n });\n })\n .catch(function(err) {\n console.error(err);\n reject({message: 'Could not get node parameter. Currency could not be retrieve'});\n });\n }\n else {\n reject({message: 'Bad Duniter URI format. Missing currency name (or node address).'}); return;\n }\n }\n else {\n if (!host) {\n resolve({\n uid: uid,\n pubkey: pubkey,\n currency: currency\n });\n }\n\n // Check if currency are the same (between node and uri)\n return csHttp.get(host + '/blockchain/parameters')()\n .then(function(parameters){\n if (parameters.currency !== currency) {\n reject( {message: \"Node's currency [\"+parameters.currency+\"] does not matched URI's currency [\"+currency+\"].\"}); return;\n }\n resolve({\n uid: uid,\n pubkey: pubkey,\n host: host,\n currency: currency\n });\n })\n .catch(function(err) {\n console.error(err);\n reject({message: 'Could not get node parameter. Currency could not be retrieve'});\n });\n }\n }\n else {\n console.debug(\"[BMA.parse] Could not parse URI: \" + uri);\n reject({message: 'ERROR.UNKNOWN_URI_FORMAT'});\n }\n })\n\n // Check values against regex\n .then(function(result) {\n if (!result) return;\n if (result.pubkey && !(exact(regexp.PUBKEY).test(result.pubkey))) {\n throw {message: \"Invalid pubkey format [\" + result.pubkey + \"]\"};\n }\n if (result.uid && !(exact(regexp.USER_ID).test(result.uid))) {\n throw {message: \"Invalid uid format [\" + result.uid + \"]\"};\n }\n if (result.currency && !(exact(regexp.CURRENCY).test(result.currency))) {\n throw {message: \"Invalid currency format [\"+result.currency+\"]\"};\n }\n return result;\n });\n };\n\n // Define get latest release (or fake function is no URL defined)\n var duniterLatestReleaseUrl = csSettings.data.duniterLatestReleaseUrl && csHttp.uri.parse(csSettings.data.duniterLatestReleaseUrl);\n exports.raw.getLatestRelease = duniterLatestReleaseUrl ?\n csHttp.getWithCache(duniterLatestReleaseUrl.host,\n duniterLatestReleaseUrl.port,\n \"/\" + duniterLatestReleaseUrl.pathname,\n /*useSsl*/ (+(duniterLatestReleaseUrl.port) === 443 || duniterLatestReleaseUrl.protocol === 'https:' || that.forceUseSsl),\n csCache.constants.LONG\n ) :\n // No URL define: use a fake function\n function() {\n return $q.when();\n };\n\n exports.version.latest = function() {\n return exports.raw.getLatestRelease()\n .then(function (json) {\n if (!json) return;\n if (json.name && json.html_url) {\n return {\n version: json.name,\n url: json.html_url\n };\n }\n if (json.tag_name && json.html_url) {\n return {\n version: json.tag_name.substring(1),\n url: json.html_url\n };\n }\n })\n .catch(function(err) {\n // silent (just log it)\n console.error('[BMA] Failed to get Duniter latest version', err);\n });\n };\n\n exports.websocket = {\n block: ws('/ws/block'),\n peer: ws('/ws/peer'),\n close : closeWs\n };\n\n angular.merge(that, exports);\n }\n\n var service = new BMA();\n\n service.instance = function(host, port, useSsl, useCache) {\n useCache = angular.isDefined(useCache) ? useCache : false; // No cache by default\n return new BMA(host, port, useSsl, useCache);\n };\n\n service.lightInstance = function(host, port, useSsl, timeout) {\n port = port || 80;\n useSsl = angular.isDefined(useSsl) ? useSsl : (port == 443);\n return {\n host: host,\n port: port,\n useSsl: useSsl,\n url: csHttp.getUrl(host, port, ''/*no path*/, useSsl),\n node: {\n summary: csHttp.getWithCache(host, port, '/node/summary', useSsl, csCache.constants.MEDIUM, false/*autoRefresh*/, timeout)\n },\n network: {\n peering: {\n self: csHttp.get(host, port, '/network/peering', useSsl, timeout)\n },\n peers: csHttp.get(host, port, '/network/peers', useSsl, timeout)\n },\n blockchain: {\n current: csHttp.get(host, port, '/blockchain/current', useSsl, timeout),\n stats: {\n hardship: csHttp.get(host, port, '/blockchain/hardship/:pubkey', useSsl, timeout)\n }\n }\n };\n };\n\n // default action\n //service.start();\n\n return service;\n}])\n\n;\n","\nangular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.crypto.services', 'cesium.utils.services',\n 'cesium.settings.services'])\n\n.factory('csWot', ['$rootScope', '$q', '$timeout', 'BMA', 'Api', 'CacheFactory', 'UIUtils', 'csConfig', 'csCurrency', 'csSettings', 'csCache', function($rootScope, $q, $timeout, BMA, Api, CacheFactory, UIUtils, csConfig, csCurrency, csSettings, csCache) {\n 'ngInject';\n\n\n var\n api = new Api(this, \"csWot\"),\n cachePrefix = 'csWot-',\n identityCache = csCache.get(cachePrefix + 'idty-', csCache.constants.MEDIUM),\n requirementsCache = csCache.get(cachePrefix + 'requirements-', csCache.constants.MEDIUM),\n\n // Add id, and remove duplicated id\n _addUniqueIds = function(idties) {\n var idtyKeys = {};\n return idties.reduce(function(res, idty) {\n idty.id = idty.id || idty.uid + '-' + idty.pubkey;\n if (!idtyKeys[idty.id]) {\n idtyKeys[idty.id] = true;\n return res.concat(idty);\n }\n return res;\n }, []);\n },\n\n _sortAndSliceIdentities = function(idties, offset, size) {\n offset = offset || 0;\n\n // Add unique ids\n idties = _addUniqueIds(idties);\n\n // Sort by block and\n idties = _.sortBy(idties, function(idty){\n var score = 1;\n score += (1000000 * (idty.block));\n score += (10 * (900 - idty.uid.toLowerCase().charCodeAt(0)));\n return -score;\n });\n if (angular.isDefined(size) && idties.length > size) {\n idties = idties.slice(offset, offset+size); // limit if more than expected size\n }\n\n\n return idties;\n },\n\n _sortCertifications = function(certifications) {\n certifications = _.sortBy(certifications, function(cert){\n var score = 1;\n score += (1000000000000 * (cert.expiresIn ? cert.expiresIn : 0));\n score += (10000000 * (cert.isMember ? 1 : 0));\n score += (10 * (cert.block ? cert.block : 0));\n return -score;\n });\n return certifications;\n },\n\n _resetRequirements = function(data) {\n data.requirements = {\n loaded: false,\n meta: {},\n hasSelf: false,\n needSelf: true,\n needMembership: true,\n canMembershipOut: false,\n needRenew: false,\n pendingMembership: false,\n isMember: false,\n wasMember: false,\n certificationCount: 0,\n needCertifications: false,\n needCertificationCount: 0,\n willNeedCertificationCount: 0,\n alternatives: undefined\n };\n data.blockUid = null;\n data.isMember = false;\n data.sigDate = null;\n data.hasSelf = false;\n },\n\n _fillRequirements = function(requirements, currencyParameters) {\n // Add useful custom fields\n requirements.hasSelf = !!requirements.meta.timestamp;\n requirements.needSelf = !requirements.hasSelf || requirements.meta.invalid;\n requirements.wasMember = angular.isDefined(requirements.wasMember) ? requirements.wasMember : false; // Compat with Duniter 0.9\n requirements.needMembership = (!requirements.revoked && requirements.membershipExpiresIn <= 0 && requirements.membershipPendingExpiresIn <= 0 && !requirements.wasMember);\n requirements.needRenew = (!requirements.needMembership && !requirements.revoked &&\n requirements.membershipExpiresIn <= csSettings.data.timeWarningExpireMembership &&\n requirements.membershipPendingExpiresIn <= 0) ||\n (requirements.wasMember && !requirements.revoked && requirements.membershipExpiresIn === 0 &&\n requirements.membershipPendingExpiresIn === 0);\n requirements.canMembershipOut = (!requirements.revoked && requirements.membershipExpiresIn > 0);\n requirements.pendingMembership = (!requirements.revoked && requirements.membershipExpiresIn <= 0 && requirements.membershipPendingExpiresIn > 0);\n requirements.isMember = (!requirements.revoked && requirements.membershipExpiresIn > 0);\n requirements.blockUid = requirements.meta.timestamp;\n // Force certification count to 0, is not a member yet - fix #269\n requirements.certificationCount = ((requirements.isMember || (requirements.wasMember && !requirements.expired)) && requirements.certifications) ? requirements.certifications.length : 0;\n requirements.willExpireCertificationCount = requirements.certifications ? requirements.certifications.reduce(function(count, cert){\n return count + (cert.expiresIn <= csSettings.data.timeWarningExpire ? 1 : 0);\n }, 0) : 0;\n requirements.willExpire = requirements.willExpireCertificationCount > 0;\n requirements.pendingRevocation = !requirements.revoked && !!requirements.revocation_sig;\n //requirements.outdistanced = requirements.outdistanced; // outdistanced is always present in requirement - see #777\n\n // Fix pending certifications count - Fix #624\n if (!requirements.isMember && !requirements.wasMember) {\n var certifiers = _.union(\n _.pluck(requirements.pendingCerts || [], 'from'),\n _.pluck(requirements.certifications || [], 'from')\n );\n requirements.pendingCertificationCount = _.size(certifiers);\n }\n else {\n requirements.pendingCertificationCount = angular.isDefined(requirements.pendingCerts) ? requirements.pendingCerts.length : 0 ;\n }\n\n // Compute\n requirements.needCertificationCount = (!requirements.needSelf && (requirements.certificationCount < currencyParameters.sigQty)) ?\n (currencyParameters.sigQty - requirements.certificationCount) : 0;\n requirements.willNeedCertificationCount = (!requirements.needMembership && !requirements.needCertificationCount &&\n (requirements.certificationCount - requirements.willExpireCertificationCount) < currencyParameters.sigQty) ?\n (currencyParameters.sigQty - requirements.certificationCount + requirements.willExpireCertificationCount) : 0;\n\n // Mark as loaded - need by csWallet.isDataLoaded()\n requirements.loaded = true;\n\n\n return requirements;\n },\n\n _fillIdentitiesMeta = function(identities) {\n if (!identities) return $q.when(identities);\n\n var blocks = [];\n _.forEach(identities, function(identity) {\n var blockUid = identity.meta.timestamp.split('-', 2);\n identity.meta.number = parseInt(blockUid[0]);\n identity.meta.hash = blockUid[1];\n identity.meta.sig = identity.meta.sig || identity.sig;\n delete identity.sig;\n blocks.push(identity.meta.number);\n });\n\n // Get identities blocks, to fill self and revocation time\n return BMA.blockchain.blocks(_.uniq(blocks))\n .then(function(blocks) {\n _.forEach(identities, function(identity) {\n var block = _.findWhere(blocks, {number: identity.meta.number});\n identity.meta.time = block && block.medianTime;\n\n // Check if self has been done on a valid block\n if (block && identity.meta.number !== 0 && identity.meta.hash !== block.hash) {\n identity.meta.invalid = true;\n }\n });\n\n return identities;\n })\n .catch(function(err){\n // Special case for currency init (root block not exists): use now\n if (err && err.ucode == BMA.errorCodes.BLOCK_NOT_FOUND) {\n _.forEach(identities, function(identity) {\n if (identity.number === 0) {\n identity.meta.time = moment().utc().unix();\n }\n });\n return identities;\n }\n else {\n throw err;\n }\n });\n },\n\n loadRequirements = function(inputData, withCache) {\n if (!inputData || (!inputData.pubkey && !inputData.uid)) return $q.when(inputData);\n\n var cacheKey = inputData.pubkey||inputData.uid;\n var data = (withCache !== false) ? requirementsCache.get(cacheKey) : null;\n if (data) {\n console.debug(\"[wot] Requirements \" + cacheKey + \" found in cache\");\n // Update data with cache\n angular.merge(inputData, data);\n return $q.when(data);\n }\n data = {pubkey: inputData.pubkey, uid: inputData.uid};\n\n // Alert user, when request is too long (> 2s)\n $timeout(function() {\n if (!data.requirements || !data.requirements.loaded) UIUtils.loading.update({template: \"COMMON.LOADING_WAIT\"});\n }, 2000);\n\n var now = Date.now();\n return $q.all([\n // Get currency\n csCurrency.get(),\n\n // Get requirements\n BMA.wot.requirements({pubkey: data.pubkey||data.uid}, false/*no cache*/)\n .then(function(res) {\n return _fillIdentitiesMeta(res && res.identities);\n })\n ])\n .then(function(res){\n var currency = res[0];\n var identities = res[1];\n\n if (!identities || !identities.length) return;\n\n // Sort to select the best identity\n if (identities.length > 1) {\n // Select the best identity, by sorting using this order\n // - same wallet uid\n // - is member\n // - has a pending membership\n // - is not expired (in sandbox)\n // - is not outdistanced\n // - if has certifications\n // max(count(certification)\n // else\n // max(membershipPendingExpiresIn) = must recent membership\n identities = _.sortBy(identities, function(idty) {\n var score = 0;\n score += (1000000000000* ((data.uid && idty.uid === data.uid) ? 1 : 0));\n score += (100000000000 * (!idty.meta.invalid ? 1 : 0));\n score += (10000000000 * ((data.blockUid && idty.meta.timestamp && idty.meta.timestamp === data.blockUid) ? 1 : 0));\n score += (1000000000 * (idty.membershipExpiresIn > 0 ? 1 : 0));\n score += (100000000 * (idty.membershipPendingExpiresIn > 0 ? 1 : 0));\n score += (10000000 * (!idty.expired ? 1 : 0));\n score += (1000000 * (!idty.outdistanced ? 1 : 0));\n score += (100000 * (idty.wasMember ? 1 : 0));\n var certCount = !idty.expired && idty.certifications ? idty.certifications.length : 0;\n score += (1 * (certCount ? certCount : 0));\n score += (1 * (!certCount && idty.membershipPendingExpiresIn > 0 ? idty.membershipPendingExpiresIn/1000 : 0));\n return -score;\n });\n console.debug('[wot] Found {0} identities (in requirements). Will selected the best one'.format(identities.length));\n }\n\n // Select the first identity\n data.requirements = _fillRequirements(identities[0], currency.parameters);\n\n // Copy some useful properties into data\n data.pubkey = data.requirements.pubkey;\n data.uid = data.requirements.uid;\n data.isMember = data.requirements.isMember;\n data.blockUid = data.requirements.meta && data.requirements.meta.timestamp;\n data.hasSelf = data.requirements.hasSelf;\n data.sigDate = data.requirements.meta && data.requirements.meta.time;\n\n // Prepare alternatives identities if any\n if (!data.requirements.isMember && !data.requirements.wasMember && identities.length > 1) {\n data.requirements.alternatives = identities.splice(1);\n _.forEach(data.requirements.alternatives, function(requirements) {\n _fillRequirements(requirements, currency.parameters);\n });\n }\n\n /// Save to cache\n requirementsCache.put(cacheKey, data);\n\n angular.merge(inputData, data); // Update the input data\n\n console.debug(\"[wot] Requirements for '{0}' loaded in {1}ms\".format((data.pubkey && data.pubkey.substring(0,8))||data.uid, Date.now() - now));\n\n return inputData;\n })\n .catch(function(err) {\n data.requirements = {loaded: true}; // Mark has loaded - need by the previous $timeout\n _resetRequirements(inputData);\n // If not a member: continue\n if (!!err &&\n (err.ucode == BMA.errorCodes.NO_MATCHING_MEMBER ||\n err.ucode == BMA.errorCodes.NO_IDTY_MATCHING_PUB_OR_UID)) {\n inputData.requirements.loaded = true;\n return inputData;\n }\n throw err;\n });\n },\n\n loadIdentityByLookup = function(pubkey, uid) {\n var data = {\n pubkey: pubkey,\n uid: uid,\n hasSelf: false\n };\n return BMA.wot.lookup({ search: pubkey||uid })\n .then(function(res){\n var identities = res.results.reduce(function(idties, res) {\n return idties.concat(res.uids.reduce(function(uids, idty) {\n var blockUid = idty.meta.timestamp.split('-', 2);\n var blockNumber = parseInt(blockUid[0]);\n return uids.concat({\n uid: idty.uid,\n pubkey: res.pubkey,\n meta: {\n timestamp: idty.meta.timestamp,\n number: blockNumber,\n hash: blockUid[1],\n sig: idty.self\n },\n revoked: idty.revoked,\n revoked_on: idty.revoked_on\n });\n }, []));\n }, []);\n\n // Fill identities meta (self)\n return _fillIdentitiesMeta(identities)\n .then(function(identities) {\n return {\n identities: identities,\n results: res.results\n };\n });\n })\n .then(function(res){\n var identities = res.identities;\n\n // Sort identities if need\n if (identities.length > 1) {\n // Select the best identity, by sorting using this order\n // - valid block\n // - same given uid\n // - not revoked\n // - max(block_number)\n res.identities = _.sortBy(identities, function(idty) {\n var score = 0;\n score += (100000000000 * ((data.uid && idty.uid === data.uid) ? 1 : 0));\n score += (10000000000 * (!idty.meta.invalid ? 1 : 0));\n score += (1000000000 * ((data.blockUid && idty.meta.timestamp && idty.meta.timestamp === data.blockUid) ? 1 : 0));\n score += (100000000 * (!idty.revoked ? 1 : 0));\n score += (1 * (idty.meta.number ? idty.meta.number : 0) / 1000);\n return -score;\n });\n console.debug('[wot] Found {0} identities (in lookup). Will selected the best one'.format(identities.length));\n }\n\n // Prepare alternatives identities\n _.forEach(identities, function(idty) {\n idty.hasSelf = !!(idty.uid && idty.meta.timestamp && idty.meta.sig);\n });\n\n // Select the first identity\n data.requirements = identities[0];\n\n // Copy some useful properties into data\n data.pubkey = data.requirements.pubkey;\n data.uid = data.requirements.uid;\n data.blockUid = data.requirements.meta && data.requirements.meta.timestamp;\n data.hasSelf = data.requirements.hasSelf;\n data.sigDate = data.requirements.meta && data.requirements.meta.time;\n\n if (identities.length > 1) {\n data.requirements.alternatives = identities.splice(1);\n }\n\n // Store additional data (e.g. certs)\n data.lookup = {};\n\n // Store received certifications (can be usefull later)\n var certPubkeys = {};\n data.lookup.certifications = (res.results || []).reduce(function(certsMap, res) {\n return res.uids.reduce(function(certsMap, idty) {\n var idtyFullKey = idty.uid + '-' + (idty.meta ? idty.meta.timestamp : '');\n certsMap[idtyFullKey] = (idty.others||[]).reduce(function(certs, cert) {\n var certFullKey = idtyFullKey + '-' + cert.pubkey;\n var result = {\n pubkey: cert.pubkey,\n uid: cert.uids[0],\n cert_time: {\n block: (cert.meta && cert.meta.block_number) ? cert.meta.block_number : 0,\n block_hash: (cert.meta && cert.meta.block_hash) ? cert.meta.block_hash : null\n },\n isMember: cert.isMember,\n wasMember: cert.wasMember,\n };\n if (!certPubkeys[certFullKey]) {\n certPubkeys[certFullKey] = result;\n }\n else { // if duplicated cert: keep the most recent\n if (result.cert_time.block > certPubkeys[certFullKey].cert_time.block) {\n certPubkeys[certFullKey] = result;\n certs.splice(_.findIndex(certs, {pubkey: cert.pubkey}), 1, result);\n return certs;\n }\n else {\n return certs; // skip this cert\n }\n }\n return certs.concat(result);\n }, []);\n return certsMap;\n }, certsMap);\n }, {});\n\n // Store given certifications\n certPubkeys = {};\n data.lookup.givenCertifications = (res.results || []).reduce(function(certs, res) {\n return (res.signed || []).reduce(function(certs, cert) {\n var result = {\n pubkey: cert.pubkey,\n uid: cert.uid,\n cert_time: {\n block: (cert.cert_time && cert.cert_time.block) ? cert.cert_time.block : 0,\n block_hash: (cert.cert_time && cert.cert_time.block_hash) ? cert.cert_time.block_hash : null\n },\n sigDate: cert.meta ? cert.meta.timestamp : null,\n isMember: cert.isMember,\n wasMember: cert.wasMember\n };\n if (!certPubkeys[cert.pubkey]) {\n certPubkeys[cert.pubkey] = result;\n }\n else { // if duplicated cert: keep the most recent\n if (result.block > certPubkeys[cert.pubkey].block) {\n certPubkeys[cert.pubkey] = result;\n // TODO: Replace the existing one ? May be not, to be able to see renewal\n // (see issue #806)\n // If yes (need to replace), check this code works:\n //certs.splice(_.findIndex(certs, {pubkey: cert.pubkey}), 1, result);\n //return certs;\n }\n else {\n return certs; // skip this cert\n }\n }\n return certs.concat(result);\n }, certs);\n }, []);\n\n return data;\n })\n .catch(function(err) {\n if (!!err && err.ucode == BMA.errorCodes.NO_MATCHING_IDENTITY) { // Identity not found (if no self)\n _resetRequirements(data);\n return data;\n }\n else {\n throw err;\n }\n });\n },\n\n loadCertifications = function(getFunction, pubkey, lookupCertifications, parameters, medianTime, certifiersOf) {\n\n function _certId(pubkey, block) {\n return pubkey + '-' + block;\n }\n\n // TODO : remove this later (when all node will use duniter v0.50+)\n var lookupHasCertTime = true; // Will be set ti FALSE before Duniter v0.50\n var lookupCerticationsByCertId = lookupCertifications ? lookupCertifications.reduce(function(res, cert){\n var certId = _certId(cert.pubkey, cert.cert_time ? cert.cert_time.block : cert.sigDate);\n if (!cert.cert_time) lookupHasCertTime = false;\n res[certId] = cert;\n return res;\n }, {}) : {};\n\n var isMember = true;\n\n return getFunction({ pubkey: pubkey })\n .then(function(res) {\n return (res && res.certifications || []).reduce(function (res, cert) {\n // Rappel :\n // cert.sigDate = blockstamp de l'identité\n // cert.cert_time.block : block au moment de la certification\n // cert.written.number : block où la certification est écrite\n\n var pending = !cert.written;\n var certTime = cert.cert_time ? cert.cert_time.medianTime : null;\n var expiresIn = (!certTime) ? 0 : (pending ?\n (certTime + parameters.sigWindow - medianTime) :\n (certTime + parameters.sigValidity - medianTime));\n expiresIn = (expiresIn < 0) ? 0 : expiresIn;\n // Remove from lookup certs\n var certId = _certId(cert.pubkey, lookupHasCertTime && cert.cert_time ? cert.cert_time.block : cert.sigDate);\n delete lookupCerticationsByCertId[certId];\n\n // Add to result list\n return res.concat({\n pubkey: cert.pubkey,\n uid: cert.uid,\n time: certTime,\n isMember: cert.isMember,\n wasMember: cert.wasMember,\n expiresIn: expiresIn,\n willExpire: (expiresIn && expiresIn <= csSettings.data.timeWarningExpire),\n pending: pending,\n block: (cert.written !== null) ? cert.written.number :\n (cert.cert_time ? cert.cert_time.block : null),\n valid: (expiresIn > 0)\n });\n }, []);\n })\n .catch(function(err) {\n if (!!err && err.ucode == BMA.errorCodes.NO_MATCHING_MEMBER) { // member not found\n isMember = false;\n return []; // continue (append pendings cert if exists in lookup)\n }\n /*FIXME: workaround for Duniter issue #1309 */\n else if (!!err && err.ucode == 1002) {\n console.warn(\"[wallet-service] Detecting Duniter issue #1309 ! Applying workaround... \");\n isMember = false;\n return []; // not found\n }\n else {\n throw err;\n }\n })\n\n // Add pending certs (found in lookup - see loadIdentityByLookup())\n .then(function(certifications) {\n var pendingCertifications = _.values(lookupCerticationsByCertId);\n if (!pendingCertifications.length) return certifications; // No more pending continue\n\n // Special case for initPhase - issue #\n if (csCurrency.data.initPhase) {\n return pendingCertifications.reduce(function(res, cert) {\n return res.concat({\n pubkey: cert.pubkey,\n uid: cert.uid,\n isMember: cert.isMember,\n wasMember: cert.wasMember,\n time: null,\n expiresIn: parameters.sigWindow,\n willExpire: false,\n pending: true,\n block: 0,\n valid: true\n });\n }, certifications);\n }\n\n var pendingCertByBlocks = pendingCertifications.reduce(function(res, cert){\n var block = lookupHasCertTime && cert.cert_time ? cert.cert_time.block :\n (cert.sigDate ? cert.sigDate.split('-')[0] : null);\n if (angular.isDefined(block)) {\n if (!res[block]) {\n res[block] = [cert];\n }\n else {\n res[block].push(cert);\n }\n }\n return res;\n }, {});\n\n // Set time to pending cert, from blocks\n return BMA.blockchain.blocks(_.keys(pendingCertByBlocks)).then(function(blocks){\n certifications = blocks.reduce(function(res, block){\n return res.concat(pendingCertByBlocks[block.number].reduce(function(res, cert) {\n var certTime = block.medianTime;\n var expiresIn = Math.max(0, certTime + parameters.sigWindow - medianTime);\n var validBuid = (!cert.cert_time || !cert.cert_time.block_hash || cert.cert_time.block_hash == block.hash);\n if (!validBuid) {\n console.debug(\"[wot] Invalid cert {0}: block hash changed\".format(cert.pubkey.substring(0,8)));\n }\n var valid = (expiresIn > 0) && (!certifiersOf || cert.isMember) && validBuid;\n return res.concat({\n pubkey: cert.pubkey,\n uid: cert.uid,\n isMember: cert.isMember,\n wasMember: cert.wasMember,\n time: certTime,\n expiresIn: expiresIn,\n willExpire: (expiresIn && expiresIn <= csSettings.data.timeWarningExpire),\n pending: true,\n block: lookupHasCertTime && cert.cert_time ? cert.cert_time.block :\n (cert.sigDate ? cert.sigDate.split('-')[0] : null),\n valid: valid\n });\n }, []));\n }, certifications);\n return certifications;\n });\n })\n\n // Sort and return result\n .then(function(certifications) {\n\n // Remove pending cert duplicated with a written & valid cert\n var writtenCertByPubkey = certifications.reduce(function(res, cert) {\n if (!cert.pending && cert.valid && cert.expiresIn >= parameters.sigWindow) {\n res[cert.pubkey] = true;\n }\n return res;\n }, {});\n\n // Final sort\n certifications = _sortCertifications(certifications);\n\n // Split into valid/pending/error\n var pendingCertifications = [];\n var errorCertifications = [];\n var validCertifications = certifications.reduce(function(res, cert) {\n if (cert.pending) {\n if (cert.valid && !writtenCertByPubkey[cert.pubkey]) {\n pendingCertifications.push(cert);\n }\n else if (!cert.valid && !writtenCertByPubkey[cert.pubkey]){\n errorCertifications.push(cert);\n }\n return res;\n }\n return res.concat(cert);\n }, []);\n\n return {\n valid: validCertifications,\n pending: pendingCertifications,\n error: errorCertifications\n };\n })\n ;\n },\n\n // Add events on given account\n addEvents = function(data) {\n\n if (data.requirements.revoked) {\n delete data.requirements.meta.invalid;\n if (data.requirements.revoked_on) {\n addEvent(data, {type: 'error', message: 'ERROR.IDENTITY_REVOKED_WITH_TIME', messageParams: {revocationTime: data.requirements.revoked_on}});\n console.debug(\"[wot] Identity [{0}] has been revoked on {1}\".format(data.uid, data.requirements.revoked_on));\n }\n else {\n addEvent(data, {type: 'error', message: 'ERROR.IDENTITY_REVOKED'});\n console.debug(\"[wot] Identity [{0}] has been revoked\".format(data.uid));\n }\n }\n else if (data.requirements.pendingRevocation) {\n delete data.requirements.meta.invalid;\n addEvent(data, {type:'error', message: 'ERROR.IDENTITY_PENDING_REVOCATION'});\n console.debug(\"[wot] Identity [{0}] has pending revocation\".format(data.uid));\n }\n else if (data.requirements.meta && data.requirements.meta.invalid) {\n if (!data.isMember) {\n addEvent(data, {type: 'error', message: 'ERROR.IDENTITY_INVALID_BLOCK_HASH'});\n console.debug(\"[wot] Invalid membership for uid {0}: block hash changed\".format(data.uid));\n }\n }\n else if (data.requirements.expired) {\n addEvent(data, {type: 'error', message: 'ERROR.IDENTITY_EXPIRED'});\n console.debug(\"[wot] Identity {0} expired (in sandbox)\".format(data.uid));\n }\n else if (data.requirements.willNeedCertificationCount > 0) {\n addEvent(data, {type: 'error', message: 'INFO.IDENTITY_WILL_MISSING_CERTIFICATIONS', messageParams: data.requirements});\n console.debug(\"[wot] Identity {0} will need {1} certification(s)\".format(data.uid, data.requirements.willNeedCertificationCount));\n }\n else if (!data.requirements.needSelf && data.requirements.needMembership) {\n addEvent(data, {type: 'error', message: 'INFO.IDENTITY_NEED_MEMBERSHIP'});\n console.debug(\"[wot] Identity {0} has a self but no membership\".format(data.uid));\n }\n if (!data.isMember && data.requirements.alternatives) {\n addEvent(data, {type: 'info', message: 'INFO.HAS_ALTERNATIVE_IDENTITIES'});\n }\n },\n\n loadData = function(pubkey, uid, options) {\n\n options = options || {};\n var data;\n\n if (!pubkey && uid && !options.force) {\n return BMA.wot.member.getByUid(uid)\n .then(function(member) {\n if (member) return loadData(member.pubkey, member.uid, options); // recursive call, with a pubkey\n //throw {message: 'NOT_A_MEMBER'};\n var options = angular.copy(options || {});\n options.force = true;\n return loadData(pubkey, uid, options); // Loop with force=true\n });\n }\n\n // Check cached data\n if (pubkey) {\n data = (options.cache !== false) ? identityCache.get(pubkey) : null;\n if (data && (!uid || data.uid === uid) && (!options.blockUid || data.blockUid === options.blockUid)) {\n console.debug(\"[wot] Identity {{0}} found in cache\".format(pubkey.substring(0, 8)));\n return $q.when(data);\n }\n console.debug(\"[wot] Loading identity {{0}}...\".format(pubkey.substring(0, 8)));\n data = {\n pubkey: pubkey,\n uid: uid\n };\n }\n else {\n console.debug(\"[wot] Loading identity from uid {{0}}...\".format(uid));\n data = {\n uid: uid\n };\n }\n if (options.blockUid) {\n data.blockUid = options.blockUid;\n }\n\n var now = Date.now();\n var parameters;\n var medianTime;\n\n return $q.all([\n\n // Get parameters\n csCurrency.parameters()\n .then(function(res) {\n parameters = res;\n }),\n\n // Get current time\n csCurrency.blockchain.current(true)\n .then(function(current) {\n medianTime = current.medianTime;\n })\n .catch(function(err){\n // Special case for currency init (root block not exists): use now\n if (err && err.ucode == BMA.errorCodes.NO_CURRENT_BLOCK) {\n medianTime = moment.utc().unix();\n }\n else {\n throw err;\n }\n }),\n\n // Get requirements\n loadRequirements(data, options.cache !== false),\n\n // Get identity using lookup\n loadIdentityByLookup(pubkey, uid)\n\n ])\n .then(function(res) {\n var dataByLookup = res[3];\n\n // If no requirements found: copy from lookup data\n if (!data.requirements.uid) {\n console.debug(\"[wot] No requirements found: using data from lookup\");\n angular.merge(data, dataByLookup);\n delete data.lookup; // not need\n return;\n }\n\n var idtyFullKey = data.requirements.uid + '-' + data.requirements.meta.timestamp;\n\n return $q.all([\n // Get received certifications\n loadCertifications(BMA.wot.certifiersOf, data.pubkey, dataByLookup.lookup ? dataByLookup.lookup.certifications[idtyFullKey] : null, parameters, medianTime, true /*certifiersOf*/)\n .then(function (res) {\n data.received_cert = res.valid;\n data.received_cert_pending = res.pending;\n data.received_cert_error = res.error;\n }),\n\n // Get given certifications\n loadCertifications(BMA.wot.certifiedBy, data.pubkey, dataByLookup.lookup ? dataByLookup.lookup.givenCertifications : null, parameters, medianTime, false/*certifiersOf*/)\n .then(function (res) {\n data.given_cert = res.valid;\n data.given_cert_pending = res.pending;\n data.given_cert_error = res.error;\n })\n ]);\n })\n .then(function() {\n\n // Add compute some additional requirements (that required all data like certifications)\n data.requirements.pendingCertificationCount = data.received_cert_pending ? data.received_cert_pending.length : data.requirements.pendingCertificationCount;\n // Use /wot/lookup.revoked when requirements not filled\n data.requirements.revoked = angular.isDefined(data.requirements.revoked) ? data.requirements.revoked : data.revoked;\n\n // Add account events\n addEvents(data);\n\n // API extension\n return api.data.raisePromise.load(data)\n .catch(function(err) {\n console.debug('Error while loading identity data, on extension point.');\n console.error(err);\n });\n })\n .then(function() {\n if (!data.pubkey) return undefined; // not found\n identityCache.put(data.pubkey, data); // add to cache\n console.debug('[wot] Identity '+ data.pubkey.substring(0, 8) +' loaded in '+ (Date.now()-now) +'ms');\n return data;\n });\n },\n\n search = function(text, options) {\n if (!text || text.trim() !== text) {\n return $q.when(undefined);\n }\n\n // Remove first special characters (to avoid request error)\n var safeText = text.replace(/(^|\\s)#\\w+/g, ''); // remove tags\n safeText = safeText.replace(/[^a-zA-Z0-9_-\\s]+/g, '');\n safeText = safeText.replace(/\\s+/g, ' ').trim();\n\n options = options || {};\n options.addUniqueId = angular.isDefined(options.addUniqueId) ? options.addUniqueId : true;\n options.allowExtension = angular.isDefined(options.allowExtension) ? options.allowExtension : true;\n options.excludeRevoked = angular.isDefined(options.excludeRevoked) ? options.excludeRevoked : false;\n\n var promise;\n if (!safeText) {\n promise = $q.when([]);\n }\n else {\n promise = $q.all(\n safeText.split(' ').reduce(function(res, text) {\n console.debug('[wot] Will search on: \\'' + text + '\\'');\n return res.concat(BMA.wot.lookup({ search: text }));\n }, [])\n ).then(function(res){\n return res.reduce(function(idties, res) {\n return idties.concat(res.results.reduce(function(idties, res) {\n return idties.concat(res.uids.reduce(function(uids, idty) {\n var blocUid = idty.meta.timestamp.split('-', 2);\n var revoked = !idty.revoked && idty.revocation_sig;\n if (!options.excludeRevoked || !revoked) {\n return uids.concat({\n uid: idty.uid,\n pubkey: res.pubkey,\n number: blocUid[0],\n hash: blocUid[1],\n revoked: revoked\n });\n }\n return uids;\n }, []));\n }, []));\n }, []);\n })\n .catch(function(err) {\n if (err && err.ucode == BMA.errorCodes.NO_MATCHING_IDENTITY) {\n return [];\n }\n else {\n throw err;\n }\n });\n }\n\n return promise\n .then(function(idties) {\n if (!options.allowExtension) {\n // Add unique id (if enable)\n return options.addUniqueId ? _addUniqueIds(idties) : idties;\n }\n var lookupResultCount = idties.length;\n // call extension point\n return api.data.raisePromise.search(text, idties, 'pubkey')\n .then(function() {\n\n // Make sure to add uid to new results - fix #488\n if (idties.length > lookupResultCount) {\n var idtiesWithoutUid = _.filter(idties, function(idty) {\n return !idty.uid && idty.pubkey;\n });\n if (idtiesWithoutUid.length) {\n return BMA.wot.member.uids()\n .then(function(uids) {\n _.forEach(idties, function(idty) {\n if (!idty.uid && idty.pubkey) {\n idty.uid = uids[idty.pubkey];\n }\n });\n });\n }\n }\n })\n .then(function() {\n // Add unique id (if enable)\n return options.addUniqueId ? _addUniqueIds(idties) : idties;\n });\n });\n },\n\n getNewcomers = function(offset, size) {\n offset = offset || 0;\n size = size || 20;\n var total;\n return $q.all([\n csCurrency.blockchain.current(true)\n .then(function(block) {\n total = block.membersCount || 0;\n }),\n BMA.blockchain.stats.newcomers()\n ])\n .then(function(res) {\n res = res[1];\n if (!res || !res.result || !res.result.blocks || !res.result.blocks.length) return null; // no result\n var blocks = _.sortBy(res.result.blocks, function (n) {\n return -n;\n });\n return getNewcomersRecursive(blocks, 0, 5, offset+size);\n })\n .then(function(idties){\n if (!idties || !idties.length) {\n return null;\n }\n idties = _sortAndSliceIdentities(idties, offset, size);\n\n // Extension point\n return extendAll(idties, 'pubkey', true/*skipAddUid*/);\n })\n .then(function(idties) {\n return {\n hits: idties,\n total: total\n };\n });\n },\n\n\n getNewcomersRecursive = function(blocks, offset, size, maxResultSize) {\n return $q(function(resolve, reject) {\n var result = [];\n var jobs = [];\n _.each(blocks.slice(offset, offset+size), function(number) {\n jobs.push(\n BMA.blockchain.block({block: number})\n .then(function(block){\n if (!block || !block.joiners) return;\n _.each(block.joiners, function(joiner){\n var parts = joiner.split(':');\n var idtyKey = parts[parts.length-1]/*uid*/ + '-' + parts[0]/*pubkey*/;\n result.push({\n id: idtyKey,\n uid: parts[parts.length-1],\n pubkey:parts[0],\n memberDate: block.medianTime,\n block: block.number\n });\n });\n })\n );\n });\n\n $q.all(jobs)\n .then(function() {\n if (result.length < maxResultSize && offset < blocks.length - 1) {\n $timeout(function() {\n getNewcomersRecursive(blocks, offset+size, size, maxResultSize - result.length)\n .then(function(res) {\n resolve(result.concat(res));\n })\n .catch(function(err) {\n reject(err);\n });\n }, 1000);\n }\n else {\n resolve(result);\n }\n })\n .catch(function(err){\n if (err && err.ucode === BMA.errorCodes.HTTP_LIMITATION) {\n resolve(result);\n }\n else {\n reject(err);\n }\n });\n });\n },\n\n getPending = function(offset, size) {\n offset = offset || 0;\n size = size || 20;\n var now = Date.now();\n return $q.all([\n BMA.wot.member.uids(),\n BMA.wot.member.pending()\n .then(function(res) {\n return (res.memberships && res.memberships.length) ? res.memberships : undefined;\n })\n ])\n .then(function(res) {\n var uids = res[0];\n var memberships = res[1];\n if (!memberships) return;\n\n var idtiesByBlock = {};\n var idtiesByPubkey = {};\n _.forEach(memberships, function(ms){\n if (ms.membership == 'IN' && !uids[ms.pubkey]) {\n var idty = {\n uid: ms.uid,\n pubkey: ms.pubkey,\n block: ms.blockNumber,\n blockHash: ms.blockHash\n };\n var otherIdtySamePubkey = idtiesByPubkey[ms.pubkey];\n if (otherIdtySamePubkey && idty.block > otherIdtySamePubkey.block) {\n return; // skip\n }\n idtiesByPubkey[idty.pubkey] = idty;\n if (!idtiesByBlock[idty.block]) {\n idtiesByBlock[idty.block] = [idty];\n }\n else {\n idtiesByBlock[idty.block].push(idty);\n }\n\n // Remove previous idty from map\n if (otherIdtySamePubkey) {\n idtiesByBlock[otherIdtySamePubkey.block] = idtiesByBlock[otherIdtySamePubkey.block].reduce(function(res, aidty){\n if (aidty.pubkey == otherIdtySamePubkey.pubkey) return res; // if match idty to remove, to NOT add\n return (res||[]).concat(aidty);\n }, null);\n if (idtiesByBlock[otherIdtySamePubkey.block] === null) {\n delete idtiesByBlock[otherIdtySamePubkey.block];\n }\n }\n }\n });\n\n var idties = _.values(idtiesByPubkey);\n var total = idties.length; // get total BEFORE slice\n\n idties = _sortAndSliceIdentities(idties, offset, size);\n var blocks = idties.reduce(function(res, aidty) {\n return res.concat(aidty.block);\n }, []);\n\n return $q.all([\n // Get time from blocks\n BMA.blockchain.blocks(_.uniq(blocks))\n .then(function(blocks) {\n\n _.forEach(blocks, function(block){\n _.forEach(idtiesByBlock[block.number], function(idty) {\n idty.sigDate = block.medianTime;\n if (block.number !== 0 && idty.blockHash !== block.hash) {\n addEvent(idty, {type:'error', message: 'ERROR.WOT_PENDING_INVALID_BLOCK_HASH'});\n console.debug(\"Invalid membership for uid={0}: block hash changed\".format(idty.uid));\n }\n });\n });\n }),\n\n // Extension point\n extendAll(idties, 'pubkey', true/*skipAddUid*/)\n ])\n .then(function() {\n console.debug(\"[ES] [wot] Loaded {0}/{1} pending identities in {2} ms\".format(idties && idties.length || 0, total, Date.now() - now));\n return {\n hits: idties,\n total: total\n };\n });\n });\n },\n\n getAll = function() {\n var letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','u','v','w','x','y','z'];\n return getAllRecursive(letters, 0, BMA.constants.LIMIT_REQUEST_COUNT)\n .then(function(idties) {\n return extendAll(idties, 'pubkey', true/*skipAddUid*/);\n })\n .then(_addUniqueIds)\n .then(function() {\n return {\n hits: idties,\n total: idties.length\n };\n });\n },\n\n getAllRecursive = function(letters, offset, size) {\n return $q(function(resolve, reject) {\n var result = [];\n var pubkeys = {};\n var jobs = [];\n _.each(letters.slice(offset, offset+size), function(letter) {\n jobs.push(\n search(letter, {\n addUniqueId: false, // will be done in parent method\n allowExtension: false // extension point will be called in parent method\n })\n .then(function(idties){\n if (!idties || !idties.length) return;\n result = idties.reduce(function(res, idty) {\n if (!pubkeys[idty.pubkey]) {\n pubkeys[idty.pubkey] = true;\n return res.concat(idty);\n }\n return res;\n }, result);\n })\n );\n });\n\n $q.all(jobs)\n .then(function() {\n if (offset < letters.length - 1) {\n $timeout(function() {\n getAllRecursive(letters, offset+size, size)\n .then(function(idties) {\n if (!idties || !idties.length) {\n resolve(result);\n return;\n }\n resolve(idties.reduce(function(res, idty) {\n if (!pubkeys[idty.pubkey]) {\n pubkeys[idty.pubkey] = true;\n return res.concat(idty);\n }\n return res;\n }, result));\n })\n .catch(function(err) {\n reject(err);\n });\n }, BMA.constants.LIMIT_REQUEST_DELAY);\n }\n else {\n resolve(result);\n }\n })\n .catch(function(err){\n if (err && err.ucode === BMA.errorCodes.HTTP_LIMITATION) {\n resolve(result);\n }\n else {\n reject(err);\n }\n });\n });\n },\n\n extend = function(idty, pubkeyAttributeName, skipAddUid) {\n return extendAll([idty], pubkeyAttributeName, skipAddUid)\n .then(function(res) {\n return res[0];\n });\n },\n\n extendAll = function(idties, pubkeyAttributeName, skipAddUid) {\n\n pubkeyAttributeName = pubkeyAttributeName || 'pubkey';\n\n var jobs = [];\n if (!skipAddUid) jobs.push(BMA.wot.member.uids());\n\n jobs.push(api.data.raisePromise.search(null, idties, pubkeyAttributeName)\n .catch(function(err) {\n console.debug('Error while search identities, on extension point.');\n console.error(err);\n }));\n\n return $q.all(jobs)\n .then(function(res) {\n if (!skipAddUid) {\n var uidsByPubkey = res[0];\n // Set uid (on every data)\n _.forEach(idties, function(data) {\n if (!data.uid && data[pubkeyAttributeName]) {\n data.uid = uidsByPubkey[data[pubkeyAttributeName]];\n // Remove name if redundant with uid\n if (data.uid && data.uid == data.name) {\n delete data.name;\n }\n }\n });\n }\n\n return idties;\n });\n },\n\n addEvent = function(data, event) {\n event = event || {};\n event.type = event.type || 'info';\n event.message = event.message || '';\n event.messageParams = event.messageParams || {};\n data.events = data.events || [];\n data.events.push(event);\n },\n\n cleanCache = function() {\n console.debug(\"[wot] Cleaning cache...\");\n csCache.clear(cachePrefix);\n }\n ;\n\n // Register extension points\n api.registerEvent('data', 'load');\n api.registerEvent('data', 'search');\n\n // Listen if node changed\n BMA.api.node.on.stop($rootScope, cleanCache, this);\n\n return {\n load: loadData,\n loadRequirements: loadRequirements,\n search: search,\n newcomers: getNewcomers,\n pending: getPending,\n all: getAll,\n extend: extend,\n extendAll: extendAll,\n // api extension\n api: api\n };\n}]);\n","\nangular.module('cesium.tx.services', ['ngApi', 'cesium.bma.services',\n 'cesium.settings.services', 'cesium.wot.services' ])\n\n.factory('csTx', ['$q', '$timeout', '$filter', '$translate', 'FileSaver', 'UIUtils', 'BMA', 'Api', 'csConfig', 'csSettings', 'csWot', 'csCurrency', function($q, $timeout, $filter, $translate, FileSaver, UIUtils, BMA, Api,\n csConfig, csSettings, csWot, csCurrency) {\n 'ngInject';\n\n var\n api = new Api(this, \"csTx\");\n\n function reduceTxAndPush(pubkey, txArray, result, processedTxMap, allowPendings) {\n if (!txArray || !txArray.length) return; // Skip if empty\n\n _.forEach(txArray, function(tx) {\n if (tx.block_number !== null || allowPendings) {\n var walletIsIssuer = false;\n var otherIssuers = tx.issuers.reduce(function(res, issuer) {\n walletIsIssuer = walletIsIssuer || (issuer === pubkey);\n return (issuer !== pubkey) ? res.concat(issuer) : res;\n }, []);\n var otherRecipients = [],\n outputBase,\n sources = [],\n lockedOutputs;\n\n var amount = tx.outputs.reduce(function(sum, output, noffset) {\n // FIXME duniter v1.4.13\n var outputArray = (typeof output === 'string') ? output.split(':',3) : [output.amount,output.base,output.conditions];\n outputBase = parseInt(outputArray[1]);\n var outputAmount = powBase(parseInt(outputArray[0]), outputBase);\n var outputCondition = outputArray[2];\n var sigMatches = BMA.regexp.TX_OUTPUT_SIG.exec(outputCondition);\n\n // Simple unlock condition\n if (sigMatches) {\n var outputPubkey = sigMatches[1];\n if (outputPubkey === pubkey) { // output is for the wallet\n if (!walletIsIssuer) {\n return sum + outputAmount;\n }\n // If pending: use output as new sources\n else if (tx.block_number === null) {\n sources.push({\n amount: parseInt(outputArray[0]),\n base: outputBase,\n type: 'T',\n identifier: tx.hash,\n noffset: noffset,\n consumed: false,\n conditions: outputCondition\n });\n }\n }\n\n // The output is for someone else\n else {\n // Add into recipients list(if not a issuer)\n if (outputPubkey !== '' && !_.contains(otherIssuers, outputPubkey)) {\n otherRecipients.push(outputPubkey);\n }\n if (walletIsIssuer) {\n // TODO: should be fix, when TX has multiple issuers (need a repartition)\n return sum - outputAmount;\n }\n }\n\n }\n\n // Complex unlock condition, on the issuer pubkey\n else if (outputCondition.indexOf('SIG('+pubkey+')') !== -1) {\n var lockedOutput = BMA.tx.parseUnlockCondition(outputCondition);\n if (lockedOutput) {\n // Add a source\n sources.push(angular.merge({\n amount: parseInt(outputArray[0]),\n base: outputBase,\n type: 'T',\n identifier: tx.hash,\n noffset: noffset,\n conditions: outputCondition,\n consumed: false\n }, lockedOutput));\n lockedOutput.amount = outputAmount;\n lockedOutputs = lockedOutputs || [];\n lockedOutputs.push(lockedOutput);\n console.debug('[tx] has locked output:', lockedOutput);\n\n return sum + outputAmount;\n }\n }\n return sum;\n }, 0);\n\n var txPubkeys = amount > 0 ? otherIssuers : otherRecipients;\n var time = tx.time || tx.blockstampTime;\n\n // Avoid duplicated tx, or tx to him self\n var txKey = (amount !== 0) && amount + ':' + tx.hash + ':' + time;\n if (txKey && !processedTxMap[txKey]) {\n processedTxMap[txKey] = true; // Mark as processed\n var newTx = {\n time: time,\n amount: amount,\n pubkey: txPubkeys.length === 1 ? txPubkeys[0] : undefined,\n pubkeys: txPubkeys.length > 1 ? txPubkeys : undefined,\n comment: tx.comment,\n isUD: false,\n hash: tx.hash,\n locktime: tx.locktime,\n block_number: tx.block_number\n };\n\n // If pending: store sources and inputs for a later use - see method processTransactionsAndSources()\n if (walletIsIssuer && tx.block_number === null) {\n newTx.inputs = tx.inputs;\n newTx.sources = sources;\n }\n if (lockedOutputs) {\n newTx.lockedOutputs = lockedOutputs;\n }\n result.push(newTx);\n }\n }\n });\n }\n\n\n function loadTx(pubkey, fromTime) {\n return $q(function(resolve, reject) {\n\n var nowInSec = moment().utc().unix();\n fromTime = fromTime || (nowInSec - csSettings.data.walletHistoryTimeSecond);\n var tx = {\n pendings: [],\n validating: [],\n history: [],\n errors: []\n };\n\n var processedTxMap = {};\n\n var jobs = [\n // get current block\n csCurrency.blockchain.current(true),\n\n // get pending tx\n BMA.tx.history.pending({pubkey: pubkey})\n .then(function (res) {\n reduceTxAndPush(pubkey, res.history.sending, tx.pendings, processedTxMap, true /*allow pendings*/);\n reduceTxAndPush(pubkey, res.history.pending, tx.pendings, processedTxMap, true /*allow pendings*/);\n })\n ];\n\n // get TX history since\n if (fromTime !== 'pending') {\n var reduceTxFn = function (res) {\n reduceTxAndPush(pubkey, res.history.sent, tx.history, processedTxMap, false);\n reduceTxAndPush(pubkey, res.history.received, tx.history, processedTxMap, false);\n };\n\n // get TX from a given time\n if (fromTime > 0) {\n // Use slice, to be able to cache requests result\n var sliceTime = csSettings.data.walletHistorySliceSecond;\n fromTime = fromTime - (fromTime % sliceTime);\n for(var i = fromTime; i - sliceTime < nowInSec; i += sliceTime) {\n jobs.push(BMA.tx.history.times({pubkey: pubkey, from: i, to: i+sliceTime-1}, true /*with cache*/)\n .then(reduceTxFn)\n );\n }\n\n // Last slide: no cache\n jobs.push(BMA.tx.history.times({pubkey: pubkey, from: nowInSec - (nowInSec % sliceTime), to: nowInSec+999999999}, false/*no cache*/)\n .then(reduceTxFn));\n }\n\n // get all TX\n else {\n jobs.push(BMA.tx.history.all({pubkey: pubkey})\n .then(reduceTxFn)\n );\n }\n\n // get UD history\n if (csSettings.data.showUDHistory && fromTime > 0) {\n /*jobs.push(\n BMA.ud.history({pubkey: pubkey})\n .then(function(res){\n udHistory = !res.history || !res.history.history ? [] :\n _.forEach(res.history.history, function(ud){\n if (ud.time < fromTime) return res; // skip to old UD\n var amount = powBase(ud.amount, ud.base);\n udHistory.push({\n time: ud.time,\n amount: amount,\n isUD: true,\n block_number: ud.block_number\n });\n });\n }));*/\n // API extension\n jobs.push(\n api.data.raisePromise.loadUDs({\n pubkey: pubkey,\n fromTime: fromTime\n })\n .then(function(res) {\n if (!res || !res.length) return;\n _.forEach(res, function(hits) {\n tx.history.push(hits);\n });\n })\n\n .catch(function(err) {\n console.debug('Error while loading UDs history, on extension point.');\n console.error(err);\n })\n );\n }\n }\n\n // Execute jobs\n $q.all(jobs)\n .then(function(res){\n var current = res[0];\n\n // sort by time desc\n tx.history.sort(function(tx1, tx2) {\n return (tx2.time - tx1.time);\n });\n var firstValidatedTxIndex = _.findIndex(tx.history, function(tx){\n return (tx.block_number <= current.number - csSettings.data.blockValidityWindow);\n });\n // remove validating from history\n tx.validating = firstValidatedTxIndex > 0 ? tx.history.splice(0, firstValidatedTxIndex) : [];\n\n tx.fromTime = fromTime !== 'pending' && fromTime || undefined;\n tx.toTime = tx.history.length ? tx.history[0].time /*=max(tx.time)*/: tx.fromTime;\n\n resolve(tx);\n })\n .catch(reject);\n });\n }\n\n function powBase(amount, base) {\n return base <= 0 ? amount : amount * Math.pow(10, base);\n }\n\n function addSource(src, sources, sourcesIndexByKey) {\n var srcKey = src.type+':'+src.identifier+':'+src.noffset;\n if (angular.isUndefined(sourcesIndexByKey[srcKey])) {\n sources.push(src);\n sourcesIndexByKey[srcKey] = sources.length - 1;\n }\n }\n\n function addSources(result, sources) {\n _(sources).forEach(function(src) {\n addSource(src, result.sources, result.sourcesIndexByKey);\n });\n }\n\n function loadSourcesAndBalance(pubkey) {\n return BMA.tx.sources({pubkey: pubkey})\n .then(function(res){\n var data = {\n sources: [],\n sourcesIndexByKey: [],\n balance: 0\n };\n if (res.sources && res.sources.length) {\n _.forEach(res.sources, function(src) {\n src.consumed = false;\n data.balance += powBase(src.amount, src.base);\n });\n addSources(data, res.sources);\n }\n return data;\n })\n .catch(function(err) {\n console.warn(\"[tx] Error while getting sources...\", err);\n throw err;\n });\n }\n\n function loadData(pubkey, fromTime) {\n var now = Date.now();\n\n var data;\n\n // Alert user, when request is too long (> 2s)\n $timeout(function() {\n if (!data) UIUtils.loading.update({template: \"COMMON.LOADING_WAIT\"});\n }, 2000);\n\n return $q.all([\n\n // Load Sources\n loadSourcesAndBalance(pubkey),\n\n // Load Tx\n loadTx(pubkey, fromTime)\n ])\n\n .then(function(res) {\n // Copy sources and balance\n data = res[0];\n data.tx = res[1];\n\n var txPendings = [];\n var txErrors = [];\n var balanceFromSource = data.balance;\n var balanceWithPending = data.balance;\n\n function _processPendingTx(tx) {\n var consumedSources = [];\n var valid = true;\n if (tx.amount > 0) { // do not check sources from received TX\n valid = false;\n // TODO get sources from the issuer ?\n }\n else {\n _.find(tx.inputs, function(input) {\n var inputKey = input.split(':').slice(2).join(':');\n var srcIndex = data.sourcesIndexByKey[inputKey];\n if (angular.isDefined(srcIndex)) {\n consumedSources.push(data.sources[srcIndex]);\n }\n else {\n valid = false;\n return true; // break\n }\n });\n if (tx.sources) { // add source output\n addSources(data, tx.sources);\n }\n delete tx.sources;\n delete tx.inputs;\n }\n if (valid) {\n balanceWithPending += tx.amount; // update balance\n txPendings.push(tx);\n _.forEach(consumedSources, function(src) {\n src.consumed=true;\n });\n }\n else {\n txErrors.push(tx);\n }\n }\n\n var txs = data.tx.pendings;\n var retry = true;\n while(txs && txs.length) {\n // process TX pendings\n _.forEach(txs, _processPendingTx);\n\n // Retry once (TX could be chained and processed in a wrong order)\n if (txErrors.length > 0 && txPendings.length > 0 && retry) {\n txs = txErrors;\n txErrors = [];\n retry = false;\n }\n else {\n txs = null;\n }\n }\n\n data.tx = data.tx || {};\n data.tx.pendings = txPendings.sort(function(tx1, tx2) {\n return (tx2.time - tx1.time);\n });\n data.tx.errors = txErrors.sort(function(tx1, tx2) {\n return (tx2.time - tx1.time);\n });\n // Negative balance not allow (use only source's balance) - fix #769\n data.balance = (balanceWithPending < 0) ? balanceFromSource : balanceWithPending;\n\n // Will add uid (+ plugin will add name, avatar, etc. if enable)\n var allTx = (data.tx.history || []).concat(data.tx.validating||[], data.tx.pendings||[], data.tx.errors||[]);\n return csWot.extendAll(allTx, 'pubkey')\n .then(function() {\n console.debug('[tx] TX and sources loaded in '+ (Date.now()-now) +'ms');\n return data;\n });\n })\n .catch(function(err) {\n console.warn(\"[tx] Error while getting sources and tx...\", err);\n throw err;\n });\n }\n\n function loadSources(pubkey) {\n console.debug(\"[tx] Loading sources for \" + pubkey.substring(0,8));\n return loadData(pubkey, 'pending');\n }\n\n // Download TX history file\n function downloadHistoryFile(pubkey, options) {\n\n options = options || {};\n options.fromTime = options.fromTime || -1;\n\n console.debug(\"[tx] Exporting TX history for pubkey [{0}]\".format(pubkey.substr(0,8)));\n\n return $q.all([\n $translate(['ACCOUNT.HEADERS.TIME',\n 'COMMON.UID',\n 'COMMON.PUBKEY',\n 'COMMON.UNIVERSAL_DIVIDEND',\n 'ACCOUNT.HEADERS.AMOUNT',\n 'ACCOUNT.HEADERS.COMMENT']),\n csCurrency.blockchain.current(true/*withCache*/),\n loadData(pubkey, options.fromTime)\n ])\n .then(function(result){\n var translations = result[0];\n var currentBlock = result[1];\n var currentTime = (currentBlock && currentBlock.medianTime) || moment().utc().unix();\n var currency = currentBlock && currentBlock.currency;\n\n var data = result[2];\n\n // no TX\n if (!data || !data.tx || !data.tx.history) {\n return UIUtils.toast.show('INFO.EMPTY_TX_HISTORY');\n }\n\n return $translate('ACCOUNT.FILE_NAME', {currency: currency, pubkey: pubkey, currentTime : currentTime})\n .then(function(filename){\n\n var formatDecimal = $filter('formatDecimal');\n var medianDate = $filter('medianDate');\n var formatSymbol = $filter('currencySymbolNoHtml');\n\n var headers = [\n translations['ACCOUNT.HEADERS.TIME'],\n translations['COMMON.UID'],\n translations['COMMON.PUBKEY'],\n translations['ACCOUNT.HEADERS.AMOUNT'] + ' (' + formatSymbol(currency) + ')',\n translations['ACCOUNT.HEADERS.COMMENT']\n ];\n var content = data.tx.history.concat(data.tx.validating).reduce(function(res, tx){\n return res.concat([\n medianDate(tx.time),\n tx.uid,\n tx.pubkey,\n formatDecimal(tx.amount/100),\n '\"' + (tx.isUD ? translations['COMMON.UNIVERSAL_DIVIDEND'] : tx.comment) + '\"'\n ].join(';') + '\\n');\n }, [headers.join(';') + '\\n']);\n\n var file = new Blob(content, {type: 'text/plain; charset=utf-8'});\n FileSaver.saveAs(file, filename);\n });\n });\n }\n\n // Register extension points\n api.registerEvent('data', 'loadUDs');\n\n return {\n load: loadData,\n loadSources: loadSources,\n downloadHistoryFile: downloadHistoryFile,\n // api extension\n api: api\n };\n}]);\n","\nangular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.services', 'cesium.crypto.services', 'cesium.utils.services',\n 'cesium.settings.services'])\n\n\n.factory('csWallet', ['$q', '$rootScope', '$timeout', '$translate', '$filter', '$ionicHistory', 'UIUtils', 'Api', 'Idle', 'localStorage', 'sessionStorage', 'Modals', 'CryptoUtils', 'csCrypto', 'BMA', 'csConfig', 'csSettings', 'FileSaver', 'Blob', 'csWot', 'csTx', 'csCurrency', function($q, $rootScope, $timeout, $translate, $filter, $ionicHistory, UIUtils,\n Api, Idle, localStorage, sessionStorage, Modals,\n CryptoUtils, csCrypto, BMA, csConfig, csSettings, FileSaver, Blob, csWot, csTx, csCurrency) {\n 'ngInject';\n\n var defaultBMA = BMA;\n var service;\n\n function CsWallet(id, BMA) {\n\n BMA = BMA || defaultBMA;\n var\n exports,\n constants = {\n STORAGE_PUBKEY: 'pubkey',\n STORAGE_UID: 'uid',\n STORAGE_DATA_PREFIX: 'data-',\n STORAGE_SECKEY: 'seckey',\n /* Need for compat with old currencies (test_net and sou) */\n TX_VERSION: BMA.constants.PROTOCOL_VERSION,\n IDTY_VERSION: BMA.constants.PROTOCOL_VERSION,\n MS_VERSION: BMA.constants.PROTOCOL_VERSION,\n CERT_VERSION: BMA.constants.PROTOCOL_VERSION,\n REVOKE_VERSION: BMA.constants.PROTOCOL_VERSION,\n TX_MAX_INPUTS_COUNT: 40 // Allow to get a TX with less than 100 rows (=max row count in Duniter protocol)\n },\n data = {},\n settings,\n listeners,\n started,\n startPromise,\n loadPromise,\n enableAuthIdle = false,\n api = new Api(this, 'csWallet-' + id),\n\n resetData = function(init) {\n data.loaded = false;\n data.pubkey= null;\n data.qrcode=null;\n\n data.uid = null;\n data.localName = null;\n data.isNew = null;\n data.sourcesIndexByKey = null;\n data.medianTime = null;\n data.requirements = {};\n data.blockUid = null;\n data.sigDate = null;\n data.sigStock = null;\n data.isMember = false;\n data.events = [];\n\n // children's wallets\n data.children = [];\n\n // Encrypted (need auth() to be encrypted)\n data.encryptedData = null;\n\n resetKeypair();\n resetTxAndSources();\n\n started = false;\n startPromise = undefined;\n\n if (init) {\n api.data.raise.init(data);\n }\n else {\n if (isDefault() && settings && !settings.useLocalStorage) {\n csSettings.reset();\n }\n api.data.raise.reset(data);\n }\n },\n\n resetKeypair = function(){\n data.keypair = {\n signSk: null,\n signPk: null\n };\n },\n\n resetSources = function(){\n // reset sources data\n data.sources = undefined;\n data.sourcesIndexByKey = undefined;\n data.balance = 0;\n },\n\n resetTx = function(){\n // reset TX data\n data.tx = data.tx || {};\n data.tx.history = [];\n data.tx.pendings = [];\n data.tx.validating = [];\n data.tx.errors = [];\n delete data.tx.fromTime;\n delete data.tx.toTime;\n },\n\n resetTxAndSources = function(){\n // reset sources data\n resetSources();\n // reset TX data\n resetTx();\n },\n\n isDefault = function(){\n return id === 'default';\n },\n\n hasEncryptedData = function(){\n return data.encryptedData && data.encryptedData.nonce && data.encryptedData.content;\n },\n\n addSource = function(src, sources, sourcesIndexByKey) {\n var srcKey = src.type+':'+src.identifier+':'+src.noffset;\n if (angular.isUndefined(sourcesIndexByKey[srcKey])) {\n if (!src.conditions) {\n console.warn(\"Trying to add a source without output condition !\", src);\n }\n sources.push(src);\n sourcesIndexByKey[srcKey] = sources.length - 1;\n }\n },\n\n addSources = function(sources) {\n data.sources = data.sources || [];\n data.sourcesIndexByKey = data.sourcesIndexByKey || {};\n _(sources).forEach(function(src) {\n addSource(src, data.sources, data.sourcesIndexByKey);\n });\n },\n\n // Show login modal\n login = function(options) {\n if (!started) {\n return (startPromise || start())\n .then(function () {\n return login(options); // loop\n });\n }\n\n var needLogin = !isLogin();\n var needAuth = options && ((options.auth && !isAuth()) || options.forceAuth);\n\n // user already login\n if (!needLogin && !needAuth) {\n if (!isDataLoaded(options)) {\n return loadData(options);\n }\n return $q.when(data);\n }\n var keepAuth = csSettings.data.keepAuthIdle > 0;\n\n var authData;\n return (options && options.authData ? $q.when(options.authData) : Modals.showLogin(options))\n .then(function(res){\n if (!res || !res.pubkey ||\n (!needLogin && res.pubkey !== data.pubkey) ||\n (needAuth && (!res.keypair || !res.keypair.signPk || !res.keypair.signSk))) {\n throw 'CANCELLED';\n } // invalid data\n\n authData = res;\n data.pubkey = authData.pubkey;\n data.uid = authData.uid || data.uid;\n data.isNew = options && angular.isDefined(options.isNew) ? options.isNew : data.isNew;\n if (keepAuth) {\n data.keypair = authData.keypair || {\n signSk: null,\n signPk: null\n };\n }\n\n if (needLogin) {\n // extend API to check login validity\n return api.data.raisePromise.loginCheck(data)\n .catch(function (err) {\n resetData(); // Reset data if not valid, then exit process\n throw err;\n })\n // Call extend api\n .then(function() {\n if (needLogin) {\n return api.data.raisePromise.login(data)\n .catch(function(err) {\n console.warn('Error during extension call [wallet.api.data.on.login]', err);\n // continue\n });\n }\n });\n }\n })\n\n .then(function() {\n // Read data from pubkey (when first login)\n if (needLogin) {\n return restoreData();\n }\n // Or the was login but now auth: just try to decrypt data\n else if (needAuth) {\n return openEncryptedData();\n }\n })\n\n .then(function() {\n if (needLogin) {\n\n // store wallet\n store();\n }\n\n // Send auth event (if need)\n if (needAuth || isAuth()) {\n // Check if need to start/stop auth idle\n checkAuthIdle(true);\n\n return api.data.raisePromise.auth(keepAuth ? data : authData);\n }\n })\n .then(function() {\n // Load data if need\n // If user just login, force data full load (even if min data asked)\n // because the user can wait (after the login modal)\n var loadOptions = !needLogin && options && options.minData ? {minData: true} : undefined/*=load all*/;\n if (!isDataLoaded(loadOptions)) {\n return loadData(loadOptions);\n }\n })\n .then(function() {\n if (options && options.silent) {\n UIUtils.loading.hide(10);\n }\n else {\n UIUtils.loading.hide(1000);\n }\n\n return keepAuth ? data : angular.merge({}, data, authData);\n })\n .catch(function(err) {\n if (err === 'RETRY' && (!options || !options.authData)) {\n return $timeout(function(){\n return login(options);\n }, 300);\n }\n throw err;\n });\n },\n\n logout = function() {\n var wasAuth = isAuth();\n\n return $q(function(resolve, reject) {\n\n var pubkey = data.pubkey;\n resetData(); // will reset keypair\n resetStore(pubkey); // reset store\n\n // Send logout event\n api.data.raise.logout();\n\n if (wasAuth) {\n api.data.raise.unauth();\n }\n\n checkAuthIdle(false);\n\n $ionicHistory.clearCache();\n\n resolve();\n });\n },\n\n isLogin = function() {\n return !!data.pubkey;\n },\n\n auth = function(options) {\n if (!started) {\n return (startPromise || start())\n .then(function () {\n return auth(options); // loop\n });\n }\n\n // Disable auth, if readonly or demo\n if (csConfig.readonly || csConfig.demo) {\n return UIUtils.alert.demo()\n .then(function() {\n throw 'CANCELLED';\n });\n }\n\n if (isAuth() && (!options || !options.forceAuth)) {\n return $q.when(data);\n }\n\n options = options || {};\n options.expectedPubkey = isLogin() && data.pubkey;\n options.auth = true;\n return login(options);\n },\n\n unauth = function() {\n return $q(function(resolve, reject) {\n\n resetKeypair();\n store();\n\n // Send unauth event\n api.data.raise.unauth();\n\n checkAuthIdle(false);\n\n $ionicHistory.clearCache();\n\n resolve();\n });\n },\n\n isAuth = function() {\n return data.pubkey && data.keypair && data.keypair.signSk && true;\n },\n\n getKeypair = function(options) {\n if (!started) {\n return (startPromise || start())\n .then(function () {\n return getKeypair(options); // loop\n });\n }\n\n if (isAuth()) {\n return $q.when(data.keypair);\n }\n options = options || {};\n options.silent = angular.isDefined(options.silent) ? options.silent : true;\n return auth(options)\n .then(function() {\n return data.keypair;\n });\n },\n\n hasSelf = function() {\n return !!data.pubkey && !data.requirements.needSelf;\n },\n\n isDataLoaded = function(options) {\n if (options) {\n if (options.minData && !options.sources) return data.loaded && true;\n if (options.requirements && !data.requirements.loaded) return false;\n if (options.tx && options.tx.enable && (!data.tx.fromTime || data.tx.fromTime === 'pending')) return false;\n if (options.sigStock && !data.sigStock) return false;\n }\n return data.loaded && data.sources && true;\n },\n\n isNeverUsed = function() {\n if (!data.loaded) return undefined; // undefined if not full loaded\n return !data.pubkey || !(\n // Check registration\n data.isMember ||\n data.requirements.pendingMembership ||\n data.requirements.revoked ||\n !data.requirements.needSelf ||\n data.requirements.wasMember ||\n\n // Check sources\n (data.sources && data.sources.length > 0) ||\n\n // Check TX history\n data.tx.history.length > 0 ||\n data.tx.validating.length > 0 ||\n data.tx.pendings.length > 0 ||\n\n // Check extended data (name+avatar)\n !!data.localName ||\n !!data.name ||\n !!data.avatar\n );\n },\n\n isNew = function() {return !!data.isNew;},\n\n // If connected and same pubkey\n isUserPubkey = function(pubkey) {\n return isLogin() && data.pubkey === pubkey;\n },\n\n // store pubkey and uid\n store = function(pubkey) {\n pubkey = pubkey && typeof pubkey == 'string' ? pubkey : data.pubkey;\n if (settings && settings.useLocalStorage) {\n\n if (isLogin() && settings.rememberMe) {\n\n var now = Date.now();\n console.debug(\"[wallet] Storing...\");\n\n var jobs = [];\n\n // Use session storage for secret key - fix #372\n if (settings.keepAuthIdle == csSettings.constants.KEEP_AUTH_IDLE_SESSION && isAuth()) {\n jobs.push(sessionStorage.put(constants.STORAGE_SECKEY, CryptoUtils.util.encode_base58(data.keypair.signSk)));\n }\n else {\n jobs.push(sessionStorage.put(constants.STORAGE_SECKEY, null));\n }\n\n // Use local storage for pubkey\n jobs.push(localStorage.put(constants.STORAGE_PUBKEY, data.pubkey));\n\n // Use local storage for uid - fix #625\n if (data.uid) {\n jobs.push(localStorage.put(constants.STORAGE_UID, data.uid));\n }\n else {\n jobs.push(localStorage.put(constants.STORAGE_UID, null));\n }\n\n return $q.all(jobs)\n .then(function() {\n console.debug(\"[wallet] Stored in \"+ (Date.now() - now) +\"ms\");\n });\n }\n else {\n // Resetting local storage\n return $q.all([\n sessionStorage.put(constants.STORAGE_SECKEY, null),\n localStorage.put(constants.STORAGE_PUBKEY, null),\n localStorage.put(constants.STORAGE_UID, null),\n // Clean data (only in the session storage - keep local)\n pubkey ? sessionStorage.put(constants.STORAGE_DATA_PREFIX + pubkey, null) : $q.when()\n ]);\n }\n }\n else {\n return $q.all([\n sessionStorage.put(constants.STORAGE_SECKEY, null),\n localStorage.put(constants.STORAGE_PUBKEY, null),\n localStorage.put(constants.STORAGE_UID, null),\n // Clean data\n pubkey ? sessionStorage.put(constants.STORAGE_DATA_PREFIX + pubkey, null) : $q.when(),\n pubkey ? localStorage.put(constants.STORAGE_DATA_PREFIX + pubkey, null) : $q.when()\n ]);\n }\n },\n\n // reset data store for this pubkey\n resetStore = function(pubkey) {\n\n console.debug(\"[wallet] Resetting stored pubkey (and uid) in local storage...\");\n\n sessionStorage.put(constants.STORAGE_SECKEY, null);\n localStorage.put(constants.STORAGE_PUBKEY, null);\n localStorage.put(constants.STORAGE_UID, null);\n\n if (settings && settings.useLocalStorage) {\n // Clean data (only in the session storage - keep local)\n return pubkey ? sessionStorage.put(constants.STORAGE_DATA_PREFIX + pubkey, null) : $q.when();\n }\n else {\n console.debug(\"[wallet] Resetting stored data in local storage...\");\n return $q.all([\n pubkey ? sessionStorage.put(constants.STORAGE_DATA_PREFIX + pubkey, null) : $q.when(),\n pubkey ? localStorage.put(constants.STORAGE_DATA_PREFIX + pubkey, null) : $q.when()\n ]);\n }\n },\n\n // store children wallet, notifications read Time, ...\n storeData = function() {\n if (!isLogin()) throw {message:'ERROR.NEED_LOGIN_FIRST'};\n\n var useEncryption = settings && settings.useLocalStorageEncryption;\n var storageKey = constants.STORAGE_DATA_PREFIX + data.pubkey;\n\n var content; // Init only if used\n var secureContent; // Init only if used\n\n // Add time\n if (data.notifications && data.notifications.time) {\n content = content || {};\n content.notifications = {\n time: data.notifications.time\n };\n }\n if (data.invitations && data.invitations.time) {\n content = content || {};\n content.invitations = {\n time: data.invitations.time\n };\n }\n\n // Add children wallets\n if (data.children && data.children.length) {\n // remember children count - need when data still encrypted, by method getChildrenCount()\n content = content || {};\n content.childrenCount = data.children.length;\n\n secureContent = secureContent || {}; // Init th secured content\n // Add children wallet\n secureContent.children = _.map(data.children, function(wallet) {\n return {\n pubkey: wallet.data.pubkey,\n uid: wallet.data.uid,\n localName: wallet.data.localName\n };\n });\n }\n var contentStr = (content || secureContent) && JSON.stringify(angular.merge({}, content||{}, secureContent||{}));\n\n // Not encryption (or nothing to secure content): store without encryption\n if (!useEncryption || !secureContent) {\n return $q.all([\n sessionStorage.put(storageKey, null), // clear session storage (not used if no encryption)\n localStorage.put(storageKey, contentStr || null)\n ]);\n }\n\n // Encryption is enable, but user not auth: use the session storage\n // (and keep the local storage value)\n if (!isAuth()) {\n return sessionStorage.put(storageKey, contentStr||null);\n }\n\n return $q.all([\n // Get a unique nonce\n CryptoUtils.util.random_nonce(),\n // Get box keypair\n CryptoUtils.box.keypair.fromSignKeypair(data.keypair),\n // Put also (without encryption) in the session storage\n sessionStorage.put(storageKey, contentStr || null)\n ])\n .then(function(res) {\n var nonce = res[0];\n var keypair = res[1];\n\n return CryptoUtils.box.pack(JSON.stringify(secureContent), nonce, keypair.boxPk, keypair.boxSk)\n .then(function(cypherContent) {\n content = angular.merge(content||{}, {\n encryptedData: {\n nonce: CryptoUtils.util.encode_base58(nonce),\n content: cypherContent\n }\n });\n //console.debug(\"[wallet] Storing with encryption: \", content);\n return localStorage.put(storageKey, JSON.stringify(content));\n });\n });\n },\n\n restore = function() {\n return $q.all([\n sessionStorage.get(constants.STORAGE_SECKEY),\n localStorage.get(constants.STORAGE_PUBKEY),\n localStorage.get(constants.STORAGE_UID)\n ])\n .then(function(res) {\n var seckey = res[0];\n var pubkey = res[1];\n var uid = res[2];\n if (!pubkey || pubkey == 'null') return;\n\n console.debug('[wallet] Restore {' + pubkey.substring(0, 8) + '} from local storage');\n\n var keypair;\n if (seckey && seckey.length && seckey != 'null') {\n try {\n keypair = {\n signPk: CryptoUtils.util.decode_base58(pubkey),\n signSk: CryptoUtils.util.decode_base58(seckey)\n };\n }\n catch (err) {\n console.warn('[wallet] Secret key restoration failed: ', err);\n keypair = undefined;\n }\n }\n\n data.pubkey = pubkey;\n data.uid = uid && uid != 'null' ? uid : undefined;\n data.keypair = keypair || {signPk: undefined, signSk: undefined};\n\n // Get pubkey's data\n return restoreData();\n })\n\n .then(function() {\n // Successful restored: raise API events\n if (isAuth()) {\n return $q.all([\n api.data.raisePromise.login(data),\n checkAuthIdle(true),\n api.data.raisePromise.auth(data)\n ])\n .catch(function(err) {\n console.warn('Error during extension call [wallet.api.data.on.auth]', err);\n // continue\n });\n }\n else if (isLogin()) {\n return api.data.raisePromise.login(data)\n .catch(function(err) {\n console.warn('Error during extension call [wallet.api.data.on.login]', err);\n // continue\n });\n }\n })\n\n .then(function(){\n return data;\n });\n },\n\n restoreData = function() {\n if (!isLogin()) throw {message:'ERROR.NEED_LOGIN_FIRST'};\n if (isNew()) return $q.when(data); // Skip restore\n // Get pubkey's data\n return $q.all([\n sessionStorage.getObject(constants.STORAGE_DATA_PREFIX + data.pubkey),\n localStorage.getObject(constants.STORAGE_DATA_PREFIX + data.pubkey)\n ])\n // Apply data, first from the session storage, then from local storage\n .then(function (res) {\n var sessionStorageData = res[0];\n var localStorageData = res[1];\n if (sessionStorageData && sessionStorageData.children && sessionStorageData.children.length === localStorageData.childrenCount) {\n return applyRestoredData(sessionStorageData)\n .catch(function(err) {\n console.error(\"[wallet] Failed to restore from the session storage ! Retrying from the local storage...\", err);\n // Retry using another storage\n return applyRestoredData(localStorageData);\n });\n }\n return applyRestoredData(localStorageData);\n });\n },\n\n applyRestoredData = function(content) {\n if (!content) return $q.when(); // skip\n\n // Apply children\n if (content.children) {\n var oldChildrenCount = data.childrenCount;\n var oldChildren = removeAllChildrenWallets({\n stop: false, /*do not stop wallet*/\n store: false/*skip store*/\n });\n\n try {\n var pubkeys = {};\n _.forEach(content.children, function(child) {\n if (!pubkeys[child.pubkey]) { // make sure wallet is unique by pubkey\n pubkeys[child.pubkey] = true;\n var wallet = newChildInstance();\n wallet.data.pubkey = child.pubkey;\n wallet.data.localName = child.localName;\n wallet.data.uid = child.uid;\n addChildWallet(wallet, {store: false/*skip store*/});\n }\n });\n delete content.children;\n // childrenCount not need anymore\n delete data.childrenCount;\n }\n catch(err) {\n console.error(\"[wallet] Failed to restore children wallet.\", err);\n // Restore removed values\n data.childrenCount = oldChildrenCount;\n data.children = oldChildren;\n return $q.reject({message:'ERROR.RESTORE_WALLET_LIST_FAILED'});\n }\n\n // Restoration succeed: stop old children\n _.forEach(oldChildren||[], function(child) {\n child.stop();\n });\n }\n\n // make sure to remove pubkey before copy\n delete content.pubkey;\n delete content.uid;\n\n // Copy to data\n angular.merge(data, content);\n\n // If auth: open encrypted data\n if (hasEncryptedData() && isAuth()) {\n return openEncryptedData({store: false})\n .then(function(){\n return data; // Important: return the data\n });\n }\n\n return $q.when(data); // Important: return the data\n },\n\n getData = function() {\n return data;\n },\n\n loadRequirements = function(withCache, secondTry) {\n // Clean existing events\n cleanEventsByContext('requirements');\n\n // Get requirements\n return csWot.loadRequirements(data, withCache)\n .catch(function(err) {\n // Retry once (can be a timeout, because Duniter node are long to response)\n if (!secondTry) {\n console.error(\"[wallet] Unable to load requirements (first try): {0}. Retrying once...\".format(err && err.message || err), err);\n UIUtils.loading.update({template: \"COMMON.LOADING_WAIT\"});\n return loadRequirements(withCache, true);\n }\n console.error(\"[wallet] Unable to load requirements (after a second try): {0}\".format(err && err.message || err), err);\n throw err;\n });\n },\n\n loadTxAndSources = function(fromTime) {\n return csTx.load(data.pubkey, fromTime)\n .then(function(res){\n resetTxAndSources();\n angular.merge(data, res);\n })\n .catch(function(err) {\n resetTxAndSources();\n throw err;\n });\n },\n\n loadSources = function() {\n return csTx.loadSources(data.pubkey)\n .then(function(res){\n resetSources();\n angular.merge(data, res);\n })\n .catch(function(err) {\n resetSources();\n throw err;\n });\n },\n\n /**\n * Add user events (generate events from requirements)\n */\n addEvents = function() {\n if (data.requirements.revoked) {\n delete data.requirements.meta.invalid;\n addEvent({type:'info', message: 'ERROR.WALLET_REVOKED', context: 'requirements'});\n }\n else if (data.requirements.pendingRevocation) {\n delete data.requirements.meta.invalid;\n addEvent({type:'pending', message: 'INFO.REVOCATION_SENT_WAITING_PROCESS', context: 'requirements'});\n }\n\n // If not revoked\n else {\n if (!data.isMember && data.requirements.meta && data.requirements.meta.invalid) {\n addEvent({type: 'error', message: 'ERROR.WALLET_INVALID_BLOCK_HASH', context: 'requirements'});\n console.debug(\"Invalid membership for uid={0}: block hash changed\".format(data.uid));\n }\n // Check if self expired\n else if (!data.isMember && data.requirements.expired) {\n addEvent({type: 'error', message: 'ERROR.WALLET_IDENTITY_EXPIRED', context: 'requirements'});\n console.debug(\"Identity expired for uid={0}.\".format(data.uid));\n }\n // Pending membership\n else if (data.requirements.pendingMembership) {\n addEvent({type:'pending', message: 'ACCOUNT.WAITING_MEMBERSHIP', context: 'requirements'});\n\n // Add a warning when out distanced\n // (only if has enough certification - fix #808)\n if (!data.requirements.needCertificationCount && data.requirements.outdistanced) {\n addEvent({type:'warn', message: 'ACCOUNT.OUT_DISTANCED', context: 'requirements'});\n }\n }\n // If user has send a SELF, ask for membership - fix #625\n else if (!data.requirements.needSelf && data.requirements.needMembership){\n addEvent({type:'warn', message: 'ACCOUNT.NO_WAITING_MEMBERSHIP', context: 'requirements'});\n }\n\n if (data.requirements.needRenew) {\n // Still a member: WILL need renew\n if (data.isMember && data.requirements.membershipExpiresIn > 0) {\n addEvent({type:'warn', message: 'ACCOUNT.WILL_NEED_RENEW_MEMBERSHIP', messageParams: data.requirements, context: 'requirements'});\n }\n // Fix #649: Not a member anymore, even if membership NOT expired, because membersjip cancelled for lack of certifications\n else if (!data.isMember && data.requirements.membershipExpiresIn > 0 && data.requirements.needCertificationCount > 0) {\n addEvent({type:'warn', message: 'ACCOUNT.NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED', messageParams: data.requirements, context: 'requirements'});\n }\n // Not a member anymore\n else {\n addEvent({type:'warn', message: 'ACCOUNT.NEED_RENEW_MEMBERSHIP', messageParams: data.requirements, context: 'requirements'});\n }\n }\n else\n {\n if (data.requirements.needCertificationCount > 0) {\n addEvent({type:'info', message: 'ACCOUNT.WAITING_CERTIFICATIONS', messageParams: data.requirements, context: 'requirements'});\n // Add a help message, if user has never been a member\n if (!data.requirements.wasMember) {\n addEvent({\n type: 'help',\n message: 'ACCOUNT.WAITING_CERTIFICATIONS_HELP',\n messageParams: data.requirements,\n context: 'requirements'\n });\n }\n }\n if (data.requirements.willNeedCertificationCount > 0) {\n addEvent({type:'warn', message: 'ACCOUNT.WILL_MISSING_CERTIFICATIONS', messageParams: data.requirements, context: 'requirements'});\n }\n if (data.requirements.wasMember && data.requirements.needMembership) {\n addEvent({type:'warn', message: 'ACCOUNT.NEED_RENEW_MEMBERSHIP', messageParams: data.requirements, context: 'requirements'});\n }\n // Add a warning when out distanced - fix #777\n if (!data.requirements.needCertificationCount && !data.requirements.willNeedCertificationCount && data.requirements.outdistanced) {\n addEvent({type:'warn', message: 'ACCOUNT.OUT_DISTANCED', context: 'requirements'});\n }\n }\n }\n },\n\n loadSigStock = function() {\n // Get certified by, then count written certification\n return BMA.wot.certifiedBy({pubkey: data.pubkey})\n .then(function(res){\n data.sigStock = !res.certifications ? 0 : res.certifications.reduce(function(res, cert) {\n return cert.written === null ? res : res+1;\n }, 0);\n })\n .catch(function(err) {\n if (!!err && err.ucode == BMA.errorCodes.NO_MATCHING_MEMBER) {\n data.sigStock = 0;\n }\n /*FIXME: workaround for Duniter issue #1309 */\n else if (!!err && err.ucode == 1002) {\n console.warn(\"[wallet-service] Detecting Duniter issue #1309 ! Applying workaround... \");\n data.sigStock = 0;\n }\n else {\n throw err;\n }\n });\n },\n\n loadQrCode = function(){\n if (!data.pubkey || data.qrcode) return $q.when(data.qrcode);\n console.debug(\"[wallet] Creating SVG QRCode...\");\n return $timeout(function() {\n data.qrcode = UIUtils.qrcode.svg(data.pubkey);\n return data.qrcode;\n });\n },\n\n loadData = function(options) {\n\n var alertIfUnusedWallet = !csCurrency.data.initPhase && (!csSettings.data.wallet || csSettings.data.wallet.alertIfUnusedWallet) &&\n !data.loaded && (!options || !options.minData || !options.silent);\n\n // Make sure to load once at a time\n if (loadPromise) {\n return loadPromise.then(function() {\n return isDataLoaded(options) ? data : refreshData(options);\n });\n }\n\n if (options && options.minData) {\n loadPromise = loadMinData(options);\n }\n else if (options || data.loaded) {\n loadPromise = refreshData(options);\n }\n else {\n loadPromise = loadFullData();\n }\n\n return $q.all([\n loadPromise,\n\n // Create the QR code\n loadQrCode()\n ])\n // Warn if wallet has been never used - see #167\n .then(function() {\n var unused = isNeverUsed();\n var showAlert = alertIfUnusedWallet && !isNew() && unused === true;\n if (!showAlert) return true;\n return UIUtils.loading.hide()\n .then(function() {\n return UIUtils.alert.confirm('CONFIRM.LOGIN_UNUSED_WALLET', 'CONFIRM.LOGIN_UNUSED_WALLET_TITLE', {\n cancelText: 'COMMON.BTN_CONTINUE',\n okText: 'COMMON.BTN_RETRY'\n });\n })\n .then(function(retry) {\n if (retry) {\n return logout().then(function() {\n throw 'RETRY';\n });\n }\n else {\n // Remembering to not ask for confirmation\n if (csSettings.data.wallet.alertIfUnusedWallet) {\n csSettings.data.wallet.alertIfUnusedWallet = false;\n csSettings.store();\n }\n }\n return true;\n });\n })\n\n // Return wallet data\n .then(function(confirm) {\n loadPromise = null;\n if (confirm) {\n return data;\n }\n else { // cancel\n\n throw 'CANCELLED';\n }\n });\n },\n\n loadFullData = function(fromTime) {\n data.loaded = false;\n\n var now = Date.now();\n console.debug(\"[wallet] Loading {{0}} full data...\".format(data.pubkey && data.pubkey.substr(0,8)));\n\n return $q.all([\n\n // Get requirements\n loadRequirements(true)\n .then(function(data) {\n if (data.requirements && (data.requirements.isMember || data.requirements.wasMember)) {\n // Load sigStock\n return loadSigStock();\n }\n else {\n data.sigStock = 0;\n }\n }),\n\n // Get TX and sources (only pending by default)\n loadTxAndSources(fromTime || 'pending')\n ])\n .then(function() {\n\n // Load wallet events\n addEvents();\n\n // API extension\n return api.data.raisePromise.load(data)\n .catch(function(err) {\n console.error('[wallet] Error during load API extension point. Try to continue',err);\n });\n })\n .then(function() {\n data.loaded = true;\n console.debug(\"[wallet] Loaded {{0}} full data in {1}ms\".format(data.pubkey && data.pubkey.substr(0,8), Date.now() - now));\n\n // Make sure to hide loading, because sometimes it stay - should fix freeze screen\n UIUtils.loading.hide(1000);\n return data;\n })\n .catch(function(err) {\n data.loaded = false;\n throw err;\n });\n },\n\n loadMinData = function(options) {\n options = options || {};\n options.requirements = angular.isDefined(options.requirements) ? options.requirements :\n (!data.requirements.loaded || angular.isUndefined(data.requirements.needSelf));\n if (!options.requirements) {\n return $q.when(data);\n }\n\n return refreshData(options)\n .then(function(data) {\n data.loaded = true;\n return data;\n });\n },\n\n refreshData = function(options) {\n options = options || {\n requirements: true,\n sources: true,\n tx: {\n enable: true,\n fromTime: data.tx && data.tx.fromTime !== 'pending' ? data.tx.fromTime : undefined // keep previous time\n },\n sigStock: true,\n api: true\n };\n\n // Force some load (requirements) if not already loaded\n options.requirements = angular.isDefined(options.requirements) ? options.requirements : !data.requirements.loaded;\n\n // Force sources when TX enable\n if (angular.isUndefined(options.sources) && options.tx && options.tx.enable) {\n options.sources = true;\n }\n\n var jobs = [];\n\n var now = Date.now();\n console.debug(\"[wallet] {0} {{1}} data, with options: \".format(!data.loaded ? 'Loading' : 'Refreshing', data.pubkey.substr(0,8)), options);\n\n // Get requirements\n if (options.requirements) {\n // Reset events\n cleanEventsByContext('requirements');\n\n jobs.push(\n loadRequirements(true)\n\n // Add wallet events\n .then(addEvents)\n );\n }\n\n if (options.sources && (!options.tx || options.tx.enable)) {\n // Get TX and sources\n jobs.push(loadTxAndSources(options.tx ? options.tx.fromTime: undefined));\n }\n\n else if (options.sources && (options.tx && !options.tx.enable)) {\n // Get sources and only pending TX (and NOT the TX history)\n jobs.push(loadTxAndSources('pending'));\n }\n\n // Load sigStock\n if (options.sigStock) jobs.push(loadSigStock());\n\n return (jobs.length ? $q.all(jobs) : $q.when())\n .then(function() {\n // Skip api\n if (angular.isDefined(options.api) && !options.api) return data;\n\n // API extension (after all other jobs)\n return api.data.raisePromise.load(data)\n .then(function(){\n\n console.debug(\"[wallet] {0} {{1}} data in {2}ms\".format(!data.loaded ? 'Loaded' : 'Refreshed', data.pubkey.substr(0,8), Date.now() - now));\n\n // Compute if full loaded\n if (!data.loaded) {\n data.loaded = data.requirements.loaded && data.sources && true;\n }\n\n return data;\n });\n })\n .catch(function(err) {\n console.error(\"[wallet] Error while {0} data: {1}\".format(!data.loaded ? 'Loading' : 'Refreshing', (err && err.message || err)), err);\n data.loaded = data.requirements.loaded && data.sources && true;\n throw err;\n });\n },\n\n setSelf = function(uid, blockUid){\n // Skip if same self\n if (data.uid == uid && (!blockUid || data.blockUid == blockUid)) return $q.when();\n\n // Data not loaded\n if (!data.loaded) {\n return !loadPromise ?\n // If no pending load: ok\n $q.when() :\n // If a load is running: force a reload\n loadPromise.then(function() {\n return setSelf(uid, blockUid); // loop\n });\n }\n\n data.uid = uid;\n data.blockUid = blockUid;\n\n // Refresh requirements\n return refreshData({requirements: true, sigStock: true})\n .then(function() {\n // Store (to remember the new uid)\n return store({skipData: true});\n });\n },\n\n isBase = function(amount, base) {\n if (!base) return true; // no base\n if (amount < Math.pow(10, base)) return false; // too small\n var rest = '00000000' + amount;\n var lastDigits = parseInt(rest.substring(rest.length-base));\n return lastDigits === 0; // no rest\n },\n\n truncBase = function(amount, base) {\n var pow = Math.pow(10, base); // = min value in this base\n if (amount < pow) return 0;\n return Math.trunc(amount / pow ) * pow;\n },\n\n truncBaseOrMinBase = function(amount, base) {\n var pow = Math.pow(10, base);\n if (amount < pow) return pow; //\n return Math.trunc(amount / pow ) * pow;\n },\n\n powBase = function(amount, base) {\n return base <= 0 ? amount : amount * Math.pow(10, base);\n },\n\n getInputs = function(amount, outputBase, filterBase) {\n if (angular.isUndefined(filterBase)) {\n filterBase = outputBase;\n }\n var sourcesAmount = 0;\n var sources = [];\n var minBase = filterBase;\n var maxBase = filterBase;\n _.find(data.sources || [], function(source) {\n if (!source.consumed && source.base === filterBase &&\n // Filter on simple SIG output condition - fix #845\n BMA.regexp.TX_OUTPUT_SIG.exec(source.conditions)\n ) {\n sourcesAmount += powBase(source.amount, source.base);\n sources.push(source);\n }\n // Stop if enough sources\n return (sourcesAmount >= amount);\n });\n\n // IF not enough sources, get add inputs from lower base (recursively)\n if (sourcesAmount < amount && filterBase > 0) {\n filterBase -= 1;\n var missingAmount = amount - sourcesAmount;\n var lowerInputs = getInputs(missingAmount, outputBase, filterBase);\n\n // Add lower base inputs to result\n if (lowerInputs.amount > 0) {\n minBase = lowerInputs.minBase;\n sourcesAmount += lowerInputs.amount;\n [].push.apply(sources, lowerInputs.sources);\n }\n }\n\n return {\n minBase: minBase,\n maxBase: maxBase,\n amount: sourcesAmount,\n sources: sources\n };\n },\n\n /**\n * Send a new transaction\n */\n transfer = function(destPub, amount, comments, useRelative, restPub, block) {\n return $q.all([\n getKeypair(),\n csCurrency.get(),\n block && $q.when(block) || csCurrency.blockchain.current(true)\n ])\n .then(function(res) {\n var keypair = res[0];\n var currency = res[1];\n block = res[2];\n if (!BMA.regexp.PUBKEY.test(destPub)){\n throw {message:'ERROR.INVALID_PUBKEY'};\n }\n if (!BMA.regexp.COMMENT.test(comments)){\n throw {message:'ERROR.INVALID_COMMENT'};\n }\n if (!isLogin()){\n throw {message:'ERROR.NEED_LOGIN_FIRST'};\n }\n if (destPub === data.pubkey){\n throw {message:'ERROR.SAME_TX_RECIPIENT'};\n }\n if (!amount) {\n throw {message:'ERROR.AMOUNT_REQUIRED'};\n }\n if (amount <= 0) {\n throw {message:'ERROR.AMOUNT_NEGATIVE'};\n }\n amount = Math.floor(amount); // remove decimals\n\n var inputs = {\n amount: 0,\n minBase: block.unitbase,\n maxBase: block.unitbase + 1,\n sources : []\n };\n\n var logs = [];\n logs.push(\"[wallet] amount=\" + amount);\n\n // Get inputs, starting to use current base sources\n var amountBase = 0;\n while (inputs.amount < amount && amountBase <= block.unitbase) {\n inputs = getInputs(amount, block.unitbase);\n\n if (inputs.amount < amount) {\n // try to reduce amount (replace last digits to zero)\n amountBase++;\n if (amountBase <= block.unitbase) {\n amount = truncBase(amount, amountBase);\n logs.push(\"[wallet] inputs not found. Retrying with amount =\" + amount + \" be compatible with amountBase=\" + amountBase);\n }\n }\n }\n\n if (inputs.amount < amount) {\n if (data.balance < amount) {\n throw {message:'ERROR.NOT_ENOUGH_CREDIT'};\n }\n else if (inputs.amount === 0) {\n throw {message:'ERROR.ALL_SOURCES_USED'};\n }\n else {\n return $translate('COMMON.UD')\n .then(function(UD) {\n var params;\n if(useRelative) {\n params = {\n amount: ($filter('formatDecimal')(inputs.amount / currency.currentUD)),\n unit: UD,\n subUnit: $filter('abbreviate')(currency.name)\n };\n }\n else {\n params = {\n amount: ($filter('formatDecimal')(inputs.amount/100)),\n unit: $filter('abbreviate')(currency.name),\n subUnit: ''\n };\n }\n return $translate('ERROR.NOT_ENOUGH_SOURCES', params)\n .then(function(message) {\n throw {message: message};\n });\n });\n }\n }\n // Avoid to get outputs on lower base\n if (amountBase < inputs.minBase && !isBase(amount, inputs.minBase)) {\n amount = truncBaseOrMinBase(amount, inputs.minBase);\n console.debug(\"[wallet] Amount has been truncate to \" + amount);\n logs.push(\"[wallet] Amount has been truncate to \" + amount);\n }\n else if (amountBase > 0) {\n console.debug(\"[wallet] Amount has been truncate to \" + amount);\n logs.push(\"[wallet] Will use amount truncated to \" + amount + \" (amountBase=\"+amountBase+\")\");\n }\n\n // Send tx\n return createAndSendTx(currency, block, keypair, destPub, amount, inputs, comments, restPub||data.pubkey, logs)\n .then(function(res) {\n data.balance -= res.amount;\n if (data.balance < 0) data.balance = 0; // fix #712\n _.forEach(inputs.sources, function(source) {\n source.consumed=true;\n });\n\n // Add new sources\n if (res && res.sources.length) {\n console.debug(\"[wallet-service] New sources to be add after the TX: \", res.sources);\n addSources(res.sources);\n }\n\n // Add TX to pendings\n var pendingTx = {\n time: csCurrency.date.now(),\n amount: -amount,\n pubkey: destPub,\n comment: comments,\n isUD: false,\n hash: res.hash,\n locktime: 0,\n block_number: null\n };\n return csWot.extendAll([pendingTx], 'pubkey')\n .then(function() {\n data.tx.pendings.unshift(pendingTx);\n\n // API extension\n api.data.raise.balanceChanged(data);\n api.data.raise.newTx(data);\n\n // Return TX hash (if chained TXs, return the last tx hash) - required by Cesium-API\n return {\n hash: res.hash\n };\n });\n })\n .catch(function(err) {\n\n // Source already consumed: whould refresh wallet sources\n if (err && err.ucode === BMA.errorCodes.SOURCE_ALREADY_CONSUMED) {\n console.debug('[wallet] TX rejected by node with error [{0}]. Reloading sources then retry...'.format(err.message||'Source already consumed'));\n return $timeout(loadTxAndSources, 500)\n .then(function() {\n return transfer(destPub, amount, comments, useRelative, restPub, block);\n });\n }\n\n // Error in generated TX - issue #524\n else if (err && err.ucode === BMA.errorCodes.TX_INPUTS_OUTPUTS_NOT_EQUAL) {\n // Ask user to send log to developers\n var esEnable = csSettings.data.plugins && csSettings.data.plugins.es && csSettings.data.plugins.es.enable;\n if (esEnable) {\n UIUtils.loading.hide();\n return UIUtils.alert.confirm('CONFIRM.ISSUE_524_SEND_LOG', 'ERROR.POPUP_TITLE', {\n cssClass: 'warning',\n okText: 'COMMON.BTN_OK',\n cancelText: 'COMMON.BTN_NO'\n })\n .then(function(confirm) {\n if (confirm) {\n api.error.raise.send({\n title: 'Issue #524 logs',\n content: 'App version: ' +csConfig.version+'\\n'+\n 'App build: ' +csConfig.build+'\\n'+\n 'Logs:\\n\\n' + logs.join('\\n')\n });\n return $timeout(function() {\n throw {message: 'ERROR.ISSUE_524_TX_FAILED'};\n }, 1500);\n }\n throw {message: 'ERROR.SEND_TX_FAILED'};\n });\n }\n }\n throw err;\n });\n });\n },\n\n /**\n * Send a WIF wallet\n */\n transferAll = function(destPub, amount, comments, useRelative, restPub) {\n if (!isLogin()) return $q.reject({message:'ERROR.NEED_LOGIN_FIRST'});\n\n if (!restPub || destPub == restPub) {\n return $q.reject({message: \"Could not have same pubkey for 'destPub' and 'restPub'\"});\n }\n\n return csCurrency.blockchain.lastValid()\n .then(function(block) {\n console.debug(\"[wallet] Using last valid block as TX reference (to avoid network fork): \", block);\n\n return transfer(destPub, amount, comments, useRelative, restPub, block)\n .then(function() {\n // If more money: transfer all to restPub\n if (data.balance > 0 && restPub) {\n console.debug(\"[wallet] Wallet has some more money: transfering fund to [{0}]\".format(restPub.substring(0,8)));\n return transfer(restPub, data.balance, undefined/*comments*/, false/*useRelative*/, restPub, block);\n }\n });\n\n });\n\n },\n\n /**\n * Create TX doc and send it\n * @param block the current block\n * @param destPub\n * @param amount\n * @param inputs\n * @param comments\n * @return the hash of the sent TX\n */\n createAndSendTx = function(currency, block, keypair, destPub, amount, inputs, comments, restPub, logs) {\n\n // Make sure a TX in compact mode has no more than 100 lines (fix #118)\n // (If more than 100 lines, send to TX to himself first, then its result as sources for the final TX)\n if (inputs.sources.length > constants.TX_MAX_INPUTS_COUNT) {\n console.debug(\"[Wallet] TX has to many sources. Will chain TX...\");\n\n // Compute a slice of sources\n var firstSlice = {\n minBase: block.unitbase,\n maxBase: 0,\n amount: 0,\n sources: inputs.sources.slice(0, constants.TX_MAX_INPUTS_COUNT) /* end index is excluded, so array length=TX_MAX_INPUTS_COUNT - issue #524 */\n };\n _.forEach(firstSlice.sources, function(source) {\n if (source.base < firstSlice.minBase) firstSlice.minBase = source.base;\n if (source.base > firstSlice.maxBase) firstSlice.maxBase = source.base;\n firstSlice.amount += powBase(source.amount, source.base);\n });\n\n // Send inputs first slice\n return createAndSendTx(currency, block, keypair, data.pubkey/*to himself*/, firstSlice.amount, firstSlice, undefined/*comment not need*/, data.pubkey/*rest to himself*/, logs)\n .then(function(res) {\n _.forEach(firstSlice.sources, function(source) {\n source.consumed=true;\n });\n addSources(res.sources);\n\n var secondSlice = {\n minBase: block.unitbase,\n maxBase: 0,\n amount: 0,\n sources: inputs.sources.slice(constants.TX_MAX_INPUTS_COUNT).concat(res.sources)\n };\n _.forEach(secondSlice.sources, function(source) {\n if (source.base < secondSlice.minBase) secondSlice.minBase = source.base;\n if (source.base > secondSlice.maxBase) secondSlice.maxBase = source.base;\n secondSlice.amount += powBase(source.amount, source.base);\n });\n\n // Send inputs second slice (recursive call)\n return createAndSendTx(currency, block, keypair, destPub, amount, secondSlice, comments, restPub, logs);\n });\n }\n\n var tx = 'Version: '+ constants.TX_VERSION +'\\n' +\n 'Type: Transaction\\n' +\n 'Currency: ' + currency.name + '\\n' +\n 'Blockstamp: ' + block.number + '-' + block.hash + '\\n' +\n 'Locktime: 0\\n' + // no lock\n 'Issuers:\\n' +\n data.pubkey + '\\n' +\n 'Inputs:\\n';\n\n _.forEach(inputs.sources, function(source) {\n // if D : AMOUNT:BASE:D:PUBLIC_KEY:BLOCK_ID\n // if T : AMOUNT:BASE:T:T_HASH:T_INDEX\n tx += [source.amount, source.base, source.type, source.identifier,source.noffset].join(':')+\"\\n\";\n });\n\n tx += 'Unlocks:\\n';\n for (i=0; i<inputs.sources.length; i++) {\n // INPUT_INDEX:UNLOCK_CONDITION\n tx += i + ':SIG(0)\\n';\n }\n\n tx += 'Outputs:\\n';\n // AMOUNT:BASE:CONDITIONS\n var rest = amount;\n var outputBase = inputs.maxBase;\n var outputAmount;\n var outputOffset = 0;\n var newSources = [];\n // Outputs to receiver (if not himself)\n if (destPub !== data.pubkey) {\n while(rest > 0) {\n outputAmount = truncBase(rest, outputBase);\n rest -= outputAmount;\n if (outputAmount > 0) {\n outputAmount = outputBase === 0 ? outputAmount : outputAmount / Math.pow(10, outputBase);\n tx += outputAmount + ':' + outputBase + ':SIG(' + destPub + ')\\n';\n outputOffset++;\n }\n outputBase--;\n }\n rest = inputs.amount - amount;\n outputBase = inputs.maxBase;\n }\n // Outputs to restPub\n while(rest > 0) {\n outputAmount = truncBase(rest, outputBase);\n rest -= outputAmount;\n if (outputAmount > 0) {\n outputAmount = outputBase === 0 ? outputAmount : outputAmount / Math.pow(10, outputBase);\n tx += outputAmount +':'+outputBase+':SIG('+restPub+')\\n';\n // If rest to himself: add new sources\n if (data.pubkey === restPub) {\n newSources.push({\n type: 'T',\n noffset: outputOffset,\n amount: outputAmount,\n base: outputBase,\n conditions: 'SIG('+restPub+')',\n consumed: false\n });\n }\n outputOffset++;\n }\n outputBase--;\n }\n\n tx += \"Comment: \"+ (comments||\"\") + \"\\n\";\n\n // Append to logs (need to resolve issue #524)\n if (logs) {\n if (destPub == data.pubkey) {\n logs.push('[wallet] Creating new TX, using inputs:\\n - minBase: '+inputs.minBase+'\\n - maxBase: '+inputs.maxBase);\n }\n else {\n logs.push('[wallet] Creating new TX, using inputs:\\n - minBase: '+inputs.minBase+'\\n - maxBase: '+inputs.maxBase + '\\n - sources (=TX inputs):');\n }\n _.forEach(inputs.sources, function(source) {\n logs.push([source.amount, source.base, source.type, source.identifier,source.noffset].join(':'));\n });\n logs.push(\"\\n[wallet] generated TX document (without signature) :\\n------ START ------\\n\" + tx + \"------ END ------\\n\");\n }\n\n return CryptoUtils.sign(tx, keypair)\n .then(function(signature) {\n var signedTx = tx + signature + \"\\n\";\n return BMA.tx.process({transaction: signedTx})\n .catch(function(err) {\n if (err && err.ucode === BMA.errorCodes.TX_ALREADY_PROCESSED) {\n // continue\n return;\n }\n throw err;\n })\n .then(function() {\n return CryptoUtils.util.hash(signedTx);\n })\n .then(function(txHash) {\n _.forEach(newSources, function(output) {\n output.identifier= txHash;\n output.consumed = false;\n output.pending = true;\n });\n return {\n amount: (data.pubkey === destPub) ? 0 : ((data.pubkey === restPub) ? amount : inputs.amount),\n tx: signedTx,\n hash: txHash,\n sources: newSources\n };\n });\n });\n },\n\n getIdentityDocument = function(currency, keypair, uid, blockUid) {\n uid = uid || data.uid;\n blockUid = blockUid || data.blockUid;\n if (!uid || !blockUid) {\n throw {message: 'ERROR.WALLET_HAS_NO_SELF'};\n }\n if (data.requirements.expired) {\n throw {message: 'ERROR.WALLET_IDENTITY_EXPIRED'};\n }\n\n var identity = 'Version: '+ constants.IDTY_VERSION +'\\n' +\n 'Type: Identity\\n' +\n 'Currency: ' + currency.name + '\\n' +\n 'Issuer: ' + data.pubkey + '\\n' +\n 'UniqueID: ' + uid + '\\n' +\n 'Timestamp: ' + blockUid + '\\n';\n return CryptoUtils.sign(identity, keypair)\n .then(function(signature) {\n identity += signature + '\\n';\n console.debug('Has generate an identity document:\\n----\\n' + identity + '----');\n return identity;\n });\n },\n\n /**\n * Send self identity\n */\n self = function(uid, needToLoadRequirements) {\n if (!BMA.regexp.USER_ID.test(uid)){\n return $q.reject({message: 'ERROR.INVALID_USER_ID'});\n }\n var block;\n return $q.all([\n getKeypair(),\n csCurrency.get(),\n csCurrency.blockchain.lastValid()\n ])\n // Create identity document\n .then(function(res) {\n var keypair = res[0];\n var currency = res[1];\n block = res[2];\n return getIdentityDocument(currency, keypair, uid, block.number + '-' + block.hash);\n })\n\n // Send to node\n .then(function (identity) {\n return BMA.wot.add({identity: identity});\n })\n\n .then(function () {\n if (!!needToLoadRequirements) {\n // Refresh membership data (if need)\n return loadRequirements(false/*no cache*/)\n\n // Add wallet events\n .then(addEvents);\n }\n else {\n data.uid = uid;\n data.blockUid = block.number + '-' + block.hash;\n }\n })\n .catch(function (err) {\n if (err && err.ucode === BMA.errorCodes.IDENTITY_SANDBOX_FULL) {\n throw {ucode: BMA.errorCodes.IDENTITY_SANDBOX_FULL, message: 'ERROR.IDENTITY_SANDBOX_FULL'};\n }\n throw err;\n });\n },\n\n /**\n * Send membership (in or out)\n */\n membership = function(sideIn) {\n return function() {\n var membership;\n\n return $q.all([\n getKeypair(),\n csCurrency.blockchain.lastValid()\n ])\n .then(function(res) {\n var keypair = res[0];\n var block = res[1];\n // Create membership to sign\n membership = 'Version: '+ constants.MS_VERSION +'\\n' +\n 'Type: Membership\\n' +\n 'Currency: ' + block.currency + '\\n' +\n 'Issuer: ' + data.pubkey + '\\n' +\n 'Block: ' + block.number + '-' + block.hash + '\\n' +\n 'Membership: ' + (!!sideIn ? \"IN\" : \"OUT\" ) + '\\n' +\n 'UserID: ' + data.uid + '\\n' +\n 'CertTS: ' + data.blockUid + '\\n';\n\n return CryptoUtils.sign(membership, keypair);\n })\n .then(function(signature) {\n var signedMembership = membership + signature + '\\n';\n // Send signed membership\n return BMA.blockchain.membership({membership: signedMembership});\n })\n .then(function() {\n return $timeout(function() {\n return loadRequirements(false /*no cache*/);\n }, 1000); // waiting for node to process membership doc\n })\n\n // Add wallet events\n .then(addEvents);\n };\n },\n\n /**\n * Send identity certification\n */\n certify = function(uid, pubkey, timestamp, signature, isMember, wasMember) {\n return $q.all([\n getKeypair(),\n csCurrency.get(),\n csCurrency.blockchain.lastValid()\n ])\n .then(function(res) {\n var keypair = res[0];\n var currency = res[1];\n var block = res[2];\n\n // Check if member account\n if (!data.isMember && !csConfig.initPhase) {\n throw {message:'ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION'};\n }\n\n // Create the self part to sign\n var cert = 'Version: '+ constants.CERT_VERSION +'\\n' +\n 'Type: Certification\\n' +\n 'Currency: ' + currency.name + '\\n' +\n 'Issuer: ' + data.pubkey + '\\n' +\n 'IdtyIssuer: ' + pubkey + '\\n' +\n 'IdtyUniqueID: ' + uid + '\\n' +\n 'IdtyTimestamp: ' + timestamp + '\\n' +\n 'IdtySignature: ' + signature + '\\n' +\n 'CertTimestamp: ' + block.number + '-' + block.hash + '\\n';\n\n return CryptoUtils.sign(cert, keypair)\n .then(function(signature) {\n var signedCert = cert + signature + '\\n';\n return BMA.wot.certify({cert: signedCert});\n })\n .then(function() {\n var cert = {\n pubkey: pubkey,\n uid: uid,\n time: block.medianTime,\n isMember: isMember,\n wasMember: wasMember,\n expiresIn: currency.parameters.sigWindow,\n pending: true,\n block: block.number,\n valid: true\n };\n\n // Notify extension\n api.action.raise.certify(cert);\n\n return cert;\n });\n });\n },\n\n addEvent = function(event, insertAtFirst) {\n event = event || {};\n event.type = event.type || 'info';\n event.message = event.message || '';\n event.messageParams = event.messageParams || {};\n event.context = event.context || 'undefined';\n if (event.message.trim().length) {\n if (!insertAtFirst) {\n data.events.push(event);\n }\n else {\n data.events.splice(0, 0, event);\n }\n }\n else {\n console.debug('Event without message. Skipping this event');\n }\n },\n\n getkeypairSaveId = function(record) {\n var nbCharSalt = Math.round(record.answer.length / 2);\n var salt = record.answer.substr(0, nbCharSalt);\n var pwd = record.answer.substr(nbCharSalt);\n return CryptoUtils.scryptKeypair(salt, pwd)\n .then(function (keypair) {\n record.pubkey = CryptoUtils.util.encode_base58(keypair.signPk);\n record.keypair = keypair;\n return record;\n });\n },\n\n getCryptedId = function(record){\n return getkeypairSaveId(record)\n .then(CryptoUtils.util.random_nonce)\n .then(function(nonce) {\n record.nonce = CryptoUtils.util.encode_base58(nonce);\n return $q.all([\n CryptoUtils.box.pack(record.salt, nonce, record.keypair.boxPk, record.keypair.boxSk),\n CryptoUtils.box.pack(record.pwd, nonce, record.keypair.boxPk, record.keypair.boxSk)\n ]);\n })\n .then(function (res) {\n record.salt = res[0];\n record.pwd = res[1];\n return record;\n });\n },\n\n recoverId = function(recover) {\n if (!recover || !recover.cypherNonce || !recover.cypherSalt || !recover.cypherPwd) {\n throw {message:'ERROR.INVALID_FILE_FORMAT'};\n }\n var nonce = CryptoUtils.util.decode_base58(recover.cypherNonce);\n return getkeypairSaveId(recover)\n .then(function (recover) {\n return CryptoUtils.box.open(recover.cypherSalt, nonce, recover.keypair.boxPk, recover.keypair.boxSk);\n })\n .then(function (salt) {\n recover.salt = salt;\n return CryptoUtils.box.open(recover.cypherPwd, nonce, recover.keypair.boxPk, recover.keypair.boxSk);\n })\n .then(function (pwd) {\n recover.pwd = pwd;\n return recover;\n })\n .catch(function(err){\n console.warn('Incorrect answers: unable to recover identifiers', err);\n throw new Error('Incorrect answers: unable to recover identifiers');\n });\n },\n\n getSaveIDDocument = function(record) {\n var saveId = 'Version: 10 \\n' +\n 'Type: SaveID\\n' +\n 'Questions: ' + '\\n' + record.questions +\n 'Issuer: ' + data.pubkey + '\\n' +\n 'Crypted-Nonce: '+ record.nonce + '\\n'+\n 'Crypted-Pubkey: '+ record.pubkey +'\\n' +\n 'Crypted-Salt: '+ record.salt + '\\n' +\n 'Crypted-Pwd: '+ record.pwd + '\\n';\n\n // Sign SaveId document\n return CryptoUtils.sign(saveId, data.keypair)\n\n .then(function(signature) {\n saveId += signature + '\\n';\n console.debug('Has generate an SaveID document:\\n----\\n' + saveId + '----');\n return saveId;\n });\n\n },\n\n downloadSaveId = function(record){\n return getSaveIDDocument(record)\n .then(function(saveId) {\n var saveIdFile = new Blob([saveId], {type: 'text/plain; charset=utf-8'});\n FileSaver.saveAs(saveIdFile, '{0}-recover_ID.txt'.format(data.pubkey.substring(0,8)));\n });\n },\n\n downloadKeyFile = function(format){\n if (!isAuth()) return $q.reject('user not authenticated');\n\n return $q.all([\n csCurrency.get(),\n csCrypto.keyfile.generateContent(data.keypair,\n {\n type: format,\n password: function() {\n UIUtils.loading.hide();\n return Modals.showPassword({\n title: 'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.TITLE',\n subTitle: 'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.HELP'\n })\n .then(function(password) {\n return UIUtils.loading.show(10)\n .then(function(){\n return password;\n });\n });\n }\n })\n ])\n .then(function(res) {\n var currency = res[0];\n var document = res[1];\n return $translate('ACCOUNT.SECURITY.KEYFILE_FILENAME', {\n currency: currency.name,\n pubkey: data.pubkey,\n format: format,\n })\n .then(function(filename){\n var file = new Blob([document], {type: 'text/plain; charset=utf-8'});\n FileSaver.saveAs(file, filename);\n });\n });\n\n },\n\n getRevocationDocument = function() {\n return $q.all([\n getKeypair(),\n csCurrency.get()\n ])\n\n .then(function(res) {\n var keypair = res[0];\n var currency = res[1];\n // get the Identity document\n return getIdentityDocument(currency, keypair)\n\n // Create membership document (unsigned)\n .then(function(identity){\n var identityLines = identity.trim().split('\\n');\n var idtySignature = identityLines[identityLines.length-1];\n\n var revocation = 'Version: '+ constants.REVOKE_VERSION +'\\n' +\n 'Type: Revocation\\n' +\n 'Currency: ' + currency.name + '\\n' +\n 'Issuer: ' + data.pubkey + '\\n' +\n 'IdtyUniqueID: ' + data.uid + '\\n' +\n 'IdtyTimestamp: ' + data.blockUid + '\\n' +\n 'IdtySignature: ' + idtySignature + '\\n';\n\n\n // Sign revocation document\n return CryptoUtils.sign(revocation, keypair)\n\n // Add revocation to document\n .then(function(signature) {\n revocation += signature + '\\n';\n console.debug('Has generate an revocation document:\\n----\\n' + revocation + '----');\n return revocation;\n });\n });\n });\n },\n\n /**\n * Send a revocation\n */\n revoke = function() {\n\n // Clear old events\n cleanEventsByContext('revocation');\n\n // Get revocation document\n return getRevocationDocument()\n // Send revocation document\n .then(function(revocation) {\n return BMA.wot.revoke({revocation: revocation});\n })\n\n // Reload requirements\n .then(function() {\n\n return $timeout(function() {\n return loadRequirements(false/*no cache*/);\n }, 1000); // waiting for node to process membership doc\n })\n\n // Add wallet events\n .then(addEvents)\n\n .catch(function(err) {\n if (err && err.ucode == BMA.errorCodes.REVOCATION_ALREADY_REGISTERED) {\n // Already registered by node: just add an event\n addEvent({type:'pending', message: 'INFO.REVOCATION_SENT_WAITING_PROCESS', context: 'requirements'}, true);\n }\n else {\n throw err;\n }\n })\n ;\n },\n\n revokeWithFile = function(revocation){\n return $q.all([\n BMA.wot.revoke({revocation: revocation})\n ])\n // Reload requirements\n .then(function(res) {\n if (isLogin()) {\n return $timeout(function () {\n return loadRequirements(false/*no cache*/);\n }, 1000) // waiting for node to process membership doc\n\n // Add wallet events\n .then(addEvents)\n\n .catch(function (err) {\n if (err && err.ucode == BMA.errorCodes.REVOCATION_ALREADY_REGISTERED) {\n // Already registered by node: just add an event\n addEvent({type: 'pending', message: 'INFO.REVOCATION_SENT_WAITING_PROCESS', context: 'requirements'}, true);\n }\n else {\n throw err;\n }\n });\n }\n else {\n addEvent({type: 'pending', message: 'INFO.REVOCATION_SENT_WAITING_PROCESS', context: 'requirements'}, true);\n }\n });\n\n },\n\n downloadRevocation = function(){\n return $q.all([\n csCurrency.get(),\n getRevocationDocument()\n ])\n .then(function(res) {\n var currency = res[0];\n var revocation = res[1];\n var revocationFile = new Blob([revocation], {type: 'text/plain; charset=utf-8'});\n return $translate('ACCOUNT.SECURITY.REVOCATION_FILENAME', {\n uid: data.uid,\n currency: currency.name,\n pubkey: data.pubkey\n })\n .then(function (fileName) {\n FileSaver.saveAs(revocationFile, fileName);\n });\n });\n },\n\n cleanEventsByContext = function(context){\n data.events = data.events.reduce(function(res, event) {\n if (event.context && event.context == context) return res;\n return res.concat(event);\n },[]);\n },\n\n /* -- children wallets -- */\n\n setParentWallet = function(parentWallet) {\n listeners = listeners || [];\n var listener;\n _.forEach(['load', 'reset'], function(method) {\n listener = api.data.on[method]($rootScope, function(data, deferred) {\n deferred = deferred || $q.defer();\n parentWallet.api.data.raisePromise[method](data)\n .then(deferred.resolve)\n .catch(deferred.reject);\n return deferred.promise;\n }, this);\n listeners.push(listener);\n });\n\n // Unauth when parent wallet unauth\n listener = parentWallet.api.data.on.unauth($rootScope, function() {\n if (isAuth()) unauth();\n }, this);\n listeners.push(listener);\n },\n\n createNewChildWallet = function(options) {\n var wallet = newChildInstance();\n addChildWallet(wallet, options);\n return wallet;\n },\n\n addChildWallet = function(wallet, options) {\n // Link to parent\n wallet.children.setParent(exports); // = link to self wallet\n\n data.children = data.children || [];\n data.children.push(wallet);\n\n // Store (store children locally)\n if (!options || angular.isUndefined(options.store) || options.store) {\n return storeData();\n }\n return $q.when();\n },\n\n removeAllChildrenWallets = function(options) {\n\n // stop/unauth all existing wallets\n if (!options || options.stop) {\n _.forEach(data.children || [], function(wallet){\n wallet.stop();\n });\n }\n var removedChildren = data.children.splice(0, data.children.length);\n\n // Store (store children locally)\n if (!options || angular.isUndefined(options.store) || options.store) {\n return storeData();\n }\n return removedChildren;\n\n },\n\n removeChildWalletById = function(id, options) {\n data.children = data.children || [];\n var childIndex = _.findIndex(data.children, function(child) {return child.id === id;});\n if (childIndex === -1) {\n console.warn('[wallet] Unable to remove child wallet {{0}} (not found)'.format(id));\n throw new Error('Wallet with id {{0}} not found'.format(id));\n }\n // Remove the wallet, and return it\n var wallet = data.children.splice(childIndex, 1)[0];\n\n // Force to stop without calling api\n wallet.stop();\n\n // Store (store children locally)\n if (!options || options.store !== false) {\n return storeData();\n }\n return $q.when();\n },\n\n getChildWalletById = function(id) {\n return (id !== 'default') && _.find(data.children|| [], function(child) {return child.id === +id;}) || undefined;\n },\n\n getChildWalletByPubkey = function(pubkey) {\n return _.find(data.children|| [], function(child) {return child.isUserPubkey(pubkey);});\n },\n\n hasChildrenWithPubkey = function(pubkey) {\n return !!getChildWalletByPubkey(pubkey);\n },\n\n getChildrenWalletCount = function() {\n return angular.isDefined(data.childrenCount) ? data.childrenCount : (data.children && data.children.length || 0);\n },\n\n newChildInstance = function() {\n // Return max(id) + 1\n var walletId = (data.children || []).reduce(function(res, wallet) {\n return Math.max(res, wallet.id);\n }, 0) + 1;\n return service.instance(walletId, BMA);\n },\n\n getAllChildrenWallet = function() {\n return openEncryptedData()\n .then(function() {\n return data.children;\n });\n },\n\n getAllPubkeys = function() {\n if (!data.pubkey) throw new Error('User not login!');\n return (data.children || []).reduce(function(res, wallet) {\n return wallet.data.pubkey ? res.concat(wallet.data.pubkey) : res;\n }, [data.pubkey]);\n },\n\n getByPubkey = function(pubkey) {\n if (!pubkey) throw new Error(\"Missing 'pubkey' argument !\");\n if (!data.pubkey) throw new Error('User not login!');\n if (data.pubkey === pubkey) return exports; // main wallet\n return getChildWalletByPubkey(pubkey);\n },\n\n downloadChildrenWalletFile = function() {\n return $q.all([\n getAllChildrenWallet(),\n csCurrency.get()\n ])\n .then(function(res) {\n var children = res[0];\n var currency = res[1];\n var content = (children||[]).reduce(function(res, wallet) {\n return res + [wallet.data.pubkey, wallet.data.uid, wallet.data.localName||wallet.data.name].join('\\t') + '\\n';\n }, '');\n var file = new Blob([content], {type: 'text/plain; charset=utf-8'});\n return $translate('ACCOUNT.WALLET_LIST.EXPORT_FILENAME', {\n pubkey: data.pubkey,\n currency: currency.name,\n })\n .then(function (fileName) {\n FileSaver.saveAs(file, fileName);\n });\n });\n },\n\n /* -- END children wallets -- */\n\n openEncryptedData = function(options) {\n if (!hasEncryptedData()) return $q.when();\n if (!isAuth()) return auth().then(openEncryptedData); // Force auth if need\n\n // Open encrypted data\n return CryptoUtils.box.keypair.fromSignKeypair(data.keypair)\n .then(function(keypair) {\n var nonce = CryptoUtils.util.decode_base58(data.encryptedData.nonce);\n return CryptoUtils.box.open(data.encryptedData.content, nonce, keypair.boxPk, keypair.boxSk);\n })\n // Then apply\n .then(function(content) {\n data.encryptedData = null; // reset encrypted data\n var promise = applyRestoredData(JSON.parse(content));\n\n // Store (store data into session storage)\n if (!options || angular.isUndefined(options.store) || options.store) {\n promise.then(function() {\n return storeData();\n });\n }\n\n return promise;\n })\n ;\n },\n\n /**\n * De-serialize from JSON string\n */\n fromJson = function(json, failIfInvalid) {\n failIfInvalid = angular.isUndefined(failIfInvalid) ? true : failIfInvalid;\n return $q(function(resolve, reject) {\n var obj;\n try {\n obj = JSON.parse(json || '{}');\n }\n catch(err) { /* invalid JSON : continue*/}\n\n // FIXME #379\n /*if (obj && obj.pubkey) {\n resolve({\n pubkey: obj.pubkey\n });\n }\n else */\n if (obj && obj.keypair && obj.keypair.signPk && obj.keypair.signSk) {\n var keypair = {};\n var i;\n\n // sign Pk : Convert to Uint8Array type\n var signPk = new Uint8Array(32);\n for (i = 0; i < 32; i++) signPk[i] = obj.keypair.signPk[i];\n keypair.signPk = signPk;\n\n var signSk = new Uint8Array(64);\n for (i = 0; i < 64; i++) signSk[i] = obj.keypair.signSk[i];\n keypair.signSk = signSk;\n\n // box Pk : Convert to Uint8Array type\n if (obj.version && obj.keypair.boxPk) {\n var boxPk = new Uint8Array(32);\n for (i = 0; i < 32; i++) boxPk[i] = obj.keypair.boxPk[i];\n keypair.boxPk = boxPk;\n }\n\n if (obj.version && obj.keypair.boxSk) {\n var boxSk = new Uint8Array(32);\n for (i = 0; i < 64; i++) boxSk[i] = obj.keypair.boxSk[i];\n keypair.boxSk = boxSk;\n }\n\n resolve({\n pubkey: obj.pubkey,\n keypair: keypair,\n tx: obj.tx\n });\n }\n else if (failIfInvalid) {\n reject('Not a valid Wallet.data object');\n }\n else {\n resolve();\n }\n });\n },\n\n checkAuthIdle = function(isAuthResult) {\n isAuthResult = angular.isDefined(isAuthResult) ? isAuthResult : isAuth();\n var newEnableAuthIdle = isAuthResult && settings && settings.keepAuthIdle > 0 && settings.keepAuthIdle != csSettings.constants.KEEP_AUTH_IDLE_SESSION;\n var changed = (enableAuthIdle != newEnableAuthIdle);\n\n // need start/top watching\n if (changed) {\n // start idle\n if (newEnableAuthIdle) {\n console.debug(\"[wallet] Start idle (delay: {0}s)\".format(settings.keepAuthIdle));\n Idle.setIdle(settings.keepAuthIdle);\n Idle.watch();\n }\n // stop idle, if was enable\n else if (enableAuthIdle){\n console.debug(\"[wallet] Stop idle\");\n Idle.unwatch();\n }\n enableAuthIdle = newEnableAuthIdle;\n }\n\n // if idle time changed: apply it\n else if (newEnableAuthIdle && Idle.getIdle() !== settings.keepAuthIdle) {\n console.debug(\"[idle] Updating auth idle (delay: {0}s)\".format(settings.keepAuthIdle));\n Idle.setIdle(settings.keepAuthIdle);\n }\n\n // Make sure to store seckey, in the session storage for secret key -fix #372\n var storeSecKey = isAuthResult && settings && settings.keepAuthIdle == csSettings.constants.KEEP_AUTH_IDLE_SESSION && true;\n if (storeSecKey) {\n sessionStorage.put(constants.STORAGE_SECKEY, CryptoUtils.util.encode_base58(data.keypair.signSk));\n }\n // Make sure to clean previous seckey, if exists in session storage\n else if (changed) {\n sessionStorage.put(constants.STORAGE_SECKEY, null);\n }\n };\n\n function getWalletSettings(settings) {\n return settings && {\n useLocalStorage: settings.useLocalStorage,\n useLocalStorageEncryption: settings.useLocalStorageEncryption,\n rememberMe: settings.rememberMe,\n keepAuthIdle: settings.keepAuthIdle\n };\n }\n\n function onSettingsChanged(allSettings) {\n var newSettings = getWalletSettings(allSettings);\n var hasChanged = !angular.equals(settings, newSettings);\n if (!hasChanged || !settings) return; // skip\n\n var useEncryptionChanged = !angular.equals(settings.useLocalStorageEncryption, newSettings.useLocalStorageEncryption);\n var useStorageChanged = !angular.equals(settings.useLocalStorage, newSettings.useLocalStorage) || useEncryptionChanged;\n var keepAuthIdleChanged = !angular.equals(settings.keepAuthIdle, newSettings.keepAuthIdle);\n\n settings = newSettings;\n\n if (keepAuthIdleChanged) {\n checkAuthIdle();\n }\n\n // Local storage option changed\n if (useStorageChanged) {\n\n // If disabled, then reset the store\n if (!settings.useLocalStorage) {\n resetStore(data.pubkey);\n }\n // If storage enable\n else {\n // Store login data\n return store()\n .then(function() {\n\n // Encryption enable: auth before saving data\n if (data.childrenCount > 0 && useEncryptionChanged && settings.useLocalStorageEncryption) {\n return auth({minData: true, silent: true})\n .catch(function(err){\n // user not auth: revert encryption to false\n if (err === 'CANCELLED') {\n csSettings.apply({useLocalStorageEncryption: false});\n return csSettings.store();\n }\n else {\n throw err;\n }\n });\n }\n })\n\n // Store other data (children wallet, ...)\n .then(storeData);\n }\n }\n }\n\n function addListeners() {\n listeners = [\n // Listen if settings changed\n csSettings.api.data.on.changed($rootScope, onSettingsChanged, this),\n // Listen if node changed\n BMA.api.node.on.restart($rootScope, restart, this)\n ];\n\n $rootScope.$on('IdleStart', unauth);\n }\n\n function addListener(listener) {\n listeners = listeners || [];\n listeners.push(listener);\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function ready() {\n if (started) return $q.when();\n return startPromise || start();\n }\n\n function stop() {\n console.debug('[wallet] Stopping...');\n removeListeners();\n resetData();\n }\n\n function restart() {\n stop();\n return $timeout(start, 200);\n }\n\n function start(options) {\n options = options || {};\n // By default, restore if the service is the default object\n options.restore = angular.isDefined(options.restore) ? options.restore : (id === 'default');\n\n console.debug('[wallet] Starting...');\n var now = Date.now();\n\n startPromise = $q.all([\n csSettings.ready()\n .then(function() {\n settings = getWalletSettings(csSettings.data);\n }),\n csCurrency.ready(),\n BMA.ready()\n ]);\n\n // Restore\n if (options.restore) startPromise = startPromise.then(restore);\n\n // Emit ready event\n startPromise.then(function() {\n addListeners();\n\n console.debug('[wallet] Started in ' + (Date.now() - now) + 'ms');\n\n started = true;\n startPromise = null;\n })\n .then(function(){\n return data;\n });\n\n return startPromise;\n }\n\n // Register extension points\n api.registerEvent('data', 'init');\n api.registerEvent('data', 'loginCheck'); // allow to stop the login process\n api.registerEvent('data', 'login'); // executed after login check (cannot stop the login process)\n api.registerEvent('data', 'auth');\n api.registerEvent('data', 'unauth');\n api.registerEvent('data', 'load');\n api.registerEvent('data', 'logout');\n api.registerEvent('data', 'reset');\n api.registerEvent('data', 'store');\n\n api.registerEvent('error', 'send');\n\n // Data changed : balance changed, new TX\n api.registerEvent('data', 'balanceChanged');\n api.registerEvent('data', 'newTx');\n\n api.registerEvent('action', 'certify');\n\n\n // init data\n resetData(true);\n\n // Override default store/restore function, when not the 'default' wallet\n if (id !== \"default\") {\n //start = $q.when;\n //started = true;\n store = $q.when;\n restore = $q.when;\n restoreData = $q.when;\n //checkAuthIdle = function(){};\n }\n\n exports = {\n id: id,\n data: data,\n ready: ready,\n start: start,\n stop: stop,\n // auth\n login: login,\n logout: logout,\n auth: auth,\n unauth: unauth,\n isLogin: isLogin,\n isAuth: isAuth,\n getKeypair: getKeypair,\n hasSelf: hasSelf,\n setSelf: setSelf,\n isMember: function() {\n return data.isMember;\n },\n isDataLoaded : isDataLoaded,\n isDefault: isDefault,\n isNeverUsed: isNeverUsed,\n isNew: isNew,\n isUserPubkey: isUserPubkey,\n getData: getData,\n loadData: loadData,\n refreshData: refreshData,\n loadQrCode: loadQrCode,\n // internal\n internal: {\n addListener: addListener,\n removeListeners: removeListeners\n },\n // local storage\n store: store,\n storeData: storeData, // store children wallet, readTime, etc.\n // operations\n transfer: transfer,\n transferAll: transferAll,\n self: self,\n revoke: revoke,\n revokeWithFile: revokeWithFile,\n certify: certify,\n downloadSaveId: downloadSaveId,\n getCryptedId: getCryptedId,\n recoverId: recoverId,\n downloadRevocation: downloadRevocation,\n downloadKeyFile: downloadKeyFile,\n pubkeys: getAllPubkeys,\n getByPubkey: getByPubkey,\n membership: {\n inside: membership(true),\n out: membership(false)\n },\n events: {\n add: addEvent,\n cleanByContext: cleanEventsByContext\n },\n children: {\n create: createNewChildWallet,\n add: addChildWallet,\n remove: removeChildWalletById,\n get: getChildWalletById,\n getByPubkey: getChildWalletByPubkey,\n all: getAllChildrenWallet,\n setParent: setParentWallet,\n count: getChildrenWalletCount,\n hasPubkey: hasChildrenWithPubkey,\n instance: newChildInstance,\n downloadFile: downloadChildrenWalletFile\n },\n api: api\n };\n return exports;\n }\n\n service = CsWallet('default', BMA);\n service.instance = CsWallet;\n\n return service;\n}]);\n","angular.module('cesium.help.services', [])\n\n.constant('csHelpConstants', {\n wallet: {\n stepCount: 4\n }\n})\n\n.factory('csHelp', ['$rootScope', 'csSettings', 'UIUtils', 'csHelpConstants', '$controller', function($rootScope, csSettings, UIUtils, csHelpConstants, $controller) {\n 'ngInject';\n\n\n function createHelptipScope(isTour, helpController) {\n if (!isTour && ($rootScope.tour || !csSettings.data.helptip.enable || UIUtils.screen.isSmall())) {\n return; // avoid other helptip to be launched (e.g. csWallet)\n }\n // Create a new scope for the tour controller\n var helptipScope = $rootScope.$new();\n $controller(helpController||'HelpTipCtrl', { '$scope': helptipScope});\n return helptipScope;\n }\n\n function startWalletHelpTip(index, isTour) {\n index = angular.isDefined(index) ? index : csSettings.data.helptip.wallet;\n isTour = angular.isDefined(isTour) ? isTour : false;\n\n if (index < 0 || index >= csHelpConstants.wallet.stepCount) return;\n\n // Create a new scope for the tour controller\n var helptipScope = createHelptipScope(isTour);\n if (!helptipScope) return; // could be undefined, if a global tour already is already started\n\n helptipScope.tour = isTour;\n\n return helptipScope.startWalletTour(index, false)\n .then(function(endIndex) {\n helptipScope.$destroy();\n if (!isTour) {\n csSettings.data.helptip.wallet = endIndex;\n csSettings.store();\n }\n });\n }\n\n return {\n wallet: {\n tour: function() {\n return startWalletHelpTip(0, true);\n },\n helptip: startWalletHelpTip\n }\n };\n\n}]);\n","\n\nangular.module('cesium.plugin.services', [])\n\n.provider('PluginService', function PluginServiceProvider() {\n 'ngInject';\n\n var eagerLoadingServices = [];\n\n var extensionByStates = {};\n\n this.registerEagerLoadingService = function(serviceName) {\n eagerLoadingServices.push(serviceName);\n return this;\n };\n\n this.extendState = function(stateName, extension) {\n if (angular.isDefined(stateName) && angular.isDefined(extension)) {\n if (!extensionByStates[stateName]) {\n extensionByStates[stateName] = [];\n }\n extensionByStates[stateName].push(extension);\n }\n return this;\n };\n\n this.extendStates = function(stateNames, extension) {\n var that = this;\n stateNames.forEach(function(stateName) {\n that.extendState(stateName, extension);\n });\n return this;\n };\n\n this.$get = ['$injector', '$state', function($injector, $state) {\n\n var currentExtensionPointName;\n\n function start() {\n if (eagerLoadingServices.length>0) {\n _.forEach(eagerLoadingServices, function(name) {\n $injector.get(name);\n });\n }\n }\n\n function getActiveExtensionPointsByName(extensionPointName) {\n var extensions = _.keys(extensionByStates).reduce(function(res, stateName){\n return $state.includes(stateName) ? res.concat(extensionByStates[stateName]) : res;\n }, []);\n return extensions.reduce(function(res, extension){\n return extension.points && extension.points[extensionPointName] ? res.concat(extension.points[extensionPointName]) : res;\n }, []);\n }\n\n function setCurrentExtensionPointName(extensionPointName) {\n currentExtensionPointName = extensionPointName;\n }\n\n function getCurrentExtensionPointName() {\n return currentExtensionPointName;\n }\n\n return {\n start: start,\n extensions: {\n points: {\n getActivesByName: getActiveExtensionPointsByName,\n current: {\n get: getCurrentExtensionPointName,\n set: setCurrentExtensionPointName\n }\n }\n }\n };\n }];\n})\n;\n","angular.module('cesium.services', [\n // removeIf(device)\n 'cesium.desktop.services',\n // endRemoveIf(device)\n 'cesium.settings.services',\n 'cesium.http.services',\n 'cesium.network.services',\n 'cesium.bma.services',\n 'cesium.crypto.services',\n 'cesium.utils.services',\n 'cesium.modal.services',\n 'cesium.storage.services',\n 'cesium.device.services',\n 'cesium.currency.services',\n 'cesium.wot.services',\n 'cesium.tx.services',\n 'cesium.wallet.services',\n 'cesium.help.services',\n 'cesium.plugin.services'\n ])\n;\n","angular.module('cesium.api.demo.services', ['cesium.bma.services', 'cesium.crypto.services', 'cesium.utils.services', 'cesium.settings.services'])\n\n\n .factory('csDemoWallet', ['$rootScope', '$timeout', '$controller', '$state', '$q', '$translate', '$filter', 'BMA', 'CryptoUtils', function($rootScope, $timeout, $controller, $state, $q, $translate, $filter,\n BMA, CryptoUtils) {\n 'ngInject';\n\n function factory(authData) {\n\n var demoPubkey;\n\n return {\n start: function() {\n return $q.when();\n },\n login: function() {\n var self = this;\n return $translate('API.TRANSFER.DEMO.PUBKEY')\n .then(function(pubkey) {\n demoPubkey = pubkey;\n if (!authData || authData.pubkey != demoPubkey) {\n throw {message: 'API.TRANSFER.DEMO.BAD_CREDENTIALS'};\n }\n self.data = {\n keypair: authData.keypair\n };\n return {\n uid: 'Demo',\n pubkey: demoPubkey\n };\n });\n },\n transfer: function(pubkey, amount, comment) {\n var self = this;\n return BMA.blockchain.current()\n .then(function(block) {\n var tx = 'Version: '+ BMA.constants.PROTOCOL_VERSION +'\\n' +\n 'Type: Transaction\\n' +\n 'Currency: ' + block.currency + '\\n' +\n 'Blockstamp: ' + block.number + '-' + block.hash + '\\n' +\n 'Locktime: 0\\n' + // no lock\n 'Issuers:\\n' +\n demoPubkey + '\\n' +\n 'Inputs:\\n' +\n [amount, block.unitbase, 'T', 'FakeId27jQMAf3jqL2fr75ckZ6Jgi9TZL9fMf9TR9vBvG', 0].join(':')+ '\\n' +\n 'Unlocks:\\n' +\n '0:SIG(0)\\n' +\n 'Outputs:\\n' +\n [amount, block.unitbase, 'SIG(' + pubkey + ')'].join(':')+'\\n' +\n 'Comment: '+ (comment||'') + '\\n';\n\n return CryptoUtils.sign(tx, self.data.keypair)\n .then(function(signature) {\n var signedTx = tx + signature + \"\\n\";\n return CryptoUtils.util.hash(signedTx)\n .then(function(txHash) {\n return $q.when({\n tx: signedTx,\n hash: txHash\n });\n });\n });\n });\n }\n };\n }\n\n return {\n instance: factory\n };\n }])\n;\n","angular.module('cesium.templates', []).run(['$templateCache', function($templateCache) {$templateCache.put('templates/api/doc.html','<h2 class=\"padding\" translate>API.DOC.TRANSFER.TITLE</h2><div class=\"list padding no-padding-xs no-padding-top\"><div class=\"item item-divider no-border\"><p translate>API.DOC.DESCRIPTION_DIVIDER</p></div><div class=\"item item-text-wrap\"><p translate>API.DOC.TRANSFER.DESCRIPTION</p></div><div class=\"item item-divider no-border\"><p translate>API.DOC.URL_DIVIDER</p></div><div class=\"item item-text-wrap\"><p class=\"gray text-right\">{{$root.rootPath}}#/v1/payment/:pubkey?amount=<span class=\"text-italic\" translate>API.DOC.TRANSFER.PARAM_AMOUNT</span></p></div><div class=\"item item-divider no-border\"><p translate>API.DOC.PARAMETERS_DIVIDER</p></div><div class=\"item item-text-wrap\"><p translate>API.DOC.AVAILABLE_PARAMETERS</p><div class=\"row\"><div class=\"col col-20 text-italic\">pubkey</div><div class=\"col gray\" translate>API.DOC.TRANSFER.PARAM_PUBKEY_HELP</div></div><div class=\"row stable-bg\"><div class=\"col col-20 text-italic dark\">amount</div><div class=\"col gray\" translate>API.DOC.TRANSFER.PARAM_AMOUNT_HELP</div></div><div class=\"row\"><div class=\"col col-20 text-italic\">comment</div><div class=\"col gray\" translate>API.DOC.TRANSFER.PARAM_COMMENT_HELP</div></div><div class=\"row stable-bg\"><div class=\"col col-20 text-italic dark\">name</div><div class=\"col gray\" translate>API.DOC.TRANSFER.PARAM_NAME_HELP</div></div><div class=\"row\"><div class=\"col col-20 text-italic\">preferred_node</div><div class=\"col gray\" translate>API.DOC.TRANSFER.PARAM_PREFERRED_NODE_HELP</div></div><div class=\"row stable-bg\"><div class=\"col col-20 text-italic dark\">redirect_url</div><div class=\"col gray\" translate>API.DOC.TRANSFER.PARAM_REDIRECT_URL_HELP</div></div><div class=\"row\"><div class=\"col col-20 text-italic\">cancel_url</div><div class=\"col gray\" translate>API.DOC.TRANSFER.PARAM_CANCEL_URL_HELP</div></div></div><div class=\"item item-divider no-border\"><p translate>API.DOC.DEMO_DIVIDER</p></div><div class=\"item item-button-right item-text-wrap padding-bottom\"><p class=\"item-icon-right-padding\" translate>API.DOC.DEMO_HELP</p><span class=\"badge\" ng-if=\"loading\"><ion-spinner class=\"icon\" icon=\"android\"></ion-spinner></span><a ng-if=\"!loading\" href=\"{{transferDemoUrl}}\" class=\"button button-raised button-positive icon ion-play\"></a></div><div class=\"item item-text-wrap\" ng-if=\"result.type === \\'payment\\' && !result.cancelled\"><h2 class=\"text-right balanced\" translate>API.DOC.DEMO_SUCCEED</h2><h4 class=\"gray\" translate>API.DOC.DEMO_RESULT</h4><p class=\"balanced-100-bg padding dark text-keep-lines\">{{result.content}}</p><h4 class=\"gray\"><span translate>API.DOC.DEMO_RESULT_PEER</span> <b>{{result.node}}</b></h4></div><div class=\"item item-text-wrap\" ng-if=\"result.type === \\'payment\\' && result.cancelled\"><h2 class=\"text-right assertive\" translate>API.DOC.DEMO_CANCELLED</h2></div><div class=\"item item-divider no-border\"><p translate>API.DOC.INTEGRATE_DIVIDER</p></div><div class=\"item item-text-wrap\"><p translate>API.DOC.TRANSFER.EXAMPLES_HELP</p><div class=\"row responsive-sm\"><div class=\"col col-20 text-italic\"><span translate>API.DOC.TRANSFER.EXAMPLE_BUTTON</span></div><div class=\"col gray no-border\"><p><i class=\"icon ion-code\"></i> <span translate>API.DOC.INTEGRATE_CODE</span></p><div class=\"item item-input\"><textarea class=\"gray\" select-on-click rows=\"5\" ng-model=\"transferButton.html\" ng-model-options=\"{ debounce: 650 }\"></textarea></div><p class=\"padding-top\"><i class=\"icon ion-eye\"></i> <span translate>API.DOC.INTEGRATE_RESULT</span></p><div class=\"padding-left\" bind-notifier=\"{ notifierKey:watchedExpression }\"><ng-bind-html ng-bind-html=\"transferButton.html|trustAsHtml\"></ng-bind-html></div></div></div><div class=\"row responsive-sm\"><div class=\"col col-20 hidden-xs hidden-sm\"> </div><div class=\"col gray no-border\"><p class=\"padding-top\"><a class=\"positive\" ng-click=\"transferButton.showParameters=!transferButton.showParameters\"><i class=\"icon ion-wrench\"></i> <span translate>API.DOC.INTEGRATE_PARAMETERS</span> <i class=\"icon\" ng-class=\"{\\'ion-arrow-down-b\\': !transferButton.showParameters, \\'ion-arrow-up-b\\': transferButton.showParameters}\"></i></a></p><div ng-if=\"transferButton.showParameters\" class=\"padding-left\"><form id=\"transferForm\" class=\"stable-bg padding\"><p class=\"padding-top\"><i class=\"icon ion-key\"></i> {{\\'API.DOC.TRANSFER.PARAM_PUBKEY\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" autocomplete=\"off\" ng-model=\"transferData.pubkey\" ng-model-options=\"{ debounce: 650 }\" placeholder=\"{{\\'API.DOC.TRANSFER.PARAM_PUBKEY_HELP\\'|translate}}\"></label><p class=\"padding-top\"><i class=\"icon ion-pricetag\"></i> {{\\'API.DOC.TRANSFER.PARAM_AMOUNT\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" autocomplete=\"off\" ng-model=\"transferData.amount\" ng-model-options=\"{ debounce: 650 }\" placeholder=\"{{\\'API.DOC.TRANSFER.PARAM_AMOUNT_HELP\\'|translate}}\"></label><p class=\"padding-top\"><i class=\"icon ion-flag\"></i> {{\\'API.DOC.TRANSFER.PARAM_COMMENT\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" autocomplete=\"off\" ng-model=\"transferData.comment\" placeholder=\"{{\\'API.DOC.TRANSFER.PARAM_COMMENT\\'|translate}}\"></label><p class=\"padding-top\"><i class=\"icon ion-ios-world-outline\"></i> {{\\'API.DOC.TRANSFER.PARAM_NAME\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" ng-model=\"transferData.name\" ng-model-options=\"{ debounce: 650 }\" placeholder=\"{{\\'API.DOC.TRANSFER.PARAM_NAME\\'|translate}}\"></label><p class=\"padding-top\"><i class=\"icon ion-key\"></i> {{\\'API.DOC.TRANSFER.PARAM_PREFERRED_NODE\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" ng-model=\"transferData.preferred_node\" ng-model-options=\"{ debounce: 650 }\" placeholder=\"{{\\'API.DOC.TRANSFER.PARAM_PREFERRED_NODE_HELP\\'|translate}}\"></label><p class=\"padding-top\"><i class=\"icon ion-arrow-return-left\"></i> {{\\'API.DOC.TRANSFER.PARAM_REDIRECT_URL\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" ng-model=\"transferData.redirect_url\" ng-model-options=\"{ debounce: 650 }\" placeholder=\"{{\\'API.DOC.TRANSFER.PARAM_REDIRECT_URL\\'|translate}}\"></label><p class=\"padding-top\"><i class=\"icon ion-backspace\"></i> {{\\'API.DOC.TRANSFER.PARAM_CANCEL_URL\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" ng-model=\"transferData.cancel_url\" ng-model-options=\"{ debounce: 650 }\" placeholder=\"{{\\'API.DOC.TRANSFER.PARAM_CANCEL_URL\\'|translate}}\"></label><p class=\"padding-top\"><a class=\"positive\" ng-click=\"transferButton.style.enable=!transferButton.style.enable\"><i class=\"icon\" ng-class=\"{\\'ion-android-checkbox-outline\\': transferButton.style.enable, \\'ion-android-checkbox-outline-blank\\': !transferButton.style.enable}\"></i> <span translate>API.DOC.TRANSFER.EXAMPLE_BUTTON_DEFAULT_STYLE</span></a></p><div ng-if=\"transferButton.style.enable\"><p class=\"padding-top\"><i class=\"icon ion-image\"></i> {{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_ICON\\' | translate}} :</p><label class=\"item item-input item-select\"><select class=\"stable-bg dark\" ng-model=\"transferButton.style.icon\" style=\"width: 100%; max-width: 100%;\" ng-options=\"l as (l.label | translate) for l in transferButton.icons track by l.filename\"></select></label><p class=\"padding-top\"><i class=\"icon ion-quote\"></i> {{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_HELP\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" ng-model=\"transferButton.style.text\" ng-model-options=\"{ debounce: 650 }\" placeholder=\"{{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_HELP\\'|translate}}\"></label><p class=\"padding-top\"><i class=\"icon ion-paintbucket\"></i> {{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_BG_COLOR\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" ng-model=\"transferButton.style.bgColor\" ng-model-options=\"{ debounce: 650 }\" placeholder=\"{{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_BG_COLOR_HELP\\'|translate}}\"></label><p class=\"padding-top\"><i class=\"icon ion-paintbrush\"></i> {{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_FONT_COLOR\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" ng-model=\"transferButton.style.fontColor\" ng-model-options=\"{ debounce: 650 }\" placeholder=\"{{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_FONT_COLOR_HELP\\'|translate}}\"></label><p class=\"padding-top\"><i class=\"icon ion-ios-crop-strong\"></i> {{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_WIDTH\\' | translate}} :</p><label class=\"item item-input\"><input type=\"text\" ng-model=\"transferButton.style.width\" ng-model-options=\"{ debounce: 650 }\" placeholder=\"{{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_WIDTH_HELP\\'|translate}}\"></label></div></form></div></div></div></div></div>');\n$templateCache.put('templates/api/home.html','<ion-view class=\"circle-bg-dark\"><ion-nav-title><span class=\"title visible-xs visible-sm\" translate>API.HOME.TITLE</span></ion-nav-title><ion-nav-buttons side=\"right\"><button class=\"button button-clear hidden-xs hidden-sm flag\" ng-click=\"showLocalesPopover($event)\" style=\"align-content: center\"><i class=\"flag-image\" ng-if=\"$root.settings.locale\" style=\"background-image: url(../img/flag-{{$root.settings.locale.flag}}.png);\"></i> <b class=\"ion-arrow-down-b gray\"></b></button></ion-nav-buttons><ion-content class=\"no-padding-xs no-padding-sm positive-900-bg\"><br class=\"hidden-xs\"><div class=\"light text-center\"><h4 class=\"hidden-xs\" translate>API.HOME.MESSAGE</h4><h4 class=\"visible-xs padding\" translate>API.HOME.MESSAGE_SHORT</h4></div><br class=\"hidden-xs\"><div class=\"row no-padding-xs\"><div class=\"col col-20 hidden-xs hidden-sm\"> </div><div class=\"col\"><div class=\"light-bg no-padding\"><ng-include src=\"::\\'templates/api/doc.html\\'\"></ng-include></div></div><div class=\"col col-20 hidden-xs hidden-sm text-center\" id=\"home\"><div style=\"display: block; width: 100%;\"><div class=\"logo\"></div><small class=\"gray padding-top\">v{{$root.config.version}}</small></div></div></div><p class=\"visible-xs visible-sm light padding-top text-center\">{{\\'COMMON.APP_NAME\\'|translate}} API - <a href=\"#\" ng-click=\"showAboutModal($event)\">v{{$root.config.version}}</a></p><p class=\"hidden-xs hidden-sm gray padding-top text-center\">{{\\'COMMON.APP_NAME\\'|translate}} API v{{$root.config.version}} - <a href=\"#\" ng-click=\"showAboutModal($event)\" title=\"{{\\'HOME.BTN_ABOUT\\'|translate}}\">{{\\'HOME.BTN_ABOUT\\'|translate}}</a> - <a href=\"../\" title=\"{{\\'API.COMMON.LINK_STANDARD_APP_HELP\\'|translate}}\">{{\\'API.COMMON.LINK_STANDARD_APP\\'|translate}}</a></p></ion-content></ion-view>');\n$templateCache.put('templates/api/menu.html','<ion-nav-bar class=\"bar-dark\" title-align=\"left\"><ion-nav-back-button class=\"no-text\"></ion-nav-back-button><ion-nav-buttons side=\"left\"></ion-nav-buttons><ion-nav-buttons side=\"right\"></ion-nav-buttons></ion-nav-bar><ion-nav-view name=\"menuContent\"></ion-nav-view>');\n$templateCache.put('templates/api/popover_locales.html','<ion-popover-view class=\"fit popover-locales\" style=\"height: {{locales.length*48}}px;\"><ion-content scroll=\"false\"><div class=\"list item-text-wrap block\"><a ng-repeat=\"l in locales track by l.id\" class=\"item item-icon-left ink\" ng-click=\"changeLanguage(l.id)\"><i class=\"item-image avatar\" style=\"background-image: url(../img/flag-{{l.flag}}.png)\"></i> {{l.label | translate}}</a></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/api/transfer.html','<ion-view class=\"circle-bg-dark\"><ion-nav-buttons side=\"left\"><button class=\"button button-clear visible-xs\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button></ion-nav-buttons><ion-nav-title><span class=\"title visible-xs\" translate>API.TRANSFER.TITLE_SHORT</span></ion-nav-title><ion-nav-buttons side=\"right\"><button class=\"button button-clear hidden-xs hidden-sm gray\" ng-click=\"showLocalesPopover($event)\" style=\"align-content: center\"><img ng-hide=\"!$root.settings.locale.country\" ng-src=\"https://www.countryflags.io/{{$root.settings.locale.country}}/shiny/32.png\"> <span ng-hide=\"$root.settings.locale.country\">{{$root.settings.locale.label}} </span> <small class=\"ion-arrow-down-b\"></small></button> <button class=\"button button-positive button-icon button-clear icon ion-android-send visible-xs\" ng-click=\"doLogin()\"></button></ion-nav-buttons><ion-content class=\"no-padding-xs positive-900-bg\"><br class=\"hidden-xs\"><div class=\"row no-padding-xs\"><div class=\"col col-20 hidden-xs hidden-sm\"> </div><div class=\"col no-padding-xs\"><div class=\"light-bg\"><h2 class=\"padding-top text-center hidden-xs\" translate>API.TRANSFER.TITLE</h2><div class=\"no-padding energized-100-bg\" ng-if=\"demo\"><div class=\"item item-icon-left item-text-wrap no-border\"><i class=\"icon ion-information-circled positive\"></i><p translate>API.TRANSFER.DEMO.HELP</p></div></div><div class=\"no-padding energized-100-bg\" ng-if=\"$root.config.demo\"><div class=\"item item-icon-left item-text-wrap no-border\"><i class=\"icon ion-android-alert assertive\"></i><p translate>MODE.DEMO.INSTALL_HELP</p></div></div><ng-include src=\"::\\'templates/login/form_login.html\\'\"></ng-include></div><br class=\"hidden-xs\"><br class=\"hidden-xs\"><div class=\"list padding no-padding-xs light-bg\"><div class=\"item\"><p translate>API.TRANSFER.SUMMARY</p></div><div class=\"item item-icon-left-padding item-tx no-border\" ng-if=\"!transferData.amounts\" style=\"min-height: 56px;\"><h2 translate>API.TRANSFER.AMOUNT</h2><ion-spinner class=\"badge item-note\" icon=\"android\" ng-show=\"loading\"></ion-spinner><div class=\"badge badge-calm ng-hide\" ng-show=\"!loading\" ng-bind-html=\"transferData.amount|formatAmount:{useRelative: false, currency: currency.name}\"></div><div class=\"badge badge-secondary ng-hide\" ng-show=\"!loading\" ng-bind-html=\"transferData.amount|formatAmount:{useRelative: true, currency: currency.name, currentUD: currency.currentUD}\"></div></div><label ng-if=\"transferData.amounts\" style=\"min-height: 58px;\" class=\"item item-icon-left-padding item-input item-select item-tx no-border\" ng-class=\"{ \\'item-input-error\\': form.$submitted && !transferData.amount}\"><div class=\"input-label\"><span translate>API.TRANSFER.AMOUNT</span><h4 class=\"assertive hidden-xs hidden-sm\" ng-if=\"!transferData.amount\"><span translate>API.TRANSFER.AMOUNTS_HELP</span></h4></div><select ng-model=\"transferData.amount\" required=\"true\" ng-options=\"(amount |formatAmount:{useRelative: false, currency: currency.name}) for amount in transferData.amounts\"></select> <span class=\"badge badge-secondary ng-hide\" ng-show=\"transferData.amount\" ng-bind-html=\"transferData.amount|formatAmount:{useRelative: true, currency: currency.name, currentUD: currency.currentUD}\"></span></label><div class=\"form-errors\" ng-if=\"form.$submitted && !transferData.amount\"><div class=\"form-error\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div></div><div class=\"item item-icon-left-padding\"><h2 translate>API.TRANSFER.NAME</h2><div class=\"badge item-note\">{{transferData.name}}</div></div><div class=\"item item-icon-left-padding item-text-wrap\"><h2 translate>API.TRANSFER.PUBKEY</h2><div class=\"badge\"><span class=\"hidden-xs\"><br class=\"visible-sm visible-md\"><i class=\"icon ion-key\"></i>{{transferData.pubkey}}</span> <span class=\"visible-xs\" copy-on-click=\"{{transferData.pubkey}}\"><br class=\"visible-xs\"><i class=\"icon ion-key\"></i> {{transferData.pubkey|formatPubkey}}</span></div></div><div class=\"item item-icon-left-padding\"><h2 translate>API.TRANSFER.COMMENT</h2><div class=\"badge item-note\"><span class=\"hidden-xs\"><br class=\"visible-sm visible-md\">{{::transferData.comment}}</span> <span class=\"visible-xs\" copy-on-click=\"{{transferData.comment}}\"><br>{{::transferData.comment}}</span></div></div><div class=\"item item-icon-left-padding\" ng-hide=\"error\"><h2 translate>API.TRANSFER.NODE</h2><div class=\"badge item-note\" ng-if=\"!loading\"><br class=\"visible-sm visible-md\"><i class=\"icon ion-locked\" ng-if=\"node.useSsl\"></i> {{node.server}}</div></div><div class=\"center padding animate-fade-in animate-show-hide ng-hide\" ng-show=\"!loading && error\"><div class=\"card card-item padding\"><p class=\"item-content item-text-wrap\"><i class=\"icon ion-android-alert assertive\"></i> <span class=\"dark\" trust-as-html=\"\\'API.COMMON.CONNECTION_ERROR\\'|translate:node\"></span></p><button type=\"button\" class=\"button button-positive icon icon-left ion-refresh ink\" ng-click=\"start()\">{{\\'COMMON.BTN_REFRESH\\'|translate}}</button></div></div><div class=\"padding-bottom visible-xs\"> </div></div></div><div class=\"col col-20 hidden-xs hidden-sm text-center\" id=\"home\"><div style=\"display: block; width: 100%;\"><div class=\"logo text-center\"></div><small class=\"gray padding-top\">v{{$root.config.version}}</small></div></div></div><p class=\"visible-xs visible-sm light padding-top text-center\">{{\\'COMMON.APP_NAME\\'|translate}} - <a href=\"#\" ng-click=\"showAboutModal($event)\">v{{$root.config.version}}</a></p><p class=\"hidden-xs hidden-sm gray padding-top text-center\">{{\\'COMMON.APP_NAME\\'|translate}} API v{{$root.config.version}} - <a href=\"#\" ng-click=\"showAboutModal($event)\" title=\"{{\\'HOME.BTN_ABOUT\\'|translate}}\">{{\\'HOME.BTN_ABOUT\\'|translate}}</a> - <a ui-sref=\"app.home\" target=\"_system\" title=\"{{\\'API.COMMON.LINK_DOC_HELP\\'|translate}}\">{{\\'API.COMMON.LINK_DOC\\'|translate}}</a> - <a href=\"../\" title=\"{{\\'API.COMMON.LINK_STANDARD_APP_HELP\\'|translate}}\">{{\\'API.COMMON.LINK_STANDARD_APP\\'|translate}}</a></p></ion-content></ion-view>');\n$templateCache.put('templates/blockchain/item_block_empty_lg.html','<a name=\"block-{{::block.number}}\"></a><div id=\"block-{{::block.number}}\" class=\"item item-block item-icon-left item-block-empty\" ng-class=\":rebind:{\\'compacted\\': block.compacted && compactMode}\" ng-click=\"selectBlock(block)\"><div class=\"row no-padding\" ng-if=\":rebind:!block.compacted || !compactMode\"><div class=\"col\"><h3 class=\"gray\"><i class=\"ion-clock\"></i> {{:rebind:block.medianTime|medianDate}}</h3></div><div class=\"col\"><h3><span class=\"gray\" ng-if=\":rebind:expertMode\"><i class=\"ion-key\"></i> {{:rebind:block.issuer|formatPubkey}} </span><span class=\"positive\"><i class=\"ion-person\"></i> {{:rebind:block.name||block.uid}}</span></h3></div><div class=\"col col-20\"></div><div class=\"col col-20\"><span class=\"badge\" ng-class=\"{\\'badge-balanced\\': !$index && search.type==\\'last\\'}\">{{block.number|formatInteger}}</span></div></div></div>');\n$templateCache.put('templates/blockchain/item_block_lg.html','<ion-item id=\"block-{{::block.number}}\" class=\"item item-block item-icon-left ink {{::ionItemClass}}\" ng-class=\"{{::ionItemClass}}\" ng-click=\"selectBlock(block)\"><i class=\"icon ion-cube stable\" ng-if=\":rebind:!block.avatar\"></i> <i class=\"avatar\" ng-if=\":rebind:!block.empty && block.avatar\" style=\"background-image: url(\\'{{:rebind:block.avatar.src}}\\')\"></i><div class=\"row no-padding\"><div class=\"col\"><h3 class=\"dark\"><i class=\"ion-clock\"></i> {{:rebind:block.medianTime|medianDate}}</h3><h4 class=\"gray\">{{:rebind:\\'BLOCKCHAIN.HASH\\'|translate}} {{:rebind:block.hash|formatHash}}</h4></div><div class=\"col\"><h3><span class=\"gray\" ng-if=\":rebind:expertMode\"><i class=\"ion-key\"></i> {{:rebind:block.issuer|formatPubkey}} </span><span class=\"positive\"><i class=\"ion-person\"></i> {{:rebind:block.name||block.uid}}</span></h3></div><div class=\"col col-20\"><small><ng-if ng-if=\":rebind:block.joinersCount||(block.excludedCount-block.revokedCount)\"><i class=\"ion-person\"></i> <span ng-if=\":rebind:block.joinersCount\">+{{:rebind:block.joinersCount}}</span> <span ng-if=\":rebind:block.excludedCount\">-{{:rebind:block.excludedCount-block.revokedCount}}</span> </ng-if><span ng-if=\":rebind:block.revokedCount\" class=\"assertive\"><i class=\"ion-minus-circled\"></i> -{{:rebind:block.revokedCount}} </span> <span ng-if=\":rebind:block.activesCount\"><i class=\"ion-refresh\"></i> {{:rebind:block.activesCount}} </span> <span ng-if=\":rebind:block.certificationsCount\"><i class=\"ion-ribbon-a\"></i> {{:rebind:block.certificationsCount}} </span> <span ng-if=\":rebind:block.dividend\"><i class=\"gray ion-arrow-up-c\"></i> {{:rebind:\\'COMMON.UD\\'|translate}} </span> <span ng-if=\":rebind:block.transactionsCount\"><i class=\"ion-card\">{{:rebind:block.transactionsCount}}</i> </span></small></div><div class=\"col col-20\"><span class=\"badge\" ng-class=\"{\\'badge-balanced\\': !$index && search.type==\\'last\\', \\'badge-calm\\': ($index || search.type!=\\'last\\')&& !block.compacted && !block.empty}\">{{:rebind:block.number}}</span></div></div></ion-item>');\n$templateCache.put('templates/blockchain/item_block.html','<a name=\"block-{{::block.number}}\"></a><ion-item id=\"block-{{::block.number}}\" class=\"item item-icon-left item-block {{::ionItemClass}}\" ng-class=\":rebind:{\\'ink\\': !block.empty||!block.compacted, \\'item-block-empty\\': block.empty, \\'compacted\\': block.compacted && compactMode}\" ng-click=\"selectBlock(block)\"><i class=\"icon ion-cube stable\" ng-if=\"(!block.empty && !block.avatar)\"></i> <i class=\"avatar\" ng-if=\"!block.empty && block.avatar\" style=\"background-image: url(\\'{{block.avatar.src}}\\')\"></i><div class=\"row no-padding\" ng-if=\":rebind:!block.compacted || !compactMode\"><div class=\"col\" style=\"min-width: 110px; max-width: 130px;\"><h4 ng-class=\":rebind:{\\'gray\\': block.compacted, \\'dark\\': !block.compacted}\"><i class=\"ion-clock\"></i> {{:rebind:block.medianTime|medianDate}}</h4><h4 ng-if=\":rebind:!block.empty\"><ng-if ng-if=\":rebind:block.joinersCount||(block.excludedCount-block.revokedCount)\"><i class=\"dark ion-person\"></i> <span class=\"dark\" ng-if=\":rebind:block.joinersCount\">+{{:rebind:block.joinersCount}}</span> <span class=\"dark\" ng-if=\":rebind:block.excludedCount\">-{{:rebind:block.excludedCount-block.revokedCount}}</span></ng-if><span class=\"dark\" ng-if=\":rebind:block.revokedCount\" class=\"assertive\"><i class=\"ion-minus-circled\"></i> {{:rebind:block.revokedCount}} </span> <span class=\"dark\" ng-if=\":rebind:block.activesCount\" class=\"gray\"><i class=\"gray ion-refresh\"></i> {{:rebind:block.activesCount}} </span> <span class=\"dark\" ng-if=\":rebind:block.certificationsCount\"><i class=\"ion-ribbon-a\"></i> {{:rebind:block.certificationsCount}} </span> <span class=\"dark\" ng-if=\":rebind:block.dividend\" class=\"gray\"><i class=\"gray ion-arrow-up-c\"></i> {{\\'COMMON.UD\\'|translate}} </span> <span class=\"dark\" ng-if=\":rebind:block.transactionsCount\"><i class=\"ion-card\">{{:rebind:block.transactionsCount}}</i></span></h4></div><div class=\"col positive hidden-md\"><h4><i class=\"ion-person\"></i> {{:rebind:block.name||block.uid}}</h4></div><div class=\"col col-20\"><span class=\"badge\" ng-class=\":rebind:{\\'badge-balanced\\': !$index , \\'badge-calm\\': $index && !block.compacted && !block.empty}\">{{::block.number|formatInteger}}</span></div></div></ion-item>');\n$templateCache.put('templates/blockchain/items_blocks.html','<div class=\"center padding\" ng-if=\"search.loading\"><ion-spinner icon=\"android\"></ion-spinner></div><ion-list class=\"animate-ripple padding padding-xs\"><div class=\"padding gray\" ng-if=\"!search.loading && !search.results.length\" translate>BLOCKCHAIN.LOOKUP.NO_BLOCK</div><ng-repeat ng-repeat=\"block in search.results track by block.number\" ng-include=\"::\\'templates/blockchain/item_block.html\\'\"></ng-repeat></ion-list><ion-infinite-scroll ng-if=\"search.hasMore\" icon=\"android\" on-infinite=\"showMore()\" distance=\"1%\"></ion-infinite-scroll>');\n$templateCache.put('templates/blockchain/link_identity.html','<a ui-sref=\"app.wot_identity({pubkey: identity.pubkey, uid: identity.uid})\"><span class=\"positive\" ng-if=\"identity.uid\"><i class=\"icon ion-person\"></i> {{::identity.uid}} </span> <span class=\"gray\" ng-class=\"{\\'hidden-xs hidden-sm\\': identity.uid}\"><i class=\"icon ion-key\"></i> {{::identity.pubkey|formatPubkey}}</span></a>');\n$templateCache.put('templates/blockchain/list_blocks_lg.html','<div class=\"padding padding-xs\" style=\"display: block; height: 100px;\"><h4 translate>BLOCKCHAIN.LOOKUP.LAST_BLOCKS</h4><div class=\"pull-right\"><a class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-positive\\': compactMode, \\'button-text-stable\\': !compactMode}\" ng-click=\"toggleCompactMode()\"><i class=\"icon ion-navicon\"></i> <b class=\"ion-arrow-down-b\" style=\"position: absolute; top: -2px; left: 4px; font-size: 8px;\"></b> <b class=\"ion-arrow-up-b\" style=\"position: absolute; top: 10px; left: 4px; font-size: 8px;\"></b> <span>{{:locale:\\'BLOCKCHAIN.LOOKUP.BTN_COMPACT\\'|translate}}</span></a></div></div><div class=\"center padding\" ng-if=\"search.loading\"><ion-spinner icon=\"android\"></ion-spinner></div><ion-list class=\"padding padding-xs list-blocks {{::motion.ionListClass}}\"><div class=\"padding gray\" ng-if=\"!search.loading && !search.results.length\">{{:locale:\\'BLOCKCHAIN.LOOKUP.NO_BLOCK\\'|translate}}</div><ng-repeat ng-repeat=\"block in search.results track by block.id\" ng-include=\"!block.empty ? \\'templates/blockchain/item_block_lg.html\\' : \\'templates/blockchain/item_block_empty_lg.html\\'\"></ng-repeat></ion-list><ion-infinite-scroll ng-if=\"search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"1%\"></ion-infinite-scroll>');\n$templateCache.put('templates/blockchain/list_blocks.html','<div class=\"center padding\" ng-if=\"search.loading\"><ion-spinner icon=\"android\"></ion-spinner></div><ion-list class=\"padding padding-xs list-blocks {{::motion.ionListClass}}\"><div class=\"padding gray\" ng-if=\"!search.loading && !search.results.length\" translate>BLOCKCHAIN.LOOKUP.NO_BLOCK</div><ng-repeat ng-repeat=\"block in search.results track by block.number\" ng-include=\"::\\'templates/blockchain/item_block.html\\'\"></ng-repeat></ion-list><ion-infinite-scroll ng-if=\"search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"1%\"></ion-infinite-scroll>');\n$templateCache.put('templates/blockchain/lookup_lg.html','<ion-view><ion-nav-title><span translate>BLOCKCHAIN.LOOKUP.TITLE</span></ion-nav-title><ion-content class=\"padding no-padding-xs no-padding-sm\" scroll=\"true\"><ng-include src=\"::\\'templates/blockchain/list_blocks_lg.html\\'\"></ng-include></ion-content></ion-view>');\n$templateCache.put('templates/blockchain/lookup.html','<ion-view><ion-nav-title><span translate>BLOCKCHAIN.LOOKUP.TITLE</span></ion-nav-title><ion-content class=\"padding no-padding-xs\" scroll=\"true\"><ng-include src=\"::\\'templates/blockchain/list_blocks.html\\'\"></ng-include></ion-content></ion-view>');\n$templateCache.put('templates/blockchain/unlock_condition_popover.html','<ion-popover-view class=\"fit\"><ion-header-bar><h1 class=\"title\" translate>BLOCKCHAIN.VIEW.TX_OUTPUT_UNLOCK_CONDITIONS</h1></ion-header-bar><ion-content scroll=\"true\"><div class=\"row\" ng-repeat=\"condition in popoverData.unlockConditions track by $index\" ng-style=\"::condition.style\"><span class=\"gray\" ng-if=\"::condition.operator\">{{::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_OPERATOR.\\'+condition.operator|translate}} </span><div ng-if=\"::condition.type==\\'SIG\\'\"><i class=\"icon ion-key dark\"></i> <span class=\"dark\" ng-bind-html=\"::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.SIG\\' | translate\"></span> <a ng-click=\"goState(\\'app.wot_identity\\', {pubkey:condition.value})\" style=\"text-decoration: none;\" class=\"positive\">{{condition.value|formatPubkey}}</a></div><div ng-if=\"::condition.type==\\'XHX\\'\"><i class=\"icon ion-lock-combination dark\"></i> <span class=\"dark\" ng-bind-html=\"::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.XHX\\' | translate\"></span> <a copy-on-click=\"{{::condition.value}}\" class=\"positive\">{{::condition.value|formatPubkey}}...</a></div><div ng-if=\"condition.type==\\'CSV\\'\"><i class=\"icon ion-clock dark\"></i> <span class=\"dark\" ng-bind-html=\"::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.CSV\\' | translate\"></span> {{::condition.value|formatDuration}}</div><div ng-if=\"condition.type==\\'CLTV\\'\"><i class=\"icon ion-clock dark\"></i> <span class=\"dark\" ng-bind-html=\"::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.CLTV\\' | translate\"></span> {{::condition.value|medianDate}}</div></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/blockchain/view_block.html','<ion-view><ion-nav-title><span class=\"title visible-xs visible-sm\" ng-if=\"number==\\'current\\'\">{{\\'BLOCKCHAIN.VIEW.TITLE_CURRENT\\'|translate}}</span> <span class=\"title visible-xs visible-sm\" ng-if=\"number!=\\'current\\'\">{{\\'BLOCKCHAIN.VIEW.TITLE\\'|translate:formData}}</span></ion-nav-title><ion-content class=\"no-padding-xs no-padding-sm\" scroll=\"true\"><div class=\"row no-padding\"><div class=\"col col-15 hidden-xs hidden-sm\"> </div><div class=\"col no-padding\"><div class=\"center padding\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></div><div class=\"list item-text-wrap no-padding-xs\" ng-if=\"!loading\"><div class=\"item item-text-wrap\"><h1 class=\"padding-top hidden-xs hidden-sm\"><span ng-if=\"number!=\\'current\\'\">{{\\'BLOCKCHAIN.VIEW.TITLE\\'|translate:formData}}</span> <span ng-if=\"number==\\'current\\'\">{{\\'BLOCKCHAIN.VIEW.TITLE_CURRENT\\'|translate}}</span></h1><h3><span class=\"dark\"><i class=\"icon ion-clock\"></i> {{formData.medianTime | medianFromNowAndDate}}</span></h3><h3><span class=\"dark\"><i class=\"icon ion-lock-combination\"></i> {{\\'BLOCKCHAIN.VIEW.COMPUTED_BY\\'|translate}} </span><a class=\"positive\" ui-sref=\"app.wot_identity({pubkey:issuer.pubkey, uid: issuer.uid})\"><i class=\"icon ion-person positive\"></i> {{issuer.name||issuer.uid}} <span class=\"gray\" ng-if=\"issuer.name\">({{issuer.uid}})</span></a></h3><h3><a ng-click=\"openRawBlock($event)\"><i class=\"icon ion-share\"></i> {{\\'BLOCKCHAIN.VIEW.SHOW_RAW\\'|translate}}</a></h3></div><div class=\"item hidden-xs hidden-sm padding text-center\"><div class=\"pull-right\"><a class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-positive\\': compactMode, \\'button-text-stable\\': !compactMode}\" ng-click=\"toggleCompactMode()\"><i class=\"icon ion-navicon\"></i> <b class=\"ion-arrow-down-b\" style=\"position: absolute; top: -2px; left: 4px; font-size: 8px;\"></b> <b class=\"ion-arrow-up-b\" style=\"position: absolute; top: 10px; left: 4px; font-size: 8px;\"></b> <span>{{\\'BLOCKCHAIN.LOOKUP.BTN_COMPACT\\'|translate}}</span></a></div><cs-extension-point name=\"buttons\"></cs-extension-point></div><span class=\"item item-divider\">{{\\'BLOCKCHAIN.VIEW.TECHNICAL_DIVIDER\\' | translate}}</span><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"!compactMode || $root.settings.expertMode\"><i class=\"icon ion-gear-b\"></i> {{\\'BLOCKCHAIN.VIEW.VERSION\\'|translate}} <span class=\"badge badge-stable\">{{::formData.version}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"!compactMode || $root.settings.expertMode\" copy-on-click=\"{{::formData.powMin}}\"><i class=\"icon ion-lock-combination\"></i> {{\\'BLOCKCHAIN.VIEW.POW_MIN\\'|translate}}<h4 class=\"gray\">{{\\'BLOCKCHAIN.VIEW.POW_MIN_HELP\\'|translate}}</h4><span class=\"badge badge-stable\">{{::formData.powMin}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" copy-on-click=\"{{::formData.hash}}\"><i class=\"icon ion-pound\"></i> {{\\'BLOCKCHAIN.VIEW.HASH\\'|translate}} <span class=\"item-note hidden-xs hidden-sm dark\">{{::formData.hash}}</span><h5 class=\"visible-xs visible-sm dark\">{{::formData.hash}}</h5></ion-item><ion-item class=\"hidden-sm hidden-xs\"></ion-item><span class=\"item item-divider\">{{\\'BLOCKCHAIN.VIEW.DATA_DIVIDER\\' | translate}}</span><ion-item ng-if=\"compactMode && formData.empty\" class=\"item-icon-left item-text-wrap\">{{\\'BLOCKCHAIN.VIEW.EMPTY\\'|translate}}</ion-item><ion-item ng-if=\"!compactMode || formData.dividend\" class=\"item-icon-left item-text-wrap\" copy-on-click=\"{{::formData.dividend/100}}\"><i class=\"icon ion-arrow-up-c\"></i><div class=\"col col-60\">{{\\'COMMON.UNIVERSAL_DIVIDEND\\'|translate}}<h4 class=\"gray\">{{\\'BLOCKCHAIN.VIEW.UNIVERSAL_DIVIDEND_HELP\\'|translate: {membersCount: formData.membersCount} }}</h4></div><span class=\"badge badge-balanced\" ng-if=\"formData.dividend\">+1 <span ng-bind-html=\"formData.currency|currencySymbol: {useRelative: true} \"></span> / {{\\'COMMON.MEMBER\\'|translate|lowercase}} </span><span class=\"badge badge-stable\" ng-if=\"!formData.dividend\">0</span> <span class=\"badge badge-secondary\" ng-if=\"formData.dividend\">+ {{formData.dividend| formatAmount: {currency: formData.currency, useRelative: false} }} / {{\\'COMMON.MEMBER\\'|translate|lowercase}}</span></ion-item><ng-if ng-if=\"!compactMode || formData.identitiesCount\"><ion-item class=\"item-icon-left\"><i class=\"icon ion-person\"></i> <b class=\"ion-clock\" style=\"position: absolute; top: 16px; left: 39px; font-size: 12px;\"></b> {{\\'BLOCKCHAIN.VIEW.IDENTITIES_COUNT\\'|translate}} <span class=\"badge badge-balanced\" ng-if=\"formData.identitiesCount\">+{{::formData.identitiesCount}}</span> <span class=\"badge badge-stable\" ng-if=\"!formData.identitiesCount\">0</span></ion-item><div class=\"padding-bottom item-icon-left-padding item-icon-right-padding\" ng-if=\"formData.identitiesCount\"><ion-item ng-repeat=\"identity in ::formData.identities\" class=\"item-border-large item-small-height\" ng-include=\"::\\'templates/blockchain/link_identity.html\\'\"></ion-item></div></ng-if><ng-if ng-if=\"!compactMode || formData.joinersCount\"><ion-item class=\"item-icon-left\"><i class=\"icon ion-person-add\"></i> {{\\'BLOCKCHAIN.VIEW.JOINERS_COUNT\\'|translate}} <span class=\"badge badge-balanced\" ng-if=\"formData.joinersCount\">+{{::formData.joinersCount}}</span> <span class=\"badge badge-stable\" ng-if=\"!formData.joinersCount\">0</span></ion-item><div class=\"padding-bottom item-icon-left-padding item-icon-right-padding\" ng-if=\"formData.joinersCount\"><ion-item ng-repeat=\"identity in ::formData.joiners\" class=\"item-border-large item-small-height\" ng-include=\"::\\'templates/blockchain/link_identity.html\\'\"></ion-item></div></ng-if><ng-if ng-if=\"!compactMode || formData.activesCount\"><ion-item class=\"item-icon-left\"><i class=\"icon ion-person\"></i> <b class=\"ion-refresh\" style=\"position: absolute; top: 25px; left: 39px; font-size: 12px;\"></b> {{\\'BLOCKCHAIN.VIEW.ACTIVES_COUNT\\'|translate}}<h4 class=\"gray\">{{\\'BLOCKCHAIN.VIEW.ACTIVES_COUNT_HELP\\'|translate}}</h4><span class=\"badge badge-balanced\" ng-if=\"formData.activesCount\">{{::formData.activesCount}}</span> <span class=\"badge badge-stable\" ng-if=\"!formData.activesCount\">0</span></ion-item><div class=\"padding-bottom item-icon-left-padding item-icon-right-padding\" ng-if=\"formData.activesCount\"><ion-item ng-repeat=\"identity in ::formData.actives\" class=\"item-border-large item-small-height\" ng-include=\"::\\'templates/blockchain/link_identity.html\\'\"></ion-item></div></ng-if><ng-if ng-if=\"!compactMode || (formData.excludedCount-formData.revokedCount)\"><ion-item class=\"item-icon-left\"><i class=\"icon ion-person\"></i> <b class=\"ion-close dark\" style=\"position: absolute; top: 25px; left: 39px; font-size: 12px;\"></b> {{\\'BLOCKCHAIN.VIEW.EXCLUDED_COUNT\\'|translate}}<h4 class=\"gray\">{{\\'BLOCKCHAIN.VIEW.EXCLUDED_COUNT_HELP\\'|translate}}</h4><span class=\"badge badge-assertive\" ng-if=\"formData.excludedCount-formData.revokedCount\">-{{::formData.excludedCount-formData.revokedCount}}</span> <span class=\"badge badge-stable\" ng-if=\"!(formData.excludedCount-formData.revokedCount)\">0</span></ion-item><div class=\"padding-bottom item-icon-left-padding item-icon-right-padding\" ng-if=\"formData.excludedCount\"><ion-item ng-repeat=\"identity in ::formData.excluded\" class=\"item-border-large item-small-height\" ng-include=\"::\\'templates/blockchain/link_identity.html\\'\"></ion-item></div></ng-if><ng-if ng-if=\"!compactMode || formData.leaversCount\"><ion-item class=\"item-icon-left\" ng-if=\"!compactMode || formData.leaversCount\"><i class=\"icon ion-person\"></i> <b class=\"ion-minus\" style=\"position: absolute; top: 25px; left: 39px; font-size: 12px;\"></b> {{\\'BLOCKCHAIN.VIEW.LEAVERS_COUNT\\'|translate}}<h4 class=\"gray\">{{\\'BLOCKCHAIN.VIEW.LEAVERS_COUNT_HELP\\'|translate}}</h4><span class=\"badge badge-assertive\" ng-if=\"formData.leaversCount\">-{{::formData.leaversCount}}</span> <span class=\"badge badge-stable\" ng-if=\"!formData.leaversCount\">0</span></ion-item><div class=\"padding-bottom item-icon-left-padding item-icon-right-padding\" ng-if=\"formData.leaversCount\"><ion-item ng-repeat=\"identity in ::formData.leavers\" class=\"item-border-large item-small-height\" ng-include=\"::\\'templates/blockchain/link_identity.html\\'\"></ion-item></div></ng-if><ng-if ng-if=\"!compactMode || formData.revokedCount\"><ion-item class=\"item-icon-left\"><i class=\"icon ion-person\"></i> <b class=\"ion-minus-circled assertive\" style=\"position: absolute; top: 25px; left: 39px; font-size: 12px;\"></b> {{\\'BLOCKCHAIN.VIEW.REVOKED_COUNT\\'|translate}}<h4 class=\"gray\">{{\\'BLOCKCHAIN.VIEW.REVOKED_COUNT_HELP\\'|translate}}</h4><span class=\"badge badge-balanced\" ng-if=\"formData.revokedCount\">-{{::formData.revokedCount}}</span> <span class=\"badge badge-stable\" ng-if=\"!formData.revokedCount\">0</span></ion-item><div class=\"padding-bottom item-icon-left-padding item-icon-right-padding\" ng-if=\"formData.revokedCount\"><ion-item ng-repeat=\"identity in ::formData.revoked\" class=\"item-border-large item-small-height\" ng-include=\"::\\'templates/blockchain/link_identity.html\\'\"></ion-item></div></ng-if><ng-if ng-if=\"!compactMode || formData.certificationsCount\"><ion-item class=\"item-icon-left\"><i class=\"icon ion-ribbon-a\"></i> {{\\'BLOCKCHAIN.VIEW.CERT_COUNT\\'|translate}} <span class=\"badge badge-stable\" ng-class=\"{\\'badge-positive\\':formData.certificationsCount}\">{{::formData.certificationsCount}}</span></ion-item><div class=\"padding-bottom item-icon-left-padding item-icon-right-padding no-padding-xs\" ng-if=\"formData.certificationsCount\"><div ng-repeat=\"(key, certs) in formData.certifications\" class=\"item item-border-large item-small-height\"><div class=\"row no-padding\"><div class=\"col col-center no-padding\"><ng-repeat ng-repeat=\"cert in certs\"><ng-include src=\"::\\'templates/blockchain/link_identity.html\\'\" onload=\"identity=cert.from\"></ng-include><br></ng-repeat></div><div class=\"col col-10 col-center gray text-center no-padding\"><h2><i class=\"icon ion-arrow-right-a\"></i></h2></div><div class=\"col col-40 col-center no-padding\" ng-include=\"::\\'templates/blockchain/link_identity.html\\'\" onload=\"identity=certs[0].to\"></div></div></div></div></ng-if><ng-if ng-if=\"!compactMode || formData.transactionsCount\"><ion-item class=\"item-icon-left\"><i class=\"icon ion-card\"></i> {{\\'BLOCKCHAIN.VIEW.TX_COUNT\\'|translate}} <span class=\"badge badge-stable\" ng-class=\"{\\'badge-positive\\':formData.transactionsCount}\">{{::formData.transactionsCount}}</span></ion-item><div class=\"padding-bottom item-icon-left-padding item-icon-right-padding no-padding-xs\" ng-if=\"formData.transactionsCount\"><div ng-repeat=\"tx in ::formData.transactions\" class=\"item item-small-height item-border-large\"><div class=\"row no-padding\" style=\"padding-top: 3px;\"><div class=\"col col-40 col-center no-padding list no-margin\"><div ng-repeat=\"identity in ::tx.issuers\" class=\"item no-padding item-small-height\"><ng-include src=\"\\'templates/blockchain/link_identity.html\\'\"></ng-include></div></div><div class=\"col col-10 col-center gray text-center no-padding\"><h2><i class=\"icon ion-arrow-right-a\"></i></h2></div><div class=\"col no-padding padding-right no-padding-xs col-text-wrap list no-margin\"><span class=\"gray\" class=\"gray\" ng-if=\"tx.toHimself\" translate>BLOCKCHAIN.VIEW.TX_TO_HIMSELF</span><div ng-repeat=\"output in ::tx.outputs\" class=\"item no-padding item-small-height\"><ng-include ng-if=\"::output.pubkey\" src=\"\\'templates/blockchain/link_identity.html\\'\" onload=\"identity=output\"></ng-include><span ng-if=\"::!output.pubkey && output.unlockFunctions\"><i class=\"icon ion-locked\"></i> (<a ng-click=\"showUnlockConditionPopover(output, $event)\"> <i ng-repeat=\"unlockFunction in ::output.unlockFunctions\" ng-class=\"::{\\'ion-key\\': (unlockFunction==\\'SIG\\'), \\'ion-clock\\': (unlockFunction==\\'CSV\\' || unlockFunction==\\'CLTV\\'), \\'ion-lock-combination\\': (unlockFunction==\\'XHX\\') }\" class=\"icon\"></i> </a>) </span><span class=\"badge badge-balanced\" ng-bind-html=\"::output.amount | formatAmount:{currency: formData.currency, useRelative: false} \"></span></div></div></div></div></div></ng-if></div></div><div class=\"col col-15 hidden-sm hidden-xs\"></div></div></ion-content></ion-view>');\n$templateCache.put('templates/common/badge_certification_count.html','<span ng-attr-id=\"{{$ctrl.csId}}\" class=\"badge badge-balanced\" ng-class=\"{\\'badge-energized\\': $ctrl.requirements.willNeedCertificationCount || ($ctrl.requirements.needCertificationCount + $ctrl.requirements.pendingCertificationCount >= $ctrl.parameters.sigQty),\\n \\'badge-assertive\\': ($ctrl.requirements.needCertificationCount + $ctrl.requirements.pendingCertificationCount < $ctrl.parameters.sigQty)}\"><span ng-if=\"$ctrl.requirements.certificationCount || !$ctrl.requirements.pendingCertificationCount\"><i ng-if=\"!$ctrl.requirements.needCertificationCount\" class=\"ion-android-done\"></i> {{$ctrl.requirements.certificationCount}} <i ng-if=\"$ctrl.requirements.willNeedCertificationCount\" class=\"ion-android-warning\"></i> </span><span ng-if=\"$ctrl.requirements.pendingCertificationCount\"><ng-if ng-if=\"$ctrl.requirements.certificationCount\">+</ng-if><i class=\"ion-clock\"></i> {{$ctrl.requirements.pendingCertificationCount}}</span></span>');\n$templateCache.put('templates/common/badge_given_certification_count.html','<div ng-attr-id=\"{{$ctrl.csId}}\" class=\"badge badge-calm\" ng-class=\"{\\'badge-assertive\\': $ctrl.identity.given_cert.length >= $ctrl.parameters.sigStock}\"><span><i ng-if=\"$ctrl.identity.given_cert.length\" class=\"ion-android-done\"></i> {{$ctrl.identity.given_cert.length}} </span><span ng-if=\"$ctrl.identity.given_cert_pending.length\">(<ng-if ng-if=\"$ctrl.identity.given_cert.length\">+</ng-if><i class=\"ion-clock\"></i> {{$ctrl.identity.given_cert_pending.length}}) </span><small>/ {{$ctrl.parameters.sigStock}}</small></div>');\n$templateCache.put('templates/common/form_error_messages.html','<div class=\"form-error\" ng-message=\"minlength\"><span translate=\"ERROR.FIELD_TOO_SHORT\"></span></div><div class=\"form-error\" ng-message=\"maxlength\"><span translate=\"ERROR.FIELD_TOO_LONG\"></span></div><div class=\"form-error\" ng-message=\"pattern\"><span translate=\"ERROR.FIELD_ACCENT\"></span></div><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div>');\n$templateCache.put('templates/common/note_feature_not_available.html','<h4 class=\"assertive\"><b class=\"ion-android-close\"></b> <span translate>MODE.DEMO.FEATURE_NOT_AVAILABLE</span></h4>');\n$templateCache.put('templates/common/popover_copy.html','<ion-popover-view class=\"popover-copy\" style=\"height: {{(!rows || rows <= 1) ? 50 : rows*22}}px\"><ion-content scroll=\"false\"><div class=\"list\"><div class=\"item item-input\"><input type=\"text\" autocomplete=\"off\" ng-if=\"!rows || rows <= 1\" ng-model=\"value\"> <textarea ng-if=\"rows && rows > 1\" ng-model=\"value\" rows=\"{{rows}}\" cols=\"10\">\\n </textarea></div></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/common/popover_helptip.html','<ion-popover-view class=\"popover-helptip\"><ion-content scroll=\"false\" class=\"list\"><p><i ng-if=\"icon.position && !icon.position.startsWith(\\'bottom-\\')\" class=\"{{icon.class}} icon-{{icon.position}} hidden-xs\" style=\"{{icon.style}}\"></i><a ng-click=\"closePopover()\" class=\"pull-right button-close\" ng-class=\"{\\'pull-left\\': icon.position === \\'right\\', \\'pull-right\\': icon.position !== \\'right\\'}\"><i class=\"ion-close\"></i> </a><span> </span></p><p class=\"padding light\"><ng-bind-html ng-bind-html=\"content | translate:contentParams\"></ng-bind-html><ng-bind-html ng-bind-html=\"trustContent\"></ng-bind-html></p><div class=\"text-center\" ng-if=\"!tour\"><button class=\"button button-small button-stable\" ng-if=\"!hasNext\" ng-click=\"closePopover(true)\" translate>COMMON.BTN_UNDERSTOOD</button> <button class=\"button button-small button-stable\" id=\"helptip-btn-ok\" ng-if=\"hasNext\" ng-click=\"closePopover(false)\" translate>COMMON.BTN_UNDERSTOOD</button> <button id=\"helptip-btn-ok\" class=\"button button-small button-positive icon-right ink\" ng-if=\"hasNext\" ng-click=\"closePopover(true)\"><i class=\"icon ion-chevron-right\"></i></button></div><div class=\"text-center\" ng-if=\"tour\"><button class=\"button button-small button-positive\" id=\"helptip-btn-ok\" ng-if=\"!hasNext\" ng-click=\"closePopover(false)\" translate>COMMON.BTN_CLOSE</button> <button id=\"helptip-btn-ok\" class=\"button button-small button-positive icon-right ink\" ng-if=\"hasNext\" ng-click=\"closePopover(true)\">{{\\'COMMON.BTN_CONTINUE\\'|translate}} <i class=\"icon ion-chevron-right\"></i></button></div><p><i ng-if=\"icon.position && icon.position.startsWith(\\'bottom-\\')\" class=\"{{icon.class}} icon-{{icon.position}} hidden-xs\"></i></p></ion-content></ion-popover-view>');\n$templateCache.put('templates/common/popover_locales.html','<ion-popover-view class=\"fit popover-locales\" style=\"height: {{locales.length*48}}px;\"><ion-content scroll=\"false\"><div class=\"list item-text-wrap block\"><a ng-repeat=\"l in locales track by l.id\" class=\"item item-icon-left ink\" ng-click=\"changeLanguage(l.id)\"><i class=\"item-image avatar\" style=\"background-image: url(./img/flag-{{l.flag}}.png)\"></i> {{l.label | translate}}</a></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/common/popover_profile.html','<ion-popover-view class=\"fit has-header popover-profile hidden-xs hidden-sm\"><ion-content scroll=\"false\"><div class=\"row\"><div class=\"col col-33\"><i class=\"avatar avatar-member\" ng-if=\"!walletData.avatar\" ng-class=\"{\\'royal-bg\\': login, \\'stable-bg\\': !login}\"></i> <i class=\"avatar\" ng-if=\"walletData.avatar\" style=\"background-image: url(\\'{{walletData.avatar.src}}\\')\"></i></div><div class=\"col col-66\" ng-if=\"login\"><h4>{{walletData.name||walletData.uid}}</h4><h4 class=\"gray\" ng-if=\"!walletData.name && !walletData.uid\" copy-on-click=\"{{walletData.pubkey}}\"><i class=\"icon ion-key\"></i> {{walletData.pubkey|formatPubkey}}</h4><span class=\"gray\" ng-if=\"walletData.name||walletData.uid\" copy-on-click=\"{{walletData.pubkey}}\"><i class=\"icon ion-key\"></i> {{walletData.pubkey|formatPubkey}}</span></div></div><div class=\"row\" ng-show=\"login\"><div class=\"col col-66 col-offset-33\"><button ng-show=\"!auth\" class=\"button button-assertive button-small ink\" ng-click=\"doAuth()\">{{\\'AUTH.BTN_AUTH\\' | translate}}</button><cs-extension-point name=\"profile-popover-user\"></cs-extension-point></div></div><div class=\"row\" ng-show=\"!login\"><div class=\"col col-66 col-offset-33\"><div class=\"text-center no-padding gray\">{{\\'LOGIN.NO_ACCOUNT_QUESTION\\'|translate}}<br class=\"visible-xs\"><b><button class=\"button button-calm button-small ink\" ng-click=\"showJoinModal()\">{{\\'LOGIN.CREATE_ACCOUNT\\'|translate}}</button></b></div></div></div></ion-content><ion-footer-bar class=\"stable-bg row\"><div class=\"col\"><button class=\"button button-raised button-block button-stable ink ink-dark\" id=\"helptip-popover-profile-btn-settings\" ng-click=\"showSettings()\" ui-sref=\"app.settings\"><i class=\"icon ion-android-settings\"></i> {{\\'MENU.SETTINGS\\' | translate}}</button></div><div class=\"col\"><button class=\"button button-raised button-block button-stable ink ink-dark\" ng-show=\"login\" ng-click=\"logout()\" translate>COMMON.BTN_LOGOUT</button> <button class=\"button button-raised button-block button-positive ink\" ng-show=\"!login\" ng-click=\"loginAndGo(\\'app.view_wallet\\')\" translate>COMMON.BTN_LOGIN</button></div></ion-footer-bar></ion-popover-view>');\n$templateCache.put('templates/common/popover_share.html','<ion-popover-view class=\"popover-share\"><ion-content scroll=\"false\"><div class=\"bar bar-header\"><h1 class=\"title\">{{titleKey|translate:titleValues}}</h1><span class=\"gray pull-right\">{{time|formatDate}}</span></div><div class=\"list no-margin no-padding has-header has-footer block\"><div class=\"item item-input\"><input type=\"text\" autocomplete=\"off\" ng-model=\"value\"></div></div><div class=\"bar bar-footer\"><div class=\"button-bar\"><a class=\"button button-icon positive icon ion-social-facebook\" href=\"https://www.facebook.com/sharer/sharer.php?u={{postUrl|formatEncodeURI}}&title={{postMessage|formatEncodeURI}}\" onclick=\"window.open(this.href, \\'facebook-share\\',\\'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=580,height=296\\');return false;\" title=\"{{\\'COMMON.POPOVER_SHARE.SHARE_ON_FACEBOOK\\'|translate}}\"></a> <a class=\"button button-icon positive icon ion-social-twitter\" href=\"https://twitter.com/intent/tweet?url={{postUrl|formatEncodeURI}}&text={{postMessage|formatEncodeURI}}\" onclick=\"window.open(this.href, \\'twitter-share\\',\\'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=580,height=296\\');return false;\" title=\"{{\\'COMMON.POPOVER_SHARE.SHARE_ON_TWITTER\\'|translate}}\"></a> <a class=\"button button-icon positive icon ion-social-googleplus\" href=\"https://plus.google.com/share?url={{postUrl|formatEncodeURI}}\" onclick=\"window.open(this.href, \\'google-plus-share\\', \\'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,height=296,width=580\\');return false;\" title=\"{{\\'COMMON.POPOVER_SHARE.SHARE_ON_GOOGLEPLUS\\'|translate}}\"></a> <a class=\"button button-icon positive icon ion-social-diaspora\" href=\"https://sharetodiaspora.github.io/?title={{postMessage|formatEncodeURI}}&url={{postUrl|formatEncodeURI}}\" onclick=\"window.open(this.href, \\'diaspora-share\\',\\'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=580,height=296\\');return false;\" title=\"{{\\'COMMON.POPOVER_SHARE.SHARE_ON_DIASPORA\\'|translate}}\"></a> <a class=\"button-close\" title=\"{{\\'COMMON.BTN_CLOSE\\'|translate}}\" ng-click=\"closePopover()\"><i class=\"icon ion-close\"></i></a></div></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/common/popup_password.html','<form name=\"pwdForm\" ng-submit=\"submit($event)\"><div class=\"list\" ng-init=\"setForm(pwdForm)\"><label class=\"item item-input\" ng-class=\"{\\'item-input-error\\': pwdForm.$submitted && pwdForm.password.$invalid}\"><input name=\"password\" type=\"password\" placeholder=\"{{\\'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.PASSWORD_HELP\\' | translate}}\" ng-model=\"formData.password\" ng-minlength=\"1\" required></label><div class=\"form-errors\" ng-if=\"pwdForm.$submitted && pwdForm.pseudo.$error\" ng-messages=\"pwdForm.password.$error\"><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div><div class=\"form-error\" ng-message=\"minlength\"><span translate=\"ERROR.FIELD_TOO_SHORT\"></span></div></div><div class=\"form-errors\" ng-if=\"error\"><div class=\"form-error\">{{error|translate}}</div></div></div></form>');\n$templateCache.put('templates/common/qrcode.html','<a ng-attr-id=\"{{ qrcodeId }}\" ng-show=\"!loading\" class=\"qrcode fade-in pull-right\" ng-class=\"{\\'active\\': toggleQRCode}\" ng-click=\"toggleQRCode = !toggleQRCode\"><div class=\"content\"></div><div class=\"footer item item-icon-left item-text-wrap ink\" on-hold=\"copy(formData.pubkey)\" copy-on-click=\"{{:rebind:formData.pubkey}}\" ng-click=\"$event.stopPropagation()\"><i class=\"icon ion-key\"></i> <span>{{:locale:\\'COMMON.PUBKEY\\'|translate}}</span><h4 id=\"pubkey\" class=\"dark\">{{:rebind:formData.pubkey}}</h4></div></a>');\n$templateCache.put('templates/common/view_passcode.html','<ion-view left-buttons=\"leftButtons\"><ion-nav-title><span class=\"visible-xs visible-sm\" translate>COMMON.PASSCODE.TITLE</span></ion-nav-title><ion-content scroll=\"false\"></ion-content></ion-view>');\n$templateCache.put('templates/currency/items_network.html','<ion-item id=\"helptip-network-blockchain\" class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-clock\"></i> <span class=\"col col-60\" translate>CURRENCY.VIEW.MEDIAN_TIME</span> <span class=\"badge badge-stable\">{{formData.medianTime | medianDate}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-lock-combination\"></i> <span class=\"col col-75\" translate>CURRENCY.VIEW.POW_MIN</span> <span class=\"badge badge-stable\">{{formData.difficulty | formatInteger}}</span></ion-item><cs-extension-point name=\"network-actual\"></cs-extension-point><div class=\"item item-divider\"><span translate>CURRENCY.VIEW.NETWORK_RULES_DIVIDER</span></div><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-clock\" style=\"position: absolute; font-size: 20px; left: 16px; margin-top: 11px\"></i> <b class=\"icon-secondary ion-lock-combination\" style=\"left: 14px; margin-top: -4px;\"></b> <b class=\"icon-secondary ion-arrow-right-c\" style=\"font-size: 12px; left: 28px; margin-top: -4px;\"></b> <b class=\"icon-secondary ion-lock-combination\" style=\"left: 38px; margin-top: -4px;\"></b> <span class=\"col col-75\" translate>CURRENCY.VIEW.AVG_GEN_TIME</span> <span class=\"badge badge-stable\">{{formData.avgGenTime | formatDuration}}</span></ion-item><div id=\"helptip-network-peers\" class=\"item item-divider\"><div class=\"pull-left\"><span ng-if=\"search.type==\\'member\\'\" translate>PEER.MEMBERS</span> <span ng-if=\"search.type==\\'mirror\\'\" translate>PEER.MIRRORS</span> <span ng-if=\"search.type==\\'offline\\'\" translate>PEER.OFFLINE</span> <span ng-if=\"!search.type\" translate>PEER.PEERS</span> <span ng-if=\"!search.loading\">({{search.results.length}})</span></div><div class=\"buttons pull-right\"><ion-spinner class=\"icon\" icon=\"android\" ng-if=\"search.loading\"></ion-spinner><a class=\"button button-icon button-small-padding icon ion-loop gray hidden-xs hidden-sm ink\" ng-if=\"!search.loading\" ng-click=\"refresh()\"></a> <a class=\"button button-icon button-small-padding icon ion-android-more-vertical gray hidden-xs hidden-sm ink\" ng-if=\"!search.loading\" ng-click=\"showActionsPopover($event)\"></a></div></div><ng-include src=\"::\\'templates/network/items_peers.html\\'\"></ng-include>');\n$templateCache.put('templates/currency/items_parameters.html','<div bind-notifier=\"{ rebind:formData.useRelative }\"><ion-item class=\"item-icon-left item-text-wrap visible-xs visible-sm\"><i class=\"icon ion-android-bookmark\"></i> <span translate>CURRENCY.VIEW.CURRENCY_NAME</span><div class=\"item-note dark\" ng-if=\"!loading\">{{formData.currency}} (<span ng-bind-html=\":rebind:formData.currency | currencySymbol:formData.useRelative\"></span>)</div></ion-item><ion-item id=\"helptip-currency-mass-member\" class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-pie-graph\"></i><div class=\"col col-60\"><span translate>CURRENCY.VIEW.SHARE</span> <span class=\"gray\">(M<sub>t</sub>/N<sub>t</sub>)</span></div><span id=\"helptip-currency-mass-member-unit\" ng-if=\"!loading\" class=\"badge badge-calm\" ng-bind-html=\":rebind:formData.MoverN | formatAmount:{currency: formData.currency, useRelative: formData.useRelative, currentUD: formData.currentUD}\"></span></ion-item><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-record\"></i><div class=\"col col-60\"><span translate>CURRENCY.VIEW.MASS</span> <span class=\"gray\">(M<sub>t</sub>)</span></div><span class=\"badge badge-energized\" ng-if=\"!loading\" ng-bind-html=\":rebind:formData.M | formatAmount:{currency: formData.currency, useRelative: formData.useRelative, currentUD: formData.currentUD}\"></span></ion-item><cs-extension-point name=\"parameters-actual\"></cs-extension-point><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-arrow-graph-up-right\"></i><div class=\"col col-60\"><span translate>CURRENCY.VIEW.C_ACTUAL</span> <span class=\"gray\">(c<sub>{{\\'CURRENCY.VIEW.CURRENT\\'|translate}}</sub>)</span></div><span class=\"badge badge-stable\">{{formData.cactual | formatNumeral: \\'0,0.00\\'}} % / {{formData.dt | formatPeriod}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-load-c\"></i><div class=\"col col-60\"><span translate>CURRENCY.VIEW.UD</span> <span class=\"gray\">({{\\'COMMON.UD\\'|translate}}<sub>t</sub>)</span></div><div class=\"badge badge-royal\" ng-if=\"!loading\"><span ng-if=\"formData.useRelative\">1<ng-bind-html ng-bind-html=\":rebind:formData.currency| currencySymbol:true\"></ng-bind-html></span><span ng-if=\"!formData.useRelative\" ng-bind-html=\":rebind:formData.currentUD | formatAmount:{currency: formData.currency, useRelative: formData.useRelative, currentUD: formData.currentUD}\"></span> / {{formData.dt | formatPeriod}}</div></ion-item><div class=\"item item-toggle dark\"><div class=\"item-label text-right gray\" translate>COMMON.BTN_RELATIVE_UNIT</div><label class=\"toggle toggle-royal\" id=\"helptip-currency-change-unit\"><input type=\"checkbox\" ng-model=\"formData.useRelative\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><a name=\"helptip-currency-rules-anchor\"></a><div class=\"item item-divider\" id=\"helptip-currency-rules\"><span translate>CURRENCY.VIEW.MONEY_RULES_DIVIDER</span></div><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-arrow-graph-up-right\"></i><div class=\"col col-60\"><span translate>CURRENCY.VIEW.C_RULE</span> <span class=\"gray\">(c)</span></div><span class=\"item-note dark\" ng-if=\"!loading && !formData.udReevalTime0\">{{formData.c*100 | formatNumeral: \\'0,0.00\\'}} % / {{formData.dt | formatPeriod}}</span><span class=\"badge badge-stable\" ng-if=\"!loading && formData.udReevalTime0\">{{formData.c*100 | formatNumeral: \\'0,0.00\\'}} % / {{formData.dtReeval | formatDuration}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.udReevalTime0 && formData.allRules\"><i class=\"icon ion-load-c\"></i> <b class=\"ion-clock icon-secondary\" style=\"font-size: 18px; left: 36px; top: -12px;\"></b><div class=\"col col-60\"><span translate>CURRENCY.VIEW.DT_REEVAL</span> <span class=\"gray\">(dt<sub>{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}}</sub>)</span></div><span class=\"item-note dark\" ng-if=\"!loading\" translate=\"CURRENCY.VIEW.DT_REEVAL_VALUE\" translate-values=\"formData\"></span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.udReevalTime0 && formData.allRules\"><i class=\"icon ion-load-c\"></i> <b class=\"ion-calendar icon-secondary\" style=\"font-size: 18px; left: 36px; top: -12px;\"></b><div class=\"col col-60\"><span translate>CURRENCY.VIEW.UD_REEVAL_TIME0</span> <span class=\"gray\">(t0<sub>{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}}</sub>)</span></div><span class=\"item-note dark\" ng-if=\"!loading\">{{formData.udReevalTime0|medianDate}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.allRules\"><i class=\"icon ion-load-c\"></i> <b class=\"ion-calculator icon-secondary\" style=\"font-size: 18px; left: 36px; top: -12px;\"></b><div class=\"col col-60\"><span translate>CURRENCY.VIEW.UD_RULE</span> <span class=\"gray\" ng-if=\"formData.udReevalTime0\">- {{\\'COMMON.UD\\'|translate}}<sub>{{formData.dt|formatPeriod}}</sub>(t<sub>{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}}</sub>)</span></div><span class=\"item-note dark\" ng-if=\"!loading && !formData.udReevalTime0\">{{\\'COMMON.UD\\'|translate}}<sub>t-1</sub> + c<sup>2</sup> * M<sub>t-1</sub>/N<sub>t-1</sub></span><span class=\"item-note dark\" ng-if=\"!loading && formData.udReevalTime0\">{{\\'COMMON.UD\\'|translate}}<sub>{{formData.dt|formatPeriod}}</sub>(t<sub>{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}}</sub> - dt<sub>{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}}</sub>)+ c<sup>2</sup> * (M/N)(t<sub>{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}}</sub> - dt<sub>{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}}</sub>) / dt<sub>{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}}</sub></span></ion-item><div class=\"item item-toggle dark\"><div class=\"item-label text-right gray\" translate>CURRENCY.VIEW.DISPLAY_ALL_RULES</div><label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"formData.allRules\"><div class=\"track\"><div class=\"handle\"></div></div></label></div></div>');\n$templateCache.put('templates/currency/items_wot.html','<div bind-notifier=\"{ rebind:formData.useRelative }\"><a name=\"helptip-currency-newcomers-anchor\"></a><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-person-stalker\"></i><div class=\"col col-60\"><span translate>CURRENCY.VIEW.MEMBERS</span> <span class=\"gray\">(N<sub>{{\\'CURRENCY.VIEW.CURRENT\\'|translate}}</sub>)</span></div><span class=\"badge badge-calm\" ng-if=\"!loading\">{{formData.N | formatInteger}}</span></ion-item><ion-item id=\"helptip-currency-newcomers\" class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-arrow-graph-up-right\"></i><div class=\"col col-75\"><span translate=\"CURRENCY.VIEW.MEMBERS_VARIATION\" translate-values=\"{duration: formData.durationFromLastUD}\"></span> <span class=\"gray\">(ΔN)</span></div><div class=\"badge\" ng-if=\"!loading\" ng-class=\"{\\'badge-balanced\\': (formData.N>formData.Nprev), \\'badge-stable\\': (formData.N==formData.Nprev) ,\\'badge-assertive\\': (formData.Nprev>formData.N)}\">{{formData.N > formData.Nprev ? \\'+\\' : \\'\\'}}{{formData.N - formData.Nprev}}</div></ion-item><cs-extension-point name=\"wot-actual\"></cs-extension-point><div class=\"item item-divider\"><span translate>CURRENCY.VIEW.WOT_RULES_DIVIDER</span></div><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-ribbon-b\"></i> <span class=\"col col-75\" translate>CURRENCY.VIEW.SIG_QTY_RULE</span> <span class=\"badge badge-balanced\" ng-if=\"!loading\">{{formData.sigQty}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-person\"></i> <b class=\"ion-clock icon-secondary\" style=\"font-size: 18px; left: 33px; top: -12px;\"></b> <span class=\"col col-60\" translate>CURRENCY.VIEW.MS_WINDOW</span> <span class=\"badge badge-assertive\" ng-if=\"!loading\">{{formData.msWindow | formatDuration}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"icon ion-person\"></i> <b class=\"ion-calendar icon-secondary\" style=\"font-size: 18px; left: 33px; top: -12px;\"></b> <span class=\"col col-60\" translate>CURRENCY.VIEW.MS_VALIDITY</span> <span class=\"badge badge-balanced\" ng-if=\"!loading\">{{formData.msValidity | formatDuration}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.allWotRules\"><i class=\"icon ion-ribbon-b\"></i> <b class=\"ion-clock icon-secondary\" style=\"font-size: 18px; left: 33px; top: -12px;\"></b> <span class=\"col col-60\" translate>CURRENCY.VIEW.SIG_WINDOW</span> <span class=\"badge badge-stable\" ng-if=\"!loading\">{{formData.sigWindow | formatDuration}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.allWotRules\"><i class=\"icon ion-ribbon-b\"></i> <b class=\"ion-calendar icon-secondary\" style=\"font-size: 18px; left: 33px; top: -12px;\"></b> <span class=\"col col-60\" translate>CURRENCY.VIEW.SIG_VALIDITY</span> <span class=\"badge badge-balanced\" ng-if=\"!loading\">{{formData.sigValidity | formatDuration}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.allWotRules\"><i class=\"icon ion-ribbon-a\"></i> <span class=\"col col-75\" translate>CURRENCY.VIEW.SIG_STOCK</span> <span class=\"badge badge-stable\" ng-if=\"!loading\">{{formData.sigStock}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.allWotRules\"><i class=\"icon ion-clock\" style=\"position: absolute; font-size: 20px; left: 16px;\"></i> <b class=\"ion-ribbon-a icon-secondary\" style=\"left: 16px; top: -15px;\"></b> <b class=\"ion-arrow-right-c icon-secondary\" style=\"left: 28px; top: -15px;\"></b> <b class=\"ion-ribbon-a icon-secondary\" style=\"left: 40px; top: -15px;\"></b> <span class=\"col col-75\" translate>CURRENCY.VIEW.SIG_PERIOD</span> <span class=\"badge badge-stable\" ng-if=\"!loading\">{{formData.sigPeriod | formatDuration}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.allWotRules\"><i class=\"icon ion-steam\"></i> <b class=\"ion-person icon-secondary\" style=\"left: 38px; top: -17px\"></b><div class=\"col col-75\"><span ng-bind-html=\"\\'CURRENCY.VIEW.STEP_MAX\\'|translate\"></span> <span class=\"gray\">(stepMax)</span></div><span class=\"badge badge-assertive\" ng-if=\"!loading\">{{formData.stepMax}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.allWotRules\"><i class=\"icon ion-ribbon-b\"></i> <b class=\"ion-star icon-secondary\" style=\"color: yellow; font-size: 16px; left: 25px; top: -7px;\"></b> <span class=\"col col-75\" translate>CURRENCY.VIEW.SENTRIES</span> <span class=\"badge badge-stable\" ng-if=\"!loading\">{{formData.sentries}}</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.allWotRules\"><i class=\"icon ion-ribbon-b\"></i> <b class=\"ion-star icon-secondary\" style=\"color: yellow; font-size: 16px; left: 25px; top: -7px;\"></b> <span class=\"col col-75\" translate>CURRENCY.VIEW.SENTRIES_FORMULA</span> <span class=\"item-note dark\" ng-if=\"!loading\">{{\\'CURRENCY.VIEW.MATH_CEILING\\'| translate}}( N<sub>t</sub><sup>^ (1 / stepMax)</sup>)</span></ion-item><ion-item class=\"item-icon-left item-text-wrap\" ng-if=\"formData.allWotRules\"><i class=\"icon ion-pull-request\"></i> <span class=\"col col-75\" translate>CURRENCY.VIEW.XPERCENT</span> <span class=\"badge badge-stable\" ng-if=\"!loading\">{{formData.xpercent*100| formatNumeral: \\'0,0\\'}} %</span></ion-item><div class=\"item item-toggle dark\"><div class=\"item-label text-right gray\" translate>CURRENCY.VIEW.DISPLAY_ALL_RULES</div><label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"formData.allWotRules\"><div class=\"track\"><div class=\"handle\"></div></div></label></div></div>');\n$templateCache.put('templates/currency/lookup_form.html','<ion-list><div class=\"item center\" ng-if=\"search.loading\"><ion-spinner icon=\"android\"></ion-spinner></div><div ng-repeat=\"currency in search.results\" ng-class=\"{ selected: selectedCurrency == currency }\"><a class=\"item card card-item stable-bg padding ink\" ng-click=\"selectCurrency(currency)\" ng-class=\"{ selected: selectedCurrency && selectedCurrency.name == currency.name }\"><h2>{{currency.name}}</h2><h4 class=\"gray\">{{currency.peer.server}}</h4><span class=\"badge badge-royal\">{{\\'CURRENCY.SELECT.MEMBERS_COUNT\\'|translate:currency}}</span></a></div></ion-list>');\n$templateCache.put('templates/currency/lookup.html','<ion-view view-title=\"{{\\'CURRENCY.SELECT.TITLE\\' | translate}}\"><ion-content class=\"padding no-padding-xs no-padding-sm\"><h4 class=\"content double-padding-x\" translate>CURRENCY.SELECT.CURRENCIES</h4><ng-include src=\"::\\'templates/currency/lookup_form.html\\'\"></ion-content></ion-view>');\n$templateCache.put('templates/currency/modal_license.html','<ion-modal-view class=\"modal-full-height modal-license\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear visible-xs\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button><h1 class=\"title\" translate>CURRENCY.LICENSE.TITLE</h1><button class=\"button button-icon button-clear icon ion-android-send visible-xs\" ng-click=\"doTransfer()\"></button></ion-header-bar><ion-content scroll=\"false\" style=\"bottom: 0px;\"><p ng-if=\"!licenseUrl && !loading\">translate>CURRENCY.LICENSE.NO_LICENSE_FILE</p><iframe ng-if=\"licenseUrl && !loading\" class=\"padding-left padding-right no-padding-xs iframe-license\" id=\"iframe-license\" ng-src=\"{{licenseUrlHtml||licenseUrl}}\"></iframe><div class=\"padding hidden-xs text-center\"><button class=\"button button-stable ink\" ng-click=\"downloadFile()\">{{\\'CURRENCY.LICENSE.BTN_DOWNLOAD\\' | translate}}</button> <button class=\"button button-positive ink\" type=\"submit\" ng-click=\"closeModal()\">{{\\'COMMON.BTN_CLOSE\\' | translate}}</button></div></ion-content></ion-modal-view>');\n$templateCache.put('templates/currency/popover_actions.html','<ion-popover-view class=\"fit has-header popover-wallet-actions\"><ion-header-bar><h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll=\"false\"><div class=\"list item-text-wrap\"><a class=\"item item-icon-left ink hidden-sm hidden-xs\" ng-click=\"startCurrencyTour()\"><i class=\"icon ion-easel\"></i> {{\\'COMMON.BTN_HELP_TOUR_SCREEN\\' | translate}}</a></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/currency/tabs/tab_blocks.html','<ion-view><ion-nav-buttons side=\"secondary\"><button class=\"button button-icon button-clear icon ion-navicon visible-xs visible-sm\" ng-click=\"toggleCompactMode()\"><b class=\"icon-secondary\" ng-class=\"{\\'ion-arrow-down-b\\': !compactMode, \\'ion-arrow-up-b\\': compactMode}\" style=\"top: -12px; left: 11px; font-size: 10px;\"></b> <b class=\"icon-secondary\" ng-class=\"{\\'ion-arrow-up-b\\': !compactMode,\\'ion-arrow-down-b\\': compactMode}\" style=\"top: 12px; left: 11px; font-size: 10px;\"></b></button><cs-extension-point name=\"nav-buttons\"></cs-extension-point></ion-nav-buttons><ion-content><div class=\"item item-divider\"><span translate>BLOCKCHAIN.LOOKUP.LAST_BLOCKS</span></div><cs-extension-point name=\"buttons\"></cs-extension-point><ng-include src=\"::\\'templates/blockchain/list_blocks.html\\'\"></ng-include></ion-content></ion-view>');\n$templateCache.put('templates/currency/tabs/tab_network.html','<ion-view><ion-nav-buttons side=\"secondary\"><button class=\"button button-icon button-clear\" ng-click=\"showExtendActionsPopover($event)\"><i class=\"icon ion-android-funnel\"></i></button></ion-nav-buttons><ion-content><ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"refreshPeers()\"></ion-refresher><div class=\"list\"><ng-include src=\"::\\'templates/currency/items_network.html\\'\"></ng-include></div></ion-content></ion-view>');\n$templateCache.put('templates/currency/tabs/tab_parameters.html','<ion-view><ion-nav-buttons side=\"secondary\"><cs-extension-point name=\"nav-buttons\"></cs-extension-point></ion-nav-buttons><ion-content><ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"refresh()\"></ion-refresher><div class=\"list\"><ng-include src=\"::\\'templates/currency/items_parameters.html\\'\"></ng-include></div></ion-content></ion-view>');\n$templateCache.put('templates/currency/tabs/tab_wot.html','<ion-view><ion-content><ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"refresh()\"></ion-refresher><div class=\"list\"><ng-include src=\"::\\'templates/currency/items_wot.html\\'\"></ng-include></div></ion-content></ion-view>');\n$templateCache.put('templates/currency/view_currency_lg.html','<ion-view left-buttons=\"leftButtons\" cache-view=\"false\"><ion-nav-title bind-notifier=\"{ rebind:formData.useRelative }\"><span ng-if=\"!loading\">{{\\'CURRENCY.VIEW.TITLE\\' | translate}} {{formData.currency|abbreviate}}</span></ion-nav-title><ion-nav-buttons side=\"secondary\"><button class=\"button button-icon button-clear icon ion-loop visible-xs visible-sm\" ng-click=\"refreshPeers()\"></button><cs-extension-point name=\"nav-buttons\"></cs-extension-point></ion-nav-buttons><ion-content><div class=\"hidden-xs hidden-sm padding text-center\"><button class=\"button button-stable icon-right ink\" ng-if=\"formData.licenseUrl\" ng-click=\"showLicenseModal()\"><i class=\"icon ion-document-text\"></i> {{\\'CURRENCY.VIEW.BTN_SHOW_LICENSE\\' | translate}}</button> <button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"refresh()\" title=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\"></button> <button class=\"button button-stable button-small-padding icon ion-android-more-vertical ink\" ng-click=\"showActionsPopover($event)\"></button></div><div class=\"item item-text-wrap no-border no-padding pull-left\"><div class=\"item-icon-left card padding stable-900-bg\"><ion-spinner class=\"icon\" icon=\"android\" ng-if=\"loading\"></ion-spinner><i class=\"icon ion-help-circled calm\" ng-if=\"!loading\"></i><div class=\"item-icon-left-padding\" style=\"min-height: 26px;\"><span ng-if=\"!loading\" trust-as-html=\"\\'CURRENCY.VIEW.CURRENCY_SHORT_DESCRIPTION\\'|translate:formData\"></span></div></div></div><div class=\"row responsive-sm\"><div class=\"col list\"><div class=\"item item-divider\"><span translate>CURRENCY.VIEW.MONEY_DIVIDER</span></div><ng-include src=\"::\\'templates/currency/items_parameters.html\\'\"></ng-include></div><div class=\"col list\"><div class=\"item item-divider\"><span translate>CURRENCY.VIEW.WOT_DIVIDER</span></div><ng-include src=\"::\\'templates/currency/items_wot.html\\'\"></ng-include></div></div></ion-content></ion-view>');\n$templateCache.put('templates/currency/view_currency.html','<ion-view left-buttons=\"leftButtons\" cache-view=\"false\"><ion-tabs class=\"tabs-positive tabs-icon-top\"><ion-tab title=\"{{\\'CURRENCY.VIEW.TAB_CURRENCY\\'|translate}}\" icon=\"ion-stats-bars\" ui-sref=\"app.currency.tab_parameters\"><ion-nav-view name=\"tab-parameters\"></ion-nav-view></ion-tab><ion-tab title=\"{{\\'CURRENCY.VIEW.TAB_WOT\\'|translate}}\" icon=\"ion-person-stalker\" ui-sref=\"app.currency.tab_wot\"><ion-nav-view name=\"tab-wot\"></ion-nav-view></ion-tab><ion-tab id=\"helptip-currency-tab-peers\" title=\"{{\\'CURRENCY.VIEW.TAB_NETWORK\\'|translate}}\" icon=\"ion-cloud\" ui-sref=\"app.currency.tab_network\"><ion-nav-view name=\"tab-network\"></ion-nav-view></ion-tab><ion-tab title=\"{{\\'CURRENCY.VIEW.TAB_BLOCKS\\'|translate}}\" icon=\"ion-lock-combination\" ui-sref=\"app.currency.tab_blocks\"><ion-nav-view name=\"tab-blocks\"></ion-nav-view></ion-tab></ion-tabs></ion-view>');\n$templateCache.put('templates/help/help.html','<a name=\"demo\"></a><div class=\"row responsive-sm\" ng-if=\"::$root.config.demo\" ng-class=\"itemsClass[\\'demo\\']\"><div class=\"col col-20\" translate>MODE.DEMO.MODE</div><div class=\"col\"><span translate>MODE.DEMO.MODE_HELP</span><br><span translate>MODE.DEMO.INSTALL_HELP</span></div></div><a name=\"readonly\"></a><div class=\"row responsive-sm\" ng-if=\"::$root.config.readonly\" ng-class=\"itemsClass[\\'readonly\\']\"><div class=\"col col-20\" translate>MODE.READONLY.MODE</div><div class=\"col\"><span translate>MODE.READONLY.MODE_HELP</span><br><span translate>MODE.READONLY.INSTALL_HELP</span></div></div><div class=\"hidden-readonly\"><a name=\"join\"></a><h2 translate>HELP.JOIN.SECTION</h2><a name=\"join-salt\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass[\\'join-salt\\']\"><div class=\"col col-20\" translate>LOGIN.SALT</div><div class=\"col\" translate>HELP.JOIN.SALT</div></div><a name=\"join-password\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass[\\'join-password\\']\"><div class=\"col col-20\" translate>LOGIN.PASSWORD</div><div class=\"col\" translate>HELP.JOIN.PASSWORD</div></div><a name=\"join-pseudo\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass[\\'join-pseudo\\']\"><div class=\"col col-20\" translate>ACCOUNT.NEW.PSEUDO</div><div class=\"col\" translate>HELP.JOIN.PSEUDO</div></div></div><div class=\"hidden-readonly\"><a name=\"login\"></a><h2 translate>HELP.LOGIN.SECTION</h2><a name=\"login-pubkey\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass[\\'login-pubkey\\']\"><div class=\"col col-20\" translate>HELP.LOGIN.PUBKEY</div><div class=\"col\" translate>HELP.LOGIN.PUBKEY_DEF</div></div><a name=\"login-method\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass[\\'login-method\\']\"><div class=\"col col-20\" translate>HELP.LOGIN.METHOD</div><div class=\"col\" translate>HELP.LOGIN.METHOD_DEF</div></div></div><div><a name=\"glossary\"></a><h2 translate>HELP.GLOSSARY.SECTION</h2><a name=\"pubkey\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass.pubkey\"><div class=\"col col-20\" translate>COMMON.PUBKEY</div><div class=\"col\" translate>HELP.GLOSSARY.PUBKEY_DEF</div></div><a name=\"blockchain\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass.blockchain\"><div class=\"col col-20\" translate>HELP.GLOSSARY.BLOCKCHAIN</div><div class=\"col\" translate>HELP.GLOSSARY.BLOCKCHAIN_DEF</div></div><a name=\"universal_dividend\"></a> <a name=\"ud\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass.ud\"><div class=\"col col-20\" translate>COMMON.UNIVERSAL_DIVIDEND</div><div class=\"col\" translate>HELP.GLOSSARY.UNIVERSAL_DIVIDEND_DEF</div></div><a name=\"member\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass.member\"><div class=\"col col-20\" translate>HELP.GLOSSARY.MEMBER</div><div class=\"col\" translate>HELP.GLOSSARY.MEMBER_DEF</div></div><a name=\"wot\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass.wot\"><div class=\"col col-20\" translate>HELP.GLOSSARY.WOT</div><div class=\"col\" translate>HELP.GLOSSARY.WOT_DEF</div></div><a name=\"currency_rules\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass.currency_rules\"><div class=\"col col-20\" translate>HELP.GLOSSARY.CURRENCY_RULES</div><div class=\"col\" translate>HELP.GLOSSARY.CURRENCY_RULES_DEF</div></div><a name=\"distance_rule\"></a><div class=\"row responsive-sm\" ng-class=\"itemsClass.distance_rule\"><div class=\"col col-20\" translate>HELP.GLOSSARY.DISTANCE_RULE</div><div class=\"col\" translate>HELP.GLOSSARY.DISTANCE_RULE_DEF</div></div></div>');\n$templateCache.put('templates/help/modal_help.html','<ion-modal-view class=\"modal-full-height modal-help\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear\" ng-click=\"closeModal()\" translate>COMMON.BTN_CLOSE</button><h1 class=\"title\" translate>HELP.TITLE</h1></ion-header-bar><ion-content scroll=\"true\" class=\"padding no-padding-xs\"><div ng-class=\"listClass\"><ng-include src=\"::\\'templates/help/help.html\\'\"></ng-include></div><div class=\"padding hidden-xs text-center\"><button class=\"button button-positive ink\" type=\"submit\" ng-click=\"closeModal()\">{{\\'COMMON.BTN_CLOSE\\' | translate}}</button></div></ion-content></ion-modal-view>');\n$templateCache.put('templates/help/view_help.html','<ion-view left-buttons=\"leftButtons\"><ion-nav-title><span class=\"visible-xs visible-sm\" translate>HELP.TITLE</span></ion-nav-title><ion-content scroll=\"true\" class=\"padding\"><h1 class=\"hidden-xs hidden-sm\" translate>HELP.TITLE</h1><ng-include src=\"::\\'templates/help/help.html\\'\"></ng-include></ion-content></ion-view>');\n$templateCache.put('templates/home/home.html','<ion-view id=\"home\"><ion-nav-title></ion-nav-title><ion-nav-buttons side=\"secondary\"><button class=\"button button-clear hidden-xs hidden-sm flag\" ng-click=\"showLocalesPopover($event)\" style=\"align-content: center\"><i class=\"flag-image\" ng-if=\":locale:$root.settings.locale\" style=\"background-image: url(./img/flag-{{$root.settings.locale.flag}}.png);\"></i> <b class=\"ion-arrow-down-b gray\"></b></button></ion-nav-buttons><ion-content class=\"circle-bg-dark\" ng-class=\"::{\\'positive-900-bg\\': !$root.config.readonly, \\'balanced-900-bg\\': $root.config.readonly}\"><div class=\"ribbon\" ng-if=\"::$root.config.demo || $root.config.readonly\"><a class=\"badge badge-assertive\" ng-if=\"$root.config.demo\" ng-click=\"showHelpModal(\\'demo\\')\">{{:locale:\\'MODE.DEMO.BADGE\\'|translate}}</a> <a class=\"badge badge-balanced\" ng-if=\"$root.config.readonly\" ng-click=\"showHelpModal(\\'readonly\\')\">{{:locale:\\'MODE.READONLY.BADGE\\'|translate}}</a> <a class=\"badge badge-positive\" ng-click=\"openLink($event, $root.settings.sourceUrl)\" title=\"{{:locale:\\'HOME.FORK_ME\\'|translate}}\">{{:locale:\\'HOME.FREE_SOFTWARE\\'|translate}}</a> <a class=\"badge badge-stable\" ng-click=\"openLink($event, $root.settings.sourceLicenseUrl)\" title=\"{{:locale:\\'HOME.SHOW_LICENSE\\'|translate}}\">AGPL-3.0</a></div><div class=\"row padding-horizontal no-padding-xxs responsive-lg\"><div class=\"col col-30 no-padding hidden-xs hidden-sm\"> </div><div class=\"col text-center no-padding-xs main-container\"><div id=\"helptip-home-logo\" class=\"logo\"></div><h4 class=\"welcome\" ng-if=\"::!$root.config.readonly\"><p class=\"hidden-xs\" translate>HOME.WELCOME</p><b ng-show=\"!loading\" translate-values=\":currency:{currency: $root.currency.name}\" translate>HOME.MESSAGE</b></h4><h4 class=\"welcome\" ng-if=\"::$root.config.readonly\"><p translate>HOME.WELCOME_READONLY</p><b ng-show=\"!loading\" translate-values=\":currency:{currency: $root.currency.name}\" translate>HOME.MESSAGE_READONLY</b></h4><div class=\"center padding\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></div><div class=\"center padding animate-fade-in animate-show-hide ng-hide\" ng-show=\"!loading && error\"><div class=\"card card-item padding\"><p class=\"item-content item-text-wrap\"><span class=\"dark\" trust-as-html=\"\\'HOME.CONNECTION_ERROR\\'|translate:node\"></span></p><button type=\"button\" class=\"button button-positive icon icon-left ion-refresh ink\" ng-click=\"reload()\">{{:locale:\\'COMMON.BTN_REFRESH\\'|translate}}</button></div></div><div class=\"center animate-show-hide ng-hide\" ng-show=\"!loading && !error\"><button type=\"button\" class=\"button button-block button-stable button-raised icon-left icon ion-easel ink-dark\" ng-class=\"::{\\'hidden-xs\\': !$root.config.readonly}\" ng-show=\"login || $root.config.readonly\" ng-click=\"startHelpTour($event)\">{{:locale:\\'COMMON.BTN_HELP_TOUR\\'|translate}}</button> <button type=\"button\" class=\"item button button-block button-balanced button-raised icon icon-left ion-ios-world-outline ink-dark\" ui-sref=\"app.currency\" ng-if=\"::$root.config.readonly\"><span translate-values=\":currency:{currency: $root.currency.name}\" translate>HOME.BTN_CURRENCY</span></button> <button type=\"button\" class=\"item button button-block button-positive button-raised icon icon-left ion-cloud ink-dark\" ui-sref=\"app.network\" ng-if=\"::$root.config.readonly\">{{:locale:\\'HOME.BTN_NETWORK\\'|translate}}</button> <button type=\"button\" class=\"button button-block button-positive button-raised ink-dark\" ng-click=\"showJoinModal()\" ng-if=\"!$root.config.readonly && !login\" translate>LOGIN.CREATE_FREE_ACCOUNT</button> <button type=\"button\" class=\"item button button-block button-raised icon icon-left ion-person ink-dark\" ng-class=\"{\\'button-stable\\': smallscreen, \\'button-positive\\': !smallscreen}\" ui-sref=\"app.view_wallet\" ng-show=\"login\" translate>MENU.ACCOUNT</button> <button type=\"button\" class=\"item button button-block button-stable button-raised icon icon-left ion-card ink-dark visible-xs\" ui-sref=\"app.view_wallet_tx\" ng-if=\"login\"><b class=\"icon-secondary ion-clock\" style=\"left: 52px; top: -2px; font-size: 10pt; display: block;\"></b> {{:locale:\\'MENU.TRANSACTIONS\\'|translate}}</button> <button type=\"button\" class=\"item button button-block button-positive button-raised icon icon-left ion-paper-airplane ink-dark visible-xs\" ng-click=\"showTransferModal()\" ng-if=\"login\" translate>COMMON.BTN_SEND_MONEY</button><br class=\"visible-xs visible-sm\"><div class=\"text-center no-padding\" ng-if=\"::!$root.config.readonly\" ng-show=\"!login\"><br class=\"visible-xs visible-sm\">{{\\'LOGIN.HAVE_ACCOUNT_QUESTION\\'|translate}} <b><a class=\"assertive hidden-xs hidden-sm\" ui-sref=\"app.view_wallet\" translate>COMMON.BTN_LOGIN</a></b></div><div class=\"text-center no-padding\" ng-show=\"login\"><br class=\"visible-xs visible-sm\"><span ng-bind-html=\"\\'HOME.NOT_YOUR_ACCOUNT_QUESTION\\'|translate:{pubkey: walletData.pubkey}\"></span><br><b><a class=\"assertive\" ng-click=\"logout({askConfirm: true})\" translate>HOME.BTN_CHANGE_ACCOUNT</a></b></div><button type=\"button\" class=\"button button-block button-stable button-raised ink visible-xs visible-sm\" ui-sref=\"app.view_wallet\" ng-if=\"!$root.config.readonly && !login\" translate>COMMON.BTN_LOGIN</button><div class=\"text-center visible-demo\"><br><p class=\"text-center\"><span class=\"light\"><i class=\"icon ion-help-circled\" style=\"font-size: 16pt;\"></i></span> <span class=\"stable\" translate>MODE.DEMO.MODE_HELP</span> <a href=\"#\" ng-click=\"showHelpModal(\\'demo\\')\" translate>HOME.READ_MORE</a></p></div><p class=\"text-center no-padding visible-readonly\"><br><span class=\"light\"><i class=\"icon ion-help-circled\" style=\"font-size: 16pt;\"></i></span> <span class=\"stable\" translate>MODE.READONLY.INSTALL_HELP</span></p><div class=\"text-center no-padding visible-xs stable\"><br>{{:locale:\\'COMMON.APP_VERSION\\'|translate:{version: config.version} }} | <a href=\"#\" ng-click=\"showAboutModal()\" translate>HOME.BTN_ABOUT</a></div></div></div><div class=\"col no-padding\" ng-class=\"{\\'col-30\\': !feed, \\'col-10\\': feed}\"> </div><div class=\"col col-30 no-padding\" ng-if=\"feed\"><div class=\"feed padding-horizontal no-padding-xs padding-top\"><h3 class=\"padding-left\"><i class=\"icon ion-speakerphone\"></i> {{feed.title}} <small><a ng-click=\"openLink($event, feed.home_page_url)\" class=\"gray\"><span translate>HOME.SHOW_ALL_FEED</span> <i class=\"icon ion-chevron-right\"></i></a></small></h3><div class=\"animate-show-hide ng-hide\" ng-show=\"feed\"><div ng-repeat=\"item in feed.items\" class=\"card padding no-margin-xs\"><div class=\"header\"><i ng-if=\"item.author.avatar\" class=\"avatar\" style=\"background-image: url({{item.author.avatar}});\"></i> <a ng-class=\"{\\'avatar-left-padding\\': item.author.avatar}\" class=\"author\" ng-click=\"item.author.url && openLink($event, item.author.url)\">{{item.author.name}} </a><a ng-if=\"item.time\" title=\"{{item.time|formatDate}}\" ng-click=\"openLink($event, item.url)\" class=\"item-note\"><small><i class=\"icon ion-clock\"></i> {{item.time|formatFromNow}}</small></a></div><h2 class=\"title feed-title\"><a ng-click=\"openLink($event, item.url)\">{{item.title}}</a></h2><div ng-if=\"item.content\" class=\"content feed-content\" trust-as-html=\"item.content\"></div><h4 class=\"card-footer feed-footer text-right positive-100\"><a ng-click=\"openLink($event, item.url)\"><span ng-if=\"item.truncated\" translate>HOME.READ_MORE</span> <span ng-if=\"!item.truncated\" translate>COMMON.BTN_SHOW</span> <i class=\"icon ion-chevron-right\"></i></a></h4></div></div></div></div></div></ion-content></ion-view>');\n$templateCache.put('templates/join/modal_choose_account_type.html','<ion-modal-view class=\"modal-full-height\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear visible-xs\" ng-if=\"!slides.slider.activeIndex\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-icon button-clear icon ion-ios-arrow-back buttons header-item\" ng-click=\"slidePrev()\" ng-if=\"slides.slider.activeIndex\"></button><h1 class=\"title\" translate>ACCOUNT.NEW.TITLE</h1><button class=\"button button-clear icon-right visible-xs\" ng-if=\"slides.slider.activeIndex === 0\" ng-click=\"slideNext()\"><span translate>COMMON.BTN_NEXT</span> <i class=\"icon ion-ios-arrow-right\"></i></button></ion-header-bar><ion-slides options=\"slides.options\" slider=\"slides.slider\"><ion-slide-page><ion-content class=\"has-header padding\"><div class=\"center padding\" ng-if=\"loading\"><ion-spinner class=\"icon\" icon=\"android\"></ion-spinner></div><div ng-if=\"!loading\"><p ng-bind-html=\"\\'ACCOUNT.NEW.INTRO_WARNING_TIME\\'|translate:currency\"></p><div class=\"row responsive-sm\"><div class=\"col\"><div class=\"item card item-icon-left padding item-text-wrap stable-bg\"><i class=\"icon ion-android-warning assertive\"></i><p class=\"item-content item-icon-left-padding\"><span class=\"dark\" translate>ACCOUNT.NEW.INTRO_WARNING_SECURITY</span><br><small translate>ACCOUNT.NEW.INTRO_WARNING_SECURITY_HELP</small></p></div></div><div class=\"col\"><div class=\"item card item-icon-left padding item-text-wrap stable-bg\"><i class=\"icon ion-information-circled positive\"></i><p class=\"item-content item-icon-left-padding\"><span class=\"dark\" trust-as-html=\"\\'ACCOUNT.NEW.REGISTRATION_NODE\\'|translate:currency.node\"></span><br><small trust-as-html=\"\\'ACCOUNT.NEW.REGISTRATION_NODE_HELP\\'|translate:currency.node\"></small></p></div></div></div></div><p class=\"hidden-xs hidden-sm\" ng-bind-html=\"\\'ACCOUNT.NEW.INTRO_HELP\\'|translate\"></p><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-positive icon-right ion-chevron-right ink\" ng-click=\"slideNext()\" ng-disabled=\"loading\" type=\"button\" translate>COMMON.BTN_START</button></div></ion-content></ion-slide-page><ion-slide-page><ion-content class=\"has-header padding\"><p translate>ACCOUNT.NEW.SELECT_ACCOUNT_TYPE</p><div class=\"list\"><button class=\"item item-complex card stable-bg item-icon-left item-icon-right ink\" ng-click=\"selectAccountTypeAndClose(\\'wallet\\')\"><div class=\"item-content item-text-wrap\"><i class=\"item-image icon dark ion-card\"></i><h2 translate>ACCOUNT.NEW.WALLET_ACCOUNT</h2><h4 class=\"gray\" translate>ACCOUNT.NEW.WALLET_ACCOUNT_HELP</h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"><i class=\"icon dark ion-ios-arrow-right\"></i></ng-if></div></button> <button class=\"item item-complex card stable-100-bg item-icon-left item-icon-right ink\" ng-click=\"selectAccountTypeAndClose(\\'member\\')\"><div class=\"item-content item-text-wrap\"><i class=\"item-image icon dark ion-person\"></i><h2 translate>ACCOUNT.NEW.MEMBER_ACCOUNT</h2><h4 class=\"gray\" ng-bind-html=\"\\'ACCOUNT.NEW.MEMBER_ACCOUNT_HELP\\'|translate:currency\"></h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"><i class=\"icon dark ion-ios-arrow-right\"></i></ng-if></div></button><cs-extension-point name=\"select-account-type\"></cs-extension-point></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button></div></ion-content></ion-slide-page></ion-slides></ion-modal-view>');\n$templateCache.put('templates/join/modal_join_member.html','<ion-modal-view class=\"modal-full-height\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear visible-xs\" ng-if=\"!slides.slider.activeIndex\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-icon button-clear icon ion-ios-arrow-back buttons header-item\" ng-click=\"doPrev()\" ng-if=\"slides.slider.activeIndex && slideBehavior.hasPreviousButton\"></button> <button class=\"button button-icon button-clear icon ion-ios-help-outline visible-xs\" ng-if=\"slideBehavior.helpAnchor\" ng-click=\"showHelpModal(slideBehavior.helpAnchor)\"></button><h1 class=\"title\" translate>ACCOUNT.NEW.MEMBER_ACCOUNT_TITLE</h1><button class=\"button button-clear icon-right visible-xs\" ng-if=\"slideBehavior.hasNextButton\" ng-click=\"doNext()\"><span translate>COMMON.BTN_NEXT</span> <i class=\"icon ion-ios-arrow-right\"></i></button> <button class=\"button button-clear icon-right visible-xs\" ng-class=\"{\\'button-text-stable\\': !isLicenseRead}\" ng-if=\"slideBehavior.hasAcceptButton\" ng-click=\"isLicenseRead ? doNext() : undefined\"><span translate>ACCOUNT.NEW.BTN_ACCEPT</span> <i class=\"icon ion-ios-arrow-right\"></i></button> <button class=\"button button-clear icon-right visible-xs\" ng-if=\"slideBehavior.hasSendButton\" ng-click=\"doNewAccount()\"><i class=\"icon ion-android-send\"></i></button></ion-header-bar><ion-slides options=\"slides.options\" slider=\"slides.slider\"><ion-slide-page ng-if=\"licenseFileUrl\"><ion-content class=\"has-header\" scroll=\"false\"><div class=\"padding\" translate>ACCOUNT.NEW.INFO_LICENSE</div><div class=\"center padding\" ng-if=\"loading\"><ion-spinner class=\"icon\" icon=\"android\"></ion-spinner></div><iframe ng-if=\"!loading\" class=\"padding-left padding-right no-padding-xs iframe-license\" id=\"iframe-license\" ng-src=\"{{licenseFileUrl}}\"></iframe><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-calm icon-right ion-chevron-right ink\" ng-click=\"doNext(\\'licenceForm\\')\" ng-disabled=\"!isLicenseRead\" type=\"button\" translate>ACCOUNT.NEW.BTN_ACCEPT_LICENSE</button></div></ion-content></ion-slide-page><ion-slide-page><ion-content class=\"has-header\" scroll=\"true\"><form name=\"pseudoForm\" novalidate=\"\" ng-submit=\"doNext(\\'pseudoForm\\')\"><div class=\"item item-text-wrap text-center padding\"><a class=\"pull-right icon-help hidden-xs\" ng-click=\"showHelpModal(\\'join-pseudo\\')\"></a> <span translate>ACCOUNT.NEW.PSEUDO_WARNING</span></div><div class=\"list\" ng-init=\"setForm(pseudoForm, \\'pseudoForm\\')\"><div class=\"item item-input\" ng-class=\"{\\'item-input-error\\': (pseudoForm.$submitted && pseudoForm.pseudo.$invalid) || (uiAlreadyUsed && formData.pseudo)}\"><span class=\"input-label\" translate>ACCOUNT.NEW.PSEUDO</span> <input id=\"pseudo\" name=\"pseudo\" type=\"text\" placeholder=\"{{\\'ACCOUNT.NEW.PSEUDO_HELP\\' | translate}}\" ng-model=\"formData.pseudo\" autocomplete=\"off\" ng-minlength=\"3\" ng-maxlength=\"100\" ng-pattern=\"userIdPattern\" ng-model-options=\"{ debounce: 250 }\" required></div><div class=\"form-errors\" ng-show=\"pseudoForm.$submitted && pseudoForm.pseudo.$error\" ng-messages=\"pseudoForm.pseudo.$error\"><div class=\"form-error\" ng-message=\"minlength\"><span translate=\"ERROR.FIELD_TOO_SHORT_WITH_LENGTH\" translate-values=\"{minLength: 3}\"></span></div><div class=\"form-error\" ng-message=\"maxlength\"><span translate=\"ERROR.FIELD_TOO_LONG_WITH_LENGTH\" translate-values=\"{maxLength: 100}\"></span></div><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div><div class=\"form-error\" ng-message=\"pattern\"><span translate=\"ERROR.INVALID_USER_ID\"></span></div></div><div class=\"text-right\" style=\"min-height: 18px;\"><div class=\"form-error gray\" ng-if=\"formData.computing && formData.pseudo\"><ion-spinner class=\"icon ion-spinner-small\" icon=\"android\" ng-if=\"formData.computing && formData.pseudo\"></ion-spinner><span translate>ACCOUNT.NEW.CHECKING_PSEUDO</span></div><ng-if ng-if=\"!formData.computing && formData.pseudo\"><div class=\"form-error balanced\" ng-if=\"!uiAlreadyUsed \"><i class=\"icon ion-checkmark balanced\"></i> <span translate>ACCOUNT.NEW.PSEUDO_AVAILABLE</span></div><div class=\"form-error\" ng-if=\"uiAlreadyUsed\"><i class=\"icon ion-close-circled assertive\"></i> <span translate>ACCOUNT.NEW.PSEUDO_NOT_AVAILABLE</span></div></ng-if></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-calm icon-right ion-chevron-right ink\" type=\"submit\" ng-disabled=\"uiAlreadyUsed\" translate>COMMON.BTN_NEXT</button></div></div></form></ion-content></ion-slide-page><ion-slide-page ng-if=\"!formData.pubkey\"><ion-content class=\"has-header\" scroll=\"true\"><form name=\"saltForm\" novalidate=\"\" ng-submit=\"doNext(\\'saltForm\\')\"><div class=\"list\" ng-init=\"setForm(saltForm, \\'saltForm\\')\"><div class=\"item item-text-wrap text-center padding hidden-xs\"><a class=\"pull-right icon-help\" ng-click=\"showHelpModal(\\'join-salt\\')\"></a> <span translate>ACCOUNT.NEW.SALT_WARNING</span></div><div class=\"item item-input\" ng-class=\"{ \\'item-input-error\\': saltForm.$submitted && saltForm.username.$invalid}\"><span class=\"input-label\" translate>LOGIN.SALT</span> <input ng-if=\"!showUsername\" name=\"username\" type=\"password\" placeholder=\"{{\\'LOGIN.SALT_HELP\\' | translate}}\" ng-change=\"formDataChanged()\" ng-model=\"formData.username\" autocomplete=\"off\" ng-minlength=\"8\" different-to=\"formData.pseudo\" required> <input ng-if=\"showUsername\" name=\"username\" type=\"text\" placeholder=\"{{\\'LOGIN.SALT_HELP\\' | translate}}\" ng-change=\"formDataChanged()\" ng-model=\"formData.username\" autocomplete=\"off\" ng-minlength=\"8\" different-to=\"formData.pseudo\" required></div><div class=\"form-errors\" ng-show=\"saltForm.$submitted && saltForm.username.$error\" ng-messages=\"saltForm.username.$error\"><div class=\"form-error\" ng-message=\"minlength\"><span translate=\"ERROR.FIELD_TOO_SHORT_WITH_LENGTH\" translate-values=\"{minLength: 8}\"></span></div><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div><div class=\"form-error\" ng-message=\"differentTo\"><span translate=\"ERROR.EQUALS_TO_PSEUDO\"></span></div></div><div class=\"item item-input\" ng-class=\"{ \\'item-input-error\\': saltForm.$submitted && saltForm.confirmSalt.$invalid}\"><span class=\"input-label pull-right\" translate>ACCOUNT.NEW.SALT_CONFIRM</span> <input ng-if=\"!showUsername\" name=\"confirmUsername\" type=\"password\" placeholder=\"{{\\'ACCOUNT.NEW.SALT_CONFIRM_HELP\\' | translate}}\" ng-model=\"formData.confirmUsername\" autocomplete=\"off\" compare-to=\"formData.username\"> <input ng-if=\"showUsername\" name=\"confirmUsername\" type=\"text\" placeholder=\"{{\\'ACCOUNT.NEW.SALT_CONFIRM_HELP\\' | translate}}\" ng-model=\"formData.confirmUsername\" autocomplete=\"off\" compare-to=\"formData.username\"></div><div class=\"form-errors\" ng-show=\"saltForm.$submitted && saltForm.confirmUsername.$error\" ng-messages=\"saltForm.confirmUsername.$error\"><div class=\"form-error\" ng-message=\"compareTo\"><span translate=\"ERROR.SALT_NOT_CONFIRMED\"></span></div></div><div class=\"item item-toggle dark\"><span translate>COMMON.SHOW_VALUES</span> <label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"showUsername\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-calm icon-right ion-chevron-right ink\" type=\"submit\" translate>COMMON.BTN_NEXT <i class=\"icon ion-arrow-right-a\"></i></button></div></div></form></ion-content></ion-slide-page><ion-slide-page ng-if=\"!formData.pubkey\"><ion-content class=\"has-header\" scroll=\"true\"><form name=\"passwordForm\" novalidate=\"\" ng-submit=\"doNext(\\'passwordForm\\')\"><div class=\"item item-text-wrap text-center padding hidden-xs\"><a class=\"pull-right icon-help\" ng-click=\"showHelpModal(\\'join-password\\')\"></a> <span translate>ACCOUNT.NEW.PASSWORD_WARNING</span></div><div class=\"list\" ng-init=\"setForm(passwordForm, \\'passwordForm\\')\"><div class=\"item item-input\" ng-class=\"{ \\'item-input-error\\': passwordForm.$submitted && passwordForm.password.$invalid}\"><span class=\"input-label\" translate>LOGIN.PASSWORD</span> <input ng-if=\"!showPassword\" name=\"password\" type=\"password\" placeholder=\"{{\\'LOGIN.PASSWORD_HELP\\' | translate}}\" ng-model=\"formData.password\" autocomplete=\"off\" ng-change=\"formDataChanged()\" ng-minlength=\"8\" different-to=\"formData.username\" required> <input ng-if=\"showPassword\" name=\"text\" type=\"text\" placeholder=\"{{\\'LOGIN.PASSWORD_HELP\\' | translate}}\" ng-model=\"formData.password\" autocomplete=\"off\" ng-change=\"formDataChanged()\" ng-minlength=\"8\" different-to=\"formData.username\" required></div><div class=\"form-errors\" ng-show=\"passwordForm.$submitted && passwordForm.password.$error\" ng-messages=\"passwordForm.password.$error\"><div class=\"form-error\" ng-message=\"minlength\"><span translate=\"ERROR.FIELD_TOO_SHORT_WITH_LENGTH\" translate-values=\"{minLength: 8}\"></span></div><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div><div class=\"form-error\" ng-message=\"differentTo\"><span translate=\"ERROR.EQUALS_TO_SALT\"></span></div></div><div class=\"item item-input\" ng-class=\"{ \\'item-input-error\\': passwordForm.$submitted && passwordForm.confirmPassword.$invalid}\"><span class=\"input-label\" translate>ACCOUNT.NEW.PASSWORD_CONFIRM</span> <input ng-if=\"!showPassword\" name=\"confirmPassword\" type=\"password\" placeholder=\"{{\\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\\' | translate}}\" ng-model=\"formData.confirmPassword\" autocomplete=\"off\" compare-to=\"formData.password\"> <input ng-if=\"showPassword\" name=\"confirmPassword\" type=\"text\" placeholder=\"{{\\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\\' | translate}}\" ng-model=\"formData.confirmPassword\" autocomplete=\"off\" compare-to=\"formData.password\"></div><div class=\"form-errors\" ng-show=\"passwordForm.$submitted && passwordForm.confirmPassword.$error\" ng-messages=\"passwordForm.confirmPassword.$error\"><div class=\"form-error\" ng-message=\"compareTo\"><span translate=\"ERROR.PASSWORD_NOT_CONFIRMED\"></span></div></div><div class=\"item item-toggle dark\"><span translate>COMMON.SHOW_VALUES</span> <label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"showPassword\"><div class=\"track\"><div class=\"handle\"></div></div></label></div></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-calm icon-right ion-chevron-right ink\" type=\"submit\" ng-click=\"getRevocationDocument()\" translate>COMMON.BTN_NEXT</button></div><div class=\"padding hidden-xs\"></div></form></ion-content></ion-slide-page><ion-slide-page><ion-content class=\"has-header\" scroll=\"true\"><div class=\"center padding\" ng-if=\"formData.computing\"><ion-spinner icon=\"android\"></ion-spinner></div><ng-if ng-if=\"!formData.computing\"><div class=\"animate-fade-in animate-show-hide ng-hide\" ng-show=\"accountAvailable\"><div class=\"padding text-center\" translate>ACCOUNT.NEW.LAST_SLIDE_CONGRATULATION</div><div class=\"list\"><ion-item class=\"item text-center item-text-wrap\"><h3 class=\"gray\" translate>LOGIN.ASSOCIATED_PUBKEY</h3><h3 class=\"dark bold\">{{formData.pubkey}}</h3></ion-item></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-positive ink\" ng-click=\"doNewAccount()\" translate>COMMON.BTN_SEND <i class=\"icon ion-android-send\"></i></button></div></div><div class=\"animate-fade-in animate-show-hide ng-hide\" ng-show=\"!accountAvailable\"><ion-item class=\"item-icon-left item-text-wrap text-center\"><i class=\"icon ion-minus-circled assertive\"></i> <span id=\"modal-license\" trust-as-html=\"\\'ERROR.EXISTING_ACCOUNT\\'|translate\"></span></ion-item><div class=\"list\"><ion-item class=\"item item-text-wrap item-border\"><div class=\"padding text-center\"><span class=\"gray text-no-wrap\">{{formData.pubkey}}</span></div></ion-item><div class=\"padding text-center\"><span translate>ERROR.EXISTING_ACCOUNT_REQUEST</span></div></div><div class=\"padding hidden-xs text-left\"><button class=\"button button-assertive icon-left ion-chevron-left ink\" ng-click=\"identifierRecovery()\" translate>COMMON.BTN_MODIFY</button></div></div></ng-if></ion-content></ion-slide-page></ion-slides></ion-modal-view>');\n$templateCache.put('templates/join/modal_join_wallet.html','<ion-modal-view class=\"modal-full-height\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear visible-xs\" ng-if=\"!slides.slider.activeIndex\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-icon button-clear icon ion-ios-arrow-back buttons header-item\" ng-click=\"slidePrev()\" ng-if=\"slideBehavior.hasPreviousButton\"></button> <button class=\"button button-icon button-clear icon ion-ios-help-outline visible-xs\" ng-if=\"slideBehavior.helpAnchor\" ng-click=\"showHelpModal(slideBehavior.helpAnchor)\"></button><h1 class=\"title\" translate>ACCOUNT.NEW.WALLET_ACCOUNT_TITLE</h1><button class=\"button button-clear icon-right visible-xs\" ng-if=\"slideBehavior.hasNextButton\" ng-click=\"doNext()\"><span translate>COMMON.BTN_NEXT</span> <i class=\"icon ion-ios-arrow-right\"></i></button> <button class=\"button button-clear icon-right visible-xs\" ng-if=\"slideBehavior.hasSendButton\" ng-click=\"doNewAccount()\"><i class=\"icon ion-android-send\"></i></button></ion-header-bar><ion-slides options=\"slides.options\" slider=\"slides.slider\"><ion-slide-page><ion-content class=\"has-header\" scroll=\"false\"><form name=\"saltForm\" novalidate=\"\" ng-submit=\"doNext(\\'saltForm\\')\"><div class=\"list\" ng-init=\"setForm(saltForm, \\'saltForm\\')\"><div class=\"item item-text-wrap text-center padding hidden-xs\"><a class=\"pull-right icon-help\" ng-click=\"showHelpModal(\\'join-salt\\')\"></a> <span translate>ACCOUNT.NEW.SALT_WARNING</span></div><div class=\"item item-input\" ng-class=\"{ \\'item-input-error\\': saltForm.$submitted && saltForm.username.$invalid}\"><span class=\"input-label\" translate>LOGIN.SALT</span> <input ng-if=\"!showUsername\" name=\"username\" type=\"password\" placeholder=\"{{\\'LOGIN.SALT_HELP\\' | translate}}\" ng-change=\"formDataChanged()\" ng-model=\"formData.username\" ng-minlength=\"8\" required> <input ng-if=\"showUsername\" name=\"username\" type=\"text\" placeholder=\"{{\\'LOGIN.SALT_HELP\\' | translate}}\" ng-change=\"formDataChanged()\" ng-model=\"formData.username\" ng-minlength=\"8\" required></div><div class=\"form-errors\" ng-show=\"saltForm.$submitted && saltForm.username.$error\" ng-messages=\"saltForm.username.$error\"><div class=\"form-error\" ng-message=\"minlength\"><span translate=\"ERROR.FIELD_TOO_SHORT_WITH_LENGTH\" translate-values=\"{minLength: 8}\"></span></div><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div></div><div class=\"item item-input\" ng-class=\"{ \\'item-input-error\\': saltForm.$submitted && saltForm.confirmSalt.$invalid}\"><span class=\"input-label pull-right\" translate>ACCOUNT.NEW.SALT_CONFIRM</span> <input ng-if=\"!showUsername\" name=\"confirmUsername\" type=\"password\" placeholder=\"{{\\'ACCOUNT.NEW.SALT_CONFIRM_HELP\\' | translate}}\" ng-model=\"formData.confirmUsername\" compare-to=\"formData.username\"> <input ng-if=\"showUsername\" name=\"confirmUsername\" type=\"text\" placeholder=\"{{\\'ACCOUNT.NEW.SALT_CONFIRM_HELP\\' | translate}}\" ng-model=\"formData.confirmUsername\" compare-to=\"formData.username\"></div><div class=\"form-errors\" ng-show=\"saltForm.$submitted && saltForm.confirmUsername.$error\" ng-messages=\"saltForm.confirmUsername.$error\"><div class=\"form-error\" ng-message=\"compareTo\"><span translate=\"ERROR.SALT_NOT_CONFIRMED\"></span></div></div><div class=\"item item-toggle dark\"><span translate>COMMON.SHOW_VALUES</span> <label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"showUsername\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-calm icon-right ion-chevron-right ink\" type=\"submit\" translate>COMMON.BTN_NEXT <i class=\"icon ion-arrow-right-a\"></i></button></div></div></form></ion-content></ion-slide-page><ion-slide-page><ion-content class=\"has-header\" scroll=\"false\"><form name=\"passwordForm\" novalidate=\"\" ng-submit=\"doNext(\\'passwordForm\\')\"><div class=\"item item-text-wrap text-center padding hidden-xs\"><a class=\"pull-right icon-help\" ng-click=\"showHelpModal(\\'join-password\\')\"></a> <span translate>ACCOUNT.NEW.PASSWORD_WARNING</span></div><div class=\"list\" ng-init=\"setForm(passwordForm, \\'passwordForm\\')\"><div class=\"item item-input\" ng-class=\"{ \\'item-input-error\\': passwordForm.$submitted && passwordForm.password.$invalid}\"><span class=\"input-label\" translate>LOGIN.PASSWORD</span> <input ng-if=\"!showPassword\" name=\"password\" type=\"password\" placeholder=\"{{\\'LOGIN.PASSWORD_HELP\\' | translate}}\" ng-model=\"formData.password\" ng-change=\"formDataChanged()\" ng-minlength=\"8\" required> <input ng-if=\"showPassword\" name=\"text\" type=\"text\" placeholder=\"{{\\'LOGIN.PASSWORD_HELP\\' | translate}}\" ng-model=\"formData.password\" ng-change=\"formDataChanged()\" ng-minlength=\"8\" required></div><div class=\"form-errors\" ng-show=\"passwordForm.$submitted && passwordForm.password.$error\" ng-messages=\"passwordForm.password.$error\"><div class=\"form-error\" ng-message=\"minlength\"><span translate=\"ERROR.FIELD_TOO_SHORT_WITH_LENGTH\" translate-values=\"{minLength: 8}\"></span></div><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div></div><div class=\"item item-input\" ng-class=\"{ \\'item-input-error\\': passwordForm.$submitted && passwordForm.confirmPassword.$invalid}\"><span class=\"input-label\" translate>ACCOUNT.NEW.PASSWORD_CONFIRM</span> <input ng-if=\"!showPassword\" name=\"confirmPassword\" type=\"password\" placeholder=\"{{\\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\\' | translate}}\" ng-model=\"formData.confirmPassword\" compare-to=\"formData.password\"> <input ng-if=\"showPassword\" name=\"confirmPassword\" type=\"text\" placeholder=\"{{\\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\\' | translate}}\" ng-model=\"formData.confirmPassword\" compare-to=\"formData.password\"></div><div class=\"form-errors\" ng-show=\"passwordForm.$submitted && passwordForm.confirmPassword.$error\" ng-messages=\"passwordForm.confirmPassword.$error\"><div class=\"form-error\" ng-message=\"compareTo\"><span translate=\"ERROR.PASSWORD_NOT_CONFIRMED\"></span></div></div><div class=\"item item-toggle dark\"><span translate>COMMON.SHOW_VALUES</span> <label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"showPassword\"><div class=\"track\"><div class=\"handle\"></div></div></label></div></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-calm icon-right ion-chevron-right ink\" type=\"submit\" translate>COMMON.BTN_NEXT</button></div><div class=\"padding hidden-xs\"></div></form></ion-content></ion-slide-page><ion-slide-page><ion-content class=\"has-header\" scroll=\"false\"><div class=\"padding center\" ng-if=\"formData.computing\"><ion-spinner icon=\"android\"></ion-spinner></div><div ng-if=\"accountAvailable && !formData.computing\"><div class=\"padding text-center\" translate>ACCOUNT.NEW.LAST_SLIDE_CONGRATULATION</div><div class=\"list\"><ion-item class=\"item item-text-wrap item-border\"><div class=\"dark pull-right padding-right\" ng-if=\"formData.computing\"><ion-spinner icon=\"android\"></ion-spinner></div><span class=\"input-label\" translate>COMMON.PUBKEY</span> <span class=\"gray text-no-wrap\" ng-if=\"formData.computing\" translate>ACCOUNT.NEW.COMPUTING_PUBKEY </span><span class=\"gray text-no-wrap\" ng-if=\"formData.pubkey\">{{formData.pubkey}}</span></ion-item></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-positive ink\" ng-click=\"doNewAccount()\" translate>COMMON.BTN_CREATE</button></div></div><div ng-if=\"!accountAvailable && !formData.computing\"><ion-item class=\"item-icon-left item-text-wrap text-center\"><i class=\"icon ion-android-close active\"></i> <span id=\"modal-license\" translate>ERROR.EXISTING_ACCOUNT</span></ion-item><div class=\"list\"><ion-item class=\"item item-text-wrap item-border\"><div class=\"dark pull-right padding-right\" ng-if=\"formData.computing\"><ion-spinner icon=\"android\"></ion-spinner></div><span class=\"gray text-no-wrap\" ng-if=\"formData.computing\" translate>ACCOUNT.NEW.COMPUTING_PUBKEY</span><div class=\"padding text-center\"><span class=\"gray text-no-wrap\" ng-if=\"formData.pubkey\">{{formData.pubkey}}</span></div></ion-item><div class=\"padding text-center\"><span translate>ERROR.EXISTING_ACCOUNT_REQUEST</span></div></div><div class=\"padding hidden-xs text-left\"><button class=\"button button-assertive icon-left ion-chevron-left ink\" ng-click=\"identifierRecovery()\" translate>COMMON.BTN_MODIFY</button></div></div></ion-content></ion-slide-page></ion-slides></ion-modal-view>');\n$templateCache.put('templates/login/form_file_import.html','<div class=\"item\"><p class=\"item-text-wrap\" translate>LOGIN.FILE_FORM_HELP</p></div><div class=\"item item-icon-left item-text-wrap\"><i class=\"icon ion-ios-information-outline positive\"></i> <span class=\"positive\" translate>LOGIN.FILE.HELP</span></div><div drop-zone=\"onFileChanged(file)\"><div ng-if=\"!formData.file\" file-select=\"onFileChanged(file)\" accept=\".dunikey,.yml\"><h2 class=\"gray\" translate>COMMON.CHOOSE_FILE</h2></div><div class=\"item item-icon-left item-icon-right stable-bg\" ng-if=\"formData.file\"><i class=\"icon ion-document-text dark\"></i><div class=\"item-content row\"><div class=\"col\"><h2>{{formData.file.name}}</h2><h4 class=\"dark\" ng-if=\"formData.file.lastModified\"><span class=\"gray\" translate>COMMON.FILE.DATE</span> {{formData.file.lastModified/1000|formatDate}}</h4><h5 class=\"dark\"><span class=\"gray\" translate>COMMON.FILE.SIZE</span> {{formData.file.size|formatInteger}} Ko</h5></div><div class=\"col\"><h3><span class=\"gray\" translate>COMMON.PUBKEY</span></h3><h3 ng-if=\"validatingFile\" translate>COMMON.FILE.VALIDATING</h3><h3 ng-if=\"!validatingFile\"><span class=\"dark animate-show-hide ng-hide\" ng-show=\"formData.file.pubkey\">{{formData.file.pubkey}}</span> <span class=\"assertive animate-show-hide ng-hide\" ng-show=\"!formData.file.valid\"><br><i class=\"ion-close-circled assertive\"></i> {{formData.file.pubkey ? \\'ERROR.AUTH_INVALID_PUBKEY\\' : \\'ERROR.AUTH_INVALID_FILE\\' |translate}}</span></h3></div></div><a class=\"ion-close-round gray pull-right\" style=\"font-size: 10px; position: absolute; top: 6px; right: 6px;\" ng-click=\"removeKeyFile()\"></a></div></div><ion-checkbox ng-model=\"formData.keepAuth\" class=\"item ink item-text-wrap\"><div class=\"item-content dark\" translate>LOGIN.MEMORIZE_AUTH_FILE</div></ion-checkbox>');\n$templateCache.put('templates/login/form_login.html','<form name=\"loginForm\" novalidate=\"\" ng-submit=\"doLogin()\" autocomplete=\"off\"><div class=\"list padding no-padding-xs\" ng-init=\"setForm(loginForm)\" ng-switch on=\"formData.method\"><div class=\"item hidden-xs no-padding\" ng-if=\"showMethods\"><div class=\"pull-right\"><a class=\"button button-text button-small-padding icon-right ink\" ng-click=\"showMethodsPopover($event)\"><i class=\"icon ion-wrench\"></i> {{\\'LOGIN.BTN_METHODS\\'| translate}} </a> <a class=\"button button-icon positive button-small-padding icon ion-ios-help-outline\" style=\"right: 8px;\" ng-click=\"showHelpModal(\\'login-method\\')\"></a></div></div><div class=\"item item-text-wrap\" ng-if=\"::isAuth\"><p ng-if=\"::expectedPubkey\" ng-bind-html=\"::expectedUid ? \\'AUTH.EXPECTED_UID_HELP\\' : \\'AUTH.EXPECTED_PUBKEY_HELP\\' |translate: {uid: expectedUid, pubkey: expectedPubkey}\"></p><p ng-if=\"::!expectedPubkey\" ng-bind-html=\"::\\'AUTH.GENERAL_HELP\\'|translate\"></p></div><div ng-switch-when=\"SCRYPT_DEFAULT\"><ng-include src=\"::\\'templates/login/form_scrypt.html\\'\"></ng-include></div><div ng-switch-when=\"SCRYPT_ADVANCED\"><ng-include src=\"::\\'templates/login/form_scrypt_advanced.html\\'\"></ng-include></div><div ng-switch-when=\"PUBKEY\"><ng-include src=\"::\\'templates/login/form_pubkey.html\\'\"></ng-include></div><div ng-switch-when=\"FILE\"><ng-include src=\"::\\'templates/login/form_file_import.html\\'\"></ng-include></div><div ng-switch-when=\"SCAN\"><ng-include src=\"::\\'templates/login/form_scan.html\\'\"></ng-include></div><div ng-switch-default><ng-include src=\"::\\'templates/login/form_scrypt.html\\'\"></ng-include></div></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-positive ink\" ng-class=\"{\\'button-assertive\\': isAuth, \\'button-positive\\': !isAuth}\" type=\"submit\">{{okText || (isAuth ? \\'AUTH.BTN_AUTH\\' : \\'COMMON.BTN_LOGIN\\') | translate}}</button></div><div class=\"text-center no-padding visible-xs\"><button type=\"button\" class=\"button button-small icon-right ink\" ng-click=\"showMethodsPopover($event)\"><i class=\"icon ion-loop\"></i> <span translate>LOGIN.BTN_METHODS_DOTS</span></button><br><br></div><ng-if ng-if=\"!isAuth && showNewAccountLink\"><div class=\"text-center no-padding\">{{\\'LOGIN.NO_ACCOUNT_QUESTION\\'|translate}}<br class=\"visible-xs\"><a ng-click=\"showJoinModal()\" translate>LOGIN.CREATE_ACCOUNT</a></div><br class=\"visible-xs\"><div class=\"text-center no-padding\"><a ng-click=\"showAccountSecurityModal()\" translate>LOGIN.FORGOTTEN_ID</a></div></ng-if></form>');\n$templateCache.put('templates/login/form_pubkey.html','<div class=\"item\"><p class=\"item-text-wrap\" translate>LOGIN.PUBKEY_FORM_HELP</p></div><div class=\"item item-input item-button-right\" ng-class=\"{ \\'item-input-error\\': form.$submitted && form.pubkey.$invalid}\"><span class=\"input-label hidden-xs\" translate>COMMON.PUBKEY</span> <input name=\"pubkey\" type=\"text\" placeholder=\"{{\\'LOGIN.PUBKEY_HELP\\' | translate}}\" autocomplete=\"off\" ng-model=\"formData.pubkey\" ng-model-options=\"{ debounce: 650 }\" required> <a class=\"button button-stable icon ion-android-search ink\" ng-click=\"showWotLookupModal(form.pubkey.$viewValue)\"></a></div><div class=\"form-errors\" ng-show=\"form.$submitted && form.pubkey.$error\" ng-messages=\"form.pubkey.$error\"><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div><div class=\"form-error\" ng-message=\"checksum\"><span translate=\"ERROR.INVALID_PUBKEY_CHECKSUM\"></span></div></div>');\n$templateCache.put('templates/login/form_scan.html','<div class=\"item\"><p class=\"item-text-wrap\" ng-bind-html=\"::isAuth ? \\'AUTH.SCAN_FORM_HELP\\' : \\'LOGIN.SCAN_FORM_HELP\\' |translate\"></p></div><div class=\"item item-icon-right item-text-wrap item-input\" ng-class=\"{ \\'item-input-error\\': pubkeyError}\"><span class=\"input-label\" translate>COMMON.PUBKEY</span><div class=\"item-content text-wrap\"><span class=\"gray animate-show-hide\" ng-show=\"!computing && formData.pubkey\">{{formData.pubkey}}</span><ion-spinner class=\"ion-spinner-small\" icon=\"android\" ng-if=\"computing\"></ion-spinner><input type=\"hidden\" ng-model=\"formData.pubkey\" required></div><a class=\"button button-icon positive button-small-padding icon ion-qr-scanner animate-show-hide\" ng-show=\"!computing && (!expectedPubkey || pubkeyError)\" ng-click=\"doScan()\"></a> <span class=\"button button-icon balanced button-small-padding icon ion-checkmark animate-show-hide\" ng-if=\"expectedPubkey\" ng-show=\"!computing && !pubkeyError\"></span></div><div class=\"form-errors\" ng-if=\"expectedPubkey\"><div class=\"form-error\" ng-show=\"pubkeyError\"><span trust-as-html=\"::\\'ERROR.AUTH_INVALID_PUBKEY\\'|translate:{pubkey: expectedPubkey}\"></span></div></div>');\n$templateCache.put('templates/login/form_scrypt_advanced.html','<div class=\"row responsive-md responsive-sm padding-left\"><div class=\"col col-33 no-padding\"><label class=\"item item-input item-select\"><select ng-model=\"formData.scrypt\" style=\"max-width: 100%\" ng-change=\"changeScrypt(formData.scrypt)\" ng-options=\"l as (l.label | translate) for l in scryptParamsValues track by l.id\"></select></label></div><div class=\"col no-padding\"><label class=\"item item-input\"><span class=\"input-label\" translate>LOGIN.SCRYPT.N</span> <input class=\"no-padding-right\" type=\"number\" placeholder=\"N\" autocomplete=\"off\" ng-model=\"formData.scrypt.params.N\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"onScryptFormChanged()\" required></label></div><div class=\"col no-padding\"><label class=\"item item-input\"><span class=\"input-label\" translate>LOGIN.SCRYPT.r</span> <input class=\"no-padding-right\" type=\"number\" placeholder=\"r\" ng-model=\"formData.scrypt.params.r\" autocomplete=\"off\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"onScryptFormChanged()\" required></label></div><div class=\"col no-padding\"><label class=\"item item-input\"><span class=\"input-label\" translate>LOGIN.SCRYPT.p</span> <input class=\"no-padding-right\" type=\"number\" placeholder=\"p\" autocomplete=\"off\" ng-model=\"formData.scrypt.params.p\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"onScryptFormChanged()\" required></label></div></div><p class=\"energized-100-bg padding dark\"><i class=\"icon ion-android-warning\"></i> <span translate>INFO.FEATURES_NOT_IMPLEMENTED</span></p><ng-include src=\"::\\'templates/login/form_scrypt.html\\'\"></ng-include>');\n$templateCache.put('templates/login/form_scrypt.html','<div class=\"item item-text-wrap\" ng-if=\"!isAuth\"><p ng-bind-html=\"\\'LOGIN.SCRYPT_FORM_HELP\\'|translate\"></p></div><input type=\"password\" name=\"fake-password\" autocomplete=\"off\" style=\"visibility:hidden; position:absolute;\"> <label class=\"item item-input\" ng-class=\"{ \\'item-input-error\\': form.$submitted && form.username.$invalid}\"><span class=\"input-label hidden-xs\" translate>LOGIN.SALT</span> <input name=\"username\" type=\"password\" placeholder=\"{{\\'LOGIN.SALT_HELP\\' | translate}}\" autocomplete=\"off\" ng-model=\"formData.username\" ng-model-options=\"{ debounce: 650 }\" class=\"highlight-light\" required></label><div class=\"form-errors\" ng-show=\"form.$submitted && form.username.$error\" ng-messages=\"form.username.$error\"><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div></div><label class=\"item item-input\" ng-class=\"{ \\'item-input-error\\': form.$submitted && form.password.$invalid}\"><span class=\"input-label hidden-xs\" translate>LOGIN.PASSWORD</span> <input name=\"password\" type=\"password\" placeholder=\"{{\\'LOGIN.PASSWORD_HELP\\' | translate}}\" autocomplete=\"off\" ng-model=\"formData.password\" ng-model-options=\"{ debounce: 650 }\" select-on-click required></label><div class=\"form-errors\" ng-show=\"form.$submitted && form.password.$error\" ng-messages=\"form.password.$error\"><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div></div><div class=\"item item-icon-right item-text-wrap\" ng-class=\"{ \\'item-input-error\\': pubkeyError, \\'item-input\\': showPubkey}\"><span class=\"input-label hidden-xs animate-show-hide ng-hide\" ng-show=\"showPubkey\" translate>COMMON.PUBKEY</span><div class=\"item-content text-wrap\"><a class=\"positive ink animate-show-hide ng-hide\" ng-show=\"showComputePubkeyButton && !pubkey\" ng-click=\"computePubkey()\"><i class=\"ion-eye\"></i> {{\\'COMMON.BTN_SHOW_PUBKEY\\' | translate}} </a><span class=\"gray animate-show-hide\" ng-show=\"!computing && pubkey\">{{pubkey}}</span><ion-spinner class=\"ion-spinner-small\" icon=\"android\" ng-if=\"computing\"></ion-spinner></div><a class=\"button button-icon positive button-small-padding icon ion-ios-help-outline animate-show-hide\" ng-click=\"showHelpModal(\\'login-pubkey\\')\" ng-if=\"!expectedPubkey\" ng-show=\"showPubkey\"></a> <span class=\"button button-icon balanced button-small-padding icon ion-checkmark animate-show-hide\" ng-if=\"expectedPubkey\" ng-show=\"showPubkey && !showComputePubkeyButton && !computing && !pubkeyError\"></span></div><div class=\"form-errors\" ng-if=\"expectedPubkey\"><div class=\"form-error\" ng-show=\"pubkeyError\"><span trust-as-html=\"::\\'ERROR.AUTH_INVALID_PUBKEY\\'|translate:{pubkey: expectedPubkey}\"></span></div></div>');\n$templateCache.put('templates/login/item_remember_me.html','<ion-checkbox ng-model=\"formData.rememberMe\" ng-if=\"!isAuth\" class=\"item ink item-text-wrap\"><div class=\"item-content dark\" translate>SETTINGS.REMEMBER_ME</div></ion-checkbox>');\n$templateCache.put('templates/login/modal_login.html','<ion-modal-view class=\"modal-full-height modal-login\"><ion-header-bar class=\"\" ng-class=\"{\\'bar-positive\\': !isAuth, \\'bar-assertive\\': isAuth}\"><button class=\"button button-clear visible-xs\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button><h1 class=\"title\" ng-bind-html=\"title | translate\"></h1><div class=\"buttons buttons-right\"><div class=\"secondary-buttons\"><button class=\"button button-icon button-clear icon ion-android-done visible-xs\" ng-class=\"{\\'button-positive\\': !isAuth}\" style=\"color: #fff;\" ng-click=\"doLogin()\"></button></div></div></ion-header-bar><ion-content scroll=\"true\"><ng-include src=\"::\\'templates/login/form_login.html\\'\"></ng-include></ion-content></ion-modal-view>');\n$templateCache.put('templates/login/popover_methods.html','<ion-popover-view class=\"fit has-header popover-login-methods\" ng-class=\"{\\'auth\\': isAuth}\"><ion-header-bar><h1 class=\"title\" translate>LOGIN.METHOD_POPOVER_TITLE</h1></ion-header-bar><ion-content scroll=\"false\"><div class=\"list item-text-wrap\"><a class=\"item item-icon-left ink\" ng-click=\"changeMethod(\\'SCRYPT_DEFAULT\\')\"><i class=\"icon ion-shuffle\" style=\"font-size: 22px;\"></i> {{\\'LOGIN.METHOD.SCRYPT_DEFAULT\\' | translate}} </a><a class=\"item item-icon-left ink\" ng-click=\"changeMethod(\\'SCRYPT_ADVANCED\\')\"><i class=\"icon ion-shuffle\" style=\"font-size: 22px;\"></i> <i class=\"icon-secondary ion-plus\" style=\"font-size: 13px; left: 40px; margin-top: -4px;\"></i> {{\\'LOGIN.METHOD.SCRYPT_ADVANCED\\' | translate}} </a><a class=\"item item-icon-left ink hidden-xs\" ng-click=\"changeMethod(\\'FILE\\')\"><i class=\"icon ion-document-text\"></i> {{\\'LOGIN.METHOD.FILE\\' | translate}}</a><div ng-if=\"!isAuth\" class=\"item-divider hidden-xs hidden-sm\"></div><a class=\"item item-icon-left ink\" ng-if=\"$root.device.barcode.enable\" ng-click=\"changeMethod(\\'SCAN\\')\"><i class=\"icon ion-qr-scanner\"></i> {{\\'LOGIN.METHOD.SCAN\\' | translate}} </a><a class=\"item item-icon-left ink\" ng-if=\"!isAuth\" ng-click=\"changeMethod(\\'PUBKEY\\')\"><i class=\"icon ion-key\"></i> {{\\'LOGIN.METHOD.PUBKEY\\' | translate}}</a></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/menu.html','<ion-side-menus enable-menu-with-back-views=\"true\" bind-notifier=\"{locale: $root.settings.locale.id, peer: $root.currency.node.url}\"><ion-side-menu-content><ion-nav-bar class=\"bar-dark\" title-align=\"left\"><ion-nav-back-button class=\"no-text\"></ion-nav-back-button><ion-nav-buttons side=\"left\"><button class=\"button button-clear visible-nomenu\" menu-toggle=\"left\"><i class=\"icon ion-navicon\"></i></button></ion-nav-buttons><ion-nav-buttons side=\"right\"><button class=\"button button-clear button-peer hidden-xs hidden-sm gray\" ng-if=\"$root.config.readonly ||\\xA0$root.settings.expertMode\" style=\"max-width: 450px !important;\" ng-click=\"showPeerInfoPopover($event)\"><span style=\"display: inline-flex;\"><small class=\"ion-locked\" ng-if=\":peer:$root.currency.node.useSsl\"> </small> {{:peer:$root.currency.node.host}}{{:peer:$root.currency.node.port != 80 && $root.currency.node.port != 443 ? \\':\\'+$root.currency.node.port : \\'\\'}} <small> </small> <small class=\"ion-arrow-down-b\"></small></span></button><cs-extension-point name=\"nav-buttons-right\"></cs-extension-point><a id=\"helptip-header-bar-btn-profile\" class=\"button button-icon button-clear hidden-xs hidden-sm\" ng-if=\"::!$root.config.readonly\" ng-click=\"showProfilePopover($event)\"><i class=\"avatar avatar-member\" ng-if=\"!walletData.avatar\" ng-class=\"{\\'disable\\': !login, \\'royal-bg\\': login}\"></i> <i class=\"avatar\" ng-if=\"walletData.avatar\" style=\"background-image: url(\\'{{walletData.avatar.src}}\\')\"></i> <span ng-if=\"login && !auth\" class=\"badge badge-button badge-secondary badge-assertive ion-locked\"></span></a></ion-nav-buttons></ion-nav-bar><ion-nav-view name=\"menuContent\"></ion-nav-view></ion-side-menu-content><ion-side-menu id=\"menu\" side=\"left\" expose-aside-when=\"large\" enable-menu-with-back-views=\"false\" width=\"225\"><ion-header-bar class=\"bar-title\"><h1 class=\"title dark hidden-sm hidden-xs\"><span class=\"animate-fade-in animate-show-hide ng-hide\" ng-show=\"$root.currency.name\">{{:locale:\\'COMMON.APP_NAME\\'|translate}} {{$root.currency.name|abbreviate}} </span><a class=\"badge badge-assertive badge-app-mode left visible-demo\" ng-click=\"showHelpModal(\\'demo\\')\">{{:locale:\\'MODE.DEMO.BADGE\\'|translate}}</a> <a class=\"badge badge-balanced badge-app-mode right visible-readonly\" ng-click=\"showHelpModal(\\'readonly\\')\">{{:locale:\\'MODE.READONLY.BADGE\\'|translate}}</a></h1><div class=\"visible-sm visible-xs hero\"><div class=\"content\"><i class=\"avatar avatar-member hero-icon\" ng-if=\"!walletData.avatar\" ng-class=\"{\\'royal-bg\\': login, \\'stable-bg\\': !login}\" ng-click=\"!login ? showHome() : loginAndGo()\" menu-close></i> <a class=\"avatar hero-icon\" ng-if=\"walletData.avatar\" style=\"background-image: url(\\'{{walletData.avatar.src}}\\')\" ui-sref=\"app.view_wallet\" menu-close></a><h4 ng-if=\"login\"><a class=\"light\" ui-sref=\"app.view_wallet\" menu-close>{{walletData.name||walletData.uid}} <span ng-if=\"!walletData.name && !walletData.uid\"><i class=\"icon ion-key\"></i> {{walletData.pubkey|formatPubkey}}</span></a></h4><h4 ng-if=\"!login\"><a class=\"light\" ui-sref=\"app.login\" menu-close>{{\\'COMMON.BTN_LOGIN\\'|translate}} <i class=\"ion-arrow-right-b\"></i></a></h4><cs-extension-point name=\"menu-profile-user\"></cs-extension-point></div><a ng-if=\"::$root.device.isWeb()\" ng-click=\"toggleFullscreen()\" class=\"button-icon\" style=\"position: absolute; top: 5px; right: 5px; z-index: 999;\"><i class=\"icon ion-arrow-expand dark\" ng-class=\"{\\'ion-arrow-shrink\\': fullscreen}\"></i></a></div></ion-header-bar><ion-content scroll=\"false\" class=\"scroll-content ionic-scroll\" ng-class=\"{\\'overflow-scroll\\': smallscreen, \\'scroll-content-false\\': !smallscreen}\"><ion-list class=\"list\" ng-class=\"{\\'scroll\\': smallscreen}\"><ion-item menu-close class=\"item item-actions item-button-right visible-xs visible-sm hidden-readonly\" ng-if=\"login\" ng-class=\"::{\\'item-button-left\\': $root.device.barcode.enable}\"><button class=\"button button-positive ink-dark\" ng-click=\"showTransferModal()\"><i class=\"icon ion-paper-airplane\"></i></button> <button class=\"button button-stable ink\" ng-if=\"$root.device.barcode.enable\" ng-click=\"scanQrCodeAndGo()\"><i class=\"icon ion-qr-scanner\"></i></button></ion-item><ion-item menu-close class=\"item-icon-left hidden-xs\" ui-sref=\"app.home\" active-link=\"active\"><i class=\"icon ion-home\"></i> {{:locale:\\'MENU.HOME\\'|translate}}</ion-item><ion-item menu-close class=\"item-icon-left visible-xs\" ui-sref=\"app.home\" active-link=\"active\"><i class=\"icon ion-home\"></i> {{:locale:\\'MENU.HOME\\'|translate}}</ion-item><div class=\"item item-divider hidden-readonly\"></div><a menu-close class=\"item item-icon-left hidden-readonly\" active-link=\"active\" active-link-path-prefix=\"#/app/account\" ui-sref=\"app.view_wallet\" ng-class=\"{\\'item-menu-disable\\': !login}\"><i class=\"icon ion-person\"></i> {{:locale:\\'MENU.ACCOUNT\\'|translate}} </a><a id=\"helptip-menu-btn-account\"></a> <a menu-close class=\"item item-icon-left hidden-readonly\" active-link=\"active\" active-link-path-prefix=\"#/app/history\" ui-sref=\"app.view_wallet_tx\" ng-class=\"{\\'item-menu-disable\\': !login}\"><i class=\"icon ion-clock\" style=\"top: calc(100%/4); left: 25px; font-size: 10pt; display: block;\"></i> <b class=\"icon-secondary ion-card\" style=\"top: calc(100%/2.5); left: 19px; font-size: 17pt; background-color: whitesmoke; width:17px; height: 14px;\"></b> {{:locale:\\'MENU.TRANSACTIONS\\'|translate}} </a><a id=\"helptip-menu-btn-tx\"></a> <a menu-close class=\"item item-icon-left hidden-readonly\" active-link=\"active\" active-link-path-prefix=\"#/app/wallets\" ui-sref=\"app.view_wallets\" ng-class=\"{\\'item-menu-disable\\': !login}\"><i class=\"icon ion-card\" style=\"top: calc(100%/5); left: 22px; font-size: 16pt; display: block;\"></i> <i class=\"icon-secondary ion-card\" style=\"top: 20px; left: 19px; font-size: 16pt; background-color: whitesmoke; width:17px; height: 14px;\"></i> {{:locale:\\'MENU.WALLETS\\'|translate}} </a><a id=\"helptip-menu-btn-wallets\"></a><div class=\"item item-divider visible-xs visible-sm hidden-readonly\"></div><cs-extension-point name=\"menu-user\"></cs-extension-point><ion-item class=\"item hidden-xs hidden-sm hidden-readonly\"><button class=\"button button-block button-small button-small-padding icon-left icon ion-paper-airplane no-margin\" ng-class=\"{\\'button-positive\\': login, \\'button-stable\\': !login}\" ng-click=\"showTransferModal()\">{{:locale:\\'COMMON.BTN_SEND_MONEY\\'|translate}}</button></ion-item><div class=\"item-spacer hidden-readonly\"></div><div class=\"item item-divider hidden-readonly\"></div><a class=\"item item-icon-left item-closeable hidden-xs hidden-sm\" ng-show=\"$root.settings.helptip.enable\" title=\"{{:locale:\\'SETTINGS.DISABLE_HELPTIP\\'|translate}}\" ng-click=\"startHelpTour($event)\"><i class=\"icon ion-easel\"></i> {{:locale:\\'COMMON.BTN_HELP_TOUR\\'|translate}} <span class=\"close\" ng-click=\"disableHelpTour($event)\"></span> </a><a menu-close class=\"item item-icon-left\" id=\"helptip-menu-btn-wot\" active-link=\"active\" active-link-path-prefix=\"#/app/wot\" ui-sref=\"app.wot_lookup.tab_search\"><i class=\"icon ion-person-stalker\"></i> {{:locale:\\'MENU.WOT\\'|translate}}</a><cs-extension-point name=\"menu-main\"></cs-extension-point><a menu-close class=\"item item-icon-left\" id=\"helptip-menu-btn-currency\" active-link=\"active\" active-link-path-prefix=\"#/app/currency\" ui-sref=\"app.currency\"><i class=\"icon ion-ios-world-outline\"></i> {{:locale:\\'MENU.CURRENCY\\'|translate}} </a><a menu-close class=\"item item-icon-left hidden-xs hidden-sm\" id=\"helptip-menu-btn-network\" active-link=\"active\" active-link-path-prefix=\"#/app/network\" ui-sref=\"app.network\"><i class=\"icon ion-cloud\"></i> {{:locale:\\'MENU.NETWORK\\'|translate}}</a><cs-extension-point name=\"menu-discover\"></cs-extension-point><div class=\"item-spacer visible-readonly\"></div><div class=\"item item-divider visible-xs visible-sm\"></div><a menu-close class=\"item item-icon-left visible-xs visible-sm\" active-link=\"active\" active-link-path-prefix=\"#/app/help\" ui-sref=\"app.help\"><i class=\"icon ion-ios-help-outline\"></i> {{:locale:\\'HOME.BTN_HELP\\'|translate}} </a><a menu-close class=\"item item-icon-left visible-xs visible-sm visible-readonly\" active-link=\"active\" id=\"menu-btn-settings\" active-link-path-prefix=\"#/app/settings\" ui-sref=\"app.settings\"><i class=\"icon ion-android-settings\"></i> {{:locale:\\'MENU.SETTINGS\\'|translate}} </a><a id=\"helptip-menu-btn-settings\"></a><div class=\"item item-divider visible-xs visible-sm margin-top\" ng-if=\"login\"></div><a menu-close ng-if=\"login\" class=\"item item-icon-left visible-xs visible-sm\" ng-click=\"logout({askConfirm: true})\"><i class=\"icon ion-log-out assertive\"></i> <span class=\"assertive\" translate>{{:locale:\\'COMMON.BTN_LOGOUT\\'|translate}}</span></a></ion-list></ion-content><ion-footer-bar class=\"bar-stable footer hidden-xs hidden-sm\"><a class=\"pull-left icon-help\" menu-toggle=\"left\" title=\"{{:locale:\\'HOME.BTN_HELP\\'|translate}}\" ui-sref=\"app.help\"></a> <a class=\"title gray\" ng-click=\"showAboutModal()\"><span title=\"{{:locale:\\'HOME.BTN_ABOUT\\'|translate}}\" ng-class=\"{\\'assertive\\': $root.newRelease}\"><i ng-if=\"$root.newRelease\" class=\"ion-alert-circled assertive\"></i> {{:locale:\\'COMMON.APP_VERSION\\'|translate:{version: config.version} }} </span>| <span title=\"{{:locale:\\'HOME.BTN_ABOUT\\'|translate}}\">{{:locale:\\'HOME.BTN_ABOUT\\'|translate}}</span></a></ion-footer-bar></ion-side-menu></ion-side-menus>');\n$templateCache.put('templates/modal_about.html','<ion-modal-view class=\"about\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear visible-xs\" ng-click=\"closeModal()\" translate>COMMON.BTN_CLOSE</button><h1 class=\"title\" translate>ABOUT.TITLE</h1></ion-header-bar><ion-content class=\"text-center\" scroll=\"true\"><div class=\"list item-wrap-text\"><ion-item class=\"item-icon-left item-text-wrap\"><span>{{\\'COMMON.APP_NAME\\'|translate}} <b>{{\\'COMMON.APP_VERSION\\'|translate:$root.config}}</b> - <a ng-click=\"openLink($event, \\'http://cesium.app\\')\">www.cesium.app</a></span> <i ng-if=\"$root.newRelease\" class=\"assertive ion-alert-circled\"></i><h3 ng-if=\"buildDate\" class=\"gray\">{{\\'COMMON.APP_BUILD\\'|translate:{build: buildDate} }}</h3><span translate>ABOUT.LICENSE</span></ion-item><ion-item class=\"item-icon-left\" ng-if=\"$root.newRelease\"><i class=\"item-image icon ion-alert-circled assertive\"></i> <span ng-if=\"!$root.device.isWeb()\" ng-bind-html=\"\\'ABOUT.PLEASE_UPDATE\\' | translate:$root.newRelease \"></span> <span ng-if=\"$root.device.isWeb()\" ng-bind-html=\"\\'ABOUT.LATEST_RELEASE\\' | translate:$root.newRelease \"></span><h3 ng-if=\"!$root.device.enable\"><a ng-click=\"openLink($event, $root.newRelease.url)\" translate>{{::$root.newRelease.url}}</a></h3></ion-item><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"item-image icon ion-android-laptop\"></i> <span translate>ABOUT.OFFICIAL_WEB_SITE</span><h3><a ng-click=\"openLink($event, \\'https://www.cesium.app\\')\">https://www.cesium.app</a></h3></ion-item><ion-item class=\"item-icon-left\"><i class=\"item-image icon ion-chatbubbles\"></i> {{\\'ABOUT.FORUM\\' | translate}}<h3><a ng-click=\"openLink($event, $root.settings.userForumUrl)\">{{::$root.settings.userForumUrl}}</a></h3></ion-item><ion-item class=\"item-icon-left item-text-wrap\"><i class=\"item-image icon ion-bug\"></i> <span translate>ABOUT.PLEASE_REPORT_ISSUE</span><h3><a ng-click=\"openLink($event, $root.settings.newIssueUrl)\" translate>ABOUT.REPORT_ISSUE</a></h3></ion-item><ion-item class=\"item-icon-left\"><i class=\"item-image icon ion-network\"></i> {{\\'ABOUT.CODE\\' | translate}}<h3><a ng-click=\"openLink($event, $root.settings.sourceUrl)\">{{$root.settings.sourceUrl}}</a></h3></ion-item><ion-item class=\"item-icon-left\"><i class=\"item-image icon ion-person-stalker\"></i> {{\\'ABOUT.DEVELOPERS\\' | translate}}<h3><a href=\"https://github.com/blavenie\" target=\"_system\">Benoit Lavenier</a>, <a href=\"https://github.com/bpresles\" target=\"_system\">bpresles</a>, <a href=\"https://github.com/c-geek\" target=\"_system\">cgeek</a>, <a href=\"https://github.com/devingfx\" target=\"_system\">DiG</a>, <a href=\"https://git.duniter.org/ji_emme\" target=\"_system\">Ji_emme</a></h3></ion-item><div class=\"padding hidden-xs text-center\"><button class=\"button button-stable icon-left ink\" type=\"submit\" ng-click=\"closeModal()\" ui-sref=\"app.help\"><i class=\"icon ion-ios-help-outline\"></i> {{\\'HOME.BTN_HELP\\' | translate}}</button> <button class=\"button button-positive ink\" type=\"submit\" ng-click=\"closeModal()\">{{\\'COMMON.BTN_CLOSE\\' | translate}}</button></div></div></ion-content></ion-modal-view>');\n$templateCache.put('templates/network/item_content_peer.html','<i class=\"icon ion-android-desktop\" ng-class=\":rebind:{\\'balanced\\': peer.online && peer.hasMainConsensusBlock, \\'energized\\': peer.online && peer.hasConsensusBlock, \\'gray\\': peer.online && !peer.hasConsensusBlock && !peer.hasMainConsensusBlock, \\'stable\\': !peer.online}\" ng-if=\":rebind:!peer.avatar\"></i> <b class=\"icon-secondary ion-person\" ng-if=\":rebind:!peer.avatar\" ng-class=\":rebind:{\\'balanced\\': peer.online && peer.hasMainConsensusBlock, \\'energized\\': peer.online && peer.hasConsensusBlock, \\'gray\\': peer.online && !peer.hasConsensusBlock && !peer.hasMainConsensusBlock, \\'stable\\': !peer.online}\" style=\"left: 26px; top: -3px;\"></b> <i class=\"avatar\" ng-if=\"::peer.avatar\" style=\"background-image: url(\\'{{::peer.avatar.src}}\\')\"></i> <b class=\"icon-secondary assertive ion-close-circled\" ng-if=\":rebind:!peer.online\" style=\"left: 37px; top: -10px;\"></b><div class=\"row no-padding\"><div class=\"col no-padding\"><h3 class=\"dark\" ng-if=\":rebind:!peer.bma.private\">{{:rebind:peer.dns || peer.server}}</h3><h4 class=\"gray\" ng-if=\":rebind:peer.bma.private\"><i class=\"ion-flash\"></i> {{:locale:\\'NETWORK.VIEW.PRIVATE_ACCESS\\'|translate}}</h4><h4><span class=\"gray\" ng-if=\":rebind:!peer.uid\"><i class=\"ion-key\"></i> {{:rebind:peer.pubkey|formatPubkey}} </span><span class=\"positive\" ng-if=\":rebind:peer.uid\"><i class=\"ion-person\"></i> {{:rebind:peer.name || peer.uid}} </span><span class=\"gray\" ng-if=\":rebind:!compactMode\">{{:rebind:peer.dns && (\\' | \\' + peer.server) + (peer.bma.path||\\'\\') }}</span></h4></div><div class=\"col col-15 no-padding text-center hidden-xs hidden-sm\" ng-if=\"::expertMode\"><div style=\"min-width: 50px; padding-top: 5px;\" ng-if=\":rebind:!compactMode\"><span ng-if=\":rebind:peer.isSsl()\" title=\"SSL\"><i class=\"ion-locked\"></i><small class=\"hidden-md\"> SSL</small> </span><span ng-if=\":rebind:peer.isBma()\" title=\"BMA\"><i class=\"ion-cloud\"></i><small class=\"hidden-md\"> BMA</small> </span><span ng-if=\":rebind:peer.isWs2p()\" ng-click=\"showWs2pPopover($event, peer)\" title=\"WS2P\"><i class=\"ion-arrow-swap\"></i><small class=\"hidden-md\"> WS2P</small></span></div><div ng-if=\":rebind:!peer.isWs2p()&&peer.hasEndpoint(\\'ES_USER_API\\')\" ng-click=\"showEndpointsPopover($event, peer, \\'ES_USER_API\\')\" title=\"Cesium+\"><i class=\"ion-es-user-api\"></i> <b class=\"ion-plus dark\" style=\"position: relative; left: -14px; top:-17px; font-size : 16px;\"></b></div><div ng-if=\":rebind:!peer.isWs2p()&&peer.isTor()\" ng-click=\"showEndpointsPopover($event, peer, \\'BMATOR\\')\"><i class=\"ion-bma-tor-api\"></i></div><div ng-if=\":rebind:peer.isWs2p()&&peer.isTor()\" ng-click=\"showWs2pPopover($event, peer)\"><i class=\"ion-bma-tor-api\"></i></div></div><div class=\"col col-20 no-padding text-center\" ng-if=\"::expertMode && search.type != \\'offline\\'\"><h3 class=\"hidden-sm hidden-xs gray\"><span ng-if=\":rebind:peer.uid\"><i class=\"ion-lock-combination\"></i>{{:rebind:peer.difficulty||\\'?\\'}}</span> <span ng-if=\":rebind:!peer.uid\" translate>PEER.MIRROR</span></h3><h4 class=\"hidden-sm hidden-xs gray\">{{:rebind: peer.software !== \\'duniter\\' ? peer.software : \\'\\'}} {{:rebind: peer.version ? (\\'v\\'+peer.version) : \\'\\'}}</h4></div><div class=\"col col-20 no-padding text-center\"><span id=\"{{$index === 0 ? helptipPrefix + \\'-peer-0-block\\' : \\'\\'}}\" class=\"badge\" ng-class=\":rebind:{\\'badge-balanced\\': peer.hasMainConsensusBlock, \\'badge-energized\\': peer.hasConsensusBlock, \\'ng-hide\\': !peer.currentNumber && !peer.blockNumber }\">{{:locale:!expertMode ? (\\'COMMON.BLOCK\\'|translate) : \\'\\' }} {{:rebind:(peer.currentNumber || peer.blockNumber) | formatInteger}}</span> <span class=\"badge badge-secondary\" ng-if=\":rebind:peer.consensusBlockDelta && expertMode\"><i class=\"ion-clock\"></i> {{:rebind:peer.consensusBlockDelta|formatDurationTime}}</span></div></div>');\n$templateCache.put('templates/network/items_peers.html','<div class=\"no-padding {{::motion.ionListClass}}\"><div class=\"item item-text-wrap no-border done in gray no-padding-top no-padding-bottom inline text-italic\" ng-if=\"::isHttps && expertMode\"><small><i class=\"icon ion-alert-circled\"></i> {{:locale:\\'NETWORK.INFO.ONLY_SSL_PEERS\\'|translate}}</small></div><div class=\"item row row-header hidden-xs hidden-sm done in\" ng-if=\"::expertMode\"><a class=\"col col-header no-padding dark\" ng-click=\"toggleSort(\\'uid\\')\"><cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'uid\\'\"></cs-sort-icon>{{:locale:\\'COMMON.UID\\' | translate}} / {{:locale:\\'COMMON.PUBKEY\\' | translate}} </a><a class=\"no-padding dark hidden-md col col-15 col-header\" ng-click=\"toggleSort(\\'api\\')\" ng-if=\":rebind:!compactMode\"><cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'api\\'\"></cs-sort-icon>{{:locale:\\'PEER.API\\' | translate}}</a><div class=\"no-padding dark hidden-md col col-15 col-header\" ng-if=\":rebind:compactMode\"></div><a class=\"no-padding dark col col-20 col-header\" ng-click=\"toggleSort(\\'difficulty\\')\"><cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'difficulty\\'\"></cs-sort-icon>{{:locale:\\'PEER.DIFFICULTY\\' | translate}} </a><a class=\"col col-20 col-header no-padding dark\" ng-click=\"toggleSort(\\'current_block\\')\"><cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'current_block\\'\"></cs-sort-icon>{{:locale:\\'PEER.CURRENT_BLOCK\\' | translate}}</a></div><div ng-repeat=\"peer in search.results track by peer.id\" class=\"item item-peer item-icon-left ink {{::ionItemClass}}\" ng-class=\":rebind:{\\'compacted\\': peer.compacted && compactMode}\" ng-attr-id=\"{{::($index === 0 ? (helptipPrefix + \\'-peer-0\\') : undefined)}}\" ng-click=\"selectPeer(peer)\" ng-include=\"::\\'templates/network/item_content_peer.html\\'\"></div></div>');\n$templateCache.put('templates/network/lookup_popover_actions.html','<ion-popover-view class=\"fit has-header\"><ion-header-bar><h1 class=\"title\" translate>PEER.POPOVER_FILTER_TITLE</h1></ion-header-bar><ion-content scroll=\"false\"><div class=\"list item-text-wrap\"><a class=\"item item-icon-left item-icon-right ink\" ng-click=\"toggleSearchType(\\'member\\')\"><i class=\"icon ion-person\"></i> {{\\'PEER.MEMBERS\\' | translate}} <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"search.type==\\'member\\'\"></i> </a><a class=\"item item-icon-left item-icon-right ink\" ng-click=\"toggleSearchType(\\'mirror\\')\"><i class=\"icon ion-radio-waves\"></i> {{\\'PEER.MIRRORS\\' | translate}} <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"search.type==\\'mirror\\'\"></i> </a><a class=\"item item-icon-left item-icon-right ink\" ng-click=\"toggleSearchType(\\'offline\\')\"><i class=\"icon ion-eye-disabled\"></i> {{\\'PEER.OFFLINE\\' | translate}} <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"search.type==\\'offline\\'\"></i></a></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/network/modal_network.html','<ion-modal-view id=\"nodes\" class=\"modal-full-height\" cache-view=\"false\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button><h1 class=\"title\" translate>PEER.PEER_LIST</h1><div class=\"buttons buttons-right header-item\"><span class=\"secondary\"><button class=\"button button-clear icon ion-loop button-clear\" ng-click=\"refresh()\"></button> <button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\"></button></span></div></ion-header-bar><ion-content><div class=\"list\"><div class=\"padding padding-xs\" style=\"display: block; height: 60px;\"><div class=\"pull-left\"><h4><span ng-if=\"enableFilter && search.type==\\'member\\'\" translate>PEER.MEMBER_PEERS</span> <span ng-if=\"enableFilter && search.type==\\'mirror\\'\" translate>PEER.MIRROR_PEERS</span> <span ng-if=\"!enableFilter || !search.type\" translate>PEER.ALL_PEERS</span> <span ng-if=\"!search.loading\">({{search.results.length}})</span></h4></div><div class=\"pull-right\"><ion-spinner class=\"icon\" icon=\"android\" ng-if=\"search.loading\"></ion-spinner> <div class=\"pull-right\"><a class=\"button button-text button-small hidden-xs hidden-sm ink\" ng-if=\"enableFilter\" ng-class=\"{\\'button-text-positive\\': search.type==\\'member\\'}\" ng-click=\"toggleSearchType(\\'member\\')\"><i class=\"icon ion-person\"></i> {{\\'PEER.MEMBERS\\'|translate}} </a> <a class=\"button button-text button-small hidden-xs hidden-sm ink\" ng-if=\"enableFilter\" ng-class=\"{\\'button-text-positive\\': search.type==\\'mirror\\'}\" ng-click=\"toggleSearchType(\\'mirror\\')\"><i class=\"icon ion-ios-infinite\"></i> {{\\'PEER.MIRRORS\\'|translate}}</a></div></div></div><ng-include src=\"::\\'templates/network/items_peers.html\\'\"></ng-include></div></ion-content></ion-modal-view>');\n$templateCache.put('templates/network/popover_endpoints.html','<ion-popover-view class=\"popover-endpoints popover-light\" style=\"height: {{(titleKey?30:0)+((!items || items.length <= 1) ? 55 : 3+items.length*52)}}px\"><ion-header-bar class=\"bar bar-header stable-bg\" ng-if=\"titleKey\"><div class=\"title\">{{titleKey | translate:titleValues }}</div></ion-header-bar><ion-content scroll=\"false\"><div class=\"list\" ng-class=\"{\\'has-header\\': titleKey}\"><div class=\"item item-text-wrap\" ng-repeat=\"item in items\"><div class=\"item-label\" ng-if=\"item.label\">{{item.label | translate}}</div><div id=\"endpoint_{{$index}}\" class=\"badge item-note dark\">{{item.value}}</div></div></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/network/popover_network.html','<ion-popover-view class=\"fit hidden-xs hidden-sm popover-notification popover-network\" ng-controller=\"NetworkLookupPopoverCtrl\"><ion-header-bar class=\"stable-bg block\"><div class=\"title\">{{\\'MENU.NETWORK\\'|translate}}<ion-spinner class=\"ion-spinner-small\" icon=\"android\" ng-if=\"search.loading\"></ion-spinner></div><div class=\"pull-right\"><a ng-class=\"{\\'positive\\': search.type==\\'member\\', \\'dark\\': search.type!==\\'member\\'}\" ng-click=\"toggleSearchType(\\'member\\')\" translate>PEER.MEMBERS</a></div></ion-header-bar><ion-content scroll=\"true\"><div class=\"list no-padding\"><ng-include src=\"::\\'templates/network/items_peers.html\\'\"></ng-include></div></ion-content><ion-footer-bar class=\"stable-bg block\"><div class=\"pull-left\"><a class=\"positive\" ui-sref=\"app.settings\" ng-click=\"closePopover()\" translate>COMMON.NOTIFICATIONS.SETTINGS</a></div><div class=\"pull-right\"><a class=\"positive\" ui-sref=\"app.network\" ng-click=\"closePopover()\" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a></div></ion-footer-bar></ion-popover-view>');\n$templateCache.put('templates/network/popover_peer_info.html','<ion-popover-view class=\"fit hidden-xs hidden-sm popover-notification popover-peer-info\" ng-controller=\"PeerInfoPopoverCtrl\"><ion-header-bar class=\"stable-bg block\"><div class=\"title\">{{\\'PEER.VIEW.TITLE\\'|translate}}</div></ion-header-bar><ion-content scroll=\"true\"><div class=\"center padding\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></div><div class=\"list no-padding\" ng-if=\"!loading\"><div class=\"item\" ng-if=\":rebind:formData.software\"><i class=\"ion-outlet\"></i> {{\\'NETWORK.VIEW.SOFTWARE\\'|translate}}<div class=\"badge\" ng-class=\":rebind:{\\'badge-energized\\': formData.isPreRelease, \\'badge-assertive\\': formData.hasNewRelease }\">{{formData.software}} v{{:rebind:formData.version}}</div><div class=\"gray badge badge-secondary\" ng-if=\"formData.isPreRelease\"><i class=\"ion-alert-circled\"></i> <span ng-bind-html=\"\\'NETWORK.VIEW.WARN_PRE_RELEASE\\'|translate: formData.latestRelease\"></span></div><div class=\"gray badge badge-secondary\" ng-if=\"formData.hasNewRelease\"><i class=\"ion-alert-circled\"></i> <span ng-bind-html=\"\\'NETWORK.VIEW.WARN_NEW_RELEASE\\'|translate: formData.latestRelease\"></span></div></div><div class=\"item\"><i class=\"ion-locked\"></i> {{\\'NETWORK.VIEW.ENDPOINTS.BMAS\\'|translate}}<div class=\"badge badge-balanced\" ng-if=\":rebind:formData.useSsl\" translate>COMMON.BTN_YES</div><div class=\"badge badge-assertive\" ng-if=\":rebind:!formData.useSsl\" translate>COMMON.BTN_NO</div></div><div class=\"item\"><i class=\"ion-cube\"></i> {{\\'BLOCKCHAIN.VIEW.TITLE_CURRENT\\'|translate}}<div class=\"badge badge-balanced\">{{:rebind:formData.number | formatInteger}}</div></div><div class=\"item\"><i class=\"ion-clock\"></i> {{\\'CURRENCY.VIEW.MEDIAN_TIME\\'|translate}}<div class=\"badge dark\">{{:rebind:formData.medianTime | medianDate}}</div></div><div class=\"item\"><i class=\"ion-lock-combination\"></i> {{\\'CURRENCY.VIEW.POW_MIN\\'|translate}}<div class=\"badge dark\">{{:rebind:formData.powMin | formatInteger}}</div></div><cs-extension-point name=\"default\"></cs-extension-point></div></ion-content><ion-footer-bar class=\"stable-bg block\"><div class=\"pull-left\"><a class=\"positive\" ui-sref=\"app.settings\" ng-click=\"closePopover()\" translate>MENU.SETTINGS</a></div><div class=\"pull-right\"><a class=\"positive\" ui-sref=\"app.view_peer\" ng-click=\"closePopover()\" translate>PEER.BTN_SHOW_PEER</a></div></ion-footer-bar></ion-popover-view>');\n$templateCache.put('templates/network/view_network.html','<ion-view><ion-nav-title><span translate>MENU.NETWORK</span></ion-nav-title><ion-nav-buttons side=\"secondary\"><button class=\"button button-icon button-clear icon ion-loop visible-xs visible-sm\" ng-click=\"refresh()\"></button></ion-nav-buttons><ion-content scroll=\"true\" ng-init=\"enableFilter=true; ionItemClass=\\'item-border-large\\';\"><div class=\"row responsive-sm responsive-md responsive-lg\"><div class=\"col list col-border-right\"><div class=\"padding padding-xs\" style=\"display: block; height: 60px;\"><div class=\"pull-left\"><h4><span ng-if=\"enableFilter && search.type==\\'member\\'\" translate>PEER.MEMBER_PEERS</span> <span ng-if=\"enableFilter && search.type==\\'mirror\\'\" translate>PEER.MIRROR_PEERS</span> <span ng-if=\"enableFilter && search.type==\\'offline\\'\" translate>PEER.OFFLINE_PEERS</span> <span ng-if=\"!enableFilter || !search.type\" translate>PEER.ALL_PEERS</span> <span ng-if=\"search.results.length\">({{search.results.length}})</span><ion-spinner ng-if=\"search.loading\" class=\"icon ion-spinner-small\" icon=\"android\"></ion-spinner></h4></div><div class=\"pull-right\"><div class=\"pull-right\" ng-if=\"enableFilter\"><a class=\"button button-text button-small hidden-xs hidden-sm ink\" ng-class=\"{\\'button-text-positive\\': compactMode}\" ng-click=\"toggleCompactMode()\"><i class=\"icon ion-navicon\"></i> <b class=\"ion-arrow-down-b\" style=\"position: absolute; top: -2px; left: 4px; font-size: 8px;\"></b> <b class=\"ion-arrow-up-b\" style=\"position: absolute; top: 10px; left: 4px; font-size: 8px;\"></b> <span>{{:locale:\\'BLOCKCHAIN.LOOKUP.BTN_COMPACT\\'|translate}}</span> </a><a class=\"button button-text button-small hidden-xs hidden-sm ink\" ng-class=\"{\\'button-text-positive\\': search.type==\\'member\\'}\" title=\"{{:locale:\\'PEER.MEMBER_PEERS\\'|translate}}\" ng-click=\"toggleSearchType(\\'member\\')\"><i class=\"icon ion-person-stalker\"></i> {{\\'PEER.MEMBERS\\'|translate}} </a> <a class=\"button button-text button-small hidden-xs hidden-sm ink\" ng-class=\"{\\'button-text-positive\\': search.type==\\'mirror\\'}\" title=\"{{\\'PEER.MIRROR_PEERS\\'|translate}}\" ng-click=\"toggleSearchType(\\'mirror\\')\"><i class=\"icon ion-radio-waves\"></i> {{:locale:\\'PEER.MIRRORS\\'|translate}} </a><a class=\"button button-text button-small hidden-xs hidden-sm ink\" ng-class=\"{\\'button-text-positive\\': search.type==\\'offline\\', \\'button-text-stable\\': search.type!=\\'offline\\'}\" title=\"{{\\'PEER.OFFLINE_PEERS\\'|translate}}\" ng-click=\"toggleSearchType(\\'offline\\')\"><i class=\"icon ion-close-circled light-gray\"></i> <span>{{:locale:\\'PEER.OFFLINE\\'|translate}}</span></a><cs-extension-point name=\"network-buttons\"></cs-extension-point></div></div></div><div id=\"helptip-network-blockchain\" style=\"display: block\"></div><div id=\"helptip-network-peers\" style=\"display: block\"></div><ng-include src=\"::\\'templates/network/items_peers.html\\'\"></ng-include></div><div class=\"col col-33\" ng-controller=\"BlockLookupCtrl\"><div class=\"padding padding-xs\" style=\"display: block; height: 100px;\"><h4 translate>BLOCKCHAIN.LOOKUP.LAST_BLOCKS</h4><div class=\"pull-right hidden-xs hidden-sm\"><a class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-positive\\': compactMode, \\'button-text-stable\\': !compactMode}\" ng-click=\"toggleCompactMode()\"><i class=\"icon ion-navicon\"></i> <b class=\"icon-secondary ion-arrow-down-b\" style=\"top: -8px; left: 5px; font-size: 8px;\"></b> <b class=\"icon-secondary ion-arrow-up-b\" style=\"top: 4px; left: 5px; font-size: 8px;\"></b> <span>{{:locale:\\'BLOCKCHAIN.LOOKUP.BTN_COMPACT\\'|translate}}</span></a><cs-extension-point name=\"blockchain-buttons\"></cs-extension-point></div></div><ng-include src=\"::\\'templates/blockchain/list_blocks.html\\'\"></ng-include></div></div></ion-content></ion-view>');\n$templateCache.put('templates/network/view_peer.html','<ion-view><ion-nav-title><span translate>PEER.VIEW.TITLE</span></ion-nav-title><ion-content><div class=\"row no-padding\"><div class=\"col col-20 hidden-xs hidden-sm\"> </div><div class=\"col list\"><ion-item><h1><span translate>PEER.VIEW.TITLE</span> <span class=\"gray\">{{node.host}}</span></h1><h2 class=\"gray\"><i class=\"gray icon ion-android-globe\"></i> {{node.bma.dns || node.server}} <span class=\"gray\" ng-if=\"!loading && node.useSsl\"><i class=\"gray ion-locked\"></i> <small>SSL</small> </span><span class=\"gray\" ng-if=\"!loading && node.useTor\"><i class=\"gray ion-bma-tor-api\"></i> </span><span class=\"assertive\" ng-if=\"!loading && !node.uid\">({{\\'PEER.MIRROR\\'|translate}})</span></h2><h3><span class=\"dark\"><i class=\"icon ion-android-desktop\"></i> {{\\'PEER.VIEW.OWNER\\'|translate}} </span><a class=\"positive\" ng-if=\"node.uid\" ui-sref=\"app.wot_identity({pubkey: node.pubkey, uid: node.uid})\"><i class=\"ion-person\"></i> {{node.name || node.uid}} <span class=\"gray\" ng-if=\"node.name\">({{node.uid}}) </span></a><span ng-if=\"!loading && !node.uid\"><a class=\"gray\" ui-sref=\"app.wot_identity({pubkey: node.pubkey})\"><i class=\"ion-key\"></i> {{node.pubkey|formatPubkey}} <span class=\"gray\" ng-if=\"node.name\">({{node.name}})</span></a></span></h3><h3><a ng-click=\"openRawPeering($event)\"><i class=\"icon ion-share\"></i> {{\\'PEER.VIEW.SHOW_RAW_PEERING\\'|translate}} </a><span class=\"gray\" ng-if=\"!isReachable\">| </span><a ng-if=\"!isReachable\" ng-click=\"openRawCurrentBlock($event)\"><i class=\"icon ion-share\"></i> <span translate>PEER.VIEW.SHOW_RAW_CURRENT_BLOCK</span></a></h3></ion-item><div class=\"item item-divider\" translate>PEER.VIEW.GENERAL_DIVIDER</div><ion-item class=\"item-icon-left item-text-wrap ink\" copy-on-click=\"{{node.pubkey}}\"><i class=\"icon ion-key\"></i> <span translate>COMMON.PUBKEY</span><h4 class=\"dark text-left\">{{node.pubkey}}</h4></ion-item><a class=\"item item-icon-left item-icon-right item-text-wrap ink\" ng-if=\"isReachable\" ui-sref=\"app.view_server_block_hash({server: node.server, ssl: node.useSsl, tor: node.useTor, number: current.number, hash: current.hash})\"><i class=\"icon ion-cube\"></i> <span translate>BLOCKCHAIN.VIEW.TITLE_CURRENT</span><div class=\"badge badge-calm\" ng-if=\"!loading\">{{current.number|formatInteger}}</div><i class=\"gray icon ion-ios-arrow-right\"></i> </a><a class=\"item item-icon-left item-icon-right item-text-wrap ink\" ng-if=\"isReachable\" ui-sref=\"app.server_blockchain({server: node.server, ssl: node.useSsl, tor: node.useTor})\"><i class=\"icon ion-cube\" style=\"font-size: 25px;\"></i> <i class=\"icon-secondary ion-clock\" style=\"font-size: 18px; left: 33px; top: -12px;\"></i> <span translate>PEER.VIEW.LAST_BLOCKS</span> <i class=\"gray icon ion-ios-arrow-right\"></i></a><cs-extension-point name=\"general\"></cs-extension-point><div class=\"item item-divider\" ng-hide=\"loading || !isReachable\" translate>PEER.VIEW.KNOWN_PEERS</div><ion-item class=\"item item-text-wrap no-border done in gray no-padding-top no-padding-bottom inline text-italic\" ng-show=\"!loading && !isReachable\"><small><i class=\"icon ion-alert-circled\"></i> {{\\'NETWORK.INFO.ONLY_SSL_PEERS\\'|translate}}</small></ion-item><div class=\"item center\" ng-if=\"loading\"><ion-spinner class=\"icon\" icon=\"android\"></ion-spinner></div><div class=\"list no-padding {{::motion.ionListClass}}\" ng-if=\"isReachable\"><div ng-repeat=\"peer in :rebind:peers track by peer.id\" class=\"item item-peer item-icon-left ink {{::ionItemClass}}\" ng-click=\"selectPeer(peer)\" ng-include=\"::\\'templates/network/item_content_peer.html\\'\"></div></div></div><div class=\"col col-20 hidden-xs hidden-sm\"> </div></div></ion-content></ion-view>');\n$templateCache.put('templates/settings/popover_actions.html','<ion-popover-view class=\"fit has-header\"><ion-header-bar><h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll=\"false\"><div class=\"list item-text-wrap\"><a class=\"item item-icon-left ink visible-xs visible-sm\" ng-click=\"reset()\"><i class=\"icon ion-refresh\"></i> {{\\'SETTINGS.BTN_RESET\\' | translate}} </a><a class=\"item item-icon-left ink\" ng-click=\"startSettingsTour()\"><i class=\"icon ion-easel\"></i> {{\\'COMMON.BTN_HELP_TOUR_SCREEN\\' | translate}}</a></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/settings/popup_node.html','<form name=\"popupForm\" ng-submit=\"\"><div class=\"list no-padding\" ng-init=\"setPopupForm(popupForm)\"><div class=\"item item-input item-floating-label\" ng-class=\"{\\'item-input-error\\': popupForm.$submitted && popupForm.newNode.$invalid}\"><span class=\"input-label\" ng-bind-html=\"\\'SETTINGS.POPUP_PEER.HOST\\'|translate\"></span> <input name=\"newNode\" type=\"text\" placeholder=\"{{\\'SETTINGS.POPUP_PEER.HOST_HELP\\' | translate}}\" ng-model=\"popupData.newNode\" ng-minlength=\"3\" required></div><div class=\"form-errors\" ng-if=\"popupForm.$submitted && popupForm.newNode.$error\" ng-messages=\"popupForm.newNode.$error\"><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div><div class=\"form-error\" ng-message=\"minlength\"><span translate=\"ERROR.FIELD_TOO_SHORT\"></span></div></div><div class=\"item item-toggle\"><span class=\"input-label\">{{\\'SETTINGS.POPUP_PEER.USE_SSL\\' | translate}}</span><h4><small class=\"gray\" ng-bind-html=\"\\'SETTINGS.POPUP_PEER.USE_SSL_HELP\\' | translate\"></small></h4><label class=\"toggle toggle-royal no-padding-right\"><input type=\"checkbox\" ng-model=\"popupData.useSsl\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><a class=\"button button-positive button-clear positive button-outline button-full button-small-padding icon-left ink no-padding\" ng-click=\"showNodeList()\"><i class=\"icon ion-search\"></i> {{\\'SETTINGS.POPUP_PEER.BTN_SHOW_LIST\\' | translate}}</a></div><button type=\"submit\" class=\"hide\"></button></form>');\n$templateCache.put('templates/settings/settings.html','<ion-view left-buttons=\"leftButtons\" cache-view=\"false\" class=\"settings\"><ion-nav-title translate>SETTINGS.TITLE</ion-nav-title><ion-nav-buttons side=\"secondary\"><button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\"></button></ion-nav-buttons><ion-content><div class=\"padding text-center hidden-xs hidden-sm\"><button class=\"button button-raised button-stable ink\" ng-click=\"reset()\"><i class=\"icon ion-refresh\"></i> {{\\'SETTINGS.BTN_RESET\\' | translate}}</button> <button class=\"button button-stable button-small-padding icon ion-android-more-vertical\" ng-click=\"showActionsPopover($event)\" title=\"{{\\'COMMON.BTN_OPTIONS\\' | translate}}\"></button></div><div class=\"row no-padding responsive-sm responsive-md responsive-lg\"><div class=\"col col-50 list item-border-large padding-left padding-right no-padding-xs no-padding-sm\" style=\"margin-bottom: 2px;\"><span class=\"item item-divider\" translate>SETTINGS.DISPLAY_DIVIDER</span> <label class=\"item item-input item-select\"><div class=\"input-label\" translate>COMMON.LANGUAGE</div><select ng-model=\"formData.locale\" ng-change=\"changeLanguage(formData.locale.id)\" ng-options=\"l as l.label for l in locales track by l.id\"></select></label><div class=\"item item-toggle dark\"><div class=\"input-label\">{{\\'COMMON.BTN_RELATIVE_UNIT\\' | translate}}</div><label class=\"toggle toggle-royal\" id=\"helptip-settings-btn-unit-relative\"><input type=\"checkbox\" ng-model=\"formData.useRelative\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><div class=\"item item-toggle dark item-text-wrap\"><div class=\"input-label\" ng-bind-html=\"\\'SETTINGS.ENABLE_HELPTIP\\' | translate\"></div><label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"formData.helptip.enable\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><span class=\"item item-divider\" translate>SETTINGS.STORAGE_DIVIDER</span><div class=\"item item-text-wrap item-toggle dark\"><div class=\"input-label\">{{\\'SETTINGS.USE_LOCAL_STORAGE\\' | translate}}</div><h4 class=\"gray\" ng-bind-html=\"\\'SETTINGS.USE_LOCAL_STORAGE_HELP\\' | translate\"></h4><label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"formData.useLocalStorage\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><div class=\"item item-text-wrap item-toggle dark\"><div class=\"input-label\" ng-class=\"{\\'gray\\': !formData.useLocalStorage}\" ng-bind-html=\"\\'SETTINGS.PERSIST_CACHE\\' | translate\"></div><h4 class=\"gray\" ng-bind-html=\"\\'SETTINGS.PERSIST_CACHE_HELP\\' | translate\"></h4><label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"formData.persistCache\" ng-if=\"formData.useLocalStorage\"> <input type=\"checkbox\" ng-model=\"formData.useLocalStorage\" ng-if=\"!formData.useLocalStorage\" disabled=\"disabled\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><cs-extension-point name=\"common\"></cs-extension-point><span class=\"item item-divider hidden-readonly\">{{\\'SETTINGS.AUTHENTICATION_SETTINGS\\' | translate}}</span><div class=\"item item-toggle item-text-wrap hidden-readonly\"><div class=\"input-label\" ng-class=\"{\\'gray\\': !formData.useLocalStorage}\">{{\\'SETTINGS.REMEMBER_ME\\' | translate}}</div><h4 class=\"gray text-wrap\" ng-bind-html=\"\\'SETTINGS.REMEMBER_ME_HELP\\' | translate\"></h4><label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"formData.rememberMe\" ng-if=\"formData.useLocalStorage\"> <input type=\"checkbox\" ng-model=\"formData.useLocalStorage\" ng-if=\"!formData.useLocalStorage\" disabled=\"disabled\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><label class=\"item item-input item-select item-text-wrap hidden-readonly\"><div class=\"input-label hidden-xs\" ng-class=\"::{\\'gray\\': $root.config.demo}\"><span class=\"hidden-xs\" translate>SETTINGS.KEEP_AUTH</span><h4 class=\"gray text-wrap hidden-xs\" ng-bind-html=\"\\'SETTINGS.KEEP_AUTH_HELP\\' | translate\"></h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"></ng-if></div><span class=\"visible-xs\" ng-class=\"::{\\'gray\\': $root.config.demo}\" translate>SETTINGS.KEEP_AUTH_SHORT</span> <select ng-model=\"formData.keepAuthIdle\" ng-disabled=\"$root.config.demo\" ng-options=\"i as (keepAuthIdleLabels[i].labelKey | translate:keepAuthIdleLabels[i].labelParams ) for i in keepAuthIdles track by i\"></select></label><div class=\"item item-input hidden-xs hidden-sm\" ng-class=\"{\\'gray\\': (!formData.useLocalStorage || !formData.rememberMe)}\" ng-if=\"::$root.device.isDesktop()\"><div class=\"input-label\"><span class=\"input-label\" translate>SETTINGS.KEYRING_FILE</span><h4 class=\"gray text-wrap\" ng-bind-html=\"\\'SETTINGS.KEYRING_FILE_HELP\\' | translate\"></h4></div><div class=\"item-note dark\">{{formData.keyringFile}}</div></div></div><div class=\"col col-50 list item-border-large padding-left padding-right no-padding-xs no-padding-sm no-margin-xs no-margin-sm\"><span class=\"item item-divider hidden-readonly\">{{\\'SETTINGS.WALLETS_SETTINGS\\' | translate}}</span><div class=\"item item-toggle item-text-wrap dark hidden-readonly\"><span class=\"input-label\" ng-class=\"{\\'gray\\': !formData.useLocalStorage}\" translate>SETTINGS.USE_WALLETS_ENCRYPTION</span><h4 class=\"gray text-wrap\" ng-bind-html=\"\\'SETTINGS.USE_WALLETS_ENCRYPTION_HELP\\' | translate\"></h4><label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"formData.useLocalStorageEncryption\" ng-if=\"formData.useLocalStorage\"> <input type=\"checkbox\" ng-model=\"formData.useLocalStorage\" ng-if=\"!formData.useLocalStorage\" disabled=\"disabled\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><span class=\"item item-divider hidden-readonly\" translate>SETTINGS.HISTORY_SETTINGS</span><div class=\"item item-toggle item-text-wrap dark hidden-readonly\"><div class=\"input-label\" translate>SETTINGS.DISPLAY_UD_HISTORY</div><label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"formData.showUDHistory\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><div class=\"item item-toggle dark hidden-xs hidden-sm hidden-readonly\"><div class=\"input-label\" translate>SETTINGS.TX_HISTORY_AUTO_REFRESH</div><h4 class=\"gray text-wrap\" ng-bind-html=\"\\'SETTINGS.TX_HISTORY_AUTO_REFRESH_HELP\\' | translate\"></h4><label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"formData.walletHistoryAutoRefresh\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><cs-extension-point name=\"history\"></cs-extension-point><span class=\"item item-divider\" translate>SETTINGS.NETWORK_SETTINGS</span><div class=\"item ink item-text-wrap item-icon-right hidden-xs hidden-sm\" ng-click=\"changeNode()\"><div class=\"input-label\" translate>SETTINGS.PEER</div><ng-if ng-if=\"formData.node.temporary\"><h4 class=\"gray text-wrap assertive\"><i class=\"icon ion-alert-circled\"></i> <span ng-bind-html=\"\\'SETTINGS.PEER_CHANGED_TEMPORARY\\' | translate \"></span></h4><div class=\"item-note assertive text-italic\">{{bma.server}}</div></ng-if><div class=\"badge badge-balanced\" ng-if=\"!formData.node.temporary\">{{bma.server}}</div><i class=\"icon ion-ios-arrow-right\"></i></div><ion-item class=\"ink item-icon-right visible-xs visible-sm\" ng-click=\"changeNode()\"><div class=\"input-label hidden-xs\" translate>SETTINGS.PEER</div><div class=\"input-label visible-xs\" translate>SETTINGS.PEER_SHORT</div><ng-if ng-if=\"formData.node.temporary\"><h4 class=\"gray text-wrap assertive\"><b class=\"ion-alert-circled\"></b> <span ng-bind-html=\"\\'SETTINGS.PEER_CHANGED_TEMPORARY\\' | translate \"></span></h4><div class=\"badge badge-assertive\">{{bma.server}}</div></ng-if><div class=\"badge badge-balanced\" ng-if=\"!formData.node.temporary\">{{bma.server}}</div><i class=\"icon ion-ios-arrow-right\"></i></ion-item><div class=\"item item-text-wrap item-toggle dark hidden-xs hidden-sm\"><div class=\"input-label\" ng-bind-html=\"\\'SETTINGS.EXPERT_MODE\\' | translate\"></div><h4 class=\"gray\" ng-bind-html=\"\\'SETTINGS.EXPERT_MODE_HELP\\' | translate\"></h4><label class=\"toggle toggle-royal\"><input type=\"checkbox\" ng-model=\"formData.expertMode\"><div class=\"track\"><div class=\"handle\"></div></div></label></div><label class=\"item item-input item-select item-text-wrap\"><div class=\"input-label hidden-xs\"><span translate>SETTINGS.BLOCK_VALIDITY_WINDOW</span><h4 class=\"gray text-wrap hidden-xs\" ng-bind-html=\"\\'SETTINGS.BLOCK_VALIDITY_WINDOW_HELP\\' | translate\"></h4></div><div class=\"input-label visible-xs\" translate>SETTINGS.BLOCK_VALIDITY_WINDOW_SHORT</div><select ng-model=\"formData.blockValidityWindow\" ng-options=\"i as (blockValidityWindowLabels[i].labelKey | translate:blockValidityWindowLabels[i].labelParams ) for i in blockValidityWindows track by i\"></select></label><cs-extension-point name=\"network\"></cs-extension-point><span class=\"item item-divider\" ng-if=\"$root.config.plugins\" translate>SETTINGS.PLUGINS_SETTINGS</span><cs-extension-point name=\"plugins\"></cs-extension-point></div></div></ion-content></ion-view>');\n$templateCache.put('templates/wallet/item_tx.html','<i class=\"icon item-image\" ng-if=\"::!tx.avatar\" ng-class=\"::{\\'ion-person dark\\': tx.uid, \\'ion-card dark\\': !tx.uid}\"></i> <i class=\"avatar\" ng-if=\"::tx.avatar\" style=\"background-image: url({{::tx.avatar.src}})\"></i><div class=\"row no-padding\"><div class=\"col col-pubkey no-padding\"><a class=\"\" ui-sref=\"app.wot_identity({pubkey:tx.pubkey, uid:tx.uid})\" ng-if=\"::tx.uid\">{{::tx.name||tx.uid}} </a><a class=\"gray\" ui-sref=\"app.wot_identity({pubkey:tx.pubkey, uid:tx.uid})\" ng-if=\"::!tx.uid && tx.pubkey\"><i class=\"ion-key gray\"></i> {{::tx.pubkey | formatPubkey}} <span ng-if=\"::tx.name\">- {{::tx.name | truncText:40}}</span></a><p ng-if=\"::tx.pubkeys\" class=\"pubkeys\"><a class=\"gray\" ng-repeat=\"pubkey in ::tx.pubkeys.slice(0, 4)\" ui-sref=\"app.wot_identity({pubkey:pubkey})\"><i class=\"ion-key gray\"></i> {{::pubkey | formatPubkey}} </a><span ng-if=\"::tx.pubkeys.length > 4\">...</span></p><p class=\"dark visible-xs comment text-italic\" ng-if=\"::tx.comment\" title=\"{{::tx.comment}}\"><i class=\"ion-ios-chatbubble-outline\"></i> {{::tx.comment}}<br></p><h4><a ng-if=\"::!pending\" class=\"gray underline\" ui-sref=\"app.view_block({number: tx.block_number})\">{{::tx.time | medianFromNowAndDate: false}} </a><span ng-if=\"::pending\" class=\"gray\">{{::tx.time | medianFromNowAndDate: false}}</span></h4></div><div class=\"col col-50 col-comment no-padding padding-left hidden-xs\" ng-if=\"::tx.comment\"><p class=\"vertical-center gray text-italic\" data-toggle=\"tooltip\" title=\"{{::tx.comment}}\">{{::tx.comment}}</p></div><div class=\"col col-10 no-padding\"><span ng-if=\"::!tx.lockedOutputs\" class=\"badge item-note\" ng-class=\"{\\'badge-calm\\': tx.amount > 0, \\'badge-white\\': tx.amount <= 0}\"><span ng-bind-html=\":rebind:tx.amount| formatAmount:{currency:$root.currency.name}\"></span> </span><a ng-if=\":rebind:tx.lockedOutputs\" class=\"badge item-note\" ng-class=\"{\\'badge-calm\\': tx.amount > 0}\" ng-click=\"showLockedOutputsPopover(tx, $event)\"><b class=\"ion-locked\"></b> <span ng-bind-html=\":rebind:tx.amount| formatAmount:{currency:$root.currency.name}\"></span></a><div class=\"badge badge-secondary\" ng-if=\"$root.settings.expertMode\">(<span ng-bind-html=\":rebind:tx.amount| formatAmount:{useRelative: !$root.settings.useRelative, currency:$root.currency.name}\"></span>)</div></div></div>');\n$templateCache.put('templates/wallet/item_ud.html','<i class=\"icon item-image ion-arrow-up-c energized\"></i><div class=\"row no-padding\"><div class=\"col no-padding\"><span class=\"energized\" translate>COMMON.UNIVERSAL_DIVIDEND</span><h4><a class=\"gray underline\" ui-sref=\"app.view_block({number: tx.block_number})\">{{::tx.time | medianFromNowAndDate}}</a></h4></div><div class=\"col col-10 no-padding\"><span class=\"badge item-note badge-energized\"><span ng-bind-html=\":rebind:tx.amount| formatAmount:{currency:$root.currency.name}\"></span></span><div class=\"badge badge-secondary\" ng-if=\"$root.settings.expertMode\">(<span ng-bind-html=\":rebind:tx.amount| formatAmount:{useRelative: !$root.settings.useRelative, currency:$root.currency.name}\"></span>)</div></div></div>');\n$templateCache.put('templates/wallet/list/item_wallet_light.html','<div class=\"item item-avatar item-icon-right item-border item-wallet\" ng-click=\"select($event, wallet)\" ng-init=\"walletData=wallet.data;\"><i ng-if=\"::!walletData.avatar\" class=\"item-image icon\" ng-class=\"::{\\'ion-card\\': !walletData.isMember, \\'ion-person\\': walletData.isMember}\"></i> <i ng-if=\"::walletData.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::walletData.avatar.src}})\"></i><div class=\"badge badge-button badge-avatar badge-assertive ion-locked\" ng-hide=\"::wallet.isAuth()\"></div><h2><ng-if ng-if=\"::walletData.localName||walletData.name||walletData.uid\">{{::walletData.localName||walletData.name||walletData.uid}}</ng-if><ng-if ng-if=\"::!walletData.localName && !walletData.name && !walletData.uid\">{{::walletData.pubkey|formatPubkey}}</ng-if></h2><h4 class=\"gray\"><span class=\"positive\" ng-if=\"::walletData.name && walletData.uid\"><i class=\"ion-person\"></i> {{::walletData.uid}} </span><b class=\"ion-key\"></b> {{::walletData.pubkey | formatPubkey}} <span ng-if=\"::!walletData.uid\" class=\"assertive\" translate>WOT.NOT_MEMBER_PARENTHESIS</span></h4><div class=\"badge\" ng-if=\"formData.showBalance\" ng-class=\"{\\'badge-calm\\': (walletData.balance > 0) }\"><span ng-bind-html=\"walletData.balance|formatAmount:{useRelative: formData.useRelative, currency: currency}\"></span></div><i class=\"icon ion-ios-arrow-right\"></i></div>');\n$templateCache.put('templates/wallet/list/item_wallet.html','<div class=\"item item-avatar item-icon-right item-border-large item-wallet ink\" id=\"wallet-{{::wallet.id}}\" ng-click=\"select($event, wallet)\" ng-init=\"walletData=wallet.data;\"><i ng-if=\":rebind:!walletData.avatar\" class=\"item-image icon\" ng-class=\":rebind:{\\'ion-card\\': !walletData.isMember, \\'ion-person\\': walletData.isMember}\"></i> <i ng-if=\":rebind:walletData.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::walletData.avatar.src}})\"></i><div class=\"badge badge-button badge-avatar badge-assertive ion-locked\" ng-hide=\":rebind:wallet.isAuth()\"></div><h2><span class=\"text-editable\" ng-click=\"editWallet($event, wallet)\" title=\"{{\\'ACCOUNT.WALLET_LIST.BTN_RENAME\\'|translate}}\"><ng-if ng-if=\":rebind:walletData.localName||walletData.name||walletData.uid\" ng-bind-html=\"::walletData.localName||walletData.name||walletData.uid\"></ng-if><ng-if ng-if=\":rebind:!walletData.localName && !walletData.name && !walletData.uid\">{{::walletData.pubkey|formatPubkey}}</ng-if></span></h2><h4 class=\"gray\"><span class=\"positive\" ng-if=\"::walletData.name && walletData.uid\"><i class=\"ion-person\"></i> {{::walletData.uid}} </span><b class=\"ion-key\"></b> {{::walletData.pubkey | formatPubkey}} <span ng-if=\"::!walletData.uid\" class=\"assertive\" translate>WOT.NOT_MEMBER_PARENTHESIS</span></h4><cs-extension-point name=\"item-wallet\"></cs-extension-point><span class=\"badge\" ng-if=\":rebind:formData.showBalance && walletData.sources\" ng-class=\":rebind:{\\'badge-calm\\': (walletData.balance > 0) }\"><ion-spinner class=\"ion-spinner-small\" ng-if=\"formData.updatingWalletId==wallet.id\" icon=\"android\"></ion-spinner><span ng-bind-html=\":rebind:walletData.balance|formatAmount:{useRelative: formData.useRelative, currency: currency}\"></span> </span><i class=\"icon ion-ios-arrow-right\"></i></div>');\n$templateCache.put('templates/wallet/list/modal_import_file.html','<ion-modal-view id=\"transfer\" class=\"modal-full-height\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear visible-xs\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button><h1 class=\"title\" translate>ACCOUNT.WALLET_LIST.IMPORT_MODAL.TITLE</h1></ion-header-bar><ion-content scroll=\"true\" class=\"padding\"><p translate>ACCOUNT.WALLET_LIST.IMPORT_MODAL.HELP</p><div drop-zone=\"onFileChanged(file)\"><div ng-if=\"!hasContent\" file-select=\"onFileChanged(file)\" accept=\".csv,.txt\"><h2 class=\"gray\" translate>COMMON.CHOOSE_FILE</h2></div><div ng-if=\"hasContent\" class=\"item item-icon-left item-icon-right stable-bg\"><i class=\"icon ion-document-text gray\"></i><div class=\"item-content row\"><div class=\"col\"><h2>{{fileData.name}}</h2><h4 ng-if=\"fileData.lastModified\"><span class=\"gray\" translate>COMMON.FILE.DATE</span> {{fileData.lastModified/1000|formatDate}}</h4><h5><span class=\"gray\" translate>COMMON.FILE.SIZE</span> {{fileData.size|formatInteger}} Ko</h5></div><div class=\"col padding-left\"><h3 ng-if=\"validatingFile\" translate>COMMON.FILE.VALIDATING</h3><h3 ng-if=\"!validatingFile\"><span class=\"dark animate-show-hide ng-hide\" ng-show=\"isValidFile && content.length\" ng-bind-html=\"\\'ACCOUNT.WALLET_LIST.IMPORT_MODAL.WALLET_COUNT\\'|translate:{count: content.length}\"></span> <span class=\"assertive animate-show-hide ng-hide\" ng-show=\"isValidFile && !content.length\"><br><i class=\"ion-close-circled assertive\"></i> {{\\'ACCOUNT.WALLET_LIST.IMPORT_MODAL.NO_NEW_WALLET\\' |translate}} </span><span class=\"assertive animate-show-hide ng-hide\" ng-show=\"!isValidFile\"><br><i class=\"ion-close-circled assertive\"></i> {{\\'ERROR.INVALID_FILE_FORMAT\\' |translate}}</span></h3></div></div><a class=\"ion-close-round gray pull-right\" style=\"font-size: 10px; position: absolute; top: 6px; right: 6px;\" ng-click=\"removeFile()\"></a></div></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-positive ink\" ng-disabled=\"loading || !content.length\" ng-click=\"closeModal(content)\" translate>COMMON.BTN_IMPORT</button></div></ion-content></ion-modal-view>');\n$templateCache.put('templates/wallet/list/modal_wallets.html','<ion-modal-view id=\"transfer\" class=\"modal-full-height\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button><h1 class=\"title\" translate>ACCOUNT.SELECT_WALLET_MODAL.TITLE</h1></ion-header-bar><ion-content scroll=\"true\"><div class=\"center padding\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></div><div class=\"center padding gray\" ng-if=\"!loading && !wallets.length && !defaultWallet\">{{:locale:\\'ACCOUNT.WALLET_LIST.NO_WALLET\\'|translate}}</div><ion-list ng-if=\"!loading\" class=\"{{::motion.ionListClass}}\"><ng-include ng-if=\"defaultWallet\" ng-init=\"wallet = defaultWallet\" src=\"\\'templates/wallet/list/item_wallet.html\\'\"></ng-include><ng-repeat ng-repeat=\"wallet in wallets track by wallet.id\" ng-include=\"::\\'templates/wallet/list/item_wallet_light.html\\'\"></ng-repeat></ion-list></ion-content></ion-modal-view>');\n$templateCache.put('templates/wallet/list/popover_actions.html','<ion-popover-view class=\"fit has-header\"><ion-header-bar><h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll=\"false\"><div class=\"list item-text-wrap\"><button class=\"item item-icon-left ink\" ng-class=\"{\\'gray\\': loading || !wallets.length, \\'assertive\\': !loading && wallets.length}\" ng-disabled=\"loading || !wallets.length\" ng-click=\"selectAndRemoveWallet()\"><i class=\"icon ion-trash-a\"></i> {{\\'ACCOUNT.WALLET_LIST.BTN_DELETE\\' | translate}}</button><div class=\"item-divider hidden-sm hidden-xs\"></div><button class=\"item item-icon-left ink hidden-sm hidden-xs\" ng-class=\"{\\'gray\\': loading || !wallets.length}\" ng-disabled=\"loading || !wallets.length\" ng-click=\"downloadAsFile()\"><i class=\"icon ion-android-download\"></i> {{\\'ACCOUNT.WALLET_LIST.BTN_DOWNLOAD\\' | translate}}</button> <button class=\"item item-icon-left ink hidden-sm hidden-xs\" ng-class=\"{\\'gray\\': loading}\" ng-disabled=\"loading\" ng-click=\"showImportFileModal()\"><i class=\"icon ion-android-upload\"></i> {{\\'ACCOUNT.WALLET_LIST.BTN_IMPORT_FILE_DOTS\\' | translate}}</button></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/wallet/list/popover_wallets.html','<ion-popover-view class=\"fit popover-wallets popover-light\"><ion-header-bar class=\"stable-bg block\"><div class=\"title\" translate>ACCOUNT.SELECT_WALLET_MODAL.TITLE</div><div class=\"pull-right\"><a class=\"positive\" ng-click=\"showNewWalletModal()\" translate>ACCOUNT.WALLET_LIST.BTN_NEW</a></div></ion-header-bar><ion-content scroll=\"true\"><div class=\"center padding\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></div><div class=\"center padding gray\" ng-if=\"!loading && !wallets.length && !defaultWallet\">{{:locale:\\'ACCOUNT.WALLET_LIST.NO_WALLET\\'|translate}}</div><ion-list ng-if=\"!loading\"><ng-include ng-if=\"defaultWallet\" ng-init=\"wallet = defaultWallet\" src=\"\\'templates/wallet/list/item_wallet_light.html\\'\"></ng-include><ng-repeat ng-repeat=\"wallet in :rebind:wallets | filter:filterFn(formData) track by wallet.id\" ng-include=\"::\\'templates/wallet/list/item_wallet_light.html\\'\"></ng-repeat></ion-list></ion-content><ion-footer-bar class=\"stable-bg block\"><div class=\"pull-right\"><a class=\"positive\" ui-sref=\"app.view_wallets\" ng-click=\"closePopover()\" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a></div></ion-footer-bar></ion-popover-view>');\n$templateCache.put('templates/wallet/list/popup_edit_name.html','<form name=\"editForm\" ng-submit=\"\"><div class=\"list\" ng-init=\"setEditForm(editForm)\"><label class=\"item item-input\" ng-class=\"{\\'item-input-error\\': editForm.$submitted && editForm.name.$invalid}\"><input name=\"name\" type=\"text\" placeholder=\"{{\\'ACCOUNT.WALLET_LIST.EDIT_POPOVER.NAME_HELP\\' | translate}}\" ng-model=\"formData.name\" ng-minlength=\"3\" required></label><div class=\"form-errors\" ng-if=\"editForm.$submitted && editForm.name.$error\" ng-messages=\"editForm.name.$error\"><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div><div class=\"form-error\" ng-message=\"minlength\"><span translate=\"ERROR.FIELD_TOO_SHORT\"></span></div></div></div></form>');\n$templateCache.put('templates/wallet/list/view_wallets.html','<ion-view left-buttons=\"leftButtons\" class=\"view-wallet-list\"><ion-nav-title></ion-nav-title><ion-nav-buttons side=\"secondary\"><cs-extension-point name=\"nav-buttons\"></cs-extension-point><button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\"></button></ion-nav-buttons><ion-content scroll=\"true\" class=\"padding no-padding-xs no-padding-sm\" bind-notifier=\"{ rebind:formData.useRelative, locale:settings.locale.id}\"><ion-refresher pulling-text=\"{{:locale:\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"doUpdate(true, $event)\"></ion-refresher><div class=\"hidden-xs hidden-sm padding text-center\"><button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"doUpdate(true, $event)\" title=\"{{:locale:\\'COMMON.BTN_REFRESH\\' | translate}}\"></button><cs-extension-point name=\"buttons\"></cs-extension-point><button class=\"button button-calm icon-left ink\" ng-click=\"showNewWalletModal()\">{{:locale:\\'ACCOUNT.WALLET_LIST.BTN_NEW\\' | translate}}</button> <button class=\"button button-stable button-small-padding icon ion-android-more-vertical ink\" ng-click=\"showActionsPopover($event)\" title=\"{{:locale:\\'COMMON.BTN_OPTIONS\\' | translate}}\"></button></div><div class=\"padding-top padding-xs hidden-xs hidden-sm\" style=\"display: block; height: 60px;\"><div class=\"pull-left\"><h4><span translate>ACCOUNT.WALLET_LIST.TITLE</span> <small class=\"gray\" ng-if=\"formData.balance\">(<span translate>ACCOUNT.WALLET_LIST.TOTAL_DOTS</span> <span ng-bind-html=\"formData.balance|formatAmount:{useRelative: formData.useRelative, currency: currency}\"></span>)</small><ion-spinner class=\"ion-spinner-small\" icon=\"android\" ng-if=\"loading || formData.updatingWalletId\"></ion-spinner></h4></div></div><div class=\"center padding gray\" ng-if=\"!loading && wallets && !wallets.length && !defaultWallet\">{{:locale:\\'ACCOUNT.WALLET_LIST.NO_WALLET\\'|translate}}</div><ion-list class=\"{{::motion.ionListClass}}\"><ng-include ng-if=\"defaultWallet\" ng-init=\"wallet = defaultWallet\" src=\"\\'templates/wallet/list/item_wallet.html\\'\"></ng-include><ng-include ng-repeat=\"wallet in wallets track by wallet.id\" src=\"\\'templates/wallet/list/item_wallet.html\\'\"></ng-include></ion-list><div class=\"center padding visible-xs visible-sm\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></div></ion-content><button id=\"fab-add-wallet\" class=\"button button-fab button-fab-bottom-right button-assertive hidden-md hidden-lg drop ng-hide\" ng-show=\"!loading\" ng-click=\"showNewWalletModal()\"><i class=\"icon ion-plus\"></i></button></ion-view>');\n$templateCache.put('templates/wallet/modal_security.html','<ion-modal-view class=\"modal-full-height\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear visible-xs\" ng-if=\"!slides.slider.activeIndex\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-icon button-clear icon ion-ios-arrow-back buttons header-item\" ng-click=\"slidePrev()\" ng-if=\"slides.slider.activeIndex\"></button><h1 class=\"title hidden-xs\" translate>ACCOUNT.SECURITY.TITLE</h1><button class=\"button button-clear icon-right visible-xs\" ng-if=\"!isLastSlide && slides.slider.activeIndex > 0\" ng-click=\"doNext()\"><span translate>COMMON.BTN_NEXT</span> <i class=\"icon ion-ios-arrow-right\"></i></button> <button class=\"button button-positive button-icon button-clear icon ion-android-done visible-xs\" ng-click=\"doNext()\" ng-if=\"isLastSlide && option === \\'saveID\\'\"></button></ion-header-bar><ion-slides options=\"slides.options\" slider=\"slides.slider\"><ion-slide-page><ion-content class=\"has-header padding\"><div class=\"list\"><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink\" ng-click=\"selectOption(\\'recoverID\\')\" ng-if=\"!login\"><div class=\"item-content item-text-wrap\"><i class=\"item-image dark icon ion-person\"></i> <b class=\"ion-ios-undo icon-secondary dark\" style=\"top: -8px; left: 39px; font-size: 12px;\"></b><h2 translate>ACCOUNT.SECURITY.RECOVER_ID</h2><h4 class=\"gray\" translate>ACCOUNT.SECURITY.RECOVER_ID_HELP</h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"><i class=\"icon dark ion-ios-arrow-right\" ng-if=\"::!$root.config.demo\"></i></ng-if></div></div><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink\" ng-click=\"selectOption(\\'revocation\\', true)\" ng-if=\"!login\"><div class=\"item-content item-text-wrap\"><i class=\"item-image dark icon ion-person\"></i> <b class=\"ion-close icon-secondary dark\" style=\"top: -8px; left: 39px; font-size: 12px;\"></b><h2 translate>ACCOUNT.SECURITY.REVOCATION_WITH_FILE</h2><h4 class=\"gray\" translate>ACCOUNT.SECURITY.REVOCATION_WITH_FILE_DESCRIPTION</h4><i class=\"icon dark ion-ios-arrow-right\"></i></div></div><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink hidden-xs\" ng-click=\"selectOption(\\'saveID\\')\" ng-if=\"login && !$root.device.enable\"><div class=\"item-content item-text-wrap\"><i class=\"item-image dark icon ion-person\"></i> <b class=\"ion-ios-redo icon-secondary dark\" style=\"top: -8px; left: 39px; font-size: 12px;\"></b> <b class=\"ion-locked icon-secondary dark\" style=\"top: 0px; left: 40px; font-size: 8px;\"></b><h2 translate>ACCOUNT.SECURITY.SAVE_ID</h2><h4 class=\"gray\" translate>ACCOUNT.SECURITY.SAVE_ID_HELP</h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"><i class=\"icon dark ion-ios-arrow-right\"></i></ng-if></div></div><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink hidden-xs\" ng-click=\"selectOption(\\'generateKeyfile\\')\" ng-if=\"login && !$root.device.enable\"><div class=\"item-content item-text-wrap\"><i class=\"item-image dark icon ion-document-text\"></i> <b class=\"ion-key icon-secondary dark\" style=\"top: -8px; left: 42px; font-size: 12px;\"></b><h2 translate>ACCOUNT.SECURITY.GENERATE_KEYFILE</h2><h4 class=\"gray\" translate>ACCOUNT.SECURITY.GENERATE_KEYFILE_HELP</h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"><i class=\"icon dark ion-ios-arrow-right\"></i></ng-if></div></div><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink hidden-xs hidden-sm\" ng-click=\"downloadRevokeFile()\" ng-if=\"canRevoke && !$root.device.enable\"><div class=\"item-content item-text-wrap\"><i class=\"item-image dark icon ion-person\"></i> <b class=\"ion-ios-redo icon-secondary dark\" style=\"top: -8px; left: 39px; font-size: 12px;\"></b> <b class=\"ion-close icon-secondary dark\" style=\"top: 0px; left: 40px; font-size: 8px;\"></b><h2 translate>ACCOUNT.SECURITY.DOWNLOAD_REVOKE</h2><h4 class=\"gray\" translate>ACCOUNT.SECURITY.DOWNLOAD_REVOKE_HELP</h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"><i class=\"icon dark ion-android-archive\"></i></ng-if></div></div><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink\" ng-click=\"self()\" ng-if=\"needSelf\"><div class=\"item-content item-text-wrap\"><i class=\"item-image icon ion-person dark\"></i> <b class=\"ion-flag icon-secondary dark\" style=\"top: -8px; left: 39px; font-size: 12px;\"></b><h2 translate>ACCOUNT.SECURITY.SEND_IDENTITY</h2><h4 class=\"gray\" ng-bind-html=\"::\\'ACCOUNT.SECURITY.SEND_IDENTITY_HELP\\' | translate\"></h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"></ng-if></div></div><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink\" ng-click=\"membershipIn()\" ng-if=\"needMembership\"><div class=\"item-content item-text-wrap\"><i class=\"item-image icon ion-person dark\"></i> <b class=\"ion-plus icon-secondary dark\" style=\"top: -8px; left: 39px; font-size: 12px;\"></b><h2 translate>ACCOUNT.SECURITY.MEMBERSHIP_IN</h2><h4 class=\"gray\" ng-bind-html=\"::\\'ACCOUNT.SECURITY.MEMBERSHIP_IN_HELP\\' | translate\"></h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"></ng-if></div></div><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink\" ng-click=\"revokeWalletIdentity()\" ng-if=\"canRevoke\"><div class=\"item-content item-text-wrap\"><i class=\"item-image icon ion-person assertive-900\"></i> <b class=\"ion-close icon-secondary assertive-900\" style=\"top: -8px; left: 39px; font-size: 12px;\"></b><h2 translate>ACCOUNT.SECURITY.REVOCATION_WALLET</h2><h4 class=\"gray\" translate>ACCOUNT.SECURITY.REVOCATION_WALLET_HELP</h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"></ng-if></div></div></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button></div></ion-content></ion-slide-page><ion-slide-page ng-if=\"option == \\'revocation\\'\"><ng-include src=\"::\\'templates/wallet/slides/slides_revocation_file.html\\'\"></ng-include></ion-slide-page><ion-slide-page ng-if=\"login && option == \\'saveID\\'\"><ng-include src=\"::\\'templates/wallet/slides/slides_saveID_1.html\\'\"></ng-include></ion-slide-page><ion-slide-page ng-if=\"login && option == \\'saveID\\'\"><ng-include src=\"::\\'templates/wallet/slides/slides_saveID_2.html\\'\"></ng-include></ion-slide-page><ion-slide-page ng-if=\"option == \\'recoverID\\'\"><ng-include src=\"::\\'templates/wallet/slides/slides_recoverID_1.html\\'\"></ng-include></ion-slide-page><ion-slide-page ng-if=\"option == \\'recoverID\\'\"><ng-include src=\"::\\'templates/wallet/slides/slides_recoverID_2.html\\'\"></ng-include></ion-slide-page><ion-slide-page ng-if=\"option == \\'recoverID\\'\"><ng-include src=\"::\\'templates/wallet/slides/slides_recoverID_3.html\\'\"></ng-include></ion-slide-page><ion-slide-page ng-if=\"login && option == \\'generateKeyfile\\'\"><ng-include src=\"::\\'templates/wallet/slides/slides_generate_keyfile.html\\'\"></ng-include></ion-slide-page></ion-slides></ion-modal-view>');\n$templateCache.put('templates/wallet/modal_transfer.html','<ion-modal-view id=\"transfer\" class=\"modal-full-height modal-transfer\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear visible-xs\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button><h1 class=\"title\" translate>TRANSFER.MODAL.TITLE</h1><button class=\"button button-icon button-clear icon ion-android-send visible-xs\" ng-click=\"doTransfer()\"></button></ion-header-bar><ion-content><ng-include src=\"::\\'templates/wallet/transfer_form.html\\'\"></ng-include></ion-content><ion-digit-keyboard settings=\"digitKeyboardSettings\" ng-if=\"digitKeyboardVisible\"></ion-digit-keyboard></ion-modal-view>');\n$templateCache.put('templates/wallet/new_transfer.html','<ion-view left-buttons=\"leftButtons\" id=\"transfer\"><ion-nav-title><span class=\"visible-xs visible-sm\" translate>TRANSFER.TITLE</span></ion-nav-title><ion-nav-buttons side=\"secondary\"><button class=\"button button-icon button-clear icon ion-android-send visible-xs\" ng-click=\"doTransfer()\"></button></ion-nav-buttons><ion-content scroll=\"true\"><div class=\"row no-padding-xs\"><div class=\"col col-20 hidden-xs hidden-sm\"> </div><div class=\"col no-padding-xs\"><h2 class=\"hidden-xs hidden-sm\" ng-if=\"formData\">{{(formData.all ? \\'TRANSFER.SUB_TITLE_ALL\\' : \\'TRANSFER.SUB_TITLE\\')|translate}}</h2><h4 class=\"hidden-xs hidden-sm\"> </h4><ng-include src=\"::\\'templates/wallet/transfer_form.html\\'\"></ng-include></div><div class=\"col col-20 hidden-xs hidden-sm\"> </div></div></ion-content><ion-digit-keyboard settings=\"digitKeyboardSettings\" ng-if=\"digitKeyboardVisible\"></ion-digit-keyboard></ion-view>');\n$templateCache.put('templates/wallet/popover_actions.html','<ion-popover-view class=\"fit has-header popover-wallet-actions\"><ion-header-bar><h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll=\"false\"><div class=\"list item-text-wrap\"><a class=\"item item-icon-left ink visible-xs visible-sm\" ng-click=\"showSharePopover($event)\"><i class=\"icon ion-android-share-alt\"></i> {{\\'COMMON.BTN_SHARE\\' | translate}} </a><a class=\"item item-icon-left ink\" ng-if=\"walletData.requirements.alternatives\" ng-click=\"showSelectIdentitiesModal()\"><i class=\"icon ion-person\"></i> <b class=\"icon-secondary ion-loop\" style=\"margin-top: 4px; left: 15px;\"></b> {{\\'ACCOUNT.BTN_SELECT_ALTERNATIVES_IDENTITIES\\' | translate}} </a><a class=\"item item-icon-left ink visible-xs visible-sm\" ng-if=\"!walletData.requirements.needSelf && walletData.requirements.needRenew\" ng-click=\"renewMembership()\"><i class=\"icon ion-loop\"></i> {{\\'ACCOUNT.BTN_MEMBERSHIP_RENEW_DOTS\\' | translate}} </a><a class=\"item item-icon-left ink hidden-xs hidden-sm\" ng-if=\"!walletData.requirements.needSelf && !walletData.requirements.hasBadSelfBlock && !walletData.requirements.revoked\" ng-class=\"{\\'gray\\':!walletData.requirements.needRenew}\" ng-click=\"renewMembership()\"><i class=\"icon ion-loop\"></i> {{\\'ACCOUNT.BTN_MEMBERSHIP_RENEW_DOTS\\' | translate}} </a><a class=\"item item-icon-left ink hidden-xs hidden-sm\" ng-if=\"walletData.requirements.hasBadSelfBlock\" ng-click=\"fixMembership()\"><i class=\"icon ion-loop\"></i> {{\\'ACCOUNT.BTN_FIX_MEMBERSHIP\\' | translate}} </a><a class=\"item item-icon-left assertive ink\" ng-if=\"walletData.requirements.canMembershipOut\" ng-click=\"membershipOut()\"><i class=\"icon ion-log-out\"></i> {{\\'ACCOUNT.BTN_MEMBERSHIP_OUT_DOTS\\' | translate}} </a><a class=\"item item-icon-left ink\" ng-click=\"showSecurityModal()\"><i class=\"icon ion-locked\"></i> <span ng-bind-html=\"\\'ACCOUNT.BTN_SECURITY_DOTS\\' | translate\"></span></a><div class=\"item-divider hidden-sm hidden-xs\"></div><a class=\"item item-icon-left ink hidden-sm hidden-xs\" ng-if=\"isDefaultWallet\" ng-click=\"startWalletTour()\"><i class=\"icon ion-easel\"></i> {{\\'COMMON.BTN_HELP_TOUR_SCREEN\\' | translate}}</a></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/wallet/popover_unit.html','<ion-popover-view class=\"popover-unit\"><ion-content scroll=\"false\"><div class=\"list\"><a class=\"item item-icon-left\" ng-class=\"{ \\'selected\\': !formData.useRelative}\" ng-click=\"closePopover(false)\"><i class=\"icon\" ng-class=\"{ \\'ion-ios-checkmark-empty\\': !formData.useRelative}\"></i> <i ng-bind-html=\"$root.currency.name | currencySymbol:false\"></i> </a><a class=\"item item-icon-left\" ng-class=\"{ \\'selected\\': formData.useRelative}\" ng-click=\"closePopover(true)\"><i class=\"icon\" ng-class=\"{ \\'ion-ios-checkmark-empty\\': formData.useRelative}\"></i> <i ng-bind-html=\"$root.currency.name | currencySymbol:true\"></i></a></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/wallet/popup_register.html','<form name=\"registerForm\" ng-submit=\"\"><div class=\"list\" ng-init=\"setRegisterForm(registerForm)\"><label class=\"item item-input\" ng-class=\"{\\'item-input-error\\': registerForm.$submitted && registerForm.pseudo.$invalid}\"><input name=\"pseudo\" type=\"text\" placeholder=\"{{\\'ACCOUNT.NEW.PSEUDO_HELP\\' | translate}}\" ng-model=\"formData.newUid\" ng-minlength=\"3\" required></label><div class=\"form-errors\" ng-if=\"registerForm.$submitted && registerForm.pseudo.$error\" ng-messages=\"registerForm.pseudo.$error\"><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div><div class=\"form-error\" ng-message=\"minlength\"><span translate=\"ERROR.FIELD_TOO_SHORT\"></span></div></div></div></form>');\n$templateCache.put('templates/wallet/slides/slides_generate_keyfile.html','<ion-content class=\"has-header padding\"><h3 translate>ACCOUNT.SECURITY.GENERATE_KEYFILE</h3><div class=\"list\"><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink\" ng-click=\"downloadKeyFile(\\'PubSec\\')\"><div class=\"item-content item-text-wrap\"><i class=\"item-image dark icon ion-document-text\"></i> <b class=\"ion-ios-redo icon-secondary dark\" style=\"top: -8px; left: 42px; font-size: 12px;\"></b><h2 translate>ACCOUNT.SECURITY.KEYFILE.PUBSEC_FORMAT</h2><h4 class=\"gray\" translate>ACCOUNT.SECURITY.KEYFILE.PUBSEC_FORMAT_HELP</h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"><i class=\"icon dark ion-ios-arrow-right\"></i></ng-if></div></div><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink\" ng-click=\"downloadKeyFile(\\'WIF\\')\"><div class=\"item-content item-text-wrap\"><i class=\"item-image dark icon ion-document-text\"></i> <b class=\"ion-ios-redo icon-secondary dark\" style=\"top: -8px; left: 42px; font-size: 12px;\"></b><h2 translate>ACCOUNT.SECURITY.KEYFILE.WIF_FORMAT</h2><h4 class=\"gray\" translate>ACCOUNT.SECURITY.KEYFILE.WIF_FORMAT_HELP</h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"><i class=\"icon dark ion-ios-arrow-right\"></i></ng-if></div></div><div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink\" ng-click=\"downloadKeyFile(\\'EWIF\\')\"><div class=\"item-content item-text-wrap\"><i class=\"item-image dark icon ion-document-text\"></i> <b class=\"ion-ios-redo icon-secondary dark\" style=\"top: -8px; left: 42px; font-size: 12px;\"></b> <b class=\"ion-locked icon-secondary dark\" style=\"top: 0px; left: 43px; font-size: 8px;\"></b><h2 translate>ACCOUNT.SECURITY.KEYFILE.EWIF_FORMAT</h2><h4 class=\"gray\" translate>ACCOUNT.SECURITY.KEYFILE.EWIF_FORMAT_HELP</h4><ng-if ng-if=\"::$root.config.demo\" ng-include=\"::\\'templates/common/note_feature_not_available.html\\'\"><i class=\"icon dark ion-ios-arrow-right\"></i></ng-if></div></div></div></ion-content>');\n$templateCache.put('templates/wallet/slides/slides_recoverID_1.html','<ion-content class=\"has-header padding\"><p translate>ACCOUNT.SECURITY.RECOVER_ID_SELECT_FILE</p><div drop-zone=\"onFileChanged(file)\"><div ng-if=\"!hasContent\" file-select=\"onFileChanged(file)\" accept=\".txt\"><h2 class=\"gray\" translate>COMMON.CHOOSE_FILE</h2></div><div ng-if=\"hasContent\" class=\"item item-icon-left item-icon-right\"><i class=\"icon ion-document-text dark\"></i><div class=\"item-content row\"><div class=\"col\"><span>{{fileData.name}}</span><br><small>{{fileData.size}} Ko</small></div><div class=\"col-10\"><b ng-class=\"{\\'ion-close-circled assertive\\': !isValidFile}\" style=\"font-size: 28px; position: relative; top: 6px;\"></b></div></div><a class=\"ion-close-round gray pull-right\" style=\"font-size: 10px; position: absolute; top: 6px; right: 6px;\" ng-click=\"restore()\"></a></div></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-calm icon-right ion-chevron-right ink\" ng-click=\"doNext()\" translate>COMMON.BTN_NEXT <i class=\"icon ion-arrow-right-a\"></i></button></div></ion-content>');\n$templateCache.put('templates/wallet/slides/slides_recoverID_2.html','<ion-content class=\"has-header padding\"><h3 translate>ACCOUNT.SECURITY.RECOVER_ID</h3><form name=\"recoverForm\" novalidate ng-submit=\"recoverId()\"><div class=\"list\" ng-init=\"setForm(recoverForm, \\'recoverForm\\')\"><ng-repeat ng-repeat=\"question in recover.questions \"><label class=\"item item-input {{smallscreen ? \\'item-stacked-label\\' : \\'item-floating-label\\'}}\" ng-class=\"{\\'item-input-error\\': recoverForm.$submitted && recoverForm[\\'question{{$index}}\\'].$invalid}\"><span class=\"input-label\" style=\"{{smallscreen ? \\'white-space: normal\\' : \\'\\'}}\">{{question.value }}</span> <input type=\"text\" autocomplete=\"off\" name=\"question{{$index}}\" placeholder=\"{{smallscreen ? \\'\\' : question.value }}\" ng-model=\"question.answer\" required></label><div class=\"form-errors\" ng-show=\"recoverForm.$submitted && recoverForm[\\'question{{$index}}\\'].$error\" ng-messages=\"recoverForm[\\'question{{$index}}\\'].$error\"><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div></div></ng-repeat><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-clear button-dark\" ng-click=\"restore()\" type=\"button\" translate>ACCOUNT.SECURITY.BTN_CLEAN</button> <button class=\"button button-calm icon-right ion-chevron-right ink\" type=\"submit\" translate>COMMON.BTN_NEXT <i class=\"icon ion-arrow-right-a\"></i></button></div></div></form></ion-content>');\n$templateCache.put('templates/wallet/slides/slides_recoverID_3.html','<ion-content class=\"has-header padding\"><h3 translate>ACCOUNT.SECURITY.RECOVER_ID</h3><div class=\"item item-input\"><span class=\"input-label\">{{\\'LOGIN.SALT\\' | translate}} :</span> <span>{{recover.salt}}</span></div><div class=\"item item-input\"><span class=\"input-label\">{{\\'LOGIN.PASSWORD\\' | translate}} :</span> <span>{{recover.pwd}}</span></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CLOSE</button></div></ion-content>');\n$templateCache.put('templates/wallet/slides/slides_revocation_file.html','<ion-content class=\"has-header padding\"><p translate>ACCOUNT.SECURITY.REVOCATION_WITH_FILE_HELP</p><div drop-zone=\"onFileChanged(file)\"><div ng-if=\"!hasContent\" file-select=\"onFileChanged(file)\" accept=\".txt\"><h2 class=\"gray\" translate>COMMON.CHOOSE_FILE</h2></div><div ng-if=\"hasContent\" class=\"item item-icon-left item-icon-right\"><i class=\"icon ion-document-text dark\"></i><div class=\"row\"><div class=\"col\"><h2>{{fileData.name}}</h2><h4 ng-if=\"fileData.lastModified\"><span class=\"gray\" translate>COMMON.FILE.DATE</span> {{fileData.lastModified/1000|formatDate}}</h4><h5><span class=\"gray\" translate>COMMON.FILE.SIZE</span> {{fileData.size|formatInteger}} Ko</h5></div><div class=\"col padding-left\"><h3 class=\"assertive animate-show-hide ng-hide\" ng-show=\"!isValidFile\"><br><i class=\"ion-close-circled assertive\"></i> {{revocationError|translate}}</h3></div></div><a class=\"ion-close-round gray pull-right\" style=\"font-size: 10px; position: absolute; top: 6px; right: 6px;\" ng-click=\"restore()\"></a></div></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-calm icon-right ion-chevron-right ink\" ng-click=\"revokeWithFile()\" translate>COMMON.BTN_NEXT <i class=\"icon ion-arrow-right-a\"></i></button></div></ion-content>');\n$templateCache.put('templates/wallet/slides/slides_saveID_1.html','<ion-content class=\"has-header padding\"><h3 translate>ACCOUNT.SECURITY.SAVE_ID</h3><label class=\"item item-input item-select\"><div class=\"input-label\" translate>ACCOUNT.SECURITY.LEVEL</div><select ng-model=\"formData.level\"><option value=\"2\" ng-bind-html=\"\\'ACCOUNT.SECURITY.LOW_LEVEL\\' | translate\"></option><option value=\"4\" translate>ACCOUNT.SECURITY.MEDIUM_LEVEL</option><option value=\"6\" translate>ACCOUNT.SECURITY.STRONG_LEVEL</option></select></label><div class=\"padding-top\" translate=\"ACCOUNT.SECURITY.HELP_LEVEL\" translate-values=\"{nb: {{formData.level}}}\"></div><form name=\"questionsForm\" novalidate ng-submit=\"doNext(\\'questionsForm\\')\"><div class=\"list\" ng-init=\"setForm(questionsForm, \\'questionsForm\\')\"><ion-checkbox ng-repeat=\"question in formData.questions\" ng-model=\"question.checked\" ng-required=\"isRequired()\"><span style=\"white-space: normal;\">{{question.value | translate}}</span></ion-checkbox><div class=\"item item-icon-right no-padding-top\"><a class=\"dark\"><i class=\"icon ion-android-add\" ng-click=\"addQuestion()\"></i></a><div class=\"list list-inset\"><label class=\"item item-input\"><input type=\"text\" autocomplete=\"off\" placeholder=\"{{\\'ACCOUNT.SECURITY.ADD_QUESTION\\' | translate}}\" ng-model=\"formData.addQuestion\"></label></div></div></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-clear button-dark\" ng-click=\"restore()\" type=\"button\" translate>ACCOUNT.SECURITY.BTN_RESET</button> <button class=\"button button-calm icon-right ion-chevron-right ink\" ng-disabled=\"questionsForm.$invalid\" type=\"submit\" translate>COMMON.BTN_NEXT <i class=\"icon ion-arrow-right-a\"></i></button></div></form></ion-content>');\n$templateCache.put('templates/wallet/slides/slides_saveID_2.html','<ion-content class=\"has-header padding\"><h3 translate>ACCOUNT.SECURITY.SAVE_ID</h3><form name=\"answersForm\" novalidate ng-submit=\"doNext(\\'answersForm\\')\"><div class=\"list\" ng-init=\"setForm(answersForm, \\'answersForm\\')\"><ng-repeat ng-repeat=\"question in formData.questions |filter:true:checked\"><label class=\"item item-input item-text-wrap {{smallscreen ? \\'item-stacked-label\\' : \\'item-floating-label\\'}}\" ng-class=\"{\\'item-input-error\\': answersForm.$submitted && answersForm[\\'question{{$index}}\\'].$invalid}\"><span class=\"input-label\" style=\"width: 100%; max-width: inherit;\">{{question.value | translate}}</span> <input type=\"text\" autocomplete=\"off\" name=\"question{{$index}}\" placeholder=\"{{smallscreen ? \\'\\' : question.value | translate}}\" ng-model=\"question.answer\" required></label><div class=\"form-errors\" ng-show=\"answersForm.$submitted && answersForm[\\'question{{$index}}\\'].$error\" ng-messages=\"answersForm[\\'question{{$index}}\\'].$error\"><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div></div></ng-repeat><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" translate>COMMON.BTN_CANCEL</button> <button class=\"button button-clear button-dark\" ng-click=\"restore()\" type=\"button\" translate>ACCOUNT.SECURITY.BTN_CLEAN</button> <button class=\"button button-positive ink\" type=\"submit\" translate>COMMON.BTN_CONTINUE <i class=\"icon ion-android-archive\"></i></button></div></div></form></ion-content>');\n$templateCache.put('templates/wallet/transfer_form.html','<form name=\"transferForm\" novalidate=\"\" ng-submit=\"doTransfer()\"><div class=\"list no-padding-xs\" ng-init=\"setForm(transferForm)\"><ion-item class=\"item-icon-right gray ink\" ng-class=\"{\\'item-input-error\\': form.$submitted && !formData.destPub}\" tabindex=\"1\" ng-click=\"showWotLookupModal()\"><span class=\"gray\" translate=\"\">TRANSFER.TO</span> <span class=\"badge badge-royal animate-fade-in animate-show-hide ng-hide\" ng-show=\"destUid\"><i class=\"ion-person\"></i> {{destUid}} </span> <span class=\"badge badge-royal\" ng-show=\"!destUid && formData.destPub\"><i class=\"ion-key\"></i> {{formData.destPub | formatPubkey}} </span><i class=\"gray icon ion-ios-arrow-right\"></i></ion-item><div class=\"form-errors\" ng-if=\"form.$submitted && !formData.destPub\"><div class=\"form-error\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div></div><ion-item class=\"item-text-wrap ink\" ng-class=\"{\\'item-icon-right\\': enableSelectWallet}\" tabindex=\"2\" ng-click=\"showSelectWalletModal()\"><span class=\"gray\" translate=\"\">TRANSFER.FROM</span> <span class=\"badge item-note\" ng-if=\"loading\"><ion-spinner class=\"ion-spinner-small\" icon=\"android\"></ion-spinner></span><span class=\"badge animate-fade-in animate-show-hide ng-hide\" ng-show=\"!loading\" ng-class=\"{\\'badge-assertive\\': (convertedBalance <= 0 || form.amount.$error.max), \\'badge-balanced\\': (convertedBalance > 0 && (!form.amount.$error.max)) }\"><span ng-if=\"walletData.pubkey && !walletData.isMember\"><i class=\"ion-key\"></i> {{walletData.pubkey| formatPubkey}} </span><span ng-if=\"walletData.isMember\"><i class=\"ion-person\"></i> {{walletData.name||walletData.uid}} </span><span ng-bind-html=\"walletData.balance|formatAmount:{useRelative: formData.useRelative, currency:currency}\"></span> </span><i class=\"gray icon ion-ios-arrow-right\" ng-if=\"enableSelectWallet\"></i></ion-item><div class=\"form-errors ng-hide\" ng-show=\"!loading && walletData.pubkey && walletData.balance <= 0\"><div class=\"form-error\"><span translate=\"ERROR.NOT_ENOUGH_CREDIT\"></span></div></div><ion-item class=\"item-input item-floating-label item-button-right\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.amount.$invalid}\"><div class=\"input-label\"><span translate=\"\">TRANSFER.AMOUNT</span> (<span ng-bind-html=\"$root.currency.name | currencySymbol:formData.useRelative\"></span>)</div><input type=\"text\" tabindex=\"3\" autocomplete=\"off\" class=\"hidden-device\" name=\"amount\" placeholder=\"{{::\\'TRANSFER.AMOUNT_HELP\\' | translate}}\" ng-model=\"formData.amount\" required number-float=\"\"> <a class=\"button button-clear button-stable dark ink\" tabindex=\"-1\" style=\"z-index:110; padding: 0px 16px;\" ng-click=\"showUnitPopover($event)\"><span ng-bind-html=\"$root.currency.name | currencySymbol:formData.useRelative\"></span> <b class=\"ion-arrow-down-b\" style=\"font-size: 12pt;\"></b></a></ion-item><div class=\"form-errors\" ng-show=\"form.$submitted && form.amount.$error\" ng-messages=\"form.amount.$error\"><div class=\"form-error\" ng-message=\"required\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div><div class=\"form-error\" ng-message=\"numberFloat\"><span translate=\"ERROR.FIELD_NOT_NUMBER\"></span></div><div class=\"form-error\" ng-message=\"numberInt\"><span translate=\"ERROR.FIELD_NOT_INT\"></span></div><div class=\"form-error\" ng-message=\"min\"><span translate=\"ERROR.FIELD_MIN\" translate-values=\"{min: minAmount}\"></span></div><div class=\"form-error\" ng-message=\"max\"><span translate=\"ERROR.NOT_ENOUGH_CREDIT\"></span></div></div><a class=\"item item-icon-right gray ink\" ng-class=\"{\\'item-input-error\\': form.$submitted && !formData.destPub}\" ng-click=\"showWotLookupModal(\\'restPub\\')\" tabindex=\"5\" ng-if=\"formData.all && formData.restAmount\"><span class=\"gray\"><i translate=\"\">TRANSFER.REST</i><ng-if ng-if=\"formData.restAmount\">(<i ng-bind-html=\"formData.restAmount|formatAmount:{useRelative: formData.useRelative, currency:currency}\"></i>)</ng-if><i translate=\"\">TRANSFER.REST_TO</i> </span><span class=\"badge badge-royal animate-fade-in animate-show-hide ng-hide\" ng-show=\"restUid\"><i class=\"ion-person\"></i> {{restUid}} </span> <span class=\"badge badge-royal\" ng-show=\"!restUid && formData.restPub\"><i class=\"ion-key\"></i> {{formData.restPub | formatPubkey}} </span><i class=\"gray icon ion-ios-arrow-right\"></i></a><div class=\"form-errors\" ng-if=\"form.$submitted && formData.all && !formData.restPub && formData.restAmount > 0\"><div class=\"form-error\"><span translate=\"ERROR.FIELD_REQUIRED\"></span></div></div><div class=\"pull-right visible-xs visible-sm\" ng-if=\"!formData.useComment\"><a class=\"button button-text button-small ink\" tabindex=\"-1\" ng-click=\"addComment()\"><i class=\"icon ion-plus\"></i> <span translate=\"\">TRANSFER.BTN_ADD_COMMENT</span></a></div><label class=\"item item-input item-floating-label hidden-xs hidden-sm\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.comment.$invalid}\"><span class=\"input-label\">{{\\'TRANSFER.COMMENT\\' | translate}}</span> <input type=\"text\" placeholder=\"{{\\'TRANSFER.COMMENT_HELP\\' | translate}}\" name=\"comment\" tabindex=\"6\" autocomplete=\"off\" ng-model=\"formData.comment\" ng-maxlength=\"255\" ng-pattern=\"commentPattern\"></label> <label class=\"item item-input item-floating-label visible-xs visible-sm\" ng-if=\"formData.useComment\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.comment.$invalid}\"><span class=\"input-label\">{{\\'TRANSFER.COMMENT\\' | translate}}</span> <input type=\"text\" placeholder=\"{{\\'TRANSFER.COMMENT_HELP\\' | translate}}\" id=\"{{commentInputId}}\" tabindex=\"7\" name=\"comment\" autocomplete=\"off\" ng-model=\"formData.comment\" ng-model-options=\"{ debounce: 650 }\" ng-maxlength=\"255\" ng-pattern=\"commentPattern\" ng-focus=\"hideDigitKeyboard()\"></label><div class=\"form-errors\" ng-show=\"form.comment.$error\" ng-messages=\"form.comment.$error\"><div class=\"form-error\" ng-message=\"maxlength\"><span translate=\"ERROR.FIELD_TOO_LONG\"></span></div><div class=\"form-error\" ng-message=\"pattern\"><span translate=\"ERROR.FIELD_ACCENT\"></span></div></div><div class=\"item item-icon-left item-text-wrap item-no-border hidden-xs hidden-sm\"><div class=\"animate-fade-in animate-show-hide ng-hide\" ng-show=\"formData.comment && formData.comment.length || form.comment.$invalid\"><i class=\"icon ion-android-alert positive\"></i><h4 class=\"positive\" translate=\"\">TRANSFER.WARN_COMMENT_IS_PUBLIC</h4></div></div><div class=\"item item-icon-left item-text-wrap item-no-border visible-xs visible-sm\" ng-if=\"formData.useComment\"><i class=\"icon ion-android-alert positive\"></i><h4 class=\"positive\" translate=\"\">TRANSFER.WARN_COMMENT_IS_PUBLIC</h4></div></div><div class=\"padding hidden-xs text-right\"><button class=\"button button-clear button-dark ink\" tabindex=\"-1\" ng-click=\"cancel()\" type=\"button\" translate=\"\">COMMON.BTN_CANCEL</button> <button class=\"button ink\" tabindex=\"8\" ng-class=\"{\\'button-assertive\\': formData.all, \\'button-positive\\': !formData.all}\" ng-disabled=\"loading\" type=\"submit\" translate=\"\">TRANSFER.BTN_SEND</button></div></form>');\n$templateCache.put('templates/wallet/tx_locked_outputs_popover.html','<ion-popover-view class=\"fit popover-locked-outputs\"><ion-header-bar><h1 class=\"title\" translate>ACCOUNT.LOCKED_OUTPUTS_POPOVER.TITLE</h1></ion-header-bar><ion-content scroll=\"true\"><div ng-if=\"popoverData.lockedOuputs.length == 1\" class=\"item item-text-wrap no-border\"><h4 class=\"positive\" translate>ACCOUNT.LOCKED_OUTPUTS_POPOVER.DESCRIPTION</h4></div><div ng-if=\"popoverData.lockedOuputs.length > 1\" class=\"item item-text-wrap no-border\"><h4 class=\"positive\" translate>ACCOUNT.LOCKED_OUTPUTS_POPOVER.DESCRIPTION_MANY</h4></div><div ng-repeat=\"output in popoverData.lockedOuputs track by $index\" class=\"item\"><h2 class=\"gray\" ng-if=\"popoverData.lockedOuputs.length > 1\" translate>ACCOUNT.LOCKED_OUTPUTS_POPOVER.LOCKED_AMOUNT</h2><div ng-if=\"popoverData.lockedOuputs.length > 1\" class=\"badge item-note\" ng-class=\"{\\'badge-balanced\\': output.amount > 0}\"><i class=\"icon ion-locked\"></i> <span ng-bind-html=\"::output.amount| formatAmount\"></span> <span ng-bind-html=\"::unit\"></span></div><div ng-repeat=\"condition in output.unlockConditions track by $index\" class=\"row\" ng-class=\"::{\\'padding-top\\': !$index && popoverData.lockedOuputs.length > 1}\" ng-style=\"::condition.style\"><span class=\"gray\" ng-if=\"::condition.operator\">{{::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_OPERATOR.\\'+condition.operator|translate}} </span><div ng-if=\"::condition.type==\\'SIG\\'\"><i class=\"icon ion-key dark\"></i> <span class=\"dark\" ng-bind-html=\"::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.SIG\\' | translate\"></span> <a ng-click=\"goState(\\'app.wot_identity\\', {pubkey:condition.value})\" style=\"text-decoration: none;\" class=\"positive\">{{condition.value|formatPubkey}}</a></div><div ng-if=\"::condition.type==\\'XHX\\'\"><i class=\"icon ion-lock-combination dark\"></i> <span class=\"dark\" ng-bind-html=\"::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.XHX\\' | translate\"></span> <a copy-on-click=\"{{::condition.value}}\" class=\"positive\">{{::condition.value|formatPubkey}}...</a></div><div ng-if=\"condition.type==\\'CSV\\'\"><i class=\"icon ion-clock dark\"></i> <span class=\"dark\" ng-bind-html=\"::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.CSV\\' | translate\"></span> {{::condition.value|formatDuration}}</div><div ng-if=\"condition.type==\\'CLTV\\'\"><i class=\"icon ion-clock dark\"></i> <span class=\"dark\" ng-bind-html=\"::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_FUNCTION.CLTV\\' | translate\"></span> {{::condition.value|medianDate}}</div></div></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/wallet/view_wallet_tx_error.html','<ion-view left-buttons=\"leftButtons\" class=\"view-wallet-tx-error\"><ion-nav-title></ion-nav-title><ion-nav-buttons side=\"secondary\"><cs-extension-point name=\"nav-buttons\"></cs-extension-point></ion-nav-buttons><ion-content scroll=\"true\" class=\"refresher-top-bg\" bind-notifier=\"{ rebind:settings.useRelative, locale:settings.locale.id}\"><ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"doUpdate(true)\"></ion-refresher><div class=\"hidden-xs hidden-sm padding text-center\"><button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"doUpdate()\" title=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\"></button></div><div class=\"row no-padding\"><div class=\"col col-20 hidden-xs hidden-sm\"> </div><div class=\"col list {{::motion.ionListClass}}\"><div class=\"item item-divider\"><span><b class=\"ion-clock\"></b> {{:locale:\\'ACCOUNT.PENDING_TX_RECEIVED\\'|translate}}</span><div class=\"badge item-note\"><span ng-if=\"!$root.settings.useRelative\">({{$root.currency.name | abbreviate}})</span> <span ng-if=\"$root.settings.useRelative\">({{\\'COMMON.UD\\' | translate}}<sub>{{$root.currency.name | abbreviate}}</sub>)</span></div></div><span class=\"item padding\" ng-if=\"!loading && !hasReceivedTx()\"><span class=\"gray\">{{:locale:\\'ACCOUNT.NO_TX\\'|translate}}</span></span><div class=\"item item-pending item-tx item-icon-left\" ng-repeat=\"tx in formData.tx.errors | filter: filterReceivedTx\" ng-init=\"pending=true;\" ng-include=\"::\\'templates/wallet/item_tx.html\\'\"></div><div class=\"item item-divider\"><span><b class=\"ion-close-circled\"></b> {{:locale:\\'ACCOUNT.ERROR_TX_SENT\\'|translate}}</span><div class=\"badge item-note\"><span ng-if=\"!$root.settings.useRelative\">({{$root.currency.name | abbreviate}})</span> <span ng-if=\"$root.settings.useRelative\">({{\\'COMMON.UD\\' | translate}}<sub>{{$root.currency.name | abbreviate}}</sub>)</span></div></div><span class=\"item padding\" ng-if=\"!loading && !hasSentTx()\"><span class=\"gray\">{{:locale:\\'ACCOUNT.NO_TX\\'|translate}}</span></span><div class=\"item item-pending item-tx item-icon-left\" ng-repeat=\"tx in formData.tx.errors | filter: filterSentTx\" ng-init=\"error=true;\" ng-include=\"::\\'templates/wallet/item_tx.html\\'\"></div></div><div class=\"col col-20 hidden-xs hidden-sm\"> </div></div></ion-content></ion-view>');\n$templateCache.put('templates/wallet/view_wallet_tx.html','<ion-view left-buttons=\"leftButtons\" class=\"view-wallet-tx\"><ion-nav-title><span class=\"visible-xs visible-sm\" translate>MENU.TRANSACTIONS</span></ion-nav-title><ion-nav-buttons side=\"secondary\"><cs-extension-point name=\"nav-buttons\"></cs-extension-point></ion-nav-buttons><ion-content scroll=\"true\" class=\"refresher-positive-900-bg\" bind-notifier=\"{ rebind:settings.useRelative, locale:settings.locale.id}\"><ion-refresher pulling-text=\"{{:locale:\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"doUpdate(true)\"></ion-refresher><div class=\"positive-900-bg hero\"><div class=\"content\" ng-if=\"!loading\"><h1 class=\"light\"><span ng-bind-html=\":balance:rebind:formData.balance | formatAmount:{currency: $root.currency.name}\"></span></h1><h4><ng-if ng-if=\"!loading && $root.settings.expertMode\" style=\"font-style: italic;\">(<span ng-bind-html=\":balance:rebind:formData.balance | formatAmount:{useRelative:!$root.settings.useRelative, currency: $root.currency.name}\"></span>)</ng-if><ng-if ng-if=\":rebind:!enableSelectWallet\" style=\"color: lightgray;\"><span ng-if=\":rebind:formData.name\">{{:rebind:formData.name}}</span> <span ng-if=\":rebind:!formData.name && formData.uid\">{{:rebind:formData.uid}}</span> <span ng-if=\":rebind:!formData.name && !formData.uid\"><i class=\"ion-key\"></i> {{:rebind:formData.pubkey | formatPubkey}}</span></ng-if><ng-if ng-if=\":rebind:enableSelectWallet\"><a class=\"hidden-xs hidden-sm\" style=\"color: lightgray;\" title=\"{{:locale:\\'ACCOUNT.SELECT_WALLET_MODAL.TITLE\\'|translate}}\" ng-click=\"showSelectWalletPopover($event)\"><span ng-if=\":rebind:formData.name\">{{:rebind:formData.name}}</span> <span ng-if=\":rebind:!formData.name && formData.uid\">{{:rebind:formData.uid}}</span> <span ng-if=\":rebind:!formData.name && !formData.uid\"><i class=\"ion-key\"></i> {{:rebind:formData.pubkey | formatPubkey}}</span> <small><i class=\"ion-arrow-down-b\"></i></small> </a><a class=\"visible-xs visible-sm\" style=\"color: lightgray;\" title=\"{{:locale:\\'ACCOUNT.SELECT_WALLET_MODAL.TITLE\\'|translate}}\" ng-click=\"showSelectWalletModal($event)\"><span ng-if=\":rebind:formData.name\">{{:rebind:formData.name}}</span> <span ng-if=\":rebind:!formData.name && formData.uid\">{{:rebind:formData.uid}}</span> <span ng-if=\":rebind:!formData.name && !formData.uid\"><i class=\"ion-key\"></i> {{:rebind:formData.pubkey | formatPubkey}}</span> <small><i class=\"ion-arrow-down-b\"></i></small></a></ng-if></h4><div class=\"helptip-anchor-center\"><a id=\"helptip-wallet-balance\"> </a></div></div><h2 class=\"content light\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></h2></div><ng-include src=\"::\\'templates/common/qrcode.html\\'\"></ng-include><div class=\"hidden-xs hidden-sm padding text-center\" ng-if=\"!loading\"><button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"doUpdate()\" title=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\"></button> <button class=\"button button-stable button-small-padding icon ion-android-download ink\" ng-click=\"downloadHistoryFile()\" title=\"{{\\'COMMON.BTN_DOWNLOAD_ACCOUNT_STATEMENT\\' | translate}}\"></button><cs-extension-point name=\"buttons\"></cs-extension-point> <button class=\"button button-calm ink\" ng-click=\"showTransferModal()\">{{:locale:\\'COMMON.BTN_SEND_MONEY\\' | translate}}</button></div><div class=\"row no-padding\"><div class=\"col col-15 hidden-xs hidden-sm\"> </div><div class=\"col\"><div class=\"list {{::motion.ionListClass}}\"><a class=\"item item-icon-left item-icon-right ink\" ng-if=\"formData.tx.errors && formData.tx.errors.length\" ng-click=\"showTxErrors()\"><i class=\"icon ion-alert-circled\"></i> {{:locale:\\'ACCOUNT.ERROR_TX\\'|translate}}<div class=\"badge badge-assertive\">{{formData.tx.errors.length}}</div><i class=\"gray icon ion-ios-arrow-right\"></i></a><ng-if ng-if=\"formData.tx.pendings.length\"><span class=\"item item-pending item-divider\"><b class=\"ion-clock\"></b> {{:locale:\\'ACCOUNT.PENDING_TX\\'|translate}}</span><div class=\"item item-pending item-tx item-icon-left\" ng-repeat=\"tx in formData.tx.pendings\" ng-init=\"pending=true;\" ng-include=\"::\\'templates/wallet/item_tx.html\\'\"></div></ng-if><ng-if ng-if=\"formData.tx.validating.length\"><span class=\"item item-pending item-divider\"><b class=\"icon ion-checkmark\" style=\"font-size: 12px;\"></b> <b class=\"icon-secondary ion-help\" style=\"font-size: 12px; top: 2px; left: 11px;\"></b> {{:locale:\\'ACCOUNT.VALIDATING_TX\\'|translate}}</span><div class=\"item item-pending item-tx item-icon-left\" ng-repeat=\"tx in formData.tx.validating\" ng-init=\"validating=true;\" ng-include=\"::\\'templates/wallet/item_tx.html\\'\"></div></ng-if><span class=\"item item-divider\" ng-if=\"!loading\"><b class=\"icon ion-checkmark\"></b> {{:locale:\\'ACCOUNT.LAST_TX\\'|translate}} <a id=\"helptip-wallet-tx\" style=\"position: relative; bottom: 0; right: 0px;\"> </a> </span><span class=\"item padding\" ng-if=\"!loading && !formData.tx.history.length\"><span class=\"gray\">{{:locale:\\'ACCOUNT.NO_TX\\'|translate}}</span></span><div ng-repeat=\"tx in formData.tx.history\" class=\"item item-tx item-icon-left\" ng-include=\"::!tx.isUD ? \\'templates/wallet/item_tx.html\\' : \\'templates/wallet/item_ud.html\\'\"></div><div class=\"item item-text-wrap text-center\" ng-if=\"formData.tx.fromTime > 0\"><p><a ng-click=\"showMoreTx()\">{{:locale:\\'ACCOUNT.SHOW_MORE_TX\\'|translate}}</a> <span class=\"gray\" translate=\"ACCOUNT.TX_FROM_DATE\" translate-values=\"{fromTime: formData.tx.fromTime}\"></span> <span class=\"gray\">|</span> <a ng-click=\"showMoreTx(-1)\" translate>ACCOUNT.SHOW_ALL_TX</a></p></div></div></div><div class=\"col col-15 hidden-xs hidden-sm\"> </div></div></ion-content><button id=\"fab-transfer\" ng-show=\"!loading\" class=\"button button-fab button-fab-bottom-right button-energized-900 hidden-md hidden-lg drop ng-hide\" ng-click=\"showTransferModal()\"><i class=\"icon ion-android-send\"></i></button></ion-view>');\n$templateCache.put('templates/wallet/view_wallet.html','<ion-view left-buttons=\"leftButtons\" class=\"view-wallet\" id=\"wallet\"><ion-nav-title></ion-nav-title><ion-nav-buttons side=\"secondary\"><cs-extension-point name=\"nav-buttons\"></cs-extension-point><button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" id=\"helptip-wallet-options-xs\" ng-click=\"showActionsPopover($event)\"></button></ion-nav-buttons><ion-content scroll=\"true\" class=\"refresher-positive-900-bg\" bind-notifier=\"{ rebind:settings.useRelative, locale:$root.settings.locale.id}\"><ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"doUpdate(true)\"></ion-refresher><div class=\"positive-900-bg hero\" style=\"max-width: 100%; display: block\"><div class=\"content\" ng-if=\"!loading\" style=\"max-width: 100%\"><i class=\"avatar\" ng-if=\":rebind:!formData.avatar\" ng-class=\":rebind:{\\'avatar-wallet\\': !formData.isMember, \\'avatar-member\\': formData.isMember}\"></i> <i class=\"avatar\" ng-if=\":rebind:formData.avatar\" style=\"background-image: url({{:rebind:formData.avatar.src}})\"></i><h3 class=\"light\" ng-if=\":rebind:!enableSelectWallet\"><span ng-if=\":rebind:formData.name\">{{:rebind:formData.name}}</span> <span ng-if=\":rebind:!formData.name && formData.uid\">{{:rebind:formData.uid}}</span> <span ng-if=\":rebind:!formData.name && !formData.uid\"><i class=\"ion-key\"></i> {{:rebind:formData.pubkey | formatPubkey}}</span></h3><h3 class=\"light\" ng-if=\":rebind:enableSelectWallet\"><a class=\"hidden-xs hidden-sm\" style=\"color: lightgray;\" title=\"{{:locale:\\'ACCOUNT.SELECT_WALLET_MODAL.TITLE\\'|translate}}\" ng-click=\"showSelectWalletPopover($event)\"><span ng-if=\":rebind:formData.name\">{{:rebind:formData.name}}</span> <span ng-if=\":rebind:!formData.name && formData.uid\">{{:rebind:formData.uid}}</span> <span ng-if=\":rebind:!formData.name && !formData.uid\"><i class=\"ion-key\"></i> {{:rebind:formData.pubkey | formatPubkey}}</span> <small><i class=\"ion-arrow-down-b\"></i></small> </a><a class=\"visible-xs visible-sm\" style=\"color: lightgray;\" title=\"{{:locale:\\'ACCOUNT.SELECT_WALLET_MODAL.TITLE\\'|translate}}\" ng-click=\"showSelectWalletModal($event)\"><span ng-if=\":rebind:formData.name\">{{:rebind:formData.name}}</span> <span ng-if=\":rebind:!formData.name && formData.uid\">{{:rebind:formData.uid}}</span> <span ng-if=\":rebind:!formData.name && !formData.uid\"><i class=\"ion-key\"></i> {{:rebind:formData.pubkey | formatPubkey}}</span> <small><i class=\"ion-arrow-down-b\"></i></small></a></h3><h4><span class=\"assertive\" ng-if=\":rebind:(formData.name || formData.uid) && !formData.isMember\" translate>WOT.NOT_MEMBER_PARENTHESIS</span><cs-extension-point name=\"hero\"></cs-extension-point></h4></div><h4 class=\"content light\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></h4></div><ng-include src=\"::\\'templates/common/qrcode.html\\'\"></ng-include><a id=\"wallet-share-anchor\"></a><div class=\"hidden-xs hidden-sm padding text-center\" ng-if=\"!loading\"><button class=\"button button-stable button-small-padding icon ion-android-share-alt ink\" ng-disabled=\"loading\" ng-click=\"showSharePopover($event)\" title=\"{{\\'COMMON.BTN_SHARE\\' | translate}}\"></button> <button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"doUpdate()\" title=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\"></button><cs-extension-point name=\"buttons\"></cs-extension-point> <button id=\"helptip-wallet-options\" class=\"button button-stable icon-right ink\" ng-click=\"showActionsPopover($event)\"> <i class=\"icon ion-android-more-vertical\"></i> {{:locale:\\'COMMON.BTN_OPTIONS\\' | translate}}</button><div ng-if=\"formData.requirements.needRenew\"><br><button class=\"button button-raised button-stable ink\" ng-click=\"renewMembership()\"><i class=\"icon ion-alert-circled assertive\"></i> <span class=\"assertive\">{{:locale:\\'ACCOUNT.BTN_MEMBERSHIP_RENEW\\' | translate}}</span></button></div></div><div class=\"visible-xs visible-sm padding text-center\" ng-if=\"!loading && formData.requirements.needRenew\"><button class=\"button button-raised icon-left button-stable button-small-padding ink\" ng-click=\"renewMembership()\"><i class=\"icon ion-loop assertive\"></i> <span class=\"assertive\">{{:locale:\\'ACCOUNT.BTN_MEMBERSHIP_RENEW\\' | translate}}</span></button></div><div class=\"row no-padding\"><div class=\"col col-20 hidden-xs hidden-sm\"> </div><div class=\"col\"><div class=\"list {{::motion.ionListClass}}\" ng-hide=\"loading\"><span class=\"item item-divider\" translate>WOT.GENERAL_DIVIDER</span><div id=\"helptip-wallet-pubkey\" class=\"item item-icon-left item-text-wrap ink\" on-hold=\"copy(formData.pubkey)\" copy-on-click=\"{{:rebind:formData.pubkey}}\"><i class=\"icon ion-key\"></i> <span>{{:locale:\\'COMMON.PUBKEY\\'|translate}}</span><h4 id=\"pubkey\" class=\"dark\">{{:rebind:formData.pubkey}}</h4></div><ion-item class=\"item-icon-left\" ng-if=\":rebind:formData.sigDate||formData.uid\"><i class=\"icon ion-calendar\"></i> <span translate>COMMON.UID</span><h5 class=\"dark\" ng-if=\":rebind:formData.sigDate\"><span translate>WOT.REGISTERED_SINCE</span> {{:rebind:formData.sigDate | medianDate}}</h5><span class=\"badge badge-stable\">{{:rebind:formData.uid}}</span></ion-item><a id=\"helptip-wallet-certifications\" class=\"item item-icon-left item-icon-right item-text-wrap ink\" ng-if=\"formData.isMember||formData.requirements.pendingMembership||!formData.requirements.needSelf\" ng-click=\"showCertifications()\"><i class=\"icon ion-ribbon-b\"></i> <b ng-if=\"formData.requirements.isSentry\" class=\"ion-star icon-secondary\" style=\"color: yellow; font-size: 16px; left: 25px; top: -7px;\"></b> {{:locale:\\'ACCOUNT.CERTIFICATION_COUNT\\'|translate}}<cs-badge-certification requirements=\"formData.requirements\" parameters=\"::currency.parameters\"></cs-badge-certification><i class=\"gray icon ion-ios-arrow-right\"></i> </a><a id=\"helptip-wallet-given-certifications\" class=\"item item-icon-left item-text-wrap item-icon-right ink visible-xs visible-sm\" ng-if=\"formData.isMember\" ng-click=\"showGivenCertifications()\"><i class=\"icon ion-ribbon-a\"></i> <span translate>WOT.GIVEN_CERTIFICATIONS.SENT</span> <i class=\"gray icon ion-ios-arrow-right\"></i> </a><a class=\"item item-icon-left item-icon-right ink\" ng-click=\"showTxHistory()\"><i class=\"icon ion-card\"></i> <span translate>WOT.ACCOUNT_OPERATIONS</span> <i class=\"gray icon ion-ios-arrow-right\"></i> </a><span class=\"item item-divider\" ng-if=\"formData.events.length\">{{:locale:\\'ACCOUNT.EVENTS\\' | translate}}</span><div class=\"item item-text-wrap item-icon-left item-wallet-event\" ng-repeat=\"event in formData.events\"><i class=\"icon\" ng-class=\"{\\'ion-information-circled royal\\': event.type==\\'info\\',\\'ion-alert-circled assertive\\': event.type==\\'warn\\'||event.type==\\'error\\',\\'assertive\\': event.type==\\'error\\',\\'ion-clock\\': event.type==\\'pending\\'}\"></i> <span trust-as-html=\"event.message | translate:event.messageParams\"></span></div><cs-extension-point name=\"general\"></cs-extension-point><cs-extension-point name=\"after-general\"></cs-extension-point></div></div><div class=\"col col-20 hidden-xs hidden-sm\"> </div></div></ion-content></ion-view>');\n$templateCache.put('templates/wot/item_certification.html','<i class=\"item-image\" ng-if=\"!cert.avatar\" ng-class=\"{\\'ion-card\\': !cert.isMember, \\'ion-person\\': cert.isMember}\"></i> <i class=\"item-image avatar\" ng-if=\"cert.avatar\" style=\"background-image: url({{::cert.avatar.src}})\"></i> <span ng-if=\"cert.isMember\"><h3><i class=\"icon ion-clock\" ng-if=\"cert.pending\"></i> <span class=\"positive\">{{::cert.name||cert.uid}}</span></h3><h4 class=\"gray\"><i class=\"ion-key\"></i> {{::cert.pubkey | formatPubkey}} <span class=\"gray\">| {{::cert.time|medianDate}}</span> <span class=\"gray\" ng-if=\"$root.settings.expertMode\">| {{::cert.pending ? \\'WOT.SIGNED_ON_BLOCK\\' : \\'WOT.WRITTEN_ON_BLOCK\\' | translate:cert}}</span></h4></span><span ng-if=\"!cert.isMember\"><h3><i class=\"icon ion-clock\" ng-if=\"cert.pending\"></i> <span ng-if=\"cert.uid\" class=\"dark\">{{::cert.name||cert.uid}} </span><span ng-if=\"!cert.uid\" class=\"gray\"><i class=\"ion-key\"></i> {{::cert.pubkey | formatPubkey}}</span></h3><h5 class=\"assertive\">{{::\\'WOT.NOT_MEMBER_PARENTHESIS\\'|translate}}</h5><h4 class=\"gray\"><span ng-if=\"cert.uid\"><i class=\"ion-key\"></i> {{::cert.pubkey | formatPubkey}} </span><span class=\"gray\">| {{::cert.time|medianDate}}</span> <span class=\"gray\" ng-if=\"$root.settings.expertMode\">| {{::cert.pending ? \\'WOT.SIGNED_ON_BLOCK\\' : \\'WOT.WRITTEN_ON_BLOCK\\' | translate:cert}}</span></h4></span><div class=\"badge badge-stable\" ng-class=\"{\\'badge-energized\\': cert.willExpire}\" ng-if=\"cert.expiresIn\">{{::cert.expiresIn | formatDurationTo}}</div><div class=\"badge badge-assertive\" ng-if=\"!cert.expiresIn\">{{::\\'WOT.EXPIRED\\' | translate}}</div>');\n$templateCache.put('templates/wot/item_content_identity.html','<i ng-if=\"::!item.avatar\" class=\"item-image icon ion-person\"></i> <i ng-if=\"::item.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::item.avatar.src}})\"></i><h2><ng-if ng-if=\"::item.name||item.uid\" ng-bind-html=\"::item.name||item.uid\"></ng-if><ng-if ng-if=\"::!item.name && !item.uid\">{{::item.pubkey|formatPubkey}}</ng-if></h2><h4 class=\"gray\" ng-class=\"{\\'pull-right\\': !smallscreen}\" ng-if=\"::item.sigDate\"><i class=\"ion-clock\"></i> {{::\\'WOT.LOOKUP.REGISTERED\\' | translate:item }}</h4><h4 class=\"gray\" ng-class=\"{\\'pull-right\\': !smallscreen}\" ng-if=\"item.memberDate\"><i class=\"ion-clock\"></i> {{::\\'WOT.LOOKUP.MEMBER_FROM\\' | translate:item}}</h4><h4 class=\"gray\"><span class=\"positive\" ng-if=\"::item.name && item.uid\"><i class=\"ion-person\"></i> {{::item.uid}} </span><b class=\"ion-key\"></b> {{::item.pubkey | formatPubkey}} <span ng-if=\"::(!item.uid && !item.revoked)\" class=\"assertive\" translate>WOT.NOT_MEMBER_PARENTHESIS</span> <span ng-if=\"::item.revoked\" class=\"assertive\" translate>WOT.IDENTITY_REVOKED_PARENTHESIS</span></h4><h4 ng-if=\"::item.events||item.tags\"><span ng-repeat=\"event in ::item.events\" class=\"assertive\"><i class=\"ion-alert-circled\" ng-if=\"::!item.valid\"></i> <span ng-bind-html=\"::event.message|translate:event.messageParams\"></span> </span><span ng-if=\"::item.tags\" class=\"dark\"><ng-repeat ng-repeat=\"tag in ::item.tags\">#<ng-bind-html ng-bind-html=\"::tag\"></ng-bind-html></ng-repeat></span></h4>');\n$templateCache.put('templates/wot/items_given_certifications.html','<div class=\"list given-certifications\" ng-class=\"::motions.givenCertifications.ionListClass\"><span class=\"item item-divider hidden-xs\"><span translate>WOT.GIVEN_CERTIFICATIONS.SUMMARY</span></span><div id=\"helptip-certs-stock\" class=\"item item-icon-left item-text-wrap ink\"><i class=\"icon ion-ribbon-a\"></i> <span translate>WOT.GIVEN_CERTIFICATIONS.SENT</span><cs-badge-given-certification identity=\"formData\" parameters=\"$root.currency.parameters\"></cs-badge-given-certification></div><div class=\"item item-icon-left item-text-wrap ink\" ng-if=\"formData.given_cert_error.length\"><i class=\"icon ion-alert-circled\"></i> <span translate>WOT.GIVEN_CERTIFICATIONS.ERROR</span> <span class=\"badge badge-assertive\">{{formData.given_cert_error.length}}</span></div><span class=\"item item-divider\" ng-if=\"formData.given_cert_pending.length\"><span translate>WOT.GIVEN_CERTIFICATIONS.PENDING_LIST</span><div class=\"badge item-note\" style=\"text-align: right !important;\" translate>WOT.NOT_WRITTEN_EXPIRE_IN</div></span><a class=\"item item-avatar ink\" ng-repeat=\"cert in formData.given_cert_pending\" ui-sref=\"app.wot_identity({pubkey:cert.pubkey, uid:cert.uid})\" ng-include=\"::\\'templates/wot/item_certification.html\\'\"></a><span class=\"item item-divider\"><span translate>WOT.GIVEN_CERTIFICATIONS.LIST</span><div class=\"badge item-note\" translate>WOT.EXPIRE_IN</div></span><span class=\"item gray\" ng-if=\"!formData.given_cert.length\" translate>WOT.NO_GIVEN_CERTIFICATION </span><a class=\"item item-avatar ink\" ng-repeat=\"cert in formData.given_cert\" ui-sref=\"app.wot_identity({pubkey:cert.pubkey, uid:cert.uid})\" ng-include=\"::\\'templates/wot/item_certification.html\\'\"></a></div>');\n$templateCache.put('templates/wot/items_received_certifications.html','<div class=\"list certifications\" ng-class=\"::motions.receivedCertifications.ionListClass\"><span class=\"item item-divider hidden-xs\"><span translate>WOT.CERTIFICATIONS.SUMMARY</span></span><div id=\"helptip-received-certs\" class=\"item item-icon-left item-text-wrap ink\"><i class=\"icon ion-ribbon-b\"></i> <b ng-if=\"formData.requirements.isSentry\" class=\"ion-star icon-secondary\" style=\"color: yellow; font-size: 16px; left: 25px; top: -7px;\"></b> <span translate>WOT.CERTIFICATIONS.RECEIVED</span><h4 class=\"gray\" ng-if=\"formData.requirements.isSentry\" translate>WOT.CERTIFICATIONS.SENTRY_MEMBER</h4><cs-badge-certification cs-id=\"helptip-wot-view-certifications-count\" requirements=\"formData.requirements\" parameters=\"$root.currency.parameters\"></cs-badge-certification></div><div class=\"item item-icon-left item-text-wrap ink\" ng-if=\"formData.received_cert_error.length\"><i class=\"icon ion-alert-circled\"></i> <span translate>WOT.CERTIFICATIONS.ERROR</span> <span class=\"badge badge-assertive\">{{formData.received_cert_error.length}}</span></div><span class=\"item item-divider\" ng-if=\"formData.received_cert_pending.length\"><span translate>WOT.CERTIFICATIONS.PENDING_LIST</span><div class=\"badge item-note\" style=\"text-align: right !important;\" translate>WOT.NOT_WRITTEN_EXPIRE_IN</div></span><a class=\"item item-avatar ink\" ng-repeat=\"cert in formData.received_cert_pending\" ui-sref=\"app.wot_identity({pubkey:cert.pubkey, uid:cert.uid})\" ng-include=\"::\\'templates/wot/item_certification.html\\'\"></a><span class=\"item item-divider\"><span translate>WOT.CERTIFICATIONS.LIST</span><div class=\"badge item-note\" translate>WOT.EXPIRE_IN</div></span><span class=\"item gray\" ng-if=\"!formData.received_cert.length\" translate>WOT.NO_CERTIFICATION</span> <a class=\"item item-avatar ink\" ng-repeat=\"cert in formData.received_cert\" ui-sref=\"app.wot_identity({pubkey:cert.pubkey, uid:cert.uid})\" ng-include=\"::\\'templates/wot/item_certification.html\\'\"></a></div>');\n$templateCache.put('templates/wot/lookup_form.html','<div class=\"lookupForm\"><div class=\"item no-padding\"><div class=\"double-padding-x padding-top-xs item-text-wrap\" ng-if=\"::allowMultiple\" style=\"height: 36px;\"><div class=\"gray padding-top\" ng-if=\"!selection.length && parameters.help\">{{::parameters.help|translate}}</div><div ng-repeat=\"identity in selection track by identity.id\" class=\"button button-small button-text button-stable button-icon-event ink\" ng-class=\"{\\'button-text-positive\\': identity.selected}\"><span ng-bind-html=\"identity.name||identity.uid||(identity.pubkey|formatPubkey)\"></span> <i class=\"icon ion-close\" ng-click=\"removeSelection(identity, $event)\"> </i></div></div><div class=\"item-input\"><i class=\"icon ion-search placeholder-icon\"></i> <input type=\"text\" class=\"visible-xs visible-sm\" placeholder=\"{{\\'WOT.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"doSearch()\" on-return=\"doSearchText()\" select-on-click> <input type=\"text\" class=\"hidden-xs hidden-sm\" id=\"{{wotSearchTextId}}\" placeholder=\"{{\\'WOT.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" on-return=\"doSearchText()\"><div class=\"helptip-anchor-center\"><a id=\"helptip-wot-search-text\"></a></div></div></div><div class=\"padding-top padding-xs padding-sm\" style=\"display: block; height: 60px;\" ng-class=\"::{\\'hidden-xs hidden-sm\\': !showResultLabel}\"><div class=\"pull-left\" ng-if=\"!search.loading && showResultLabel\"><ng-if ng-if=\"search.type==\\'newcomers\\'\"><h4 translate>WOT.LOOKUP.NEWCOMERS</h4><small class=\"gray no-padding\" ng-if=\"search.total\">{{\\'WOT.LOOKUP.NEWCOMERS_COUNT\\'|translate:{count: search.total} }}</small></ng-if><ng-if ng-if=\"search.type==\\'pending\\'\"><h4 translate>WOT.LOOKUP.PENDING</h4><small class=\"gray no-padding\" ng-if=\"search.total\">{{\\'WOT.LOOKUP.PENDING_COUNT\\'|translate:{count: search.total} }}</small></ng-if><h4 ng-if=\"search.type==\\'text\\'\"><span translate>COMMON.RESULTS_LIST</span> <small class=\"gray\" ng-if=\"search.total\">({{search.total}})</small></h4></div><div class=\"pull-right hidden-xs hidden-sm\"><a ng-if=\"enableFilter\" class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-positive\\': search.type==\\'newcomers\\'}\" ng-click=\"doGetNewcomers()\"><i class=\"icon ion-person-stalker\"></i> {{\\'WOT.LOOKUP.BTN_NEWCOMERS\\' | translate}} </a><a ng-if=\"enableFilter\" class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-positive\\': search.type==\\'pending\\'}\" ng-click=\"doGetPending()\" class=\"badge-balanced\"><i class=\"icon ion-clock\"></i> {{\\'WOT.LOOKUP.BTN_PENDING\\' | translate}} </a><a ng-if=\"enableWallets\" class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-positive\\': search.type==\\'wallets\\'}\" ng-click=\"doGetWallets()\" class=\"badge-balanced\"><i class=\"icon ion-card\" style=\"left: -1px; top: 4px; position: relative; padding-left: 3px; padding-right: 3px;\"></i> <b class=\"icon-secondary ion-card\" style=\"left: 10px; top: -4px; font-size: 14px;\"></b> {{\\'MENU.WALLETS\\' | translate}}</a><cs-extension-point name=\"filter-buttons\"></cs-extension-point> <button class=\"button button-small button-stable ink\" ng-click=\"doSearch()\">{{\\'COMMON.BTN_SEARCH\\' | translate}}</button> <button class=\"button button-small button-positive {{parameters.okType}} ink\" ng-if=\"::allowMultiple\" ng-disabled=\"!selection.length\" ng-click=\"next()\">{{parameters.okText||\\'COMMON.BTN_NEXT\\' | translate}}</button></div></div><div class=\"text-center padding-top\" ng-if=\"search.loading\"><p class=\"gray\" ng-if=\"::$root.currency.initPhase\" translate>WOT.SEARCH_INIT_PHASE_WARNING</p><ion-spinner icon=\"android\"></ion-spinner></div><ng-if ng-if=\"!search.loading\"><div class=\"assertive padding\" ng-if=\"!search.results.length\"><span ng-if=\"search.type==\\'text\\'\" translate>COMMON.SEARCH_NO_RESULT</span> <span ng-if=\"search.type==\\'pending\\'\" translate>WOT.LOOKUP.NO_PENDING</span> <span ng-if=\"search.type==\\'newcomers\\'\" translate>WOT.LOOKUP.NO_NEWCOMERS</span></div><div ng-if=\"::!allowMultiple\" class=\"list {{::motion.ionListClass}}\"><div ng-repeat=\"item in search.results track by item.id\" id=\"helptip-wot-search-result-{{$index}}\" ng-class=\"::{\\'item-avatar item-icon-right ink\\': !item.divider, \\'item-divider \\': item.divider}\" class=\"item item-border-large {{::item.ionItemClass}}\" ng-click=\"::select(item)\"><span ng-if=\"::item.divider\">{{::(\\'WOT.SEARCH.DIVIDER_\\' + item.index)|upper|translate}}</span><ng-include ng-if=\"::!item.divider\" src=\"item.templateUrl || \\'templates/wot/item_content_identity.html\\'\"></ng-include><i ng-if=\"::!item.divider\" class=\"icon ion-ios-arrow-right\"></i></div></div><div ng-if=\"::allowMultiple\" class=\"list {{::motion.ionListClass}}\"><ion-checkbox ng-repeat=\"item in search.results track by item.id\" ng-model=\"item.checked\" class=\"item item-border-large item-avatar ink\" ng-click=\"toggleCheck($index, $event)\"><ng-include src=\"::\\'templates/wot/item_content_identity.html\\'\"></ng-include></ion-checkbox></div><ion-infinite-scroll ng-if=\"search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"20%\"></ion-infinite-scroll></ng-if></div>');\n$templateCache.put('templates/wot/lookup_lg.html','<ion-view><ion-nav-title>{{\\'MENU.WOT\\' | translate}}</ion-nav-title><ion-nav-buttons side=\"secondary\"><button class=\"button button-icon button-clear visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\"><i class=\"icon ion-android-funnel\"></i></button></ion-nav-buttons><ion-content class=\"padding no-padding-x no-padding-sm\" scroll=\"true\"><cs-extension-point name=\"top\"></cs-extension-point><ng-include src=\"::\\'templates/wot/lookup_form.html\\'\"></ng-include></ion-content></ion-view>');\n$templateCache.put('templates/wot/lookup_popover_actions.html','<ion-popover-view class=\"fit has-header visible-sm visible-xs\"><ion-header-bar><h1 class=\"title\" translate>COMMON.POPOVER_FILTER_TITLE</h1></ion-header-bar><ion-content scroll=\"false\"><div class=\"list item-text-wrap\"><a class=\"item item-icon-left ink\" ng-if=\"enableWallets\" ng-click=\"doGetWallets()\"><i class=\"icon ion-card\"></i> {{\\'MENU.WALLETS\\' | translate}} </a><a class=\"item item-icon-left ink\" ng-click=\"doGetNewcomers()\"><i class=\"icon ion-person\"></i> {{\\'WOT.LOOKUP.BTN_NEWCOMERS\\' | translate}} </a><a class=\"item item-icon-left ink\" ng-click=\"doGetPending()\"><i class=\"icon ion-clock\"></i> {{\\'WOT.LOOKUP.BTN_PENDING\\' | translate}}</a></div></ion-content></ion-popover-view>');\n$templateCache.put('templates/wot/lookup.html','<ion-view left-buttons=\"leftButtons\"><ion-tabs class=\"tabs-positive tabs-icon-top\"><ion-tab title=\"{{\\'WOT.LOOKUP.TITLE\\'|translate}}\" icon=\"ion-person-stalker\" ui-sref=\"app.wot_lookup.tab_search\"><ion-nav-view name=\"tab\"></ion-nav-view></ion-tab><cs-extension-point name=\"tabs\"></cs-extension-point></ion-tabs></ion-view>');\n$templateCache.put('templates/wot/modal_lookup.html','<ion-modal-view id=\"wotLookup\" class=\"modal-full-height\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear\" ng-click=\"closeModal()\" translate=\"\">COMMON.BTN_CANCEL</button><h1 class=\"title hidden-xs\">{{::parameters.title?parameters.title:\\'WOT.MODAL.TITLE\\'|translate}}</h1><button class=\"button button-clear icon-right visible-xs ink\" ng-if=\"allowMultiple && selection.length\" ng-click=\"closeModal(selection)\">{{::parameters.okText||\\'COMMON.BTN_NEXT\\' | translate}} <i ng-if=\"::!parameters.okText||parameters.okIcon\" class=\"icon {{::parameters.okIcon||\\'ion-ios-arrow-right\\'}}\"></i></button></ion-header-bar><ion-content class=\"padding no-padding-xs no-padding-sm\" scroll=\"true\"><div class=\"visible-xs visible-sm text-right stable-bg stable\"><button class=\"button button-icon button-small-padding dark ink\" ng-click=\"showActionsPopover($event)\"><i class=\"icon ion-android-funnel\"></i></button></div><ng-include src=\"::\\'templates/wot/lookup_form.html\\'\"></ng-include></ion-content></ion-modal-view>');\n$templateCache.put('templates/wot/modal_select_pubkey_identity.html','<ion-modal-view id=\"transfer\" class=\"modal-full-height modal-transfer\"><ion-header-bar class=\"bar-positive\"><button class=\"button button-clear\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button><h1 class=\"title\" translate>ACCOUNT.SELECT_IDENTITY_MODAL.TITLE</h1></ion-header-bar><ion-content scroll=\"true\"><div class=\"padding\"><p trust-as-html=\"\\'ACCOUNT.SELECT_IDENTITY_MODAL.HELP\\'|translate:{pubkey: pubkey}\"></p></div><ion-list><ion-item class=\"item-avatar item-icon-right\" ng-repeat=\"item in identities\" ng-click=\"closeModal(item)\"><i class=\"item-image icon ion-person\"></i><h2>{{item.uid}}</h2><h4 class=\"gray\"><b class=\"ion-key\"></b> {{::item.pubkey | formatPubkey}} <span ng-if=\"::!item.revoked && !item.pendingRevocation && !item.isMember\" class=\"assertive\" translate>WOT.NOT_MEMBER_PARENTHESIS</span> <span ng-if=\"::item.revoked || item.pendingRevocation\" class=\"assertive bold\" translate>WOT.IDENTITY_REVOKED_PARENTHESIS</span> <span ng-if=\"::item.meta.invalid\" class=\"assertive\" translate>ERROR.WOT_PENDING_INVALID_BLOCK_HASH</span></h4><h4 class=\"dark\" ng-if=\"::item.meta.time\"><i class=\"ion-calendar\"></i> <span translate>WOT.REGISTERED_SINCE</span> {{::item.meta.time|medianDate}}</h4><ng-if ng-if=\"::!item.revoked && !item.pendingRevocation && (item.certificationCount || item.pendingCertificationCount)\"><cs-badge-certification requirements=\"item\" parameters=\"$root.currency.parameters\"></cs-badge-certification><div class=\"gray badge badge-secondary hidden-xs\"><span translate>ACCOUNT.CERTIFICATION_COUNT</span></div></ng-if><i class=\"icon ion-ios-arrow-right\"></i></ion-item></ion-list></ion-content></ion-modal-view>');\n$templateCache.put('templates/wot/tabs/tab_given_certifications.html','<ion-view><ion-nav-buttons side=\"secondary\"><button class=\"button button-icon button-clear icon ion-loop\" ng-click=\"doUpdate()\"></button></ion-nav-buttons><ion-content ng-init=\"motions.receivedCertifications=false; motions.avatar=false\"><div class=\"center padding\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></div><ng-include src=\"::\\'templates/wot/items_given_certifications.html\\'\"></ng-include></ion-content><div class=\"visible-xs visible-sm\"><button id=\"fab-select-certify\" class=\"button button-fab button-fab-bottom-right button-energized-900 spin\" ng-if=\"canSelectAndCertify || $root.tour\" ng-click=\"selectAndCertify()\"><i class=\"icon ion-plus\"></i></button></div></ion-view>');\n$templateCache.put('templates/wot/tabs/tab_lookup.html','<ion-view><ion-nav-buttons side=\"secondary\"><cs-extension-point name=\"nav-buttons\"></cs-extension-point><button class=\"button button-icon button-clear\" ng-click=\"showActionsPopover($event)\"><i class=\"icon ion-android-funnel\"></i></button></ion-nav-buttons><ion-content><ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"doSearch()\"></ion-refresher><cs-extension-point name=\"buttons\"></cs-extension-point><ng-include src=\"::\\'templates/wot/lookup_form.html\\'\"></ng-include></ion-content></ion-view>');\n$templateCache.put('templates/wot/tabs/tab_received_certifications.html','<ion-view><ion-nav-buttons side=\"secondary\"><button class=\"button button-icon button-clear icon ion-loop\" ng-click=\"doUpdate()\"></button></ion-nav-buttons><ion-content ng-init=\"motions.givenCertifications=false; motions.avatar=false;\"><div class=\"center padding\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></div><ng-include src=\"::\\'templates/wot/items_received_certifications.html\\'\"></ng-include></ion-content><div class=\"visible-xs visible-sm\"><button id=\"fab-certify\" class=\"button button-fab button-fab-bottom-right button-energized-900 spin\" ng-click=\"certify()\" ng-if=\"(formData.hasSelf && canCertify && !alreadyCertified) || $root.tour\"><i class=\"icon ion-ribbon-b\"></i></button></div></ion-view>');\n$templateCache.put('templates/wot/view_certifications.html','<ion-view left-buttons=\"leftButtons\"><ion-nav-title><span class=\"visible-xs visible-sm\">{{::formData.name||formData.uid}}</span> <span class=\"hidden-xs hidden-sm\" ng-if=\"!loading\" translate=\"WOT.CERTIFICATIONS.TITLE\" translate-values=\"{uid: formData.name || formData.uid}\"></span></ion-nav-title><ion-nav-buttons side=\"secondary\"><cs-extension-point name=\"nav-buttons\"></cs-extension-point></ion-nav-buttons><ion-content class=\"certifications certifications-lg\"><ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"doUpdate()\"></ion-refresher><div class=\"hidden-xs hidden-sm text-center padding\"><button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"doUpdate()\" title=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\"></button> <button id=\"helptip-certs-certify\" class=\"button button-raised button-calm icon-left ion-ribbon-b\" ng-if=\"canCertify\" ng-click=\"certify()\" ng-disabled=\"disableCertifyButton\">{{\\'WOT.BTN_CERTIFY\\' | translate}}</button> <button id=\"helptip-certs-select-certify\" class=\"button button-raised button-calm icon-left\" ng-if=\"canSelectAndCertify\" ng-click=\"selectAndCertify()\">{{\\'WOT.BTN_SELECT_AND_CERTIFY\\' | translate}}</button><cs-extension-point name=\"buttons\"></cs-extension-point></div><div class=\"center padding\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></div><div class=\"row responsive-sm responsive-md responsive-lg\"><div class=\"col no-padding\" ng-if=\"motions.receivedCertifications.enable\"><ng-include src=\"::\\'templates/wot/items_received_certifications.html\\'\"></ng-include></div><div class=\"col col-20 col-avatar hidden-xs hidden-sm hidden-md no-padding\" style=\"margin-top: 100px;\" ng-if=\"motions.avatar.enable\"><div class=\"row no-padding\" ng-class=\"::motions.avatar.ionListClass\"><div class=\"col text-center no-padding gray\" style=\"margin-top: 30px;\"><i class=\"icon ion-arrow-right-a\" style=\"font-size:30px\"></i></div><div class=\"col text-center no-padding\"><a style=\"text-decoration: none;\" ui-sref=\"app.wot_identity({pubkey: formData.pubkey, uid: formData.uid})\"><i class=\"avatar avatar-large\" ng-if=\"!formData.avatar\" ng-class=\"{\\'avatar-wallet\\': !formData.isMember, \\'avatar-member\\': formData.isMember}\"></i> <i class=\"avatar avatar-large\" ng-if=\"formData.avatar\" style=\"background-image: url({{::formData.avatar.src}})\"></i><h4 class=\"text-center\" ng-class=\"{\\'positive\\': formData.isMember, \\'gray\\': !formData.isMember}\">{{::formData.name||formData.uid}}</h4><h5 class=\"text-center gray\"><i class=\"icon ion-key\"></i> {{formData.pubkey|formatPubkey}}</h5><h5 class=\"assertive\"><span ng-if=\"::(formData.name || formData.uid) && !formData.isMember && !revoked\" translate>WOT.NOT_MEMBER_PARENTHESIS</span> <b ng-if=\"::(formData.name || formData.uid) && !formData.isMember && revoked\" translate>WOT.IDENTITY_REVOKED_PARENTHESIS</b> <b ng-if=\"::(formData.name || formData.uid) && formData.isMember && revoked\" translate>WOT.MEMBER_PENDING_REVOCATION_PARENTHESIS</b></h5></a></div><div class=\"col text-center no-padding gray\" style=\"margin-top: 30px;\"><i class=\"icon ion-arrow-right-a\" style=\"font-size:30px\"></i></div></div></div><div class=\"col no-padding\" ng-if=\"motions.givenCertifications.enable\"><ng-include src=\"::\\'templates/wot/items_given_certifications.html\\'\"></ng-include></div></div></ion-content><div class=\"visible-xs visible-sm\"><button id=\"fab-certify\" class=\"button button-fab button-fab-bottom-right button-energized-900 spin hidden-readonly\" ng-if=\"canCertify && !alreadyCertified\" ng-click=\"certify()\"><i class=\"icon ion-ribbon-b\"></i></button> <button id=\"fab-select-certify\" class=\"button button-fab button-fab-bottom-right button-energized-900 spin hidden-readonly\" ng-if=\"canSelectAndCertify\" ng-click=\"selectAndCertify()\"><i class=\"icon ion-plus\"></i></button></div></ion-view>');\n$templateCache.put('templates/wot/view_identity_tx.html','<ion-view left-buttons=\"leftButtons\" class=\"view-identity-tx\"><ion-nav-title><span class=\"visible-xs visible-sm\" ng-if=\"!loading\"><span ng-if=\"formData.name || formData.uid\">{{formData.name || formData.uid}} </span><span ng-if=\"!formData.name && !formData.uid\"><i class=\"ion-key\"></i> {{formData.pubkey|formatPubkey}}</span> </span><span class=\"hidden-xs hidden-sm\" ng-if=\"!loading\"><ng-if ng-if=\"formData.name || formData.uid\">{{\\'WOT.OPERATIONS.TITLE\\'|translate: {uid: formData.name || formData.uid} }}</ng-if><ng-if ng-if=\"!formData.name && !formData.uid\"><i class=\"ion-key\"></i> {{formData.pubkey|formatPubkey}} {{\\'WOT.OPERATIONS.TITLE\\'|translate}}</ng-if></span></ion-nav-title><ion-content scroll=\"true\"><ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"doUpdate(true)\"></ion-refresher><div class=\"hidden-xs hidden-sm padding text-center\"><button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"doUpdate()\" title=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\"></button> <button class=\"button button-stable button-small-padding icon ion-android-download ink\" ng-click=\"downloadHistoryFile()\" title=\"{{\\'COMMON.BTN_DOWNLOAD_ACCOUNT_STATEMENT\\' | translate}}\"></button><cs-extension-point name=\"buttons\"></cs-extension-point></div><div class=\"center padding\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></div><div class=\"list {{motion.ionListClass}}\" ng-if=\"!loading\"><div class=\"row\"><div class=\"col col-15 hidden-xs hidden-sm\"> </div><div class=\"col\"><div class=\"item item-tx item-divider\">{{:locale:\\'ACCOUNT.BALANCE_ACCOUNT\\'|translate}}<div class=\"badge item-note\" ng-class=\":balance:{\\'badge-assertive\\': formData.balance <= 0, \\'badge-balanced\\': formData.balance > 0 }\" ng-bind-html=\":balance:formData.balance|formatAmount:{currency: $root.currency.name}\"></div><div class=\"badge badge-secondary\" ng-if=\"$root.settings.expertMode\">(<span ng-bind-html=\":balance:formData.balance| formatAmount: {useRelative: !$root.settings.useRelative, currency: $root.currency.name} \"></span>)</div></div><div class=\"item item-icon-left\" ng-if=\"formData.tx.errors.length\"><i class=\"icon ion-alert-circled\"></i> {{:locale:\\'ACCOUNT.ERROR_TX\\'|translate}}<div class=\"badge badge-assertive\">{{formData.tx.errors.length}}</div></div><ng-if ng-if=\"formData.tx.pendings.length\"><span class=\"item item-pending item-divider\"><i class=\"ion-clock\"></i> {{:locale:\\'ACCOUNT.PENDING_TX\\'|translate}}</span><div class=\"item item-pending item-tx item-icon-left\" ng-repeat=\"tx in formData.tx.pendings\" ng-init=\"pending=true;\" ng-include=\"::\\'templates/wallet/item_tx.html\\'\"></div></ng-if><ng-if ng-if=\"formData.tx.validating.length\"><span class=\"item item-pending item-divider\">{{:locale:\\'ACCOUNT.VALIDATING_TX\\'|translate}}</span><div class=\"item item-pending item-tx item-icon-left\" ng-repeat=\"tx in formData.tx.validating\" ng-init=\"validating=true;\" ng-include=\"::\\'templates/wallet/item_tx.html\\'\"></div></ng-if><span class=\"item item-divider\" ng-if=\"!loading\">{{:locale:\\'ACCOUNT.LAST_TX\\'|translate}} <a id=\"helptip-wallet-tx\" style=\"position: relative; bottom: 0; right: 0px;\"> </a></span><div ng-repeat=\"tx in formData.tx.history\" class=\"item item-tx item-icon-left\" ng-include=\"::!tx.isUD ? \\'templates/wallet/item_tx.html\\' : \\'templates/wallet/item_ud.html\\'\"></div><div class=\"item item-text-wrap text-center\" ng-if=\"formData.tx.fromTime > 0\"><p><a ng-click=\"showMoreTx()\">{{:locale:\\'ACCOUNT.SHOW_MORE_TX\\'|translate}}</a> <span class=\"gray\" translate=\"ACCOUNT.TX_FROM_DATE\" translate-values=\"{fromTime: formData.tx.fromTime}\"></span> <span class=\"gray\">|</span> <a ng-click=\"showMoreTx(-1)\" translate>ACCOUNT.SHOW_ALL_TX</a></p></div></div><div class=\"col col-15 hidden-xs hidden-sm\"> </div></div></div></ion-content></ion-view>');\n$templateCache.put('templates/wot/view_identity.html','<ion-view left-buttons=\"leftButtons\" class=\"view-identity\"><ion-nav-title></ion-nav-title><ion-content scroll=\"true\" ng-class=\"{\\'member\\': !loading && formData.isMember}\"><ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"doUpdate(true)\"></ion-refresher><div class=\"hero\"><div class=\"content\" ng-if=\"!loading\"><i class=\"avatar\" ng-if=\":rebind:!formData.avatar\" ng-class=\"{\\'avatar-wallet\\': !formData.isMember, \\'avatar-member\\': formData.isMember}\"></i> <i class=\"avatar\" ng-if=\":rebind:formData.avatar\" style=\"background-image: url({{::formData.avatar.src}})\"></i><ng-if ng-if=\":rebind:formData.name\"><h3 class=\"light\">{{::formData.name}}</h3></ng-if><ng-if ng-if=\":rebind:!formData.name\"><h3 class=\"light\" ng-if=\":rebind:formData.uid\">{{:rebind:formData.uid}}</h3><h3 class=\"light\" ng-if=\":rebind:!formData.uid\"><i class=\"ion-key\"></i> {{:rebind:formData.pubkey | formatPubkey}}</h3></ng-if><h4><ng-if class=\"assertive\" ng-if=\":rebind:(formData.name || formData.uid) && !formData.isMember && revoked\" translate>WOT.IDENTITY_REVOKED_PARENTHESIS</ng-if><ng-if class=\"assertive\" ng-if=\":rebind:(formData.name || formData.uid) && formData.isMember && revoked\" translate>WOT.MEMBER_PENDING_REVOCATION_PARENTHESIS</ng-if><cs-extension-point name=\"hero\"></cs-extension-point></h4></div><h4 class=\"content light\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></h4></div><ng-include src=\"::\\'templates/common/qrcode.html\\'\"></ng-include><a id=\"wot-share-anchor-{{::formData.pubkey}}\"></a><div class=\"hidden-xs hidden-sm padding text-center\"><button class=\"button button-stable button-small-padding icon ion-android-share-alt ink\" ng-disabled=\"loading\" ng-click=\"showSharePopover($event)\" title=\"{{\\'COMMON.BTN_SHARE\\' | translate}}\"></button><cs-extension-point name=\"buttons\"></cs-extension-point><button class=\"button button-stable button-small-padding icon ion-ribbon-b ink hidden-readonly\" ng-click=\"certify()\" ng-if=\":rebind:formData.hasSelf\" title=\"{{\\'WOT.BTN_CERTIFY\\' | translate}}\" ng-disabled=\"disableCertifyButton\"></button> <button class=\"button button-calm ink hidden-readonly\" ng-click=\"showTransferModal({pubkey:formData.pubkey, uid: formData.name||formData.uid})\">{{\\'COMMON.BTN_SEND_MONEY\\' | translate}}</button><cs-extension-point name=\"after-buttons\"></cs-extension-point></div><div class=\"visible-xs visible-sm\"><button id=\"fab-certify-{{:rebind:formData.uid}}\" class=\"button button-fab button-fab-top-left button-fab-hero button-calm spin hidden-readonly\" ng-if=\":rebind:(canCertify && !alreadyCertified)\" ng-click=\"certify()\"><i class=\"icon ion-ribbon-b\"></i></button><cs-extension-point name=\"buttons-top-fab\"></cs-extension-point></div><div class=\"row no-padding\"><div class=\"col col-20 hidden-xs hidden-sm\"> </div><div class=\"col list {{::motion.ionListClass}}\" bind-notifier=\"{ rebind:loading}\"><span class=\"item item-divider\" translate>WOT.GENERAL_DIVIDER</span><ion-item class=\"item-icon-left item-text-wrap ink\" copy-on-click=\"{{:rebind:formData.pubkey}}\"><i class=\"icon ion-key\"></i> <span translate>COMMON.PUBKEY</span><h4 id=\"pubkey\" class=\"dark text-left\">{{:rebind:formData.pubkey}}</h4></ion-item><div class=\"item item-icon-left item-text-wrap\" ng-if=\":rebind:!formData.hasSelf\"><i class=\"icon ion-ios-help-outline positive\"></i> <span translate>WOT.NOT_MEMBER_ACCOUNT</span><h4 class=\"gray\" translate>WOT.NOT_MEMBER_ACCOUNT_HELP</h4></div><ion-item class=\"item-icon-left\" ng-if=\":rebind:formData.sigDate||formData.uid\"><i class=\"icon ion-calendar\"></i> <span translate>COMMON.UID</span><h5 class=\"dark\" ng-if=\":rebind:formData.sigDate \"><span translate>WOT.REGISTERED_SINCE</span> {{:rebind:formData.sigDate|medianDate}}</h5><span class=\"badge badge-energized\">{{:rebind:formData.uid}}</span></ion-item><a id=\"helptip-wot-view-certifications\" class=\"item item-icon-left item-text-wrap item-icon-right ink\" ng-if=\":rebind:formData.hasSelf\" ng-click=\"showCertifications()\"><i class=\"icon ion-ribbon-b\"></i> <b ng-if=\":rebind:formData.requirements.isSentry\" class=\"ion-star icon-secondary\" style=\"color: yellow; font-size: 16px; left: 25px; top: -7px;\"></b> <span translate>ACCOUNT.CERTIFICATION_COUNT</span><cs-badge-certification cs-id=\"helptip-wot-view-certifications-count\" requirements=\"formData.requirements\" parameters=\"{sigQty: formData.sigQty}\"></cs-badge-certification><i class=\"gray icon ion-ios-arrow-right\"></i> </a><a class=\"item item-icon-left item-text-wrap item-icon-right ink visible-xs visible-sm\" ng-if=\":rebind:formData.hasSelf && formData.isMember\" ng-click=\"showGivenCertifications()\"><i class=\"icon ion-ribbon-a\"></i> <span translate>WOT.GIVEN_CERTIFICATIONS.SENT</span><cs-badge-given-certification identity=\"formData\" parameters=\"$root.currency.parameters\"></cs-badge-given-certification><i class=\"gray icon ion-ios-arrow-right\"></i> </a><a class=\"item item-icon-left item-icon-right ink\" ng-if=\"!loading\" ui-sref=\"app.wot_identity_tx_uid({uid:formData.uid,pubkey:formData.pubkey})\"><i class=\"icon ion-card\"></i> <span translate>WOT.ACCOUNT_OPERATIONS</span> <i class=\"gray icon ion-ios-arrow-right\"></i></a><div class=\"item item-text-wrap item-icon-left item-wallet-event\" ng-class=\"{\\'assertive\\': event.type==\\'error\\'}\" ng-repeat=\"event in :rebind:formData.events\"><i class=\"icon\" ng-class=\"{\\'ion-information-circled royal\\': event.type==\\'info\\',\\'ion-alert-circled\\': event.type==\\'warn\\'||event.type==\\'error\\',\\'assertive\\': event.type==\\'error\\',\\'ion-clock\\': event.type==\\'pending\\'}\"></i> <span trust-as-html=\"event.message | translate:event.messageParams\"></span></div><cs-extension-point name=\"general\"></cs-extension-point><cs-extension-point name=\"after-general\"></cs-extension-point></div><div class=\"col col-20 hidden-xs hidden-sm\"> </div></div></ion-content><div class=\"visible-xs visible-sm\" ng-hide=\"loading\"><button id=\"fab-transfer\" class=\"button button-fab button-fab-bottom-right button-assertive drop hidden-readonly\" ng-click=\"showTransferModal({pubkey:formData.pubkey, uid: formData.uid})\"><i class=\"icon ion-android-send\"></i></button></div></ion-view>');}]);","angular.module(\"cesium.translations\", []).config([\"$translateProvider\", function($translateProvider) {\n$translateProvider.translations(\"en-GB\", {\n \"COMMON\": {\n \"APP_NAME\": \"Cesium\",\n \"APP_VERSION\": \"v{{version}}\",\n \"APP_BUILD\": \"build {{build}}\",\n \"PUBKEY\": \"Public key\",\n \"MEMBER\": \"Member\",\n \"BLOCK\" : \"Block\",\n \"BTN_OK\": \"OK\",\n \"BTN_YES\": \"Yes\",\n \"BTN_NO\": \"No\",\n \"BTN_SEND\": \"Send\",\n \"BTN_SEND_MONEY\": \"Transfer money\",\n \"BTN_SEND_MONEY_SHORT\": \"Transfer\",\n \"BTN_SAVE\": \"Save\",\n \"BTN_YES_SAVE\": \"Yes, Save\",\n \"BTN_YES_CONTINUE\": \"Yes, Continue\",\n \"BTN_SHOW\": \"Show\",\n \"BTN_SHOW_PUBKEY\": \"Show key\",\n \"BTN_RELATIVE_UNIT\": \"Display amounts in UD?\",\n \"BTN_BACK\": \"Back\",\n \"BTN_NEXT\": \"Next\",\n \"BTN_IMPORT\": \"Import\",\n \"BTN_CANCEL\": \"Cancel\",\n \"BTN_CLOSE\": \"Close\",\n \"BTN_LATER\": \"Later\",\n \"BTN_LOGIN\": \"Sign In\",\n \"BTN_LOGOUT\": \"Logout\",\n \"BTN_ADD_ACCOUNT\": \"New Account\",\n \"BTN_SHARE\": \"Share\",\n \"BTN_EDIT\": \"Edit\",\n \"BTN_DELETE\": \"Delete\",\n \"BTN_ADD\": \"Add\",\n \"BTN_SEARCH\": \"Search\",\n \"BTN_REFRESH\": \"Refresh\",\n \"BTN_RETRY\": \"Retry\",\n \"BTN_START\": \"Start\",\n \"BTN_CONTINUE\": \"Continue\",\n \"BTN_CREATE\": \"Create\",\n \"BTN_UNDERSTOOD\": \"I understand\",\n \"BTN_OPTIONS\": \"Options\",\n \"BTN_HELP_TOUR\": \"Features tour\",\n \"BTN_HELP_TOUR_SCREEN\": \"Discover this screen\",\n \"BTN_DOWNLOAD\": \"Download\",\n \"BTN_DOWNLOAD_ACCOUNT_STATEMENT\": \"Download account statement\",\n \"BTN_MODIFY\": \"Modify\",\n \"CHOOSE_FILE\": \"Drag your file<br/>or click to select\",\n \"DAYS\": \"days\",\n \"NO_ACCOUNT_QUESTION\": \"Not a member yet? Register now!\",\n \"SEARCH_NO_RESULT\": \"No result found\",\n \"LOADING\": \"Loading...\",\n \"LOADING_WAIT\": \"Loading...<br/><small>(Waiting for node availability)</small>\",\n \"SEARCHING\": \"Searching...\",\n \"FROM\": \"From\",\n \"TO\": \"To\",\n \"COPY\": \"Copy\",\n \"LANGUAGE\": \"Language\",\n \"UNIVERSAL_DIVIDEND\": \"Universal dividend\",\n \"UD\": \"UD\",\n \"DATE_PATTERN\": \"DD/MM/YYYY HH:mm\",\n \"DATE_FILE_PATTERN\": \"YYYY-MM-DD\",\n \"DATE_SHORT_PATTERN\": \"DD/MM/YY\",\n \"DATE_MONTH_YEAR_PATTERN\": \"MM/YYYY\",\n \"EMPTY_PARENTHESIS\": \"(empty)\",\n \"UID\": \"Pseudonym\",\n \"ENABLE\": \"Enabled\",\n \"DISABLE\": \"Disabled\",\n \"RESULTS_LIST\": \"Results:\",\n \"RESULTS_COUNT\": \"{{count}} results\",\n \"EXECUTION_TIME\": \"executed in {{duration|formatDurationMs}}\",\n \"SHOW_VALUES\": \"Display values openly?\",\n \"POPOVER_ACTIONS_TITLE\": \"Options\",\n \"POPOVER_FILTER_TITLE\": \"Filters\",\n \"SHOW_MORE\": \"Show more\",\n \"SHOW_MORE_COUNT\": \"(current limit at {{limit}})\",\n \"POPOVER_SHARE\": {\n \"TITLE\": \"Share\",\n \"SHARE_ON_TWITTER\": \"Share on Twitter\",\n \"SHARE_ON_FACEBOOK\": \"Share on Facebook\",\n \"SHARE_ON_DIASPORA\": \"Share on Diaspora*\",\n \"SHARE_ON_GOOGLEPLUS\": \"Share on Google+\"\n },\n \"FILE\": {\n \"DATE\" : \"Date:\",\n \"TYPE\" : \"Type:\",\n \"SIZE\": \"Size:\",\n \"VALIDATING\": \"Validating...\"\n }\n },\n \"SYSTEM\": {\n \"PICTURE_CHOOSE_TYPE\": \"Choose source:\",\n \"BTN_PICTURE_GALLERY\": \"Gallery\",\n \"BTN_PICTURE_CAMERA\": \"<b>Camera</b>\"\n },\n \"MENU\": {\n \"HOME\": \"Home\",\n \"WOT\": \"Registry\",\n \"CURRENCY\": \"Currency\",\n \"ACCOUNT\": \"My Account\",\n \"WALLETS\": \"My wallets\",\n \"SETTINGS\": \"Settings\",\n \"NETWORK\": \"Network\",\n \"TRANSACTIONS\": \"My transactions\"\n },\n \"ABOUT\": {\n \"TITLE\": \"About\",\n \"LICENSE\": \"<b>Free/libre software</b> (License GNU AGPLv3).\",\n \"LATEST_RELEASE\": \"There is a <b>newer version</ b> of {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)\",\n \"PLEASE_UPDATE\": \"Please update {{'COMMON.APP_NAME' | translate}} (latest version: <b>v{{version}}</b>)\",\n \"CODE\": \"Source code:\",\n \"OFFICIAL_WEB_SITE\": \"Official web site:\",\n \"DEVELOPERS\": \"Developers:\",\n \"FORUM\": \"Forum:\",\n \"PLEASE_REPORT_ISSUE\": \"Please report any issue to us!\",\n \"REPORT_ISSUE\": \"Report an issue\",\n \"BTN_OPEN_DEV_WINDOW\": \"Open the debug window\"\n },\n \"HOME\": {\n \"TITLE\": \"Cesium\",\n \"WELCOME\": \"Welcome to the Cesium application!\",\n \"WELCOME_READONLY\": \"Welcome to Cesium <span class='badge badge-balanced'>Monit</span> !\",\n \"MESSAGE\": \"Receive and send libre currency {{currency|abbreviate}}\",\n \"MESSAGE_READONLY\": \"Real-time monitoring of libre currency {{currency|abbreviate}}\",\n \"BTN_CURRENCY\": \"Explore currency {{currency|abbreviate}}\",\n \"BTN_ABOUT\": \"about\",\n \"BTN_HELP\": \"Help\",\n \"BTN_NETWORK\": \"Network status\",\n \"FREE_SOFTWARE\": \"Free software\",\n \"FORK_ME\": \"Fork me!\",\n \"SHOW_LICENSE\": \"Show license\",\n \"REPORT_ISSUE\": \"Report an issue\",\n \"NOT_YOUR_ACCOUNT_QUESTION\" : \"You do not own the account <b><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}</b>?\",\n \"BTN_CHANGE_ACCOUNT\": \"Disconnect this account\",\n \"CONNECTION_ERROR\": \"Peer <b>{{server}}</b> unreachable or invalid address.<br/><br/>Check your Internet connection, or change node <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">in the settings</a>.\",\n \"SHOW_ALL_FEED\": \"Show all\",\n \"READ_MORE\": \"Read more\",\n \"FEED_SOURCE\": \"Source\"\n },\n \"SETTINGS\": {\n \"TITLE\": \"Settings\",\n \"DISPLAY_DIVIDER\": \"Display\",\n \"STORAGE_DIVIDER\": \"Storage\",\n \"NETWORK_SETTINGS\": \"Network\",\n \"PEER\": \"Duniter peer address\",\n \"PEER_SHORT\": \"Peer address\",\n \"PEER_CHANGED_TEMPORARY\": \"Address used temporarily\",\n \"PERSIST_CACHE\": \"Keep navigation data (experimental)\",\n \"PERSIST_CACHE_HELP\": \"Allows faster navigation, locally retaining the data received, for use from one session to another.\",\n \"USE_LOCAL_STORAGE\": \"Enable local storage\",\n \"USE_LOCAL_STORAGE_HELP\": \"Allows you to save your settings\",\n \"WALLETS_SETTINGS\": \"My wallets\",\n \"USE_WALLETS_ENCRYPTION\": \"Secure the list\",\n \"USE_WALLETS_ENCRYPTION_HELP\": \"Enables you to encrypt the list of your wallets. Authentication required to access it.\",\n \"ENABLE_HELPTIP\": \"Enable contextual help tips\",\n \"DISABLE_HELPTIP\": \"Disable contextual help tips\",\n \"ENABLE_UI_EFFECTS\": \"Enable visual effects\",\n \"HISTORY_SETTINGS\": \"Account operations\",\n \"DISPLAY_UD_HISTORY\": \"Display produced dividends?\",\n \"TX_HISTORY_AUTO_REFRESH\": \"Enable automatic refresh?\",\n \"TX_HISTORY_AUTO_REFRESH_HELP\": \"Updates the list of operations to each new block.\",\n \"AUTHENTICATION_SETTINGS\": \"Authentication\",\n \"KEEP_AUTH\": \"Expiration of authentication\",\n \"KEEP_AUTH_SHORT\": \"Expiration\",\n \"KEEP_AUTH_HELP\": \"Define when authentication is cleared from memory.\",\n \"KEEP_AUTH_OPTION\": {\n \"NEVER\": \"After each operation\",\n \"SECONDS\": \"After {{value}}s of inactivity\",\n \"MINUTE\": \"After {{value}}min of inactivity\",\n \"MINUTES\": \"After {{value}}min of inactivity\",\n \"HOUR\": \"After {{value}}h of inactivity\",\n \"ALWAYS\": \"At the end of the session\"\n },\n \"KEYRING_FILE\": \"Keyring file\",\n \"KEYRING_FILE_HELP\": \"Allow auto-connect at startup, or to authenticate (only if \\\"Expiration of authentication\\\" is \\\"at the end of the session\\\"\",\n \"REMEMBER_ME\": \"Remember me ?\",\n \"REMEMBER_ME_HELP\": \"Allows to remain identified from one session to another, keeping the public key locally.\",\n \"PLUGINS_SETTINGS\": \"Extensions\",\n \"BTN_RESET\": \"Restore default values\",\n \"EXPERT_MODE\": \"Enable expert mode\",\n \"EXPERT_MODE_HELP\": \"Allow to see more details\",\n \"BLOCK_VALIDITY_WINDOW\": \"Block uncertainty time\",\n \"BLOCK_VALIDITY_WINDOW_SHORT\": \"Time of uncertainty\",\n \"BLOCK_VALIDITY_WINDOW_HELP\": \"Time to wait before considering an information is validated\",\n \"BLOCK_VALIDITY_OPTION\": {\n \"NONE\": \"No delay\",\n \"N\": \"{{time | formatDuration}} ({{count}} blocks)\"\n },\n \"POPUP_PEER\": {\n \"TITLE\" : \"Duniter peer\",\n \"HOST\" : \"Address\",\n \"HOST_HELP\": \"Address: server:port\",\n \"USE_SSL\" : \"Secured?\",\n \"USE_SSL_HELP\" : \"(SSL Encryption)\",\n \"BTN_SHOW_LIST\" : \"Peer's list\"\n }\n },\n \"BLOCKCHAIN\": {\n \"HASH\": \"Hash: {{hash}}\",\n \"VIEW\": {\n \"HEADER_TITLE\": \"Block #{{number}}-{{hash|formatHash}}\",\n \"TITLE_CURRENT\": \"Current block\",\n \"TITLE\": \"Block #{{number|formatInteger}}\",\n \"COMPUTED_BY\": \"Computed by\",\n \"SHOW_RAW\": \"Show raw data\",\n \"TECHNICAL_DIVIDER\": \"Technical informations\",\n \"VERSION\": \"Format version\",\n \"HASH\": \"Computed hash\",\n \"UNIVERSAL_DIVIDEND_HELP\": \"Money co-produced by each of the {{membersCount}} members\",\n \"EMPTY\": \"Aucune donnée dans ce bloc\",\n \"POW_MIN\": \"Minimal difficulty\",\n \"POW_MIN_HELP\": \"Difficulty imposed in calculating hash\",\n \"DATA_DIVIDER\": \"Data\",\n \"IDENTITIES_COUNT\": \"New identities\",\n \"JOINERS_COUNT\": \"Joiners\",\n \"ACTIVES_COUNT\": \"Renewals\",\n \"ACTIVES_COUNT_HELP\": \"Members having renewed their membership\",\n \"LEAVERS_COUNT\": \"Leavers\",\n \"LEAVERS_COUNT_HELP\": \"Members that now refused certification\",\n \"EXCLUDED_COUNT\": \"Excluded members\",\n \"EXCLUDED_COUNT_HELP\": \"Old members, excluded because missing membreship renewal or certifications\",\n \"REVOKED_COUNT\": \"Revoked identities\",\n \"REVOKED_COUNT_HELP\": \"These accounts may no longer be member\",\n \"TX_COUNT\": \"Transactions\",\n \"CERT_COUNT\": \"Certifications\",\n \"TX_TO_HIMSELF\": \"Change\",\n \"TX_OUTPUT_UNLOCK_CONDITIONS\": \"Unlock conditions\",\n \"TX_OUTPUT_OPERATOR\": {\n \"AND\": \"and\",\n \"OR\": \"or\"\n },\n \"TX_OUTPUT_FUNCTION\": {\n \"SIG\": \"<b>Sign</b> of the public key\",\n \"XHX\": \"<b>Password</b>, including SHA256 =\",\n \"CSV\": \"Blocked during\",\n \"CLTV\": \"Bloqué until\"\n }\n },\n \"LOOKUP\": {\n \"TITLE\": \"Blocks\",\n \"NO_BLOCK\": \"No bloc\",\n \"LAST_BLOCKS\": \"Last blocks:\",\n \"BTN_COMPACT\": \"Compact\"\n }\n },\n \"CURRENCY\": {\n \"VIEW\": {\n \"TITLE\": \"Currency\",\n \"TAB_CURRENCY\": \"Currency\",\n \"TAB_WOT\": \"Web of trust\",\n \"TAB_NETWORK\": \"Network\",\n \"TAB_BLOCKS\": \"Blocks\",\n \"CURRENCY_SHORT_DESCRIPTION\": \"{{currency|capitalize}} is a <b>libre money</b>, started {{firstBlockTime | formatFromNow}}. It currently counts <b>{{N}} members </b>, who produce and collect a <a ng-click=\\\"showHelpModal('ud')\\\">Universal Dividend</a> (DU), each {{dt | formatPeriod}}.\",\n \"NETWORK_RULES_DIVIDER\": \"Network rules\",\n \"CURRENCY_NAME\": \"Currency name\",\n \"MEMBERS\": \"Members count\",\n \"MEMBERS_VARIATION\": \"Variation since {{duration|formatDuration}} (since last UD)\",\n \"MONEY_DIVIDER\": \"Money\",\n \"MASS\": \"Monetary mass\",\n \"SHARE\": \"Money share\",\n \"UD\": \"Universal Dividend\",\n \"C_ACTUAL\": \"Current growth\",\n \"MEDIAN_TIME\": \"Current blockchain time\",\n \"POW_MIN\": \"Common difficulty\",\n \"MONEY_RULES_DIVIDER\": \"Rules of currency\",\n \"C_RULE\": \"Theoretical growth target\",\n \"UD_RULE\": \"Universal dividend (formula)\",\n \"DT_REEVAL\": \"Period between two re-evaluation of the UD\",\n \"REEVAL_SYMBOL\": \"reeval\",\n \"DT_REEVAL_VALUE\": \"Every <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})\",\n \"UD_REEVAL_TIME0\": \"Date of first reevaluation of the UD\",\n \"SIG_QTY_RULE\": \"Required number of certifications to become a member\",\n \"SIG_STOCK\": \"Maximum number of certifications sent by a member\",\n \"SIG_PERIOD\": \"Minimum delay between 2 certifications sent by one and the same issuer.\",\n \"SIG_WINDOW\": \"Maximum delay before a certification will be treated\",\n \"SIG_VALIDITY\": \"Lifetime of a certification that has been treated\",\n \"MS_WINDOW\": \"Maximum delay before a pending membership will be treated\",\n \"MS_VALIDITY\": \"Lifetime of a membership that has been treated\",\n \"STEP_MAX\": \"Maximum distance between a newcomer and each referring members.\",\n \"WOT_RULES_DIVIDER\": \"Rules for web of trust\",\n \"SENTRIES\": \"Required number of certifications (given <b>and</b> received) to become a referring member\",\n \"SENTRIES_FORMULA\": \"Required number of certifications to become a referring member (formula)\",\n \"XPERCENT\":\"Minimum percent of referring member to reach to match the distance rule\",\n \"AVG_GEN_TIME\": \"The average time between 2 blocks\",\n \"CURRENT\": \"current\",\n \"MATH_CEILING\": \"CEILING\",\n \"DISPLAY_ALL_RULES\": \"Display all rules?\",\n \"BTN_SHOW_LICENSE\": \"Show license\",\n \"WOT_DIVIDER\": \"Web of trust\"\n },\n \"LICENSE\": {\n \"TITLE\": \"Currency license\",\n \"BTN_DOWNLOAD\": \"Download file\",\n \"NO_LICENSE_FILE\": \"License file not found.\"\n }\n },\n \"NETWORK\": {\n \"VIEW\": {\n \"MEDIAN_TIME\": \"Blockchain time\",\n \"LOADING_PEERS\": \"Loading peers...\",\n \"NODE_ADDRESS\": \"Address:\",\n \"SOFTWARE\": \"Software:\",\n \"WARN_PRE_RELEASE\": \"Pre-release (latest stable: <b>{{version}}</b>)\",\n \"WARN_NEW_RELEASE\": \"Version <b>{{version}}</b> available\",\n \"WS2PID\": \"Identifier:\",\n \"PRIVATE_ACCESS\": \"Private access\",\n \"POW_PREFIX\": \"Proof of work prefix:\",\n \"ENDPOINTS\": {\n \"BMAS\": \"Secure endpoint (SSL)\",\n \"BMATOR\": \"TOR endpoint\",\n \"WS2P\": \"WS2P endpoint\",\n \"ES_USER_API\": \"Cesium+ data node\"\n }\n },\n \"INFO\": {\n \"ONLY_SSL_PEERS\": \"Non-SSL nodes have a degraded display because Cesium works in HTTPS mode.\"\n }\n },\n \"PEER\": {\n \"PEERS\": \"Peers\",\n \"SIGNED_ON_BLOCK\": \"Signed on block\",\n \"MIRROR\": \"mirror\",\n \"MIRRORS\": \"Mirrors\",\n \"MIRROR_PEERS\": \"Mirror peers\",\n \"PEER_LIST\" : \"Peer's list\",\n \"MEMBERS\" : \"Members\",\n \"MEMBER_PEERS\" : \"Member peers\",\n \"ALL_PEERS\" : \"All peers\",\n \"DIFFICULTY\" : \"Difficulty\",\n \"API\" : \"API\",\n \"CURRENT_BLOCK\" : \"Block #\",\n \"POPOVER_FILTER_TITLE\": \"Filter\",\n \"OFFLINE\": \"Offline\",\n \"OFFLINE_PEERS\": \"Offline peers\",\n \"BTN_SHOW_PEER\": \"Show peer\",\n \"VIEW\": {\n \"TITLE\": \"Peer\",\n \"OWNER\": \"Owned by \",\n \"SHOW_RAW_PEERING\": \"See peering document\",\n \"SHOW_RAW_CURRENT_BLOCK\": \"See current block (raw format)\",\n \"LAST_BLOCKS\": \"Last blocks\",\n \"KNOWN_PEERS\": \"Known peers :\",\n \"GENERAL_DIVIDER\": \"General information\",\n \"ERROR\": {\n \"LOADING_TOR_NODE_ERROR\": \"Could not get peer data, using the TOR network.\",\n \"LOADING_NODE_ERROR\": \"Could not get peer data\"\n }\n }\n },\n \"WOT\": {\n \"SEARCH_HELP\": \"Search (member or public key)\",\n \"SEARCH_INIT_PHASE_WARNING\": \"During the pre-registration phase, the search for pending registrations <b>may be long</b>. Please wait ...\",\n \"REGISTERED_SINCE\": \"Registered on\",\n \"REGISTERED_SINCE_BLOCK\": \"Registered since block #\",\n \"NO_CERTIFICATION\": \"No validated certification\",\n \"NO_GIVEN_CERTIFICATION\": \"No given certification\",\n \"NOT_MEMBER_PARENTHESIS\": \"(non-member)\",\n \"IDENTITY_REVOKED_PARENTHESIS\": \"(identity revoked)\",\n \"MEMBER_PENDING_REVOCATION_PARENTHESIS\": \"(being revoked)\",\n \"EXPIRE_IN\": \"Expires\",\n \"NOT_WRITTEN_EXPIRE_IN\": \"Deadline<br/>treatment\",\n \"EXPIRED\": \"Expired\",\n \"PSEUDO\": \"Pseudonym\",\n \"SIGNED_ON_BLOCK\": \"Emitted on block #{{block}}\",\n \"WRITTEN_ON_BLOCK\": \"Written on block #{{block}}\",\n \"GENERAL_DIVIDER\": \"General information\",\n \"NOT_MEMBER_ACCOUNT\": \"Non-member account\",\n \"NOT_MEMBER_ACCOUNT_HELP\": \"This is a simple wallet, with no pending membership application.\",\n \"TECHNICAL_DIVIDER\": \"Technical data\",\n \"BTN_CERTIFY\": \"Certify\",\n \"BTN_YES_CERTIFY\": \"Yes, certify\",\n \"BTN_SELECT_AND_CERTIFY\": \"New certification\",\n \"ACCOUNT_OPERATIONS\": \"Account operations\",\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"Identity {{title}}\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Registry\",\n \"NEWCOMERS\": \"New members:\",\n \"NEWCOMERS_COUNT\": \"{{count}} members\",\n \"PENDING\": \"Pending registrations:\",\n \"PENDING_COUNT\": \"{{count}} pending registrations\",\n \"REGISTERED\": \"Registered {{sigDate | formatFromNow}}\",\n \"MEMBER_FROM\": \"Member since {{memberDate|medianFromNowShort}}\",\n \"BTN_NEWCOMERS\": \"Latest members\",\n \"BTN_PENDING\": \"Pending registrations\",\n \"SHOW_MORE\": \"Show more\",\n \"SHOW_MORE_COUNT\": \"(current limit to {{limit}})\",\n \"NO_PENDING\": \"No pending registrations.\",\n \"NO_NEWCOMERS\": \"No members.\"\n },\n \"CONTACTS\": {\n \"TITLE\": \"Contacts\"\n },\n \"MODAL\": {\n \"TITLE\": \"Search\"\n },\n \"CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certifications\",\n \"SUMMARY\": \"Received certifications\",\n \"LIST\": \"Details of received certifications\",\n \"PENDING_LIST\": \"Pending certifications\",\n \"RECEIVED\": \"Received certifications\",\n \"RECEIVED_BY\": \"Certifications received by {{uid}}\",\n \"ERROR\": \"Received certifications in error\",\n \"SENTRY_MEMBER\": \"Referring member\"\n },\n \"OPERATIONS\": {\n \"TITLE\": \"{{uid}} - Operations\"\n },\n \"GIVEN_CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certifications sent\",\n \"SUMMARY\": \"Sent certifications\",\n \"LIST\": \"Details of sent certifications\",\n \"PENDING_LIST\": \"Pending certifications\",\n \"SENT\": \"Sent certifications\",\n \"SENT_BY\": \"Certifications sent by {{uid}}\",\n \"ERROR\": \"Sent certifications with error\"\n }\n },\n \"LOGIN\": {\n \"TITLE\": \"<i class=\\\"icon ion-log-in\\\"></i> Login\",\n \"SCRYPT_FORM_HELP\": \"Please enter your credentials. <br> Remember to check the public key for your account.\",\n \"PUBKEY_FORM_HELP\": \"Please enter a public account key:\",\n \"FILE_FORM_HELP\": \"Choose the keychain file to use:\",\n \"SCAN_FORM_HELP\": \"Scan the QR code of a wallet.\",\n \"SALT\": \"Secret identifier\",\n \"SALT_HELP\": \"Secret identifier\",\n \"SHOW_SALT\": \"Display secret identifier?\",\n \"PASSWORD\": \"Password\",\n \"PASSWORD_HELP\": \"Password\",\n \"PUBKEY_HELP\": \"Public key or pseudonym\",\n \"NO_ACCOUNT_QUESTION\": \"Don't have an account yet?\",\n \"HAVE_ACCOUNT_QUESTION\": \"Already have an account ?\",\n \"CREATE_ACCOUNT\": \"Create an account\",\n \"CREATE_FREE_ACCOUNT\": \"Create a free account\",\n \"FORGOTTEN_ID\": \"Forgot password?\",\n \"ASSOCIATED_PUBKEY\": \"Public key :\",\n \"BTN_METHODS\": \"Other methods\",\n \"BTN_METHODS_DOTS\": \"Change method...\",\n \"METHOD_POPOVER_TITLE\": \"Methods\",\n \"MEMORIZE_AUTH_FILE\": \"Memorize this keychain during the navigation session\",\n \"SCRYPT_PARAMETERS\": \"Paramètres (Scrypt) :\",\n \"AUTO_LOGOUT\": {\n \"TITLE\": \"Information\",\n \"MESSAGE\": \"<i class=\\\"ion-android-time\\\"></i> You were <b>logout</ b> automatically, due to prolonged inactivity.\",\n \"BTN_RELOGIN\": \"Sign In\",\n \"IDLE_WARNING\": \"You will be logout... {{countdown}}\"\n },\n \"METHOD\": {\n \"SCRYPT_DEFAULT\": \"Secret identifier and password\",\n \"SCRYPT_ADVANCED\": \"Advanced salt\",\n \"FILE\": \"Keychain file\",\n \"PUBKEY\": \"Public key or pseudonym\",\n \"SCAN\": \"Scan a QR code\"\n },\n \"SCRYPT\": {\n \"SIMPLE\": \"Light salt\",\n \"DEFAULT\": \"Standard salt\",\n \"SECURE\": \"Secure salt\",\n \"HARDEST\": \"Hardest salt\",\n \"EXTREME\": \"Extreme salt\",\n \"USER\": \"Personal value\",\n \"N\": \"N (Loop):\",\n \"r\": \"r (RAM):\",\n \"p\": \"p (CPU):\"\n },\n \"FILE\": {\n \"HELP\": \"Expected file format: <b>.dunikey</b> (type PubSec). Other formats are under development (EWIF, WIF).\"\n }\n },\n \"AUTH\": {\n \"TITLE\": \"<i class=\\\"icon ion-locked\\\"></i> Authentication\",\n \"BTN_AUTH\": \"Authenticate\",\n \"GENERAL_HELP\": \"Please authenticate yourself:\",\n \"EXPECTED_UID_HELP\": \"Please authenticate to the account <i class=\\\"ion-person\\\"></i> {{uid}}:\",\n \"EXPECTED_PUBKEY_HELP\": \"Please authenticate to the wallet <i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}:\",\n \"SCAN_FORM_HELP\": \"Scan the QR code of the <b>private key</b> of the wallet.\"\n },\n \"ACCOUNT\": {\n \"TITLE\": \"My Account\",\n \"BALANCE\": \"Balance\",\n \"LAST_TX\": \"Latest validated transactions\",\n \"BALANCE_ACCOUNT\": \"Account balance\",\n \"NO_TX\": \"No transaction\",\n \"SHOW_MORE_TX\": \"Show more\",\n \"SHOW_ALL_TX\": \"Show all\",\n \"TX_FROM_DATE\": \"(current limit to {{fromTime|medianFromNowShort}})\",\n \"PENDING_TX\": \"Pending transactions\",\n \"VALIDATING_TX\": \"Transactions being validated\",\n \"ERROR_TX\": \"Transaction not executed\",\n \"ERROR_TX_SENT\": \"Sent transactions\",\n \"PENDING_TX_RECEIVED\": \"Transactions awaiting receipt\",\n \"EVENTS\": \"Events\",\n \"OUT_DISTANCED\": \"Your current certifications come from a group too isolated from the <a ng-click=\\\"showHelpModal('wot')\\\"> Web of Trust</a> (WoT): the <a ng-click=\\\"showHelpModal('distance_rule')\\\">maximum distance rule</a> is violated.<br/>You must obtain certifications from another area of the Web of Trust, or wait for it to tighten.\",\n \"WAITING_MEMBERSHIP\": \"Membership application sent. Waiting validation.\",\n \"WAITING_CERTIFICATIONS\": \"You need {{needCertificationCount}} certification(s) to become a member and produce the <a ng-click=\\\"showHelpModal('ud')\\\">Universal Dividend</a>. Your account is however already operational, to receive and send payments.\",\n \"WAITING_CERTIFICATIONS_HELP\": \"To get your certifications, only request members <b>who know you enough</b>, as required by <a ng-click=\\\"showLicenseModal()\\\">the currency license</a> that you have accepted.<br/>If you do not know enough members, let them know on <a ng-click=\\\"openLink($event, $root.settings.userForumUrl)\\\">the user forum</a>.\",\n \"WILL_MISSING_CERTIFICATIONS\": \"You will <b>lack certifications</b> soon (at least {{willNeedCertificationCount}} more are needed)\",\n \"WILL_NEED_RENEW_MEMBERSHIP\": \"Your membership <b>will expire {{membershipExpiresIn|formatDurationTo}}</b>. Remember to <a ng-click=\\\"doQuickFix('renew')\\\">renew your membership</a> before then.\",\n \"NEED_RENEW_MEMBERSHIP\": \"You are no longer a member because your membership <b>has expired</b>. Remember to <a ng-click=\\\"doQuickFix('renew')\\\">renew your membership</a>.\",\n \"NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED\": \"You are no longer a member because your membership <b>has been cancelled</b> for lack of certifications. Remember to <a ng-click=\\\"doQuickFix('renew')\\\">renew your membership</a>.\",\n \"NO_WAITING_MEMBERSHIP\": \"No membership application pending. If you'd like to <b>become a member</ b>, please <a ng-click=\\\"doQuickFix('membership')\\\">send the membership application</a>.\",\n \"CERTIFICATION_COUNT\": \"Received certifications\",\n \"CERTIFICATION_COUNT_SHORT\": \"Certifications\",\n \"SIG_STOCK\": \"Stock of certifications to give\",\n \"BTN_RECEIVE_MONEY\": \"Receive\",\n \"BTN_SELECT_ALTERNATIVES_IDENTITIES\": \"Switch to another identity...\",\n \"BTN_FIX_MEMBERSHIP\": \"Resubmit membership request...\",\n \"BTN_MEMBERSHIP_RENEW\": \"Renew membership\",\n \"BTN_MEMBERSHIP_RENEW_DOTS\": \"Renew membership...\",\n \"BTN_MEMBERSHIP_OUT_DOTS\": \"Revoke membership...\",\n \"BTN_SECURITY_DOTS\": \"Sign-in and security...\",\n \"BTN_SHOW_DETAILS\": \"Display technical data\",\n \"LOCKED_OUTPUTS_POPOVER\": {\n \"TITLE\": \"Locked amount\",\n \"DESCRIPTION\": \"Here are the conditions for unlocking this amount:\",\n \"DESCRIPTION_MANY\": \"This transaction consists of several parts, of which the unlock conditions are:\",\n \"LOCKED_AMOUNT\": \"Conditions for the amount:\"\n },\n \"NEW\": {\n \"TITLE\": \"Registration\",\n \"INTRO_WARNING_TIME\": \"Creating an account on {{name|capitalize}} is very simple. Please take sufficient time to do this correctly (not to forget the usernames, passwords, etc.).\",\n \"INTRO_WARNING_SECURITY\": \"Check that the hardware you are currently using (computer, tablet, phone) <b>is secure and trustworthy </b>.\",\n \"INTRO_WARNING_SECURITY_HELP\": \"Up-to-date anti-virus, firewall enabled, session protected by password or pin code...\",\n \"INTRO_HELP\": \"Click <b> {{'COMMON.BTN_START'|translate}}</b> to begin creating an account. You will be guided step by step.\",\n \"REGISTRATION_NODE\": \"Your registration will be registered via the Duniter peer <b>{{server}}</b> node, which will then be distributed to the rest of the currency network.\",\n \"REGISTRATION_NODE_HELP\": \"If you do not trust this peer, please change <a ng-click=\\\"doQuickFix('settings')\\\">in the settings</a> of Cesium.\",\n \"SELECT_ACCOUNT_TYPE\": \"Choose the type of account to create:\",\n \"MEMBER_ACCOUNT\": \"Member account\",\n \"MEMBER_ACCOUNT_TITLE\": \"Create a member account\",\n \"MEMBER_ACCOUNT_HELP\": \"If you are not yet registered as an individual (one account possible per individual).\",\n \"WALLET_ACCOUNT\": \"Simple wallet\",\n \"WALLET_ACCOUNT_TITLE\": \"Create a wallet\",\n \"WALLET_ACCOUNT_HELP\": \"If you represent a company, association, etc. or simply need an additional wallet. No universal dividend will be created by this account.\",\n \"SALT_WARNING\": \"Choose a secret identifier.<br/>You need it for each connection to this account.<br/><br/><b>Make sure to remember this identifier</b>.<br/>If lost, there are no means to retrieve it!\",\n \"PASSWORD_WARNING\": \"Choose a password.<br/>You need it for each connection to this account.<br/><br/><b>Make sure to remember this password</b>.<br/>If lost, there are no means to retrieve it!\",\n \"PSEUDO_WARNING\": \"Choose a pseudonym.<br/>It may be used by other people to find you more easily.<br/><br/>.Use of <b>commas, spaces and accents</b> is not allowed.<br/><div class='hidden-xs'><br/>Example: <span class='gray'>JohnDalton, JackieChan, etc.</span>\",\n \"PSEUDO\": \"Pseudonym\",\n \"PSEUDO_HELP\": \"joe123\",\n \"SALT_CONFIRM\": \"Confirm\",\n \"SALT_CONFIRM_HELP\": \"Confirm the secret identifier\",\n \"PASSWORD_CONFIRM\": \"Confirm\",\n \"PASSWORD_CONFIRM_HELP\": \"Confirm the password\",\n \"SLIDE_6_TITLE\": \"Confirmation:\",\n \"COMPUTING_PUBKEY\": \"Computing...\",\n \"LAST_SLIDE_CONGRATULATION\": \"You completed all required fields.<br/><b>You can send the account creation request</b>.<br/><br/>For information, the public key below identifies your future account.<br/>It can be communicated to third parties to receive their payment.<br/>Once your account has been approved, you can find this key under <b>{{'ACCOUNT.TITLE'|translate}}</b>.\",\n \"CONFIRMATION_MEMBER_ACCOUNT\": \"<b class=\\\"assertive\\\">Warning:</b> your secret identifier, password and pseudonym can not be changed.<br/><b>Make sure you always remember it!</b><br/><b>Are you sure</b> you want to send this account creation request?\",\n \"CONFIRMATION_WALLET_ACCOUNT\": \"<b class=\\\"assertive\\\">Warning:</b> your password and pseudonym can not be changed.<br/><b>Make sure you always remember it!</b><br/><b>Are you sure</b> you want to continue?\",\n \"CHECKING_PSEUDO\": \"Checking...\",\n \"PSEUDO_AVAILABLE\": \"This pseudonym is available\",\n \"PSEUDO_NOT_AVAILABLE\": \"This pseudonym is not available\",\n \"INFO_LICENSE\": \"To be able to adhere to the currency, we ask you to kindly read and accept this license.\",\n \"BTN_ACCEPT\": \"I accept\",\n \"BTN_ACCEPT_LICENSE\": \"I accept the license\"\n },\n \"POPUP_REGISTER\": {\n \"TITLE\": \"Enter a pseudonym\",\n \"HELP\": \"A pseudonym is needed to let other members find you.\"\n },\n \"SELECT_IDENTITY_MODAL\": {\n \"TITLE\": \"Identity selection\",\n \"HELP\": \"Several <b>different identities</b> have been sent, for the public key <span class=\\\"gray\\\"> <i class=\\\"ion-key\\\"></i> {{pubkey | formatPubkey}}</span>.<br/>Please select the identity to use:\"\n },\n \"SELECT_WALLET_MODAL\": {\n \"TITLE\": \"Wallet selection\"\n },\n \"WALLET_LIST\": {\n \"TITLE\": \"My wallets\",\n \"BTN_NEW\": \"Add a wallet\",\n \"BTN_DOWNLOAD\": \"Download the list\",\n \"BTN_IMPORT_FILE_DOTS\": \"Import from a file...\",\n \"NO_WALLET\": \"No secondary wallet\",\n \"BTN_DELETE\": \"Remove a secondary wallet...\",\n \"BTN_RENAME\": \"Rename the wallet\",\n \"EXPORT_FILENAME\": \"my_wallets-{{pubkey|formatPubkey}}-{{currency}}.csv\",\n \"TOTAL_DOTS\": \"Total: \",\n \"EDIT_POPOVER\": {\n \"TITLE\": \"Rename the wallet\",\n \"HELP\": \"Fill in the new name\",\n \"NAME_HELP\": \"Wallet name\"\n },\n \"IMPORT_MODAL\": {\n \"TITLE\": \"Import secondary wallets\",\n \"HELP\": \"To <b>import secodnary wallets</b>, please drag the file in the box below, or click in the box to search for a file.\",\n \"WALLET_COUNT\": \"<b>{{count}}</b> new wallet{{count > 1 ? 's' : ''}}\",\n \"NO_NEW_WALLET\": \"No new wallet\"\n }\n },\n \"SECURITY\":{\n \"ADD_QUESTION\" : \"Add custom question\",\n \"BTN_CLEAN\" : \"Clean\",\n \"BTN_RESET\" : \"Reset\",\n \"DOWNLOAD_REVOKE\": \"Save a revocation file\",\n \"DOWNLOAD_REVOKE_HELP\" : \"Having a revocation file is important, for example in case of loss of identifiers. It allows you to <b>get this account out of the Web Of Trust</b>, thus becoming a simple wallet.\",\n \"GENERATE_KEYFILE\": \"Generate my keychain file ...\",\n \"GENERATE_KEYFILE_HELP\": \"Generate a file allowing you to authenticate without entering your identifiers.<br/><b>Warning:</b> this file will contain your secret key; It is therefore very important to put it in a safe place!\",\n \"KEYFILE_FILENAME\": \"keychain-{{pubkey|formatPubkey}}-{{currency}}-{{format}}.dunikey\",\n \"MEMBERSHIP_IN\": \"Register as member...\",\n \"MEMBERSHIP_IN_HELP\": \"Allows you to <b>transform </b> a simple wallet account <b>into a member account</b>, by sending a membership request. Useful only if you do not already have another member account.\",\n \"SEND_IDENTITY\": \"Publish identity...\",\n \"SEND_IDENTITY_HELP\": \"Allows you to associate a pseudonym to this account, but <b>without applying for membership</b> to become a member. This is not very useful because the validity of this pseudonym association is limited in time.\",\n \"HELP_LEVEL\": \"Choose <strong> at least {{nb}} questions </strong> :\",\n \"LEVEL\": \"Security level\",\n \"LOW_LEVEL\": \"Low <span class=\\\"hidden-xs\\\">(2 questions minimum)</span>\",\n \"MEDIUM_LEVEL\": \"Medium <span class=\\\"hidden-xs\\\">(4 questions minimum)</span>\",\n \"QUESTION_1\": \"What was your best friend's name when you were a teen ?\",\n \"QUESTION_2\": \"What was the name of your first pet ?\",\n \"QUESTION_3\": \"What is the first meal you have learned to cook ?\",\n \"QUESTION_4\": \"What is the first movie you saw in the cinema?\",\n \"QUESTION_5\": \"Where did you go the first time you flew ?\",\n \"QUESTION_6\": \"What was your favorite elementary school teacher's name ?\",\n \"QUESTION_7\": \"What would you consider the ideal job ?\",\n \"QUESTION_8\": \"Which children's book do you prefer?\",\n \"QUESTION_9\": \"What was the model of your first vehicle?\",\n \"QUESTION_10\": \"What was your nickname when you were a child ?\",\n \"QUESTION_11\": \"What was your favorite movie character or actor when you were a student ?\",\n \"QUESTION_12\": \"What was your favorite singer or band when you were a student ?\",\n \"QUESTION_13\": \"In which city did your parents meet ?\",\n \"QUESTION_14\": \"What was the name of your first boss ?\",\n \"QUESTION_15\": \"What is the name of the street where you grew up ?\",\n \"QUESTION_16\": \"What is the name of the first beach where you go swim ?\",\n \"QUESTION_17\": \"QWhat is the first album you bought ?\",\n \"QUESTION_18\": \"What is the name of your favorite sport team ?\",\n \"QUESTION_19\": \"What was your grand-father's job ?\",\n \"RECOVER_ID\": \"Recover my password...\",\n \"RECOVER_ID_HELP\": \"If you have a <b>backup file of your identifiers</b>, you can find them by answering your personal questions correctly.\",\n \"RECOVER_ID_SELECT_FILE\": \"Select the <b>backup file of your identifiers</b> to use:\",\n \"REVOCATION_WITH_FILE\" : \"Revoke my member account...\",\n \"REVOCATION_WITH_FILE_DESCRIPTION\": \"If you have <b>permanently lost your member account credentials (or if account security is compromised), you can use <b>the revocation file</b> of the account <b>to quit the Web Of Trust</b>.\",\n \"REVOCATION_WITH_FILE_HELP\": \"To <b>permanently revoke</ b> a member account, please drag the revocation file in the box below, or click in the box to search for a file.\",\n \"REVOCATION_WALLET\": \"Revoke this account immediately\",\n \"REVOCATION_WALLET_HELP\": \"Requesting revocation of your identity causes <b>will revoke your membership</ b> (definitely for the associated pseudonym and public key). The account will no longer be able to produce a Universal Dividend.<br/>However, you can still use it as a simple wallet.\",\n \"REVOCATION_FILENAME\": \"revocation-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt\",\n \"SAVE_ID\": \"Save my credentials...\",\n \"SAVE_ID_HELP\": \"Creating a backup file, to <b>retrieve your password</b> (and the secret identifier) <b> in case of forgetting</b>. The file is <b>secured</ b> (encrypted) using personal questions.\",\n \"STRONG_LEVEL\": \"Strong <span class=\\\"hidden-xs \\\">(6 questions minimum)</span>\",\n \"TITLE\": \"Account and security\",\n \"KEYFILE\": {\n \"PUBSEC_FORMAT\": \"PubSec format.\",\n \"PUBSEC_FORMAT_HELP\": \"This file format is compatible in particular with Cesium and Gannonce. Your keychain is stored <b>without encryption</b>: anyone with a copy of this file will be able to empty your account.\",\n \"WIF_FORMAT\": \"Wallet Import Format (WIF)\",\n \"WIF_FORMAT_HELP\": \"This format is used in particular by paper wallets. Your keychain is stored <b>without encryption</b>: anyone with a copy of this file will be able to empty your account.\",\n \"EWIF_FORMAT\": \"Encrypted Wallet Import Format (WIF)\",\n \"EWIF_FORMAT_HELP\": \"This format is used in particular by paper wallets. However, <b>the keychain is encrypted</b> from a passphrase of your choice.\",\n \"PASSWORD_POPUP\": {\n \"TITLE\": \"Keychain file encrypted\",\n \"HELP\": \"Please enter the passphrase:\",\n \"PASSWORD_HELP\": \"Passphrase\"\n },\n \"ERROR\": {\n \"BAD_PASSWORD\": \"Bad passphrase\",\n \"BAD_CHECKSUM\": \"Bad checksum\"\n }\n }\n },\n \"FILE_NAME\": \"{{currency}} - Account statement {{pubkey|formatPubkey}} to {{currentTime|formatDateForFile}}.csv\",\n \"HEADERS\": {\n \"TIME\": \"Date\",\n \"AMOUNT\": \"Amount\",\n \"COMMENT\": \"Comment\"\n }\n },\n \"TRANSFER\": {\n \"TITLE\": \"Transfer\",\n \"SUB_TITLE\": \"Transfer money\",\n \"SUB_TITLE_ALL\": \"Empty the account\",\n \"FROM\": \"From\",\n \"TO\": \"To\",\n \"AMOUNT\": \"Amount\",\n \"AMOUNT_HELP\": \"Amount\",\n \"COMMENT\": \"Comment\",\n \"COMMENT_HELP\": \"Comment (optional)\",\n \"BTN_SEND\": \"Send\",\n \"BTN_ADD_COMMENT\": \"Add a comment\",\n \"REST\": \"Rest of account\",\n \"REST_TO\": \"to\",\n \"WARN_COMMENT_IS_PUBLIC\": \"Please note that <b>comments are public</b> (not encrypted).\",\n \"MODAL\": {\n \"TITLE\": \"Transfer\"\n }\n },\n \"ERROR\": {\n \"UNKNOWN_URI_FORMAT\": \"Unknown URI format\",\n \"PUBKEY_INVALID_CHECKSUM\": \"Invalid public key (bad checksum).\",\n \"POPUP_TITLE\": \"Error\",\n \"UNKNOWN_ERROR\": \"Unknown error\",\n \"CRYPTO_UNKNOWN_ERROR\": \"Your browser is not compatible with cryptographic features.\",\n \"DOWNLOAD_KEYFILE_FAILED\": \"Failed to generate the keychain file.\",\n \"EQUALS_TO_PSEUDO\": \"Must be different from pseudonym\",\n \"EQUALS_TO_SALT\": \"Must be different from secret identifier\",\n \"FIELD_REQUIRED\": \"This field is required.\",\n \"FIELD_TOO_SHORT\": \"This field value is too short.\",\n \"FIELD_TOO_SHORT_WITH_LENGTH\": \"Value is too short (min {{minLength]] characters).\",\n \"FIELD_TOO_LONG\": \"Value is exceeding max length.\",\n \"FIELD_TOO_LONG_WITH_LENGTH\": \"Value is too long (max {{maxLength}} characters).\",\n \"FIELD_MIN\": \"Minimum value: {{min}}\",\n \"FIELD_MAX\": \"Maximal value: {{max}}\",\n \"FIELD_ACCENT\": \"Commas and accent characters not allowed\",\n \"FIELD_NOT_NUMBER\": \"Value is not a number\",\n \"FIELD_NOT_INT\": \"Value is not an integer\",\n \"FIELD_NOT_EMAIL\": \"Email adress not valid\",\n \"PASSWORD_NOT_CONFIRMED\": \"Must match previous password.\",\n \"SALT_NOT_CONFIRMED\": \"Must match previous identifier.\",\n \"SEND_IDENTITY_FAILED\": \"Error while trying to register.\",\n \"SEND_CERTIFICATION_FAILED\": \"Could not certify identity.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY\": \"You could not send certification, because your account is <b>not a member account</b>.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF\": \"You could not send certification now, because your are <b>not a member</b> yet.<br/><br/>You still need certification to become a member.\",\n \"IDENTITY_TO_CERTIFY_HAS_NO_SELF\": \"This account could not be certified. No registration found, or need to renew.\",\n \"LOGIN_FAILED\": \"Error while sign in.\",\n \"LOAD_IDENTITY_FAILED\": \"Could not load identity.\",\n \"LOAD_REQUIREMENTS_FAILED\": \"Could not load identity requirements.\",\n \"SEND_MEMBERSHIP_IN_FAILED\": \"Error while sending registration as member.\",\n \"SEND_MEMBERSHIP_OUT_FAILED\": \"Error while sending membership revocation.\",\n \"REFRESH_WALLET_DATA\": \"Could not refresh wallet.\",\n \"GET_CURRENCY_PARAMETER\": \"Could not get currency parameters.\",\n \"GET_CURRENCY_FAILED\": \"Could not load currency. Please retry later.\",\n \"SEND_TX_FAILED\": \"Could not send transaction.\",\n \"ALL_SOURCES_USED\": \"Please wait the next block computation (All transaction sources has been used).\",\n \"NOT_ENOUGH_SOURCES\": \"Not enough changes to send this amount in one time.<br/>Maximum amount: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.\",\n \"ACCOUNT_CREATION_FAILED\": \"Error while creating your member account.\",\n \"RESTORE_WALLET_DATA_ERROR\": \"Error while reloading settings from local storage\",\n \"LOAD_WALLET_DATA_ERROR\": \"Error while loading wallet data.\",\n \"COPY_CLIPBOARD_FAILED\": \"Could not copy to clipboard\",\n \"TAKE_PICTURE_FAILED\": \"Could not get picture.\",\n \"SCAN_FAILED\": \"Could not scan QR code.\",\n \"SCAN_UNKNOWN_FORMAT\": \"Code not recognized.\",\n \"WOT_LOOKUP_FAILED\": \"Search failed.\",\n \"LOAD_PEER_DATA_FAILED\": \"Duniter peer not accessible. Please retry later.\",\n \"NEED_LOGIN_FIRST\": \"Please sign in first.\",\n \"AMOUNT_REQUIRED\": \"Amount is required.\",\n \"AMOUNT_NEGATIVE\": \"Negative amount not allowed.\",\n \"NOT_ENOUGH_CREDIT\": \"Not enough credit.\",\n \"INVALID_NODE_SUMMARY\": \"Unreachable peer or invalid address\",\n \"INVALID_USER_ID\": \"Field 'pseudonym' must not contains spaces or special characters.\",\n \"INVALID_COMMENT\": \"Field 'reference' has a bad format.\",\n \"INVALID_PUBKEY\": \"Public key has a bad format.\",\n \"INVALID_PUBKEY_CHECKSUM\": \"Invalid checksum.\",\n \"IDENTITY_REVOKED\": \"This identity <b>has been revoked</b>. It can no longer become a member.\",\n \"IDENTITY_REVOKED_WITH_TIME\": \"This identity <b>has been revoked {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). It can no longer become a member.\",\n \"IDENTITY_PENDING_REVOCATION\": \"The <b>revocation of this identity</b> has been requested and is awaiting processing. Certification is therefore disabled.\",\n \"IDENTITY_INVALID_BLOCK_HASH\": \"This membership application is no longer valid (because it references a block that network peers are cancelled): the person must renew its application for membership <b>before</b> being certified.\",\n \"IDENTITY_EXPIRED\": \"This identity has expired: this person must re-apply <b>before</b> being certified.\",\n \"IDENTITY_SANDBOX_FULL\": \"Could not register, because peer's sandbox is full.<br/><br/>Please retry later or choose another Duniter peer (in <b>Settings</b>).\",\n \"IDENTITY_NOT_FOUND\": \"Identity not found\",\n \"IDENTITY_TX_FAILED\": \"Error while getting identity's transactions\",\n \"WOT_PENDING_INVALID_BLOCK_HASH\": \"Membership not valid.\",\n \"WALLET_INVALID_BLOCK_HASH\": \"Your membership application is no longer valid (because it references a block that network peers are cancelled).<br/>You must <a ng-click=\\\"doQuickFix('renew')\\\">renew your application for membership</a> to fix this issue.\",\n \"WALLET_IDENTITY_EXPIRED\": \"The publication of your identity <b>has expired</b>.<br/>You must <a ng-click=\\\"doQuickFix('fixIdentity')\\\">re-issue your identity</a> to resolve this issue.\",\n \"WALLET_REVOKED\": \"Your identity has been <b>revoked</b>: neither your pseudonym nor your public key will be used in the future for a member account.\",\n \"WALLET_HAS_NO_SELF\": \"Your identity must first have been published, and not expired.\",\n \"AUTH_REQUIRED\": \"Authentication required.\",\n \"AUTH_INVALID_PUBKEY\": \"The public key does not match the connected account.\",\n \"AUTH_INVALID_SCRYPT\": \"Invalid username or password.\",\n \"AUTH_INVALID_FILE\": \"Invalid keychain file.\",\n \"AUTH_FILE_ERROR\": \"Failed to open keychain file\",\n \"IDENTITY_ALREADY_CERTIFY\": \"You have <b>already certified</b> that identity.<br/><br/>Your certificate is still valid (expires {{expiresIn|formatDuration}}).\",\n \"IDENTITY_ALREADY_CERTIFY_PENDING\": \"You have <b>already certified</b> that identity.<br/><br/>Your certification is still pending (Deadline for treatment {{expiresIn|formatDuration}}).\",\n \"UNABLE_TO_CERTIFY_TITLE\": \"Unable to certify\",\n \"LOAD_NEWCOMERS_FAILED\": \"Unable to load new members.\",\n \"LOAD_PENDING_FAILED\": \"Unable to load pending registrations.\",\n \"ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"You must <b>be a member</b> in order to perform this action.\",\n \"ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"You must <b>be a member (or old member)</b> in order to perform this action.\",\n \"ONLY_SELF_CAN_EXECUTE_THIS_ACTION\": \"You must have <b>published your identity</b> in order to perform this action.\",\n \"GET_BLOCK_FAILED\": \"Error while getting block\",\n \"INVALID_BLOCK_HASH\": \"Block not found (incorrect hash)\",\n \"DOWNLOAD_REVOCATION_FAILED\": \"Error while downloading revocation file.\",\n \"REVOCATION_FAILED\": \"Error while trying to revoke the identity.\",\n \"SALT_OR_PASSWORD_NOT_CONFIRMED\": \"Wrong secret identifier or password \",\n \"RECOVER_ID_FAILED\": \"Could not recover password\",\n \"LOAD_FILE_FAILED\" : \"Unable to load file\",\n \"NOT_VALID_REVOCATION_FILE\": \"Invalid revocation file (wrong file format)\",\n \"NOT_VALID_SAVE_ID_FILE\": \"Invalid credentials backup file (wrong file format)\",\n \"NOT_VALID_KEY_FILE\": \"Invalid keychain file (unrecognized format)\",\n \"EXISTING_ACCOUNT\": \"Your identifiers correspond to an already existing account, whose <a ng-click=\\\"showHelpModal('pubkey')\\\">public key</a> is:\",\n \"EXISTING_ACCOUNT_REQUEST\": \"Please modify your credentials so that they correspond to an unused account.\",\n \"GET_LICENSE_FILE_FAILED\": \"Unable to get license file\",\n \"CHECK_NETWORK_CONNECTION\": \"No peer appears to be accessible.<br/><br/>Please <b>check your Internet connection</b>.\",\n \"ISSUE_524_TX_FAILED\": \"Failed to transfer.<br/><br/>A message has been sent to developers to help solve the problem.<b>Thank you for your help</b>.\",\n \"ADD_SECONDARY_WALLET_FAILED\": \"Unable to add secondary wallet.\",\n \"REMOVE_SECONDARY_WALLET_FAILED\": \"Unable to remove secondary wallet.\",\n \"UPDATE_WALLET_LIST_FAILED\": \"Unable to refresh the list of wallets.\",\n \"LOAD_WALLET_LIST_FAILED\": \"Unable to load the list of wallets.\",\n \"SAVE_WALLET_LIST_FAILED\": \"Unable to save the list of wallets.\",\n \"COULD_NOT_ADD_MAIN_WALLET\": \"This wallet <b>is the main account</b> with which you are connected. Unable to add it as a secondary wallet.\",\n \"COULD_NOT_ADD_EXISTING_WALLET\": \"Wallet already existing in the list.\",\n \"UNKNOWN_WALLET_ID\": \"Unknown secondary wallet.\",\n \"RESTORE_WALLET_LIST_FAILED\": \"Unable to restore the list of wallets.\",\n \"INVALID_FILE_FORMAT\": \"Invalid file format.\",\n \"SAME_TX_RECIPIENT\": \"The recipient must be different from the issuer.\"\n },\n \"INFO\": {\n \"POPUP_TITLE\": \"Information\",\n \"CERTIFICATION_DONE\": \"Identity successfully signed\",\n \"NOT_ENOUGH_CREDIT\": \"Not enough credit\",\n \"TRANSFER_SENT\": \"Transfer request successfully sent\",\n \"COPY_TO_CLIPBOARD_DONE\": \"Copy succeeded\",\n \"MEMBERSHIP_OUT_SENT\": \"Membership revocation sent\",\n \"NOT_NEED_MEMBERSHIP\": \"Already a member.\",\n \"IDENTITY_WILL_MISSING_CERTIFICATIONS\": \"This identity will soon lack certification (at least {{willNeedCertificationCount}}).\",\n \"IDENTITY_NEED_MEMBERSHIP\": \"This identity did not send a membership request. She will have to if she wishes to become a member.\",\n \"HAS_ALTERNATIVE_IDENTITIES\": \"There are <b>multiple identities</b> attached to this public key. <b>Before any certification</b>, please <a ng-click=\\\"doQuickFix('showSelectIdentities')\\\">check other identities</a> to choose the correct one, or contact the wallet owner.\",\n \"REVOCATION_SENT\": \"Revocation sent successfully\",\n \"REVOCATION_SENT_WAITING_PROCESS\": \"Revocation <b>has been sent successfully</b>. It is awaiting processing.\",\n \"FEATURES_NOT_IMPLEMENTED\": \"This features is not implemented yet.<br/><br/>Why not to contribute to get it faster? ;)\",\n \"EMPTY_TX_HISTORY\": \"No operations to export\"\n },\n \"CONFIRM\": {\n \"POPUP_TITLE\": \"<b>Confirmation</b>\",\n \"POPUP_WARNING_TITLE\": \"<b>Warning</b>\",\n \"POPUP_SECURITY_WARNING_TITLE\": \"<i class=\\\"icon ion-alert-circled\\\"></i> <b>Security warning</b>\",\n \"CERTIFY_RULES_TITLE_UID\": \"Certify {{uid}}\",\n \"CERTIFY_RULES\": \"<b class=\\\"assertive\\\">Don't certify an account</b> if you believe that: <ul><li>1.) the issuers identity might be faked.<li>2.) the issuer already has another certified account.<li>3.) the issuer purposely or carelessly violates rule 1 or 2 (he certifies faked or double accounts).</ul></small><br/>Are you sure you want to certify this identity?\",\n \"FULLSCREEN\": \"View the application in full screen?\",\n \"EXIT_APP\": \"Close the application ?\",\n \"TRANSFER\": \"<b>Transfer summary:</b><br/><br/><ul><li> - From: <b>{{from}}</b></li><li> - To: <b>{{to}}</b></li><li> - Amount: <b>{{amount}} {{unit}}</b></li><li> - Comment: <i>{{comment}}</i></li></ul><br/><b>Are-you sure you want to do this transfer?</b>\",\n \"TRANSFER_ALL\": \"<b>Transfer summary:</b><br/><br/><ul><li> - From: <b>{{from}}</b></li><li> - To: <b>{{to}}</b></li><li> - Amount: <b>{{amount}} {{unit}}</b></li><li> - Comment: <i>{{comment}}</i></li><br/><li> - Rest : <b>{{restAmount}} {{unit}}</b> to <b>{{restTo}}</b></li></ul><br/><b>Are-you sure you want to do this transfer?</b>\",\n \"MEMBERSHIP_OUT\": \"This operation is <b>irreversible</b>.<br/></br/><b>Are you sure you want to terminate your membership?</b>\",\n \"MEMBERSHIP_OUT_2\": \"This operation is <b>irreversible</b>!<br/><br/>Are you sure you want to <b>terminate your membership</b>?\",\n \"LOGIN_UNUSED_WALLET_TITLE\": \"Typing error?\",\n \"LOGIN_UNUSED_WALLET\": \"The account seems to be <b>inactive</b>.<br/><br/>It's probably a <b>typing error</b> when sign in. Please try again, checking that <b>public key is yours<b/>.\",\n \"FIX_IDENTITY\": \"The pseudonym <b>{{uid}}</b> will be published again, replacing the old publication that has expired.<br/></br/><b>Are you sure</b> you want to continue?\",\n \"FIX_MEMBERSHIP\": \"Your application for membership will be sent.<br/></br/><b>Are you sure?</b>\",\n \"MEMBERSHIP\": \"Your membership request will be sent. <br/></br/><b>Are you sure?</b>\",\n \"RENEW_MEMBERSHIP\": \"Your membership will be renewed.<br/></br/><b>Are you sure?</b>\",\n \"REVOKE_IDENTITY\": \"You will <b>definitely revoke this identity</b>.<br/><br/>The public key and the associated pseudonym <b>will never be used again</b> (for a member account).<br/></br/><b>Are you sure</b> you want to revoke this identity?\",\n \"REVOKE_IDENTITY_2\": \"This operation is <b>irreversible</b>!<br/><br/>Are you sure you want to <b>revoke this identity</b>?\",\n \"NOT_NEED_RENEW_MEMBERSHIP\": \"Your membership does not need to be renewed (it will only expire in {{membershipExpiresIn|formatDuration}}).<br/></br/><b>Are you sure you</b> want to renew your membership?\",\n \"SAVE_BEFORE_LEAVE\": \"Do you want to <b>save your changes</b> before leaving the page?\",\n \"SAVE_BEFORE_LEAVE_TITLE\": \"Changes not saved\",\n \"LOGOUT\": \"Are you sure you want to logout?\",\n \"USE_FALLBACK_NODE\": \"Peer <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> node?\",\n \"ISSUE_524_SEND_LOG\": \"The transaction was rejected because of a known problem (issue #524) but not reproduced.<br/><br/>To help developers correct this error, do you accept <b>the transmission of your logs</b> per message?<br/><small>(No confidential data is sent)</small>\"\n },\n \"MODE\": {\n \"DEMO\": {\n \"BADGE\": \"Demo\",\n \"MODE\": \"Demonstration mode\",\n \"FEATURE_NOT_AVAILABLE\": \"Functionality <b>not available</b> on this demonstration site.\",\n \"MODE_HELP\": \"Cesium works in <b>demonstration mode</b>: consultation on account is available, but no operation can be performed.\",\n \"INSTALL_HELP\": \"For <b>security reasons</b> we recommend <b>installing</b> your copy of the software.<br/> Visit the site <a href='https://cesium.app'>www.cesium.app</a> for help.\"\n },\n \"READONLY\": {\n \"BADGE\": \"Monit\",\n \"MODE\": \"Monitoring mode\",\n \"MODE_HELP\": \"Cesium works in <b>monitoring mode</b>: only currency monitoring features are available.\",\n \"INSTALL_HELP\": \"If you want to <b>create a wallet account</b> to send or received money, we recommend <b>installing</b> your copy of the software.<br/> Visit the site <a href='https://cesium.app'>www.cesium.app</a> for help.\"\n }\n },\n \"DOWNLOAD\": {\n \"POPUP_TITLE\": \"<b>Revocation file</b>\",\n \"POPUP_REVOKE_MESSAGE\": \"To safeguard your account, please download the <b>account revocation document</b>. It will allow you to cancel your account (in case of account theft, ID, an incorrectly created account, etc.).<br/><br/><b>Please store it in a safe place.</b>\"\n },\n \"HELP\": {\n \"TITLE\": \"Online help\",\n \"JOIN\": {\n \"SECTION\": \"Join\",\n \"SALT\": \"The secret identifier is very important. It is used to hash you password, which in turn is used to calculate your <span class=\\\"text-italic\\\">public account key</span> (its number) and the private key to access it.<br/><b>Please remeber this identifier well</b>, because there is no way to recover it when lost.<br/>Furthermore, it cannot be changed without having to create a new account.<br/><br/>A good secret identifier must be sufficiently long (8 characters at the very least) and as original as possible.\",\n \"PASSWORD\": \"The password is very important. Together with the secret identifier, it is use to calculate your account number (pblic key) and the private key to access it.<br/><b>Please remember it well</b>, because there is no way to recover it when lost.<br/>Furthermore, it cannot be changed without having to create a new account.<br/><br/>A good password is made (ideally) of at least 8 characters, with at least one capital and one number.\",\n \"PSEUDO\": \"A pseudonym is used only when joining as <span class=\\\"text-italic\\\">member</span>. It is always associated with a wallet (by its <span class=\\\"text-italic\\\">public key</span>).<br/>It is published on the network so that other users may identify it, certify or send money to the account.<br/>A pseudonym must be unique among all members (current and past).\"\n },\n \"LOGIN\": {\n \"SECTION\": \"Log in\",\n \"PUBKEY\": \"Account public key\",\n \"PUBKEY_DEF\": \"The public key of the keychain is generated from the entered identifiers (any), but does not correspond to an account already used.<br/><b>Make sure your public key is the same as your account</b>. Otherwise, you will be logged into an account that is probably never used, as the risk of collision with an existing account is very small.<br/><a href=\\\"https://en.wikipedia.org/wiki/Elliptic_curve_cryptography\\\" target=\\\"_ system\\\">Learn more about cryptography</a> by public key.\",\n \"METHOD\": \"Connection methods\",\n \"METHOD_DEF\": \"Several options are available to connect to a portfolios: <br/> - The connection <b>with salt (simple or advanced)</b> mixes your password with the secret identifier, to limit the attempts of piracy<br/> - The connection <b>using public key</b> prevents you from entering your credentials, which you will be asked only when an operation need it.<br/> - The connection <b>using keychain file</b> will read the public and private keys of the account from a file without the need to enter credentials. Several file formats are possible.\"\n },\n \"GLOSSARY\": {\n \"SECTION\": \"Glossary\",\n \"PUBKEY_DEF\": \"A public key always identifies a wallet. It may identify a member. In Cesium it is calculated using the secret identifier and the password.\",\n \"MEMBER\": \"Member\",\n \"MEMBER_DEF\": \"A member is a real and living human, wishing to participate freely to the monitary community. The member will receive universal dividend, according to the period and amount as defined in the <span class=\\\"text-italic\\\">currency parameters</span>.\",\n \"CURRENCY_RULES\": \"Currency rules\",\n \"CURRENCY_RULES_DEF\": \"The currency rules are defined only once, and for all. They set the parameters under which the currency will perform: universal dividend calculation, the amount of certifications needed to become a member, the maximum amount of certifications a member can send, etc.<br/><br/>The parameters cannot be modified because of the use of a <span class=\\\"text-italic\\\">Blockchain</span> which carries and executes these rules, and constantly verifies their correct application. <a href=\\\"#/app/currency\\\">See current parameters</a>.\",\n \"BLOCKCHAIN\": \"Blockchain\",\n \"BLOCKCHAIN_DEF\": \"The Blockchain is a decentralised system which, in case of Duniter, serves to carry and execute the <span class=\\\"text-italic\\\">currency rules</span>.<br/><a href=\\\"http://en.duniter.org/presentation/\\\" target=\\\"_blank\\\">Read more about Duniter</a> and the working of its blockchain.\",\n \"UNIVERSAL_DIVIDEND_DEF\": \"The Universal Dividend (UD) is the quantity of money co-created by each member, according to the period and the calculation defined in the <span class=\\\"text-italic\\\">currency rules</span>.<br/>Every term, the members receive an equal amount of new money on their account.<br/><br/>The UD undergoes a steady growth, to remain fair under its members (current and future), calculated by an average life expectancy, as demonstrated in the Relative Theory of Money (RTM).<br/><a href=\\\"http://trm.creationmonetaire.info\\\" target=\\\"_system\\\">Read more about RTM</a> and open money.\",\n \"WOT\": \"Web of Trust (WoT)\",\n \"WOT_DEF\": \"The Web of Trust is made up of all the members of the currency, and the links of certification which connect them.\",\n \"DISTANCE_RULE\": \"Distance rule\",\n \"DISTANCE_RULE_DEF\": \"The rule of distance defines <b>a maximum distance to meet</b> between an applicant and a minimum number of referring member. This distance is calculated using the certification links.\"\n },\n \"TIP\": {\n \"MENU_BTN_CURRENCY\": \"Menu <b>{{'MENU.CURRENCY'|translate}}</b> allows discovery of <b>currency parameters</b> and its state.\",\n \"CURRENCY_WOT\": \"The <b>member count</b> shows the <b>community's weight and evolution</b>.\",\n \"CURRENCY_MASS\": \"Shown here is the <b>total amount</b> currently in circulation and its <b>average distribution</b> per member.<br/><br/>This allows to estimate the <b>worth of any amount</b>, in respect to what <b>others own</b> on their account (on average).\",\n \"CURRENCY_UNIT_RELATIVE\": \"The unit used here (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) signifies that the amounts in {{currency|capitalize}} have been devided by the <b>Universal Dividend</b> (UD).<br/><br/><small>This relative unit is <b>relevant</b> because it is stable in contrast to the permanently growing monitary mass.</small>\",\n \"CURRENCY_CHANGE_UNIT\": \"The option <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> allows to <b>switch the unit</b> to show amounts in <b>{{currency|capitalize}}</b>, undevided by the Universal Dividend (instead of in “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”).\",\n \"CURRENCY_CHANGE_UNIT_TO_RELATIVE\": \"The option <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> allows to <b>switch the unit</b> to show amounts in “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”, which is relative to the Universal Dividend (the amount co-produced by each member).\",\n \"CURRENCY_RULES\": \"The <b>rules</b> of the currency determine its <b>exact and predictible</b> performance.<br/><br/>As a true DNA of the currency these rules make the monetary code <b>transparent and understandable</b>.\",\n \"MENU_BTN_NETWORK\": \"Menu <b>{{'MENU.NETWORK'|translate}}</b> allows discovery of <b>network's state<b>.\",\n \"NETWORK_BLOCKCHAIN\": \"All monetary transactions are recoded in a <b>public and tamper proof</b> ledger, generally referred to as the <b>blockchain</b>.\",\n \"NETWORK_PEERS\": \"The <b>peers</b> shown here correspond to <b>computers that update and check</b> the blockchain.<br/><br/>The more active peers there are, the more <b>decentralised</b> and therefore trustworhty the currency becomes.\",\n \"NETWORK_PEERS_BLOCK_NUMBER\": \"This <b>number</b> (in green) indicates the peer's <b>latest validated block</b> (last page written in the ledger).<br/><br/>Green indicates that the block was equally validated by the <b>majority of other peers</b>.\",\n \"NETWORK_PEERS_PARTICIPATE\": \"<b>Each member</b>, equiped with a computer with Internet, <b>can participate, adding a peer</b> simply by <b>installing the Duniter software</b> (free/libre). <a target=\\\"_new\\\" href=\\\"{{installDocUrl}}\\\" target=\\\"_system\\\">Read the installation manual >></a>.\",\n \"MENU_BTN_ACCOUNT\": \"<b>{{'ACCOUNT.TITLE'|translate}}</b> allows access to your account balance and transaction history.\",\n \"MENU_BTN_ACCOUNT_MEMBER\": \"Here you can consult your account status, transaction history and your certifications.\",\n \"WALLET_CERTIFICATIONS\": \"Click here to reveiw the details of your certifications (given and received).\",\n \"WALLET_RECEIVED_CERTIFICATIONS\": \"Click here to review the details of your <b>received certifications</b>.\",\n \"WALLET_GIVEN_CERTIFICATIONS\": \"Click here to review the details of your <b>given certifications</b>.\",\n \"WALLET_BALANCE\": \"Your account <b>balance</b> is shown here.\",\n \"WALLET_BALANCE_RELATIVE\": \"{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>The used unit (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) signifies that the amount in {{currency|capitalize}} has been divided by the <b>Universal Dividend</b> (UD) co-created by each member.<br/>At this moment, 1 UD equals {{currentUD}} {{currency|capitalize}}.\",\n \"WALLET_BALANCE_CHANGE_UNIT\": \"You can <b>change the unit</b> in which amounts are shown in <b><i class=\\\"icon ion-android-settings\\\"></i> {{'MENU.SETTINGS'|translate}}</b>.<br/><br/>For example, to display amounts <b>directly in {{currency|capitalize}}</b> instead of relative amounts.\",\n \"WALLET_PUBKEY\": \"This is your account public key. You can communicate it to a third party so that it more easily identifies your account.\",\n \"WALLET_SEND\": \"Issue a payment in just a few clicks.\",\n \"WALLET_SEND_NO_MONEY\": \"Issue a payment in just a few clicks.<br/>(Your balance does not allow this yet)\",\n \"WALLET_OPTIONS\": \"Please note that this button allows access to <b>other, less used actions</b>.<br/><br/>Don't forget to take a quick look, when you have a moment!\",\n \"WALLET_RECEIVED_CERTS\": \"This shows the list of persons that certified you.\",\n \"WALLET_CERTIFY\": \"The button <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> allows selecting an identity and certifying it.<br/><br/>Only users that are <b>already member</b> may certify others.\",\n \"WALLET_CERT_STOCK\": \"Your supply of certifications (to send) is limited to <b>{{sigStock}} certifications</b>.<br/><br/>This supply will replete itself over time, as and when earlier certifications expire.\",\n \"MENU_BTN_WALLETS\": \"The menu <b>{{'MENU.WALLETS'|translate}}</b> allows you to add additional wallets that you manage.\",\n \"MENU_BTN_TX\": \"The menu <b>{{'MENU.TRANSACTIONS'|translate}}</b> allow access to transactions history, and send new payments.\",\n \"MENU_BTN_WOT\": \"The menu <b>{{'MENU.WOT'|translate}}</b> allows searching <b>users</b> of the currency (member or not).\",\n \"WOT_SEARCH_TEXT_XS\": \"To search in the registry, type the <b>first letters of a users pseudonym or public key</b>.<br/><br/>The search will start automatically.\",\n \"WOT_SEARCH_TEXT\": \"To search in the registry, type the <b>first letters of a users pseudonym or public key</b>.<br/><br/>Then hit <b>Enter</b> to start the search.\",\n \"WOT_SEARCH_RESULT\": \"Simply click a user row to view the details sheet.\",\n \"WOT_VIEW_CERTIFICATIONS\": \"The row <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> shows how many members members validated this identity.<br/><br/>These certifications testify that the account belongs to <b>a living human</b> and this person has <b>no other member account</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_COUNT\": \"There are at least <b>{{sigQty}} certifications</b> needed to become a member and receive the <b>Universal Dividend</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_CLICK\": \"Click here to open <b>a list of all certifications</b> given to and by this identity.\",\n \"WOT_VIEW_CERTIFY\": \"The button <b>{{'WOT.BTN_CERTIFY'|translate}}</b> allows to add your certification to this identity.\",\n \"CERTIFY_RULES\": \"<b>Attention:</b> Only certify <b>real and living persons</b> that do not own any other certified account.<br/><br/>The trust carried by the currency depends on each member's vigilance!\",\n \"MENU_BTN_SETTINGS\": \"The <b>{{'MENU.SETTINGS'|translate}}</b> allow you to configure the Cesium application.<br/><br/>For example, you can <b>change the unit</b> in which the currency will be shown.\",\n \"HEADER_BAR_BTN_PROFILE\": \"Click here to access your <b>user profile</b>\",\n \"SETTINGS_CHANGE_UNIT\": \"You can <b>change the display unit</b> of amounts by clicking here.<br/><br/>- Deactivate the option to show amounts in {{currency|capitalize}}.<br/>- Activate the option for relative amounts in {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (<b>divided</b> by the current Universal Dividend).\",\n \"END_LOGIN\": \"This guided visit has <b>ended</b>.<br/><br/>Welcome to the <b>free economy</b>!\",\n \"END_NOT_LOGIN\": \"This guided visit has <b>ended</b>.<br/><br/>If you wish to join the currency {{currency|capitalize}}, simply click <b>{{'LOGIN.CREATE_FREE_ACCOUNT'|translate}}</b> below.\",\n \"END_READONLY\": \"This guided visit has <b>ended</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}.\"\n }\n },\n \"API\" :{\n \"COMMON\": {\n \"LINK_DOC\": \"API documentation\",\n \"LINK_DOC_HELP\": \"API documentation for developers\",\n \"LINK_STANDARD_APP\": \"Standard version\",\n \"LINK_STANDARD_APP_HELP\": \"Open standard version of {{'COMMON.APP_NAME'|translate}}\",\n \"CONNECTION_ERROR\": \"Peer <b>{{server}}</b> unreachable or invalid address.<br/><br/>Check your Internet connection, or contact the web site administrator.\"\n },\n \"HOME\": {\n \"TITLE\": \"{{'COMMON.APP_NAME'|translate}} API Documentation\",\n \"MESSAGE\": \"Welcome to the {{'COMMON.APP_NAME'|translate}} <b>API documentation </b>.<br/>Connect your web site to <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> very easily!\",\n \"MESSAGE_SHORT\": \"Connect your websites to <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> very easily!\",\n \"DOC_HEADER\": \"Available services:\"\n },\n \"TRANSFER\": {\n \"TITLE\": \"{{'COMMON.APP_NAME'|translate}} - Online payment\",\n \"TITLE_SHORT\": \"Online payment\",\n \"SUMMARY\": \"Order summary:\",\n \"AMOUNT\": \"Amount:\",\n \"AMOUNTS_HELP\": \"Please select the amount:\",\n \"NAME\": \"Name:\",\n \"PUBKEY\": \"Public key of the recipient:\",\n \"COMMENT\": \"Order reference:\",\n \"NODE\": \"Peer address:\",\n \"DEMO\": {\n \"SALT\": \"demo\",\n \"PASSWORD\": \"demo\",\n \"PUBKEY\": \"3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1\",\n \"HELP\": \"<b>Demonstration mode</b>: No payment will actually be sent during this simulation.<br/>Please use credentials: <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>\",\n \"BAD_CREDENTIALS\": \"Invalid credentials.<br/>In demonstration mode, credentials should be: {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}\"\n },\n \"INFO\": {\n \"SUCCESS_REDIRECTING_WITH_NAME\": \"Payment sent.<br/>Redirect to <b>{{name}}</b>...\",\n \"SUCCESS_REDIRECTING\": \"Payment sent.<br/>Redirect to the seller's website...\",\n \"CANCEL_REDIRECTING_WITH_NAME\": \"Payment cancelled.<br/>Redirect to <b>{{name}}</b>...\",\n \"CANCEL_REDIRECTING\": \"Payment cancelled.<br/>Redirect to the seller's website...\"\n },\n \"ERROR\": {\n \"TRANSFER_FAILED\": \"Payment failed\"\n }\n },\n \"DOC\": {\n \"DESCRIPTION_DIVIDER\": \"Description\",\n \"URL_DIVIDER\": \"Calling address\",\n \"PARAMETERS_DIVIDER\": \"Parameters\",\n \"AVAILABLE_PARAMETERS\": \"Here is the list of al available parameters:\",\n \"DEMO_DIVIDER\": \"Try it !\",\n \"DEMO_HELP\": \"To test this service, click on this button. The result content will be display below.\",\n \"DEMO_RESULT\": \"Result returned by call:\",\n \"DEMO_RESULT_PEER\": \"Peer address used:\",\n \"DEMO_SUCCEED\": \"<i class=\\\"icon ion-checkmark\\\"></i> Success!\",\n \"DEMO_CANCELLED\": \"<i class=\\\"icon ion-close\\\"></i> Cancelled by user\",\n \"INTEGRATE_DIVIDER\": \"Website integration\",\n \"INTEGRATE_CODE\": \"Code:\",\n \"INTEGRATE_RESULT\": \"Result preview:\",\n \"INTEGRATE_PARAMETERS\": \"Parameters\",\n \"TRANSFER\": {\n \"TITLE\": \"Payments\",\n \"DESCRIPTION\": \"From a site (eg online marketplace) you can delegate payment in free currency to Cesium API. To do this, simply open a page at the following address:\",\n \"PARAM_PUBKEY\": \"Recipient's public key\",\n \"PARAM_PUBKEY_HELP\": \"Recipient's public key (required)\",\n \"PARAM_AMOUNT\": \"Amount\",\n \"PARAM_AMOUNT_HELP\": \"Transaction amount (required)\",\n \"PARAM_COMMENT\": \"Reference (or comment)\",\n \"PARAM_COMMENT_HELP\": \"Reference or comment. You will allow for example to identify the payment in the BlockChain.\",\n \"PARAM_NAME\": \"Name (of recipient or website)\",\n \"PARAM_NAME_HELP\": \"The name of your website. This can be a readable name (eg \\\"My online site\\\"), or a web address (eg \\\"www.MySite.com\\\").\",\n \"PARAM_REDIRECT_URL\": \"URL redirection\",\n \"PARAM_REDIRECT_URL_HELP\": \"URL redirection after sending payment, after the payment has been sent. Can contain the following strings, which will be replaced by the values of the transaction: \\\"{tx}\\\", \\\"{hash}\\\", \\\"{comment}\\\", \\\"{amount}\\\" and \\\"{pubkey}\\\".\",\n \"PARAM_CANCEL_URL\": \"URL if cancelled\",\n \"PARAM_CANCEL_URL_HELP\": \"URL in case of cancellation. Can contain the following strings, which will be replaced: \\\"{comment}\\\", \\\"{amount}\\\" and \\\"{pubkey}\\\".\",\n \"PARAM_PREFERRED_NODE\": \"Preferred Duniter peer\",\n \"PARAM_PREFERRED_NODE_HELP\": \"Peer address (URL) to use preferably (\\\"g1.domain.com:443\\\" or \\\"https://g1.domain.com\\\")\",\n \"EXAMPLES_HELP\": \"Examples of integration:\",\n \"EXAMPLE_BUTTON\": \"HTML Button\",\n \"EXAMPLE_BUTTON_DEFAULT_TEXT\": \"Pay in {{currency|abbreviate}}\",\n \"EXAMPLE_BUTTON_DEFAULT_STYLE\": \"Custom style\",\n \"EXAMPLE_BUTTON_TEXT_HELP\": \"Button text\",\n \"EXAMPLE_BUTTON_BG_COLOR\": \"Background color\",\n \"EXAMPLE_BUTTON_BG_COLOR_HELP\": \"eg: #fbc14c, yellow, lightgrey, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_FONT_COLOR\": \"Font color\",\n \"EXAMPLE_BUTTON_FONT_COLOR_HELP\": \"eg: black, orange, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_TEXT_ICON\": \"Icon\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH\": \"Width\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH_HELP\": \"eg: 200px, 50%\",\n \"EXAMPLE_BUTTON_ICON_NONE\": \"No icon\",\n \"EXAMPLE_BUTTON_ICON_DUNITER\": \"Duniter logo\",\n \"EXAMPLE_BUTTON_ICON_CESIUM\": \"Cesium logo\",\n \"EXAMPLE_BUTTON_ICON_G1_COLOR\": \"Ğ1 logo\",\n \"EXAMPLE_BUTTON_ICON_G1_BLACK\": \"Ğ1 logo (outline)\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"en\", {\n \"COMMON\": {\n \"APP_NAME\": \"Cesium\",\n \"APP_VERSION\": \"v{{version}}\",\n \"APP_BUILD\": \"build {{build}}\",\n \"PUBKEY\": \"Public key\",\n \"MEMBER\": \"Member\",\n \"BLOCK\" : \"Block\",\n \"BTN_OK\": \"OK\",\n \"BTN_YES\": \"Yes\",\n \"BTN_NO\": \"No\",\n \"BTN_SEND\": \"Send\",\n \"BTN_SEND_MONEY\": \"Transfer money\",\n \"BTN_SEND_MONEY_SHORT\": \"Transfer\",\n \"BTN_SAVE\": \"Save\",\n \"BTN_YES_SAVE\": \"Yes, Save\",\n \"BTN_YES_CONTINUE\": \"Yes, Continue\",\n \"BTN_SHOW\": \"Show\",\n \"BTN_SHOW_PUBKEY\": \"Show key\",\n \"BTN_RELATIVE_UNIT\": \"Display amounts in UD?\",\n \"BTN_BACK\": \"Back\",\n \"BTN_NEXT\": \"Next\",\n \"BTN_IMPORT\": \"Import\",\n \"BTN_CANCEL\": \"Cancel\",\n \"BTN_CLOSE\": \"Close\",\n \"BTN_LATER\": \"Later\",\n \"BTN_LOGIN\": \"Sign In\",\n \"BTN_LOGOUT\": \"Logout\",\n \"BTN_ADD_ACCOUNT\": \"New Account\",\n \"BTN_SHARE\": \"Share\",\n \"BTN_EDIT\": \"Edit\",\n \"BTN_DELETE\": \"Delete\",\n \"BTN_ADD\": \"Add\",\n \"BTN_SEARCH\": \"Search\",\n \"BTN_REFRESH\": \"Refresh\",\n \"BTN_RETRY\": \"Retry\",\n \"BTN_START\": \"Start\",\n \"BTN_CONTINUE\": \"Continue\",\n \"BTN_CREATE\": \"Create\",\n \"BTN_UNDERSTOOD\": \"I understand\",\n \"BTN_OPTIONS\": \"Options\",\n \"BTN_HELP_TOUR\": \"Features tour\",\n \"BTN_HELP_TOUR_SCREEN\": \"Discover this screen\",\n \"BTN_DOWNLOAD\": \"Download\",\n \"BTN_DOWNLOAD_ACCOUNT_STATEMENT\": \"Download account statement\",\n \"BTN_MODIFY\": \"Modify\",\n \"CHOOSE_FILE\": \"Drag your file<br/>or click to select\",\n \"DAYS\": \"days\",\n \"NO_ACCOUNT_QUESTION\": \"Not a member yet? Register now!\",\n \"SEARCH_NO_RESULT\": \"No result found\",\n \"LOADING\": \"Loading...\",\n \"LOADING_WAIT\": \"Loading...<br/><small>(Waiting for node availability)</small>\",\n \"SEARCHING\": \"Searching...\",\n \"FROM\": \"From\",\n \"TO\": \"To\",\n \"COPY\": \"Copy\",\n \"LANGUAGE\": \"Language\",\n \"UNIVERSAL_DIVIDEND\": \"Universal dividend\",\n \"UD\": \"UD\",\n \"DATE_PATTERN\": \"MM/DD/YYYY HH:mm\",\n \"DATE_FILE_PATTERN\": \"YYYY-MM-DD\",\n \"DATE_SHORT_PATTERN\": \"MM/DD/YY\",\n \"DATE_MONTH_YEAR_PATTERN\": \"MM/YYYY\",\n \"EMPTY_PARENTHESIS\": \"(empty)\",\n \"UID\": \"Pseudonym\",\n \"ENABLE\": \"Enabled\",\n \"DISABLE\": \"Disabled\",\n \"RESULTS_LIST\": \"Results:\",\n \"RESULTS_COUNT\": \"{{count}} results\",\n \"EXECUTION_TIME\": \"executed in {{duration|formatDurationMs}}\",\n \"SHOW_VALUES\": \"Display values openly?\",\n \"POPOVER_ACTIONS_TITLE\": \"Options\",\n \"POPOVER_FILTER_TITLE\": \"Filters\",\n \"SHOW_MORE\": \"Show more\",\n \"SHOW_MORE_COUNT\": \"(current limit at {{limit}})\",\n \"POPOVER_SHARE\": {\n \"TITLE\": \"Share\",\n \"SHARE_ON_TWITTER\": \"Share on Twitter\",\n \"SHARE_ON_FACEBOOK\": \"Share on Facebook\",\n \"SHARE_ON_DIASPORA\": \"Share on Diaspora*\",\n \"SHARE_ON_GOOGLEPLUS\": \"Share on Google+\"\n },\n \"FILE\": {\n \"DATE\" : \"Date:\",\n \"TYPE\" : \"Type:\",\n \"SIZE\": \"Size:\",\n \"VALIDATING\": \"Validating...\"\n }\n },\n \"SYSTEM\": {\n \"PICTURE_CHOOSE_TYPE\": \"Choose source:\",\n \"BTN_PICTURE_GALLERY\": \"Gallery\",\n \"BTN_PICTURE_CAMERA\": \"<b>Camera</b>\"\n },\n \"MENU\": {\n \"HOME\": \"Home\",\n \"WOT\": \"Registry\",\n \"CURRENCY\": \"Currency\",\n \"ACCOUNT\": \"My Account\",\n \"WALLETS\": \"My wallets\",\n \"SETTINGS\": \"Settings\",\n \"NETWORK\": \"Network\",\n \"TRANSACTIONS\": \"My transactions\"\n },\n \"ABOUT\": {\n \"TITLE\": \"About\",\n \"LICENSE\": \"<b>Free/libre software</b> (License GNU AGPLv3).\",\n \"LATEST_RELEASE\": \"There is a <b>newer version</ b> of {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)\",\n \"PLEASE_UPDATE\": \"Please update {{'COMMON.APP_NAME' | translate}} (latest version: <b>v{{version}}</b>)\",\n \"CODE\": \"Source code:\",\n \"OFFICIAL_WEB_SITE\": \"Official web site:\",\n \"DEVELOPERS\": \"Developers:\",\n \"FORUM\": \"Forum:\",\n \"PLEASE_REPORT_ISSUE\": \"Please report any issue to us!\",\n \"REPORT_ISSUE\": \"Report an issue\",\n \"BTN_OPEN_DEV_WINDOW\": \"Open the debug window\"\n },\n \"HOME\": {\n \"TITLE\": \"Cesium\",\n \"WELCOME\": \"Welcome to the Cesium application!\",\n \"WELCOME_READONLY\": \"Welcome to Cesium <span class='badge badge-balanced'>Monit</span> !\",\n \"MESSAGE\": \"Receive and send libre currency {{currency|abbreviate}}\",\n \"MESSAGE_READONLY\": \"Real-time monitoring of libre currency {{currency|abbreviate}}\",\n \"BTN_CURRENCY\": \"Explore currency {{currency|abbreviate}}\",\n \"BTN_ABOUT\": \"about\",\n \"BTN_HELP\": \"Help\",\n \"BTN_NETWORK\": \"Network status\",\n \"FREE_SOFTWARE\": \"Free software\",\n \"FORK_ME\": \"Fork me!\",\n \"SHOW_LICENSE\": \"Show license\",\n \"REPORT_ISSUE\": \"Report an issue\",\n \"NOT_YOUR_ACCOUNT_QUESTION\" : \"You do not own the account <b><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}</b>?\",\n \"BTN_CHANGE_ACCOUNT\": \"Disconnect this account\",\n \"CONNECTION_ERROR\": \"Peer <b>{{server}}</b> unreachable or invalid address.<br/><br/>Check your Internet connection, or change node <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">in the settings</a>.\",\n \"SHOW_ALL_FEED\": \"Show all\",\n \"READ_MORE\": \"Read more\",\n \"FEED_SOURCE\": \"Source\"\n },\n \"SETTINGS\": {\n \"TITLE\": \"Settings\",\n \"DISPLAY_DIVIDER\": \"Display\",\n \"STORAGE_DIVIDER\": \"Storage\",\n \"NETWORK_SETTINGS\": \"Network\",\n \"PEER\": \"Duniter peer address\",\n \"PEER_SHORT\": \"Peer address\",\n \"PEER_CHANGED_TEMPORARY\": \"Address used temporarily\",\n \"PERSIST_CACHE\": \"Keep navigation data (experimental)\",\n \"PERSIST_CACHE_HELP\": \"Allows faster navigation, locally retaining the data received, for use from one session to another.\",\n \"USE_LOCAL_STORAGE\": \"Enable local storage\",\n \"USE_LOCAL_STORAGE_HELP\": \"Allows you to save your settings\",\n \"WALLETS_SETTINGS\": \"My wallets\",\n \"USE_WALLETS_ENCRYPTION\": \"Secure the list\",\n \"USE_WALLETS_ENCRYPTION_HELP\": \"Enables you to encrypt the list of your wallets. Authentication required to access it.\",\n \"ENABLE_HELPTIP\": \"Enable contextual help tips\",\n \"DISABLE_HELPTIP\": \"Disable contextual help tips\",\n \"ENABLE_UI_EFFECTS\": \"Enable visual effects\",\n \"HISTORY_SETTINGS\": \"Account operations\",\n \"DISPLAY_UD_HISTORY\": \"Display produced dividends?\",\n \"TX_HISTORY_AUTO_REFRESH\": \"Enable automatic refresh?\",\n \"TX_HISTORY_AUTO_REFRESH_HELP\": \"Updates the list of operations to each new block.\",\n \"AUTHENTICATION_SETTINGS\": \"Authentication\",\n \"KEEP_AUTH\": \"Expiration of authentication\",\n \"KEEP_AUTH_SHORT\": \"Expiration\",\n \"KEEP_AUTH_HELP\": \"Define when authentication is cleared from memory.\",\n \"KEEP_AUTH_OPTION\": {\n \"NEVER\": \"After each operation\",\n \"SECONDS\": \"After {{value}}s of inactivity\",\n \"MINUTE\": \"After {{value}}min of inactivity\",\n \"MINUTES\": \"After {{value}}min of inactivity\",\n \"HOUR\": \"After {{value}}h of inactivity\",\n \"ALWAYS\": \"At the end of the session\"\n },\n \"KEYRING_FILE\": \"Keyring file\",\n \"KEYRING_FILE_HELP\": \"Allow auto-connect at startup, or to authenticate (only if \\\"Expiration of authentication\\\" is \\\"at the end of the session\\\"\",\n \"REMEMBER_ME\": \"Remember me ?\",\n \"REMEMBER_ME_HELP\": \"Allows to remain identified from one session to another, keeping the public key locally.\",\n \"PLUGINS_SETTINGS\": \"Extensions\",\n \"BTN_RESET\": \"Restore default values\",\n \"EXPERT_MODE\": \"Enable expert mode\",\n \"EXPERT_MODE_HELP\": \"Allow to see more details\",\n \"BLOCK_VALIDITY_WINDOW\": \"Block uncertainty time\",\n \"BLOCK_VALIDITY_WINDOW_SHORT\": \"Time of uncertainty\",\n \"BLOCK_VALIDITY_WINDOW_HELP\": \"Time to wait before considering an information is validated\",\n \"BLOCK_VALIDITY_OPTION\": {\n \"NONE\": \"No delay\",\n \"N\": \"{{time | formatDuration}} ({{count}} blocks)\"\n },\n \"POPUP_PEER\": {\n \"TITLE\" : \"Duniter peer\",\n \"HOST\" : \"Address\",\n \"HOST_HELP\": \"Address: server:port\",\n \"USE_SSL\" : \"Secured?\",\n \"USE_SSL_HELP\" : \"(SSL Encryption)\",\n \"BTN_SHOW_LIST\" : \"Peer's list\"\n }\n },\n \"BLOCKCHAIN\": {\n \"HASH\": \"Hash: {{hash}}\",\n \"VIEW\": {\n \"HEADER_TITLE\": \"Block #{{number}}-{{hash|formatHash}}\",\n \"TITLE_CURRENT\": \"Current block\",\n \"TITLE\": \"Block #{{number|formatInteger}}\",\n \"COMPUTED_BY\": \"Computed by\",\n \"SHOW_RAW\": \"Show raw data\",\n \"TECHNICAL_DIVIDER\": \"Technical informations\",\n \"VERSION\": \"Format version\",\n \"HASH\": \"Computed hash\",\n \"UNIVERSAL_DIVIDEND_HELP\": \"Money co-produced by each of the {{membersCount}} members\",\n \"EMPTY\": \"Aucune donnée dans ce bloc\",\n \"POW_MIN\": \"Minimal difficulty\",\n \"POW_MIN_HELP\": \"Difficulty imposed in calculating hash\",\n \"DATA_DIVIDER\": \"Data\",\n \"IDENTITIES_COUNT\": \"New identities\",\n \"JOINERS_COUNT\": \"Joiners\",\n \"ACTIVES_COUNT\": \"Renewals\",\n \"ACTIVES_COUNT_HELP\": \"Members having renewed their membership\",\n \"LEAVERS_COUNT\": \"Leavers\",\n \"LEAVERS_COUNT_HELP\": \"Members that now refused certification\",\n \"EXCLUDED_COUNT\": \"Excluded members\",\n \"EXCLUDED_COUNT_HELP\": \"Old members, excluded because missing membreship renewal or certifications\",\n \"REVOKED_COUNT\": \"Revoked identities\",\n \"REVOKED_COUNT_HELP\": \"These accounts may no longer be member\",\n \"TX_COUNT\": \"Transactions\",\n \"CERT_COUNT\": \"Certifications\",\n \"TX_TO_HIMSELF\": \"Change\",\n \"TX_OUTPUT_UNLOCK_CONDITIONS\": \"Unlock conditions\",\n \"TX_OUTPUT_OPERATOR\": {\n \"AND\": \"and\",\n \"OR\": \"or\"\n },\n \"TX_OUTPUT_FUNCTION\": {\n \"SIG\": \"<b>Sign</b> of the public key\",\n \"XHX\": \"<b>Password</b>, including SHA256 =\",\n \"CSV\": \"Blocked during\",\n \"CLTV\": \"Bloqué until\"\n }\n },\n \"LOOKUP\": {\n \"TITLE\": \"Blocks\",\n \"NO_BLOCK\": \"No bloc\",\n \"LAST_BLOCKS\": \"Last blocks:\",\n \"BTN_COMPACT\": \"Compact\"\n }\n },\n \"CURRENCY\": {\n \"VIEW\": {\n \"TITLE\": \"Currency\",\n \"TAB_CURRENCY\": \"Currency\",\n \"TAB_WOT\": \"Web of trust\",\n \"TAB_NETWORK\": \"Network\",\n \"TAB_BLOCKS\": \"Blocks\",\n \"CURRENCY_SHORT_DESCRIPTION\": \"{{currency|capitalize}} is a <b>libre money</b>, started {{firstBlockTime | formatFromNow}}. It currently counts <b>{{N}} members </b>, who produce and collect a <a ng-click=\\\"showHelpModal('ud')\\\">Universal Dividend</a> (DU), each {{dt | formatPeriod}}.\",\n \"NETWORK_RULES_DIVIDER\": \"Network rules\",\n \"CURRENCY_NAME\": \"Currency name\",\n \"MEMBERS\": \"Members count\",\n \"MEMBERS_VARIATION\": \"Variation since {{duration|formatDuration}} (since last UD)\",\n \"MONEY_DIVIDER\": \"Money\",\n \"MASS\": \"Monetary mass\",\n \"SHARE\": \"Money share\",\n \"UD\": \"Universal Dividend\",\n \"C_ACTUAL\": \"Current growth\",\n \"MEDIAN_TIME\": \"Current blockchain time\",\n \"POW_MIN\": \"Common difficulty\",\n \"MONEY_RULES_DIVIDER\": \"Rules of currency\",\n \"C_RULE\": \"Theoretical growth target\",\n \"UD_RULE\": \"Universal dividend (formula)\",\n \"DT_REEVAL\": \"Period between two re-evaluation of the UD\",\n \"REEVAL_SYMBOL\": \"reeval\",\n \"DT_REEVAL_VALUE\": \"Every <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})\",\n \"UD_REEVAL_TIME0\": \"Date of first reevaluation of the UD\",\n \"SIG_QTY_RULE\": \"Required number of certifications to become a member\",\n \"SIG_STOCK\": \"Maximum number of certifications sent by a member\",\n \"SIG_PERIOD\": \"Minimum delay between 2 certifications sent by one and the same issuer.\",\n \"SIG_WINDOW\": \"Maximum delay before a certification will be treated\",\n \"SIG_VALIDITY\": \"Lifetime of a certification that has been treated\",\n \"MS_WINDOW\": \"Maximum delay before a pending membership will be treated\",\n \"MS_VALIDITY\": \"Lifetime of a membership that has been treated\",\n \"STEP_MAX\": \"Maximum distance between a newcomer and each referring members.\",\n \"WOT_RULES_DIVIDER\": \"Rules for web of trust\",\n \"SENTRIES\": \"Required number of certifications (given <b>and</b> received) to become a referring member\",\n \"SENTRIES_FORMULA\": \"Required number of certifications to become a referring member (formula)\",\n \"XPERCENT\":\"Minimum percent of referring member to reach to match the distance rule\",\n \"AVG_GEN_TIME\": \"The average time between 2 blocks\",\n \"CURRENT\": \"current\",\n \"MATH_CEILING\": \"CEILING\",\n \"DISPLAY_ALL_RULES\": \"Display all rules?\",\n \"BTN_SHOW_LICENSE\": \"Show license\",\n \"WOT_DIVIDER\": \"Web of trust\"\n },\n \"LICENSE\": {\n \"TITLE\": \"Currency license\",\n \"BTN_DOWNLOAD\": \"Download file\",\n \"NO_LICENSE_FILE\": \"License file not found.\"\n }\n },\n \"NETWORK\": {\n \"VIEW\": {\n \"MEDIAN_TIME\": \"Blockchain time\",\n \"LOADING_PEERS\": \"Loading peers...\",\n \"NODE_ADDRESS\": \"Address:\",\n \"SOFTWARE\": \"Software:\",\n \"WARN_PRE_RELEASE\": \"Pre-release (latest stable: <b>{{version}}</b>)\",\n \"WARN_NEW_RELEASE\": \"Version <b>{{version}}</b> available\",\n \"WS2PID\": \"Identifier:\",\n \"PRIVATE_ACCESS\": \"Private access\",\n \"POW_PREFIX\": \"Proof of work prefix:\",\n \"ENDPOINTS\": {\n \"BMAS\": \"Secure endpoint (SSL)\",\n \"BMATOR\": \"TOR endpoint\",\n \"WS2P\": \"WS2P endpoint\",\n \"ES_USER_API\": \"Cesium+ data node\"\n }\n },\n \"INFO\": {\n \"ONLY_SSL_PEERS\": \"Non-SSL nodes have a degraded display because Cesium works in HTTPS mode.\"\n }\n },\n \"PEER\": {\n \"PEERS\": \"Peers\",\n \"SIGNED_ON_BLOCK\": \"Signed on block\",\n \"MIRROR\": \"mirror\",\n \"MIRRORS\": \"Mirrors\",\n \"MIRROR_PEERS\": \"Mirror peers\",\n \"PEER_LIST\" : \"Peer's list\",\n \"MEMBERS\" : \"Members\",\n \"MEMBER_PEERS\" : \"Member peers\",\n \"ALL_PEERS\" : \"All peers\",\n \"DIFFICULTY\" : \"Difficulty\",\n \"API\" : \"API\",\n \"CURRENT_BLOCK\" : \"Block #\",\n \"POPOVER_FILTER_TITLE\": \"Filter\",\n \"OFFLINE\": \"Offline\",\n \"OFFLINE_PEERS\": \"Offline peers\",\n \"BTN_SHOW_PEER\": \"Show peer\",\n \"VIEW\": {\n \"TITLE\": \"Peer\",\n \"OWNER\": \"Owned by \",\n \"SHOW_RAW_PEERING\": \"See peering document\",\n \"SHOW_RAW_CURRENT_BLOCK\": \"See current block (raw format)\",\n \"LAST_BLOCKS\": \"Last blocks\",\n \"KNOWN_PEERS\": \"Known peers :\",\n \"GENERAL_DIVIDER\": \"General information\",\n \"ERROR\": {\n \"LOADING_TOR_NODE_ERROR\": \"Could not get peer data, using the TOR network.\",\n \"LOADING_NODE_ERROR\": \"Could not get peer data\"\n }\n }\n },\n \"WOT\": {\n \"SEARCH_HELP\": \"Search (member or public key)\",\n \"SEARCH_INIT_PHASE_WARNING\": \"During the pre-registration phase, the search for pending registrations <b>may be long</b>. Please wait ...\",\n \"REGISTERED_SINCE\": \"Registered on\",\n \"REGISTERED_SINCE_BLOCK\": \"Registered since block #\",\n \"NO_CERTIFICATION\": \"No validated certification\",\n \"NO_GIVEN_CERTIFICATION\": \"No given certification\",\n \"NOT_MEMBER_PARENTHESIS\": \"(non-member)\",\n \"IDENTITY_REVOKED_PARENTHESIS\": \"(identity revoked)\",\n \"MEMBER_PENDING_REVOCATION_PARENTHESIS\": \"(being revoked)\",\n \"EXPIRE_IN\": \"Expires\",\n \"NOT_WRITTEN_EXPIRE_IN\": \"Deadline<br/>treatment\",\n \"EXPIRED\": \"Expired\",\n \"PSEUDO\": \"Pseudonym\",\n \"SIGNED_ON_BLOCK\": \"Emitted on block #{{block}}\",\n \"WRITTEN_ON_BLOCK\": \"Written on block #{{block}}\",\n \"GENERAL_DIVIDER\": \"General information\",\n \"NOT_MEMBER_ACCOUNT\": \"Non-member account\",\n \"NOT_MEMBER_ACCOUNT_HELP\": \"This is a simple wallet, with no pending membership application.\",\n \"TECHNICAL_DIVIDER\": \"Technical data\",\n \"BTN_CERTIFY\": \"Certify\",\n \"BTN_YES_CERTIFY\": \"Yes, certify\",\n \"BTN_SELECT_AND_CERTIFY\": \"New certification\",\n \"ACCOUNT_OPERATIONS\": \"Account operations\",\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"Identity {{title}}\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Registry\",\n \"NEWCOMERS\": \"New members:\",\n \"NEWCOMERS_COUNT\": \"{{count}} members\",\n \"PENDING\": \"Pending registrations:\",\n \"PENDING_COUNT\": \"{{count}} pending registrations\",\n \"REGISTERED\": \"Registered {{sigDate | formatFromNow}}\",\n \"MEMBER_FROM\": \"Member since {{memberDate|medianFromNowShort}}\",\n \"BTN_NEWCOMERS\": \"Latest members\",\n \"BTN_PENDING\": \"Pending registrations\",\n \"SHOW_MORE\": \"Show more\",\n \"SHOW_MORE_COUNT\": \"(current limit to {{limit}})\",\n \"NO_PENDING\": \"No pending registrations.\",\n \"NO_NEWCOMERS\": \"No members.\"\n },\n \"CONTACTS\": {\n \"TITLE\": \"Contacts\"\n },\n \"MODAL\": {\n \"TITLE\": \"Search\"\n },\n \"CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certifications\",\n \"SUMMARY\": \"Received certifications\",\n \"LIST\": \"Details of received certifications\",\n \"PENDING_LIST\": \"Pending certifications\",\n \"RECEIVED\": \"Received certifications\",\n \"RECEIVED_BY\": \"Certifications received by {{uid}}\",\n \"ERROR\": \"Received certifications in error\",\n \"SENTRY_MEMBER\": \"Referring member\"\n },\n \"OPERATIONS\": {\n \"TITLE\": \"{{uid}} - Operations\"\n },\n \"GIVEN_CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certifications sent\",\n \"SUMMARY\": \"Sent certifications\",\n \"LIST\": \"Details of sent certifications\",\n \"PENDING_LIST\": \"Pending certifications\",\n \"SENT\": \"Sent certifications\",\n \"SENT_BY\": \"Certifications sent by {{uid}}\",\n \"ERROR\": \"Sent certifications with error\"\n }\n },\n \"LOGIN\": {\n \"TITLE\": \"<i class=\\\"icon ion-log-in\\\"></i> Login\",\n \"SCRYPT_FORM_HELP\": \"Please enter your credentials. <br> Remember to check the public key for your account.\",\n \"PUBKEY_FORM_HELP\": \"Please enter a public account key:\",\n \"FILE_FORM_HELP\": \"Choose the keychain file to use:\",\n \"SCAN_FORM_HELP\": \"Scan the QR code of a wallet.\",\n \"SALT\": \"Secret identifier\",\n \"SALT_HELP\": \"Secret identifier\",\n \"SHOW_SALT\": \"Display secret identifier?\",\n \"PASSWORD\": \"Password\",\n \"PASSWORD_HELP\": \"Password\",\n \"PUBKEY_HELP\": \"Public key or pseudonym\",\n \"NO_ACCOUNT_QUESTION\": \"Don't have an account yet?\",\n \"HAVE_ACCOUNT_QUESTION\": \"Already have an account ?\",\n \"CREATE_ACCOUNT\": \"Create an account\",\n \"CREATE_FREE_ACCOUNT\": \"Create a free account\",\n \"FORGOTTEN_ID\": \"Forgot password?\",\n \"ASSOCIATED_PUBKEY\": \"Public key :\",\n \"BTN_METHODS\": \"Other methods\",\n \"BTN_METHODS_DOTS\": \"Change method...\",\n \"METHOD_POPOVER_TITLE\": \"Methods\",\n \"MEMORIZE_AUTH_FILE\": \"Memorize this keychain during the navigation session\",\n \"SCRYPT_PARAMETERS\": \"Paramètres (Scrypt) :\",\n \"AUTO_LOGOUT\": {\n \"TITLE\": \"Information\",\n \"MESSAGE\": \"<i class=\\\"ion-android-time\\\"></i> You were <b>logout</ b> automatically, due to prolonged inactivity.\",\n \"BTN_RELOGIN\": \"Sign In\",\n \"IDLE_WARNING\": \"You will be logout... {{countdown}}\"\n },\n \"METHOD\": {\n \"SCRYPT_DEFAULT\": \"Secret identifier and password\",\n \"SCRYPT_ADVANCED\": \"Advanced salt\",\n \"FILE\": \"Keychain file\",\n \"PUBKEY\": \"Public key or pseudonym\",\n \"SCAN\": \"Scan a QR code\"\n },\n \"SCRYPT\": {\n \"SIMPLE\": \"Light salt\",\n \"DEFAULT\": \"Standard salt\",\n \"SECURE\": \"Secure salt\",\n \"HARDEST\": \"Hardest salt\",\n \"EXTREME\": \"Extreme salt\",\n \"USER\": \"Personal value\",\n \"N\": \"N (Loop):\",\n \"r\": \"r (RAM):\",\n \"p\": \"p (CPU):\"\n },\n \"FILE\": {\n \"HELP\": \"Expected file format: <b>.dunikey</b> (type PubSec). Other formats are under development (EWIF, WIF).\"\n }\n },\n \"AUTH\": {\n \"TITLE\": \"<i class=\\\"icon ion-locked\\\"></i> Authentication\",\n \"BTN_AUTH\": \"Authenticate\",\n \"GENERAL_HELP\": \"Please authenticate yourself:\",\n \"EXPECTED_UID_HELP\": \"Please authenticate to the account <i class=\\\"ion-person\\\"></i> {{uid}}:\",\n \"EXPECTED_PUBKEY_HELP\": \"Please authenticate to the wallet <i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}:\",\n \"SCAN_FORM_HELP\": \"Scan the QR code of the <b>private key</b> of the wallet.\"\n },\n \"ACCOUNT\": {\n \"TITLE\": \"My Account\",\n \"BALANCE\": \"Balance\",\n \"LAST_TX\": \"Latest validated transactions\",\n \"BALANCE_ACCOUNT\": \"Account balance\",\n \"NO_TX\": \"No transaction\",\n \"SHOW_MORE_TX\": \"Show more\",\n \"SHOW_ALL_TX\": \"Show all\",\n \"TX_FROM_DATE\": \"(current limit to {{fromTime|medianFromNowShort}})\",\n \"PENDING_TX\": \"Pending transactions\",\n \"VALIDATING_TX\": \"Transactions being validated\",\n \"ERROR_TX\": \"Transaction not executed\",\n \"ERROR_TX_SENT\": \"Sent transactions\",\n \"PENDING_TX_RECEIVED\": \"Transactions awaiting receipt\",\n \"EVENTS\": \"Events\",\n \"OUT_DISTANCED\": \"Your current certifications come from a group too isolated from the <a ng-click=\\\"showHelpModal('wot')\\\"> Web of Trust</a> (WoT): the <a ng-click=\\\"showHelpModal('distance_rule')\\\">maximum distance rule</a> is violated.<br/>You must obtain certifications from another area of the Web of Trust, or wait for it to tighten.\",\n \"WAITING_MEMBERSHIP\": \"Membership application sent. Waiting validation.\",\n \"WAITING_CERTIFICATIONS\": \"You need {{needCertificationCount}} certification(s) to become a member and produce the <a ng-click=\\\"showHelpModal('ud')\\\">Universal Dividend</a>. Your account is however already operational, to receive and send payments.\",\n \"WAITING_CERTIFICATIONS_HELP\": \"To get your certifications, only request members <b>who know you enough</b>, as required by <a ng-click=\\\"showLicenseModal()\\\">the currency license</a> that you have accepted.<br/>If you do not know enough members, let them know on <a ng-click=\\\"openLink($event, $root.settings.userForumUrl)\\\">the user forum</a>.\",\n \"WILL_MISSING_CERTIFICATIONS\": \"You will <b>lack certifications</b> soon (at least {{willNeedCertificationCount}} more are needed)\",\n \"WILL_NEED_RENEW_MEMBERSHIP\": \"Your membership <b>will expire {{membershipExpiresIn|formatDurationTo}}</b>. Remember to <a ng-click=\\\"doQuickFix('renew')\\\">renew your membership</a> before then.\",\n \"NEED_RENEW_MEMBERSHIP\": \"You are no longer a member because your membership <b>has expired</b>. Remember to <a ng-click=\\\"doQuickFix('renew')\\\">renew your membership</a>.\",\n \"NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED\": \"You are no longer a member because your membership <b>has been canceled</b> for lack of certifications. Remember to <a ng-click=\\\"doQuickFix('renew')\\\">renew your membership</a>.\",\n \"NO_WAITING_MEMBERSHIP\": \"No membership application pending. If you'd like to <b>become a member</ b>, please <a ng-click=\\\"doQuickFix('membership')\\\">send the membership application</a>.\",\n \"CERTIFICATION_COUNT\": \"Received certifications\",\n \"CERTIFICATION_COUNT_SHORT\": \"Certifications\",\n \"SIG_STOCK\": \"Stock of certifications to give\",\n \"BTN_RECEIVE_MONEY\": \"Receive\",\n \"BTN_SELECT_ALTERNATIVES_IDENTITIES\": \"Switch to another identity...\",\n \"BTN_FIX_MEMBERSHIP\": \"Resubmit membership request...\",\n \"BTN_MEMBERSHIP_RENEW\": \"Renew membership\",\n \"BTN_MEMBERSHIP_RENEW_DOTS\": \"Renew membership...\",\n \"BTN_MEMBERSHIP_OUT_DOTS\": \"Revoke membership...\",\n \"BTN_SECURITY_DOTS\": \"Sign-in and security...\",\n \"BTN_SHOW_DETAILS\": \"Display technical data\",\n \"LOCKED_OUTPUTS_POPOVER\": {\n \"TITLE\": \"Locked amount\",\n \"DESCRIPTION\": \"Here are the conditions for unlocking this amount:\",\n \"DESCRIPTION_MANY\": \"This transaction consists of several parts, of which the unlock conditions are:\",\n \"LOCKED_AMOUNT\": \"Conditions for the amount:\"\n },\n \"NEW\": {\n \"TITLE\": \"Registration\",\n \"INTRO_WARNING_TIME\": \"Creating an account on {{name|capitalize}} is very simple. Please take sufficient time to do this correctly (not to forget the usernames, passwords, etc.).\",\n \"INTRO_WARNING_SECURITY\": \"Check that the hardware you are currently using (computer, tablet, phone) <b>is secure and trustworthy </b>.\",\n \"INTRO_WARNING_SECURITY_HELP\": \"Up-to-date anti-virus, firewall enabled, session protected by password or pin code...\",\n \"INTRO_HELP\": \"Click <b> {{'COMMON.BTN_START'|translate}}</b> to begin creating an account. You will be guided step by step.\",\n \"REGISTRATION_NODE\": \"Your registration will be registered via the Duniter peer <b>{{server}}</b> node, which will then be distributed to the rest of the currency network.\",\n \"REGISTRATION_NODE_HELP\": \"If you do not trust this peer, please change <a ng-click=\\\"doQuickFix('settings')\\\">in the settings</a> of Cesium.\",\n \"SELECT_ACCOUNT_TYPE\": \"Choose the type of account to create:\",\n \"MEMBER_ACCOUNT\": \"Member account\",\n \"MEMBER_ACCOUNT_TITLE\": \"Create a member account\",\n \"MEMBER_ACCOUNT_HELP\": \"If you are not yet registered as an individual (one account possible per individual).\",\n \"WALLET_ACCOUNT\": \"Simple wallet\",\n \"WALLET_ACCOUNT_TITLE\": \"Create a wallet\",\n \"WALLET_ACCOUNT_HELP\": \"If you represent a company, association, etc. or simply need an additional wallet. No universal dividend will be created by this account.\",\n \"SALT_WARNING\": \"Choose a secret identifier.<br/>You need it for each connection to this account.<br/><br/><b>Make sure to remember this identifier</b>.<br/>If lost, there are no means to retrieve it!\",\n \"PASSWORD_WARNING\": \"Choose a password.<br/>You need it for each connection to this account.<br/><br/><b>Make sure to remember this password</b>.<br/>If lost, there are no means to retrieve it!\",\n \"PSEUDO_WARNING\": \"Choose a pseudonym.<br/>It may be used by other people to find you more easily.<br/><br/>.Use of <b>commas, spaces and accents</b> is not allowed.<br/><div class='hidden-xs'><br/>Example: <span class='gray'>JohnDalton, JackieChan, etc.</span>\",\n \"PSEUDO\": \"Pseudonym\",\n \"PSEUDO_HELP\": \"joe123\",\n \"SALT_CONFIRM\": \"Confirm\",\n \"SALT_CONFIRM_HELP\": \"Confirm the secret identifier\",\n \"PASSWORD_CONFIRM\": \"Confirm\",\n \"PASSWORD_CONFIRM_HELP\": \"Confirm the password\",\n \"SLIDE_6_TITLE\": \"Confirmation:\",\n \"COMPUTING_PUBKEY\": \"Computing...\",\n \"LAST_SLIDE_CONGRATULATION\": \"You completed all required fields.<br/><b>You can send the account creation request</b>.<br/><br/>For information, the public key below identifies your future account.<br/>It can be communicated to third parties to receive their payment.<br/>Once your account has been approved, you can find this key under <b>{{'ACCOUNT.TITLE'|translate}}</b>.\",\n \"CONFIRMATION_MEMBER_ACCOUNT\": \"<b class=\\\"assertive\\\">Warning:</b> your secret identifier, password and pseudonym can not be changed.<br/><b>Make sure you always remember it!</b><br/><b>Are you sure</b> you want to send this account creation request?\",\n \"CONFIRMATION_WALLET_ACCOUNT\": \"<b class=\\\"assertive\\\">Warning:</b> your password and pseudonym can not be changed.<br/><b>Make sure you always remember it!</b><br/><b>Are you sure</b> you want to continue?\",\n \"CHECKING_PSEUDO\": \"Checking...\",\n \"PSEUDO_AVAILABLE\": \"This pseudonym is available\",\n \"PSEUDO_NOT_AVAILABLE\": \"This pseudonym is not available\",\n \"INFO_LICENSE\": \"To be able to adhere to the currency, we ask you to kindly read and accept this license.\",\n \"BTN_ACCEPT\": \"I accept\",\n \"BTN_ACCEPT_LICENSE\": \"I accept the license\"\n },\n \"POPUP_REGISTER\": {\n \"TITLE\": \"Enter a pseudonym\",\n \"HELP\": \"A pseudonym is needed to let other members find you.\"\n },\n \"SELECT_IDENTITY_MODAL\": {\n \"TITLE\": \"Identity selection\",\n \"HELP\": \"Several <b>different identities</b> have been sent, for the public key <span class=\\\"gray\\\"> <i class=\\\"ion-key\\\"></i> {{pubkey | formatPubkey}}</span>.<br/>Please select the identity to use:\"\n },\n \"SELECT_WALLET_MODAL\": {\n \"TITLE\": \"Wallet selection\"\n },\n \"WALLET_LIST\": {\n \"TITLE\": \"My wallets\",\n \"BTN_NEW\": \"Add a wallet\",\n \"BTN_DOWNLOAD\": \"Download the list\",\n \"BTN_IMPORT_FILE_DOTS\": \"Import from a file...\",\n \"NO_WALLET\": \"No secondary wallet\",\n \"BTN_DELETE\": \"Remove a secondary wallet...\",\n \"BTN_RENAME\": \"Rename the wallet\",\n \"EXPORT_FILENAME\": \"my_wallets-{{pubkey|formatPubkey}}-{{currency}}.csv\",\n \"TOTAL_DOTS\": \"Total: \",\n \"EDIT_POPOVER\": {\n \"TITLE\": \"Rename the wallet\",\n \"HELP\": \"Fill in the new name\",\n \"NAME_HELP\": \"Wallet name\"\n },\n \"IMPORT_MODAL\": {\n \"TITLE\": \"Import secondary wallets\",\n \"HELP\": \"To <b>import secodnary wallets</b>, please drag the file in the box below, or click in the box to search for a file.\",\n \"WALLET_COUNT\": \"<b>{{count}}</b> new wallet{{count > 1 ? 's' : ''}}\",\n \"NO_NEW_WALLET\": \"No new wallet\"\n }\n },\n \"SECURITY\":{\n \"ADD_QUESTION\" : \"Add custom question\",\n \"BTN_CLEAN\" : \"Clean\",\n \"BTN_RESET\" : \"Reset\",\n \"DOWNLOAD_REVOKE\": \"Save a revocation file\",\n \"DOWNLOAD_REVOKE_HELP\" : \"Having a revocation file is important, for example in case of loss of identifiers. It allows you to <b>get this account out of the Web Of Trust</b>, thus becoming a simple wallet.\",\n \"GENERATE_KEYFILE\": \"Generate my keychain file ...\",\n \"GENERATE_KEYFILE_HELP\": \"Generate a file allowing you to authenticate without entering your identifiers.<br/><b>Warning:</b> this file will contain your secret key; It is therefore very important to put it in a safe place!\",\n \"KEYFILE_FILENAME\": \"keychain-{{pubkey|formatPubkey}}-{{currency}}-{{format}}.dunikey\",\n \"MEMBERSHIP_IN\": \"Register as member...\",\n \"MEMBERSHIP_IN_HELP\": \"Allows you to <b>transform </b> a simple wallet account <b>into a member account</b>, by sending a membership request. Useful only if you do not already have another member account.\",\n \"SEND_IDENTITY\": \"Publish identity...\",\n \"SEND_IDENTITY_HELP\": \"Allows you to associate a pseudonym to this account, but <b>without applying for membership</b> to become a member. This is not very useful because the validity of this pseudonym association is limited in time.\",\n \"HELP_LEVEL\": \"Choose <strong> at least {{nb}} questions </strong> :\",\n \"LEVEL\": \"Security level\",\n \"LOW_LEVEL\": \"Low <span class=\\\"hidden-xs\\\">(2 questions minimum)</span>\",\n \"MEDIUM_LEVEL\": \"Medium <span class=\\\"hidden-xs\\\">(4 questions minimum)</span>\",\n \"QUESTION_1\": \"What was your best friend's name when you were a teen ?\",\n \"QUESTION_2\": \"What was the name of your first pet ?\",\n \"QUESTION_3\": \"What is the first meal you have learned to cook ?\",\n \"QUESTION_4\": \"What is the first movie you saw in the cinema?\",\n \"QUESTION_5\": \"Where did you go the first time you flew ?\",\n \"QUESTION_6\": \"What was your favorite elementary school teacher's name ?\",\n \"QUESTION_7\": \"What would you consider the ideal job ?\",\n \"QUESTION_8\": \"Which children's book do you prefer?\",\n \"QUESTION_9\": \"What was the model of your first vehicle?\",\n \"QUESTION_10\": \"What was your nickname when you were a child ?\",\n \"QUESTION_11\": \"What was your favorite movie character or actor when you were a student ?\",\n \"QUESTION_12\": \"What was your favorite singer or band when you were a student ?\",\n \"QUESTION_13\": \"In which city did your parents meet ?\",\n \"QUESTION_14\": \"What was the name of your first boss ?\",\n \"QUESTION_15\": \"What is the name of the street where you grew up ?\",\n \"QUESTION_16\": \"What is the name of the first beach where you go swim ?\",\n \"QUESTION_17\": \"QWhat is the first album you bought ?\",\n \"QUESTION_18\": \"What is the name of your favorite sport team ?\",\n \"QUESTION_19\": \"What was your grand-father's job ?\",\n \"RECOVER_ID\": \"Recover my password...\",\n \"RECOVER_ID_HELP\": \"If you have a <b>backup file of your identifiers</b>, you can find them by answering your personal questions correctly.\",\n \"RECOVER_ID_SELECT_FILE\": \"Select the <b>backup file of your identifiers</b> to use:\",\n \"REVOCATION_WITH_FILE\" : \"Revoke my member account...\",\n \"REVOCATION_WITH_FILE_DESCRIPTION\": \"If you have <b>permanently lost your member account credentials (or if account security is compromised), you can use <b>the revocation file</b> of the account <b>to quit the Web Of Trust</b>.\",\n \"REVOCATION_WITH_FILE_HELP\": \"To <b>permanently revoke</ b> a member account, please drag the revocation file in the box below, or click in the box to search for a file.\",\n \"REVOCATION_WALLET\": \"Revoke this account immediately\",\n \"REVOCATION_WALLET_HELP\": \"Requesting revocation of your identity causes <b>will revoke your membership</ b> (definitely for the associated pseudonym and public key). The account will no longer be able to produce a Universal Dividend.<br/>However, you can still use it as a simple wallet.\",\n \"REVOCATION_FILENAME\": \"revocation-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt\",\n \"SAVE_ID\": \"Save my credentials...\",\n \"SAVE_ID_HELP\": \"Creating a backup file, to <b>retrieve your password</b> (and the secret identifier) <b> in case of forgetting</b>. The file is <b>secured</ b> (encrypted) using personal questions.\",\n \"STRONG_LEVEL\": \"Strong <span class=\\\"hidden-xs \\\">(6 questions minimum)</span>\",\n \"TITLE\": \"Account and security\",\n \"KEYFILE\": {\n \"PUBSEC_FORMAT\": \"PubSec format.\",\n \"PUBSEC_FORMAT_HELP\": \"This file format is compatible in particular with Cesium and Gannonce. Your keychain is stored <b>without encryption</b>: anyone with a copy of this file will be able to empty your account.\",\n \"WIF_FORMAT\": \"Wallet Import Format (WIF)\",\n \"WIF_FORMAT_HELP\": \"This format is used in particular by paper wallets. Your keychain is stored <b>without encryption</b>: anyone with a copy of this file will be able to empty your account.\",\n \"EWIF_FORMAT\": \"Encrypted Wallet Import Format (WIF)\",\n \"EWIF_FORMAT_HELP\": \"This format is used in particular by paper wallets. However, <b>the keychain is encrypted</b> from a passphrase of your choice.\",\n \"PASSWORD_POPUP\": {\n \"TITLE\": \"Keychain file encrypted\",\n \"HELP\": \"Please enter the passphrase:\",\n \"PASSWORD_HELP\": \"Passphrase\"\n },\n \"ERROR\": {\n \"BAD_PASSWORD\": \"Bad passphrase\",\n \"BAD_CHECKSUM\": \"Bad checksum\"\n }\n }\n },\n \"FILE_NAME\": \"{{currency}} - Account statement {{pubkey|formatPubkey}} to {{currentTime|formatDateForFile}}.csv\",\n \"HEADERS\": {\n \"TIME\": \"Date\",\n \"AMOUNT\": \"Amount\",\n \"COMMENT\": \"Comment\"\n }\n },\n \"TRANSFER\": {\n \"TITLE\": \"Transfer\",\n \"SUB_TITLE\": \"Transfer money\",\n \"SUB_TITLE_ALL\": \"Empty the account\",\n \"FROM\": \"From\",\n \"TO\": \"To\",\n \"AMOUNT\": \"Amount\",\n \"AMOUNT_HELP\": \"Amount\",\n \"COMMENT\": \"Comment\",\n \"COMMENT_HELP\": \"Comment (optional)\",\n \"BTN_SEND\": \"Send\",\n \"BTN_ADD_COMMENT\": \"Add a comment\",\n \"REST\": \"Rest of account\",\n \"REST_TO\": \"to\",\n \"WARN_COMMENT_IS_PUBLIC\": \"Please note that <b>comments are public</b> (not encrypted).\",\n \"MODAL\": {\n \"TITLE\": \"Transfer\"\n }\n },\n \"ERROR\": {\n \"UNKNOWN_URI_FORMAT\": \"Unknown URI format\",\n \"PUBKEY_INVALID_CHECKSUM\": \"Invalid public key (bad checksum).\",\n \"POPUP_TITLE\": \"Error\",\n \"UNKNOWN_ERROR\": \"Unknown error\",\n \"CRYPTO_UNKNOWN_ERROR\": \"Your browser is not compatible with cryptographic features.\",\n \"DOWNLOAD_KEYFILE_FAILED\": \"Failed to generate the keychain file.\",\n \"EQUALS_TO_PSEUDO\": \"Must be different from pseudonym\",\n \"EQUALS_TO_SALT\": \"Must be different from secret identifier\",\n \"FIELD_REQUIRED\": \"This field is required.\",\n \"FIELD_TOO_SHORT\": \"This field value is too short.\",\n \"FIELD_TOO_SHORT_WITH_LENGTH\": \"Value is too short (min {{minLength]] characters).\",\n \"FIELD_TOO_LONG\": \"Value is exceeding max length.\",\n \"FIELD_TOO_LONG_WITH_LENGTH\": \"Value is too long (max {{maxLength}} characters).\",\n \"FIELD_MIN\": \"Minimum value: {{min}}\",\n \"FIELD_MAX\": \"Maximal value: {{max}}\",\n \"FIELD_ACCENT\": \"Commas and accent characters not allowed\",\n \"FIELD_NOT_NUMBER\": \"Value is not a number\",\n \"FIELD_NOT_INT\": \"Value is not an integer\",\n \"FIELD_NOT_EMAIL\": \"Email adress not valid\",\n \"PASSWORD_NOT_CONFIRMED\": \"Must match previous password.\",\n \"SALT_NOT_CONFIRMED\": \"Must match previous identifier.\",\n \"SEND_IDENTITY_FAILED\": \"Error while trying to register.\",\n \"SEND_CERTIFICATION_FAILED\": \"Could not certify identity.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY\": \"You could not send certification, because your account is <b>not a member account</b>.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF\": \"You could not send certification now, because your are <b>not a member</b> yet.<br/><br/>You still need certification to become a member.\",\n \"IDENTITY_TO_CERTIFY_HAS_NO_SELF\": \"This account could not be certified. No registration found, or need to renew.\",\n \"LOGIN_FAILED\": \"Error while sign in.\",\n \"LOAD_IDENTITY_FAILED\": \"Could not load identity.\",\n \"LOAD_REQUIREMENTS_FAILED\": \"Could not load identity requirements.\",\n \"SEND_MEMBERSHIP_IN_FAILED\": \"Error while sending registration as member.\",\n \"SEND_MEMBERSHIP_OUT_FAILED\": \"Error while sending membership revocation.\",\n \"REFRESH_WALLET_DATA\": \"Could not refresh wallet.\",\n \"GET_CURRENCY_PARAMETER\": \"Could not get currency parameters.\",\n \"GET_CURRENCY_FAILED\": \"Could not load currency. Please retry later.\",\n \"SEND_TX_FAILED\": \"Could not send transaction.\",\n \"ALL_SOURCES_USED\": \"Please wait the next block computation (All transaction sources has been used).\",\n \"NOT_ENOUGH_SOURCES\": \"Not enough changes to send this amount in one time.<br/>Maximum amount: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.\",\n \"ACCOUNT_CREATION_FAILED\": \"Error while creating your member account.\",\n \"RESTORE_WALLET_DATA_ERROR\": \"Error while reloading settings from local storage\",\n \"LOAD_WALLET_DATA_ERROR\": \"Error while loading wallet data.\",\n \"COPY_CLIPBOARD_FAILED\": \"Could not copy to clipboard\",\n \"TAKE_PICTURE_FAILED\": \"Could not get picture.\",\n \"SCAN_FAILED\": \"Could not scan QR code.\",\n \"SCAN_UNKNOWN_FORMAT\": \"Code not recognized.\",\n \"WOT_LOOKUP_FAILED\": \"Search failed.\",\n \"LOAD_PEER_DATA_FAILED\": \"Duniter peer not accessible. Please retry later.\",\n \"NEED_LOGIN_FIRST\": \"Please sign in first.\",\n \"AMOUNT_REQUIRED\": \"Amount is required.\",\n \"AMOUNT_NEGATIVE\": \"Negative amount not allowed.\",\n \"NOT_ENOUGH_CREDIT\": \"Not enough credit.\",\n \"INVALID_NODE_SUMMARY\": \"Unreachable peer or invalid address\",\n \"INVALID_USER_ID\": \"Field 'pseudonym' must not contains spaces or special characters.\",\n \"INVALID_COMMENT\": \"Field 'reference' has a bad format.\",\n \"INVALID_PUBKEY\": \"Public key has a bad format.\",\n \"INVALID_PUBKEY_CHECKSUM\": \"Invalid checksum.\",\n \"IDENTITY_REVOKED\": \"This identity <b>has been revoked</b>. It can no longer become a member.\",\n \"IDENTITY_REVOKED_WITH_TIME\": \"This identity <b>has been revoked {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). It can no longer become a member.\",\n \"IDENTITY_PENDING_REVOCATION\": \"The <b>revocation of this identity</b> has been requested and is awaiting processing. Certification is therefore disabled.\",\n \"IDENTITY_INVALID_BLOCK_HASH\": \"This membership application is no longer valid (because it references a block that network peers are cancelled): the person must renew its application for membership <b>before</b> being certified.\",\n \"IDENTITY_EXPIRED\": \"This identity has expired: this person must re-apply <b>before</b> being certified.\",\n \"IDENTITY_SANDBOX_FULL\": \"Could not register, because peer's sandbox is full.<br/><br/>Please retry later or choose another Duniter peer (in <b>Settings</b>).\",\n \"IDENTITY_NOT_FOUND\": \"Identity not found\",\n \"IDENTITY_TX_FAILED\": \"Error while getting identity's transactions\",\n \"WOT_PENDING_INVALID_BLOCK_HASH\": \"Membership not valid.\",\n \"WALLET_INVALID_BLOCK_HASH\": \"Your membership application is no longer valid (because it references a block that network peers are cancelled).<br/>You must <a ng-click=\\\"doQuickFix('renew')\\\">renew your application for membership</a> to fix this issue.\",\n \"WALLET_IDENTITY_EXPIRED\": \"The publication of your identity <b>has expired</b>.<br/>You must <a ng-click=\\\"doQuickFix('fixIdentity')\\\">re-issue your identity</a> to resolve this issue.\",\n \"WALLET_REVOKED\": \"Your identity has been <b>revoked</b>: neither your pseudonym nor your public key will be used in the future for a member account.\",\n \"WALLET_HAS_NO_SELF\": \"Your identity must first have been published, and not expired.\",\n \"AUTH_REQUIRED\": \"Authentication required.\",\n \"AUTH_INVALID_PUBKEY\": \"The public key does not match the connected account.\",\n \"AUTH_INVALID_SCRYPT\": \"Invalid username or password.\",\n \"AUTH_INVALID_FILE\": \"Invalid keychain file.\",\n \"AUTH_FILE_ERROR\": \"Failed to open keychain file\",\n \"IDENTITY_ALREADY_CERTIFY\": \"You have <b>already certified</b> that identity.<br/><br/>Your certificate is still valid (expires {{expiresIn|formatDuration}}).\",\n \"IDENTITY_ALREADY_CERTIFY_PENDING\": \"You have <b>already certified</b> that identity.<br/><br/>Your certification is still pending (Deadline for treatment {{expiresIn|formatDuration}}).\",\n \"UNABLE_TO_CERTIFY_TITLE\": \"Unable to certify\",\n \"LOAD_NEWCOMERS_FAILED\": \"Unable to load new members.\",\n \"LOAD_PENDING_FAILED\": \"Unable to load pending registrations.\",\n \"ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"You must <b>be a member</b> in order to perform this action.\",\n \"ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"You must <b>be a member (or old member)</b> in order to perform this action.\",\n \"ONLY_SELF_CAN_EXECUTE_THIS_ACTION\": \"You must have <b>published your identity</b> in order to perform this action.\",\n \"GET_BLOCK_FAILED\": \"Error while getting block\",\n \"INVALID_BLOCK_HASH\": \"Block not found (incorrect hash)\",\n \"DOWNLOAD_REVOCATION_FAILED\": \"Error while downloading revocation file.\",\n \"REVOCATION_FAILED\": \"Error while trying to revoke the identity.\",\n \"SALT_OR_PASSWORD_NOT_CONFIRMED\": \"Wrong secret identifier or password \",\n \"RECOVER_ID_FAILED\": \"Could not recover password\",\n \"LOAD_FILE_FAILED\" : \"Unable to load file\",\n \"NOT_VALID_REVOCATION_FILE\": \"Invalid revocation file (wrong file format)\",\n \"NOT_VALID_SAVE_ID_FILE\": \"Invalid credentials backup file (wrong file format)\",\n \"NOT_VALID_KEY_FILE\": \"Invalid keychain file (unrecognized format)\",\n \"EXISTING_ACCOUNT\": \"Your identifiers correspond to an already existing account, whose <a ng-click=\\\"showHelpModal('pubkey')\\\">public key</a> is:\",\n \"EXISTING_ACCOUNT_REQUEST\": \"Please modify your credentials so that they correspond to an unused account.\",\n \"GET_LICENSE_FILE_FAILED\": \"Unable to get license file\",\n \"CHECK_NETWORK_CONNECTION\": \"No peer appears to be accessible.<br/><br/>Please <b>check your Internet connection</b>.\",\n \"ISSUE_524_TX_FAILED\": \"Failed to transfer.<br/><br/>A message has been sent to developers to help solve the problem.<b>Thank you for your help</b>.\",\n \"ADD_SECONDARY_WALLET_FAILED\": \"Unable to add secondary wallet.\",\n \"REMOVE_SECONDARY_WALLET_FAILED\": \"Unable to remove secondary wallet.\",\n \"UPDATE_WALLET_LIST_FAILED\": \"Unable to refresh the list of wallets.\",\n \"LOAD_WALLET_LIST_FAILED\": \"Unable to load the list of wallets.\",\n \"SAVE_WALLET_LIST_FAILED\": \"Unable to save the list of wallets.\",\n \"COULD_NOT_ADD_MAIN_WALLET\": \"This wallet <b>is the main account</b> with which you are connected. Unable to add it as a secondary wallet.\",\n \"COULD_NOT_ADD_EXISTING_WALLET\": \"Wallet already existing in the list.\",\n \"UNKNOWN_WALLET_ID\": \"Unknown secondary wallet.\",\n \"RESTORE_WALLET_LIST_FAILED\": \"Unable to restore the list of wallets.\",\n \"INVALID_FILE_FORMAT\": \"Invalid file format.\",\n \"SAME_TX_RECIPIENT\": \"The recipient must be different from the issuer.\"\n },\n \"INFO\": {\n \"POPUP_TITLE\": \"Information\",\n \"CERTIFICATION_DONE\": \"Identity successfully signed\",\n \"NOT_ENOUGH_CREDIT\": \"Not enough credit\",\n \"TRANSFER_SENT\": \"Transfer request successfully sent\",\n \"COPY_TO_CLIPBOARD_DONE\": \"Copy succeeded\",\n \"MEMBERSHIP_OUT_SENT\": \"Membership revocation sent\",\n \"NOT_NEED_MEMBERSHIP\": \"Already a member.\",\n \"IDENTITY_WILL_MISSING_CERTIFICATIONS\": \"This identity will soon lack certification (at least {{willNeedCertificationCount}}).\",\n \"IDENTITY_NEED_MEMBERSHIP\": \"This identity did not send a membership request. She will have to if she wishes to become a member.\",\n \"HAS_ALTERNATIVE_IDENTITIES\": \"There are <b>multiple identities</b> attached to this public key. <b>Before any certification</b>, please <a ng-click=\\\"doQuickFix('showSelectIdentities')\\\">check other identities</a> to choose the correct one, or contact the wallet owner.\",\n \"REVOCATION_SENT\": \"Revocation sent successfully\",\n \"REVOCATION_SENT_WAITING_PROCESS\": \"Revocation <b>has been sent successfully</b>. It is awaiting processing.\",\n \"FEATURES_NOT_IMPLEMENTED\": \"This features is not implemented yet.<br/><br/>Why not to contribute to get it faster? ;)\",\n \"EMPTY_TX_HISTORY\": \"No operations to export\"\n },\n \"CONFIRM\": {\n \"POPUP_TITLE\": \"<b>Confirmation</b>\",\n \"POPUP_WARNING_TITLE\": \"<b>Warning</b>\",\n \"POPUP_SECURITY_WARNING_TITLE\": \"<i class=\\\"icon ion-alert-circled\\\"></i> <b>Security warning</b>\",\n \"CERTIFY_RULES_TITLE_UID\": \"Certify {{uid}}\",\n \"CERTIFY_RULES\": \"<b class=\\\"assertive\\\">Don't certify an account</b> if you believe that: <ul><li>1.) the issuers identity might be faked.<li>2.) the issuer already has another certified account.<li>3.) the issuer purposely or carelessly violates rule 1 or 2 (he certifies faked or double accounts).</ul></small><br/>Are you sure you want to certify this identity?\",\n \"FULLSCREEN\": \"View the application in full screen?\",\n \"EXIT_APP\": \"Close the application ?\",\n \"TRANSFER\": \"<b>Transfer summary:</b><br/><br/><ul><li> - From: <b>{{from}}</b></li><li> - To: <b>{{to}}</b></li><li> - Amount: <b>{{amount}} {{unit}}</b></li><li> - Comment: <i>{{comment}}</i></li></ul><br/><b>Are-you sure you want to do this transfer?</b>\",\n \"TRANSFER_ALL\": \"<b>Transfer summary:</b><br/><br/><ul><li> - From: <b>{{from}}</b></li><li> - To: <b>{{to}}</b></li><li> - Amount: <b>{{amount}} {{unit}}</b></li><li> - Comment: <i>{{comment}}</i></li><br/><li> - Rest : <b>{{restAmount}} {{unit}}</b> to <b>{{restTo}}</b></li></ul><br/><b>Are-you sure you want to do this transfer?</b>\",\n \"MEMBERSHIP_OUT\": \"This operation is <b>irreversible</b>.<br/></br/><b>Are you sure you want to terminate your membership?</b>\",\n \"MEMBERSHIP_OUT_2\": \"This operation is <b>irreversible</b>!<br/><br/>Are you sure you want to <b>terminate your membership</b>?\",\n \"LOGIN_UNUSED_WALLET_TITLE\": \"Typing error?\",\n \"LOGIN_UNUSED_WALLET\": \"The account seems to be <b>inactive</b>.<br/><br/>It's probably a <b>typing error</b> when sign in. Please try again, checking that <b>public key is yours<b/>.\",\n \"FIX_IDENTITY\": \"The pseudonym <b>{{uid}}</b> will be published again, replacing the old publication that has expired.<br/></br/><b>Are you sure</b> you want to continue?\",\n \"FIX_MEMBERSHIP\": \"Your application for membership will be sent.<br/></br/><b>Are you sure?</b>\",\n \"MEMBERSHIP\": \"Your membership request will be sent. <br/></br/><b>Are you sure?</b>\",\n \"RENEW_MEMBERSHIP\": \"Your membership will be renewed.<br/></br/><b>Are you sure?</b>\",\n \"REVOKE_IDENTITY\": \"You will <b>definitely revoke this identity</b>.<br/><br/>The public key and the associated pseudonym <b>will never be used again</b> (for a member account).<br/></br/><b>Are you sure</b> you want to revoke this identity?\",\n \"REVOKE_IDENTITY_2\": \"This operation is <b>irreversible</b>!<br/><br/>Are you sure you want to <b>revoke this identity</b>?\",\n \"NOT_NEED_RENEW_MEMBERSHIP\": \"Your membership does not need to be renewed (it will only expire in {{membershipExpiresIn|formatDuration}}).<br/></br/><b>Are you sure you</b> want to renew your membership?\",\n \"SAVE_BEFORE_LEAVE\": \"Do you want to <b>save your changes</b> before leaving the page?\",\n \"SAVE_BEFORE_LEAVE_TITLE\": \"Changes not saved\",\n \"LOGOUT\": \"Are you sure you want to logout?\",\n \"USE_FALLBACK_NODE\": \"Peer <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> node?\",\n \"ISSUE_524_SEND_LOG\": \"The transaction was rejected because of a known problem (issue #524) but not reproduced.<br/><br/>To help developers correct this error, do you accept <b>the transmission of your logs</b> per message?<br/><small>(No confidential data is sent)</small>\"\n },\n \"MODE\": {\n \"DEMO\": {\n \"BADGE\": \"Demo\",\n \"MODE\": \"Demonstration mode\",\n \"FEATURE_NOT_AVAILABLE\": \"Functionality <b>not available</b> on this demonstration site.\",\n \"MODE_HELP\": \"Cesium works in <b>demonstration mode</b>: consultation on account is available, but no operation can be performed.\",\n \"INSTALL_HELP\": \"For <b>security reasons</b> we recommend <b>installing</b> your copy of the software.<br/> Visit the site <a href='https://cesium.app'>www.cesium.app</a> for help.\"\n },\n \"READONLY\": {\n \"BADGE\": \"Monit\",\n \"MODE\": \"Monitoring mode\",\n \"MODE_HELP\": \"Cesium works in <b>monitoring mode</b>: only currency monitoring features are available.\",\n \"INSTALL_HELP\": \"If you want to <b>create a wallet account</b> to send or received money, we recommend <b>installing</b> your copy of the software.<br/> Visit the site <a href='https://cesium.app'>www.cesium.app</a> for help.\"\n }\n },\n \"DOWNLOAD\": {\n \"POPUP_TITLE\": \"<b>Revocation file</b>\",\n \"POPUP_REVOKE_MESSAGE\": \"To safeguard your account, please download the <b>account revocation document</b>. It will allow you to cancel your account (in case of account theft, ID, an incorrectly created account, etc.).<br/><br/><b>Please store it in a safe place.</b>\"\n },\n \"HELP\": {\n \"TITLE\": \"Online help\",\n \"JOIN\": {\n \"SECTION\": \"Join\",\n \"SALT\": \"The secret identifier is very important. It is used to hash you password, which in turn is used to calculate your <span class=\\\"text-italic\\\">public account key</span> (its number) and the private key to access it.<br/><b>Please remeber this identifier well</b>, because there is no way to recover it when lost.<br/>Furthermore, it cannot be changed without having to create a new account.<br/><br/>A good secret identifier must be sufficiently long (8 characters at the very least) and as original as possible.\",\n \"PASSWORD\": \"The password is very important. Together with the secret identifier, it is use to calculate your account number (pblic key) and the private key to access it.<br/><b>Please remember it well</b>, because there is no way to recover it when lost.<br/>Furthermore, it cannot be changed without having to create a new account.<br/><br/>A good password is made (ideally) of at least 8 characters, with at least one capital and one number.\",\n \"PSEUDO\": \"A pseudonym is used only when joining as <span class=\\\"text-italic\\\">member</span>. It is always associated with a wallet (by its <span class=\\\"text-italic\\\">public key</span>).<br/>It is published on the network so that other users may identify it, certify or send money to the account.<br/>A pseudonym must be unique among all members (current and past).\"\n },\n \"LOGIN\": {\n \"SECTION\": \"Log in\",\n \"PUBKEY\": \"Account public key\",\n \"PUBKEY_DEF\": \"The public key of the keychain is generated from the entered identifiers (any), but does not correspond to an account already used.<br/><b>Make sure your public key is the same as your account</b>. Otherwise, you will be logged into an account that is probably never used, as the risk of collision with an existing account is very small.<br/><a href=\\\"https://en.wikipedia.org/wiki/Elliptic_curve_cryptography\\\" target=\\\"_ system\\\">Learn more about cryptography</a> by public key.\",\n \"METHOD\": \"Connection methods\",\n \"METHOD_DEF\": \"Several options are available to connect to a portfolios: <br/> - The connection <b>with salt (simple or advanced)</b> mixes your password with the secret identifier, to limit the attempts of piracy<br/> - The connection <b>using public key</b> prevents you from entering your credentials, which you will be asked only when an operation need it.<br/> - The connection <b>using keychain file</b> will read the public and private keys of the account from a file without the need to enter credentials. Several file formats are possible.\"\n },\n \"GLOSSARY\": {\n \"SECTION\": \"Glossary\",\n \"PUBKEY_DEF\": \"A public key always identifies a wallet. It may identify a member. In Cesium it is calculated using the secret identifier and the password.\",\n \"MEMBER\": \"Member\",\n \"MEMBER_DEF\": \"A member is a real and living human, wishing to participate freely to the monitary community. The member will receive universal dividend, according to the period and amount as defined in the <span class=\\\"text-italic\\\">currency parameters</span>.\",\n \"CURRENCY_RULES\": \"Currency rules\",\n \"CURRENCY_RULES_DEF\": \"The currency rules are defined only once, and for all. They set the parameters under which the currency will perform: universal dividend calculation, the amount of certifications needed to become a member, the maximum amount of certifications a member can send, etc.<br/><br/>The parameters cannot be modified because of the use of a <span class=\\\"text-italic\\\">Blockchain</span> which carries and executes these rules, and constantly verifies their correct application. <a href=\\\"#/app/currency\\\">See current parameters</a>.\",\n \"BLOCKCHAIN\": \"Blockchain\",\n \"BLOCKCHAIN_DEF\": \"The Blockchain is a decentralised system which, in case of Duniter, serves to carry and execute the <span class=\\\"text-italic\\\">currency rules</span>.<br/><a href=\\\"http://en.duniter.org/presentation/\\\" target=\\\"_blank\\\">Read more about Duniter</a> and the working of its blockchain.\",\n \"UNIVERSAL_DIVIDEND_DEF\": \"The Universal Dividend (UD) is the quantity of money co-created by each member, according to the period and the calculation defined in the <span class=\\\"text-italic\\\">currency rules</span>.<br/>Every term, the members receive an equal amount of new money on their account.<br/><br/>The UD undergoes a steady growth, to remain fair under its members (current and future), calculated by an average life expectancy, as demonstrated in the Relative Theory of Money (RTM).<br/><a href=\\\"http://trm.creationmonetaire.info\\\" target=\\\"_system\\\">Read more about RTM</a> and open money.\",\n \"WOT\": \"Web of Trust (WoT)\",\n \"WOT_DEF\": \"The Web of Trust is made up of all the members of the currency, and the links of certification which connect them.\",\n \"DISTANCE_RULE\": \"Distance rule\",\n \"DISTANCE_RULE_DEF\": \"The rule of distance defines <b>a maximum distance to meet</b> between an applicant and a minimum number of referring member. This distance is calculated using the certification links.\"\n },\n \"TIP\": {\n \"MENU_BTN_CURRENCY\": \"Menu <b>{{'MENU.CURRENCY'|translate}}</b> allows discovery of <b>currency parameters</b> and its state.\",\n \"CURRENCY_WOT\": \"The <b>member count</b> shows the <b>community's weight and evolution</b>.\",\n \"CURRENCY_MASS\": \"Shown here is the <b>total amount</b> currently in circulation and its <b>average distribution</b> per member.<br/><br/>This allows to estimate the <b>worth of any amount</b>, in respect to what <b>others own</b> on their account (on average).\",\n \"CURRENCY_UNIT_RELATIVE\": \"The unit used here (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) signifies that the amounts in {{currency|capitalize}} have been devided by the <b>Universal Dividend</b> (UD).<br/><br/><small>This relative unit is <b>relevant</b> because it is stable in contrast to the permanently growing monitary mass.</small>\",\n \"CURRENCY_CHANGE_UNIT\": \"The option <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> allows to <b>switch the unit</b> to show amounts in <b>{{currency|capitalize}}</b>, undevided by the Universal Dividend (instead of in “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”).\",\n \"CURRENCY_CHANGE_UNIT_TO_RELATIVE\": \"The option <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> allows to <b>switch the unit</b> to show amounts in “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”, which is relative to the Universal Dividend (the amount co-produced by each member).\",\n \"CURRENCY_RULES\": \"The <b>rules</b> of the currency determine its <b>exact and predictible</b> performance.<br/><br/>As a true DNA of the currency these rules make the monetary code <b>transparent and understandable</b>.\",\n \"MENU_BTN_NETWORK\": \"Menu <b>{{'MENU.NETWORK'|translate}}</b> allows discovery of <b>network's state<b>.\",\n \"NETWORK_BLOCKCHAIN\": \"All monetary transactions are recoded in a <b>public and tamper proof</b> ledger, generally referred to as the <b>blockchain</b>.\",\n \"NETWORK_PEERS\": \"The <b>peers</b> shown here correspond to <b>computers that update and check</b> the blockchain.<br/><br/>The more active peers there are, the more <b>decentralised</b> and therefore trustworhty the currency becomes.\",\n \"NETWORK_PEERS_BLOCK_NUMBER\": \"This <b>number</b> (in green) indicates the peer's <b>latest validated block</b> (last page written in the ledger).<br/><br/>Green indicates that the block was equally validated by the <b>majority of other peers</b>.\",\n \"NETWORK_PEERS_PARTICIPATE\": \"<b>Each member</b>, equiped with a computer with Internet, <b>can participate, adding a peer</b> simply by <b>installing the Duniter software</b> (free/libre). <a target=\\\"_new\\\" href=\\\"{{installDocUrl}}\\\" target=\\\"_system\\\">Read the installation manual >></a>.\",\n \"MENU_BTN_ACCOUNT\": \"<b>{{'ACCOUNT.TITLE'|translate}}</b> allows access to your account balance and transaction history.\",\n \"MENU_BTN_ACCOUNT_MEMBER\": \"Here you can consult your account status, transaction history and your certifications.\",\n \"WALLET_CERTIFICATIONS\": \"Click here to reveiw the details of your certifications (given and received).\",\n \"WALLET_RECEIVED_CERTIFICATIONS\": \"Click here to review the details of your <b>received certifications</b>.\",\n \"WALLET_GIVEN_CERTIFICATIONS\": \"Click here to review the details of your <b>given certifications</b>.\",\n \"WALLET_BALANCE\": \"Your account <b>balance</b> is shown here.\",\n \"WALLET_BALANCE_RELATIVE\": \"{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>The used unit (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) signifies that the amount in {{currency|capitalize}} has been divided by the <b>Universal Dividend</b> (UD) co-created by each member.<br/>At this moment, 1 UD equals {{currentUD}} {{currency|capitalize}}.\",\n \"WALLET_BALANCE_CHANGE_UNIT\": \"You can <b>change the unit</b> in which amounts are shown in <b><i class=\\\"icon ion-android-settings\\\"></i> {{'MENU.SETTINGS'|translate}}</b>.<br/><br/>For example, to display amounts <b>directly in {{currency|capitalize}}</b> instead of relative amounts.\",\n \"WALLET_PUBKEY\": \"This is your account public key. You can communicate it to a third party so that it more easily identifies your account.\",\n \"WALLET_SEND\": \"Issue a payment in just a few clicks.\",\n \"WALLET_SEND_NO_MONEY\": \"Issue a payment in just a few clicks.<br/>(Your balance does not allow this yet)\",\n \"WALLET_OPTIONS\": \"Please note that this button allows access to <b>other, less used actions</b>.<br/><br/>Don't forget to take a quick look, when you have a moment!\",\n \"WALLET_RECEIVED_CERTS\": \"This shows the list of persons that certified you.\",\n \"WALLET_CERTIFY\": \"The button <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> allows selecting an identity and certifying it.<br/><br/>Only users that are <b>already member</b> may certify others.\",\n \"WALLET_CERT_STOCK\": \"Your supply of certifications (to send) is limited to <b>{{sigStock}} certifications</b>.<br/><br/>This supply will replete itself over time, as and when earlier certifications expire.\",\n \"MENU_BTN_WALLETS\": \"The menu <b>{{'MENU.WALLETS'|translate}}</b> allows you to add additional wallets that you manage.\",\n \"MENU_BTN_TX\": \"The menu <b>{{'MENU.TRANSACTIONS'|translate}}</b> allow access to transactions history, and send new payments.\",\n \"MENU_BTN_WOT\": \"The menu <b>{{'MENU.WOT'|translate}}</b> allows searching <b>users</b> of the currency (member or not).\",\n \"WOT_SEARCH_TEXT_XS\": \"To search in the registry, type the <b>first letters of a users pseudonym or public key</b>.<br/><br/>The search will start automatically.\",\n \"WOT_SEARCH_TEXT\": \"To search in the registry, type the <b>first letters of a users pseudonym or public key</b>.<br/><br/>Then hit <b>Enter</b> to start the search.\",\n \"WOT_SEARCH_RESULT\": \"Simply click a user row to view the details sheet.\",\n \"WOT_VIEW_CERTIFICATIONS\": \"The row <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> shows how many members members validated this identity.<br/><br/>These certifications testify that the account belongs to <b>a living human</b> and this person has <b>no other member account</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_COUNT\": \"There are at least <b>{{sigQty}} certifications</b> needed to become a member and receive the <b>Universal Dividend</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_CLICK\": \"Click here to open <b>a list of all certifications</b> given to and by this identity.\",\n \"WOT_VIEW_CERTIFY\": \"The button <b>{{'WOT.BTN_CERTIFY'|translate}}</b> allows to add your certification to this identity.\",\n \"CERTIFY_RULES\": \"<b>Attention:</b> Only certify <b>real and living persons</b> that do not own any other certified account.<br/><br/>The trust carried by the currency depends on each member's vigilance!\",\n \"MENU_BTN_SETTINGS\": \"The <b>{{'MENU.SETTINGS'|translate}}</b> allow you to configure the Cesium application.<br/><br/>For example, you can <b>change the unit</b> in which the currency will be shown.\",\n \"HEADER_BAR_BTN_PROFILE\": \"Click here to access your <b>user profile</b>\",\n \"SETTINGS_CHANGE_UNIT\": \"You can <b>change the display unit</b> of amounts by clicking here.<br/><br/>- Deactivate the option to show amounts in {{currency|capitalize}}.<br/>- Activate the option for relative amounts in {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (<b>divided</b> by the current Universal Dividend).\",\n \"END_LOGIN\": \"This guided visit has <b>ended</b>.<br/><br/>Welcome to the <b>free economy</b>!\",\n \"END_NOT_LOGIN\": \"This guided visit has <b>ended</b>.<br/><br/>If you wish to join the currency {{currency|capitalize}}, simply click <b>{{'LOGIN.CREATE_FREE_ACCOUNT'|translate}}</b> below.\",\n \"END_READONLY\": \"This guided visit has <b>ended</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}.\"\n }\n },\n \"API\" :{\n \"COMMON\": {\n \"LINK_DOC\": \"API documentation\",\n \"LINK_DOC_HELP\": \"API documentation for developers\",\n \"LINK_STANDARD_APP\": \"Standard version\",\n \"LINK_STANDARD_APP_HELP\": \"Open standard version of {{'COMMON.APP_NAME'|translate}}\",\n \"CONNECTION_ERROR\": \"Peer <b>{{server}}</b> unreachable or invalid address.<br/><br/>Check your Internet connection, or contact the web site administrator.\"\n },\n \"HOME\": {\n \"TITLE\": \"{{'COMMON.APP_NAME'|translate}} API Documentation\",\n \"MESSAGE\": \"Welcome to the {{'COMMON.APP_NAME'|translate}} <b>API documentation </b>.<br/>Connect your web site to <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> very easily!\",\n \"MESSAGE_SHORT\": \"Connect your websites to <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> very easily!\",\n \"DOC_HEADER\": \"Available services:\"\n },\n \"TRANSFER\": {\n \"TITLE\": \"{{'COMMON.APP_NAME'|translate}} - Online payment\",\n \"TITLE_SHORT\": \"Online payment\",\n \"SUMMARY\": \"Order summary:\",\n \"AMOUNT\": \"Amount:\",\n \"AMOUNTS_HELP\": \"Please select the amount:\",\n \"NAME\": \"Name:\",\n \"PUBKEY\": \"Public key of the recipient:\",\n \"COMMENT\": \"Order reference:\",\n \"NODE\": \"Peer address:\",\n \"DEMO\": {\n \"SALT\": \"demo\",\n \"PASSWORD\": \"demo\",\n \"PUBKEY\": \"3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1\",\n \"HELP\": \"<b>Demonstration mode</b>: No payment will actually be sent during this simulation.<br/>Please use credentials: <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>\",\n \"BAD_CREDENTIALS\": \"Invalid credentials.<br/>In demonstration mode, credentials should be: {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}\"\n },\n \"INFO\": {\n \"SUCCESS_REDIRECTING_WITH_NAME\": \"Payment sent.<br/>Redirect to <b>{{name}}</b>...\",\n \"SUCCESS_REDIRECTING\": \"Payment sent.<br/>Redirect to the seller's website...\",\n \"CANCEL_REDIRECTING_WITH_NAME\": \"Payment cancelled.<br/>Redirect to <b>{{name}}</b>...\",\n \"CANCEL_REDIRECTING\": \"Payment cancelled.<br/>Redirect to the seller's website...\"\n },\n \"ERROR\": {\n \"TRANSFER_FAILED\": \"Payment failed\"\n }\n },\n \"DOC\": {\n \"DESCRIPTION_DIVIDER\": \"Description\",\n \"URL_DIVIDER\": \"Calling address\",\n \"PARAMETERS_DIVIDER\": \"Parameters\",\n \"AVAILABLE_PARAMETERS\": \"Here is the list of al available parameters:\",\n \"DEMO_DIVIDER\": \"Try it !\",\n \"DEMO_HELP\": \"To test this service, click on this button. The result content will be display below.\",\n \"DEMO_RESULT\": \"Result returned by call:\",\n \"DEMO_RESULT_PEER\": \"Peer address used:\",\n \"DEMO_SUCCEED\": \"<i class=\\\"icon ion-checkmark\\\"></i> Success!\",\n \"DEMO_CANCELLED\": \"<i class=\\\"icon ion-close\\\"></i> Canceled by user\",\n \"INTEGRATE_DIVIDER\": \"Website integration\",\n \"INTEGRATE_CODE\": \"Code:\",\n \"INTEGRATE_RESULT\": \"Result preview:\",\n \"INTEGRATE_PARAMETERS\": \"Parameters\",\n \"TRANSFER\": {\n \"TITLE\": \"Payments\",\n \"DESCRIPTION\": \"From a site (eg online marketplace) you can delegate payment in free currency to Cesium API. To do this, simply open a page at the following address:\",\n \"PARAM_PUBKEY\": \"Recipient's public key\",\n \"PARAM_PUBKEY_HELP\": \"Recipient's public key (required)\",\n \"PARAM_AMOUNT\": \"Amount\",\n \"PARAM_AMOUNT_HELP\": \"Transaction amount (required)\",\n \"PARAM_COMMENT\": \"Reference (or comment)\",\n \"PARAM_COMMENT_HELP\": \"Reference or comment. You will allow for example to identify the payment in the BlockChain.\",\n \"PARAM_NAME\": \"Name (of recipient or website)\",\n \"PARAM_NAME_HELP\": \"The name of your website. This can be a readable name (eg \\\"My online site\\\"), or a web address (eg \\\"www.MySite.com\\\").\",\n \"PARAM_REDIRECT_URL\": \"URL redirection\",\n \"PARAM_REDIRECT_URL_HELP\": \"URL redirection after sending payment, after the payment has been sent. Can contain the following strings, which will be replaced by the values of the transaction: \\\"{tx}\\\", \\\"{hash}\\\", \\\"{comment}\\\", \\\"{amount}\\\" and \\\"{pubkey}\\\".\",\n \"PARAM_CANCEL_URL\": \"URL if cancelled\",\n \"PARAM_CANCEL_URL_HELP\": \"URL in case of cancellation. Can contain the following strings, which will be replaced: \\\"{comment}\\\", \\\"{amount}\\\" and \\\"{pubkey}\\\".\",\n \"PARAM_PREFERRED_NODE\": \"Preferred Duniter peer\",\n \"PARAM_PREFERRED_NODE_HELP\": \"Peer address (URL) to use preferably (\\\"g1.domain.com:443\\\" or \\\"https://g1.domain.com\\\")\",\n \"EXAMPLES_HELP\": \"Examples of integration:\",\n \"EXAMPLE_BUTTON\": \"HTML Button\",\n \"EXAMPLE_BUTTON_DEFAULT_TEXT\": \"Pay in {{currency|abbreviate}}\",\n \"EXAMPLE_BUTTON_DEFAULT_STYLE\": \"Custom style\",\n \"EXAMPLE_BUTTON_TEXT_HELP\": \"Button text\",\n \"EXAMPLE_BUTTON_BG_COLOR\": \"Background color\",\n \"EXAMPLE_BUTTON_BG_COLOR_HELP\": \"eg: #fbc14c, yellow, lightgrey, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_FONT_COLOR\": \"Font color\",\n \"EXAMPLE_BUTTON_FONT_COLOR_HELP\": \"eg: black, orange, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_TEXT_ICON\": \"Icon\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH\": \"Width\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH_HELP\": \"eg: 200px, 50%\",\n \"EXAMPLE_BUTTON_ICON_NONE\": \"No icon\",\n \"EXAMPLE_BUTTON_ICON_DUNITER\": \"Duniter logo\",\n \"EXAMPLE_BUTTON_ICON_CESIUM\": \"Cesium logo\",\n \"EXAMPLE_BUTTON_ICON_G1_COLOR\": \"Ğ1 logo\",\n \"EXAMPLE_BUTTON_ICON_G1_BLACK\": \"Ğ1 logo (outline)\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"eo-EO\", {\n \"COMMON\": {\n \"APP_NAME\": \"Cesium\",\n \"APP_VERSION\": \"v{{version}}\",\n \"APP_BUILD\": \"date : {{build}}\",\n \"PUBKEY\": \"Publika ŝlosilo\",\n \"MEMBER\": \"Membro\",\n \"BLOCK\" : \"Bloko\",\n \"BTN_OK\": \"OK\",\n \"BTN_YES\": \"Jes\",\n \"BTN_NO\": \"Ne\",\n \"BTN_SEND\": \"Sendi\",\n \"BTN_SEND_MONEY\": \"Fari elspezon\",\n \"BTN_SEND_MONEY_SHORT\": \"Elspezo\",\n \"BTN_SAVE\": \"Konservi\",\n \"BTN_YES_SAVE\": \"Jes, Konservi\",\n \"BTN_YES_CONTINUE\": \"Jes, Daŭrigi\",\n \"BTN_SHOW\": \"Vidi\",\n \"BTN_SHOW_PUBKEY\": \"Afiŝi la publikan ŝlosilon\",\n \"BTN_RELATIVE_UNIT\": \"Afiŝi la sumojn en UD?\",\n \"BTN_BACK\": \"Reiro\",\n \"BTN_NEXT\": \"Sekva\",\n \"BTN_IMPORT\": \"Enporti\",\n \"BTN_CANCEL\": \"Nuligi\",\n \"BTN_CLOSE\": \"Fermi\",\n \"BTN_LATER\": \"Poste\",\n \"BTN_LOGIN\": \"Konektiĝi\",\n \"BTN_LOGOUT\": \"Malkonektiĝo\",\n \"BTN_ADD_ACCOUNT\": \"Nova konto\",\n \"BTN_SHARE\": \"Diskonigi\",\n \"BTN_EDIT\": \"Modifi\",\n \"BTN_DELETE\": \"Forigi\",\n \"BTN_ADD\": \"Aldoni\",\n \"BTN_SEARCH\": \"Serĉi\",\n \"BTN_REFRESH\": \"Aktualigi\",\n \"BTN_RETRY\": \"Rekomenci\",\n \"BTN_START\": \"Komenci\",\n \"BTN_CONTINUE\": \"Daŭrigi\",\n \"BTN_CREATE\": \"Krei\",\n \"BTN_UNDERSTOOD\": \"Mi komprenis\",\n \"BTN_OPTIONS\": \"Kromeblecoj\",\n \"BTN_HELP_TOUR\": \"Gvidata vizito\",\n \"BTN_HELP_TOUR_SCREEN\": \"Malkovri tiun ĉi paĝon\",\n \"BTN_DOWNLOAD\": \"Elŝuti\",\n \"BTN_DOWNLOAD_ACCOUNT_STATEMENT\": \"Elŝuti la konto-tabelon\",\n \"BTN_MODIFY\": \"Modifi\",\n \"CHOOSE_FILE\": \"Almetu vian dosieron <br/>aŭ klaku por elekti ĝin\",\n \"DAYS\": \"tagoj\",\n \"NO_ACCOUNT_QUESTION\": \"Ankoraŭ sen konto? Kreu ĝin senpage!\",\n \"SEARCH_NO_RESULT\": \"Neniu rezulto trovita\",\n \"LOADING\": \"Bonvolu pacienci...\",\n \"LOADING_WAIT\": \"Bonvolu pacienci...<br/><small>(Atendado pri disponebleco de la nodo)</small>\",\n \"SEARCHING\": \"Serĉanta...\",\n \"FROM\": \"De\",\n \"TO\": \"Al\",\n \"COPY\": \"Kopii\",\n \"LANGUAGE\": \"Lingvo\",\n \"UNIVERSAL_DIVIDEND\": \"Universala dividendo\",\n \"UD\": \"UD\",\n \"DATE_PATTERN\": \"DD/MM/YY HH:mm\",\n \"DATE_FILE_PATTERN\": \"YYYY-MM-DD\",\n \"DATE_SHORT_PATTERN\": \"DD/MM/YY\",\n \"DATE_MONTH_YEAR_PATTERN\": \"MM/YYYY\",\n \"EMPTY_PARENTHESIS\": \"(malplena)\",\n \"UID\": \"Pseŭdonimo\",\n \"ENABLE\": \"Aktiva\",\n \"DISABLE\": \"Malaktiva\",\n \"RESULTS_LIST\": \"Rezultoj\",\n \"RESULTS_COUNT\": \"{{count}} rezultoj\",\n \"EXECUTION_TIME\": \"Plenumita en {{duration|formatDurationMs}}\",\n \"SHOW_VALUES\": \"Afiŝi la signojn klare?\",\n \"POPOVER_ACTIONS_TITLE\": \"Kromeblecoj\",\n \"POPOVER_FILTER_TITLE\": \"Filtriloj\",\n \"SHOW_MORE\": \"Afiŝi pli\",\n \"SHOW_MORE_COUNT\": \"(nuna limo je {{limit}})\",\n \"POPOVER_SHARE\": {\n \"TITLE\": \"Diskonigi\",\n \"SHARE_ON_TWITTER\": \"Diskonigi ĉe Twitter\",\n \"SHARE_ON_FACEBOOK\": \"Diskonigi ĉe Facebook\",\n \"SHARE_ON_DIASPORA\": \"Diskonigi ĉe Diaspora*\",\n \"SHARE_ON_GOOGLEPLUS\": \"Diskonigi ĉe Google+\"\n },\n \"FILE\": {\n \"DATE\": \"Dato:\",\n \"TYPE\": \"Tipo:\",\n \"SIZE\": \"Pezo:\",\n \"VALIDATING\": \"Validiĝanta...\"\n }\n },\n \"SYSTEM\": {\n \"PICTURE_CHOOSE_TYPE\": \"Elekti la fonton:\",\n \"BTN_PICTURE_GALLERY\": \"Bildaro\",\n \"BTN_PICTURE_CAMERA\": \"<b>Kamerao</b>\"\n },\n \"MENU\": {\n \"HOME\": \"Hejmpaĝo\",\n \"WOT\": \"Kontaro\",\n \"CURRENCY\": \"Mono\",\n \"ACCOUNT\": \"Mia konto\",\n \"WALLETS\": \"Miaj monujoj\",\n \"SETTINGS\": \"Parametroj\",\n \"NETWORK\": \"Reto\",\n \"TRANSACTIONS\": \"Miaj spezoj\"\n },\n \"ABOUT\": {\n \"TITLE\": \"Prie\",\n \"LICENSE\": \"Programo <b>libera</b> (Licenco GNU AGPLv3).\",\n \"LATEST_RELEASE\": \"Ekzistas <b>pli freŝdata versio</b> de {{'COMMON.APP_NAME'|translate}} (<b>v{{version}}</b>)\",\n \"PLEASE_UPDATE\": \"Bonvolu ĝisdatigi {{'COMMON.APP_NAME'|translate}} (lasta versio: <b>v{{version}}</b>)\",\n \"CODE\": \"Fonto-kodo:\",\n \"OFFICIAL_WEB_SITE\": \"Oficiala retejo:\",\n \"DEVELOPERS\": \"Programita de:\",\n \"FORUM\": \"Forumo:\",\n \"PLEASE_REPORT_ISSUE\": \"Ne hezitu sciigi al ni la renkontitajn fuŝaĵojn\",\n \"REPORT_ISSUE\": \"Sciigi problemon\",\n \"BTN_OPEN_DEV_WINDOW\": \"Malfermi la fenestron pri malfuŝigado\"\n },\n \"HOME\": {\n \"TITLE\": \"Cesium\",\n \"WELCOME\": \"Bonvenon ĉe la programo Cesium!\",\n \"MESSAGE\": \"Ricevu kaj sendu liberan monon {{currency|abbreviate}}\",\n \"BTN_CURRENCY\": \"Esploru la monon {{name|abbreviate}}\",\n \"BTN_ABOUT\": \"prie\",\n \"BTN_HELP\": \"Reta helpo\",\n \"REPORT_ISSUE\": \"fuŝaĵo\",\n \"NOT_YOUR_ACCOUNT_QUESTION\" : \"Vi ne posedas la konton <b><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}</b> ?\",\n \"BTN_CHANGE_ACCOUNT\": \"Malkonektu tiun ĉi konton\",\n \"CONNECTION_ERROR\": \"Nodo <b>{{server}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Kontrolu vian retkonekton, aŭ elektu alian nodon <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">ĉe la parametroj</a>.\"\n },\n \"SETTINGS\": {\n \"TITLE\": \"Parametroj\",\n \"DISPLAY_DIVIDER\": \"Afiŝado\",\n \"STORAGE_DIVIDER\": \"Stokado\",\n \"NETWORK_SETTINGS\": \"Reto\",\n \"PEER\": \"Adreso de la nodo Duniter\",\n \"PEER_SHORT\": \"Adreso de la nodo\",\n \"PEER_CHANGED_TEMPORARY\": \"Adreso provizore uzata\",\n \"USE_LOCAL_STORAGE\": \"Aktivigi lokan stokadon\",\n \"USE_LOCAL_STORAGE_HELP\": \"Ebligas konservi viajn parametrojn\",\n \"WALLETS_SETTINGS\": \"Miaj monujoj\",\n \"USE_WALLETS_ENCRYPTION\": \"Sekurigi la liston?\",\n \"USE_WALLETS_ENCRYPTION_HELP\": \"Ebligas sekurigi la liston de viaj monujoj (per ĉifrado), postulante aŭtentigado por aliri ilin.\",\n \"ENABLE_HELPTIP\": \"Aktivigi la rilatigajn help-vezikojn\",\n \"ENABLE_UI_EFFECTS\": \"Aktivigi la vid-efikojn\",\n \"HISTORY_SETTINGS\": \"Miaj spezoj\",\n \"DISPLAY_UD_HISTORY\": \"Afiŝi la produktitajn dividendojn?\",\n \"TX_HISTORY_AUTO_REFRESH\": \"Aktualigi aŭtomate\",\n \"TX_HISTORY_AUTO_REFRESH_HELP\": \"Aktualigas la saldon kaj la spezojn aŭtomate, por ĉiu nova bloko de la reto.\",\n \"AUTHENTICATION_SETTINGS\": \"Aŭtentigado\",\n \"KEEP_AUTH\": \"Aŭtomata malaŭtentigado\",\n \"KEEP_AUTH_SHORT\": \"Malaŭtentigado\",\n \"KEEP_AUTH_HELP\": \"Difinas la momenton, kiam la aŭtentigado estas forviŝita de la memoro.\",\n \"KEEP_AUTH_OPTION\": {\n \"NEVER\": \"Post ĉiu ago\",\n \"SECONDS\": \"Post {{value}}s de neatktiveco\",\n \"MINUTE\": \"Post {{value}}min de neatktiveco\",\n \"MINUTES\": \"Post {{value}}min de neatktiveco\",\n \"HOUR\": \"Post {{value}}h de neatktiveco\",\n \"ALWAYS\": \"Fine de la sesio\"\n },\n \"KEYRING_FILE\": \"Dosiero pri ŝlosilaro\",\n \"KEYRING_FILE_HELP\": \"Ebligas <b>konektiĝi</b> aŭtomate por ĉiu ekuzo<br/>kaj eĉ <b>aŭtentiĝi</b> (nur se \\\"Finiĝo de la aŭtentiĝo\\\" estas agordita kiel \\\"fine de la sesio\\\").\",\n \"REMEMBER_ME\": \"Memori min?\",\n \"REMEMBER_ME_HELP\": \"Ebligas resti identigita de sesio al alia, loke konservante la publikan ŝlosilon.\",\n \"PLUGINS_SETTINGS\": \"Krom-programoj\",\n \"BTN_RESET\": \"Restarigi la originajn valorojn\",\n \"EXPERT_MODE\": \"Aktivigi la spertan moduson\",\n \"EXPERT_MODE_HELP\": \"Ebligas pli detalan afiŝadon.\",\n \"BLOCK_VALIDITY_WINDOW\": \"Limtempo pri necerteco de la blokoj\",\n \"BLOCK_VALIDITY_WINDOW_SHORT\": \"Limtempo pri necerteco\",\n \"BLOCK_VALIDITY_WINDOW_HELP\": \"Limtempo antaŭ ol taksi, ke iu informo estas validigita\",\n \"BLOCK_VALIDITY_OPTION\": {\n \"NONE\": \"Neniu limtempo\",\n \"N\": \"{{time | formatDuration}} ({{count}} blokoj)\"\n },\n \"POPUP_PEER\": {\n \"TITLE\": \"Nodo Duniter\",\n \"HOST\": \"Adreso\",\n \"HOST_HELP\": \"Adreso: servilo: konektujo\",\n \"USE_SSL\": \"Sekurigita?\",\n \"USE_SSL_HELP\": \"(SSL-ĉifrado)\",\n \"BTN_SHOW_LIST\": \"Listo de la nodoj\"\n }\n },\n \"BLOCKCHAIN\": {\n \"HASH\": \"Haketo: {{hash}}\",\n \"VIEW\": {\n \"HEADER_TITLE\": \"Bloko #{{number}}-{{hash|formatHash}}\",\n \"TITLE_CURRENT\": \"Nuna bloko\",\n \"TITLE\": \"Bloko #{{number|formatInteger}}\",\n \"COMPUTED_BY\": \"Kalkulita de la nodo de\",\n \"SHOW_RAW\": \"Vidi la kompletan dosieron\",\n \"TECHNICAL_DIVIDER\": \"Teknikaj informoj\",\n \"VERSION\": \"Versio de la daten-strukturo\",\n \"HASH\": \"Kalkulita haketo\",\n \"UNIVERSAL_DIVIDEND_HELP\": \"Mono kunproduktita de ĉiu el la {{membersCount}} membroj\",\n \"EMPTY\": \"Neniu dateno en tiu ĉi bloko\",\n \"POW_MIN\": \"Minimuma malfacileco\",\n \"POW_MIN_HELP\": \"Malfacileco trudita por la haket-kalkulo\",\n \"DATA_DIVIDER\": \"Datenoj\",\n \"IDENTITIES_COUNT\": \"Novaj identecoj\",\n \"JOINERS_COUNT\": \"Novaj membroj\",\n \"ACTIVES_COUNT\": \"Revalidigoj\",\n \"ACTIVES_COUNT_HELP\": \"Membroj revalidigintaj sian membrecon\",\n \"LEAVERS_COUNT\": \"Membroj elirintaj\",\n \"LEAVERS_COUNT_HELP\": \"Membroj ne plu dezirantaj atestaĵon\",\n \"EXCLUDED_COUNT\": \"Membroj eksigitaj\",\n \"EXCLUDED_COUNT_HELP\": \"Malnovaj membroj eksigitaj pro nerevalidiĝo aŭ manko de atestaĵoj\",\n \"REVOKED_COUNT\": \"Nuligitaj identecoj\",\n \"REVOKED_COUNT_HELP\": \"Tiuj kontoj ne plu povos esti membroj\",\n \"TX_COUNT\": \"Spezoj\",\n \"CERT_COUNT\": \"Atestaĵoj\",\n \"TX_TO_HIMSELF\": \"Operacio pri monŝanĝo\",\n \"TX_OUTPUT_UNLOCK_CONDITIONS\": \"Kondiĉoj por malblokado\",\n \"TX_OUTPUT_OPERATOR\": {\n \"AND\": \"kaj\",\n \"OR\": \"aŭ\"\n },\n \"TX_OUTPUT_FUNCTION\": {\n \"SIG\": \"<b>Subskribo</b> de \",\n \"XHX\": \"<b>Pasvorto</b>, el kiu SHA256 =\",\n \"CSV\": \"Blokita dum\",\n \"CLTV\": \"Blokita ĝis\"\n }\n },\n \"LOOKUP\": {\n \"TITLE\": \"Blokoj\",\n \"NO_BLOCK\": \"Neniu bloko\",\n \"LAST_BLOCKS\": \"Lastaj blokoj:\",\n \"BTN_COMPACT\": \"Densigi\"\n }\n },\n \"CURRENCY\": {\n \"VIEW\": {\n \"TITLE\": \"Mono\",\n \"TAB_CURRENCY\": \"Mono\",\n \"TAB_WOT\": \"Reto de fido\",\n \"TAB_NETWORK\": \"Reto\",\n \"TAB_BLOCKS\": \"Blokoj\",\n \"CURRENCY_SHORT_DESCRIPTION\": \"{{currency|abbreviate}} estas <b>libera mono</b>, kiu ekis {{firstBlockTime|formatFromNow}}. Ĝi nombras nun <b>{{N}} membrojn</b>, kiuj produktas kaj ricevas <a ng-click=\\\"showHelpModal('ud')\\\">Universalan Dividendon</a> (UD), ĉiun {{dt|formatPeriod}}n.\",\n \"NETWORK_RULES_DIVIDER\": \"Reguloj de la reto\",\n \"CURRENCY_NAME\": \"Nomo de la mono\",\n \"MEMBERS\": \"Nombro de membroj\",\n \"MEMBERS_VARIATION\": \"Variado depost la lasta UD\",\n \"MONEY_DIVIDER\": \"Mono\",\n \"MASS\": \"Mona maso\",\n \"SHARE\": \"Maso por membro\",\n \"UD\": \"Universala Dividendo\",\n \"C_ACTUAL\": \"Nuna kreskado\",\n \"MEDIAN_TIME\": \"Horo de la blokĉeno\",\n \"POW_MIN\": \"Minimuma nivelo pri malfacileco de kalkulo\",\n \"MONEY_RULES_DIVIDER\": \"Reguloj de la mono\",\n \"C_RULE\": \"Teoria kreskado celata\",\n \"UD_RULE\": \"Kalkulo de la universala dividendo\",\n \"DT_REEVAL\": \"Periodo de revalorigo de la UD\",\n \"REEVAL_SYMBOL\": \"reval\",\n \"DT_REEVAL_VALUE\": \"Ĉiuj <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})\",\n \"UD_REEVAL_TIME0\": \"Dato de la unua revalorigo\",\n \"SIG_QTY_RULE\": \"Nombro de necesaj atestaĵoj por fariĝi membro\",\n \"SIG_STOCK\": \"Maksimuma nombro da senditaj atestaĵoj por membro\",\n \"SIG_PERIOD\": \"Minimuma daŭro de atendado inter 2 sinsekvaj atestaĵoj senditaj de sama persono\",\n \"SIG_WINDOW\": \"Limdaŭro por akcepti atestaĵon\",\n \"SIG_VALIDITY\": \"Vivdaŭro de atestaĵo, kiu estis akceptita\",\n \"MS_WINDOW\": \"Limdaŭro por akcepti aliĝ-peton kiel membron\",\n \"MS_VALIDITY\": \"Vivdaŭro de aliĝo, kiu estis akceptita\",\n \"STEP_MAX\": \"Maksimuma distanco, per la atestaĵoj, inter nova eniranto kaj la referencaj membroj\",\n \"WOT_RULES_DIVIDER\": \"Reguloj de la reto de fido\",\n \"SENTRIES\": \"Nombro de atestaĵoj (senditaj <b>kaj</b> ricevitaj) por fariĝi referenca membro\",\n \"SENTRIES_FORMULA\": \"Nombro de atestaĵoj (senditaj <b>kaj</b> ricevitaj) por fariĝi referenca membro (formulo)\",\n \"XPERCENT\":\"Minimuma procento da referencaj membroj atingenda por konformiĝi al la regulo pri distanco\",\n \"AVG_GEN_TIME\": \"Meza daŭro inter du blokoj\",\n \"CURRENT\": \"nuna\",\n \"MATH_CEILING\": \"PLAFONO\",\n \"DISPLAY_ALL_RULES\": \"Afiŝi ĉiujn regulojn?\",\n \"BTN_SHOW_LICENSE\": \"Vidi la licencon\",\n \"WOT_DIVIDER\": \"Reto de fido\"\n },\n \"LICENSE\": {\n \"TITLE\": \"Licenco de la mono\",\n \"BTN_DOWNLOAD\": \"Elŝuti la dosieron\",\n \"NO_LICENSE_FILE\": \"Dosiero pri licenco ne trovita.\"\n }\n },\n \"NETWORK\": {\n \"VIEW\": {\n \"MEDIAN_TIME\": \"Horo de la blokĉeno\",\n \"LOADING_PEERS\": \"Nodoj ŝarĝiĝantaj...\",\n \"NODE_ADDRESS\": \"Adreso:\",\n \"SOFTWARE\": \"Programo\",\n \"WARN_PRE_RELEASE\": \"Antaŭ-versio (lasta stabila versio: <b>{{version}}</b>)\",\n \"WARN_NEW_RELEASE\": \"Versio <b>{{version}}</b> disponebla\",\n \"WS2PID\": \"Identigilo:\",\n \"PRIVATE_ACCESS\": \"Privata aliro\",\n \"POW_PREFIX\": \"Prefikso pri labor-pruvo:\",\n \"ENDPOINTS\": {\n \"BMAS\": \"Sekurigita interfaco (SSL)\",\n \"BMATOR\": \"Reta interfaco TOR\",\n \"WS2P\": \"Interfaco WS2P\",\n \"ES_USER_API\": \"Nodo de datenoj Cesium+\"\n }\n },\n \"INFO\": {\n \"ONLY_SSL_PEERS\": \"La nodoj ne-SSL estas mis-afiŝitaj, ĉar Cesium funkcias laŭ moduso HTTPS.\"\n }\n },\n \"PEER\": {\n \"PEERS\": \"Nodoj\",\n \"SIGNED_ON_BLOCK\": \"Skribita en la bloko\",\n \"MIRROR\": \"spegulo\",\n \"MIRRORS\": \"Speguloj\",\n \"MIRROR_PEERS\": \"Spegul-nodoj\",\n \"PEER_LIST\" : \"Listo de la nodoj\",\n \"MEMBERS\" : \"Membroj\",\n \"MEMBER_PEERS\" : \"Membro-nodoj\",\n \"ALL_PEERS\" : \"Ĉiuj nodoj\",\n \"DIFFICULTY\" : \"Malfacileco\",\n \"API\" : \"API\",\n \"CURRENT_BLOCK\" : \"Bloko #\",\n \"POPOVER_FILTER_TITLE\": \"Filtrilo\",\n \"OFFLINE\": \"Nekonektita\",\n \"OFFLINE_PEERS\": \"Nekonektitaj nodoj\",\n \"BTN_SHOW_PEER\": \"Vidi la nodon\",\n \"VIEW\": {\n \"TITLE\": \"Nodo\",\n \"OWNER\": \"Apartenas al\",\n \"SHOW_RAW_PEERING\": \"Vidi la samrangan dokumenton\",\n \"SHOW_RAW_CURRENT_BLOCK\": \"Vidi la lastan blokon (kompleta strukturo)\",\n \"LAST_BLOCKS\": \"Lastaj blokoj konataj\",\n \"KNOWN_PEERS\": \"Konataj nodoj:\",\n \"GENERAL_DIVIDER\": \"Ĝeneralaj informoj\",\n \"ERROR\": {\n \"LOADING_TOR_NODE_ERROR\": \"Neeblas ricevi la informojn de la nodo. La limdaŭro de atendado estas transpasita.\",\n \"LOADING_NODE_ERROR\": \"Neeblas ricevi la informojn de la nodo\"\n }\n }\n },\n \"WOT\": {\n \"SEARCH_HELP\": \"Traserĉado (pseŭdo aŭ publika ŝlosilo)\",\n \"SEARCH_INIT_PHASE_WARNING\": \"Dum la periodo de antaŭ-aliĝo, la traserĉado de la atendantaj aliĝoj <b>povas esti longa</b>. Bonvolu pacienci...\",\n \"REGISTERED_SINCE\": \"Enskribita la\",\n \"REGISTERED_SINCE_BLOCK\": \"Enskribita en la bloko #\",\n \"NO_CERTIFICATION\": \"Neniu atestaĵo validigita\",\n \"NO_GIVEN_CERTIFICATION\": \"Neniu atestaĵo sendita\",\n \"NOT_MEMBER_PARENTHESIS\": \"(ne membro)\",\n \"IDENTITY_REVOKED_PARENTHESIS\": \"(identeco nuligita)\",\n \"MEMBER_PENDING_REVOCATION_PARENTHESIS\": \"(nuliĝanta)\",\n \"EXPIRE_IN\": \"Finiĝo\",\n \"NOT_WRITTEN_EXPIRE_IN\": \"Limdato<br/>de traktado\",\n \"EXPIRED\": \"Finiĝinta\",\n \"PSEUDO\": \"Pseŭdonimo\",\n \"SIGNED_ON_BLOCK\": \"Sendita en la bloko #{{block}}\",\n \"WRITTEN_ON_BLOCK\": \"Enskribita en la bloko #{{block}}\",\n \"GENERAL_DIVIDER\": \"Ĝeneralaj informoj\",\n \"NOT_MEMBER_ACCOUNT\": \"Simpla konto (ne membro)\",\n \"NOT_MEMBER_ACCOUNT_HELP\": \"Temas pri simpla monujo, sen aliĝ-peto atendanta.\",\n \"TECHNICAL_DIVIDER\": \"Teknikaj informoj\",\n \"BTN_CERTIFY\": \"Atesti\",\n \"BTN_YES_CERTIFY\": \"Jes, atesti\",\n \"BTN_SELECT_AND_CERTIFY\": \"Nova atestaĵo\",\n \"ACCOUNT_OPERATIONS\": \"Spezoj en la konto\",\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"Identeco {{title}}\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Reto de fido\",\n \"NEWCOMERS\": \"Novaj membroj\",\n \"NEWCOMERS_COUNT\": \"{{count}} membroj\",\n \"PENDING\": \"Atendantaj enskribiĝoj\",\n \"PENDING_COUNT\": \"{{count}} atendantaj enskribiĝoj\",\n \"REGISTERED\": \"Enskribita {{sigDate | formatFromNow}}\",\n \"MEMBER_FROM\": \"Membro depost {{memberDate|medianFromNowShort}}\",\n \"BTN_NEWCOMERS\": \"Novaj membroj\",\n \"BTN_PENDING\": \"Atendantaj enskribiĝoj\",\n \"SHOW_MORE\": \"Afiŝi pli\",\n \"SHOW_MORE_COUNT\": \"(nuna limo je {{limit}})\",\n \"NO_PENDING\": \"Neniu enskribiĝo atendanta.\",\n \"NO_NEWCOMERS\": \"Neniu membro.\"\n },\n \"CONTACTS\": {\n \"TITLE\": \"Kontaktoj\"\n },\n \"MODAL\": {\n \"TITLE\": \"Traserĉado\"\n },\n \"CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Atestaĵoj\",\n \"SUMMARY\": \"Ricevitaj atestaĵoj\",\n \"LIST\": \"Detalo pri la ricevitaj atestaĵoj\",\n \"PENDING_LIST\": \"Atestaĵoj atendantaj traktadon\",\n \"RECEIVED\": \"Ricevitaj atestaĵoj\",\n \"RECEIVED_BY\": \"Atestaĵoj ricevitaj de {{uid}}\",\n \"ERROR\": \"Atestaĵoj erare ricevitaj\",\n \"SENTRY_MEMBER\": \"Referenca membro\"\n },\n \"OPERATIONS\": {\n \"TITLE\": \"{{uid}} - Spezoj\"\n },\n \"GIVEN_CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Senditaj atestaĵoj\",\n \"SUMMARY\": \"Senditaj atestaĵoj\",\n \"LIST\": \"Detalo pri la senditaj atestaĵoj\",\n \"PENDING_LIST\": \"Atestaĵoj atendantaj traktadon\",\n \"SENT\": \"Senditaj atestaĵoj\",\n \"SENT_BY\": \"Atestaĵoj senditaj de {{uid}}\",\n \"ERROR\": \"Atestaĵoj erare senditaj\"\n }\n },\n \"LOGIN\": {\n \"TITLE\": \"<i class=\\\"icon ion-log-in\\\"></i> Konektiĝo\",\n \"SCRYPT_FORM_HELP\": \"Bonvolu tajpi viajn identigilojn.<br>Pensu kontroli, ke la publika ŝlosilo estas tiu de via konto.\",\n \"PUBKEY_FORM_HELP\": \"Bonvolu tajpi publikan ŝlosilon de konto:\",\n \"FILE_FORM_HELP\": \"Elektu la ŝlosilaro-dosieron uzotan:\",\n \"SCAN_FORM_HELP\": \"Skani la QR-kodon de monujo.\",\n \"SALT\": \"Sekreta identigilo\",\n \"SALT_HELP\": \"Sekreta identigilo\",\n \"SHOW_SALT\": \"Afiŝi la sekretan identigilon?\",\n \"PASSWORD\": \"Pasvorto\",\n \"PASSWORD_HELP\": \"Pasvorto\",\n \"PUBKEY_HELP\": \"Publika ŝlosilo aŭ pseŭdonimo\",\n \"NO_ACCOUNT_QUESTION\": \"Vi ankoraŭ ne havas konton?\",\n \"HAVE_ACCOUNT_QUESTION\": \"Vi jam havas konton?\",\n \"CREATE_ACCOUNT\": \"Krei konton...\",\n \"CREATE_FREE_ACCOUNT\": \"Krei konton senpage\",\n \"FORGOTTEN_ID\": \"Pasvorto forgesita?\",\n \"ASSOCIATED_PUBKEY\": \"Publika ŝlosilo de la ŝlosilaro:\",\n \"BTN_METHODS\": \"Aliaj metodoj\",\n \"BTN_METHODS_DOTS\": \"Ŝanĝi metodon...\",\n \"METHOD_POPOVER_TITLE\": \"Metodoj\",\n \"MEMORIZE_AUTH_FILE\": \"Memorigi tiun ŝlosilaron por la daŭro de la sesio de retumado\",\n \"SCRYPT_PARAMETERS\": \"Parametroj (Skripto):\",\n \"AUTO_LOGOUT\": {\n \"TITLE\": \"Informo\",\n \"MESSAGE\": \"<i class=\\\"ion-android-time\\\"></i> Vi estis <b>malkonektita</b> aŭtomate, pro tro longa senaktiveco.\",\n \"BTN_RELOGIN\": \"Rekonektiĝi\",\n \"IDLE_WARNING\": \"Vi estos malkonektita... {{countdown}}\"\n },\n \"METHOD\": {\n \"SCRYPT_DEFAULT\": \"Sekreta identigilo kaj pasvorto\",\n \"SCRYPT_ADVANCED\": \"Sperta salumado\",\n \"FILE\": \"Dosiero pri ŝlosilaro\",\n \"PUBKEY\": \"Publika ŝlosilo aŭ pseŭdonimo\",\n \"SCAN\": \"Skani QR-kodon\"\n },\n \"SCRYPT\": {\n \"SIMPLE\": \"Malpeza salumado\",\n \"DEFAULT\": \"Kutima salumado\",\n \"SECURE\": \"Sekura salumado\",\n \"HARDEST\": \"Plej sekura salumado\",\n \"EXTREME\": \"Ekstrema salumado\",\n \"USER\": \"Personigita salumado\",\n \"N\": \"N (Loop):\",\n \"r\": \"r (RAM):\",\n \"p\": \"p (CPU):\"\n },\n \"FILE\": {\n \"HELP\": \"Atendita strukturo de dosiero: <b>.yml</b> aŭ <b>.dunikey</b> (tipo PubSec, WIF aŭ EWIF).\"\n }\n },\n \"AUTH\": {\n \"TITLE\": \"<i class=\\\"icon ion-locked\\\"></i> Aŭtentigado\",\n \"BTN_AUTH\": \"Aŭtentiĝi\",\n \"GENERAL_HELP\": \"Bonvolu aŭtentiĝi:\",\n \"EXPECTED_UID_HELP\": \"Bonvolu aŭtentiĝi ĉe la konto <i class=\\\"ion-person\\\"></i> {{uid}} :\",\n \"EXPECTED_PUBKEY_HELP\": \"Bonvolu aŭtentiĝi ĉe la monujo <br class=\\\"visible-xs\\\"/><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}} :\",\n \"SCAN_FORM_HELP\": \"Skani la QR-kodon de la <b>privata ŝlosilo</b> de la monujo.\"\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Mia konto\",\n \"BALANCE\": \"Saldo\",\n \"LAST_TX\": \"Lastaj spezoj validigitaj\",\n \"BALANCE_ACCOUNT\": \"Konto-saldo\",\n \"NO_TX\": \"Neniu spezo\",\n \"SHOW_MORE_TX\": \"Afiŝi pli\",\n \"SHOW_ALL_TX\": \"Afiŝi ĉion\",\n \"TX_FROM_DATE\": \"(nuna limo je {{fromTime|medianFromNowShort}})\",\n \"PENDING_TX\": \"Spezoj atendantaj traktadon\",\n \"VALIDATING_TX\": \"Spezoj traktitaj, ne validigitaj\",\n \"ERROR_TX\": \"Spezoj ne realigitaj\",\n \"ERROR_TX_SENT\": \"Spezoj malsukcesintaj\",\n \"PENDING_TX_RECEIVED\": \"Spezoj atendantaj ricevon\",\n \"EVENTS\": \"Okazaĵoj\",\n \"OUT_DISTANCED\": \"Viaj nunaj atestaĵoj venas de tro izolita grupo de la <a ng-click=\\\"showHelpModal('wot')\\\">Reto de Fido</a> (RdF): al la <a ng-click=\\\"showHelpModal('distance_rule')\\\">regulo de maksimuma distanco</a> vi ne konformiĝas.<br/>Vi devas akiri atestaĵojn venantajn de aliaj lokoj de la RdF, aŭ atendi ke tiu ĉi densiĝos.\",\n \"WAITING_MEMBERSHIP\": \"Aliĝo-peto sendita. Atendanta akcepton.\",\n \"WAITING_CERTIFICATIONS\": \"Vi devas <b>akiri {{needCertificationCount}} atestaĵo(j)n</b> por fariĝi membro kaj produkti la <a ng-click=\\\"showHelpModal('ud')\\\">Universalan Dividendon</a>. Via konto tamen estas jam funkcianta, por ricevi kaj efektivigi pagojn.\",\n \"WAITING_CERTIFICATIONS_HELP\": \"Por akiri viajn atestaĵojn, petu nur membrojn <b>kiuj sufiĉe konas vin</b>, kiel postulas <a ng-click=\\\"showLicenseModal()\\\">la licenco de la mono</a>, kiun vi akceptis.<br/>Se vi ne konas sufiĉe da membroj, sciigu tion ĉe <a ng-click=\\\"openLink($event, $root.settings.userForumUrl)\\\">la forumo por uzantoj</a>.\",\n \"WILL_MISSING_CERTIFICATIONS\": \"Baldaŭ <b>mankos al vi atestaĵoj</b> (almenaŭ {{willNeedCertificationCount}} estas necesaj)\",\n \"WILL_NEED_RENEW_MEMBERSHIP\": \"Via aliĝo kiel membro <b>estas finiĝonta {{membershipExpiresIn|formatDurationTo}}</b>. Pensu <a ng-click=\\\"doQuickFix('renew')\\\">revalidigi vian aliĝon</a> ĝis tiam.\",\n \"NEED_RENEW_MEMBERSHIP\": \"Vi ne plu estas membro de la mono, ĉar <b>via aliĝo finiĝis</b>. Pensu <a ng-click=\\\"doQuickFix('renew')\\\">revalidigi vian aliĝon</a>.\",\n \"NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED\": \"Vi ne plu estas membro de la mono, <b>pro manko da atestaĵoj</b>. Pensu <a ng-click=\\\"doQuickFix('renew')\\\">revalidigi vian aliĝon</a>.\",\n \"NO_WAITING_MEMBERSHIP\": \"Neniu aliĝo-peto atendanta. Se vi deziras <b>fariĝi membro</b>, pensu <a ng-click=\\\"doQuickFix('membership')\\\">sendi la aliĝo-peton</a>.\",\n \"CERTIFICATION_COUNT\": \"Ricevitaj atestaĵoj\",\n \"CERTIFICATION_COUNT_SHORT\": \"Atestaĵoj\",\n \"SIG_STOCK\": \"Senditaj atestaĵoj\",\n \"BTN_RECEIVE_MONEY\": \"Enkasigi\",\n \"BTN_SELECT_ALTERNATIVES_IDENTITIES\": \"Aliri alian identecon...\",\n \"BTN_FIX_MEMBERSHIP\": \"Resendi la aliĝo-peton...\",\n \"BTN_MEMBERSHIP_RENEW\": \"Revalidigi la aliĝon\",\n \"BTN_MEMBERSHIP_RENEW_DOTS\": \"Revalidigi la aliĝon...\",\n \"BTN_MEMBERSHIP_OUT_DOTS\": \"Ĉesigi la aliĝon...\",\n \"BTN_SECURITY_DOTS\": \"Konto kaj sekureco...\",\n \"BTN_SHOW_DETAILS\": \"Afiŝi la teknikajn informojn\",\n \"LOCKED_OUTPUTS_POPOVER\": {\n \"TITLE\": \"Sumo blokita\",\n \"DESCRIPTION\": \"Jen la kondiĉoj de malblokado de tiu sumo:\",\n \"DESCRIPTION_MANY\": \"Tiu spezo entenas plurajn partojn, pri kiuj la kondiĉoj de malblokado estas:\",\n \"LOCKED_AMOUNT\": \"Kondiĉoj por la sumo:\"\n },\n \"NEW\": {\n \"TITLE\": \"Kreado de konto\",\n \"INTRO_WARNING_TIME\": \"La kreado de konto ĉe {{name|capitalize}} estas tre simpla. Bonvolu tamen dediĉi sufiĉe da tempo por ĝuste efektivigi tiun proceduron (por ne forgesi la identigilojn, pasvortojn, ktp.).\",\n \"INTRO_WARNING_SECURITY\": \"Kontrolu ke la aparatoj, kiujn vi nun uzas (komputilo, tabuleto, telefono), <b>estas sekurigitaj kaj fidindaj</b>.\",\n \"INTRO_WARNING_SECURITY_HELP\": \"Senvirusigilo ĝisdata, fajroŝirmilo aktivigita, sesio protektita per pasvorto aŭ PIN-kodo, ktp.\",\n \"INTRO_HELP\": \"Alklaku <b>{{'COMMON.BTN_START'|translate}}</b> por ekigi la kreadon de konto. Vi estos gvidata paŝon post paŝo.\",\n \"REGISTRATION_NODE\": \"Via aliĝo estos registrita tra la nodo Duniter <b>{{server}}</b>, kiu dissendos ĝin poste al la cetero de la mon-reto.\",\n \"REGISTRATION_NODE_HELP\": \"Se vi ne fidas tiun nodon, bonvolu ŝanĝi ĝin <a ng-click=\\\"doQuickFix('settings')\\\">en la parametroj</a> de Cesium.\",\n \"SELECT_ACCOUNT_TYPE\": \"Elektu la tipon de konto kreota:\",\n \"MEMBER_ACCOUNT\": \"Membro-konto\",\n \"MEMBER_ACCOUNT_TITLE\": \"Kreado de membro-konto\",\n \"MEMBER_ACCOUNT_HELP\": \"Se vi ankoraŭ ne enskribiĝis kiel individuo (nur unu konto eblas por unu individuo). Tia konto ebligas kunprodukti la monon, ricevante <b> universalan dividendon</b> ĉiun {{parameters.dt|formatPeriod}}n.\",\n \"WALLET_ACCOUNT\": \"Simpla monujo\",\n \"WALLET_ACCOUNT_TITLE\": \"Kreado de monujo\",\n \"WALLET_ACCOUNT_HELP\": \"Por ĉiuj aliaj kazoj, ekzemple se vi bezonas plian konton.<br/>Neniu universala dividendo estos kreita per tia konto.\",\n \"SALT_WARNING\": \"Elektu vian sekretan identigilon.<br/>Oni petos ĝin de vi ĉiufoje, kiam vi konektiĝos al tiu konto.<br/><br/><b>Bone memorigu ĝin</b>: kaze de perdo, neniu alia povos aliri vian konton!\",\n \"PASSWORD_WARNING\": \"Elektu pasvorton.<br/>Oni petos ĝin de vi ĉiufoje, kiam vi konektiĝos al tiu konto.<br/><br/><b>Bone memorigu tiun pasvorton</b: kaze de perdo, neniu alia povos aliri vian konton!\",\n \"PSEUDO_WARNING\": \"Elektu pseŭdonimon.<br/>Ĝi utilas al la aliaj membroj, por identigi vin pli facile.<div class='hidden-xs'><br/>Ĝi <b>ne povos esti modifita</b>, sen rekrei konton.</div><br/><br/>Ĝi entenu <b>nek spacon, nek diakritan literon (kun supersigno, ktp.)</b>.<div class='hidden-xs'><br/>Ekzemple: <span class='gray'>NataljaBelulino, JohanoStelaro, ktp.</span>\",\n \"PSEUDO\": \"Pseŭdonimo\",\n \"PSEUDO_HELP\": \"Pseŭdonimo\",\n \"SALT_CONFIRM\": \"Konfirmo\",\n \"SALT_CONFIRM_HELP\": \"Konfirmo de la sekreta identigilo\",\n \"PASSWORD_CONFIRM\": \"Konfirmo\",\n \"PASSWORD_CONFIRM_HELP\": \"Konfirmo de la pasvorto\",\n \"SLIDE_6_TITLE\": \"Konfirmo:\",\n \"COMPUTING_PUBKEY\": \"Kalkulanta...\",\n \"LAST_SLIDE_CONGRATULATION\": \"Vi tajpis ĉiujn necesajn informojn: Gratulon!<br/>Vi nun povas <b>sendi la peton por kreado</b> de la konto.</b><br/><br/>Por informo, la publika ŝlosilo ĉi-sube identigos vian estontan konton.<br/>Ĝi povos estis sciigita al aliuloj por ricevi iliajn pagojn.<br/><b>Ne estas devige</b> noti ĝin nun, vi ankaŭ povos fari tion poste.\",\n \"CONFIRMATION_MEMBER_ACCOUNT\": \"<b class=\\\"assertive\\\">Averto:</b> la sekreta identigilo, la pasvorto kaj la pseŭdonimo ne plu povos esti modifitaj.<br/><br/><b>Certiĝu, ke vi ĉiam rememorigos ĝin!</b><br/><br/><b>Ĉu vi certas</b>, ke vi deziras sendi tiun ĉi aliĝo-peton?\",\n \"CONFIRMATION_WALLET_ACCOUNT\": \"<b class=\\\"assertive\\\">Averto:</b> la sekreta identigilo kaj la pasvorto ne plu povos esti modifitaj.<br/><br/><b>Certiĝu, ke vi ĉiam rememorigos ĝin!</b><br/><br/><b>Ĉu vi certas</b>, ke vi deziras daŭrigi per tiuj ĉi identigiloj?\",\n \"CHECKING_PSEUDO\": \"Kontrolo...\",\n \"PSEUDO_AVAILABLE\": \"Pseŭdonimo disponebla\",\n \"PSEUDO_NOT_AVAILABLE\": \"Pseŭdonimo ne disponebla\",\n \"INFO_LICENSE\": \"Antaŭ ol krei membro-konton, <b>bonvolu legi kaj akcepti la licencon</b> pri uzado de la mono:\",\n \"BTN_ACCEPT\": \"Mi akceptas\",\n \"BTN_ACCEPT_LICENSE\": \"Mi akceptas la licencon\"\n },\n \"POPUP_REGISTER\": {\n \"TITLE\": \"Elektu pseŭdonimon\",\n \"HELP\": \"Pseŭdonimo estas deviga por fariĝi membro.\"\n },\n \"SELECT_IDENTITY_MODAL\": {\n \"TITLE\": \"Elekto de la identeco\",\n \"HELP\": \"Pluraj <b>malsamaj identecoj</b> estis senditaj, por la publika ŝlosilo <span class=\\\"gray\\\"><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}</span>.<br/>Bonvolu elekti la dosierujon uzotan:\"\n },\n \"SELECT_WALLET_MODAL\": {\n \"TITLE\": \"Elekto de la monujo\"\n },\n \"WALLET_LIST\": {\n \"TITLE\": \"Miaj monujoj\",\n \"BTN_NEW\": \"Aldoni monujon\",\n \"BTN_DOWNLOAD\": \"Elŝuti la liston\",\n \"BTN_IMPORT_FILE_DOTS\": \"Enporti el dosiero...\",\n \"NO_WALLET\": \"Neniu kroma monujo\",\n \"BTN_DELETE\": \"Forigi kroman monujon...\",\n \"BTN_RENAME\": \"Renomi la monujon\",\n \"EXPORT_FILENAME\": \"miaj_monujoj-{{pubkey|formatPubkey}}-{{currency}}.csv\",\n \"TOTAL_DOTS\": \"Sumo: \",\n \"EDIT_POPOVER\": {\n \"TITLE\": \"Renomi la monujon\",\n \"HELP\": \"Sciigu la novan nomon\",\n \"NAME_HELP\": \"Nomo de la monujo\"\n },\n \"IMPORT_MODAL\": {\n \"TITLE\": \"Enporti monujojn\",\n \"HELP\": \"Por <b>enporti monujojn</b>, bonvolu glitigi en la ĉi-suban zonon la dosieron pri la listo de monujoj, aŭ alklaki la zonon por serĉadi dosieron.\",\n \"WALLET_COUNT\": \"<b>{{count}}</b> nova{{count > 1 ? 'j' : ''}} monujo{{count > 1 ? 'j' : ''}}\",\n \"NO_NEW_WALLET\": \"Neniu nova monujo\"\n }\n },\n \"SECURITY\": {\n \"ADD_QUESTION\": \"Aldoni personigitan demandon\",\n \"BTN_CLEAN\": \"Malplenigi\",\n \"BTN_RESET\": \"Restartigi\",\n \"DOWNLOAD_REVOKE\": \"Konservi mian dosieron pri nuligo\",\n \"DOWNLOAD_REVOKE_HELP\": \"Disponi dosieron pri nuligo estas grave, ekzemple kaze de perdo de viaj identigiloj. Ĝi ebligas al vi <b>elirigi tiun konton el la reto de fido</b>, tiel ke ĝi refariĝu simpla monujo.\",\n \"GENERATE_KEYFILE\": \"Krei mian dosieron pri ŝlosilaro...\",\n \"GENERATE_KEYFILE_HELP\": \"Kreas dosieron, kiu ebligas al vi aŭtentiĝi sen tajpi viajn identigilojn.<br/><b>Atenton:</b> tiu dosiero entenos vian konto-ŝlosilaron (publikan kaj sekretan ŝlosilojn); do tre gravas meti ĝin en sekuran lokon!\",\n \"KEYFILE_FILENAME\": \"ŝlosilaro-{{pubkey|formatPubkey}}-{{currency}}-{{format}}.dunikey\",\n \"MEMBERSHIP_IN\": \"Transformi en membro-konton...\",\n \"MEMBERSHIP_IN_HELP\": \"Ebligas <b>transformi</b> simplan monujo-konton <b>en membro-konton</b>, sendante aliĝo-peton. Utilas nur se vi ne havas jam alian membro-konton.\",\n \"SEND_IDENTITY\": \"Publikigi sian identecon...\",\n \"SEND_IDENTITY_HELP\": \"Ebligas kunligi pseŭdonimon kun tiu ĉi konto, sed <b>sen fari aliĝo-peton</b> por iĝi membro. Tiu kunligo kutime ne utilas, ĉar la valideco de tiu kunligo de pseŭdonimo estas limigita en la tempo.\",\n \"HELP_LEVEL\": \"Por krei konserv-dosieron pri viaj identigiloj, elektu <strong> almenaŭ {{nb}} demandojn:</strong>\",\n \"LEVEL\": \"Nivelo de sekureco\",\n \"LOW_LEVEL\": \"Malforta <span class=\\\"hidden-xs\\\">(2 demandoj minimume)</span>\",\n \"MEDIUM_LEVEL\": \"Meza <span class=\\\"hidden-xs\\\">(4 demandoj minimume)</span>\",\n \"QUESTION_1\": \"Kiel nomiĝis via plej bona amik.in.o, kiam vi estis adoleskant.in.o?\",\n \"QUESTION_2\": \"Kiel nomiĝis via unua hejm-besto?\",\n \"QUESTION_3\": \"Kiun pladon vi unue lernis kuiradi?\",\n \"QUESTION_4\": \"Kiun filmon vi unue spektis en kinejo?\",\n \"QUESTION_5\": \"Kien vi iris la unuan fojon, kiam vi vojaĝis per aviadilo?\",\n \"QUESTION_6\": \"Kiel nomiĝis via preferata instruist.i.no en bazlernejo?\",\n \"QUESTION_7\": \"Kio estus laŭ vi la ideala profesio?\",\n \"QUESTION_8\": \"Kiun libron por infanoj vi preferas?\",\n \"QUESTION_9\": \"Kio estis la marko de via unua veturilo?\",\n \"QUESTION_10\": \"Kio estis via kromnomo, kiam vi estis infano?\",\n \"QUESTION_11\": \"Kiun rolant.in.on aŭ aktor.in.on vi preferis en kino, kiam vi estis student.in.o?\",\n \"QUESTION_12\": \"Kiun kanzonist.ino.n aŭ muzikgrupon vi preferis, kiam vi estis student.in.o?\",\n \"QUESTION_13\": \"En kiu urbo renkontiĝis viaj gepatroj?\",\n \"QUESTION_14\": \"Kiel nomiĝis via unua ĉefo?\",\n \"QUESTION_15\": \"Kiel nomiĝas la strato, kie vi kreskis?\",\n \"QUESTION_16\": \"Kiel nomiĝas la marbordo, kie vi unuafoje baniĝis?\",\n \"QUESTION_17\": \"Kiun muzik-albumon vi unuafoje aĉetis?\",\n \"QUESTION_18\": \"Kiel nomiĝas via preferata sporto-teamo?\",\n \"QUESTION_19\": \"Kio estis la profesio de via avo?\",\n \"RECOVER_ID\": \"Retrovi mian pasvorton...\",\n \"RECOVER_ID_HELP\": \"Se vi disponas <b>konserv-dosieron pri viaj identigiloj</b>, vi povas retrovi ilin respondante ĝuste viajn personajn demandojn.\",\n \"REVOCATION_WITH_FILE\": \"Nuligi mian membro-konton...\",\n \"REVOCATION_WITH_FILE_DESCRIPTION\": \"Se vi <b>definitive perdis viajn identigilojn</b> pri via membro-konto (aŭ ke la sekureco de la konto estas endanĝerigita), vi povas uzi <b>la dosieron pri nuligo</b> de la konto por <b>trudi ties definitivan eliradon el la reto de fido</b>.\",\n \"REVOCATION_WITH_FILE_HELP\": \"Por <b>definitive nuligi</b> membro-konton, bonvolu glitigi en la ĉi-suban zonon vian dosieron pri nuligo, aŭ alklaki la zonon por serĉadi dosieron.\",\n \"REVOCATION_WALLET\": \"Nuligi tiun ĉi konton tuj\",\n \"REVOCATION_WALLET_HELP\": \"Peti la nuligon de via identeco estigas la <b>eliradon el la reto de fido</b> (definitivan por la pseŭdonimo kaj la publika ŝlosilo kunligitaj). La konto ne plu povos produkti Universalan Dividendon.<br/>Vi tamen daŭre povos konektiĝi al ĝi, kiel al simpla monujo.\",\n \"REVOCATION_FILENAME\": \"nuligo-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt\",\n \"SAVE_ID\": \"Konservi miajn identigilojn...\",\n \"SAVE_ID_HELP\": \"Kreado de konserv-dosiero, por <b>retrovi vian pasvorton</b> (kaj la sekretan identigilon) <b>kaze de forgeso</b>. La dosiero estas <b>sekurigita</b> (ĉifrita) dank'al personaj demandoj.\",\n \"STRONG_LEVEL\": \"Forta <span class=\\\"hidden-xs \\\">(6 demandoj minimume)</span>\",\n \"TITLE\": \"Konto kaj sekureco\",\n \"KEYFILE\": {\n \"PUBSEC_FORMAT\": \"Strukturo PubSec.\",\n \"PUBSEC_FORMAT_HELP\": \"Tiu strukturo stokas vian ŝlosilaron laŭ tre simpla maniero. Ĝi kongruas aparte kun Cesium, ğannonce kaj Duniter.<br/><b>Atenton:</b>La dosiero <b>ne estas ĉifrita</b> (la sekreta ŝlosilo klare aperas en ĝi); bonvolu do stoki ĝin en sekura loko!\",\n \"WIF_FORMAT\": \"Strukturo WIF (Wallet Import Format) - v1\",\n \"WIF_FORMAT_HELP\": \"Tiu strukturo stokas vian ŝlosilaron inkluzivante en ĝin kontrol-sumon por kontroli la sendifektecon de la dosiero. Ĝi kongruas aparte kun la paper-monujoj (Duniter paper wallet).<br/><b>Atenton:</b>La dosiero <b>ne estas ĉifrita</b> (la sekreta ŝlosilo klare aperas en ĝi); bonvolu do stoki ĝin en sekura loko!\",\n \"EWIF_FORMAT\": \"Strukturo EWIF (Encrypted Wallet Import Format) - v1\",\n \"EWIF_FORMAT_HELP\": \"Tiu strukturo stokas vian ŝlosilaron <b>laŭ ĉifrita maniero</b> dank'al sekreta frazo elektita de vi. Ĝi ankaŭ inkluzivas kontrol-sumon por kontroli la sendifektecon de la dosiero.<br/><b>Atenton:</b> Zorgu, ke vi ĉiam rememoru vian sekretan frazon!\",\n\t\t\"PASSWORD_POPUP\": {\n \"TITLE\": \"Ĉifrita dosiero pri ŝlosilaro\",\n \"HELP\": \"Bonvolu indiki la la sekretan frazon:\",\n \"PASSWORD_HELP\": \"Sekreta frazo\"\n },\n \"ERROR\": {\n \"BAD_PASSWORD\": \"Sekreta frazo malĝusta\",\n \"BAD_CHECKSUM\": \"Kontrol-sumo malĝusta\"\n }\n }\n },\n \"FILE_NAME\": \"{{currency}} - Konto-tabelo {{pubkey|formatPubkey}} je {{currentTime|formatDateForFile}}.csv\",\n \"HEADERS\": {\n \"TIME\": \"Dato\",\n \"AMOUNT\": \"Sumo\",\n \"COMMENT\": \"Komento\"\n }\n },\n \"TRANSFER\": {\n \"TITLE\": \"Elspezo\",\n \"SUB_TITLE\": \"Fari elspezon\",\n \"SUB_TITLE_ALL\": \"Malplenigi la konton\",\n \"FROM\": \"De\",\n \"TO\": \"Al\",\n \"AMOUNT\": \"Sumo\",\n \"AMOUNT_HELP\": \"Sumo\",\n \"COMMENT\": \"Komento\",\n \"COMMENT_HELP\": \"Komento\",\n \"BTN_SEND\": \"Sendi\",\n \"BTN_ADD_COMMENT\": \"Aldoni komenton\",\n \"REST\": \"Resto de la konto\",\n \"REST_TO\": \"al\",\n \"WARN_COMMENT_IS_PUBLIC\": \"Bonvolu noti, ke <b>la komentoj estas publikaj</b> (ne ĉifritaj).\",\n \"MODAL\": {\n \"TITLE\": \"Elspezo\"\n }\n },\n \"ERROR\": {\n \"UNKNOWN_URI_FORMAT\": \"URI-strukturo nekonata\",\n \"PUBKEY_INVALID_CHECKSUM\": \"Publika ŝlosilo nevalida (bad checksum).\",\n \"POPUP_TITLE\": \"Eraro\",\n \"UNKNOWN_ERROR\": \"Eraro nekonata\",\n \"CRYPTO_UNKNOWN_ERROR\": \"Via retumilo ŝajnas ne kongrua kun la kriptografiaj funkcioj.\",\n \"DOWNLOAD_KEYFILE_FAILED\": \"Malsukceso por la kreado de la dosiero pri ŝlosilaro.\",\n \"EQUALS_TO_PSEUDO\": \"Devas esti malsama ol la pseŭdonimo\",\n \"EQUALS_TO_SALT\": \"Devas esti malsama ol la sekreta identigilo\",\n \"FIELD_REQUIRED\": \"Deviga kampo\",\n \"FIELD_TOO_SHORT\": \"Signaro tro mallonga\",\n \"FIELD_TOO_SHORT_WITH_LENGTH\": \"Signaro tro mallonga ({{minLength}} signoj minimume)\",\n \"FIELD_TOO_LONG\": \"Signaro tro longa\",\n \"FIELD_TOO_LONG_WITH_LENGTH\": \"Signaro tro longa ({{maxLength}} signoj maksimume)\",\n \"FIELD_MIN\": \"Minimuma longeco: {{min}}\",\n \"FIELD_MAX\": \"Maksimuma longeco: {{max}}\",\n \"FIELD_ACCENT\": \"Diakritaj literoj kaj komoj ne permesataj\",\n \"FIELD_NOT_NUMBER\": \"Nombra valoro atendata\",\n \"FIELD_NOT_INT\": \"Entjera nombro atendata\",\n \"FIELD_NOT_EMAIL\": \"Retadreso nevalida\",\n \"PASSWORD_NOT_CONFIRMED\": \"Ne kongruas kun la pasvorto\",\n \"SALT_NOT_CONFIRMED\": \"Ne kongruas kun la sekreta identigilo\",\n \"SEND_IDENTITY_FAILED\": \"Aliĝo malsukcesa\",\n \"SEND_CERTIFICATION_FAILED\": \"Atestado malsukcesa\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY\": \"Vi ne povas efektivigi atestadon, ĉar via konto <b>ne estas membro</b>.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF\": \"Vi ne povas efektivigi atestadon, ĉar via konto ankoraŭ ne estas membro.<br/><br/>Ankoraŭ mankas al vi atestaĵoj, aŭ tiuj ĉi ankoraŭ ne estis validigitaj.\",\n \"IDENTITY_TO_CERTIFY_HAS_NO_SELF\": \"Konto ne atestebla. Neniu aliĝo-peto estis farita, aŭ la aliĝo ne estis revalidigita.\",\n \"LOGIN_FAILED\": \"Eraro dum konektiĝo.\",\n \"LOAD_IDENTITY_FAILED\": \"Eraro por ŝarĝi la identecon.\",\n \"LOAD_REQUIREMENTS_FAILED\": \"Eraro por ŝarĝi la antaŭ-necesaĵoj de la identeco.\",\n \"SEND_MEMBERSHIP_IN_FAILED\": \"Malsukceso pri la provado eniri la komunumon.\",\n \"SEND_MEMBERSHIP_OUT_FAILED\": \"Malsukceso pri la ĉesigo de la aliĝo.\",\n \"REFRESH_WALLET_DATA\": \"Malsukceso pri la ĝisdatigo de la monujo.\",\n \"GET_CURRENCY_PARAMETER\": \"Malsukceso por ricevi la regulojn de la mono.\",\n \"GET_CURRENCY_FAILED\": \"Ne eblis ŝarĝi la monon. Bonvolu reprovi pli poste.\",\n \"SEND_TX_FAILED\": \"Elspezado malsukcesa.\",\n \"ALL_SOURCES_USED\": \"Bonvolu atendi la kalkulon de la venonta bloko (ĉiuj viaj monfontoj estis uzitaj).\",\n \"NOT_ENOUGH_SOURCES\": \"Ne sufiĉe da mono por sendi tiun ĉi sumon per ununura spezo.<br/>Maksimuma sumo: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.\",\n \"ACCOUNT_CREATION_FAILED\": \"Malsukceso por krei la membro-konton.\",\n \"RESTORE_WALLET_DATA_ERROR\": \"Malsukceso por reŝarĝi la parametrojn de la loka stokaĵo\",\n \"LOAD_WALLET_DATA_ERROR\": \"Malsukceso por ŝarĝi la datenojn de la monujo.\",\n \"COPY_CLIPBOARD_FAILED\": \"Ne eblis kopii la valoron.\",\n \"TAKE_PICTURE_FAILED\": \"Malsukceso por ricevi la foton.\",\n \"SCAN_FAILED\": \"Malsukceso por skani la QR-kodon.\",\n \"SCAN_UNKNOWN_FORMAT\": \"Kodo nerekonata.\",\n \"WOT_LOOKUP_FAILED\": \"Serĉado malsukcesa.\",\n \"LOAD_PEER_DATA_FAILED\": \"Ne eblis legi la nodon Duniter. Bonvolu reprovi poste.\",\n \"NEED_LOGIN_FIRST\": \"Bonvolu unue konektiĝi.\",\n \"AMOUNT_REQUIRED\": \"La monsumo estas deviga.\",\n \"AMOUNT_NEGATIVE\": \"Negativa sumo nepermesata.\",\n \"NOT_ENOUGH_CREDIT\": \"Saldo nesufiĉa.\",\n \"INVALID_NODE_SUMMARY\": \"Nodo neatingebla aŭ adreso nevalida.\",\n \"INVALID_USER_ID\": \"La pseŭdonimo devas enteni nek spacon nek signon specialan aŭ kun supersigno.\",\n \"INVALID_COMMENT\": \"La kampo 'referenco' ne devas enteni literojn kun supersigno.\",\n \"INVALID_PUBKEY\": \"La publika ŝlosilo ne havas la atenditan strukturon.\",\n \"INVALID_PUBKEY_CHECKSUM\": \"Kontrol-sumo nevalida.\",\n \"IDENTITY_REVOKED\": \"Tiu ĉi identeco <b>estis nuligita</b>. Ĝi ne plu povas fariĝi membro.\",\n \"IDENTITY_REVOKED_WITH_TIME\": \"Tiu ĉi identeco <b>estis nuligita {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). Ĝi ne plu povas fariĝi membro.\",\n \"IDENTITY_PENDING_REVOCATION\": \"La <b>nuligo de tiu ĉi identeco</b> estis petita kaj atendas traktadon. La atestado estas do malaktivigita.\",\n \"IDENTITY_INVALID_BLOCK_HASH\": \"Tiu ĉi aliĝo-peto ne plu validas (ĉar ĝi rilatas al bloko, kiun nuligis la nodoj de la reto): tiu persono devas refari sian aliĝo-peton <b>antaŭ ol</b> esti atestita.\",\n \"IDENTITY_EXPIRED\": \"La publikigo de tiu ĉi identeco finiĝis: tiu persono devas fari novan aliĝo-peton <b>antaŭ ol</b> esti atestita.\",\n \"IDENTITY_SANDBOX_FULL\": \"La nodo Duniter uzata de Cesium ne plu povas ricevi novajn identecojn, ĉar ĝia atendo-vico estas plena.<br/><br/>Bonvolu reprovi poste aŭ ŝanĝi la nodon (per la menuo <b>Parametroj</b>).\",\n \"IDENTITY_NOT_FOUND\": \"Identeco ne trovita.\",\n \"IDENTITY_TX_FAILED\": \"Malsukceso por ŝarĝi la spezojn.\",\n \"WOT_PENDING_INVALID_BLOCK_HASH\": \"Aliĝo ne valida.\",\n \"WALLET_INVALID_BLOCK_HASH\": \"Via aliĝo-peto ne plu validas (ĉar ĝi rilatas al bloko, kiun nuligis la nodoj de la reto).<br/>Vi devas <a ng-click=\\\"doQuickFix('fixMembership')\\\">sendi novan peton</a> por solvi tiun ĉi problemon.\",\n \"WALLET_IDENTITY_EXPIRED\": \"La publikigo de <b>via identeco finiĝis</b>.<br/>Vi devas <a ng-click=\\\"doQuickFix('fixIdentity')\\\">publikigi denove vian identecon</a> por solvi tiun ĉi problemon.\",\n \"WALLET_REVOKED\": \"Via identeco estis <b>nuligita</b>: nek via pseŭdonimo nek via publika ŝlosilo povos esti uzata en la estonteco por membro-konto.\",\n \"WALLET_HAS_NO_SELF\": \"Via identeco devas unue esti publikigita, kaj ne esti finiĝinta.\",\n \"AUTH_REQUIRED\": \"Aŭtentigado necesa.\",\n \"AUTH_INVALID_PUBKEY\": \"La atendata ŝlosilo estas <i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}...\",\n \"AUTH_INVALID_SCRYPT\": \"Identigilo aŭ pasvorto nevalida.\",\n \"AUTH_INVALID_FILE\": \"Dosiero pri ŝlosilaro nevalida.\",\n \"AUTH_FILE_ERROR\": \"Malsukceso por malfermi la dosieron pri ŝlosilaro.\",\n \"IDENTITY_ALREADY_CERTIFY\": \"Vi <b>jam atestis</b> tiun identecon.<br/><br/>Tiu atestado daŭre validas (finiĝo {{expiresIn|formatDurationTo}}).\",\n \"IDENTITY_ALREADY_CERTIFY_PENDING\": \"Vi <b>jam atestis</b> tiun identecon.<br/><br/>Tiu atestado atendas traktadon (limdato de traktado {{expiresIn|formatDurationTo}}).\",\n \"UNABLE_TO_CERTIFY_TITLE\": \"Atestado neebla\",\n \"LOAD_NEWCOMERS_FAILED\": \"Malsukceso por ŝarĝi la novajn membrojn.\",\n \"LOAD_PENDING_FAILED\": \"Malsukceso por ŝarĝi la atendantajn aliĝojn.\",\n \"ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"Vi devas <b>esti membro</b> por rajti efektivigi tiun ĉi agon.\",\n \"ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"Vi devas <b>esti membro (aŭ eksa membro)</b> por rajti efektivigi tiun ĉi agon.\",\n \"ONLY_SELF_CAN_EXECUTE_THIS_ACTION\": \"Via identeco devas <b>jam esti publikigita</b>, por ke vi rajtu efektivigi tiun ĉi agon.\",\n \"GET_BLOCK_FAILED\": \"Malsukceso por ricevi la blokon.\",\n \"INVALID_BLOCK_HASH\": \"Bloko ne trovita (haketo malsama)\",\n \"DOWNLOAD_REVOCATION_FAILED\": \"Malsukceso por elŝuti la dosieron pri nuligo.\",\n \"REVOCATION_FAILED\": \"Malsukceso pri nuligo.\",\n \"SALT_OR_PASSWORD_NOT_CONFIRMED\": \"Sekreta identigilo aŭ pasvorto malĝusta.\",\n \"RECOVER_ID_FAILED\": \"Malsukceso por ricevi la identigilojn\",\n \"LOAD_FILE_FAILED\" : \"Malsukceso por ŝarĝi la dosieron\",\n \"NOT_VALID_REVOCATION_FILE\": \"Dosiero pri nuligo ne valida (malĝusta strukturo de dosiero)\",\n \"NOT_VALID_SAVE_ID_FILE\": \"Dosiero pri konservado ne valida (malĝusta strukturo de dosiero)\",\n \"NOT_VALID_KEY_FILE\": \"Dosiero pri ŝlosilaro ne valida (strukturo ne rekonata)\",\n \"EXISTING_ACCOUNT\": \"Viaj identigiloj rilatas al jam ekzistanta konto, kies <a ng-click=\\\"showHelpModal('pubkey')\\\">publika ŝlosilo</a> estas:\",\n \"EXISTING_ACCOUNT_REQUEST\": \"Bonvolu modifi viajn identigilojn, por ke ili rilatu al ne uzata konto.\",\n \"GET_LICENSE_FILE_FAILED\": \"La ricevo de la dosiero pri licenco ne eblis.\",\n \"CHECK_NETWORK_CONNECTION\": \"Neniu nodo ŝajnas atingebla.<br/><br/>Bonvolu <b>kontroli vian retkonekton</b>.\",\n \"ISSUE_524_TX_FAILED\": \"Malsukcesa elspezo.<br/><br/>Mesaĝo estis sendita al la programistoj por faciligi la solvadon de la problemo. <b>Dankon pro via helpo</b>.\",\n \"ADD_SECONDARY_WALLET_FAILED\": \"Malsukceso por aldoni kroman monujon.\",\n \"UPDATE_WALLET_LIST_FAILED\": \"Malsukceso por ĝisdatigi la kromajn monujojn.\",\n \"LOAD_WALLET_LIST_FAILED\": \"Malsukceso por ŝarĝi la kromajn monujojn.\",\n \"SAVE_WALLET_LIST_FAILED\": \"Malsukceso por konservi la kromajn monujojn.\",\n \"COULD_NOT_ADD_MAIN_WALLET\": \"Tiu ĉi monujo <b>rilatas al la ĉefa konto</b>, kun kiu vi estas konektita.<br/>Ne eblas aldoni ĝin kiel kroman monujon.\",\n \"COULD_NOT_ADD_EXISTING_WALLET\": \"Monujo jam ekzistanta en la listo.\",\n \"UNKNOWN_WALLET_ID\": \"Kroma monujo nekonata.\",\n \"RESTORE_WALLET_LIST_FAILED\": \"Malsukceso por restarigi la kromajn monujojn.\",\n \"INVALID_FILE_FORMAT\": \"Strukturo de dosiero nevalida.\"\n },\n \"INFO\": {\n \"POPUP_TITLE\": \"Informo\",\n \"CERTIFICATION_DONE\": \"Atestaĵo sendita\",\n \"NOT_ENOUGH_CREDIT\": \"Saldo nesufiĉa\",\n \"TRANSFER_SENT\": \"Elspezo sendita\",\n \"COPY_TO_CLIPBOARD_DONE\": \"Kopiita en la memoreto\",\n \"MEMBERSHIP_OUT_SENT\": \"Eksiĝo sendita\",\n \"NOT_NEED_MEMBERSHIP\": \"Vi jam estas membro.\",\n \"IDENTITY_WILL_MISSING_CERTIFICATIONS\": \"Al tiu ĉi identeco baldaŭ mankos atestaĵoj (almenaŭ {{willNeedCertificationCount}}).\",\n \"IDENTITY_NEED_MEMBERSHIP\": \"Tiu ĉi identeco ne sendis aliĝo-peton. Tion ĝi devos fari, se ĝi deziras fariĝi membro.\",\n \"HAS_ALTERNATIVE_IDENTITIES\": \"Ekzistas <b>pluraj identecoj</b> ligitaj kun tiu ĉi publika ŝlosilo. <b>Antaŭ ĉia atestado</b>, pensu <a ng-click=\\\"doQuickFix('showSelectIdentities')\\\">trarigardi la aliajn identecojn</a> por elekti la ĝustan, aŭ kontaktu la posedanton de la konto.\",\n \"REVOCATION_SENT\": \"Nuligo sendita\",\n \"REVOCATION_SENT_WAITING_PROCESS\": \"La <b>nuligo de tiu ĉi identeco</b> estis petita kaj atendas traktadon.\",\n \"FEATURES_NOT_IMPLEMENTED\": \"Tiu ĉi funkciaro ankoraŭ estas programiĝanta.<br/>Kial ne <b>kontribui al Cesium</b>, por ekhavi ĝin pli rapide? ;)\",\n \"EMPTY_TX_HISTORY\": \"Neniu spezo elportota\"\n },\n \"CONFIRM\": {\n \"POPUP_TITLE\": \"<b>Konfirmo</b>\",\n \"POPUP_WARNING_TITLE\": \"<b>Averto</b>\",\n \"POPUP_SECURITY_WARNING_TITLE\": \"<i class=\\\"icon ion-alert-circled\\\"></i> <b>Averto pri sekureco</b>\",\n \"CERTIFY_RULES_TITLE_UID\": \"Atesti {{uid}}\",\n \"CERTIFY_RULES\": \"<b class=\\\"assertive\\\">NE atestu</b> konton, se vi pensas ke:<br/><br/><ul><li>1.) ĝi ne rilatas al persono <b>fizika kaj vivanta</b>.<li>2.) ĝia posedanto <b>havas alian konton</b> jam atestitan.<li>3.) ĝia posedanto malobservas (vole aŭ ne) la regulon 1 aŭ 2 (ekzemple atestante falsajn kontojn aŭ duoblajn).</ul><br/><b>Ĉu vi certas,</b> ke vi tamen volas atesti tiun ĉi identecon?\",\n \"FULLSCREEN\": \"Afiŝi la programon plen-ekrane?\",\n \"EXIT_APP\": \"Fermi la programon?\",\n \"TRANSFER\": \"<b>Resumo de la elspezo</b> :<br/><br/><ul><li> - De: {{from}}</li><li> - Al: <b>{{to}}</b></li><li> - Sumo: <b>{{amount}} {{unit}}</b></li><li> - Komento: <i>{{comment}}</i></li></ul><br/><b>Ĉu vi certas, ke vi volas efektivigi tiun ĉi elspezon?</b>\",\n \"TRANSFER_ALL\": \"<b>Resumo de la elspezo</b>:<br/><br/><ul><li> - De : {{from}}</li><li> - Al : <b>{{to}}</b></li><li> - Sumo: <b>{{amount}} {{unit}}</b></li><li> - Komento: <i>{{comment}}</i></li><br/><li> - Resto: <b>{{restAmount}} {{unit}}</b> al <b>{{restTo}}</b></li></ul><br/><b>Ĉu vi certas, ke vi volas efektivigi tiun ĉi elspezon?</b>\",\n \"MEMBERSHIP_OUT\": \"Tiu ĉi ago estas <b>neinversigebla</b>.<br/></br/>Ĉu vi certas, ke vi volas <b>nuligi vian membro-konton</b>?\",\n \"MEMBERSHIP_OUT_2\": \"Tiu ĉi ago estas <b>neinversigebla</b> !<br/><br/>Ĉu vi vere certas, ke vi volas <b>nuligi vian aliĝon</b> kiel membron?\",\n \"LOGIN_UNUSED_WALLET_TITLE\": \"Tajperaro?\",\n \"LOGIN_UNUSED_WALLET\": \"La konektita konto ŝajnas <b>neaktiva</b>.<br/><br/>Temas probable pri <b>tajperaro</b> en viaj konekto-identigiloj. Bonvolu rekomenci, kontrolante ke <b>la publika ŝlosilo estas tiu de via konto</b>.\",\n \"FIX_IDENTITY\": \"La pseŭdonimo <b>{{uid}}</b> estos denove publikigita, anstataŭigante la malnovan publikigon, kiu finiĝis.<br/></br/><b>Ĉu vi certas</b>, ke vi volas daŭrigi?\",\n \"FIX_MEMBERSHIP\": \"Via aliĝo-peto kiel membro tuj estos resendita.<br/></br/><b>Ĉu vi certas</b>, ke vi volas daŭrigi?\",\n \"MEMBERSHIP\": \"Via aliĝo-peto kiel membro tuj estos sendita.<br/></br/><b>Ĉu vi certas</b>, ke vi volas daŭrigi?\",\n \"RENEW_MEMBERSHIP\": \"Via aliĝo kiel membro tuj estos revalidigita.<br/></br/><b>Ĉu vi certas</b>, ke vi volas daŭrigi?\",\n \"REVOKE_IDENTITY\": \"Vi estas <b>nuligonta definitive tiun ĉi identecon</b>.<br/><br/>La publika ŝlosilo kaj la ligita pseŭdonimo <b>neniam plu povos esti uzataj</b> (por membro-konto). <br/></br/><b>Ĉu vi certas</b>, ke vi volas definitive nuligi tiun ĉi konton?\",\n \"REVOKE_IDENTITY_2\": \"Tiu ĉi ago estas <b>neinversigebla</b>!<br/><br/>Ĉu vi vere certas, ke vi volas <b>definitive nuligi</b> tiun ĉi konton?\",\n \"NOT_NEED_RENEW_MEMBERSHIP\": \"Via aliĝo ne bezonas esti revalidigita (ĝi finiĝos nur post {{membershipExpiresIn|formatDuration}}).<br/></br/><b>Ĉu vi certas</b>, ke vi volas revalidigi vian aliĝon?\",\n \"SAVE_BEFORE_LEAVE\": \"Ĉu vi volas <b>konservi viajn modifojn</b> antaŭ ol eliri el la paĝo?\",\n \"SAVE_BEFORE_LEAVE_TITLE\": \"Modifoj ne registritaj\",\n \"LOGOUT\": \"Ĉu vi certas, ke vi volas malkonektiĝi?\",\n \"USE_FALLBACK_NODE\": \"Nodo <b>{{old}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Ĉu vi volas provizore uzi la nodon <b>{{new}}</b> ?\",\n \"ISSUE_524_SEND_LOG\": \"La spezo estis forĵetita, pro konata anomalio (petslipo #524) sed <b>ne ripetita</b>.<br/><br/>Por helpi la programistojn korekti tiun eraron, <b>ĉu vi akceptas la sendadon de viaj protokolaj dosieroj</b> per mesaĝo?<br/><small>(neniu konfidenca dateno estas sendita)</small>.\"\n },\n \"DOWNLOAD\": {\n \"POPUP_TITLE\": \"<b>Dosiero pri nuligo</b>\",\n \"POPUP_REVOKE_MESSAGE\": \"Por sekurigi vian konton, bonvolu elŝuti la <b>dokumenton pri konto-nuligo</b>. Ĝi ebligos al vi eventuale nuligi vian konton (kaze de konto-ŝtelo, ŝanĝo de identigilo, konto erare kreita, ktp.).<br/><br/><b>Bonvolu stoki ĝin en sekura loko.</b>\"\n },\n \"HELP\": {\n \"TITLE\": \"Ret-helpo\",\n \"JOIN\": {\n \"SECTION\": \"Enskribiĝo\",\n \"SALT\": \"La sekreta identigilo estas tre grava. Ĝi utilas por miksi la pasvorton, antaŭ ol ĝi servos por kalkuli la <span class=\\\"text-italic\\\">publikan ŝlosilon</span> de via konto (ties numeron) kaj la sekretan ŝlosilon por aliri ĝin.<br/><b>Zorgu pri ĝia bona memorigado</b>, ĉar neniu rimedo estas nuntempe planita por retrovi ĝin kaze de perdo.<br/>Krom tio, ĝi ne povas esti modifita sen devige krei novan konton.<br/><br/>Bona sekreta identigilo devas esti sufiĉe longa (kun almenaŭ 8 signoj) kaj kiel eble plej originala.\",\n \"PASSWORD\": \"La pasvorto estas tre grava. Kun la sekreta identigilo, ĝi servas por kalkuli la numeron (la publikan ŝlosilon) de via konto, kaj la sekretan ŝlosilon por aliri ĝin.<br/><b>Zorgu pri ĝia bona memorigado</b>, ĉar neniu rimedo estas planita por retrovi ĝin kaze de perdo (krom se oni generas konserv-dosieron).<br/>Krom tio, ĝi ne povas esti modifita sen devige krei novan konton.<br/><br/>Bona pasvorto entenas (ideale) almenaŭ 8 signojn, inter kiuj estas almenaŭ unu majusklo kaj unu cifero.\",\n \"PSEUDO\": \"La pseŭdonimo estas utila nur kaze de enskribiĝo kiel <span class=\\\"text-italic\\\">membro</span>. Ĝi ĉiam estas ligita kun monujo (tra ĝia <span class=\\\"text-italic\\\">publika ŝlosilo</span>).<br/>Ĝi estas publikigita en la reto, tiel ke la aliaj uzantoj povu identigi ĝin, atesti ĝin aŭ sendi monon al ĝia konto.<br/>Pseŭdonimo devas esti unika ene de la membroj (<u>nunaj</u> kaj eksaj).\"\n },\n \"LOGIN\": {\n \"SECTION\": \"Konekto\",\n \"PUBKEY\": \"Publika ŝlosilo de la ŝlosilaro\",\n \"PUBKEY_DEF\": \"La publika ŝlosilo de la ŝlosilaro estas kreita per la tajpitaj identigiloj (iuj ajn), sen ke ili necese rilatu al konto jam uzata.<br/><b>Atente kontrolu, ke la publika ŝlosilo estas tiu de via konto</b>. Alikaze, vi estos konektita al konto probable neniam uzita, la risko de kolizio kun ekzistanta konto estante tre eta.<br/><a href=\\\"https://fr.wikipedia.org/wiki/Cryptographie_asym%C3%A9trique\\\" target=\\\"_system\\\">Scii pli pri kriptografio</a> per publika ŝlosilo.\",\n \"METHOD\": \"Konekto-metodoj\",\n \"METHOD_DEF\": \"Pluraj eblecoj disponeblas por konekti vin al monujo:<br/> - La konekto <b>per salumado (simpla aŭ sperta)</b> miksas vian pasvorton dank'al la sekreta identigilo, por limigi la provojn de <a href=\\\"https://fr.wikipedia.org/wiki/Attaque_par_force_brute\\\" target=\\\"_system\\\">kodrompado per kruda forto</a> (ekzemple per konataj vortoj.<br/> - La konekto <b>per publika ŝlosilo</b> evitigas tajpi viajn identigilojn, kiuj estos petataj de vi, nur kiam venos la momento dum operacio ĉe la konto.<br/> - La konekto <b>per dosiero pri ŝlosilaro</b> legas la ŝlosilojn (publikan kaj privatan) de la konto, per dosiero, sen la bezono tajpi identigilojn. Pluraj strukturoj de dosiero eblas.\"\n },\n \"GLOSSARY\": {\n \"SECTION\": \"Glosaro\",\n \"PUBKEY_DEF\": \"Publika ŝlosilo identigas monujon, kiu povas identigi membron aŭ rilati al anonima monujo. Ĉe Cesium la publika ŝlosilo estas kalkulita (implicite) dank'al la sekreta identigilo kaj la pasvorto.<br/><a href=\\\"https://fr.wikipedia.org/wiki/Cryptographie_asym%C3%A9trique\\\" target=\\\"_system\\\">Scii pli pri kriptografio</a> per publika ŝlosilo.\",\n \"MEMBER\": \"Membro\",\n \"MEMBER_DEF\": \"Membro estas homa persono fizika kaj vivanta, kiu deziras libere partopreni en la mona komunumo. Li/ŝi kunproduktas universalan dividendon, laŭ periodo kaj sumo tiel difinitaj kiel en la <span class=\\\"text-italic\\\">reguloj de la mono</span>\",\n \"CURRENCY_RULES\": \"Reguloj de la mono\",\n \"CURRENCY_RULES_DEF\": \"La reguloj de la mono estas difinitaj definitive. Ili fiksas la funkciadon de la mono: la kalkulon de la universala dividendo, la nombron de necesaj atestaĵoj por esti membro, la maksimuman nombron da atestaĵoj, kiujn povas doni unu membro, ktp. <a href=\\\"#/app/currency\\\">Vidi la nuntempajn regulojn</a>.<br/>La nemodifo de la reguloj tra la tempo eblas per uzado de <span class=\\\"text-italic\\\">Blokĉeno</span>, kiu entenas kaj plenumas tiujn regulojn, kaj konstante kontrolas ties ĝustan aplikadon.\",\n \"BLOCKCHAIN\": \"Ĉeno de blokoj (<span class=\\\"text-italic\\\">Blokchain/Blokĉeno</span>)\",\n \"BLOCKCHAIN_DEF\": \"La Blokĉeno estas malcentrigita sistemo, kiu, kaze de Duniter, servas por enteni kaj plenumi la <span class=\\\"text-italic\\\">regulojn de la mono</span>.<br/><a href=\\\"https://duniter.org/fr/comprendre/\\\" target=\\\"_system\\\">Scii pli pri Duniter</a> kaj la funkciado de ties blokĉeno.\",\n \"UNIVERSAL_DIVIDEND_DEF\": \"La Universala Dividendo (UD) estas la kvanto de mono kunkreita de ĉiu membro, laŭ la periodo kaj kalkulo difinitaj en la <span class=\\\"text-italic\\\">reguloj de la mono</span>.<br/>Por ĉiu perioda dato, la membroj ricevas en sian konton la saman kvanton da nova mono.<br/><br/>La UD spertas regulan kreskon, por resti justa inter la membroj (nunaj kaj venontaj), kalkulitan depende de la meza vivespero, kiel estas demonstrite en la Teorio Relativa pri la Mono (TRM).<br/><a href=\\\"http://trm.creationmonetaire.info\\\" target=\\\"_system\\\">Scii pli pri la TRM</a> kaj la liberaj monoj.\",\n \"WOT\": \"Reto de Fido (RdF)\",\n \"WOT_DEF\": \"La Reto de Fido konsistas el la tuto de la membroj de la mono, kaj el la atesto-ligoj, kiuj kunligas ilin.\",\n \"DISTANCE_RULE\": \"Regulo pri distanco\",\n \"DISTANCE_RULE_DEF\": \"La regulo pri distanco de la Reto de Fido difinas <b>maksimuman distancon nepran</b> inter petanto kaj minimuma nombro da referencaj membroj (aŭ centraj membroj). Tiu distanco estas kalkulita uzante la ligojn inter atestaĵoj.\"\n },\n \"TIP\": {\n \"MENU_BTN_CURRENCY\": \"La menuo <b>{{'MENU.CURRENCY'|translate}}</b> ebligas konsulti la <b>regulojn de la mono</b> kaj ties staton.\",\n \"CURRENCY_WOT\": \"La <b>nombro de membroj</b> montras la gravecon de la komunumo kaj ebligas <b>sekvi ties evoluon</b>.\",\n \"CURRENCY_MASS\": \"Sekvu ĉi tie la <b>ĉioman kvanton da mono</b> ekzistanta kaj ties <b>mezan distribuon</b> por membro.<br/><br/>Tio ĉi ebligas taksi la <b>gravecon de iu sumo</b>, kompare kun tio, kion <b>posedas la aliuloj</b> en sia konto (mezume).\",\n \"CURRENCY_UNIT_RELATIVE\": \"La unuo uzata (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) signifas, ke la sumoj en {{currency|capitalize}} estis dividitaj per la <b> Universala Dividendo</b> (UD).<br/><br/><small>Tiu relativa unuo estas <b>trafa</b>, ĉar stabila malgraŭ la kvanto de mono, kiu kreskas seninterrompe.</small>\",\n \"CURRENCY_CHANGE_UNIT\": \"La kromaĵo <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> ebligas <b>ŝanĝi la unuon</b>, por vidigi la sumojn <b>rekte en {{currency|capitalize}}</b> (prefere ol en “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”).\",\n \"CURRENCY_CHANGE_UNIT_TO_RELATIVE\": \"La kromaĵo <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> ebligas <b>ŝanĝi la unuon</b>, por vidigi la sumojn en “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”, tio estas rilate al la Universala Dividendo (la sumo kunproduktita de ĉiu membro).\",\n \"CURRENCY_RULES\": \"La <b>reguloj</b> de la mono fiksas ties funkciadon <b>ĝustan kaj antaŭvideblan</b>.<br/><br/>Vera DNA de la mono, ili igas sian monan kodon <b>legebla kaj travidebla</b>.\",\n \"MENU_BTN_NETWORK\": \"La menuo <b>{{'MENU.NETWORK'|translate}}</b> ebligas konsulti la staton de la reto.\",\n \"NETWORK_BLOCKCHAIN\": \"Ĉiuj operacioj pri la mono estas registritaj en granda konto-libro <b>publika kaj nefalsigebla</b>, ankaŭ nomata <b>blokĉeno</b> (<em>BlockChain</em> en la angla).\",\n \"NETWORK_PEERS\": \"La <b>nodoj</b> videblaj ĉi tie rilatas al la <b>komputiloj, kiuj ĝisdatigas kaj kontrolas</b> la blokĉenon.<br/><br/>Ju pli estas nodoj, des pli la mono havas administradon <b>malcentrigitan</b> kaj fidindan.\",\n \"NETWORK_PEERS_BLOCK_NUMBER\": \"Tiu ĉi <b>numero</b> (verda) indikas la <b>lastan blokon validigitan</b> por tiu ĉi nodo (lasta paĝo skribita en la granda konto-libro).<br/><br/>La verda koloro indikas, ke tiu ĉi bloko estas validigita ankaŭ de <b>la plej multaj el la aliaj nodoj</b>.\",\n \"NETWORK_PEERS_PARTICIPATE\": \"<b>Ĉiu membro</b>, ekipita per komputilo kun interreto, <b>povas partopreni aldonante nodon</b>. Sufiĉas <b>instali la programon Duniter</b> (libera kaj senpaga). <a href=\\\"{{installDocUrl}}\\\" target=\\\"_system\\\">Vidi la gvidilon pri instalado >></a>.\",\n \"MENU_BTN_ACCOUNT\": \"La menuo <b>{{'ACCOUNT.TITLE'|translate}}</b> ebligas aliri la administradon de via konto.\",\n \"MENU_BTN_ACCOUNT_MEMBER\": \"Konsultu ĉi tie la staton de via konto kaj la informojn pri viaj atestaĵoj.\",\n \"WALLET_CERTIFICATIONS\": \"Alklaku ĉi tien por konsulti la detalon pri viaj atestaĵoj (ricevitaj kaj senditaj).\",\n \"WALLET_RECEIVED_CERTIFICATIONS\": \"Alklaku ĉi tien por konsulti la detalon pri viaj <b>ricevitaj atestaĵoj</b>.\",\n \"WALLET_GIVEN_CERTIFICATIONS\": \"Alklaku ĉi tien por konsulti la detalon pri viaj <b>senditaj atestaĵoj</b>.\",\n \"WALLET_BALANCE\": \"La <b>saldo</b> de via konto afiŝiĝas tie ĉi.\",\n \"WALLET_BALANCE_RELATIVE\": \"{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>La uzata unuo (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) signifas, ke la sumo en {{currency|capitalize}} estis dividita per la <b>Universala Dividendo</b> (UD) kunkreita de ĉiu membro.<br/><br/>Nuntempe 1 UD valoras {{currentUD|formatInteger}} {{currency|capitalize}}j.\",\n \"WALLET_BALANCE_CHANGE_UNIT\": \"Vi povos <b>ŝanĝi la unuon</b> afiŝitan por la sumoj en la <b><i class=\\\"icon ion-android-settings\\\"></i> {{'MENU.SETTINGS'|translate}}</b>.<br/><br/>Ekzemple por vidigi la sumojn <b>rekte en {{currency|capitalize}}</b>, prefere ol en relativa unuo.\",\n \"WALLET_PUBKEY\": \"Jen la publika ŝlosilo de via konto. Vi povas sciigi ĝin al aliulo, por ke li identigu pli simple vian konton.\",\n \"WALLET_SEND\": \"Efektivigi pagon per kelkaj klakoj.\",\n \"WALLET_SEND_NO_MONEY\": \"Efektivigi pagon per kelkaj klakoj.<br/>(Via saldo ankoraŭ ne permesas tion)\",\n \"WALLET_OPTIONS\": \"Tiu ĉi butono ebligas aliri la <b>agojn pri aliĝo</b> kaj sekureco.<br/><br/>Ne forgesu okulumi al ĝi!\",\n \"WALLET_RECEIVED_CERTS\": \"Afiŝiĝos ĉi tie la listo de la personoj, kiuj atestis vin.\",\n \"WALLET_CERTIFY\": \"La butono <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> ebligas elekti identecon kaj atesti ĝin.<br/><br/>Nur uzantoj <b>jam membroj</b> povas atesti aliajn.\",\n \"WALLET_CERT_STOCK\": \"Via stoko da atestaĵoj (senditaj) estas limigita je <b>{{sigStock}} atestaĵoj</b>.<br/><br/>Tiu stoko plu evoluas laŭ la tempo, samtempe kiam la atestaĵoj malvalidiĝas.\",\n \"MENU_BTN_TX\": \"La menuo <b>{{'MENU.TRANSACTIONS'|translate}}</b> ebligas konsulti vian konton, la liston de viaj spezoj, kaj sendi pagon.\",\n \"MENU_BTN_WOT\": \"La menuo <b>{{'MENU.WOT'|translate}}</b> ebligas traserĉi inter la <b>uzantoj</b> de la mono (membroj aŭ ne).\",\n \"WOT_SEARCH_TEXT_XS\": \"Por traserĉi en la kontaro, tajpu la <b>unuajn literojn de pseŭdonimo</b> (aŭ de publika ŝlosilo).<br/><br/>La serĉado ekos aŭtomate.\",\n \"WOT_SEARCH_TEXT\": \"Por traserĉi en la kontaro, tajpu la <b>unuajn literojn de de pseŭdonimo</b> (aŭ de publika ŝlosilo). <br/><br/>Premu poste sur la klavon <b>Enigi</b> por ekigi la serĉadon.\",\n \"WOT_SEARCH_RESULT\": \"Vidigu la detalan slipon simple <b>alklakante</b> linion.\",\n \"WOT_VIEW_CERTIFICATIONS\": \"La linio <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> montras kiom da membroj validigis tiun ĉi identecon.<br/><br/>Tiuj atestaĵoj pruvas, ke la konto apartenas al <b>persono homa kaj vivanta</b>, havanta <b>neniun alian membro-konton</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_COUNT\": \"Necesas almenaŭ <b>{{sigQty}} atestaĵoj</b> por fariĝi membro kaj ricevi la <b>Universalan Dividendon</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_CLICK\": \"Alklaki ĉi tien ebligas malfermi <b>la liston de ĉiuj atestaĵoj</b> de la identeco (ricevitaj kaj senditaj).\",\n \"WOT_VIEW_CERTIFY\": \"La butono <b>{{'WOT.BTN_CERTIFY'|translate}}</b> ebligas aldoni vian atestaĵon al tiu identeco.\",\n \"CERTIFY_RULES\": \"<b>Atenton:</b> Atestu nur <b>personojn fizikajn vivantajn</b>, posedantajn neniun alian membro-konton.<br/><br/>La sekureco de la mono dependas de ĉies atentego!\",\n \"MENU_BTN_SETTINGS\": \"La <b>{{'MENU.SETTINGS'|translate}}</b> ebligos al vi agordi la programon.\",\n \"HEADER_BAR_BTN_PROFILE\": \"Alklaku ĉi tien por aliri vian <b>uzanto-profilon.</b>\",\n \"SETTINGS_CHANGE_UNIT\": \"Vi povos <b>ŝanĝi la afiŝ-unuon</b> de la sumoj alklakante ĉi-supren.<br/><br/>- Malaktivigu la kromaĵon por afiŝi sumojn en {{currency|capitalize}}.<br/>- Aktivigu la kromaĵon por relativa afiŝado en {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (ĉiuj sumoj estos <b>dividitaj</b> per la Universala Dividendo aktuala).\",\n \"END_LOGIN\": \"Tiu ĉi gvidata vizito <b>finiĝis</b>!<br/><br/>Bonan daŭrigon al vi, en la nova mondo de la<b>libera ekonomio</b>!\",\n \"END_NOT_LOGIN\": \"Tiu ĉi gvidata vizito <b>finiĝis</b>!<br/><br/>Se vi deziras partopreni en la mono {{currency|capitalize}}, sufiĉos al vi alklaki <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> ĉi-sube.\"\n }\n },\n \"API\" :{\n \"COMMON\": {\n \"LINK_DOC\": \"Dokumentaro API\",\n \"LINK_DOC_HELP\": \"Dokumentaro por la programistoj\",\n \"LINK_STANDARD_APP\": \"Klasika versio\",\n \"LINK_STANDARD_APP_HELP\": \"Malfermi la klasikan version de {{'COMMON.APP_NAME'|translate}}\",\n \"CONNECTION_ERROR\": \"Nodo <b>{{server}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Kontrolu vian interretan konekton, aŭ kontaktu la administranton de la retejo</a>.\"\n },\n \"HOME\": {\n \"TITLE\": \"Dokumentaro API {{'COMMON.APP_NAME'|translate}}\",\n \"MESSAGE\": \"Bonvenon en la <b>dokumentaro de la API</b> {{'COMMON.APP_NAME'|translate}}.<br/>Konektu viajn retejojn al <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> tre simple!\",\n \"MESSAGE_SHORT\": \"Konektu viajn retejojn al <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> tre simple!\",\n \"DOC_HEADER\": \"Servoj disponeblaj:\"\n },\n \"TRANSFER\": {\n \"TITLE\": \"{{'COMMON.APP_NAME'|translate}} - Reta pago\",\n \"TITLE_SHORT\": \"Reta pago\",\n \"SUMMARY\": \"Resumo de la pago:\",\n \"AMOUNT\": \"Sumo:\",\n \"AMOUNTS_HELP\": \"Bonvolu elekti la sumon:\",\n \"NAME\": \"Nomo:\",\n \"PUBKEY\": \"Publika ŝlosilo de la ricevonto:\",\n \"COMMENT\": \"Referenco de la spezo:\",\n \"NODE\": \"Adreso de la nodo:\",\n \"DEMO\": {\n \"SALT\": \"demo\",\n \"PASSWORD\": \"demo\",\n \"PUBKEY\": \"3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1\",\n \"HELP\": \"<b>Demonstra moduso</b>: Neniu pago reale estos sendita dum tiu simulado.<br/>Bonvolu uzi la identigilojn: <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>\",\n \"BAD_CREDENTIALS\": \"Kontrolu vian tajpaĵon.<br/>En demonstra moduso, la identigiloj estas: {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}\"\n },\n \"INFO\": {\n \"SUCCESS_REDIRECTING_WITH_NAME\": \"Pago sendita.<br/>Redirektiĝo al <b>{{name}}</b>...\",\n \"SUCCESS_REDIRECTING\": \"Pago sendita.<br/>Redirektiĝo al la retejo de la vendanto...\",\n \"CANCEL_REDIRECTING_WITH_NAME\": \"Pago nuligita.<br/>Redirektiĝo al <b>{{name}}</b>...\",\n \"CANCEL_REDIRECTING\": \"Pago nuligita.<br/>Redirektiĝo al la retejo de la vendanto...\"\n },\n \"ERROR\": {\n \"TRANSFER_FAILED\": \"Pago malsukcesa\"\n }\n },\n \"DOC\": {\n \"DESCRIPTION_DIVIDER\": \"Priskribo\",\n \"URL_DIVIDER\": \"Adreso alvokita\",\n \"PARAMETERS_DIVIDER\": \"Parametroj\",\n \"AVAILABLE_PARAMETERS\": \"Jen la listo de la eblaj parametroj:\",\n \"DEMO_DIVIDER\": \"Testi\",\n \"DEMO_HELP\": \"Por testi tiun servon, alklaku la butonon ĉi-apude. La rezulto afiŝiĝos sube.\",\n \"DEMO_RESULT\": \"Rezulto sendita de la alvoko:\",\n \"DEMO_RESULT_PEER\": \"Adreso de la uzata nodo:\",\n \"DEMO_SUCCEED\": \"<i class=\\\"icon ion-checkmark\\\"></i> Sukceso!\",\n \"DEMO_CANCELLED\": \"<i class=\\\"icon ion-close\\\"></i> Nuligita de la uzanto\",\n \"INTEGRATE_DIVIDER\": \"Integri\",\n \"INTEGRATE_CODE\": \"Kodo:\",\n \"INTEGRATE_RESULT\": \"Antaŭvidigo de la rezulto:\",\n \"INTEGRATE_PARAMETERS\": \"Parametroj\",\n \"TRANSFER\": {\n \"TITLE\": \"Pagoj\",\n \"DESCRIPTION\": \"De retejo (ekz.: ret-vendado) vi povas komisii la pagon en libera mono al Cesium API. Por tio, sufiĉas al vi ekigi la malfermon de paĝo ĉe la sekvanta adreso:\",\n \"PARAM_PUBKEY\": \"Publika ŝlosilo de la ricevonto\",\n \"PARAM_PUBKEY_HELP\": \"Publika ŝlosilo de la ricevonto (devige)\",\n \"PARAM_AMOUNT\": \"Sumo\",\n \"PARAM_AMOUNT_HELP\": \"Sumo de la spezo (devige). Pluraj valoroj permesataj, uzante apartigilon (punkto-komo, vertikala streko aŭ spaco).\",\n \"PARAM_COMMENT\": \"Referenco (aŭ komento)\",\n \"PARAM_COMMENT_HELP\": \"Referenco aŭ komento. Tio ekzemple ebligos al vi identigi la pagon en la blokĉeno.\",\n \"PARAM_NAME\": \"Nomo (de la ricevonto aŭ de la retejo)\",\n \"PARAM_NAME_HELP\": \"La nomo de la ricevonto, aŭ de la retejo alvokanta. Tio povas estis legebla nomo (\\\"Mia retejo\\\"), aŭ alie pseŭdo-retadreso (\\\"MiaRetejo.com\\\").\",\n \"PARAM_REDIRECT_URL\": \"Retadreso por redirektiĝo\",\n \"PARAM_REDIRECT_URL_HELP\": \"Retadreso (URL) por redirektiĝo, alvokita kiam la pago estis sendita. Ĝi povas enteni la sekvantajn signojn, kiuj estos anstataŭigitaj per la valoroj de la spezo: \\\"{tx}\\\", \\\"{hash}\\\", \\\"{comment}\\\", \\\"{amount}\\\", \\\"{pubkey}\\\" kaj \\\"{node}\\\".\",\n \"PARAM_CANCEL_URL\": \"Retadreso por nuligo\",\n \"PARAM_CANCEL_URL_HELP\": \"Retadreso (URL) kaze de nuligo de la pago, fare de la uzanto. Ĝi povas enteni la sekvantajn signojn, kiuj estos anstataŭigitaj lastmomente: \\\"{comment}\\\", \\\"{amount}\\\" kaj {pubkey}.\",\n \"PARAM_PREFERRED_NODE\": \"Adreso de la preferata nodo\",\n \"PARAM_PREFERRED_NODE_HELP\": \"Adreso (URL) de la nodo Duniter preferinde uzota (\\\"g1.domaine.com:443\\\" aŭ \\\"https://g1.domaine.com\\\").\",\n \"EXAMPLES_HELP\": \"Jen ekzemploj pri integrado:\",\n \"EXAMPLE_BUTTON\": \"Butono HTML\",\n \"EXAMPLE_BUTTON_DEFAULT_TEXT\": \"Pagi en {{currency|currencySymbol}}\",\n \"EXAMPLE_BUTTON_DEFAULT_STYLE\": \"Personigita stilo\",\n \"EXAMPLE_BUTTON_TEXT_HELP\": \"Buton-teksto\",\n \"EXAMPLE_BUTTON_BG_COLOR\": \"Fon-koloro\",\n \"EXAMPLE_BUTTON_BG_COLOR_HELP\": \"Ekzemplo: #fbc14c, nigra, helgriza, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_FONT_COLOR\": \"Teksto-koloro\",\n \"EXAMPLE_BUTTON_FONT_COLOR_HELP\": \"Ekzemplo: nigra, oranĝa, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_TEXT_ICON\": \"Ikono\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH\": \"Larĝeco\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH_HELP\": \"Ekzemplo: 200px, 50%\",\n \"EXAMPLE_BUTTON_ICON_NONE\": \"Neniu\",\n \"EXAMPLE_BUTTON_ICON_DUNITER\": \"Insigno Duniter\",\n \"EXAMPLE_BUTTON_ICON_CESIUM\": \"Insigno Cesium\",\n \"EXAMPLE_BUTTON_ICON_G1_COLOR\": \"Insigno Ğ1\",\n \"EXAMPLE_BUTTON_ICON_G1_BLACK\": \"Insigno Ğ1 (nigra)\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"es-ES\", {\n \"COMMON\": {\n \"APP_NAME\": \"Cesium\",\n \"APP_VERSION\": \"v{{version}}\",\n \"APP_BUILD\": \"fecha: {{build}}\",\n \"PUBKEY\": \"Llave pública\",\n \"MEMBER\": \"Miembro\",\n \"BLOCK\": \"Bloque\",\n \"BTN_OK\": \"OK\",\n \"BTN_YES\": \"Sí\",\n \"BTN_NO\": \"No\",\n \"BTN_SEND\": \"Enviar\",\n \"BTN_SEND_MONEY\": \"Hacer un pago\",\n \"BTN_SEND_MONEY_SHORT\": \"Pago\",\n \"BTN_SAVE\": \"Guardar\",\n \"BTN_YES_SAVE\": \"Sí, guardar\",\n \"BTN_YES_CONTINUE\": \"Sí, continuar\",\n \"BTN_SHOW\": \"Ver\",\n \"BTN_SHOW_PUBKEY\": \"Ver la llave\",\n \"BTN_RELATIVE_UNIT\": \"Mostrar importes en DU\",\n \"BTN_BACK\": \"Anterior\",\n \"BTN_NEXT\": \"Siguiente\",\n \"BTN_IMPORT\": \"Importar\",\n \"BTN_CANCEL\": \"Cancelar\",\n \"BTN_CLOSE\": \"Cerrar\",\n \"BTN_LATER\": \"Más tarde\",\n \"BTN_LOGIN\": \"Conectarse\",\n \"BTN_LOGOUT\": \"Desconexión\",\n \"BTN_ADD_ACCOUNT\": \"Nueva cuenta\",\n \"BTN_SHARE\": \"Compartir\",\n \"BTN_EDIT\": \"Modificar\",\n \"BTN_DELETE\": \"Suprimir\",\n \"BTN_ADD\": \"Añadir\",\n \"BTN_SEARCH\": \"Buscar\",\n \"BTN_REFRESH\": \"Actualizar\",\n \"BTN_RETRY\": \"Empezar de nuevo\",\n \"BTN_START\": \"Empezar\",\n \"BTN_CONTINUE\": \"Continuar\",\n \"BTN_CREATE\": \"Crear\",\n \"BTN_UNDERSTOOD\": \"Entendido\",\n \"BTN_OPTIONS\": \"Opciones\",\n \"BTN_HELP_TOUR\": \"Visita guiada\",\n \"BTN_HELP_TOUR_SCREEN\": \"Explicar esta pantalla\",\n \"BTN_DOWNLOAD\": \"Descargar\",\n \"BTN_DOWNLOAD_ACCOUNT_STATEMENT\": \"Descargar historial de cuenta\",\n \"BTN_MODIFY\": \"Modificar\",\n \"CHOOSE_FILE\": \"Arrastre el archivo<br/>o haga clic para seleccionarlo\",\n \"DAYS\": \"Días\",\n \"NO_ACCOUNT_QUESTION\": \"¿Todavía no es miembro? ¡Crear una cuenta!\",\n \"SEARCH_NO_RESULT\": \"Ningún resultado encontrado\",\n \"LOADING\": \"Espere por favor…\",\n \"LOADING_WAIT\": \"Espere por favor…<br/><small>(Esperando disponibilidad de nodo)</small>\",\n \"SEARCHING\": \"Búsqueda en proceso…\",\n \"FROM\": \"De\",\n \"TO\": \"A\",\n \"COPY\": \"Copiar\",\n \"LANGUAGE\": \"Idioma\",\n \"UNIVERSAL_DIVIDEND\": \"Dividendo universal\",\n \"UD\": \"DU\",\n \"DATE_PATTERN\": \"DD/MM/YYYY HH:mm\",\n \"DATE_FILE_PATTERN\": \"YYYY-MM-DD\",\n \"DATE_SHORT_PATTERN\": \"DD/MM/YY\",\n \"DATE_MONTH_YEAR_PATTERN\": \"MM/YYYY\",\n \"EMPTY_PARENTHESIS\": \"(vacío)\",\n \"UID\": \"Seudónimo\",\n \"ENABLE\": \"Activado\",\n \"DISABLE\": \"Desactivado\",\n \"RESULTS_LIST\": \"Resultados:\",\n \"RESULTS_COUNT\": \"{{count}} resultados\",\n \"EXECUTION_TIME\": \"ejecutado en {{duration|formatDurationMs}}\",\n \"SHOW_VALUES\": \"¿Publicar los valores no codificados?\",\n \"POPOVER_ACTIONS_TITLE\": \"Opciones\",\n \"POPOVER_FILTER_TITLE\": \"Filtros\",\n \"SHOW_MORE\": \"Mostrar más\",\n \"SHOW_MORE_COUNT\": \"(límite actual {{limit}})\",\n \"POPOVER_SHARE\": {\n \"TITLE\": \"Compartir\",\n \"SHARE_ON_TWITTER\": \"Compartir en Twitter\",\n \"SHARE_ON_FACEBOOK\": \"Compartir en Facebook\",\n \"SHARE_ON_DIASPORA\": \"Compartir en Diaspora*\",\n \"SHARE_ON_GOOGLEPLUS\": \"Compartir en Google+\"\n },\n \"FILE\": {\n \"DATE\" : \"Fecha:\",\n \"TYPE\" : \"Tipo:\",\n \"SIZE\": \"Tamaño:\",\n \"VALIDATING\": \"Validando…\"\n }\n },\n \"SYSTEM\": {\n \"PICTURE_CHOOSE_TYPE\": \"Elegir la fuente:\",\n \"BTN_PICTURE_GALLERY\": \"Galería\",\n \"BTN_PICTURE_CAMERA\": \"<b>Cámara</b>\"\n },\n \"MENU\": {\n \"HOME\": \"Inicio\",\n \"WOT\": \"Directorio\",\n \"CURRENCY\": \"Moneda\",\n \"ACCOUNT\": \"Mi cuenta\",\n \"WALLETS\": \"Mis monederos\",\n \"SETTINGS\": \"Ajustes\",\n \"NETWORK\": \"Red\",\n \"TRANSACTIONS\": \"Mis transacciones\"\n },\n \"ABOUT\": {\n \"BTN_OPEN_DEV_WINDOW\": \"Abrir ventana de depuración\",\n \"TITLE\": \"Acerca de\",\n \"LICENSE\": \"Software <b>libre</b> (licencia GNU AGPLv3).\",\n \"LATEST_RELEASE\": \"Existe una <b>versión más nueva</b> de {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)\",\n \"PLEASE_UPDATE\": \"Por favor actualice {{'COMMON.APP_NAME' | translate}} (última versión: <b>v{{version}}</b>)\",\n \"CODE\": \"Código fuente:\",\n \"OFFICIAL_WEB_SITE\": \"Web oficial:\",\n \"DEVELOPERS\": \"Desarrollado por:\",\n \"FORUM\": \"Foro:\",\n \"PLEASE_REPORT_ISSUE\": \"No dude en informarnos de anomalías encontradas\",\n \"REPORT_ISSUE\": \"Reportar un problema\"\n },\n \"HOME\": {\n \"FEED_SOURCE\": \"Fuente\",\n \"READ_MORE\": \"Leer más\",\n \"SHOW_ALL_FEED\": \"Ver todo\",\n \"TITLE\": \"Cesium\",\n \"WELCOME\": \"¡Bienvenida/o a la aplicación Cesium!\",\n \"MESSAGE\": \"Reciba y envíe moneda libre {{currency|abbreviate}} fácilmente\",\n \"BTN_CURRENCY\": \"Explorar la moneda\",\n \"BTN_ABOUT\": \"Acerca de\",\n \"BTN_HELP\": \"Ayuda en línea\",\n \"REPORT_ISSUE\": \"Reportar anomalía\",\n \"NOT_YOUR_ACCOUNT_QUESTION\": \"¿No es suya la cuenta <b><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}</b>?\",\n \"BTN_CHANGE_ACCOUNT\": \"Desconectar esta cuenta\",\n \"CONNECTION_ERROR\": \"Nodo <b>{{server}}</b> inalcanzable o dirección inválida.<br/><br/>Compruebe su conexión a Internet, o nodo de conmutación <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">en los ajustes</a>.\"\n },\n \"SETTINGS\": {\n \"TITLE\": \"Ajustes\",\n \"DISPLAY_DIVIDER\": \"Visualización\",\n \"STORAGE_DIVIDER\": \"Almacenamiento\",\n \"NETWORK_SETTINGS\": \"Red\",\n \"PEER\": \"Dirección del nodo Duniter\",\n \"PEER_CHANGED_TEMPORARY\": \"Dirección utilizada temporalmente\",\n \"PEER_SHORT\": \"Nodo Duniter\",\n \"PERSIST_CACHE\": \"Conservar los datos de navegación (experimental)\",\n \"PERSIST_CACHE_HELP\": \"Permite una navegación más rápida, conservando localmente los datos recibidos, para usar de una sesión a otra.\",\n \"USE_LOCAL_STORAGE\": \"Activar el almacenamiento local\",\n \"USE_LOCAL_STORAGE_HELP\": \"Permitir conservar sus ajustes\",\n \"WALLETS_SETTINGS\": \"Mis monederos\",\n \"USE_WALLETS_ENCRYPTION\": \"Cifrar el listado\",\n \"USE_WALLETS_ENCRYPTION_HELP\": \"Permite proteger la lista de sus monederos (mediante cifrado), exigiendo una autenticación para acceder.\",\n \"ENABLE_HELPTIP\": \"Activar la ayuda contextual\",\n \"ENABLE_UI_EFFECTS\": \"Activar los efectos visuales\",\n \"HISTORY_SETTINGS\": \"Transacciones de la cuenta\",\n \"DISPLAY_UD_HISTORY\": \"Mostrar los DU creados\",\n \"TX_HISTORY_AUTO_REFRESH\": \"Activar actualización automática\",\n \"TX_HISTORY_AUTO_REFRESH_HELP\": \"Actualizar el saldo y las transacciones automáticamente, con cada nuevo bloque.\",\n \"AUTHENTICATION_SETTINGS\": \"Autenticación\",\n \"KEEP_AUTH\": \"Caducidad de la autenticación\",\n \"KEEP_AUTH_SHORT\": \"Caducidad\",\n \"KEEP_AUTH_HELP\": \"Defina cuándo expira su sesión\",\n \"KEEP_AUTH_OPTION\": {\n \"NEVER\": \"Después de cada operación\",\n \"SECONDS\": \"Después de {{value}} segundos de inactividad\",\n \"MINUTE\": \"Después de {{value}}min de inactividad\",\n \"MINUTES\": \"Después de {{value}}mins de inactividad\",\n \"HOUR\": \"Después de {{value}}h de inactividad\",\n \"ALWAYS\": \"Al finalizar la sesión\"\n },\n \"KEYRING_FILE\": \"Archivo de llaves\",\n \"KEYRING_FILE_HELP\": \"Le permite <b>conectarse</b> automáticamente en cada inicio <br/>e incluso de <b>autenticarse</b> (solo si \\\"Caducidad de la autenticación\\\" está configurada en modo: \\\"al finalizar la sesión\\\").\",\n \"REMEMBER_ME\": \"Recordarme\",\n \"REMEMBER_ME_HELP\": \"Permite mantenerse siempre conectado (no recomendado), conservando localmente la llave pública.\",\n \"PLUGINS_SETTINGS\": \"Extensiones\",\n \"BTN_RESET\": \"Restaurar los valores por defecto\",\n \"EXPERT_MODE\": \"Modo experto\",\n \"EXPERT_MODE_HELP\": \"Permite una visualización más detallada\",\n \"BLOCK_VALIDITY_WINDOW\": \"Tiempo de incertitud de los bloques\",\n \"DISABLE_HELPTIP\": \"Desactivar la opción de ayuda contextual\",\n \"BLOCK_VALIDITY_WINDOW_SHORT\": \"Tiempo de incertitud\",\n \"BLOCK_VALIDITY_WINDOW_HELP\": \"Tiempo de espera antes de considerar una información como validada\",\n \"BLOCK_VALIDITY_OPTION\": {\n \"NONE\": \"Sin espera\",\n \"N\": \"{{time | formatDuration}} ({{count}} bloques)\"\n },\n \"POPUP_PEER\": {\n \"TITLE\": \"Nodo Duniter\",\n \"HOST\": \"Dirección\",\n \"HOST_HELP\": \"Dirección: servidor:puerto\",\n \"USE_SSL\": \"Conexión segura\",\n \"USE_SSL_HELP\": \"(Cifrado SSL)\",\n \"BTN_SHOW_LIST\": \"Lista de nodos\"\n }\n },\n \"BLOCKCHAIN\": {\n \"HASH\": \"Hash: {{hash}}\",\n \"VIEW\": {\n \"HEADER_TITLE\": \"Bloque #{{number}}-{{hash|formatHash}}\",\n \"TITLE_CURRENT\": \"Bloque actual\",\n \"TITLE\": \"Bloque #{{number|formatInteger}}\",\n \"COMPUTED_BY\": \"Calculado por el nodo de\",\n \"SHOW_RAW\": \"Ver el fichero en bruto\",\n \"TECHNICAL_DIVIDER\": \"Informaciones técnicas\",\n \"VERSION\": \"Versión del formato\",\n \"HASH\": \"Hash calculado\",\n \"UNIVERSAL_DIVIDEND_HELP\": \"Moneda co-producida por cada uno de los {{membersCount}} miembros\",\n \"EMPTY\": \"Ningún dato en este bloque\",\n \"POW_MIN\": \"Dificultad mínima\",\n \"POW_MIN_HELP\": \"Dificultad impuesta por el cálculo del hash\",\n \"DATA_DIVIDER\": \"Datos\",\n \"IDENTITIES_COUNT\": \"Nuevas identidades\",\n \"JOINERS_COUNT\": \"Nuevos miembros\",\n \"ACTIVES_COUNT\": \"Renovaciones\",\n \"ACTIVES_COUNT_HELP\": \"Miembros que han renovado sus adhesiones\",\n \"LEAVERS_COUNT\": \"Miembros salientes\",\n \"LEAVERS_COUNT_HELP\": \"Miembros salientes que ya no quieren estar certificados\",\n \"EXCLUDED_COUNT\": \"Miembros excluidos\",\n \"EXCLUDED_COUNT_HELP\": \"Antiguos miembros excluidos por no renovación o falta de certificaciones\",\n \"REVOKED_COUNT\": \"Identidades revocadas\",\n \"REVOKED_COUNT_HELP\": \"Estas cuentas no podrán ser miembros\",\n \"TX_COUNT\": \"Transacciones\",\n \"CERT_COUNT\": \"Certificaciones\",\n \"TX_TO_HIMSELF\": \"Operación de cambio\",\n \"TX_OUTPUT_UNLOCK_CONDITIONS\": \"Condiciones de desbloqueo\",\n \"TX_OUTPUT_OPERATOR\": {\n \"AND\": \"y\",\n \"OR\": \"o\"\n },\n \"TX_OUTPUT_FUNCTION\": {\n \"SIG\": \"<b>Firma</b> de \",\n \"XHX\": \"<b>Contraseña</b>, cuyo SHA256 =\",\n \"CSV\": \"Bloqueado durante\",\n \"CLTV\": \"Bloqueado hasta\"\n }\n },\n \"LOOKUP\": {\n \"TITLE\": \"Bloques\",\n \"NO_BLOCK\": \"Ningún bloque\",\n \"LAST_BLOCKS\": \"Últimos bloques:\",\n \"BTN_COMPACT\": \"Compactar\"\n }\n },\n \"CURRENCY\": {\n \"VIEW\": {\n \"TITLE\": \"Moneda\",\n \"TAB_CURRENCY\": \"Moneda\",\n \"TAB_WOT\": \"Red de confianza\",\n \"TAB_NETWORK\": \"Red\",\n \"TAB_BLOCKS\": \"Bloques\",\n \"CURRENCY_SHORT_DESCRIPTION\": \"{{currency|abbreviate}} es una <b>moneda libre</b>, originada {{firstBlockTime|formatFromNow}}. Cuenta actualmente con <b>{{N}} miembros</b>, que producen y reciben un <a ng-click=\\\"showHelpModal('ud')\\\">Dividendo Universal</a> (DU) cada {{dt|formatPeriod}}.\",\n \"NETWORK_RULES_DIVIDER\": \"Reglas de la red\",\n \"CURRENCY_NAME\": \"Nombre de la moneda\",\n \"MEMBERS\": \"Cantidad de miembros\",\n \"MEMBERS_VARIATION\": \"Variación desde último DU\",\n \"MONEY_DIVIDER\": \"Moneda\",\n \"MASS\": \"Masa monetaria\",\n \"SHARE\": \"Masa media por miembro\",\n \"UD\": \"Dividendo Universal\",\n \"C_ACTUAL\": \"Crecimiento actual\",\n \"MEDIAN_TIME\": \"Hora de la cadena de bloques\",\n \"POW_MIN\": \"Nivel mínimo de dificultad de cálculo\",\n \"MONEY_RULES_DIVIDER\": \"Reglas de la moneda\",\n \"C_RULE\": \"Crecimiento teórico objetivo\",\n \"UD_RULE\": \"Cálculo del dividendo universal\",\n \"DT_REEVAL\": \"Periodo de revalorización del DU\",\n \"REEVAL_SYMBOL\": \"reval\",\n \"DT_REEVAL_VALUE\": \"Todos los <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})\",\n \"UD_REEVAL_TIME0\": \"Fecha de la primera revalorización\",\n \"SIG_QTY_RULE\": \"Certificaciones requeridas para ser miembro\",\n \"SIG_STOCK\": \"Máximo de certificaciones emitibles por miembros\",\n \"SIG_PERIOD\": \"Espera mínima entre 2 certificaciones sucesivas emitidas por la misma persona\",\n \"SIG_WINDOW\": \"Límite para tener en cuenta una certificación\",\n \"SIG_VALIDITY\": \"Duración de una certificación tenida en cuenta\",\n \"MS_WINDOW\": \"Límite para aprobar una solicitud de membresía\",\n \"MS_VALIDITY\": \"Duración de una membresía aprobada\",\n \"STEP_MAX\": \"Distancia máxima entre una nueva candidatura y cada miembro referente\",\n \"WOT_RULES_DIVIDER\": \"Reglas de la red de confianza\",\n \"SENTRIES\": \"Certificaciones necesarias para ser miembro referente\",\n \"SENTRIES_FORMULA\": \"Fórmula de las certificaciones necesarias para ser miembro referente\",\n \"XPERCENT\":\"Porcentaje mínimo necesario de miembros referentes respentando la regla de distancia máxima\",\n \"AVG_GEN_TIME\": \"Tiempo medio entre dos bloques\",\n \"CURRENT\": \"actual\",\n \"MATH_CEILING\": \"TECHO\",\n \"DISPLAY_ALL_RULES\": \"¿Ver todas las reglas?\",\n \"BTN_SHOW_LICENSE\": \"Ver la licencia\",\n \"WOT_DIVIDER\": \"Red de confianza\"\n },\n \"LICENSE\": {\n \"TITLE\": \"Licencia de la moneda\",\n \"BTN_DOWNLOAD\": \"Descargar el fichero\",\n \"NO_LICENSE_FILE\": \"Fichero de licencia no encontrado.\"\n }\n },\n \"NETWORK\": {\n \"VIEW\": {\n \"MEDIAN_TIME\": \"Hora de la cadena de bloques\",\n \"LOADING_PEERS\": \"Cargando nodos…\",\n \"NODE_ADDRESS\": \"Dirección:\",\n \"SOFTWARE\": \"Software:\",\n \"WARN_PRE_RELEASE\": \"Prelanzamiento (última versión estable: <b>{{version}}</b>)\",\n \"WARN_NEW_RELEASE\": \"Versión <b>{{version}}</b> disponible\",\n \"WS2PID\": \"ID:\",\n \"PRIVATE_ACCESS\": \"Acceso privado\",\n \"POW_PREFIX\": \"Prefijo de la prueba de trabajo:\",\n \"ENDPOINTS\": {\n \"BMAS\": \"Interfaz segura (SSL)\",\n \"BMATOR\": \"Interfaz red TOR\",\n \"WS2P\": \"Interfaz WS2P\",\n \"ES_USER_API\": \"Nodo de datos Cesium+\"\n }\n },\n \"INFO\": {\n \"ONLY_SSL_PEERS\": \"La visualización de los nodos sin SSL está deteriorada porque Cesium funciona en modo HTTPS.\"\n }\n },\n \"PEER\": {\n \"PEERS\": \"Nodos\",\n \"SIGNED_ON_BLOCK\": \"Firmado sobre el bloque\",\n \"MIRROR\": \"espejo\",\n \"MIRRORS\": \"Espejo\",\n \"MIRROR_PEERS\": \"Nodos espejo\",\n \"PEER_LIST\": \"Lista de nodos\",\n \"MEMBERS\": \"Miembro\",\n \"MEMBER_PEERS\": \"Nodos miembro\",\n \"ALL_PEERS\": \"Todos los nodos\",\n \"DIFFICULTY\": \"Dificultad\",\n \"API\": \"API\",\n \"CURRENT_BLOCK\": \"Bloque #\",\n \"POPOVER_FILTER_TITLE\": \"Filtro\",\n \"OFFLINE\": \"Fuera de línea\",\n \"OFFLINE_PEERS\": \"Nodos fuera de línea\",\n \"BTN_SHOW_PEER\": \"Ver nodo\",\n \"VIEW\": {\n \"TITLE\": \"Nodo\",\n \"OWNER\": \"Propiedad de\",\n \"SHOW_RAW_PEERING\": \"Ver la ficha del par\",\n \"SHOW_RAW_CURRENT_BLOCK\": \"Ver el último bloque (formato bruto)\",\n \"LAST_BLOCKS\": \"Bloques recientes\",\n \"KNOWN_PEERS\": \"Nodos conocidos:\",\n \"GENERAL_DIVIDER\": \"Información general\",\n \"ERROR\": {\n \"LOADING_TOR_NODE_ERROR\": \"No se pudo obtener la información del nodo usando la red TOR.\",\n \"LOADING_NODE_ERROR\": \"No se pudo obtener la información del nodo\"\n }\n }\n },\n \"WOT\": {\n \"SEARCH_HELP\": \"Buscar (seudónimo o llave pública)\",\n \"SEARCH_INIT_PHASE_WARNING\": \"Durante la etapa de preinscripción, el tiempo de búsqueda de las candidaturas en espera <b>puede tardar</b>. Por favor espere…\",\n \"REGISTERED_SINCE\": \"Se registró en\",\n \"REGISTERED_SINCE_BLOCK\": \"Se registró en el bloque #\",\n \"NO_CERTIFICATION\": \"Ninguna certificación validada\",\n \"NO_GIVEN_CERTIFICATION\": \"Ninguna certificación emitida\",\n \"NOT_MEMBER_PARENTHESIS\": \"(no miembro)\",\n \"IDENTITY_REVOKED_PARENTHESIS\": \"(identidad revocada)\",\n \"MEMBER_PENDING_REVOCATION_PARENTHESIS\": \"(revocación en proceso)\",\n \"EXPIRE_IN\": \"Expira\",\n \"NOT_WRITTEN_EXPIRE_IN\": \"Fecha límite<br/>de procesamiento\",\n \"EXPIRED\": \"Expirado\",\n \"PSEUDO\": \"Seudónimo\",\n \"SIGNED_ON_BLOCK\": \"Emitida en el bloque #{{block}}\",\n \"WRITTEN_ON_BLOCK\": \"Escrita en el bloque #{{block}}\",\n \"GENERAL_DIVIDER\": \"Informaciones generales\",\n \"NOT_MEMBER_ACCOUNT\": \"Cuenta no miembro\",\n \"NOT_MEMBER_ACCOUNT_HELP\": \"Se trata de un monedero simple, sin solicitud de membresía en espera\",\n \"TECHNICAL_DIVIDER\": \"Informaciones técnicas\",\n \"BTN_CERTIFY\": \"Certificar\",\n \"BTN_YES_CERTIFY\": \"Sí, certificar\",\n \"BTN_SELECT_AND_CERTIFY\": \"Nueva certificación\",\n \"ACCOUNT_OPERATIONS\": \"Transacciones de la cuenta\",\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"Identidad {{title}}\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Directorio\",\n \"NEWCOMERS\": \"Nuevos miembros:\",\n \"NEWCOMERS_COUNT\": \"{{count}} miembros\",\n \"PENDING\": \"Inscripciones en espera:\",\n \"PENDING_COUNT\": \"{{count}} inscripciones en espera\",\n \"REGISTERED\": \"Se inscribió {{sigDate | formatFromNow}}\",\n \"MEMBER_FROM\": \"Miembro desde {{memberDate|medianFromNowShort}}\",\n \"BTN_NEWCOMERS\": \"Miembros recientes\",\n \"BTN_PENDING\": \"Candidaturas en espera\",\n \"SHOW_MORE\": \"Mostrar más\",\n \"SHOW_MORE_COUNT\": \"(mostrar solo {{limit}})\",\n \"NO_PENDING\": \"Ninguna candidatura en espera.\",\n \"NO_NEWCOMERS\": \"Sin miembros.\"\n },\n \"CONTACTS\": {\n \"TITLE\": \"Contactos\"\n },\n \"MODAL\": {\n \"TITLE\": \"Buscar\"\n },\n \"CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certificaciones\",\n \"SUMMARY\": \"Certificaciones recibidas\",\n \"LIST\": \"Detalle de las certificaciones recibidas\",\n \"PENDING_LIST\": \"Certificaciones en espera de tratamiento\",\n \"RECEIVED\": \"Certificaciones recibidas\",\n \"RECEIVED_BY\": \"Certificaciones recibidas por {{uid}}\",\n \"ERROR\": \"Certificaciones recibidas por error\",\n \"SENTRY_MEMBER\": \"Miembro referente\"\n },\n \"OPERATIONS\": {\n \"TITLE\": \"{{uid}} - Transacciones\"\n },\n \"GIVEN_CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certificaciones emitidas\",\n \"SUMMARY\": \"Certificaciones emitidas\",\n \"LIST\": \"Detalle de las certificaciones emitidas\",\n \"PENDING_LIST\": \"Certificaciones en espera a ser procesadas\",\n \"SENT\": \"Certificaciones emitidas\",\n \"SENT_BY\": \"Certificaciones emitidas por {{uid}}\",\n \"ERROR\": \"Certificaciones emitidas por error\"\n }\n },\n \"LOGIN\": {\n \"TITLE\": \"<i class=\\\"icon ion-locked\\\"></i> Conexión\",\n \"SCRYPT_FORM_HELP\": \"Ingrese sus credenciales.<br>Recuerde comprobar que la llave pública pertenece a su cuenta.\",\n \"PUBKEY_FORM_HELP\": \"Por favor ingrese una llave pública de cuenta:\",\n \"FILE_FORM_HELP\": \"Elija el archivo de llaves a usar:\",\n \"SCAN_FORM_HELP\": \"Escanee el código QR de un monedero.\",\n \"SALT\": \"Identificador secreto\",\n \"SALT_HELP\": \"Identificador secreto\",\n \"SHOW_SALT\": \"Mostrar el identificador secreto\",\n \"PASSWORD\": \"Contraseña\",\n \"PASSWORD_HELP\": \"Contraseña\",\n \"PUBKEY_HELP\": \"llave pública\",\n \"NO_ACCOUNT_QUESTION\": \"¿Aún no tiene cuenta? \",\n \"HAVE_ACCOUNT_QUESTION\": \"¿Ya tiene cuenta?\",\n \"CREATE_ACCOUNT\": \"Crear una cuenta\",\n \"CREATE_FREE_ACCOUNT\": \"Crear una cuenta gratis\",\n \"FORGOTTEN_ID\": \"¿Olvidó su contraseña?\",\n \"ASSOCIATED_PUBKEY\": \"Llave pública del archivo de llaves:\",\n \"BTN_METHODS\": \"Otros métodos\",\n \"BTN_METHODS_DOTS\": \"Otras vías…\",\n \"METHOD_POPOVER_TITLE\": \"Métodos\",\n \"MEMORIZE_AUTH_FILE\": \"Memorizar las llaves durante la sesión de navegación\",\n \"SCRYPT_PARAMETERS\": \"Ajustes (Scrypt) :\",\n \"AUTO_LOGOUT\": {\n \"TITLE\": \"Información\",\n \"MESSAGE\": \"<i class=\\\"ion-android-time\\\"></i> Se ha <b>desconectado</b> de forma automática, después de un periodo de inactividad prolongada.\",\n \"BTN_RELOGIN\": \"Volver a conectarme\",\n \"IDLE_WARNING\": \"Será desconectado en… {{countdown}}\"\n },\n \"METHOD\": {\n \"SCRYPT_DEFAULT\": \"Estándar (por defecto)\",\n \"SCRYPT_ADVANCED\": \"Aleatoriedad avanzada\",\n \"FILE\": \"Archivo de llaves\",\n \"PUBKEY\": \"Llave pública o seudónimo\",\n \"SCAN\": \"Escanear un código QR\"\n },\n \"SCRYPT\": {\n \"SIMPLE\": \"Ligero\",\n \"DEFAULT\": \"Predeterminado\",\n \"SECURE\": \"Seguro\",\n \"HARDEST\": \"El más seguro\",\n \"EXTREME\": \"Extremo\",\n \"USER\": \"Personalizado\",\n \"N\": \"N (Loop):\",\n \"r\": \"r (RAM):\",\n \"p\": \"p (CPU):\"\n },\n \"FILE\": {\n \"HELP\": \"Formato de archivo esperado: <b>.yml</b> o <b>.dunikey</b> (tipo PubSec, WIF o EWIF).\"\n }\n },\n \"API\": {\n \"COMMON\": {\n \"CONNECTION_ERROR\": \"Nodo <b>{{server}}</b> inalcanzable o dirección inválida.<br/><br/>Verifique su conexión a Internet, o contacte con la administración del sitio.</a>.\",\n \"LINK_DOC\": \"Documentación API\",\n \"LINK_DOC_HELP\": \"Documentación para desarrolladores\",\n \"LINK_STANDARD_APP\": \"Versión clásica\",\n \"LINK_STANDARD_APP_HELP\": \"Abrir la versión clásica de {{'COMMON.APP_NAME'|translate}}\"\n },\n \"DOC\": {\n \"AVAILABLE_PARAMETERS\": \"Lista de parámetros disponibles :\",\n \"DEMO_CANCELLED\": \"<i class=\\\"icon ion-close\\\"></i> Cancelado por el usuario\",\n \"DEMO_DIVIDER\": \"Probar\",\n \"DEMO_HELP\": \"Para probar este servicio, haga clic en este botón. El resultado se mostrará debajo.\",\n \"DEMO_RESULT\": \"Resultado retornado por la llamada :\",\n \"DEMO_RESULT_PEER\": \"Dirección del nodo utilizado :\",\n \"DEMO_SUCCEED\": \"<i class=\\\"icon ion-checkmark\\\"></i> ¡ Éxito !\",\n \"DESCRIPTION_DIVIDER\": \"Descripción\",\n \"INTEGRATE_CODE\": \"Código :\",\n \"INTEGRATE_DIVIDER\": \"Integrar\",\n \"INTEGRATE_PARAMETERS\": \"Parámetros\",\n \"INTEGRATE_RESULT\": \"Previsualización del resultado :\",\n \"PARAMETERS_DIVIDER\": \"Parámetros\",\n \"TRANSFER\": {\n \"DESCRIPTION\": \"Desde una web (ej: tienda online) puede delegar el pago en moneda libre con la API de Cesium. Para eso, simplemente ponga un link a la siguiente dirección :\",\n \"EXAMPLE_BUTTON\": \"Botón HTML\",\n \"EXAMPLE_BUTTON_BG_COLOR\": \"Color de fondo\",\n \"EXAMPLE_BUTTON_BG_COLOR_HELP\": \"Ejemplo : #fbc14c, black, lightgrey, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_DEFAULT_STYLE\": \"Estilo personalizado\",\n \"EXAMPLE_BUTTON_DEFAULT_TEXT\": \"Pagar en {{currency|currencySymbol}}\",\n \"EXAMPLE_BUTTON_FONT_COLOR\": \"Color del texto\",\n \"EXAMPLE_BUTTON_FONT_COLOR_HELP\": \"Ejemplo : black, orange, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_ICON_CESIUM\": \"Logo Cesium\",\n \"EXAMPLE_BUTTON_ICON_DUNITER\": \"Logo Duniter\",\n \"EXAMPLE_BUTTON_ICON_G1_BLACK\": \"Logo Ğ1 (negro)\",\n \"EXAMPLE_BUTTON_ICON_G1_COLOR\": \"Logo Ğ1\",\n \"EXAMPLE_BUTTON_ICON_NONE\": \"Ninguno\",\n \"EXAMPLE_BUTTON_TEXT_HELP\": \"Texto del botón\",\n \"EXAMPLE_BUTTON_TEXT_ICON\": \"Icono\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH\": \"Anchura\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH_HELP\": \"Ejemplo : 200px, 50%\",\n \"EXAMPLES_HELP\": \"Ejemplos de integración :\",\n \"PARAM_AMOUNT\": \"Cuantía\",\n \"PARAM_AMOUNT_HELP\": \"Cuantía de la transición (obligatorio). Valores múltiples permitidos utilizando un separador (punto y coma, barra vertical o espacio).\",\n \"PARAM_CANCEL_URL\": \"Dirección web de cancelación\",\n \"PARAM_CANCEL_URL_HELP\": \"Dirección web (URL) en caso de anulación del pago por parte del usuario. Puede contener las siguientes palabras que serán remplazadas por sus valores dinámicamente en cada caso: \\\"{comment}\\\", \\\"{amount}\\\" y \\\"{pubkey}\\\".\",\n \"PARAM_COMMENT\": \"Concepto (o comentario)\",\n \"PARAM_COMMENT_HELP\": \"Concepto o comentario. Le permitirá por ejemplo identificar el pago en la cadena de bloques (blockchain).\",\n \"PARAM_NAME\": \"Nombre (del destinatario o de su sitio web)\",\n \"PARAM_NAME_HELP\": \"El nombre del destinatario, o de su sitio web. Puede ser un nombre leíble (\\\"Mi tienda en línea\\\"), o un dominio (\\\"Mitienda.com\\\").\",\n \"PARAM_PREFERRED_NODE\": \"Dirección del nodo preferido\",\n \"PARAM_PREFERRED_NODE_HELP\": \"Dirección (URL) del nodo Duniter a utilizar preferentemente (\\\"g1.domaine.com:443\\\" o \\\"https://g1.domaine.com\\\").\",\n \"PARAM_PUBKEY\": \"Llave pública del destinatario\",\n \"PARAM_PUBKEY_HELP\": \"La llave pública del destinatario (obligatoria)\",\n \"PARAM_REDIRECT_URL\": \"Dirección web de redirección\",\n \"PARAM_REDIRECT_URL_HELP\": \"Dirección web (URL) de redirección, llamada cuanda el pago ha sido enviado. Puede contener las palabras siguientes, que serán remplazadas por los valores de la transacción dinámicanente : \\\"{tx}\\\", \\\"{hash}\\\", \\\"{comment}\\\", \\\"{amount}\\\", \\\"{pubkey}\\\" y \\\"{node}\\\".\",\n \"TITLE\": \"Pagos\"\n },\n \"URL_DIVIDER\": \"Dirección de llamada\"\n },\n \"HOME\": {\n \"DOC_HEADER\": \"Servicios disponibles :\",\n \"MESSAGE\": \"Bienvenido/a a la <b>documentación de la API</b> {{'COMMON.APP_NAME'|translate}}.<br/>Conecte sus sitios webs a la cadena de bloques <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> muy fácilmente !\",\n \"MESSAGE_SHORT\": \"Conecte sus sitios a <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> muy fácilmente !\",\n \"TITLE\": \"Documentación API {{'COMMON.APP_NAME'|translate}}\"\n },\n \"TRANSFER\": {\n \"AMOUNT\": \"Cuantía :\",\n \"AMOUNTS_HELP\": \"Elija la cuantía :\",\n \"COMMENT\": \"Concepto/Comentario de la operación :\",\n \"DEMO\": {\n \"BAD_CREDENTIALS\": \"Verifique sus credenciales.<br/>En modo demostración, las credenciales son : {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}\",\n \"HELP\": \"<b>Modo demostración</b> : Ningún pago será enviado realmente durante esta simulación.<br/>Utilice las credenciales : <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>\",\n \"PASSWORD\": \"demo\",\n \"PUBKEY\": \"3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1\",\n \"SALT\": \"demo\"\n },\n \"ERROR\": {\n \"TRANSFER_FAILED\": \"Error en el pago\"\n },\n \"INFO\": {\n \"CANCEL_REDIRECTING\": \"Pago cancelado.<br/>Redirigiendo al sitio del vendedor...\",\n \"CANCEL_REDIRECTING_WITH_NAME\": \"Pago cancelado.<br/>Redirigiendo a <b>{{name}}</b>...\",\n \"SUCCESS_REDIRECTING\": \"Pago enviado.<br/>Redirigiendo al sitio del vendedor...\",\n \"SUCCESS_REDIRECTING_WITH_NAME\": \"Pago enviado.<br/>Redirigiendo a <b>{{name}}</b>...\"\n },\n \"NAME\": \"Nombre :\",\n \"NODE\": \"Dirección del nodo :\",\n \"PUBKEY\": \"Llave pública del destinatario :\",\n \"SUMMARY\": \"Resumen del pago :\",\n \"TITLE\": \"{{'COMMON.APP_NAME'|translate}} - Pago en línea\",\n \"TITLE_SHORT\": \"Pago en línea\"\n }\n },\n \"AUTH\": {\n \"TITLE\": \"<i class=\\\"icon ion-locked\\\"></i> Autenticación\",\n \"BTN_AUTH\": \"Autenticar\",\n \"GENERAL_HELP\": \"Por favor, autentíquese:\",\n \"EXPECTED_UID_HELP\": \"Por favor inicie sesión en la cuenta de <i class=\\\"ion-person\\\"></i> {{uid}}:\",\n \"EXPECTED_PUBKEY_HELP\": \"Por favor, autentíquese en el monedero <br class=\\\"visible-xs\\\"/><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}} :\",\n \"SCAN_FORM_HELP\": \"Escanee el código QR de la <b>llave privada</b> del monedero.\"\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Mi cuenta\",\n \"BALANCE\": \"Saldo\",\n \"LAST_TX\": \"Últimas transacciones validadas\",\n \"BALANCE_ACCOUNT\": \"Saldo de la cuenta\",\n \"NO_TX\": \"Ninguna transacción\",\n \"SHOW_MORE_TX\": \"Mostrar más\",\n \"SHOW_ALL_TX\": \"Mostrar todo\",\n \"TX_FROM_DATE\": \"(mostrar solo {{fromTime|medianFromNowShort}})\",\n \"OUT_DISTANCED\": \"Sus certificaciones recibidas provienen de un grupo demasiado aislado de la <a ng-click=\\\"showHelpModal('wot')\\\">Red de Confianza</a> (RdC) : la <a ng-click=\\\"showHelpModal('distance_rule')\\\">regla de distancia máxima</a> no se cumple.<br/>Deberá obtener certificaciones provinientes de otros sectores de la RdC, o esperar a que ésta estreche sus vínculos.\",\n \"PENDING_TX\": \"Transacciones pendientes\",\n \"VALIDATING_TX\": \"Transacciones validadas\",\n \"ERROR_TX\": \"Transacciones no ejecutadas\",\n \"ERROR_TX_SENT\": \"Transacciones ejecutadas fallidas\",\n \"PENDING_TX_RECEIVED\": \"Tansacciones en espera de recepción\",\n \"EVENTS\": \"Eventos\",\n \"WAITING_MEMBERSHIP\": \"Solicitud de membresía emitida. En espera de aceptación.\",\n \"WAITING_CERTIFICATIONS\": \"Debe obtener {{needCertificationCount}} certificación(es) para ser miembro.\",\n \"WAITING_CERTIFICATIONS_HELP\": \"Para obtener sus certificaciones, solicitelas únicamente a miembros <b>que le conozcan bien (y en persona)</b>, como exige <a ng-click=\\\"showLicenseModal()\\\">la licencia de la moneda</a> que usted ha aceptado.<br/>Si no conoce lo suficiente a miembros, hágalo saber en <a ng-click=\\\"openLink($event, $root.settings.userForumUrl)\\\">el foro</a> para conocerlos en persona o asistir a algún encuentro.\",\n \"WILL_MISSING_CERTIFICATIONS\": \"Pronto le van a <b>faltar certificaciones</b> (al menos {{willNeedCertificationCount}} son necesarias)\",\n \"WILL_NEED_RENEW_MEMBERSHIP\": \"Su adhesión como miembro <b>va a expirar {{membershipExpiresIn|formatDurationTo}}</b>. Piense en <a ng-click=\\\"doQuickFix('renew')\\\">renovar su adhesión</a> mientras tanto.\",\n \"NEED_RENEW_MEMBERSHIP\": \"Ya no es miembro porque su adhesión <b>ha expirado</b>. Piense en <a ng-click=\\\"doQuickFix('renew')\\\">renovar su adhesión</a>.\",\n \"NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED\": \"Ya no es miembro de la moneda, <b>por falta de certificaciones</b>. Considere <a ng-click=\\\"doQuickFix('renew')\\\">renovar su adhesión</a>.\",\n \"NO_WAITING_MEMBERSHIP\": \"No hay adhesión miembro en espera. Si desea <b>convertirse en miembro</b>, por favor <a ng-click=\\\"doQuickFix('membership')\\\">envíe su adhesión como miembro</a>.\",\n \"CERTIFICATION_COUNT\": \"Certificaciones recibidas\",\n \"CERTIFICATION_COUNT_SHORT\": \"Certificaciones\",\n \"SIG_STOCK\": \"Certificaciones emitidas\",\n \"BTN_RECEIVE_MONEY\": \"Recibir\",\n \"BTN_SELECT_ALTERNATIVES_IDENTITIES\": \"Cambiar a otra identidad…\",\n \"BTN_FIX_MEMBERSHIP\": \"Volver a enviar la candidatura…\",\n \"BTN_MEMBERSHIP_RENEW\": \"Renovar la membresía\",\n \"BTN_MEMBERSHIP_RENEW_DOTS\": \"Renovar la membresía…\",\n \"BTN_MEMBERSHIP_OUT_DOTS\": \"Cancelar la membresía…\",\n \"BTN_SECURITY_DOTS\": \"Cuenta y seguridad…\",\n \"BTN_SHOW_DETAILS\": \"Publicar la información técnica\",\n \"LOCKED_OUTPUTS_POPOVER\": {\n \"TITLE\": \"Importe bloqueado\",\n \"DESCRIPTION\": \"Aquí están las condiciones para desbloquear este importe:\",\n \"DESCRIPTION_MANY\": \"Esta transacción esta compuesta de varias partes, cuyas condiciones de desbloqueo son:\",\n \"LOCKED_AMOUNT\": \"Condiciones del importe:\"\n },\n \"NEW\": {\n \"TITLE\": \"Registrarse\",\n \"INTRO_WARNING_TIME\": \"Crear una cuenta en {{name|capitalize}} es muy simple. Sin embargo, por favor tome el tiempo suficiente para hacerlo correctamente (generar y memorizar bien las credenciales, etc.)\",\n \"INTRO_WARNING_SECURITY\": \"Asegúrese de que el dispositivo actual (ordenador, tablet, teléfono) <b>es seguro y de confianza</b>.\",\n \"INTRO_WARNING_SECURITY_HELP\": \"Antivirus, cortafuegos, sesión protegida por contraseña o número PIN, etc.\",\n \"INTRO_HELP\": \"Haga clic en <b>{{'COMMON.BTN_START'|translate}}</b> para iniciar la creación de la cuenta. Se le guiará paso a paso.\",\n \"REGISTRATION_NODE\": \"Su registro será grabado a través del nodo Duniter <b>{{server}}</b>, que luego se transmitirá al resto del sistema de la moneda.\",\n \"REGISTRATION_NODE_HELP\": \"Si no confía en este nodo, <a ng-click=\\\"doQuickFix('settings')\\\">cambie los ajustes</a> de Cesium.\",\n \"SELECT_ACCOUNT_TYPE\": \"Elegir el tipo de cuenta a crear:\",\n \"MEMBER_ACCOUNT\": \"Cuenta miembro\",\n \"MEMBER_ACCOUNT_TITLE\": \"Crear una cuenta miembro\",\n \"MEMBER_ACCOUNT_HELP\": \"Si todavía no tiene membresía (solamente una cuenta miembro posible por persona).\",\n \"WALLET_ACCOUNT\": \"Simple monedero\",\n \"WALLET_ACCOUNT_TITLE\": \"Crear una cuenta simple\",\n \"WALLET_ACCOUNT_HELP\": \"Monedero simple para todos los otros casos, por ejemplo si necesita una cuenta suplementaria.<br/>El Dividendo Universal no será producido para esta cuenta.\",\n \"SALT_WARNING\": \"Elija su identificador secreto.<br/>Se solicitará cada vez que se conectará con esta cuenta.<br/><br/><b>Conserve bien este identificador secreto</b>.<br/>¡En caso de pérdida, nadie podrá acceder a su cuenta!\",\n \"PASSWORD_WARNING\": \"Elija su contraseña.<br/>Se solicitará cada vez que se conectará con esta cuenta.<br/><br/><b>Conserve bien esta contraseña</b>.<br/>¡En caso de pérdida, nadie podrá acceder su cuenta!\",\n \"PSEUDO_WARNING\": \"Elija un seudónimo.<br/>Sirve para que los otros miembros puedan encontrarlo más fácilmente.<br/><br/>No debe contener <b>ni espacios ni caracteres acentuados</b>.<div class='hidden-xs'><br/>Ejemplo: <span class='gray'>SophieDupond, MarcelChemin, etc.</span>\",\n \"PSEUDO\": \"Seudónimo\",\n \"PSEUDO_HELP\": \"Seudónimo\",\n \"SALT_CONFIRM\": \"Confirmación\",\n \"SALT_CONFIRM_HELP\": \"Confirmación del identificador secreto\",\n \"PASSWORD_CONFIRM\": \"Confirmación\",\n \"PASSWORD_CONFIRM_HELP\": \"Confirmación de la contraseña\",\n \"SLIDE_6_TITLE\": \"Confirmación:\",\n \"COMPUTING_PUBKEY\": \"Cálculo en proceso…\",\n \"LAST_SLIDE_CONGRATULATION\": \"<b>¡Bien!</b> Ha introducido todas los datos necesarios.<br/><b>Puede solicitar</b> la creación de su cuenta.</b><br/><br/>Para su información, la llave pública que se muestra más abajo identificará su futura cuenta.<br/>Esta podrá ser comunicada a terceros para recibir pagos.\",\n \"CONFIRMATION_MEMBER_ACCOUNT\": \"<b class=\\\"assertive\\\">Advertencia:</b> el identificador secreto, la contraseña y el seudónimo no podrán ser modificados.<br/><b>¡Asegúrese siempre de recordarlos!</b><br/><br/><b>¿Desea</b> solicitar la inscripción?\",\n \"CONFIRMATION_WALLET_ACCOUNT\": \"<b class=\\\"assertive\\\">Advertencia:</b> el identificador secreto y la contraseña no podrán ser modificados.<br/><b>¡Asegúrese de recordarlos siempre!</b><br/><br/><b>¿Desea</b> continuar?\",\n \"CHECKING_PSEUDO\": \"Verificando…\",\n \"PSEUDO_AVAILABLE\": \"Este nombre está disponible\",\n \"PSEUDO_NOT_AVAILABLE\": \"Este nombre de usuario no está disponible\",\n \"INFO_LICENSE\": \"Para unirse a la moneda, le pedimos leer y aceptar esta licencia.\",\n \"BTN_ACCEPT\": \"Acepto\",\n \"BTN_ACCEPT_LICENSE\": \"Acepto la licencia\"\n },\n \"POPUP_REGISTER\": {\n \"TITLE\": \"Elija un seudónimo\",\n \"HELP\": \"Un seudónimo es obligatorio para ser miembro.\"\n },\n \"SELECT_IDENTITY_MODAL\": {\n \"TITLE\": \"Selección de identidad\",\n \"HELP\": \"Se han enviado varias <b>identidades diferentes</b> para la llave pública <span class=\\\"gray\\\"><i class=\\\"ion-key\\\"></i>{{pubkey | formatPubkey}}</span>.<br/>Por favor, selecciona la carpeta para usar:\"\n },\n \"SELECT_WALLET_MODAL\": {\n \"TITLE\": \"Selección de monedero\"\n },\n \"WALLET_LIST\": {\n \"IMPORT_MODAL\": {\n \"HELP\": \"Para <b>importar monederos</b>, haga clic para seleccionar o arrastre en la zona de abajo el archivo con la lista de monederos.\",\n \"NO_NEW_WALLET\": \"Ningún monedero nuevo\",\n \"TITLE\": \"Importar monederos\",\n \"WALLET_COUNT\": \"<b>{{count}}</b> nuevo{{count > 1 ? 's' : ''}} monedero{{count > 1 ? 's' : ''}}\"\n },\n \"TITLE\": \"Mis monederos\",\n \"BTN_NEW\": \"Añadir un monedero\",\n \"BTN_DOWNLOAD\": \"Descargue el listado\",\n \"BTN_IMPORT_FILE_DOTS\": \"Importar desde fichero…\",\n \"NO_WALLET\": \"Sin monedero secundario\",\n \"BTN_DELETE\": \"Eliminar un monedero secundario…\",\n \"BTN_RENAME\": \"Renombrar el monedero\",\n \"EXPORT_FILENAME\": \"monederos-{{pubkey|formatPubkey}}-{{currency}}.csv\",\n \"TOTAL_DOTS\": \"Total : \",\n \"EDIT_POPOVER\": {\n \"TITLE\": \"Renombrar el monedero\",\n \"HELP\": \"Escribe el nuevo nombre\",\n \"NAME_HELP\": \"Nombre del monedero\"\n }\n },\n \"SECURITY\": {\n \"KEYFILE\": {\n \"ERROR\": {\n \"BAD_CHECKSUM\": \"Suma de control (checksum) incorrecta\",\n \"BAD_PASSWORD\": \"Frase secreta incorrecta\"\n },\n \"EWIF_FORMAT\": \"Formato EWIF (Encrypted Wallet Import Format) - v1\",\n \"EWIF_FORMAT_HELP\": \"Este formato almacena su archivo de llaves <b>de forma cifrada</b> a partir de una frase secreta de su elección. También guarda una suma de control (checksum) para verificar la integridad del archivo.<br/><b>Atención :</b>¡ Asegúrese siempre de recordar su frase secreta !\",\n \"PASSWORD_POPUP\": {\n \"HELP\": \"Indique la frase secreta :\",\n \"PASSWORD_HELP\": \"Frase secreta\",\n \"TITLE\": \"Archivo de llaves cifrado\"\n },\n \"PUBSEC_FORMAT\": \"Formato PubSec\",\n \"PUBSEC_FORMAT_HELP\": \"Este formato almacena su archivo de llaves de forma simple. Es compatible con Cesium, ğannonce y Duniter.<br/><b>Atención :</b>El archivo <b>no está cifrado</b> (la llave privada aparece en claro) ; ¡ guárdelo en un lugar seguro !\",\n \"WIF_FORMAT\": \"Formato WIF (Wallet Import Format) - v1\",\n \"WIF_FORMAT_HELP\": \"Este formato almacena su archivo de llaves con una suma de control (checksum) para verificar la integridad del archivo. Es compatible con los monederos en papel (Duniter paper wallet).<br/><b>Atención :</b>El archivo <b>no está cifrado</b> (la llave privada aparece en claro) ; ¡ guárdelo en un lugar seguro !\"\n },\n \"ADD_QUESTION\": \"Añadir pregunta personalizada\",\n \"BTN_CLEAN\": \"Limpiar\",\n \"BTN_RESET\": \"Reiniciar\",\n \"DOWNLOAD_REVOKE\": \"Guardar un archivo de revocación\",\n \"DOWNLOAD_REVOKE_HELP\" : \"Tener un archivo de revocación es importante, en caso de perdida de las credenciales. Le permitirá <b>invalidar y sacar su cuenta miembro fuera de la Red de Confianza</b>, convirtíendose en un monedero simple.\",\n \"RECOVER_ID_SELECT_FILE\": \"Elija el <b>archivo para salvaguardar sus credenciales</b> a utilizar :\",\n \"GENERATE_KEYFILE\": \"Generar mi archivo de llaves…\",\n \"GENERATE_KEYFILE_HELP\": \"Genera un archivo que le permitirá atenticarse sin tener que introducir las credenciales.<br/><b>Cuidado:</b> este archivo contendrá su llave secreta; ¡Es muy importante conservarlo en un lugar seguro!\",\n \"KEYFILE_FILENAME\": \"llavero-{{pubkey|formatPubkey}}-{{currency}}-{{format}}.dunikey\",\n \"MEMBERSHIP_IN\": \"Registrarse como miembro…\",\n \"MEMBERSHIP_IN_HELP\": \"Le permite <b>transformar</b> una cuenta de monedero simple <b>en una cuenta miembro</b>, enviando una petición de membresía. Solo si todavía no tiene una cuenta miembro.\",\n \"SEND_IDENTITY\": \"Publicar identidad…\",\n \"SEND_IDENTITY_HELP\": \"Le permite asociar un seudónimo a esta cuenta, pero <b>sin pedir ser miembro</b>. La validez de este seudónimo tiene un plazo limitado.\",\n \"HELP_LEVEL\": \"Elija <strong> al menos {{nb}} preguntas:</strong>\",\n \"LEVEL\": \"Nivel de seguridad\",\n \"LOW_LEVEL\": \"Bajo <span class=\\\"hidden-xs\\\">(2 preguntas min.)</span>\",\n \"MEDIUM_LEVEL\": \"Medio <span class=\\\"hidden-xs\\\">(4 preguntas min.)</span>\",\n \"QUESTION_1\": \"¿Cómo se llamaba su mejor amigo de la adolescencia?\",\n \"QUESTION_2\": \"¿Cómo se llamaba su primer animal de compañía?\",\n \"QUESTION_3\": \"¿Cuál es el primer plato que aprendió a cocinar?\",\n \"QUESTION_4\": \"¿Cuál es la primera película que vió en un cine?\",\n \"QUESTION_5\": \"¿Cuál era el destino del primer avión que cogió?\",\n \"QUESTION_6\": \"¿Cómo se llamaba su docente favorito en la escuela primaria?\",\n \"QUESTION_7\": \"¿Cuál sería para usted el mejor oficio?\",\n \"QUESTION_8\": \"¿Cuál es su libro infantil preferido?\",\n \"QUESTION_9\": \"¿Cuál fue el modelo de su primer vehículo?\",\n \"QUESTION_10\": \"¿Cuál fue su sobrenombre durante su infancia?\",\n \"QUESTION_11\": \"¿Cuál fue su personaje o actor/actriz preferido/a cuando era estudiante?\",\n \"QUESTION_12\": \"¿Cuál fue su cantante o grupo preferido cuando era estudiante?\",\n \"QUESTION_13\": \"¿En qué ciudad sus padres se encontraron?\",\n \"QUESTION_14\": \"¿Cómo se llamaba su primer jefe/a?\",\n \"QUESTION_15\": \"¿Cómo se llama la calle donde creció?\",\n \"QUESTION_16\": \"¿Cómo se llama la primera playa donde se bañó?\",\n \"QUESTION_17\": \"¿Cuál es el primer álbum que compró?\",\n \"QUESTION_18\": \"¿Cuál es el nombre de su equipo deportivo preferido?\",\n \"QUESTION_19\": \"¿Cuál fue el oficio de su abuelo?\",\n \"RECOVER_ID\": \"Recuperar sus credenciales\",\n \"REVOCATION_WITH_FILE\": \"Revocar una identidad a partir de un fichero\",\n \"REVOCATION_WITH_FILE_DESCRIPTION\": \"Si ha perdido de forma permanente las credenciales de su cuenta miembro (o la seguridad de la cuenta se ve comprometida), puede usar <b>el archivo de revocación de la cuenta</b> para forzar la salida de la Red de Confianza.\",\n \"REVOCATION_WITH_FILE_HELP\": \"Para <b>revocar permanentemente</b> una cuenta miembro, arrastre el archivo de revocación en el cuadro siguiente o haga clic en el cuadro para seleccionar un archivo.\",\n \"REVOCATION_FILENAME\": \"revocacion-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt\",\n \"REVOCATION_WALLET\": \"Revocar esta identidad\",\n \"SAVE_ID\": \"Guardar mis credenciales\",\n \"STRONG_LEVEL\": \"Alto <span class=\\\"hidden-xs \\\">(6 preguntas min.)</span>\",\n \"TITLE\": \"Cuenta y seguridad\",\n \"RECOVER_ID_HELP\": \"Si dispone de un <b>archivo de recuperación de sus credenciales</b>, las puede reobtener respondiendo correctamente a las preguntas personales elegidas en su momento.\",\n \"REVOCATION_WALLET_HELP\": \"Pedir la revocación de vuestra identidad comporta la <b>salida de la red de confianza</b> (definitiva para el seudónimo y la llave pública asociada). La cuenta no producirá ya más el Dividendo Universal.<br/>Podrá seguir usándola como monedero simple.\",\n \"SAVE_ID_HELP\": \"Creación de un archivo de recuperación, para <b>reobtener su contraseña</b> (e identificador secreto) en caso de olvido. El archivo se <b>cifra</b> con ayuda de las preguntas personales elegidas.\"\n },\n \"FILE_NAME\": \"{{currency}}_HistorialDeCuenta_{{pubkey|formatPubkey}}_{{currentTime|formatDateForFile}}.csv\",\n \"HEADERS\": {\n \"TIME\": \"Fecha\",\n \"AMOUNT\": \"Cantidad\",\n \"COMMENT\": \"Comentario\"\n }\n },\n \"TRANSFER\": {\n \"TITLE\": \"Transferencia\",\n \"SUB_TITLE\": \"Hacer una transferencia\",\n \"FROM\": \"De\",\n \"TO\": \"A\",\n \"AMOUNT\": \"Importe\",\n \"AMOUNT_HELP\": \"Importe\",\n \"COMMENT\": \"Comentario\",\n \"COMMENT_HELP\": \"Comentario\",\n \"BTN_SEND\": \"Enviar\",\n \"BTN_ADD_COMMENT\": \"Añadir un comentario\",\n \"REST\": \"Resto de cuenta\",\n \"REST_TO\": \"a\",\n \"WARN_COMMENT_IS_PUBLIC\": \"Tenga en cuenta que los <b>comentarios son públicos</b> (sin encriptar).\",\n \"MODAL\": {\n \"TITLE\": \"Transferencia\"\n }\n },\n \"ERROR\": {\n \"ADD_SECONDARY_WALLET_FAILED\": \"Error añadiendo el monedero secundario.\",\n \"COULD_NOT_ADD_EXISTING_WALLET\": \"Monedero ya existe en la lista.\",\n \"COULD_NOT_ADD_MAIN_WALLET\": \"Este monedero <b>corresponde a la cuenta principal</b> con la que se conecta.<br/>Imposible añadirlo como monedero secundario.\",\n \"ISSUE_524_TX_FAILED\": \"Error en la transferencia.<br/><br/>Un mensaje ha sido enviado a los/as desarrolladores/as para facilitar la resolución del problema. <b>Gracias por su ayuda</b>.\",\n \"LOAD_WALLET_LIST_FAILED\": \"Error cargando los monederos secundarios.\",\n \"ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"Usted debe <b>ser miembro (o haber sido miembro)</b> para poder efectuar esta acción.\",\n \"RESTORE_WALLET_LIST_FAILED\": \"Error en la restauración de los monederos secundarios.\",\n \"SAVE_WALLET_LIST_FAILED\": \"Error al guardar los monederos secundarios.\",\n \"UNKNOWN_WALLET_ID\": \"Monedero secundario desconocido.\",\n \"UPDATE_WALLET_LIST_FAILED\": \"Error en la actualización de los monederos secundarios.\",\n \"UNKNOWN_URI_FORMAT\": \"Formato URI desconocido\",\n \"PUBKEY_INVALID_CHECKSUM\": \"Llave pública no válida (suma de comprobación incorrecta).\",\n \"POPUP_TITLE\": \"Error\",\n \"UNKNOWN_ERROR\": \"Error desconocido\",\n \"CRYPTO_UNKNOWN_ERROR\": \"Su navegador parece incompatible con las funcionalidades de cryptografía.\",\n \"DOWNLOAD_KEYFILE_FAILED\": \"Error al generar el archivo de llaves.\",\n \"EQUALS_TO_PSEUDO\": \"Debe ser diferente del seudónimo.\",\n \"EQUALS_TO_SALT\": \"Debe ser diferente del identificador secreto.\",\n \"FIELD_REQUIRED\": \"Campo obligatorio.\",\n \"FIELD_TOO_SHORT\": \"Valor demasiado corta.\",\n \"FIELD_TOO_SHORT_WITH_LENGTH\": \"Valor demasiado corta ({{minLength}} carácteres mín)\",\n \"FIELD_TOO_LONG\": \"Valor demasiado largo\",\n \"FIELD_TOO_LONG_WITH_LENGTH\": \"Valor demasiado largo, ({{maxLength}} carácteres máx)\",\n \"FIELD_MIN\": \"Valor mínimo: {{min}}\",\n \"FIELD_MAX\": \"Valor máximo: {{max}}\",\n \"FIELD_ACCENT\": \"Caracteres acentuados y comas no autorizados\",\n \"FIELD_NOT_NUMBER\": \"Valor numérico esperado\",\n \"FIELD_NOT_INT\": \"Valor entero esperado\",\n \"FIELD_NOT_EMAIL\": \"Correo electrónico no válido\",\n \"PASSWORD_NOT_CONFIRMED\": \"No coincide con la contraseña anterior.\",\n \"SALT_NOT_CONFIRMED\": \"No corresponde al identificador secreto anterior.\",\n \"SEND_IDENTITY_FAILED\": \"Error de la inscripción.\",\n \"SEND_CERTIFICATION_FAILED\": \"Error de la certificación.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY\": \"No se puede certificar, porque su cuenta no <b>es miembro</b>.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF\": \"No se puede certificar, porque su cuenta todavía no es miembro.<br/><br/>Todavía faltan certificaciones para serlo.\",\n \"IDENTITY_TO_CERTIFY_HAS_NO_SELF\": \"Esta cuenta no se pudo certificar. No se ha solicitado la membresía, o se necesita renovarla.\",\n \"LOGIN_FAILED\": \"Error durante la autentificación.\",\n \"LOAD_IDENTITY_FAILED\": \"Error de carga de la identidad.\",\n \"LOAD_REQUIREMENTS_FAILED\": \"Error de carga de las condiciones de la identidad.\",\n \"SEND_MEMBERSHIP_IN_FAILED\": \"Error en el intento de entrada en la comunidad.\",\n \"SEND_MEMBERSHIP_OUT_FAILED\": \"Error en la interrupción de adhesión.\",\n \"REFRESH_WALLET_DATA\": \"Error en la actualización del monedero.\",\n \"GET_CURRENCY_PARAMETER\": \"Error en la recuperación de las reglas de moneda.\",\n \"GET_CURRENCY_FAILED\": \"Carga de la moneda imposible. Por favor, intente más tarde.\",\n \"SEND_TX_FAILED\": \"Error en la transferencia.\",\n \"ALL_SOURCES_USED\": \"Por favor, espera el cálculo del bloque siguiente (Todas sus fuentes de moneda fueron utilizada).\",\n \"NOT_ENOUGH_SOURCES\": \"No lo bastante cambio para mandar este importe en una sola transacción.<br/>Importe máximo: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.\",\n \"ACCOUNT_CREATION_FAILED\": \"Error en la creación de la cuenta miembro.\",\n \"RESTORE_WALLET_DATA_ERROR\": \"Error en la recarga de los ajustes desde el almacenamiento local\",\n \"LOAD_WALLET_DATA_ERROR\": \"Error en la carga de los datos del monedero.\",\n \"COPY_CLIPBOARD_FAILED\": \"Copia de la valor imposible.\",\n \"TAKE_PICTURE_FAILED\": \"Error en la recuperación de la foto.\",\n \"SCAN_FAILED\": \"Error en el escán del Codigo QR\",\n \"SCAN_UNKNOWN_FORMAT\": \"Codigo no reconocido.\",\n \"WOT_LOOKUP_FAILED\": \"Error en la búsqueda\",\n \"LOAD_PEER_DATA_FAILED\": \"Lectura del nodo Duniter imposible. Por favor, intente más tarde.\",\n \"NEED_LOGIN_FIRST\": \"Por favor, conéctese en primer lugar.\",\n \"AMOUNT_REQUIRED\": \"El importe es obligatorio.\",\n \"AMOUNT_NEGATIVE\": \"Importe negativo no autorizado.\",\n \"NOT_ENOUGH_CREDIT\": \"Crédito insuficiente.\",\n \"INVALID_NODE_SUMMARY\": \"Nodo ilocalizable o dirección inválida.\",\n \"INVALID_USER_ID\": \"El seudónimo no debe contener ni espacios ni caracteres especiales o acentuado.\",\n \"INVALID_COMMENT\": \"El campo 'referencia’ no debe contener carácteres acentuados.\",\n \"INVALID_PUBKEY\": \"La llave pública no tiene el formato esperado.\",\n \"INVALID_PUBKEY_CHECKSUM\": \"Suma de comprobación inválida.\",\n \"IDENTITY_REVOKED\": \"Esta identidad <b>fue revocada</b>. No puede volver a convertirla en miembro.\",\n \"IDENTITY_REVOKED_WITH_TIME\": \"Esta identidad <b>fue revocada {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). No puede volver a convertirla en miembro.\",\n \"IDENTITY_PENDING_REVOCATION\": \"La <b>revocación de esta identidad</b> fue solicitado y esta en espera de tratamiento. Por lo que, la certificación es desactivada.\",\n \"IDENTITY_INVALID_BLOCK_HASH\": \"Esta solicitud de adhesión no es valida (porque denomina un bloque los nodos de la red han anulado): esta persona debe renovelar su solicitud de adhesión <b>antes que</b> estar certificada.\",\n \"IDENTITY_EXPIRED\": \"La publicación de esta identidad ha caducada: esta persona debe realizar una nueva solicitud de adhesión <b>antes que</b> estar certificada.\",\n \"IDENTITY_SANDBOX_FULL\": \"EL nodo Duniter utilizado por Cesium ya no puede recibir más nuevas identidades, porque la fila de espera es llena.<br/><br/>Por favor, intenta ulteriormente o cambia de nodo (vía el menú <b>Ajustes</b>).\",\n \"IDENTITY_NOT_FOUND\": \"Identidad no encontrada\",\n \"IDENTITY_TX_FAILED\": \"Error cargando las transacciones de la identidad\",\n \"WOT_PENDING_INVALID_BLOCK_HASH\": \"Adhesión no validada.\",\n \"WALLET_INVALID_BLOCK_HASH\": \"Su solicitud de adhesión ya no está validada (porque denomina un bloque los nodos de la red han anulado).<br/>Debe <a ng-click=\\\"doQuickFix('fixMembership')\\\">mandar una nueva solicitud</a> para resolver este problema.\",\n \"WALLET_IDENTITY_EXPIRED\": \"La publicación de <b>su identidad ha caducada</b>.<br/>Debe <a ng-click=\\\"doQuickFix('fixIdentity')\\\">publicar une outra vez su identidad</a> para resolver este problema.\",\n \"WALLET_REVOKED\": \"Su identidad fue <b>revocada</b>: ni su seudónimo ni su llave pública podrán estar utilizados en el futuro por una cuenta miembro.\",\n \"WALLET_HAS_NO_SELF\": \"Su identidad debe en primer lugar haber estado publicado, y no estar caducada.\",\n \"AUTH_REQUIRED\": \"Autenticación requerida.\",\n \"AUTH_INVALID_PUBKEY\": \"La llave pública no se corresponde con la cuenta conectada\",\n \"AUTH_INVALID_SCRYPT\": \"De usuario o contraseña no válidos.\",\n \"AUTH_INVALID_FILE\": \"archivo de llave no válido.\",\n \"AUTH_FILE_ERROR\": \"No se pudo abrir el archivo de llave\",\n \"IDENTITY_ALREADY_CERTIFY\": \"Ha <b>ya certificado</b> esta identidad.<br/><br/>Esta certificación todavía es valida (expiration {{expiresIn|formatDurationTo}}).\",\n \"IDENTITY_ALREADY_CERTIFY_PENDING\": \"Ha <b>ya certificado</b> esta identidad.<br/><br/>Esta certificación está en espera de tratamiento (fecha límite de tratamiento {{expiresIn|formatDurationTo}}).\",\n \"UNABLE_TO_CERTIFY_TITLE\": \"Certificación imposible\",\n \"LOAD_NEWCOMERS_FAILED\": \"No se pudo cargar las nuevas membresías.\",\n \"LOAD_PENDING_FAILED\": \"No se pudo cargar las inscripciones pendientes.\",\n \"ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"Debe <b>ser miembro</b> para poder realizar esta acción.\",\n \"ONLY_SELF_CAN_EXECUTE_THIS_ACTION\": \"Debe haber <b>publicado su identidad</b> para poder realizar esta acción.\",\n \"GET_BLOCK_FAILED\": \"Error en la recuperación del bloque\",\n \"INVALID_BLOCK_HASH\": \"Bloque no encontrado (hash diferente)\",\n \"DOWNLOAD_REVOCATION_FAILED\": \"Debe seleccionar un fichero de texto\",\n \"REVOCATION_FAILED\": \"Error en la revocación.\",\n \"SALT_OR_PASSWORD_NOT_CONFIRMED\": \"Identificador secreto o contraseña incorrectos\",\n \"RECOVER_ID_FAILED\": \"Error en la recuperación de las credenciales\",\n \"LOAD_FILE_FAILED\": \"Error en la carga del archivo\",\n \"NOT_VALID_REVOCATION_FILE\": \"Archivo de revocación no válido (formato de archivo erróneo)\",\n \"NOT_VALID_SAVE_ID_FILE\": \"Archivo no válido (formato de archivo erróneo)\",\n \"NOT_VALID_KEY_FILE\": \"Archivo no válido (formato de archivo erróneo)\",\n \"EXISTING_ACCOUNT\": \"Sus credenciales corresponden a una cuenta existente, la <a ng-click=\\\"showHelpModal('pubkey')\\\">llave pública</a> es:\",\n \"EXISTING_ACCOUNT_REQUEST\": \"Por favor, cambie sus credenciales para que coincida con una cuenta sin usar.\",\n \"GET_LICENSE_FILE_FAILED\": \"Error al obtener el archivo de licencia\",\n \"CHECK_NETWORK_CONNECTION\": \"No se puede conectar a ningún nodo.<br/><br/><b>Compruebe la conexión a Internet</b>.\",\n \"INVALID_FILE_FORMAT\": \"Formato de archivo inválido.\",\n \"SAME_TX_RECIPIENT\": \"El destinatario debe ser diferente del emisor.\"\n },\n \"INFO\": {\n \"POPUP_TITLE\": \"Información\",\n \"CERTIFICATION_DONE\": \"Certificación enviada\",\n \"NOT_ENOUGH_CREDIT\": \"Crédito insuficiente\",\n \"TRANSFER_SENT\": \"Transferencia enviada\",\n \"COPY_TO_CLIPBOARD_DONE\": \"Copia realizada\",\n \"MEMBERSHIP_OUT_SENT\": \"Anulación enviada\",\n \"NOT_NEED_MEMBERSHIP\": \"Ya es miembro.\",\n \"IDENTITY_WILL_MISSING_CERTIFICATIONS\": \"Esta identidad pronto va a necesitar certificaciones (al menos {{willNeedCertificationCount}}).\",\n \"IDENTITY_NEED_MEMBERSHIP\": \"Esta identidad no envió una solicitud de membresía. Ella tendrá que hacerlo si desea hacerse miembro.\",\n \"HAS_ALTERNATIVE_IDENTITIES\": \"Hay <b>identidades múltiples</b> adjuntas a esta llave pública. <b>Antes de cualquier certificación</b>, <a ng-click=\\\"doQuickFix('showSelectIdentities')\\\">verifique otras identidades</a> para elegir la correcta o comuníquese con el propietario de la cuenta.\",\n \"REVOCATION_SENT\": \"Revocación enviada\",\n \"REVOCATION_SENT_WAITING_PROCESS\": \"La <b>revocación de esta identidad</b> fue solicitada y está en espera de ser procesada.\",\n \"FEATURES_NOT_IMPLEMENTED\": \"Esta funcionalidad todavía está en proceso de desarrollo.<br/><br/>¿Por qué no <b>contribuir a Cesium</b>, para obtenerla más rápido? ;)\",\n \"EMPTY_TX_HISTORY\": \"Ninguna operación a exportar\"\n },\n \"CONFIRM\": {\n \"POPUP_TITLE\": \"<b>Confirmación</b>\",\n \"POPUP_WARNING_TITLE\": \"<b>Advertencia</b>\",\n \"POPUP_SECURITY_WARNING_TITLE\": \"<i class=\\\"icon ion-alert-circled\\\"></i> <b>Advertencia de seguridad</b>\",\n \"CERTIFY_RULES_TITLE_UID\": \"Certificar {{uid}}\",\n \"CERTIFY_RULES\": \"<b class=\\\"assertive\\\">NO CERTIFICAR</b> una cuenta si piensa que :<br/><br/><ul><li>1.) no corresponde a una persona <b>física y viva</b>.<li>2.) su propietario <b>posee otra cuenta</b> ya certificada.<li>3.) su propietario viola (voluntariamente o no) la regla 1 o 2 (por ejemplo certificando cuentas falsas o duplicadas).</ul><br/><b>¿Desea</b> todavía certificar esta identidad?\",\n \"FULLSCREEN\": \"¿ Mostrar la aplicación en pantalla completa ?\",\n \"EXIT_APP\": \"¿ Cerrar la aplicación ?\",\n \"TRANSFER\": \"<b>Resumen de la transferencia</b>:<br/><br/><ul><li> - De: {{from}}</li><li> - A: <b>{{to}}</b></li><li> - Importe: <b>{{amount}} {{unit}}</b></li><li> - Comentario: <i>{{comment}}</i></li></ul><br/><b>Desea realizar esta transferencia?</b>\",\n \"TRANSFER_ALL\": \"<b>Resumen de la transferencia</b>:<br/><br/><ul><li> - De: {{from}}</li><li> - A: <b>{{to}}</b></li><li> - Importe: <b>{{amount}} {{unit}}</b></li><li> - Comentario: <i>{{comment}}</i></li><br/><li> - Resto: <b>{{restAmount}} {{unit}}</b> para <b>{{restTo}}</b></li></ul><br/><b>¿Desea realizar esta transferencia?</b>\",\n \"MEMBERSHIP_OUT\": \"Esta operación es <b>irreversible</b>.<br/></br/>¿Desea <b>anular su cuenta miembro</b>?\",\n \"MEMBERSHIP_OUT_2\": \"¡Esta operación es <b>irreversible</b>!<br/><br/>¿Desea <b>anular su candidatura</b> como miembro?\",\n \"LOGIN_UNUSED_WALLET_TITLE\": \"¿Error de introducción de datos?\",\n \"LOGIN_UNUSED_WALLET\": \"Las credenciales introducidas corresponden a una cuenta que parece <b>inactiva</b>.<br/></br/><b>¿Quiere sin embargo continuar con esta cuenta?</b>\",\n \"FIX_IDENTITY\": \"El seudónimo <b>{{uid}}</b> va a ser publicado de nuevo, en reemplazo del antiguo que caducó.<br/></br/><b>¿Desea</b> continuar?\",\n \"FIX_MEMBERSHIP\": \"Su solicitud de adhesión como miembro va a ser enviada de nuevo.<br/></br/><b>¿Desea</b> continuar?\",\n \"MEMBERSHIP\": \"Se enviará su solicitud de membresía como miembro.<br/></br/><b>¿Desea</b> continuar?\",\n \"RENEW_MEMBERSHIP\": \"Su adhesión como miembro va a estar renovada.<br/></br/><b>¿Desea</b> continuar?\",\n \"REVOKE_IDENTITY\": \"Va a <b>revocar definitivamente esta identidad</b>.<br/><br/>La llave pública y el seudónimo asociados <b>jamás podrán ser utilizados</b> (para una cuenta miembro). <br/><br/><b>¿Desea</b> revocar definitivamente esta cuenta?\",\n \"REVOKE_IDENTITY_2\": \"¡Esta operación es <b>irreversible</b>!<br/><br/>¿Desea <b>revocar definitivamente</b> esta cuenta?\",\n \"NOT_NEED_RENEW_MEMBERSHIP\": \"Su membresía no necesita ser renovada actualmente (caducará en {{membershipExpiresIn|formatDuration}}).<br/></br/><b>¿Confirma</b> querer renovar su membresía?\",\n \"SAVE_BEFORE_LEAVE\": \"¿Desea <b>guardar sus cambios</b> antes de abandonar la página?\",\n \"SAVE_BEFORE_LEAVE_TITLE\": \"Cambios no registrados\",\n \"LOGOUT\": \"¿Desea desconectarse?\",\n \"USE_FALLBACK_NODE\": \"Nodo <b>{{old}}</b> inalcanzable o dirección inválida.<br/><br/>¿Desea utilizar temporalmente el nodo <b>{{new}}</b>?\",\n \"ISSUE_524_SEND_LOG\": \"La transacción ha sido rechazada a causa de una anomalía conocida (ticket #524) pero todavía <b>no replicable</b>.<br/><br/>Para ayudar a los/as desarrolladores/as a corregir este error, ¿ <b>acepta el envío de los logs(trazas del programa)</b> ?<br/><small>(ningún dato confidencia será enviado)</small>.\"\n },\n \"MODE\": {\n \"DEMO\": {\n \"BADGE\": \"Demo\",\n \"MODE\": \"Modo de demostración\",\n \"FEATURE_NOT_AVAILABLE\": \"Funcionalidad <b>no disponible</b> en este sitio de demostración.\",\n \"MODE_HELP\": \"Cesium funciona en <b> modo de demostración </b>: la consulta está disponible, pero no se puede realizar ninguna operación.\",\n \"INSTALL_HELP\": \"Por <b>razones de seguridad</b> recomendamos <b>instalar</b> su copia del software.<br/>Visite el sitio de Internet <a href='https://cesium.app'> www.cesium.app </a> para obtener ayuda.\"\n },\n \"READONLY\": {\n \"BADGE\": \"Monit\",\n \"MODE\": \"Modo de supervisión\",\n \"MODE_HELP\": \"Cesium funciona en <b> modo de supervisión </b>: solo están disponibles las funciones de monitoreo de divisas.\",\n \"INSTALL_HELP\": \"Si desea <b>crear una cuenta</b> para enviar o recibir dinero, le recomendamos <b>instalar</b> su copia del software.<br/>Visite el sitio de Internet <a href='https://cesium.app'> www.cesium.app </a> para obtener ayuda.\"\n }\n },\n \"DOWNLOAD\": {\n \"POPUP_TITLE\": \"<b>Revocación del archivo</b>\",\n \"POPUP_REVOKE_MESSAGE\": \"Para proteger su cuenta, descargue el <b>documento de revocación de cuenta</b>. Le permitirá cancelar su cuenta (en caso de robo, cambio de identificador, cuenta creada incorrectamente, etc.).<br/><br/><b>Por favor, almacénelo en un lugar seguro.</b>\"\n },\n \"HELP\": {\n \"TITLE\": \"Ayuda en línea\",\n \"JOIN\": {\n \"SECTION\": \"Inscripción\",\n \"SALT\": \"El identificador secreto es muy importante. Sirve para mezclar(<span class=\\\"text-italic\\\">hash</span>) la contraseña, antes de calcular la <span class=\\\"text-italic\\\">llave pública</span> (el número de cuenta) y la <span class=\\\"text-italic\\\">llave privada</span> para acceder a esta.<br/><b>Por favor, memorícelo muy bien</b> porque no existe ninguna forma de recuperarlo en caso de pérdida.<br/>No puede ser modificado. Deberá crear una nueva cuenta si lo pierde o se olvida.<br/><br/>Un buen identificador secreto debe ser suficientemente largo (al menos 8 carácteres) y lo más original posible.\",\n \"PASSWORD\": \"La contraseña es muy importante. Junto al identificador secreto, sirve para calcular la llave pública (el número de cuenta), y la llave privada para acceder a ella.<br/><b>Por favor, memorícela muy bien</b> porque no existe ninguna forma de recuperarla en caso de pérdida (excepto si se tuviese un fichero de respaldo o <span class=\\\"text-italic\\\">backup</span>.).<br/>No puede ser modificada. Deberá crear una nueva cuenta si la pierde o se olvida.<br/><br/>Una buena contraseña contiene al menos 8 carácteres, con al menos una mayúscula y un dígito.\",\n \"PSEUDO\": \"El seudónimo se utiliza solamente en caso de inscripción como <span class=\\\"text-italic\\\">miembro</span>. Siempre está asociado a un monedero (vía su <span class=\\\"text-italic\\\">llave pública</span>).<br/>Este se publica en la red para que los demás usuarios puedan identificar, certificar o enviar dinero a la cuenta.<br/>Un seudónimo debe ser único para cada miembro (actuales y antiguos).\"\n },\n \"LOGIN\": {\n \"SECTION\": \"Autenticación\",\n \"PUBKEY\": \"Llave pública\",\n \"PUBKEY_DEF\": \"La llave pública del archivo de llaves es generada de las credenciales introducidas (cualquiera que sean), sin estar obligatoriamente vinculadas o contrastadas con ninguna cuenta ya usada. <br/><b>Asegúrese por lo tanto de que la llave pública es la misma con la que se creó originalmente su cuenta</b>. De lo contrario, se autogenerará una cuenta vacía que probablemente nunca ha sido usada, ya que el riesgo de coincidir con las credenciales de otra cuenta ajena es muy pequeño.<br/><a href=\\\"https://es.wikipedia.org/wiki/Criptograf%C3%ADa_de_curva_el%C3%ADptica\\\" target=\\\"_ system\\\">Conozca más sobre criptografía</a> con llaves públicas.\",\n \"METHOD\": \"Métodos de autenticación\",\n \"METHOD_DEF\": \"Diversas opciones están disponibles para conectar a las cuentas: <br/> - La conexión <b>con aleatoriedad (estándar o avanzada)</b> mezcla su contraseña con su identificador secreto, para limitar los intentos de ataque<br/> - La conexión <b>usando llave pública</b> le permite entrar sin credenciales, las cuales solo se le pedirán cuando alguna operación lo necesite.<br/> - La conexión <b>usando archivo de llaves</b> leerá las llave pública y privada de la cuenta desde un archivo sin necesitar sus credenciales. Varios formatos son posibles.\"\n },\n \"GLOSSARY\": {\n \"SECTION\": \"Glosario\",\n \"PUBKEY_DEF\": \"Una llave pública identifica un monedero, que puede estar asociado a un miembro o ser un monedero anónimo. En Cesium se calcula a partir del identificador secreto y la contraseña.\",\n \"MEMBER\": \"Miembro\",\n \"MEMBER_DEF\": \"Cada miembro es una persona humana física y viva, deseosa de participar libremente en la comunidad monetaria. Percibe un dividendo universal, de acuerdo a un periodo e importe definido en las <span class=\\\"text-italic\\\">reglas de la moneda</span>\",\n \"CURRENCY_RULES\": \"Reglas de la moneda\",\n \"CURRENCY_RULES_DEF\": \"Las reglas de la moneda se han definido una vez y para siempre. Establecen el funcionamiento de la moneda: el cálculo del dividendo universal, la cantidad de certificaciones necesarias para ser miembro, la cantidad máxima de certificaciones que cada miembro puede emitir, etc. <a href=\\\"#/app/currency\\\">Ver las reglas actuales</a>.<br/> Sus parámetros no pueden alterarse gracias a una <span class=\\\"text-italic\\\">Cadena de Bloques</span> que soporta, implementa y verifica la buena aplicación de estas reglas.\",\n \"BLOCKCHAIN\": \"Cadena de bloques (<span class=\\\"text-italic\\\">Blockchain</span>)\",\n \"BLOCKCHAIN_DEF\": \"La cadena de bloques es un sistema descentralizado, que en el caso de Duniter, sirve para mantener e implementar las <span class=\\\"text-italic\\\">reglas de la moneda</span>.<br/><a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Más información</a> acerca de Duniter y el funcionamiento de su cadena de bloques.\",\n \"UNIVERSAL_DIVIDEND_DEF\": \"El Dividendo Universal (DU) es la cantidad de moneda co-creada por cada miembro, dependiendo del periodo y del cálculo definidos en las <span class=\\\"text-italic\\\">reglas de la moneda</span>.<br/>En cada periodo, los miembros reciben en sus cuentas la misma cantidad de moneda.<br/><br/>El DU crece regularmente, para ser justo entre cada miembro (actualmente y en el futuro), y calculado en función de la esperanza de vida media, como se demuestra en la <span class=\\\"text-italic\\\">Teoría Relativa de la Moneda</span> (TRM, de Stéphane Laborde).<br/><a href=\\\"http://trm.creationmonetaire.info\\\">Más información</a> sobre la TRM y las monedas libres.\",\n \"WOT\": \"Red de Confianza (RdC)\",\n \"WOT_DEF\": \"La Red de Confianza se compone del conjunto de miembros de la moneda, y de los enlaces de certificaciones que los conectan.\",\n \"DISTANCE_RULE\": \"Regla de distancia\",\n \"DISTANCE_RULE_DEF\": \"La regle de distancia de la Red de Confianza define <b>una distancia máxima a respetar</b> entre una candidatura y número mínimo miembros referentes (aquellos más conectados). Esta distancia es calculada utilizando los enlaces de certificación.\"\n },\n \"TIP\": {\n \"MENU_BTN_CURRENCY\": \"El menú <b>{{'MENU.CURRENCY'|translate}}</b> permite consultar las <b>reglas de la moneda</b> y su estado.\",\n \"CURRENCY_WOT\": \"El <b>número de miembros</b> muestra el peso de la comunidad y permite <b>seguir su evolución</b>.\",\n \"CURRENCY_MASS\": \"Siga aquí la <b>cantidad total de moneda</b> existente y su <b>distribución media</b> por miembro.<br/><br/>Esto permite juzgar la <b>relevancia de un importe</b>, en relación con lo que <b>poseen los demás</b> en sus cuentas (de media).\",\n \"CURRENCY_UNIT_RELATIVE\": \"La unidad utilizada (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) significa que los importes en {{currency|capitalize}} han sido divididos entre el valor del <b>Dividendo Universal</b> (DU).<br/><br/><small> Esta unidad relativa es <b>pertinente</b>, porque permanece estable, independiente de la cantidad de moneda que aumenta constantemente.</small>\",\n \"CURRENCY_CHANGE_UNIT\": \"Este botón permite <b>cambiar la unidad</b>, para visualizar los importes <b>directamente en {{currency|capitalize}}</b> (en lugar de “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”).\",\n \"CURRENCY_CHANGE_UNIT_TO_RELATIVE\": \"Este botón permite <b>cambiar la unidad</b>, para visualizar los importes en “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”, es decir, relativo al Dividendo Universal (el monto co-producido por cada miembro).\",\n \"CURRENCY_RULES\": \"Las <b>reglas</b> de la moneda fijan su funcionamiento <b>exacto y previsible</b>.<br/><br/>Es el propio ADN de la moneda, que hace que su código monetario sea <b>legible y transparente</b>.\",\n \"MENU_BTN_NETWORK\": \"El menú <b>{{'MENU.NETWORK'|translate}}</b> permite consultar el estado de la red.\",\n \"NETWORK_BLOCKCHAIN\": \"Todas las transacciones de la moneda están registradas dentro de un gran libro de contabilidad <b>público e infalsificable</b>, conocido como la <b>cadena de bloques</b> (<em>BlockChain</em> en inglés).\",\n \"NETWORK_PEERS\": \"Los <b>nodos</b> visibles aquí corresponden a los <b>dispositivos de miembros que actualizan y validan</b> la cadena de bloques.<br/><br/>Cuanto más nodos haya conectados, la moneda tendrá una gestión más <b>descentralizada</b> y digna de confianza.\",\n \"NETWORK_PEERS_BLOCK_NUMBER\": \"Este <b>número</b> (en verde) indica el <b>último bloque validado</b> por este nodo (última página escrita en la cadena de bloques).<br/><br/>El color verde indica que este bloque ha sido también validado por <b>la mayoría del resto de nodos</b>.\",\n \"NETWORK_PEERS_PARTICIPATE\": \"<b>Cada miembro</b>, equipado de un dispositivo conectado a Internet, <b>puede contribuir añadiendo un nodo</b>. Necesita <b>instalar el programa Duniter</b> (libre y gratuito). <a href=\\\"{{installDocUrl}}\\\" target=\\\"_system\\\">Ver manual de uso >></a>.\",\n \"MENU_BTN_ACCOUNT\": \"<b>{{'ACCOUNT.TITLE'|translate}}</b> permite acceder a la gestión y al historial de su cuenta.\",\n \"MENU_BTN_ACCOUNT_MEMBER\": \"Consulte aquí el estado de su cuenta y la información sobre sus certificaciones.\",\n \"WALLET_CERTIFICATIONS\": \"Haga clic aquí para consultar el detalle de sus certificaciones (recibidas y emitidas).\",\n \"WALLET_RECEIVED_CERTIFICATIONS\": \"Haga clic aquí para consultar el detalle de sus <b>certificaciones recibidas</b>.\",\n \"WALLET_GIVEN_CERTIFICATIONS\": \"Haga clic aquí para consultar el detalle de sus <b>certificaciones emitidas</b>.\",\n \"WALLET_BALANCE\": \"El <b>saldo</b> de su cuenta se visualiza aquí.\",\n \"WALLET_BALANCE_RELATIVE\":\n \"{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>La unidad utilizada (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) significa que el importe en {{currency|capitalize}} fue dividido entre el <b>Dividendo Universal</b> (DU) co-producido por cada miembro.<br/><br/>Actualmente un DU vale {{currentUD|formatInteger}} {{currency|capitalize}}s.\",\n \"WALLET_BALANCE_CHANGE_UNIT\": \"Podrá <b>cambiar la unidad</b> de visualización de los importes en los <b><i class=\\\"icon ion-android-settings\\\"></i> {{'MENU.SETTINGS'|translate}}</b>.<br/><br/>Por ejemplo, para visualizar los importes <b>directamente en {{currency|capitalize}}</b>, en lugar de unidad relativa.\",\n \"WALLET_PUBKEY\": \"Esta es la llave pública de su cuenta. Puede comunicarla a un tercero para que pueda identificar su cuenta de forma simple.\",\n \"WALLET_SEND\": \"Realizar un pago en algunos clics\",\n \"WALLET_SEND_NO_MONEY\": \"Realizar un pago en algunos clics.<br/>(Su saldo ya no lo permite)\",\n \"WALLET_OPTIONS\": \"Este botón permite acceder a las <b>acciones de adhesión</b> y de seguridad.<br/><br/>¡No olvide echar un vistazo!\",\n \"WALLET_RECEIVED_CERTS\": \"Se exhibirá aquí la lista de las personas que le han certificado.\",\n \"WALLET_CERTIFY\": \"El botón <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> permite seleccionar una identidad y certificarla.<br/><br/>Solo quienes son <b>miembros</b> pueden certificar a otras personas.\",\n \"WALLET_CERT_STOCK\": \"Su stock de certificaciones (emitidas) es limitado a <b>{{sigStock}} certificaciones</b>.<br/><br/>Este stock se renueva con el tiempo, a medida que las certificaciones caducan.\",\n \"MENU_BTN_TX\": \"El menú <b>{{'MENU.TRANSACTIONS'|translate}}</b> permite consultar su saldo, el historial de transacciones y realizar nuevos pagos.\",\n \"MENU_BTN_WALLETS\": \"El menú <b>{{'MENU.WALLETS'|translate}}</b> permite añadir monederos complementarios que usted maneja.\",\n \"MENU_BTN_WOT\": \"El menú <b>{{'MENU.WOT'|translate}}</b> permite buscar <b>usuarios</b> de la moneda (miembro o no).\",\n \"WOT_SEARCH_TEXT_XS\": \"Para buscar en el directorio, escriba las <b>primeras letras de un seudónimo</b> (o de una llave pública).<br/><br/>La búsqueda se iniciará automáticamente.\",\n \"WOT_SEARCH_TEXT\": \"Para buscar en el directorio, escriba las <b>primeras letras de un seudónimo</b> (o de una llave pública). <br/><br/>Luego, pulse en la tecla <b>Intro</b> para iniciar la búsqueda.\",\n \"WOT_SEARCH_RESULT\": \"Visualice la ficha detallada <b>haciendo clic</b> sobre una fila.\",\n \"WOT_VIEW_CERTIFICATIONS\": \"La opción <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> muestra qué miembros han validado esta identidad.<br/><br/>Estas certificaciones atestiguan que la cuenta pertenece a <b>una persona humana viva</b> y que no posee <b>ninguna otra cuenta miembro</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_COUNT\": \"Necesita al menos <b>{{sigQty}} certificaciones</b> para ser miembro y recibir el <b>Dividendo Universal</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_CLICK\": \"Un clic aquí permite abrir <b>la lista de todas las certificaciones</b> de la identidad (recibidas y emitidas).\",\n \"WOT_VIEW_CERTIFY\": \"El botón <b>{{'WOT.BTN_CERTIFY'|translate}}</b> permite añadir su certificación a esta identidad.\",\n \"CERTIFY_RULES\": \"<b>Atención:</b> Certifique solamente <b>personas físicas vivas</b>, que no posean ya ninguna otra cuenta miembro.<br/><br/>¡La seguridad de la red de la moneda depende del cuidado de cada persona!\",\n \"MENU_BTN_SETTINGS\": \"En <b>{{'MENU.SETTINGS'|translate}}</b> podrá configurar la aplicación.\",\n \"HEADER_BAR_BTN_PROFILE\": \"Haga clic aquí para acceder a su <b>perfil</b>\",\n \"SETTINGS_CHANGE_UNIT\": \"Podrá <b>cambiar la unidad de visualización</b> de los importes haciendo clic aquí.<br/><br/>- Desactive la opción para mostrar los importes en {{currency|capitalize}}.<br/>- Actívela para importes relativos al {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (las cantidades de los importes se mostrarán <b>divididos</b> entre el Dividendo Universal actual).\",\n \"END_LOGIN\": \"La visita guiada ha <b>terminado</b>.<br/><br/>¡Buena suerte en este nuevo mundo de la <b>economía libre</b> !\",\n \"END_NOT_LOGIN\": \"La visita guiada ha <b>terminado</b>.<br/><br/>Si quiere utilizar la moneda {{currency|capitalize}}, tiene que hacer un clic en <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> más abajo.\",\n \"END_READONLY\": \"La visita guiada ha <b>terminado</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}.\"\n }\n }\n}\n);\n\n$translateProvider.translations(\"fr-FR\", {\n \"COMMON\": {\n \"APP_NAME\": \"Cesium\",\n \"APP_VERSION\": \"v{{version}}\",\n \"APP_BUILD\": \"date : {{build}}\",\n \"PUBKEY\": \"Clé publique\",\n \"MEMBER\": \"Membre\",\n \"BLOCK\" : \"Bloc\",\n \"BTN_OK\": \"OK\",\n \"BTN_YES\": \"Oui\",\n \"BTN_NO\": \"Non\",\n \"BTN_SEND\": \"Envoyer\",\n \"BTN_SEND_MONEY\": \"Faire un virement\",\n \"BTN_SEND_MONEY_SHORT\": \"Virement\",\n \"BTN_SAVE\": \"Enregistrer\",\n \"BTN_YES_SAVE\": \"Oui, Enregistrer\",\n \"BTN_YES_CONTINUE\": \"Oui, Continuer\",\n \"BTN_SHOW\": \"Voir\",\n \"BTN_SHOW_PUBKEY\": \"Afficher la clé publique\",\n \"BTN_RELATIVE_UNIT\": \"Afficher les montants en DU ?\",\n \"BTN_BACK\": \"Retour\",\n \"BTN_NEXT\": \"Suivant\",\n \"BTN_IMPORT\": \"Importer\",\n \"BTN_CANCEL\": \"Annuler\",\n \"BTN_CLOSE\": \"Fermer\",\n \"BTN_LATER\": \"Plus tard\",\n \"BTN_LOGIN\": \"Se connecter\",\n \"BTN_LOGOUT\": \"Déconnexion\",\n \"BTN_ADD_ACCOUNT\": \"Nouveau compte\",\n \"BTN_SHARE\": \"Partager\",\n \"BTN_EDIT\": \"Modifier\",\n \"BTN_DELETE\": \"Supprimer\",\n \"BTN_ADD\": \"Ajouter\",\n \"BTN_SEARCH\": \"Rechercher\",\n \"BTN_REFRESH\": \"Actualiser\",\n \"BTN_RETRY\": \"Recommencer\",\n \"BTN_START\": \"Commencer\",\n \"BTN_CONTINUE\": \"Continuer\",\n \"BTN_CREATE\": \"Créer\",\n \"BTN_UNDERSTOOD\": \"J'ai compris\",\n \"BTN_OPTIONS\": \"Options\",\n \"BTN_HELP_TOUR\": \"Visite guidée\",\n \"BTN_HELP_TOUR_SCREEN\": \"Découvrir cet écran\",\n \"BTN_DOWNLOAD\": \"Télécharger\",\n \"BTN_DOWNLOAD_ACCOUNT_STATEMENT\": \"Télécharger le relevé du compte\",\n \"BTN_MODIFY\": \"Modifier\",\n \"CHOOSE_FILE\": \"Déposez votre fichier <br/>ou cliquez pour le sélectionner\",\n \"DAYS\": \"jours\",\n \"NO_ACCOUNT_QUESTION\": \"Pas encore de compte ? Créez-en un gratuitement !\",\n \"SEARCH_NO_RESULT\": \"Aucun résultat trouvé\",\n \"LOADING\": \"Veuillez patienter...\",\n \"LOADING_WAIT\": \"Veuillez patienter...<br/><small>(Cesium interroge le nœud Duniter)</small>\",\n \"SEARCHING\": \"Recherche en cours...\",\n \"FROM\": \"De\",\n \"TO\": \"À\",\n \"COPY\": \"Copier\",\n \"LANGUAGE\": \"Langue\",\n \"UNIVERSAL_DIVIDEND\": \"Dividende universel\",\n \"UD\": \"DU\",\n \"DATE_PATTERN\": \"DD/MM/YY HH:mm\",\n \"DATE_FILE_PATTERN\": \"YYYY-MM-DD\",\n \"DATE_SHORT_PATTERN\": \"DD/MM/YY\",\n \"DATE_MONTH_YEAR_PATTERN\": \"MM/YYYY\",\n \"EMPTY_PARENTHESIS\": \"(vide)\",\n \"UID\": \"Pseudonyme\",\n \"ENABLE\": \"Activé\",\n \"DISABLE\": \"Désactivé\",\n \"RESULTS_LIST\": \"Résultats\",\n \"RESULTS_COUNT\": \"{{count}} résultats\",\n \"EXECUTION_TIME\": \"exécuté en {{duration|formatDurationMs}}\",\n \"SHOW_VALUES\": \"Afficher les valeurs en clair ?\",\n \"POPOVER_ACTIONS_TITLE\": \"Options\",\n \"POPOVER_FILTER_TITLE\": \"Filtres\",\n \"SHOW_MORE\": \"Afficher plus\",\n \"SHOW_MORE_COUNT\": \"(limite actuelle à {{limit}})\",\n \"POPOVER_SHARE\": {\n \"TITLE\": \"Partager\",\n \"SHARE_ON_TWITTER\": \"Partager sur Twitter\",\n \"SHARE_ON_FACEBOOK\": \"Partager sur Facebook\",\n \"SHARE_ON_DIASPORA\": \"Partager sur Diaspora*\",\n \"SHARE_ON_GOOGLEPLUS\": \"Partager sur Google+\"\n },\n \"FILE\": {\n \"DATE\": \"Date :\",\n \"TYPE\": \"Type :\",\n \"SIZE\": \"Taille :\",\n \"VALIDATING\": \"Validation en cours...\"\n }\n },\n \"SYSTEM\": {\n \"PICTURE_CHOOSE_TYPE\": \"Choisir la source :\",\n \"BTN_PICTURE_GALLERY\": \"Galerie\",\n \"BTN_PICTURE_CAMERA\": \"<b>Caméra</b>\"\n },\n \"MENU\": {\n \"HOME\": \"Accueil\",\n \"WOT\": \"Annuaire\",\n \"CURRENCY\": \"Monnaie\",\n \"ACCOUNT\": \"Mon compte\",\n \"WALLETS\": \"Mes portefeuilles\",\n \"SETTINGS\": \"Paramètres\",\n \"NETWORK\": \"Réseau\",\n \"TRANSACTIONS\": \"Mes opérations\"\n },\n \"ABOUT\": {\n \"TITLE\": \"À propos\",\n \"LICENSE\": \"Application <b>libre</b> (Licence GNU AGPLv3).\",\n \"LATEST_RELEASE\": \"Il existe une <b>version plus récente</b> de {{'COMMON.APP_NAME'|translate}} (<b>v{{version}}</b>)\",\n \"PLEASE_UPDATE\": \"Veuillez mettre à jour {{'COMMON.APP_NAME'|translate}} (dernière version : <b>v{{version}}</b>)\",\n \"CODE\": \"Code source :\",\n \"OFFICIAL_WEB_SITE\": \"Site web officiel :\",\n \"DEVELOPERS\": \"Développé par :\",\n \"FORUM\": \"Forum :\",\n \"PLEASE_REPORT_ISSUE\": \"N'hésitez pas à nous remonter les anomalies rencontrées\",\n \"REPORT_ISSUE\": \"Remonter un problème\",\n \"BTN_OPEN_DEV_WINDOW\": \"Ouvrir la fenêtre de debuggage\"\n },\n \"HOME\": {\n \"TITLE\": \"Cesium\",\n \"WELCOME\": \"Bienvenue dans l'application Cesium !\",\n \"WELCOME_READONLY\": \"Bienvenue dans Cesium <span class='badge badge-balanced'>Monit</span> !\",\n \"MESSAGE\": \"Recevez et envoyez de la monnaie libre {{currency|abbreviate}}\",\n \"MESSAGE_READONLY\": \"Suivez l'état de la monnaie libre {{currency|abbreviate}} en temps réel.\",\n \"BTN_CURRENCY\": \"Explorer la monnaie {{currency|abbreviate}}\",\n \"BTN_ABOUT\": \"à propos\",\n \"BTN_HELP\": \"Aide en ligne\",\n \"BTN_NETWORK\": \"État du réseau\",\n \"FREE_SOFTWARE\": \"Logiciel libre\",\n \"FORK_ME\": \"Cloner moi !\",\n \"SHOW_LICENSE\": \"Voir la license de l'application\",\n \"REPORT_ISSUE\": \"anomalie\",\n \"NOT_YOUR_ACCOUNT_QUESTION\" : \"Vous n'êtes pas propriétaire du compte <b class=\\\"ion-key\\\"> {{pubkey|formatPubkey}}</b> ?\",\n \"BTN_CHANGE_ACCOUNT\": \"Déconnecter ce compte\",\n \"CONNECTION_ERROR\": \"Nœud <b>{{server}}</b> injoignable ou adresse invalide.<br/><br/>Vérifiez votre connexion Internet, ou changer de nœud <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">dans les paramètres</a>.\",\n \"SHOW_ALL_FEED\": \"Voir tout\",\n \"READ_MORE\": \"Lire la suite\",\n \"FEED_SOURCE\": \"Source\"\n },\n \"SETTINGS\": {\n \"TITLE\": \"Paramètres\",\n \"DISPLAY_DIVIDER\": \"Affichage\",\n \"STORAGE_DIVIDER\": \"Stockage\",\n \"NETWORK_SETTINGS\": \"Réseau\",\n \"PEER\": \"Nœud Duniter\",\n \"PEER_SHORT\": \"Nœud Duniter\",\n \"PEER_CHANGED_TEMPORARY\": \"Adresse utilisée temporairement\",\n \"PERSIST_CACHE\": \"Conserver les données de navigation (expérimental)\",\n \"PERSIST_CACHE_HELP\": \"Permet une navigation plus rapide, en conservant localement les données reçues, pour les utiliser d'une session à l'autre.\",\n \"USE_LOCAL_STORAGE\": \"Activer le stockage local\",\n \"USE_LOCAL_STORAGE_HELP\": \"Permet de sauvegarder vos paramètres\",\n \"WALLETS_SETTINGS\": \"Mes portefeuilles\",\n \"USE_WALLETS_ENCRYPTION\": \"Sécuriser la liste ?\",\n \"USE_WALLETS_ENCRYPTION_HELP\": \"Permet de sécuriser la liste de vos portefeuilles (par chiffrement), en exigeant une authentification pour y accéder.\",\n \"ENABLE_HELPTIP\": \"Activer les bulles d'aide contextuelles\",\n \"DISABLE_HELPTIP\": \"Désactiver les bulles d'aide contextuelles\",\n \"ENABLE_UI_EFFECTS\": \"Activer les effets visuels\",\n \"HISTORY_SETTINGS\": \"Mes opérations\",\n \"DISPLAY_UD_HISTORY\": \"Afficher les dividendes produits ?\",\n \"TX_HISTORY_AUTO_REFRESH\": \"Rafraîchir automatiquement\",\n \"TX_HISTORY_AUTO_REFRESH_HELP\": \"Rafraîchit le solde et les opérations automatiquement, à chaque nouveau bloc du réseau.\",\n \"AUTHENTICATION_SETTINGS\": \"Authentification\",\n \"KEEP_AUTH\": \"Désauthentification automatique\",\n \"KEEP_AUTH_SHORT\": \"Désauthentification\",\n \"KEEP_AUTH_HELP\": \"Définit le moment où l'authentification est nettoyée de la mémoire.\",\n \"KEEP_AUTH_OPTION\": {\n \"NEVER\": \"Après chaque opération\",\n \"SECONDS\": \"Après {{value}}s d'inactivité\",\n \"MINUTE\": \"Après {{value}}min d'inactivité\",\n \"MINUTES\": \"Après {{value}}min d'inactivité\",\n \"HOUR\": \"Après {{value}}h d'inactivité\",\n \"ALWAYS\": \"A la fin de la session\"\n },\n \"KEYRING_FILE\": \"Fichier de trousseau\",\n \"KEYRING_FILE_HELP\": \"Permet de vous <b>connecter</b> automatiquement à chaque lancement<br/>et même de vous <b>authentifier</b> (seulement si \\\"Expiration de l'authentification\\\" est configurée \\\"à la fin de la session\\\").\",\n \"REMEMBER_ME\": \"Se souvenir de moi ?\",\n \"REMEMBER_ME_HELP\": \"Permet de rester identifié d'une session à l'autre, en conservant localement la clé publique.\",\n \"PLUGINS_SETTINGS\": \"Extensions\",\n \"BTN_RESET\": \"Restaurer les valeurs par défaut\",\n \"EXPERT_MODE\": \"Activer le mode expert\",\n \"EXPERT_MODE_HELP\": \"Permet un affichage plus détaillé.\",\n \"BLOCK_VALIDITY_WINDOW\": \"Délai d'incertitude des blocs\",\n \"BLOCK_VALIDITY_WINDOW_SHORT\": \"Délai d'incertitude\",\n \"BLOCK_VALIDITY_WINDOW_HELP\": \"Délai avant de considérer qu'une information est validée\",\n \"BLOCK_VALIDITY_OPTION\": {\n \"NONE\": \"Aucun délai\",\n \"N\": \"{{time | formatDuration}} ({{count}} blocs)\"\n },\n \"POPUP_PEER\": {\n \"TITLE\": \"Nœud Duniter\",\n \"HOST\": \"Adresse\",\n \"HOST_HELP\": \"Adresse : serveur:port\",\n \"USE_SSL\": \"Sécurisé ?\",\n \"USE_SSL_HELP\": \"(Chiffrement SSL)\",\n \"BTN_SHOW_LIST\": \"Liste des noeuds\"\n }\n },\n \"BLOCKCHAIN\": {\n \"HASH\": \"Hash : {{hash}}\",\n \"VIEW\": {\n \"HEADER_TITLE\": \"Bloc #{{number}}-{{hash|formatHash}}\",\n \"TITLE_CURRENT\": \"Bloc courant\",\n \"TITLE\": \"Bloc #{{number|formatInteger}}\",\n \"COMPUTED_BY\": \"Calculé par le noeud de\",\n \"SHOW_RAW\": \"Voir le fichier brut\",\n \"TECHNICAL_DIVIDER\": \"Informations techniques\",\n \"VERSION\": \"Version du format\",\n \"HASH\": \"Hash calculé\",\n \"UNIVERSAL_DIVIDEND_HELP\": \"Monnaie co-produite par chacun des {{membersCount}} membres\",\n \"EMPTY\": \"Aucune donnée dans ce bloc\",\n \"POW_MIN\": \"Difficulté minimale\",\n \"POW_MIN_HELP\": \"Difficulté imposée pour le calcul du hash\",\n \"DATA_DIVIDER\": \"Données\",\n \"IDENTITIES_COUNT\": \"Nouvelles identités\",\n \"JOINERS_COUNT\": \"Nouveaux membres\",\n \"ACTIVES_COUNT\": \"Renouvellements\",\n \"ACTIVES_COUNT_HELP\": \"Membres ayant renouvelé leur adhésion\",\n \"LEAVERS_COUNT\": \"Membres sortants\",\n \"LEAVERS_COUNT_HELP\": \"Membres ne souhaitant plus de certification\",\n \"EXCLUDED_COUNT\": \"Membres exclus\",\n \"EXCLUDED_COUNT_HELP\": \"Anciens membres exclus par non renouvellement ou manque de certifications\",\n \"REVOKED_COUNT\": \"Identités révoquées\",\n \"REVOKED_COUNT_HELP\": \"Ces comptes ne pourront plus être membres\",\n \"TX_COUNT\": \"Transactions\",\n \"CERT_COUNT\": \"Certifications\",\n \"TX_TO_HIMSELF\": \"Opération de change\",\n \"TX_OUTPUT_UNLOCK_CONDITIONS\": \"Conditions de déblocage\",\n \"TX_OUTPUT_OPERATOR\": {\n \"AND\": \"et\",\n \"OR\": \"ou\"\n },\n \"TX_OUTPUT_FUNCTION\": {\n \"SIG\": \"<b>Signature</b> de \",\n \"XHX\": \"<b>Mot de passe</b>, dont SHA256 =\",\n \"CSV\": \"Bloqué pendant\",\n \"CLTV\": \"Bloqué jusqu'à\"\n }\n },\n \"LOOKUP\": {\n \"TITLE\": \"Blocs\",\n \"NO_BLOCK\": \"Aucun bloc\",\n \"LAST_BLOCKS\": \"Derniers blocs :\",\n \"BTN_COMPACT\": \"Compacter\"\n }\n },\n \"CURRENCY\": {\n \"VIEW\": {\n \"TITLE\": \"Monnaie\",\n \"TAB_CURRENCY\": \"Monnaie\",\n \"TAB_WOT\": \"Toile de confiance\",\n \"TAB_NETWORK\": \"Réseau\",\n \"TAB_BLOCKS\": \"Blocs\",\n \"CURRENCY_SHORT_DESCRIPTION\": \"{{currency|abbreviate}} est une <b>monnaie libre</b>, démarrée {{firstBlockTime|formatFromNow}}. Elle compte actuellement <b>{{N}} membres</b>, qui produisent et perçoivent un <a ng-click=\\\"showHelpModal('ud')\\\">Dividende Universel</a> (DU), chaque {{dt|formatPeriod}}.\",\n \"NETWORK_RULES_DIVIDER\": \"Règles du réseau\",\n \"CURRENCY_NAME\": \"Nom de la monnaie\",\n \"MEMBERS\": \"Nombre de membres\",\n \"MEMBERS_VARIATION\": \"Variation depuis le dernier DU\",\n \"MONEY_DIVIDER\": \"Monnaie\",\n \"MASS\": \"Masse monétaire\",\n \"SHARE\": \"Masse par membre\",\n \"UD\": \"Dividende universel\",\n \"C_ACTUAL\": \"Croissance actuelle\",\n \"MEDIAN_TIME\": \"Heure de la blockchain\",\n \"POW_MIN\": \"Niveau minimal de difficulté de calcul\",\n \"MONEY_RULES_DIVIDER\": \"Règles de la monnaie\",\n \"C_RULE\": \"Croissance théorique cible\",\n \"UD_RULE\": \"Calcul du dividende universel\",\n \"DT_REEVAL\": \"Période de revalorisation du DU\",\n \"REEVAL_SYMBOL\": \"reval\",\n \"DT_REEVAL_VALUE\": \"Tous les <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})\",\n \"UD_REEVAL_TIME0\": \"Date de la 1ère revalorisation\",\n \"SIG_QTY_RULE\": \"Nombre de certifications requises pour devenir membre\",\n \"SIG_STOCK\": \"Nombre maximal de certifications émises par membre\",\n \"SIG_PERIOD\": \"Délai minimal d'attente entre 2 certifications successives émises par une même personne\",\n \"SIG_WINDOW\": \"Délai limite de prise en compte d'une certification\",\n \"SIG_VALIDITY\": \"Durée de vie d'une certification qui a été prise en compte\",\n \"MS_WINDOW\": \"Délai limite de prise en compte d'une demande d'adhésion comme membre\",\n \"MS_VALIDITY\": \"Durée de vie d'une adhésion qui a été prise en compte\",\n \"STEP_MAX\": \"Distance maximale, par les certifications, entre un nouvel entrant et les membres référents\",\n \"WOT_RULES_DIVIDER\": \"Règles de la toile de confiance\",\n \"SENTRIES\": \"Nombre de certifications (émises <b>et</b> reçues) pour devenir membre référent\",\n \"SENTRIES_FORMULA\": \"Nombre de certifications (émises <b>et</b> reçues) pour devenir membre référent (formule)\",\n \"XPERCENT\":\"Pourcentage minimum de membres référents à atteindre pour respecter la règle de distance\",\n \"AVG_GEN_TIME\": \"Temps moyen entre deux blocs\",\n \"CURRENT\": \"actuel\",\n \"MATH_CEILING\": \"PLAFOND\",\n \"DISPLAY_ALL_RULES\": \"Afficher toutes les règles ?\",\n \"BTN_SHOW_LICENSE\": \"Voir la licence\",\n \"WOT_DIVIDER\": \"Toile de confiance\"\n },\n \"LICENSE\": {\n \"TITLE\": \"Licence de la monnaie\",\n \"BTN_DOWNLOAD\": \"Télécharger le fichier\",\n \"NO_LICENSE_FILE\": \"Fichier de licence non trouvé.\"\n }\n },\n \"NETWORK\": {\n \"VIEW\": {\n \"MEDIAN_TIME\": \"Heure de la blockchain\",\n \"LOADING_PEERS\": \"Chargement des noeuds...\",\n \"NODE_ADDRESS\": \"Adresse :\",\n \"SOFTWARE\": \"Logiciel\",\n \"WARN_PRE_RELEASE\": \"Pré-version (dernière version stable : <b>{{version}}</b>)\",\n \"WARN_NEW_RELEASE\": \"Version <b>{{version}}</b> disponible\",\n \"WS2PID\": \"Identifiant :\",\n \"PRIVATE_ACCESS\": \"Accès privé\",\n \"POW_PREFIX\": \"Préfixe de preuve de travail :\",\n \"ENDPOINTS\": {\n \"BMAS\": \"Interface sécurisée (SSL)\",\n \"BMATOR\": \"Interface réseau TOR\",\n \"WS2P\": \"Interface WS2P\",\n \"ES_USER_API\": \"Noeud de données Cesium+\"\n }\n },\n \"INFO\": {\n \"ONLY_SSL_PEERS\": \"Les noeuds non SSL ont un affichage dégradé, car Cesium fonctionne en mode HTTPS.\"\n }\n },\n \"PEER\": {\n \"PEERS\": \"Nœuds\",\n \"SIGNED_ON_BLOCK\": \"Signé sur le bloc\",\n \"MIRROR\": \"miroir\",\n \"MIRRORS\": \"Miroirs\",\n \"MIRROR_PEERS\": \"Nœuds miroirs\",\n \"PEER_LIST\" : \"Liste des nœuds\",\n \"MEMBERS\" : \"Membres\",\n \"MEMBER_PEERS\" : \"Nœuds membres\",\n \"ALL_PEERS\" : \"Tous les nœuds\",\n \"DIFFICULTY\" : \"Difficulté\",\n \"API\" : \"API\",\n \"CURRENT_BLOCK\" : \"Bloc #\",\n \"POPOVER_FILTER_TITLE\": \"Filtre\",\n \"OFFLINE\": \"Hors ligne\",\n \"OFFLINE_PEERS\": \"Nœuds hors ligne\",\n \"BTN_SHOW_PEER\": \"Voir le nœud\",\n \"VIEW\": {\n \"TITLE\": \"Nœud\",\n \"OWNER\": \"Appartient à\",\n \"SHOW_RAW_PEERING\": \"Voir la fiche de pair\",\n \"SHOW_RAW_CURRENT_BLOCK\": \"Voir le dernier bloc (format brut)\",\n \"LAST_BLOCKS\": \"Derniers blocs connus\",\n \"KNOWN_PEERS\": \"Nœuds connus :\",\n \"GENERAL_DIVIDER\": \"Informations générales\",\n \"ERROR\": {\n \"LOADING_TOR_NODE_ERROR\": \"Récupération des informations du noeud impossible. Le délai d'attente est dépassé.\",\n \"LOADING_NODE_ERROR\": \"Récupération des informations du noeud impossible\"\n }\n }\n },\n \"WOT\": {\n \"SEARCH_HELP\": \"Recherche (pseudo ou clé publique)\",\n \"SEARCH_INIT_PHASE_WARNING\": \"Durant la phase de pré-inscription, la recherche des inscriptions en attente <b>peut être longue</b>. Merci de patienter...\",\n \"REGISTERED_SINCE\": \"Inscrit le\",\n \"REGISTERED_SINCE_BLOCK\": \"Inscrit au bloc #\",\n \"NO_CERTIFICATION\": \"Aucune certification validée\",\n \"NO_GIVEN_CERTIFICATION\": \"Aucune certification émise\",\n \"NOT_MEMBER_PARENTHESIS\": \"(non membre)\",\n \"IDENTITY_REVOKED_PARENTHESIS\": \"(identité révoquée)\",\n \"MEMBER_PENDING_REVOCATION_PARENTHESIS\": \"(en cours de révocation)\",\n \"EXPIRE_IN\": \"Expiration\",\n \"NOT_WRITTEN_EXPIRE_IN\": \"Date limite<br/>de traitement\",\n \"EXPIRED\": \"Expiré\",\n \"PSEUDO\": \"Pseudonyme\",\n \"SIGNED_ON_BLOCK\": \"Emise au bloc #{{block}}\",\n \"WRITTEN_ON_BLOCK\": \"Ecrite au bloc #{{block}}\",\n \"GENERAL_DIVIDER\": \"Informations générales\",\n \"NOT_MEMBER_ACCOUNT\": \"Compte simple (non membre)\",\n \"NOT_MEMBER_ACCOUNT_HELP\": \"Il s'agit d'un simple portefeuille, sans demande d'adhésion en attente.\",\n \"TECHNICAL_DIVIDER\": \"Informations techniques\",\n \"BTN_CERTIFY\": \"Certifier\",\n \"BTN_YES_CERTIFY\": \"Oui, certifier\",\n \"BTN_SELECT_AND_CERTIFY\": \"Nouvelle certification\",\n \"ACCOUNT_OPERATIONS\": \"Opérations sur le compte\",\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"Identité {{title}}\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Toile de confiance\",\n \"NEWCOMERS\": \"Nouveaux membres\",\n \"NEWCOMERS_COUNT\": \"{{count}} membres\",\n \"PENDING\": \"Inscriptions en attente\",\n \"PENDING_COUNT\": \"{{count}} inscriptions en attente\",\n \"REGISTERED\": \"Inscrit {{sigDate | formatFromNow}}\",\n \"MEMBER_FROM\": \"Membre depuis {{memberDate|medianFromNowShort}}\",\n \"BTN_NEWCOMERS\": \"Nouveaux membres\",\n \"BTN_PENDING\": \"Inscriptions en attente\",\n \"SHOW_MORE\": \"Afficher plus\",\n \"SHOW_MORE_COUNT\": \"(limite actuelle à {{limit}})\",\n \"NO_PENDING\": \"Aucune inscription en attente.\",\n \"NO_NEWCOMERS\": \"Aucun membre.\"\n },\n \"CONTACTS\": {\n \"TITLE\": \"Contacts\"\n },\n \"MODAL\": {\n \"TITLE\": \"Recherche\"\n },\n \"CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certifications\",\n \"SUMMARY\": \"Certifications reçues\",\n \"LIST\": \"Détail des certifications reçues\",\n \"PENDING_LIST\": \"Certifications en attente de traitement\",\n \"RECEIVED\": \"Certifications reçues\",\n \"RECEIVED_BY\": \"Certifications reçues par {{uid}}\",\n \"ERROR\": \"Certifications reçues en erreur\",\n \"SENTRY_MEMBER\": \"Membre référent\"\n },\n \"OPERATIONS\": {\n \"TITLE\": \"{{uid}} - Opérations\"\n },\n \"GIVEN_CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certifications émises\",\n \"SUMMARY\": \"Certifications émises\",\n \"LIST\": \"Détail des certifications émises\",\n \"PENDING_LIST\": \"Certifications en attente de traitement\",\n \"SENT\": \"Certifications émises\",\n \"SENT_BY\": \"Certifications émises par {{uid}}\",\n \"ERROR\": \"Certifications émises en erreur\"\n }\n },\n \"LOGIN\": {\n \"TITLE\": \"<i class=\\\"icon ion-log-in\\\"></i> Connexion\",\n \"SCRYPT_FORM_HELP\": \"Veuillez saisir vos identifiants.<br>Pensez à vérifier que la clé publique est celle de votre compte.\",\n \"PUBKEY_FORM_HELP\": \"Veuillez saisir une clé publique de compte :\",\n \"FILE_FORM_HELP\": \"Choisissez le fichier de trousseau à utiliser :\",\n \"SCAN_FORM_HELP\": \"Scanner le QR code d'un portefeuille.\",\n \"SALT\": \"Identifiant secret\",\n \"SALT_HELP\": \"Identifiant secret\",\n \"SHOW_SALT\": \"Afficher l'identifiant secret ?\",\n \"PASSWORD\": \"Mot de passe\",\n \"PASSWORD_HELP\": \"Mot de passe\",\n \"PUBKEY_HELP\": \"Clé publique ou pseudonyme\",\n \"NO_ACCOUNT_QUESTION\": \"Vous n'avez pas encore de compte ?\",\n \"HAVE_ACCOUNT_QUESTION\": \"Vous avez déjà un compte ?\",\n \"CREATE_ACCOUNT\": \"Créer un compte...\",\n \"CREATE_FREE_ACCOUNT\": \"Créer un compte gratuitement\",\n \"FORGOTTEN_ID\": \"Mot de passe oublié ?\",\n \"ASSOCIATED_PUBKEY\": \"Clé publique du trousseau :\",\n \"BTN_METHODS\": \"Autres méthodes\",\n \"BTN_METHODS_DOTS\": \"Changer de méthode...\",\n \"METHOD_POPOVER_TITLE\": \"Méthodes\",\n \"MEMORIZE_AUTH_FILE\": \"Mémoriser ce trousseau le temps de la session de navigation\",\n \"SCRYPT_PARAMETERS\": \"Paramètres (Scrypt) :\",\n \"AUTO_LOGOUT\": {\n \"TITLE\": \"Information\",\n \"MESSAGE\": \"<i class=\\\"ion-android-time\\\"></i> Vous avez été <b>déconnecté</b> automatiquement, suite à une inactivité prolongée.\",\n \"BTN_RELOGIN\": \"Me reconnecter\",\n \"IDLE_WARNING\": \"Vous allez être déconnecté... {{countdown}}\"\n },\n \"METHOD\": {\n \"SCRYPT_DEFAULT\": \"Identifiant secret et mot de passe\",\n \"SCRYPT_ADVANCED\": \"Salage avancé\",\n \"FILE\": \"Fichier de trousseau\",\n \"PUBKEY\": \"Clé publique ou pseudonyme\",\n \"SCAN\": \"Scanner un QR code\"\n },\n \"SCRYPT\": {\n \"SIMPLE\": \"Salage léger\",\n \"DEFAULT\": \"Salage standard\",\n \"SECURE\": \"Salage sûr\",\n \"HARDEST\": \"Salage le plus sûr\",\n \"EXTREME\": \"Salage extrême\",\n \"USER\": \"Salage personnalisé\",\n \"N\": \"N (Loop):\",\n \"r\": \"r (RAM):\",\n \"p\": \"p (CPU):\"\n },\n \"FILE\": {\n \"HELP\": \"Format de fichier attendu : <b>.yml</b> ou <b>.dunikey</b> (type PubSec, WIF ou EWIF).\"\n }\n },\n \"AUTH\": {\n \"TITLE\": \"<i class=\\\"icon ion-locked\\\"></i> Authentification\",\n \"BTN_AUTH\": \"S'authentifier\",\n \"GENERAL_HELP\": \"Veuillez vous authentifier :\",\n \"EXPECTED_UID_HELP\": \"Veuillez vous authentifier sur le compte <i class=\\\"ion-person\\\"></i> {{uid}} :\",\n \"EXPECTED_PUBKEY_HELP\": \"Veuillez vous authentifier sur le portefeuille <br class=\\\"visible-xs\\\"/><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}} :\",\n \"SCAN_FORM_HELP\": \"Scanner le QR code de la <b>clef privée</b> du portefeuille.\"\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Mon compte\",\n \"BALANCE\": \"Solde\",\n \"LAST_TX\": \"Dernières transactions validées\",\n \"BALANCE_ACCOUNT\": \"Solde du compte\",\n \"NO_TX\": \"Aucune transaction\",\n \"SHOW_MORE_TX\": \"Afficher plus\",\n \"SHOW_ALL_TX\": \"Afficher tout\",\n \"TX_FROM_DATE\": \"(limite actuelle à {{fromTime|medianFromNowShort}})\",\n \"PENDING_TX\": \"Transactions en attente de traitement\",\n \"VALIDATING_TX\": \"Transactions traitées, non validées\",\n \"ERROR_TX\": \"Transactions non executées\",\n \"ERROR_TX_SENT\": \"Transactions envoyées en échec\",\n \"PENDING_TX_RECEIVED\": \"Transactions en attente de réception\",\n \"EVENTS\": \"Evénements\",\n \"OUT_DISTANCED\": \"Vos certifications actuelles proviennent d'un groupe trop isolé de la <a ng-click=\\\"showHelpModal('wot')\\\">Toile de Confiance</a> (TdC) : la <a ng-click=\\\"showHelpModal('distance_rule')\\\">règle de distance maximale</a> n'est pas respectée.<br/>Vous devez obtenir des certifications provenant d'autres secteurs de la TdC, ou bien attendre que celle-ci se resserre.\",\n \"WAITING_MEMBERSHIP\": \"Demande d'adhésion envoyée. En attente d'acceptation.\",\n \"WAITING_CERTIFICATIONS\": \"Vous devez <b>obtenir {{needCertificationCount}} certification(s)</b> pour devenir membre et produire le <a ng-click=\\\"showHelpModal('ud')\\\">Dividende Universel</a>. Votre compte est cependant déjà opérationnel, pour recevoir et effectuer des paiements.\",\n \"WAITING_CERTIFICATIONS_HELP\": \"Pour obtenir vos certifications, sollicitez uniquement des membres <b>qui vous connaissent suffisamment</b>, comme l'exige <a ng-click=\\\"showLicenseModal()\\\">la licence de la monnaie</a> que vous avez acceptée.<br/>Si vous ne connaissez pas suffisamment de membres, faites-le savoir sur <a ng-click=\\\"openLink($event, $root.settings.userForumUrl)\\\">le forum utilisateur</a>.\",\n \"WILL_MISSING_CERTIFICATIONS\": \"Vous allez bientôt <b>manquer de certifications</b> (au moins {{willNeedCertificationCount}} sont requises)\",\n \"WILL_NEED_RENEW_MEMBERSHIP\": \"Votre adhésion comme membre <b>va expirer {{membershipExpiresIn|formatDurationTo}}</b>. Pensez à <a ng-click=\\\"doQuickFix('renew')\\\">renouveler votre adhésion</a> d'ici là.\",\n \"NEED_RENEW_MEMBERSHIP\": \"Vous n'êtes plus membre de la monnaie, car <b>votre adhésion a expiré</b>. Pensez à <a ng-click=\\\"doQuickFix('renew')\\\">renouveler votre adhésion</a>.\",\n \"NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED\": \"Vous n'êtes plus membre de la monnaie, <b>pour manque de certifications</b>. Pensez à <a ng-click=\\\"doQuickFix('renew')\\\">renouveler votre adhésion</a>.\",\n \"NO_WAITING_MEMBERSHIP\": \"Aucune demande d'adhésion en attente. Si vous souhaitez <b>devenir membre</b>, pensez à <a ng-click=\\\"doQuickFix('membership')\\\">envoyer la demande d'adhésion</a>.\",\n \"CERTIFICATION_COUNT\": \"Certifications reçues\",\n \"CERTIFICATION_COUNT_SHORT\": \"Certifications\",\n \"SIG_STOCK\": \"Certifications envoyées\",\n \"BTN_RECEIVE_MONEY\": \"Encaisser\",\n \"BTN_SELECT_ALTERNATIVES_IDENTITIES\": \"Basculer vers une autre identité...\",\n \"BTN_FIX_MEMBERSHIP\": \"Renvoyer la demande d'adhésion...\",\n \"BTN_MEMBERSHIP_RENEW\": \"Renouveler l'adhésion\",\n \"BTN_MEMBERSHIP_RENEW_DOTS\": \"Renouveler l'adhésion...\",\n \"BTN_MEMBERSHIP_OUT_DOTS\": \"Arrêter l'adhésion...\",\n \"BTN_SECURITY_DOTS\": \"Compte et sécurité...\",\n \"BTN_SHOW_DETAILS\": \"Afficher les infos techniques\",\n \"LOCKED_OUTPUTS_POPOVER\": {\n \"TITLE\": \"Montant verrouillé\",\n \"DESCRIPTION\": \"Voici les conditions de déverrouillage de ce montant :\",\n \"DESCRIPTION_MANY\": \"Cette transaction est composé de plusieurs parties, dont voici les conditions de déverrouillage :\",\n \"LOCKED_AMOUNT\": \"Conditions pour le montant :\"\n },\n \"NEW\": {\n \"TITLE\": \"Création de compte\",\n \"INTRO_WARNING_TIME\": \"La création d'un compte sur {{name|capitalize}} est très simple. Veuillez néanmoins prendre suffisament de temps pour faire correctement cette formalité (pour ne pas oublier les identifiants, mots de passe, etc.).\",\n \"INTRO_WARNING_SECURITY\": \"Vérifiez que le matériel que vous utilisez actuellement (ordinateur, tablette, téléphone) <b>est sécurisé et digne de confiance</b>.\",\n \"INTRO_WARNING_SECURITY_HELP\": \"Anti-virus à jour, pare-feu activé, session protégée par mot de passe ou code pin, etc.\",\n \"INTRO_HELP\": \"Cliquez sur <b>{{'COMMON.BTN_START'|translate}}</b> pour débuter la création de compte. Vous serez guidé étape par étape.\",\n \"REGISTRATION_NODE\": \"Votre inscription sera enregistrée via le noeud Duniter <b>{{server}}</b>, qui le diffusera ensuite au reste du réseau de la monnaie.\",\n \"REGISTRATION_NODE_HELP\": \"Si vous ne faites pas confiance en ce noeud, veuillez en changer <a ng-click=\\\"doQuickFix('settings')\\\">dans les paramètres</a> de Cesium.\",\n \"SELECT_ACCOUNT_TYPE\": \"Choisissez le type de compte à créer :\",\n \"MEMBER_ACCOUNT\": \"Compte membre\",\n \"MEMBER_ACCOUNT_TITLE\": \"Création d'un compte membre\",\n \"MEMBER_ACCOUNT_HELP\": \"Si vous n'êtes pas encore inscrit en tant qu'individu (un seul compte possible par individu). Ce compte permet de co-produire la monnaie, en recevant un <b>dividende universel</b> chaque {{parameters.dt|formatPeriod}}.\",\n \"WALLET_ACCOUNT\": \"Simple portefeuille\",\n \"WALLET_ACCOUNT_TITLE\": \"Création d'un portefeuille\",\n \"WALLET_ACCOUNT_HELP\": \"Pour tous les autres cas, par exemple si vous avez besoin d'un compte supplémentaire.<br/>Aucun dividende universel ne sera créé par ce compte.\",\n \"SALT_WARNING\": \"Choisissez votre identifiant secret.<br/>Il vous sera demandé à chaque connexion sur ce compte.<br/><br/><b>Retenez le bien</b> : en cas de perte, plus personne ne pourra accéder à votre compte !\",\n \"PASSWORD_WARNING\": \"Choisissez un mot de passe.<br/>Il vous sera demandé à chaque connexion sur ce compte.<br/><br/><b>Retenez bien ce mot de passe</b : en cas de perte, plus personne ne pourra accéder à votre compte !\",\n \"PSEUDO_WARNING\": \"Choisissez un pseudonyme.<br/>Il sert aux autres membres, pour vous identifier plus facilement.<div class='hidden-xs'><br/>Il <b>ne pourra pas être modifié</b>, sans refaire un compte.</div><br/><br/>Il ne doit contenir <b>ni espace, ni de caractère accentué</b>.<div class='hidden-xs'><br/>Exemple : <span class='gray'>SophieDupond, MarcelChemin, etc.</span>\",\n \"PSEUDO\": \"Pseudonyme\",\n \"PSEUDO_HELP\": \"Pseudonyme\",\n \"SALT_CONFIRM\": \"Confirmation\",\n \"SALT_CONFIRM_HELP\": \"Confirmation de l'identifiant secret\",\n \"PASSWORD_CONFIRM\": \"Confirmation\",\n \"PASSWORD_CONFIRM_HELP\": \"Confirmation du mot de passe\",\n \"SLIDE_6_TITLE\": \"Confirmation :\",\n \"COMPUTING_PUBKEY\": \"Calcul en cours...\",\n \"LAST_SLIDE_CONGRATULATION\": \"Vous avez saisi toutes les informations nécessaires : Bravo !<br/>Vous pouvez maintenant <b>envoyer la demande de création</b> de compte.</b><br/><br/>Pour information, la clé publique ci-dessous identifiera votre futur compte.<br/>Elle pourra être communiquée à des tiers pour recevoir leurs paiements.<br/><b>Il n'est pas obligatoire</b> de la noter ici, vous pourrez également le faire plus tard.\",\n \"CONFIRMATION_MEMBER_ACCOUNT\": \"<b class=\\\"assertive\\\">Avertissement :</b> l'identifiant secret, le mot de passe et le pseudonyme ne pourront plus être modifiés.<br/><br/><b>Assurez-vous de toujours vous en rappeler !</b><br/><br/><b>Êtes-vous sûr</b> de vouloir envoyer cette demande d'inscription ?\",\n \"CONFIRMATION_WALLET_ACCOUNT\": \"<b class=\\\"assertive\\\">Avertissement :</b> l'identifiant secret et le mot de passe ne pourront plus être modifiés.<br/><br/><b>Assurez-vous de toujours vous en rappeler !</b><br/><br/><b>Êtes-vous sûr</b> de vouloir continuer avec ces identifiants ?\",\n \"CHECKING_PSEUDO\": \"Vérification...\",\n \"PSEUDO_AVAILABLE\": \"Pseudonyme disponible\",\n \"PSEUDO_NOT_AVAILABLE\": \"Pseudonyme non disponible\",\n \"INFO_LICENSE\": \"Avant de créer un compte membre, <b>veuillez lire et accepter la licence</b> d'usage de la monnaie :\",\n \"BTN_ACCEPT\": \"J'accepte\",\n \"BTN_ACCEPT_LICENSE\": \"J'accepte la licence\"\n },\n \"POPUP_REGISTER\": {\n \"TITLE\": \"Choisissez un pseudonyme\",\n \"HELP\": \"Un pseudonyme est obligatoire pour devenir membre.\"\n },\n \"SELECT_IDENTITY_MODAL\": {\n \"TITLE\": \"Sélection de l'identité\",\n \"HELP\": \"Plusieurs <b>identités différentes</b> ont été envoyées, pour la clé publique <span class=\\\"gray\\\"><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}</span>.<br/>Veuillez sélectionner le dossier à utiliser :\"\n },\n \"SELECT_WALLET_MODAL\": {\n \"TITLE\": \"Sélection du portefeuille\"\n },\n \"WALLET_LIST\": {\n \"TITLE\": \"Mes portefeuilles\",\n \"BTN_NEW\": \"Ajouter un portefeuille\",\n \"BTN_DOWNLOAD\": \"Télécharger la liste\",\n \"BTN_IMPORT_FILE_DOTS\": \"Importer depuis un fichier...\",\n \"NO_WALLET\": \"Aucun portefeuille secondaire\",\n \"BTN_DELETE\": \"Retirer un portefeuille secondaire...\",\n \"BTN_RENAME\": \"Renommer le portefeuille\",\n \"EXPORT_FILENAME\": \"mes_portefeuilles-{{pubkey|formatPubkey}}-{{currency}}.csv\",\n \"TOTAL_DOTS\": \"Total : \",\n \"EDIT_POPOVER\": {\n \"TITLE\": \"Renommer le portefeuille\",\n \"HELP\": \"Renseignez le nouveau nom\",\n \"NAME_HELP\": \"Nom du portefeuille\"\n },\n \"IMPORT_MODAL\": {\n \"TITLE\": \"Importer des portefeuilles\",\n \"HELP\": \"Pour <b>importer des porftefeuilles</b>, veuillez glisser dans la zone ci-dessous le fichier de la liste des portefeuilles, ou bien cliquer dans la zone pour rechercher un fichier.\",\n \"WALLET_COUNT\": \"<b>{{count}}</b> nouveau{{count > 1 ? 'x' : ''}} portefeuille{{count > 1 ? 's' : ''}}\",\n \"NO_NEW_WALLET\": \"Aucun nouveau portefeuille\"\n }\n },\n \"SECURITY\": {\n \"ADD_QUESTION\": \"Ajouter une question personnalisée\",\n \"BTN_CLEAN\": \"Vider\",\n \"BTN_RESET\": \"Réinitialiser\",\n \"DOWNLOAD_REVOKE\": \"Sauvegarder mon fichier de révocation\",\n \"DOWNLOAD_REVOKE_HELP\": \"Disposer d'un fichier de révocation est important, par exemple en cas de perte de vos identifiants. Il vous permet de <b>sortir ce compte de la toile de confiance</b>, en redevenant ainsi un simple portefeuille.\",\n \"GENERATE_KEYFILE\": \"Générer mon fichier de trousseau...\",\n \"GENERATE_KEYFILE_HELP\": \"Génère un fichier permettant de vous authentifier sans saisir vos identifiants.<br/><b>Attention :</b> ce fichier contiendra votre trousseau de compte (clefs publique et secrète) ; il est donc très important de le mettre en lieu sûr !\",\n \"KEYFILE_FILENAME\": \"trousseau-{{pubkey|formatPubkey}}-{{currency}}-{{format}}.dunikey\",\n \"MEMBERSHIP_IN\": \"Transformer en compte membre...\",\n \"MEMBERSHIP_IN_HELP\": \"Permet de <b>transformer</b> un compte simple portefeuille <b>en compte membre</b>, en envoyant une demande d'adhésion. Utile uniquement si vous n'avez pas déjà un autre compte membre.\",\n \"SEND_IDENTITY\": \"Publier son identité...\",\n \"SEND_IDENTITY_HELP\": \"Permet d'associer un pseudonyme à ce compte, mais <b>sans faire de demande d'adhésion</b> pour devenir membre. Cette association n'est généralement pas utile, car la validité de cette association de pseudonyme est limitée dans le temps.\",\n \"HELP_LEVEL\": \"Pour générer un fichier de sauvegarde de vos identifiants, choisissez <strong> au moins {{nb}} questions :</strong>\",\n \"LEVEL\": \"Niveau de sécurité\",\n \"LOW_LEVEL\": \"Faible <span class=\\\"hidden-xs\\\">(2 questions minimum)</span>\",\n \"MEDIUM_LEVEL\": \"Moyen <span class=\\\"hidden-xs\\\">(4 questions minimum)</span>\",\n \"QUESTION_1\": \"Comment s'appelait votre meilleur ami lorsque vous étiez adolescent ?\",\n \"QUESTION_2\": \"Comment s'appelait votre premier animal de compagnie ?\",\n \"QUESTION_3\": \"Quel est le premier plat que vous avez appris à cuisiner ?\",\n \"QUESTION_4\": \"Quel est le premier film que vous avez vu au cinéma ?\",\n \"QUESTION_5\": \"Où êtes-vous allé la première fois que vous avez pris l'avion ?\",\n \"QUESTION_6\": \"Comment s'appelait votre instituteur préféré à l'école primaire ?\",\n \"QUESTION_7\": \"Quel serait selon vous le métier idéal ?\",\n \"QUESTION_8\": \"Quel est le livre pour enfants que vous préférez ?\",\n \"QUESTION_9\": \"Quel était le modèle de votre premier véhicule ?\",\n \"QUESTION_10\": \"Quel était votre surnom lorsque vous étiez enfant ?\",\n \"QUESTION_11\": \"Quel était votre personnage ou acteur de cinéma préféré lorsque vous étiez étudiant ?\",\n \"QUESTION_12\": \"Quel était votre chanteur ou groupe préféré lorsque vous étiez étudiant ?\",\n \"QUESTION_13\": \"Dans quelle ville vos parents se sont-ils rencontrés ?\",\n \"QUESTION_14\": \"Comment s'appelait votre premier patron ?\",\n \"QUESTION_15\": \"Quel est le nom de la rue où vous avez grandi ?\",\n \"QUESTION_16\": \"Quel est le nom de la première plage où vous vous êtes baigné ?\",\n \"QUESTION_17\": \"Quel est le premier album que vous avez acheté ?\",\n \"QUESTION_18\": \"Quel est le nom de votre équipe de sport préférée ?\",\n \"QUESTION_19\": \"Quel était le métier de votre grand-père ?\",\n \"RECOVER_ID\": \"Retrouver mon mot de passe...\",\n \"RECOVER_ID_HELP\": \"Si vous disposez d'un <b>fichier de sauvegarde de vos identifiants</b>, vous pouvez les retrouver en répondant correctement à vos questions personnelles.\",\n \"RECOVER_ID_SELECT_FILE\": \"Choisissez le <b>fichier de sauvegarde de vos identifiants</b> à utiliser :\",\n \"REVOCATION_WITH_FILE\": \"Révoquer mon compte membre...\",\n \"REVOCATION_WITH_FILE_DESCRIPTION\": \"Si vous avez <b>définitivement perdus vos identifiants</b> de compte membre (ou que la sécurité du compte est compromise), vous pouvez utiliser <b>le fichier de révocation</b> du compte pour <b>forcer sa sortie définitive de la toile de confiance</b>.\",\n \"REVOCATION_WITH_FILE_HELP\": \"Pour <b>révoquer définitivement</b> un compte membre, veuillez glisser dans la zone ci-dessous votre fichier de révocation, ou bien cliquer dans la zone pour rechercher un fichier.\",\n \"REVOCATION_WALLET\": \"Révoquer immédiatement ce compte\",\n \"REVOCATION_WALLET_HELP\": \"Demander la révocation de votre identité entraîne la <b>sortie de la toile de confiance</b> (définitive pour le pseudonyme et la clé publique associés). Le compte ne pourra plus produire de Dividende Universel.<br/>Vous pourrez toutefois encore vous y connecter, comme à un simple portefeuille.\",\n \"REVOCATION_FILENAME\": \"revocation-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt\",\n \"SAVE_ID\": \"Sauvegarder mes identifiants...\",\n \"SAVE_ID_HELP\": \"Création d'un fichier de sauvegarde, pour <b>retrouver votre mot de passe</b> (et l'identifiant secret) <b>en cas de d'oubli</b>. Le fichier est <b>sécurisé</b> (chiffré) à l'aide de questions personnelles.\",\n \"STRONG_LEVEL\": \"Fort <span class=\\\"hidden-xs \\\">(6 questions minimum)</span>\",\n \"TITLE\": \"Compte et sécurité\",\n \"KEYFILE\": {\n \"PUBSEC_FORMAT\": \"Format PubSec.\",\n \"PUBSEC_FORMAT_HELP\": \"Ce format stocke votre trousseau de manière très simple. Il est compatible notamment avec Cesium, ğannonce et Duniter.<br/><b>Attention :</b>Le fichier <b>n'est pas chiffré</b> (la clef secrète y apparaît en clair) ; veuillez donc le stocker en lieu sûr !\",\n \"WIF_FORMAT\": \"Format WIF (Wallet Import Format) - v1\",\n \"WIF_FORMAT_HELP\": \"Ce format stocke votre trousseau en y intégrant une somme de contrôle pour vérifier l'intégrité du fichier. Il est compatible notamment avec les portefeuilles papier (Duniter paper wallet).<br/><b>Attention :</b>Le fichier <b>n'est pas chiffré</b> (la clef secrète y apparaît en clair) ; veuillez donc le stocker en lieu sûr !\",\n \"EWIF_FORMAT\": \"Format EWIF (Encrypted Wallet Import Format) - v1\",\n \"EWIF_FORMAT_HELP\": \"Ce format stocke votre trousseau <b>de manière chiffrée</b> à partir d'une phrase secrète de votre choix. Il intègre aussi une somme de contrôle pour vérifier l'intégrité du fichier.<br/><b>Attention :</b> Veillez à toujours vous souvenir de votre phrase secrète !\",\n \"PASSWORD_POPUP\": {\n \"TITLE\": \"Fichier de trousseau chiffré\",\n \"HELP\": \"Veuillez indiquer la phrase secrète :\",\n \"PASSWORD_HELP\": \"Phrase secrète\"\n },\n \"ERROR\": {\n \"BAD_PASSWORD\": \"Phrase secrète incorrecte\",\n \"BAD_CHECKSUM\": \"Somme de contrôle incorrecte\"\n }\n }\n },\n \"FILE_NAME\": \"{{currency}} - Relevé du compte {{pubkey|formatPubkey}} au {{currentTime|formatDateForFile}}.csv\",\n \"HEADERS\": {\n \"TIME\": \"Date\",\n \"AMOUNT\": \"Montant\",\n \"COMMENT\": \"Commentaire\"\n }\n },\n \"TRANSFER\": {\n \"TITLE\": \"Virement\",\n \"SUB_TITLE\": \"Faire un virement\",\n \"SUB_TITLE_ALL\": \"Vider le compte\",\n \"FROM\": \"De\",\n \"TO\": \"À\",\n \"AMOUNT\": \"Montant\",\n \"AMOUNT_HELP\": \"Montant\",\n \"COMMENT\": \"Commentaire\",\n \"COMMENT_HELP\": \"Commentaire\",\n \"BTN_SEND\": \"Envoyer\",\n \"BTN_ADD_COMMENT\": \"Ajouter un commentaire\",\n \"REST\": \"Reste du compte\",\n \"REST_TO\": \"à\",\n \"WARN_COMMENT_IS_PUBLIC\": \"Veuillez noter que <b>les commentaires sont publics</b> (non chiffrés).\",\n \"MODAL\": {\n \"TITLE\": \"Virement\"\n }\n },\n \"ERROR\": {\n \"UNKNOWN_URI_FORMAT\": \"Format d'URI inconnu\",\n \"PUBKEY_INVALID_CHECKSUM\": \"Clé publique invalide (bad checksum).\",\n \"POPUP_TITLE\": \"Erreur\",\n \"UNKNOWN_ERROR\": \"Erreur inconnue\",\n \"CRYPTO_UNKNOWN_ERROR\": \"Votre navigateur ne semble pas compatible avec les fonctionnalités de cryptographie.\",\n \"DOWNLOAD_KEYFILE_FAILED\": \"Échec de la génération du fichier de trousseau.\",\n \"EQUALS_TO_PSEUDO\": \"Doit être différent du pseudonyme\",\n \"EQUALS_TO_SALT\": \"Doit être différent de l'identifiant secret\",\n \"FIELD_REQUIRED\": \"Champ obligatoire\",\n \"FIELD_TOO_SHORT\": \"Valeur trop courte\",\n \"FIELD_TOO_SHORT_WITH_LENGTH\": \"Valeur trop courte ({{minLength}} caractères min)\",\n \"FIELD_TOO_LONG\": \"Valeur trop longue\",\n \"FIELD_TOO_LONG_WITH_LENGTH\": \"Valeur trop longue ({{maxLength}} caractères max)\",\n \"FIELD_MIN\": \"Valeur minimale : {{min}}\",\n \"FIELD_MAX\": \"Valeur maximale : {{max}}\",\n \"FIELD_ACCENT\": \"Caractères accentués et virgules non autorisés\",\n \"FIELD_NOT_NUMBER\": \"Valeur numérique attendue\",\n \"FIELD_NOT_INT\": \"Valeur entière attendue\",\n \"FIELD_NOT_EMAIL\": \"Adresse email non valide\",\n \"PASSWORD_NOT_CONFIRMED\": \"Ne correspond pas au mot de passe\",\n \"SALT_NOT_CONFIRMED\": \"Ne correspond pas à l'identifiant secret\",\n \"SEND_IDENTITY_FAILED\": \"Échec de l'inscription\",\n \"SEND_CERTIFICATION_FAILED\": \"Échec de la certification\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY\": \"Vous ne pouvez pas effectuer de certification, car ce compte n'est <b>pas membre</b>.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF\": \"Vous ne pouvez pas effectuer de certification, car ce compte n'est pas encore membre.<br/><br/>Il vous manque encore des certifications, ou bien celles-ci n'ont pas encore été validées.\",\n \"IDENTITY_TO_CERTIFY_HAS_NO_SELF\": \"Compte non certifiable. Aucune demande d'adhésion n'a été faite, ou bien elle n'a pas été renouvelée.\",\n \"LOGIN_FAILED\": \"Erreur lors de la connexion.\",\n \"LOAD_IDENTITY_FAILED\": \"Erreur de chargement de l'identité.\",\n \"LOAD_REQUIREMENTS_FAILED\": \"Erreur de chargement des prérequis de l'identité.\",\n \"SEND_MEMBERSHIP_IN_FAILED\": \"Échec de la tentative d'entrée dans la communauté.\",\n \"SEND_MEMBERSHIP_OUT_FAILED\": \"Échec de l'arrêt de l'adhésion.\",\n \"REFRESH_WALLET_DATA\": \"Échec du rafraîchissement du portefeuille.\",\n \"GET_CURRENCY_PARAMETER\": \"Échec de la récupération des règles de la monnaie.\",\n \"GET_CURRENCY_FAILED\": \"Chargement de la monnaie impossible. Veuillez réessayer plus tard.\",\n \"SEND_TX_FAILED\": \"Échec du virement.\",\n \"ALL_SOURCES_USED\": \"Veuillez attendre le calcul du prochain bloc (toutes vos sources de monnaie ont été utilisées).\",\n \"NOT_ENOUGH_SOURCES\": \"Pas assez de change pour envoyer ce montant en une seule transaction.<br/>Montant maximum : {{amount}} {{unit}}<sub>{{subUnit}}</sub>.\",\n \"ACCOUNT_CREATION_FAILED\": \"Échec de la création du compte membre.\",\n \"RESTORE_WALLET_DATA_ERROR\": \"Échec du rechargement des paramètres depuis le stockage local\",\n \"LOAD_WALLET_DATA_ERROR\": \"Échec du chargement des données du portefeuille.\",\n \"COPY_CLIPBOARD_FAILED\": \"Copie de la valeur impossible.\",\n \"TAKE_PICTURE_FAILED\": \"Échec de la récupération de la photo.\",\n \"SCAN_FAILED\": \"Échec du scan de QR-code.\",\n \"SCAN_UNKNOWN_FORMAT\": \"Code non reconnu.\",\n \"WOT_LOOKUP_FAILED\": \"Échec de la recherche.\",\n \"LOAD_PEER_DATA_FAILED\": \"Lecture du nœud Duniter impossible. Veuillez réessayer ultérieurement.\",\n \"NEED_LOGIN_FIRST\": \"Veuillez d'abord vous connecter.\",\n \"AMOUNT_REQUIRED\": \"Le montant est obligatoire.\",\n \"AMOUNT_NEGATIVE\": \"Montant négatif non autorisé.\",\n \"NOT_ENOUGH_CREDIT\": \"Crédit insuffisant.\",\n \"INVALID_NODE_SUMMARY\": \"Nœud injoignable ou adresse invalide.\",\n \"INVALID_USER_ID\": \"Le pseudonyme ne doit contenir ni espace ni caractère spécial ou accentué.\",\n \"INVALID_COMMENT\": \"Le champ 'référence' ne doit pas contenir de caractères accentués.\",\n \"INVALID_PUBKEY\": \"La clé publique n'a pas le format attendu.\",\n \"INVALID_PUBKEY_CHECKSUM\": \"Somme de contrôle invalide.\",\n \"IDENTITY_REVOKED\": \"Cette identité <b>a été révoquée</b>. Elle ne peut plus devenir membre.\",\n \"IDENTITY_REVOKED_WITH_TIME\": \"Cette identité <b>a été révoquée {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). Elle ne peut plus devenir membre.\",\n \"IDENTITY_PENDING_REVOCATION\": \"La <b>révocation de cette identité</b> a été demandée et est en attente de traitement. La certification est donc désactivée.\",\n \"IDENTITY_INVALID_BLOCK_HASH\": \"Cette demande d'adhésion n'est plus valide (car elle référence un bloc que les nœuds du réseau ont annulé) : cette personne doit renouveler sa demande d'adhésion <b>avant</b> d'être certifiée.\",\n \"IDENTITY_EXPIRED\": \"La publication de cette identité a expiré : cette personne doit effectuer une nouvelle demande d'adhésion <b>avant</b> d'être certifiée.\",\n \"IDENTITY_SANDBOX_FULL\": \"Le nœud Duniter utilisé par Cesium ne peut plus recevoir de nouvelles identités, car sa file d'attente est pleine.<br/><br/>Veuillez réessayer ultérieurement ou changer de nœud (via le menu <b>Paramètres</b>).\",\n \"IDENTITY_NOT_FOUND\": \"Identité non trouvée.\",\n \"IDENTITY_TX_FAILED\": \"Échec du chargement des opérations.\",\n \"WOT_PENDING_INVALID_BLOCK_HASH\": \"Adhésion non valide.\",\n \"WALLET_INVALID_BLOCK_HASH\": \"Votre demande d'adhésion n'est plus valide (car elle référence un bloc que les nœuds du réseau ont annulé).<br/>Vous devez <a ng-click=\\\"doQuickFix('fixMembership')\\\">envoyer une nouvelle demande</a> pour résoudre ce problème.\",\n \"WALLET_IDENTITY_EXPIRED\": \"La publication de <b>votre identité a expirée</b>.<br/>Vous devez <a ng-click=\\\"doQuickFix('fixIdentity')\\\">publier à nouveau votre identité</a> pour résoudre ce problème.\",\n \"WALLET_REVOKED\": \"Votre identité a été <b>révoquée</b> : ni votre pseudonyme ni votre clef publique ne pourra être utilisé à l'avenir pour un compte membre.\",\n \"WALLET_HAS_NO_SELF\": \"Votre identité doit d'abord avoir été publiée, et ne pas être expirée.\",\n \"AUTH_REQUIRED\": \"Authentification requise.\",\n \"AUTH_INVALID_PUBKEY\": \"La clef attendue est <i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}...\",\n \"AUTH_INVALID_SCRYPT\": \"Identifiant ou mot de passe invalide.\",\n \"AUTH_INVALID_FILE\": \"Fichier de trousseau invalide.\",\n \"AUTH_FILE_ERROR\": \"Échec de l'ouverture du fichier de trousseau.\",\n \"IDENTITY_ALREADY_CERTIFY\": \"Vous avez <b>déjà certifié</b> cette identité.<br/><br/>Cette certification est encore valide (expiration {{expiresIn|formatDurationTo}}).\",\n \"IDENTITY_ALREADY_CERTIFY_PENDING\": \"Vous avez <b>déjà certifié</b> cette identité.<br/><br/>Cette certification est en attente de traitement (date limite de traitement {{expiresIn|formatDurationTo}}).\",\n \"UNABLE_TO_CERTIFY_TITLE\": \"Certification impossible\",\n \"LOAD_NEWCOMERS_FAILED\": \"Échec du chargement des nouveaux membres.\",\n \"LOAD_PENDING_FAILED\": \"Échec du chargement des inscriptions en attente.\",\n \"ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"Vous devez <b>être membre</b> pour pouvoir effectuer cette action.\",\n \"ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"Vous devez <b>être membre (ou ancien membre)</b> pour pouvoir effectuer cette action.\",\n \"ONLY_SELF_CAN_EXECUTE_THIS_ACTION\": \"Vous devez avoir <b>publié votre identité</b> pour pouvoir effectuer cette action.\",\n \"GET_BLOCK_FAILED\": \"Échec de la récupération du bloc.\",\n \"INVALID_BLOCK_HASH\": \"Bloc non trouvé (hash différent).\",\n \"DOWNLOAD_REVOCATION_FAILED\": \"Échec du téléchargement du fichier de révocation.\",\n \"REVOCATION_FAILED\": \"Échec de la révocation.\",\n \"SALT_OR_PASSWORD_NOT_CONFIRMED\": \"Identifiant secret ou mot de passe incorrect.\",\n \"RECOVER_ID_FAILED\": \"Échec de la récupération des identifiants\",\n \"LOAD_FILE_FAILED\" : \"Échec du chargement du fichier\",\n \"NOT_VALID_REVOCATION_FILE\": \"Fichier de révocation non valide (mauvais format de fichier)\",\n \"NOT_VALID_SAVE_ID_FILE\": \"Fichier de récupération non valide (mauvais format de fichier)\",\n \"NOT_VALID_KEY_FILE\": \"Fichier de trousseau non valide (format non reconnu)\",\n \"EXISTING_ACCOUNT\": \"Vos identifiants correspondent à un compte déjà existant, dont la <a ng-click=\\\"showHelpModal('pubkey')\\\">clef publique</a> est :\",\n \"EXISTING_ACCOUNT_REQUEST\": \"Veuillez modifier vos identifiants afin qu'ils correspondent à un compte non utilisé.\",\n \"GET_LICENSE_FILE_FAILED\": \"Récupération du fichier de licence impossible.\",\n \"CHECK_NETWORK_CONNECTION\": \"Aucun nœud ne semble accessible.<br/><br/>Veuillez <b>vérifier votre connexion Internet</b>.\",\n \"ISSUE_524_TX_FAILED\": \"Échec du virement.<br/><br/>Un message a été envoyé aux développeurs pour faciliter la résolution du problème. <b>Merci de votre aide</b>.\",\n \"ADD_SECONDARY_WALLET_FAILED\": \"Échec de l'ajout du portefeuille secondaire.\",\n \"REMOVE_SECONDARY_WALLET_FAILED\": \"Échec de la suppression du portefeuille secondaire.\",\n \"UPDATE_WALLET_LIST_FAILED\": \"Échec du rafraîchissement des portefeuilles secondaires.\",\n \"LOAD_WALLET_LIST_FAILED\": \"Échec du chargement des portefeuilles secondaires.\",\n \"SAVE_WALLET_LIST_FAILED\": \"Échec de la sauvegarde des portefeuilles secondaires.\",\n \"COULD_NOT_ADD_MAIN_WALLET\": \"Ce portefeuille <b>correspond au compte principal</b> avec lequel vous êtes connecté.<br/>Impossible de l'ajouter comme portefeuille secondaire.\",\n \"COULD_NOT_ADD_EXISTING_WALLET\": \"Portefeuille déjà existant dans la liste.\",\n \"UNKNOWN_WALLET_ID\": \"Portefeuille secondaire inconnu.\",\n \"RESTORE_WALLET_LIST_FAILED\": \"Échec de la restauration des portefeuilles secondaires.\",\n \"INVALID_FILE_FORMAT\": \"Format de fichier invalide.\",\n \"SAME_TX_RECIPIENT\": \"Le destinataire doit être différent de l'émetteur.\"\n },\n \"INFO\": {\n \"POPUP_TITLE\": \"Information\",\n \"CERTIFICATION_DONE\": \"Certification envoyée\",\n \"NOT_ENOUGH_CREDIT\": \"Crédit insuffisant\",\n \"TRANSFER_SENT\": \"Virement envoyé\",\n \"COPY_TO_CLIPBOARD_DONE\": \"Copié dans le presse-papier\",\n \"MEMBERSHIP_OUT_SENT\": \"Résiliation envoyée\",\n \"NOT_NEED_MEMBERSHIP\": \"Vous êtes déjà membre.\",\n \"IDENTITY_WILL_MISSING_CERTIFICATIONS\": \"Cette identité va bientôt manquer de certifications (au moins {{willNeedCertificationCount}}).\",\n \"IDENTITY_NEED_MEMBERSHIP\": \"Cette identité n'a pas envoyée de demande d'adhésion. Elle le devra si elle souhaite devenir membre.\",\n \"HAS_ALTERNATIVE_IDENTITIES\": \"Il existe <b>plusieurs identités</b> rattachées à cette clé publique. <b>Avant toute certification</b>, pensez à <a ng-click=\\\"doQuickFix('showSelectIdentities')\\\">consulter les autres identités</a> pour choisir la bonne, ou bien contacter le propriétaire du compte.\",\n \"REVOCATION_SENT\": \"Révocation envoyée\",\n \"REVOCATION_SENT_WAITING_PROCESS\": \"La <b>révocation de cette identité</b> a été demandée et est en attente de traitement.\",\n \"FEATURES_NOT_IMPLEMENTED\": \"Cette fonctionnalité est encore en cours de développement.<br/>Pourquoi ne pas <b>contribuer à Cesium</b>, pour l'obtenir plus rapidement ? ;)\",\n \"EMPTY_TX_HISTORY\": \"Aucune opération à exporter\"\n },\n \"CONFIRM\": {\n \"POPUP_TITLE\": \"<b>Confirmation</b>\",\n \"POPUP_WARNING_TITLE\": \"<b>Avertissement</b>\",\n \"POPUP_SECURITY_WARNING_TITLE\": \"<i class=\\\"icon ion-alert-circled\\\"></i> <b>Avertissement de sécurité</b>\",\n \"CERTIFY_RULES_TITLE_UID\": \"Certifier {{uid}}\",\n \"CERTIFY_RULES\": \"<b class=\\\"assertive\\\">Ne PAS certifier</b> un compte si vous pensez que :<br/><br/><ul><li>1.) il ne correspond pas à une personne <b>physique et vivante</b>.<li>2.) son propriétaire <b>possède un autre compte</b> déjà certifié.<li>3.) son propriétaire viole (volontairement ou non) la règle 1 ou 2 (par exemple en certifiant des comptes factices ou en double).</ul><br/><b>Êtes-vous sûr</b> de vouloir néanmoins certifier cette identité ?\",\n \"FULLSCREEN\": \"Afficher l'application en plein écran ?\",\n \"EXIT_APP\": \"Fermer l'application ?\",\n \"TRANSFER\": \"<b>Récapitulatif du virement</b> :<br/><br/><ul><li> - De : {{from}}</li><li> - A : <b>{{to}}</b></li><li> - Montant : <b>{{amount}} {{unit}}</b></li><li> - Commentaire : <i>{{comment}}</i></li></ul><br/><b>Êtes-vous sûr de vouloir effectuer ce virement ?</b>\",\n \"TRANSFER_ALL\": \"<b>Récapitulatif du virement</b> :<br/><br/><ul><li> - De : {{from}}</li><li> - A : <b>{{to}}</b></li><li> - Montant : <b>{{amount}} {{unit}}</b></li><li> - Commentaire : <i>{{comment}}</i></li><br/><li> - Reste : <b>{{restAmount}} {{unit}}</b> à <b>{{restTo}}</b></li></ul><br/><b>Êtes-vous sûr de vouloir effectuer ce virement ?</b>\",\n \"MEMBERSHIP_OUT\": \"Cette opération est <b>irréversible</b>.<br/></br/>Êtes-vous sûr de vouloir <b>résilier votre compte membre</b> ?\",\n \"MEMBERSHIP_OUT_2\": \"Cette opération est <b>irreversible</b> !<br/><br/>Êtes-vous vraiment sûr de vouloir <b>résilier votre adhésion</b> comme membre ?\",\n \"LOGIN_UNUSED_WALLET_TITLE\": \"Erreur de saisie ?\",\n \"LOGIN_UNUSED_WALLET\": \"Le compte connecté semble <b>inactif</b>.<br/><br/>Il s'agit probablement d'une <b>erreur de saisie</b> dans vos identifiants de connexion. Veuillez recommencer, en vérifiant que <b>la clé publique est celle de votre compte</b>.\",\n \"FIX_IDENTITY\": \"Le pseudonyme <b>{{uid}}</b> va être publiée à nouveau, en remplacement de l'ancienne publication qui a expirée.<br/></br/><b>Êtes-vous sûr</b> de vouloir continuer ?\",\n \"FIX_MEMBERSHIP\": \"Votre demande d'adhésion comme membre va être renvoyée.<br/></br/><b>Êtes-vous sûr</b> de vouloir continuer ?\",\n \"MEMBERSHIP\": \"Votre demande d'adhésion comme membre va être envoyée.<br/></br/><b>Êtes-vous sûr</b> de vouloir continuer ?\",\n \"RENEW_MEMBERSHIP\": \"Votre adhésion comme membre va être renouvelée.<br/></br/><b>Êtes-vous sûr</b> de vouloir continuer ?\",\n \"REVOKE_IDENTITY\": \"Vous allez <b>revoquer définitivement cette identité</b>.<br/><br/>La clé publique et le pseudonyme associés <b>ne pourront plus jamais être utilisés</b> (pour un compte membre). <br/></br/><b>Êtes-vous sûr</b> de vouloir révoquer définitivement ce compte ?\",\n \"REVOKE_IDENTITY_2\": \"Cette opération est <b>irreversible</b> !<br/><br/>Êtes-vous vraiment sûr de vouloir <b>révoquer définitivement</b> ce compte ?\",\n \"NOT_NEED_RENEW_MEMBERSHIP\": \"Votre adhésion n'a pas besoin d'être renouvelée (elle n'expirera que dans {{membershipExpiresIn|formatDuration}}).<br/></br/><b>Êtes-vous sûr</b> de vouloir renouveler votre adhésion ?\",\n \"SAVE_BEFORE_LEAVE\": \"Voulez-vous <b>sauvegarder vos modifications</b> avant de quitter la page ?\",\n \"SAVE_BEFORE_LEAVE_TITLE\": \"Modifications non enregistrées\",\n \"LOGOUT\": \"Êtes-vous sûr de vouloir vous déconnecter ?\",\n \"USE_FALLBACK_NODE\": \"Nœud <b>{{old}}</b> injoignable ou adresse invalide.<br/><br/>Voulez-vous temporairement utiliser le nœud <b>{{new}}</b> ?\",\n \"ISSUE_524_SEND_LOG\": \"La transaction a été rejetée, à cause d'une anomalie connue (ticket #524) mais <b>non reproduite</b>.<br/><br/>Pour aider les développeurs à corriger cette erreur, <b>acceptez-vous la transmission de vos logs</b> par message ?<br/><small>(aucune donnée confidentielle n'est envoyée)</small>.\"\n },\n \"MODE\": {\n \"DEMO\": {\n \"BADGE\": \"Démo\",\n \"MODE\": \"Mode démonstration\",\n \"FEATURE_NOT_AVAILABLE\": \"Fonctionnalité <b>non disponible</b> sur ce site de démonstration.\",\n \"MODE_HELP\": \"Cesium fonctionne en <b>mode démonstration</b> : la consultation de compte est possible, mais aucune opération ne pourra être réalisée.\",\n \"INSTALL_HELP\": \"Pour des <b>raisons de sécurité</b> nous vous recommandons <b>d'installer</b> votre copie de l'application Cesium. Visitez le site <a href='https://cesium.app'>www.cesium.app</a> pour obtenir de l'aide.\"\n },\n \"READONLY\": {\n \"BADGE\": \"Monit\",\n \"MODE\": \"Mode monitoring\",\n \"MODE_HELP\": \"Cesium fonctionne en <b>mode monitoring</b> : sono disponibili solo le funzionalità di monitoraggio della valuta.\",\n \"INSTALL_HELP\": \"Si vous souhaitez <b>créer un compte portefeuille</b> pour envoyer ou recevoir de la monnaie, nous vous recommandons <b>d'installer votre copie</b> de l'application Cesium. Visitez le site <a href='https://cesium.app'>www.cesium.app</a> pour obtenir de l'aide.\"\n }\n },\n \"DOWNLOAD\": {\n \"POPUP_TITLE\": \"<b>Fichier de révocation</b>\",\n \"POPUP_REVOKE_MESSAGE\": \"Pour sécuriser votre compte, veuillez télécharger le <b>document de révocation de compte</b>. Il vous permettra le cas échéant d'annuler votre compte (en cas d'un vol de compte, d'un changement d'identifiant, d'un compte créé à tort, etc.).<br/><br/><b>Veuillez le stocker en lieu sûr.</b>\"\n },\n \"HELP\": {\n \"TITLE\": \"Aide en ligne\",\n \"JOIN\": {\n \"SECTION\": \"Inscription\",\n \"SALT\": \"L'identifiant secret est très important. Il sert à mélanger le mot de passe, avant qu'il ne serve à calculer la <span class=\\\"text-italic\\\">clé publique</span> de votre compte (son numéro) et la clé secrète pour y accéder.<br/><b>Veillez à bien la mémoriser</b>, car aucun moyen n'est actuellement prévu pour la retrouver en cas de perte.<br/>Par ailleurs, il ne peut pas être modifié sans devoir créer un nouveau compte.<br/><br/>Un bon identifiant secret doit être suffisamment long (au moins 8 caractères) et le plus original possible.\",\n \"PASSWORD\": \"Le mot de passe est très important. Avec l'identifiant secret, il sert à calculer le numéro (la clé publique) de votre compte, et la clé secrète pour y accéder.<br/><b>Veillez à bien le mémoriser</b>, car aucun moyen n'est prévu de le retrouver en cas de perte (sauf à générer un fichier de sauvegarde).<br/>Par ailleurs, il ne peut pas être modifié sans devoir créer un nouveau compte.<br/><br/>Un bon mot de passe contient (idéalement) au moins 8 caractères, dont au moins une majuscule et un chiffre.\",\n \"PSEUDO\": \"Le pseudonyme est utilisé uniquement dans le cas d'inscription comme <span class=\\\"text-italic\\\">membre</span>. Il est toujours associé à un portefeuille (via sa <span class=\\\"text-italic\\\">clé publique</span>).<br/>Il est publié sur le réseau, afin que les autres utilisateurs puisse l'identifier, le certifier ou envoyer de la monnaie sur le compte.<br/>Un pseudonyme doit être unique au sein des membres (<u>actuels</u> et anciens).\"\n },\n \"LOGIN\": {\n \"SECTION\": \"Connexion\",\n \"PUBKEY\": \"Clé publique du trousseau\",\n \"PUBKEY_DEF\": \"La clef publique du trousseau est générée à partir des identifiants saisis (n'importe lesquels), sans pour autant qu'ils correspondent à un compte déjà utilisé.<br/><b>Vérifiez attentivement que la clé publique est celle de votre compte</b>. Dans le cas contraire, vous serez connecté à un compte probablement jamais utilisé, le risque de collision avec un compte existant étant infime.<br/><a href=\\\"https://fr.wikipedia.org/wiki/Cryptographie_asym%C3%A9trique\\\" target=\\\"_system\\\">En savoir plus sur la cryptographie</a> par clé publique.\",\n \"METHOD\": \"Méthodes de connexion\",\n \"METHOD_DEF\": \"Plusieurs options sont disponibles pour vous connecter à un portefeuille :<br/> - La connexion <b>par salage (simple ou avancé)</b> mélange votre mot de passe grâce à l'identifiant secret, pour limiter les tentatives de <a href=\\\"https://fr.wikipedia.org/wiki/Attaque_par_force_brute\\\" target=\\\"_system\\\">piratage par force brute</a> (par exemple à partir de mots connus).<br/> - La connexion <b>par clé publique</b> évite de saisir vos identifiants, qui vous seront demandé seulement le moment venu lors d'une opération sur le compte.<br/> - La connexion <b>par fichier de trousseau</b> va lire les clés (publique et privée) du compte, depuis un fichier, sans besoin de saisir d'identifiants. Plusieurs formats de fichier sont possibles.\"\n },\n \"GLOSSARY\": {\n \"SECTION\": \"Glossaire\",\n \"PUBKEY_DEF\": \"Une clé publique identifie un portefeuille de monnaie, qui peut identifier un membre ou correspondre à un portefeuille anonyme. Dans Cesium la clé publique est calculée (par défaut) grâce à l'identifiant secret et au mot de passe.<br/><a href=\\\"https://fr.wikipedia.org/wiki/Cryptographie_asym%C3%A9trique\\\" target=\\\"_system\\\">En savoir plus sur la cryptographie</a> par clé publique.\",\n \"MEMBER\": \"Membre\",\n \"MEMBER_DEF\": \"Un membre est une personne humaine physique et vivante, désireuse de participer librement à la communauté monétaire. Elle co-produit un dividende universel, suivant une période et un montant tels que définis dans les <span class=\\\"text-italic\\\">règles de la monnaie</span>\",\n \"CURRENCY_RULES\": \"Règles de la monnaie\",\n \"CURRENCY_RULES_DEF\": \"Les règles de la monnaie sont définies une fois pour toutes. Elle fixe le fonctionnement de la monnaie : le calcul du dividende universel, le nombre de certifications nécessaire pour être membre, le nombre de certification maximum qu'un membre peut donner, etc. <a href=\\\"#/app/currency\\\">Voir les règles actuelles</a>.<br/>La non modification des règles dans le temps est possible par l'utilisation d'une <span class=\\\"text-italic\\\">BlockChain</span> qui porte et exécute ces règles, et en vérifie constamment la bonne application.\",\n \"BLOCKCHAIN\": \"Chaîne de blocs (<span class=\\\"text-italic\\\">Blockchain</span>)\",\n \"BLOCKCHAIN_DEF\": \"La BlockChain est un système décentralisé, qui, dans le cas de Duniter, sert à porter et exécuter les <span class=\\\"text-italic\\\">règles de la monnaie</span>.<br/><a href=\\\"https://duniter.org/fr/comprendre/\\\" target=\\\"_system\\\">En savoir plus sur Duniter</a> et le fonctionnement de sa blockchain.\",\n \"UNIVERSAL_DIVIDEND_DEF\": \"Le Dividende Universel (DU) est la quantité de monnaie co-créée par chaque membre, suivant la période et le calcul définis dans les <span class=\\\"text-italic\\\">règles de la monnaie</span>.<br/>A chaque échéance, les membres recoivent sur leur compte la meme quantité de nouvelle monnaie.<br/><br/>Le DU subit une croissance régulière, pour rester juste entre les membres (actuels et à venir), calculée en fonction de l'espérance de vie moyenne, telle que démontré dans la Thérorie Relative de la Monnaie (TRM).<br/><a href=\\\"http://trm.creationmonetaire.info\\\" target=\\\"_system\\\">En savoir plus sur la TRM</a> et les monnaies libres.\",\n \"WOT\": \"Toile de Confiance (TdC)\",\n \"WOT_DEF\": \"La Toile de Confiance est constituée de l'ensemble des membres de la monnaie, et des liens de certification qui les relient.\",\n \"DISTANCE_RULE\": \"Règle de distance\",\n \"DISTANCE_RULE_DEF\": \"La règle de distance de la Toile de Confiance définie <b>une distance maximale à respecter</b> entre un postulant et un nombre minimum de membres référents (ou membres centraux). Cette distance est calculée en utilisant les liens de certification.\"\n },\n \"TIP\": {\n \"MENU_BTN_CURRENCY\": \"Le menu <b>{{'MENU.CURRENCY'|translate}}</b> permet la consultation des <b>règles de la monnaie</b> et de son état.\",\n \"CURRENCY_WOT\": \"Le <b>nombre de membres</b> montre l'importance de la communauté et permet de <b>suivre son évolution</b>.\",\n \"CURRENCY_MASS\": \"Suivez ici la <b>quantité totale de monnaie</b> existante et sa <b>répartition moyenne</b> par membre.<br/><br/>Ceci permet de juger de l'<b>importance d'un montant</b>, vis à vis de ce que <b>possède les autres</b> sur leur compte (en moyenne).\",\n \"CURRENCY_UNIT_RELATIVE\": \"L'unité utilisée (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) signifie que les montants en {{currency|capitalize}} ont été divisés par le <b>Dividende Universel</b> (DU).<br/><br/><small>Cette unité relative est <b>pertinente</b>, car stable malgré la quantitié de monnaie qui augmente en permanence.</small>\",\n \"CURRENCY_CHANGE_UNIT\": \"L'option <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> permet de <b>changer d'unité</b>, pour visualiser les montants <b>directement en {{currency|capitalize}}</b> (plutôt qu'en “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”).\",\n \"CURRENCY_CHANGE_UNIT_TO_RELATIVE\": \"L'option <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> permet de <b>changer d'unité</b>, pour visualiser les montants en “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”, c'est-à-dire relativement au Dividende Universel (le montant co-produit par chaque membre).\",\n \"CURRENCY_RULES\": \"Les <b>règles</b> de la monnaie fixent son fonctionnement <b>exact et prévisible</b>.<br/><br/>Véritable ADN de la monnaie, elles rendent son code monétaire <b>lisible et transparent</b>.\",\n \"MENU_BTN_NETWORK\": \"Le menu <b>{{'MENU.NETWORK'|translate}}</b> permet la consultation de l'état du réseau.\",\n \"NETWORK_BLOCKCHAIN\": \"Toutes les opérations de la monnaie sont enregistrées dans un grand livre de compte <b>public et infalsifiable</b>, appelé aussi <b>chaine de blocs</b> (<em>BlockChain</em> en anglais).\",\n \"NETWORK_PEERS\": \"Les <b>nœuds</b> visibles ici correspondent aux <b>ordinateurs qui actualisent et contrôlent</b> la chaine de blocs.<br/><br/>Plus il y a de nœuds, plus la monnaie a une gestion <b>décentralisée</b> et digne de confiance.\",\n \"NETWORK_PEERS_BLOCK_NUMBER\": \"Ce <b>numéro</b> (en vert) indique le <b>dernier bloc validé</b> pour ce nœud (dernière page écrite dans le grand livre de comptes).<br/><br/>La couleur verte indique que ce bloc est également validé par <b>la plupart des autres nœuds</b>.\",\n \"NETWORK_PEERS_PARTICIPATE\": \"<b>Chaque membre</b>, équipé d'un ordinateur avec Internet, <b>peut participer en ajoutant un nœud</b>. Il suffit d'<b>installer le logiciel Duniter</b> (libre et gratuit). <a href=\\\"{{installDocUrl}}\\\" target=\\\"_system\\\">Voir le manuel d'installation >></a>.\",\n \"MENU_BTN_ACCOUNT\": \"Le menu <b>{{'MENU.ACCOUNT'|translate}}</b> permet d'accéder à la gestion de votre compte.\",\n \"MENU_BTN_ACCOUNT_MEMBER\": \"Consultez ici l'état de votre compte et les informations sur vos certifications.\",\n \"WALLET_CERTIFICATIONS\": \"Cliquez ici pour consulter le détail de vos certifications (reçues et émises).\",\n \"WALLET_RECEIVED_CERTIFICATIONS\": \"Cliquez ici pour consulter le détail de vos <b>certifications reçues</b>.\",\n \"WALLET_GIVEN_CERTIFICATIONS\": \"Cliquez ici pour consulter le détail de vos <b>certifications émises</b>.\",\n \"WALLET_BALANCE\": \"Le <b>solde</b> de votre compte s'affiche ici.\",\n \"WALLET_BALANCE_RELATIVE\": \"{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>L'unité utilisée (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) signifie que le montant en {{currency|capitalize}} a été divisé par le <b>Dividende Universel</b> (DU) co-créé par chaque membre.<br/><br/>Actuellement 1 DU vaut {{currentUD|formatInteger}} {{currency|capitalize}}s.\",\n \"WALLET_BALANCE_CHANGE_UNIT\": \"Vous pourrez <b>changer l'unité</b> d'affichage des montants dans les <b><i class=\\\"icon ion-android-settings\\\"></i> {{'MENU.SETTINGS'|translate}}</b>.<br/><br/>Par exemple pour visualiser les montants <b>directement en {{currency|capitalize}}</b>, plutôt qu'en unité relative.\",\n \"WALLET_PUBKEY\": \"Voici la clé publique de votre compte. Vous pouvez la communiquer à un tiers afin qu'il identifie plus simplement votre compte.\",\n \"WALLET_SEND\": \"Effectuer un paiement en quelques clics.\",\n \"WALLET_SEND_NO_MONEY\": \"Effectuer un paiement en quelques clics.<br/>(Votre solde ne le permet pas encore)\",\n \"WALLET_OPTIONS\": \"Ce bouton permet l'accès aux <b>actions d'adhésion</b> et de sécurité.<br/><br/>N'oubliez pas d'y jeter un oeil !\",\n \"WALLET_RECEIVED_CERTS\": \"S'affichera ici la liste des personnes qui vous ont certifié.\",\n \"WALLET_CERTIFY\": \"Le bouton <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> permet de sélectionner une identité et de la certifier.<br/><br/>Seuls des utilisateurs <b>déjà membres</b> peuvent en certifier d'autres.\",\n \"WALLET_CERT_STOCK\": \"Votre stock de certifications (émises) est limité à <b>{{sigStock}} certifications</b>.<br/><br/>Ce stock se renouvelle avec le temps, au fur et à mesure que les certifications s'invalident.\",\n \"MENU_BTN_WALLETS\": \"Le menu <b>{{'MENU.WALLETS'|translate}}</b> permet d'ajouter des portefeuilles supplémentaires que vous gérer.\",\n \"MENU_BTN_TX\": \"Le menu <b>{{'MENU.TRANSACTIONS'|translate}}</b> permet de consulter votre solde, l'historique vos transactions et d'envoyer un paiement.\",\n \"MENU_BTN_WOT\": \"Le menu <b>{{'MENU.WOT'|translate}}</b> permet de rechercher parmi les <b>utilisateurs</b> de la monnaie (membres ou non).\",\n \"WOT_SEARCH_TEXT_XS\": \"Pour rechercher dans l'annuaire, tapez les <b>premières lettres d'un pseudonyme</b> (ou d'une clé publique).<br/><br/>La recherche se lancera automatiquement.\",\n \"WOT_SEARCH_TEXT\": \"Pour rechercher dans l'annuaire, tapez les <b>premières lettres d'un pseudonyme</b> (ou d'une clé publique). <br/><br/>Appuyer ensuite sur <b>Entrée</b> pour lancer la recherche.\",\n \"WOT_SEARCH_RESULT\": \"Visualisez la fiche détaillée simplement en <b>cliquant</b> sur une ligne.\",\n \"WOT_VIEW_CERTIFICATIONS\": \"La ligne <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> montre combien de membres ont validé cette identité.<br/><br/>Ces certifications attestent que le compte appartient à <b>une personne humaine vivante</b> n'ayant <b>aucun autre compte membre</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_COUNT\": \"Il faut au moins <b>{{sigQty}} certifications</b> pour devenir membre et recevoir le <b>Dividende Universel</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_CLICK\": \"Un clic ici permet d'ouvrir <b>la liste de toutes les certifications</b> de l'identité (reçues et émises).\",\n \"WOT_VIEW_CERTIFY\": \"Le bouton <b>{{'WOT.BTN_CERTIFY'|translate}}</b> permet d'ajouter votre certification à cette identité.\",\n \"CERTIFY_RULES\": \"<b>Attention :</b> Ne certifiez que des <b>personnes physiques vivantes</b>, ne possédant aucun autre compte membre.<br/><br/>La sécurité de la monnaie dépend de la vigilance de chacun !\",\n \"MENU_BTN_SETTINGS\": \"Les <b>{{'MENU.SETTINGS'|translate}}</b> vous permettront de configurer l'application.\",\n \"HEADER_BAR_BTN_PROFILE\": \"Cliquez ici pour accéder à votre <b>profil utilisateur.</b>\",\n \"SETTINGS_CHANGE_UNIT\": \"Vous pourrez <b>changer d'unité d'affichage</b> des montants en cliquant ci-dessus.<br/><br/>- Désactivez l'option pour un affichage des montants en {{currency|capitalize}}.<br/>- Activez l'option pour un affichage relatif en {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (tous les montants seront <b>divisés</b> par le Dividende Universel courant).\",\n \"END_LOGIN\": \"Cette visite guidée est <b>terminée</b> !<br/><br/>Bonne continuation à vous, dans le nouveau monde de l'<b>économie libre</b> !\",\n \"END_NOT_LOGIN\": \"Cette visite guidée est <b>terminée</b> !<br/><br/>Si vous souhaitez rejoindre la monnaie {{currency|capitalize}}, il vous suffira de cliquer sur <b>{{'LOGIN.CREATE_FREE_ACCOUNT'|translate}}</b> ci-dessous.\",\n \"END_READONLY\": \"Cette visite guidée est <b>terminée</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}.\"\n }\n },\n \"API\" :{\n \"COMMON\": {\n \"LINK_DOC\": \"Documentation API\",\n \"LINK_DOC_HELP\": \"Documentation pour les développeurs\",\n \"LINK_STANDARD_APP\": \"Version classique\",\n \"LINK_STANDARD_APP_HELP\": \"Ouvrir la version classique de {{'COMMON.APP_NAME'|translate}}\",\n \"CONNECTION_ERROR\": \"Nœud <b>{{server}}</b> injoignable ou adresse invalide.<br/><br/>Vérifiez votre connexion Internet, ou contactez l'administrateur du site.\"\n },\n \"HOME\": {\n \"TITLE\": \"Documentation API {{'COMMON.APP_NAME'|translate}}\",\n \"MESSAGE\": \"Bienvenue dans la <b>documentation de l'API</b> {{'COMMON.APP_NAME'|translate}}.<br/>Connectez vos sites web à <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> très simplement !\",\n \"MESSAGE_SHORT\": \"Connectez vos sites à <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> très simplement !\",\n \"DOC_HEADER\": \"Services disponibles :\"\n },\n \"TRANSFER\": {\n \"TITLE\": \"{{'COMMON.APP_NAME'|translate}} - Paiement en ligne\",\n \"TITLE_SHORT\": \"Paiement en ligne\",\n \"SUMMARY\": \"Récapitulatif du paiement :\",\n \"AMOUNT\": \"Montant :\",\n \"AMOUNTS_HELP\": \"Veuillez choisir le montant :\",\n \"NAME\": \"Nom :\",\n \"PUBKEY\": \"Clé publique du destinataire :\",\n \"COMMENT\": \"Référence de l'opération :\",\n \"NODE\": \"Adresse du nœud :\",\n \"DEMO\": {\n \"SALT\": \"demo\",\n \"PASSWORD\": \"demo\",\n \"PUBKEY\": \"3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1\",\n \"HELP\": \"<b>Mode démonstration</b> : Aucun paiement ne sera réellement envoyé pendant cette simulation.<br/>Veuillez utiliser les identifiants : <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>\",\n \"BAD_CREDENTIALS\": \"Vérifiez votre saisie.<br/>En mode démonstration, les identifiants sont : {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}\"\n },\n \"INFO\": {\n \"SUCCESS_REDIRECTING_WITH_NAME\": \"Paiement envoyé.<br/>Redirection vers <b>{{name}}</b>...\",\n \"SUCCESS_REDIRECTING\": \"Paiement envoyé.<br/>Redirection vers le site du vendeur...\",\n \"CANCEL_REDIRECTING_WITH_NAME\": \"Paiement annulé.<br/>Redirection vers <b>{{name}}</b>...\",\n \"CANCEL_REDIRECTING\": \"Paiement annulé.<br/>Redirection vers le site du vendeur...\"\n },\n \"ERROR\": {\n \"TRANSFER_FAILED\": \"Échec du paiement\"\n }\n },\n \"DOC\": {\n \"DESCRIPTION_DIVIDER\": \"Description\",\n \"URL_DIVIDER\": \"Adresse d'appel\",\n \"PARAMETERS_DIVIDER\": \"Paramètres\",\n \"AVAILABLE_PARAMETERS\": \"Voici la liste des paramètres possibles :\",\n \"DEMO_DIVIDER\": \"Tester\",\n \"DEMO_HELP\": \"Pour tester ce service, cliquez sur le bouton ci-contre. Le résultat s'affichera en dessous.\",\n \"DEMO_RESULT\": \"Résultat retourné par l'appel :\",\n \"DEMO_RESULT_PEER\": \"Adresse du nœud utilisé :\",\n \"DEMO_SUCCEED\": \"<i class=\\\"icon ion-checkmark\\\"></i> Succès !\",\n \"DEMO_CANCELLED\": \"<i class=\\\"icon ion-close\\\"></i> Annulé par l'utilisateur\",\n \"INTEGRATE_DIVIDER\": \"Intégrer\",\n \"INTEGRATE_CODE\": \"Code :\",\n \"INTEGRATE_RESULT\": \"Prévisualisation du résultat :\",\n \"INTEGRATE_PARAMETERS\": \"Paramètres\",\n \"TRANSFER\": {\n \"TITLE\": \"Paiements\",\n \"DESCRIPTION\": \"Depuis un site (ex: vente en ligne) vous pouvez déléguer le paiement en monnaie libre à Cesium API. Pour cela, il vous suffit de déclencher l'ouverture d'une page sur l'adresse suivante :\",\n \"PARAM_PUBKEY\": \"Clé publique du destinataire\",\n \"PARAM_PUBKEY_HELP\": \"Clé publique du destinataire (obligatoire)\",\n \"PARAM_AMOUNT\": \"Montant\",\n \"PARAM_AMOUNT_HELP\": \"Montant de la transaction (obligatoire). Valeurs multiples autorisées, en utilisant un séparateur (point-virgule, barre verticale ou espace).\",\n \"PARAM_COMMENT\": \"Référence (ou commentaire)\",\n \"PARAM_COMMENT_HELP\": \"Référence ou commentaire. Vous permettra par exemple d'identifier le paiement dans la BlockChain.\",\n \"PARAM_NAME\": \"Nom (du destinataire ou du site web)\",\n \"PARAM_NAME_HELP\": \"Le nom du destinataire, ou du site web appelant. Cela peut être un nom lisible (\\\"Mon site en ligne\\\"), ou encore une pseudo-adresse web (\\\"MonSite.com\\\").\",\n \"PARAM_REDIRECT_URL\": \"Adresse web de redirection\",\n \"PARAM_REDIRECT_URL_HELP\": \"Adresse web (URL) de redirection, appelé quand le paiement a été envoyé. Peut contenir les chaînes suivantes, qui seront remplacées par les valeurs de la transaction : \\\"{tx}\\\", \\\"{hash}\\\", \\\"{comment}\\\", \\\"{amount}\\\", \\\"{pubkey}\\\" et \\\"{node}\\\".\",\n \"PARAM_CANCEL_URL\": \"Adresse web d'annulation\",\n \"PARAM_CANCEL_URL_HELP\": \"Adresse web (URL) en cas d'annulation du paiement, par l'utilisateur. Peut contenir les chaînes suivantes, qui seront remplacées dynamiquement : \\\"{comment}\\\", \\\"{amount}\\\" et \\\"{pubkey}\\\".\",\n \"PARAM_PREFERRED_NODE\": \"Adresse du nœud préféré\",\n \"PARAM_PREFERRED_NODE_HELP\": \"Adresse (URL) du nœud Duniter à utiliser de préférence (\\\"g1.domaine.com:443\\\" ou \\\"https://g1.domaine.com\\\").\",\n \"EXAMPLES_HELP\": \"Voici des exemples d'intégration :\",\n \"EXAMPLE_BUTTON\": \"Bouton HTML\",\n \"EXAMPLE_BUTTON_DEFAULT_TEXT\": \"Payer en {{currency|currencySymbol}}\",\n \"EXAMPLE_BUTTON_DEFAULT_STYLE\": \"Style personnalisé\",\n \"EXAMPLE_BUTTON_TEXT_HELP\": \"Texte du bouton\",\n \"EXAMPLE_BUTTON_BG_COLOR\": \"Couleur du fond\",\n \"EXAMPLE_BUTTON_BG_COLOR_HELP\": \"Exemple : #fbc14c, black, lightgrey, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_FONT_COLOR\": \"Couleur du texte\",\n \"EXAMPLE_BUTTON_FONT_COLOR_HELP\": \"Exemple : black, orange, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_TEXT_ICON\": \"Icône\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH\": \"Largeur\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH_HELP\": \"Exemple : 200px, 50%\",\n \"EXAMPLE_BUTTON_ICON_NONE\": \"Aucune\",\n \"EXAMPLE_BUTTON_ICON_DUNITER\": \"Logo Duniter\",\n \"EXAMPLE_BUTTON_ICON_CESIUM\": \"Logo Cesium\",\n \"EXAMPLE_BUTTON_ICON_G1_COLOR\": \"Logo Ğ1\",\n \"EXAMPLE_BUTTON_ICON_G1_BLACK\": \"Logo Ğ1 (noir)\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"it-IT\", {\n \"COMMON\": {\n \"APP_NAME\": \"Cesium\",\n \"APP_VERSION\": \"v{{version}}\",\n \"APP_BUILD\": \"build {{build}}\",\n \"PUBKEY\": \"Chiave privata\",\n \"MEMBER\": \"Membro\",\n \"BLOCK\" : \"Blocco\",\n \"BTN_OK\": \"OK\",\n \"BTN_YES\": \"Si\",\n \"BTN_NO\": \"No\",\n \"BTN_SEND\": \"Inviare\",\n \"BTN_SEND_MONEY\": \"Trasferire soldi\",\n \"BTN_SEND_MONEY_SHORT\": \"Trasferire\",\n \"BTN_SAVE\": \"Salvare\",\n \"BTN_YES_SAVE\": \"Si, salvare\",\n \"BTN_YES_CONTINUE\": \"Si, continuare\",\n \"BTN_SHOW\": \"Mostrare\",\n \"BTN_SHOW_PUBKEY\": \"Mostrare chiave pubblica\",\n \"BTN_RELATIVE_UNIT\": \"Mostra importi in DU?\",\n \"BTN_BACK\": \"Indietro\",\n \"BTN_NEXT\": \"Avanti\",\n \"BTN_IMPORT\": \"Importazione\",\n \"BTN_CANCEL\": \"Cancellare\",\n \"BTN_CLOSE\": \"Chiudere\",\n \"BTN_LATER\": \"Più tardi\",\n \"BTN_LOGIN\": \"Accedi\",\n \"BTN_LOGOUT\": \"Log out\",\n \"BTN_ADD_ACCOUNT\": \"Nuovo conto\",\n \"BTN_SHARE\": \"Condividere\",\n \"BTN_EDIT\": \"Modificare\",\n \"BTN_DELETE\": \"Eliminare\",\n \"BTN_ADD\": \"Aggiungere\",\n \"BTN_SEARCH\": \"Cercare\",\n \"BTN_REFRESH\": \"Aggiornare\",\n \"BTN_RETRY\": \"Riprovare\",\n \"BTN_START\": \"Iniziare\",\n \"BTN_CONTINUE\": \"Continuare\",\n \"BTN_CREATE\": \"Creare\",\n \"BTN_UNDERSTOOD\": \"Ho capito\",\n \"BTN_OPTIONS\": \"Opzioni\",\n \"BTN_HELP_TOUR\": \"Mostrami le funzionalità\",\n \"BTN_HELP_TOUR_SCREEN\": \"Scoprire questo schermo\",\n \"BTN_DOWNLOAD\": \"Scaricare\",\n \"BTN_DOWNLOAD_ACCOUNT_STATEMENT\": \"Scaricare estratto conto\",\n \"BTN_MODIFY\": \"Modificare\",\n \"CHOOSE_FILE\": \"Trascini un file <br/>o cliccare per selezionare\",\n \"DAYS\": \"giorni\",\n \"NO_ACCOUNT_QUESTION\": \"Non sei ancora membro? Registrati subito!\",\n \"SEARCH_NO_RESULT\": \"Nessun risultato trovato\",\n \"LOADING\": \"Caricando...\",\n \"LOADING_WAIT\": \"Caricando...<br/><small>(Cesium interroga dal nodo peer Duniter)</small>\",\n \"SEARCHING\": \"Cercando...\",\n \"FROM\": \"Da\",\n \"TO\": \"A\",\n \"COPY\": \"Copiare\",\n \"LANGUAGE\": \"Lingua\",\n \"UNIVERSAL_DIVIDEND\": \"Dividendo universale\",\n \"UD\": \"UD\",\n \"DATE_PATTERN\": \"DD/MM/YYYY HH:mm\",\n \"DATE_FILE_PATTERN\": \"YYYY-MM-DD\",\n \"DATE_SHORT_PATTERN\": \"DD/MM/YY\",\n \"DATE_MONTH_YEAR_PATTERN\": \"MM/YYYY\",\n \"EMPTY_PARENTHESIS\": \"(empty)\",\n \"UID\": \"Pseudonimo\",\n \"ENABLE\": \"Attivato\",\n \"DISABLE\": \"Disattivato\",\n \"RESULTS_LIST\": \"Risultati:\",\n \"RESULTS_COUNT\": \"{{count}} risultati\",\n \"EXECUTION_TIME\": \"eeseguit in {{duration|formatDurationMs}}\",\n \"SHOW_VALUES\": \"Mostrare valori in modo trasparente?\",\n \"POPOVER_ACTIONS_TITLE\": \"Opzioni\",\n \"POPOVER_FILTER_TITLE\": \"Filtri\",\n \"SHOW_MORE\": \"Mostrare di più\",\n \"SHOW_MORE_COUNT\": \"(limite attuale di {{limit}})\",\n \"POPOVER_SHARE\": {\n \"TITLE\": \"Condividere\",\n \"SHARE_ON_TWITTER\": \"Condividere su Twitter\",\n \"SHARE_ON_FACEBOOK\": \"Condividere su Facebook\",\n \"SHARE_ON_DIASPORA\": \"Condividere su Diaspora*\",\n \"SHARE_ON_GOOGLEPLUS\":\"Condividere su Google+\"\n },\n \"FILE\": {\n \"DATE\" : \"Data:\",\n \"TYPE\" : \"Tipo:\",\n \"SIZE\": \"Dimensioni del file:\",\n \"VALIDATING\": \"Validazione in corso...\"\n }\n },\n \"SYSTEM\": {\n \"PICTURE_CHOOSE_TYPE\": \"Scegliere un file:\",\n \"BTN_PICTURE_GALLERY\": \"Galleria\",\n \"BTN_PICTURE_CAMERA\": \"<b>Camera</b>\"\n },\n \"MENU\": {\n \"HOME\": \"Home\",\n \"WOT\": \"Annuario\",\n \"CURRENCY\": \"Moneta\",\n \"ACCOUNT\": \"Mio conto\",\n \"WALLETS\": \"I miei portafogli\",\n \"SETTINGS\": \"Impostazioni\",\n \"NETWORK\": \"Rete\",\n \"TRANSACTIONS\": \"Miei pagamenti\"\n },\n \"ABOUT\": {\n \"TITLE\": \"A proposito\",\n \"LICENSE\": \"<b>Free/libre software</b> (License GNU AGPLv3).\",\n \"CODE\": \"Codice sorgente:\",\n \"OFFICIAL_WEB_SITE\": \"Sito ufficiale:\",\n \"DEVELOPERS\": \"Sviluppatori:\",\n \"FORUM\": \"Forum:\",\n \"PLEASE_REPORT_ISSUE\": \"Non esitate a parlarci delle anomalie riscontrate\",\n \"REPORT_ISSUE\": \"Segnalare un bug\"\n },\n \"HOME\": {\n \"TITLE\": \"Cesium\",\n \"WELCOME\": \"Benvenuti nell'Cesium App!\",\n \"WELCOME_READONLY\": \"Benvenuti nell'Cesium <span class='badge badge-balanced'>Monit</span>!\",\n \"MESSAGE\": \"Scambiate in moneta libera {{currency|abbreviate}}\",\n \"MESSAGE_READONLY\": \"Monitoraggio in tempo reale di moneta libera {{currency|abbreviate}}\",\n \"BTN_CURRENCY\": \"Esplorare la moneta {{currency|abbreviate}}\",\n \"BTN_ABOUT\": \"a proposito\",\n \"BTN_HELP\": \"Aiuto\",\n \"BTN_NETWORK\": \"Stato della rete\",\n \"FREE_SOFTWARE\": \"Free software\",\n \"FORK_ME\": \"Fork me!\",\n \"SHOW_LICENSE\": \"Mostra licenza\",\n \"REPORT_ISSUE\": \"Segnalare un bug\",\n \"NOT_YOUR_ACCOUNT_QUESTION\" : \"Non sei proprietario del conto <b><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}</b>?\",\n \"BTN_CHANGE_ACCOUNT\": \"Disconettere questo conto\",\n \"CONNECTION_ERROR\": \"Peer <b>{{server}}</b> irraggiungibile o indirizzo invalido. <br/><br/> Verifica tua connessione or cambia nodo. <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">nell impostazioni. </a>.\",\n \"SHOW_ALL_FEED\": \"Mostra tutto\",\n \"READ_MORE\": \"Leggi di più\",\n \"FEED_SOURCE\": \"Fonte\"\n },\n \"SETTINGS\": {\n \"TITLE\": \"Impostazioni\",\n \"DISPLAY_DIVIDER\": \"Schermo\",\n \"STORAGE_DIVIDER\": \"Conservazione\",\n \"NETWORK_SETTINGS\": \"Rete\",\n \"PEER\": \"Indirizzo peer Duniter\",\n \"PEER_SHORT\": \"Indirizzo peer\",\n \"PEER_CHANGED_TEMPORARY\": \"Indirizzo usato per un tempo determinato\",\n \"PERSIST_CACHE\": \"Conserva i dati di navigazione (sperimentale)\",\n \"USE_LOCAL_STORAGE\": \"Abilitare local storage\",\n \"USE_LOCAL_STORAGE_HELP\": \"Permette di salvare tue impostazioni\",\n \"ENABLE_HELPTIP\": \"Abilitare consigli dinamici\",\n \"ENABLE_UI_EFFECTS\": \"Abilitare effetti visivi\",\n \"HISTORY_SETTINGS\": \"Mio conto\",\n \"DISPLAY_UD_HISTORY\": \"Mostrare dividendi prodotti?\",\n \"AUTHENTICATION_SETTINGS\": \"Autenticazione\",\n \"KEEP_AUTH\": \"Scadenza dell'autenticazione\",\n \"KEEP_AUTH_SHORT\": \"Scadenza\",\n \"KEEP_AUTH_HELP\": \"Definire quando l'autenticazione verrà eliminata dalla memoria.\",\n \"KEEP_AUTH_OPTION\": {\n \"NEVER\": \"Dopo ogni operazione\",\n \"SECONDS\": \"Dopo {{value}}s d'inattività\",\n \"MINUTE\": \"Dopo{{value}}min d'inattività\",\n \"MINUTES\": \"Dopo {{value}}min d'inattività\",\n \"HOUR\": \"Dopo {{value}}h d'inattività\",\n \"ALWAYS\": \"Alla fine della sessione\"\n },\n \"REMEMBER_ME\": \"Ricordarsi di me?\",\n \"REMEMBER_ME_HELP\": \"Rimanere identificato/a da una sessione all'altra, conservando la chiave localmente.\",\n \"PLUGINS_SETTINGS\": \"Estensioni\",\n \"BTN_RESET\": \"Ripristini valori predefiniti\",\n \"EXPERT_MODE\": \"Abilitare modlità eseperto\",\n \"EXPERT_MODE_HELP\": \"Permette di vedere più dettagli\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Peer Duniter\",\n \"HOST\" : \"Indirizzo\",\n \"HOST_HELP\": \"Indirizzo: server:port\",\n \"USE_SSL\" : \"Securizzato?\",\n \"USE_SSL_HELP\" : \"(SSL Encryption)\",\n \"BTN_SHOW_LIST\" : \"Lista dei peers\"\n }\n },\n \"BLOCKCHAIN\": {\n \"HASH\": \"Hash: {{hash}}\",\n \"VIEW\": {\n \"HEADER_TITLE\": \"Blocco #{{number}}-{{hash|formatHash}}\",\n \"TITLE_CURRENT\": \"Blocco attuale\",\n \"TITLE\": \"Blocco #{{number|formatInteger}}\",\n \"COMPUTED_BY\": \"Calcolato da\",\n \"SHOW_RAW\": \"Mostrare dati grezzi\",\n \"TECHNICAL_DIVIDER\": \"Informazioni tecniche\",\n \"VERSION\": \"Versione di formatto\",\n \"HASH\": \"Hash calcolato\",\n \"UNIVERSAL_DIVIDEND_HELP\": \"Moneta co-prodotta da ciasciun dei {{membersCount}} membri\",\n \"EMPTY\": \"Nessun dati in questo blocco\",\n \"POW_MIN\": \"Difficoltà minimale\",\n \"POW_MIN_HELP\": \"Difficoltà imposta nel calcolo del hash\",\n \"DATA_DIVIDER\": \"Dati\",\n \"IDENTITIES_COUNT\": \"Nuove identità\",\n \"JOINERS_COUNT\": \"Nuovi membri\",\n \"ACTIVES_COUNT\": \"Rinnovi\",\n \"ACTIVES_COUNT_HELP\": \"Membri che hanno rinnovato la loro presenza nella rete\",\n \"LEAVERS_COUNT\": \"\",\n \"LEAVERS_COUNT_HELP\": \"Membri che si sono fatti escludere dalla rete\",\n \"EXCLUDED_COUNT\": \"Membri esclusi\",\n \"EXCLUDED_COUNT_HELP\": \"Vecchi membri, esclusi per certificazione non rinnovata o soglia di certificazioni non raggiunta.\",\n \"REVOKED_COUNT\": \"Identità revocate\",\n \"REVOKED_COUNT_HELP\": \"Può essere che questi conti non siano più attivi\",\n \"TX_COUNT\": \"Transazioni\",\n \"CERT_COUNT\": \"Certificazioni\",\n \"TX_TO_HIMSELF\": \"Cambio\",\n \"TX_OUTPUT_UNLOCK_CONDITIONS\": \"Sbloccare condizioni\",\n \"TX_OUTPUT_OPERATOR\": {\n \"AND\": \"e\",\n \"OR\": \"o\"\n },\n \"TX_OUTPUT_FUNCTION\": {\n \"SIG\": \"<b>Firma</b> della chive pubblica\",\n \"XHX\": \"<b>Password</b>, incluso SHA256 =\",\n \"CSV\": \"Bloccato per\",\n \"CLTV\": \"Bloccato fino a\"\n }\n },\n \"LOOKUP\": {\n \"TITLE\": \"Blocchi\",\n \"NO_BLOCK\": \"Nessun blocco\",\n \"LAST_BLOCKS\": \"Ultimi blocchi:\",\n \"BTN_COMPACT\": \"Compact\"\n }\n },\n \"CURRENCY\": {\n \"VIEW\": {\n \"TITLE\": \"Moneta\",\n \"TAB_CURRENCY\": \"Moneta\",\n \"TAB_WOT\": \"Web of trust\",\n \"TAB_NETWORK\": \"Rete\",\n \"TAB_BLOCKS\": \"Blocchi\",\n \"CURRENCY_SHORT_DESCRIPTION\": \"{{currency|capitalize}} è <b>una moneta libera</b>, {{firstBlockTime | formatFromNow}}. La rete comprende <b>{{N}} membri </b>, che produccono e ricevono un <a ng-click=\\\"showHelpModal('ud')\\\">Dividendo Universale</a> (DU), ogni {{dt | formatPeriod}}.\",\n \"NETWORK_RULES_DIVIDER\": \"Regole della rete\",\n \"CURRENCY_NAME\": \"Nome della moneta\",\n \"MEMBERS\": \"Numero di membri\",\n \"MEMBERS_VARIATION\": \"Variazione da {{duration|formatDuration}} (dall' ultimo UD)\",\n \"MONEY_DIVIDER\": \"Moneta\",\n \"MASS\": \"Massa monetaria\",\n \"SHARE\": \"Quantità a testa\",\n \"UD\": \"Dividendo universale\",\n \"C_ACTUAL\": \"Crescita attuale\",\n \"MEDIAN_TIME\": \"Current blockchain time\",\n \"POW_MIN\": \"Difficoltà commune\",\n \"MONEY_RULES_DIVIDER\": \"Regole della moneta\",\n \"C_RULE\": \"Obbietivo teorico di crescità\",\n \"UD_RULE\": \"Dividendo universale (formula)\",\n \"DT_REEVAL\": \"Periodo tra due re-evaluazioni del UD\",\n \"REEVAL_SYMBOL\": \"reeval\",\n \"DT_REEVAL_VALUE\": \"Ogni <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})\",\n \"UD_REEVAL_TIME0\": \"Data della prima re-evaluzione del UD\",\n \"SIG_QTY_RULE\": \"Numero di certificazioni requisiti per diventare membro\",\n \"SIG_STOCK\": \"Numero massimo di certificazioni inviate da un membro\",\n \"SIG_PERIOD\": \"Tempo minimo tra 2 certificazioni inviate da un unico membro.\",\n \"SIG_WINDOW\": \"Periodo massimo prima che una certificazione venga studiata\",\n \"SIG_VALIDITY\": \"Durata di vita di una certificazione che è state presa in conto\",\n \"MS_WINDOW\": \"Periodo massimo prima che una certificazione pendente sia validata\",\n \"MS_VALIDITY\": \"Durata di vita di un'adesione che è state presa in conto\",\n \"STEP_MAX\": \"Distanza massima tra un nuovo membro e ogni membro referente.\",\n \"WOT_RULES_DIVIDER\": \"Regole della Web of Trust\",\n \"SENTRIES\": \"Numero di certificazioni (date <b>e</b> ricevute) per diventare membro referente \",\n \"SENTRIES_FORMULA\": \"Numero di certificazioni necessarie per diventare membro (formula)\",\n \"XPERCENT\":\"Percentaggio minimino di membri referenti per rispettare la regola di distanza tra i membri\",\n \"AVG_GEN_TIME\": \"Tempo medio tra due blocchi\",\n \"CURRENT\": \"attuale\",\n \"MATH_CEILING\": \"CEILING\",\n \"DISPLAY_ALL_RULES\": \"Mostrare tutte le regole?\",\n \"BTN_SHOW_LICENSE\": \"Mostrare licenza\",\n \"WOT_DIVIDER\": \"Web of trust\"\n },\n \"LICENSE\": {\n \"TITLE\": \"Licensa attuale\",\n \"BTN_DOWNLOAD\": \"Scaricare il file\",\n \"NO_LICENSE_FILE\": \"File di licenza non trovato .\"\n }\n },\n \"NETWORK\": {\n \"VIEW\": {\n \"MEDIAN_TIME\": \"Blockchain time\",\n \"LOADING_PEERS\": \"Caricando peers...\",\n \"NODE_ADDRESS\": \"Indirizzo del peer\",\n \"SOFTWARE\": \"Software\",\n \"WARN_PRE_RELEASE\": \"Pre-versione (ultima versione stabile: <b>{{version}}</b>)\",\n \"WARN_NEW_RELEASE\": \"Versione <b>{{version}}</b> disponibile\",\n \"WS2PID\": \"Identificativo :\",\n \"PRIVATE_ACCESS\": \"Accesso privato\",\n \"POW_PREFIX\": \"Prefisso Prova di Lavoro :\",\n \"ENDPOINTS\": {\n \"BMAS\": \"Endpoint sicuro (SSL)\",\n \"BMATOR\": \"Interfaccia rete TOR\",\n \"WS2P\": \"Interfaccia WS2P\",\n \"ES_USER_API\": \"Cesium+ data node\"\n }\n },\n \"INFO\": {\n \"ONLY_SSL_PEERS\": \"I nodi non-SSL hanno un display semplificato perche Cesium funziona in modalità HTTPS.\"\n }\n },\n \"PEER\": {\n \"PEERS\": \"Peers-Nodi\",\n \"SIGNED_ON_BLOCK\": \"Firmato nel blocco\",\n \"MIRROR\": \"Specchio\",\n \"MIRRORS\": \"Specchio\",\n \"MIRROR_PEERS\": \"Peers specchio\",\n \"PEER_LIST\" : \"Lista dei peers\",\n \"MEMBERS\" : \"Membri\",\n \"MEMBER_PEERS\" : \"Peers membri\",\n \"ALL_PEERS\" : \"Tutti i peers\",\n \"DIFFICULTY\" : \"Difficoltà\",\n \"API\" : \"API\",\n \"CURRENT_BLOCK\" : \"Blocco #\",\n \"POPOVER_FILTER_TITLE\": \"Filtro\",\n \"OFFLINE\": \"Sconessi\",\n \"OFFLINE_PEERS\": \"Peers sconessi\",\n \"BTN_SHOW_PEER\": \"Mostrare peer\",\n \"VIEW\": {\n \"TITLE\": \"Peer\",\n \"OWNER\": \"Proprietà di \",\n \"SHOW_RAW_PEERING\": \"Vedere il documento di peering\",\n \"SHOW_RAW_CURRENT_BLOCK\": \"Vedere l'utimo blocco (formatto grezzo)\",\n \"LAST_BLOCKS\": \"Ultimi blocchi\",\n \"KNOWN_PEERS\": \"Peers conosciuti :\",\n \"GENERAL_DIVIDER\": \"Informazioni generali\",\n \"ERROR\": {\n \"LOADING_TOR_NODE_ERROR\": \"Impossibile ottenere i dati del peer, periodo di attesa scaduto.\",\n \"LOADING_NODE_ERROR\": \"Impossibile ottenere i dati del peer\"\n }\n }\n },\n \"WOT\": {\n \"SEARCH_HELP\": \"Cercare (membro o chiave pubblica)\",\n \"SEARCH_INIT_PHASE_WARNING\": \"La ricerca per le certificazioni pendenti <b>può essere lunga</b> durante la fase di pre-certificazione. La preghiamo di attendere...\",\n \"REGISTERED_SINCE\": \"Certificato/a dal\",\n \"REGISTERED_SINCE_BLOCK\": \"Certificato/a dal blocco #\",\n \"NO_CERTIFICATION\": \"Nessuna certificazione valida\",\n \"NO_GIVEN_CERTIFICATION\": \"Nessuna certificazione data\",\n \"NOT_MEMBER_PARENTHESIS\": \"(non-membro)\",\n \"IDENTITY_REVOKED_PARENTHESIS\": \"(identità revocata)\",\n \"MEMBER_PENDING_REVOCATION_PARENTHESIS\": \"(Cancellazione dell'identità pendente)\",\n \"EXPIRE_IN\": \"Scade\",\n \"NOT_WRITTEN_EXPIRE_IN\": \"Scadenza <br/> \",\n \"EXPIRED\": \"Scaduto\",\n \"PSEUDO\": \"Pseudonimo\",\n \"SIGNED_ON_BLOCK\": \"Emessa nel blocco #{{block}}\",\n \"WRITTEN_ON_BLOCK\": \"Scritta nel blocco #{{block}}\",\n \"GENERAL_DIVIDER\": \"Informazioni generali\",\n \"NOT_MEMBER_ACCOUNT\": \"Conto non-membro\",\n \"NOT_MEMBER_ACCOUNT_HELP\": \"Questo è un semplice portafoglio osservatore, senza richiesta di certificazione emessa.\",\n \"TECHNICAL_DIVIDER\": \"Dati tecnici\",\n \"BTN_CERTIFY\": \"Certificare\",\n \"BTN_YES_CERTIFY\": \"Si, certificare\",\n \"BTN_SELECT_AND_CERTIFY\": \"Nuova certificazione\",\n \"ACCOUNT_OPERATIONS\": \"Operazioni sul conto\",\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"Identità {{title}}\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Annuario\",\n \"NEWCOMERS\": \"Nuovi membri:\",\n \"NEWCOMERS_COUNT\": \"{{count}} membri\",\n \"PENDING\": \"Registrazioni pendenti\",\n \"PENDING_COUNT\": \"{{count}} inscrizioni pendenti\",\n \"REGISTERED\": \"Registrato {{sigDate | formatFromNow}}\",\n \"MEMBER_FROM\": \"Membro dal {{memberDate|medianFromNowShort}}\",\n \"BTN_NEWCOMERS\": \"Ultimi membri\",\n \"BTN_PENDING\": \"Registrazioni pendenti\",\n \"SHOW_MORE\": \"Vedere di più\",\n \"SHOW_MORE_COUNT\": \"(limite attuale di {{limit}})\",\n \"NO_PENDING\": \"Nessuna certificazione pendente.\",\n \"NO_NEWCOMERS\": \"Nessun membro.\"\n },\n \"CONTACTS\": {\n \"TITLE\": \"Contatti\"\n },\n \"MODAL\": {\n \"TITLE\": \"Ricerca\"\n },\n \"CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certificazioni\",\n \"SUMMARY\": \"Certificazioni ricevute\",\n \"LIST\": \"Dettagli delle certificazioni ricevute\",\n \"PENDING_LIST\": \"Certificazioni pendenti\",\n \"RECEIVED\": \"Certificazioni ricevute\",\n \"RECEIVED_BY\": \"Certifications ricevute da {{uid}}\",\n \"ERROR\": \"Certificazioni ricevute per errore\",\n \"SENTRY_MEMBER\": \"Membro referente\"\n },\n \"OPERATIONS\": {\n \"TITLE\": \"{{uid}} - Operazioni\"\n },\n \"GIVEN_CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certificazioni inviate\",\n \"SUMMARY\": \"Certificazioni inviate\",\n \"LIST\": \"Dettagli delle certificazioni inviate\",\n \"PENDING_LIST\": \"Certificazioni \",\n \"SENT\": \"Certificazioni inviate\",\n \"SENT_BY\": \"Certificazioni inviate da {{uid}}\",\n \"ERROR\": \"Certificazioni inviate per errore\"\n }\n },\n \"LOGIN\": {\n \"TITLE\": \"<i class=\\\"icon ion-log-in\\\"></i> Accedi\",\n \"SCRYPT_FORM_HELP\": \"Accedi con tuoi dati <br> Ricordati di verificare che stai utilizzando la chiave del tuo conto.\",\n \"PUBKEY_FORM_HELP\": \"Scrivi qui la tua chiave privata:\",\n \"FILE_FORM_HELP\": \"Scegliere un portachiavi da utilizzare:\",\n \"SCAN_FORM_HELP\": \"Scansiona il codice QR di un portafoglio.\",\n \"SALT\": \"Identificativo segreto\",\n \"SALT_HELP\": \"Identificativo segreto\",\n \"SHOW_SALT\": \"Mostrare identificativo segreto?\",\n \"PASSWORD\": \"Passsord\",\n \"PASSWORD_HELP\": \"Password\",\n \"PUBKEY_HELP\": \"Chiave pubblica, pseudonimo\",\n \"NO_ACCOUNT_QUESTION\": \"Ancora non hai un conto?\",\n \"HAVE_ACCOUNT_QUESTION\": \"Hai già un account?\",\n \"CREATE_ACCOUNT\": \"Creare un conto\",\n \"CREATE_FREE_ACCOUNT\": \"Crea un conto gratuito\",\n \"FORGOTTEN_ID\": \"Non ricordi la password?\",\n \"ASSOCIATED_PUBKEY\": \"Chiave pubblica:\",\n \"BTN_METHODS\": \"Altri metodi\",\n \"BTN_METHODS_DOTS\": \"Cambiare metodo...\",\n \"METHOD_POPOVER_TITLE\": \"Metodi\",\n \"MEMORIZE_AUTH_FILE\": \"Memorizzare questo portachiavi per la durata di questa sessione\",\n \"SCRYPT_PARAMETERS\": \"Parametri (Scrypt) :\",\n \"AUTO_LOGOUT\": {\n \"TITLE\": \"Informazioni\",\n \"MESSAGE\": \"<i class=\\\"ion-android-time\\\"></i> Sei stato <b>sconesso/ b> automaticamente, per un periodo di inattività prolongata\",\n \"BTN_RELOGIN\": \"Accedi\",\n \"IDLE_WARNING\": \"Sarai disconesso in... {{countdown}}\"\n },\n \"METHOD\": {\n \"SCRYPT_DEFAULT\": \"Salatura standard (imp. predefinita)\",\n \"SCRYPT_ADVANCED\": \"Salatura avanzata\",\n \"FILE\": \"File del portachiavi\",\n \"PUBKEY\": \"Chiave pubblica soltanto\",\n \"SCAN\": \"Scansiona un codice QR\"\n },\n \"SCRYPT\": {\n \"SIMPLE\": \"Salatura leggera\",\n \"DEFAULT\": \"Salatura standard\",\n \"SECURE\": \"Salatura sicura\",\n \"HARDEST\": \"Salatura più sicura\",\n \"EXTREME\": \"Salatura estrema\",\n \"USER\": \"Salatura personalizzata\",\n \"N\": \"N (Loop):\",\n \"r\": \"r (RAM):\",\n \"p\": \"p (CPU):\"\n },\n \"FILE\": {\n \"HELP\": \"Format del file atteso: <b>.dunikey</b> (type PubSec). Altri formati in sviluppo (EWIF, WIF).\"\n }\n },\n \"AUTH\": {\n \"TITLE\": \"<i class=\\\"icon ion-locked\\\"></i> Autenticazione\",\n \"BTN_AUTH\": \"Autenticarsi\",\n \"GENERAL_HELP\": \"Autenticati :\",\n \"EXPECTED_UID_HELP\": \"Effettua il login nell'account <i class=\\\"ion-person\\\"></i> {{uid}}:\",\n \"EXPECTED_PUBKEY_HELP\": \"Si prega di autenticarsi sul portafoglio <i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}:\",\n \"SCAN_FORM_HELP\": \"Scansiona il codice QR della <b>chiave privata</b> del portafoglio.\"\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Mio conto\",\n \"BALANCE\": \"Saldo\",\n \"LAST_TX\": \"Ultime transazioni\",\n \"BALANCE_ACCOUNT\": \"Saldo del conto\",\n \"NO_TX\": \"Nessuna transazione\",\n \"SHOW_MORE_TX\": \"Mostrare di più\",\n \"SHOW_ALL_TX\": \"Mostrare tutte\",\n \"TX_FROM_DATE\": \"(limite attuale del {{fromTime|medianFromNowShort}})\",\n \"PENDING_TX\": \"Transazioni pendenti\",\n \"VALIDATING_TX\": \"Transazioni in corso di convalida\",\n \"ERROR_TX\": \"Transaction non eseguite\",\n \"ERROR_TX_SENT\": \"Transazioni inviate\",\n \"PENDING_TX_RECEIVED\": \"Transazioni in attesa di recezione\",\n \"EVENTS\": \"Eventi\",\n \"WAITING_MEMBERSHIP\": \"Richiesta di certificazione inviata. In attesa di validazione.\",\n \"WAITING_CERTIFICATIONS\": \"Hai bisogno di {{needCertificationCount}} certificazione(i) per diventare membro.\",\n \"WILL_MISSING_CERTIFICATIONS\": \"Mancherai a breve <b>di certificazioni</b> (occorrono almeno {{willNeedCertificationCount}} altre certificazioni)\",\n \"WILL_NEED_RENEW_MEMBERSHIP\": \"Tua certificazione <b>scaderà{{membershipExpiresIn|formatDurationTo}}</b>. Ricordati di <a ng-click=\\\"doQuickFix('renew')\\\">rinnovarla</a> prima.\",\n \"NEED_RENEW_MEMBERSHIP\": \"You are no longer a member because your membership <b>has expired</b>. Remember to <a ng-click=\\\"doQuickFix('renew')\\\">renew your membership</a>.\",\n \"NO_WAITING_MEMBERSHIP\": \"Nessuna domanda di adesione pendente. Se desideri <b>diventare membro</b>, ricordati di <a ng-click=\\\"doQuickFix('membership')\\\">inviare tua domanda di adesione</a>.\",\n \"CERTIFICATION_COUNT\": \"Certificazioni ricevute\",\n \"CERTIFICATION_COUNT_SHORT\": \"Certificazioni\",\n \"SIG_STOCK\": \"Stock di certificazioni da inviare\",\n \"BTN_RECEIVE_MONEY\": \"Ricevere\",\n \"BTN_SELECT_ALTERNATIVES_IDENTITIES\": \"Usare un'altra identità..\",\n \"BTN_FIX_MEMBERSHIP\": \"Invia nuovamente di adesione...\",\n \"BTN_MEMBERSHIP_RENEW\": \"Rinnovare adesione\",\n \"BTN_MEMBERSHIP_RENEW_DOTS\": \"Rinnovare adesione ...\",\n \"BTN_MEMBERSHIP_OUT_DOTS\": \"Revocare adesione...\",\n \"BTN_SECURITY_DOTS\": \"Login e securità...\",\n \"BTN_SHOW_DETAILS\": \"Visualizzare dati tecnici\",\n \"LOCKED_OUTPUTS_POPOVER\": {\n \"TITLE\": \"Importo bloccata\",\n \"DESCRIPTION\": \"Ecco le condizioni per sbloccare questo importo:\",\n \"DESCRIPTION_MANY\": \"Questa transazione è fatta da diverse parti, di cui queste sono le condizioni di sblocco:\",\n \"LOCKED_AMOUNT\": \"Condizioni per l'importo:\"\n },\n \"NEW\": {\n \"TITLE\": \"Registrazione\",\n \"INTRO_WARNING_TIME\": \"Crearsi un conto su {{name|capitalize}} è molto semplice. E consigliato prendere il giusto tempo per farlo correttamente (per evitare di dimenticare passwords, pseudonimi etc.).\",\n \"INTRO_WARNING_SECURITY\": \"Occorre verificare che il hardware che stai utilizzando (computer, tablet, cellulare) <b>è sicuro e affidabile</b>.\",\n \"INTRO_WARNING_SECURITY_HELP\": \"Anti-virus aggiornato, firewall abilitato, session protteta da un password o codice PIN...\",\n \"INTRO_HELP\": \"Cliccare <b> {{'COMMON.BTN_START'|translate}}</b> per avviare la creazione del conto. Ti accompagniamo passo alla volta.\",\n \"REGISTRATION_NODE\": \"Tua iscrizione verrà salvata dal nodo peer Duniter <b>{{server}}</b>, è verrà poi condivisa nella rete della moneta.\",\n \"REGISTRATION_NODE_HELP\": \"Se non ti fidi di questo peer, per favore cambialo <a ng-click=\\\"doQuickFix('settings')\\\">nelle impostazioni/a> di Cesium.\",\n \"SELECT_ACCOUNT_TYPE\": \"Scegliere un tipo di conto:\",\n \"MEMBER_ACCOUNT\": \"Conto membro\",\n \"MEMBER_ACCOUNT_TITLE\": \"Creare un conto membro\",\n \"MEMBER_ACCOUNT_HELP\": \"Se non sei ancora registrato come individuo (un conto a persona soltanto).\",\n \"WALLET_ACCOUNT\": \"Semplice portafoglio\",\n \"WALLET_ACCOUNT_TITLE\": \"Creare un portafoglio\",\n \"WALLET_ACCOUNT_HELP\": \"Se rappresenti un'azienda, associazione, altra ente o hai necessita di un altro portafoglio. Nessun Dividendo Universale sarà prodotto da questo conto.\",\n \"SALT_WARNING\": \"Scegliere un identificativo segreto.<br/>E necessario per ogni connessione a questo conto.<br/><br/><b>Accertati di ricordarlo!</b>.<br/>Se lo dimentichi non ti potrà aiutare nessuno!\",\n \"PASSWORD_WARNING\": \"Scegliere una password.<br/>E necessario per ogni connessione a questo conto.<br/><br/><b>Accertati di ricordarla!</b>.<br/>Se la dimentichi non ti potrà aiutare nessuno!\",\n \"PSEUDO_WARNING\": \"Segliere uno pseudonimo.<br/>Puo essere utile per chi ti cerca nella rete.<br/><br/>.L'utilizzo delle<b>virgole, spazi e accenti</b> è vietato.<br/><div class='hidden-xs'><br/>Esempio: <span class='gray'>JohnDalton, JackieChan, etc.</span>\",\n \"PSEUDO\": \"Pseudonimo\",\n \"PSEUDO_HELP\": \"joe123\",\n \"SALT_CONFIRM\": \"Confermare\",\n \"SALT_CONFIRM_HELP\": \"Confermare l'identificativo segreto\",\n \"PASSWORD_CONFIRM\": \"Confermare\",\n \"PASSWORD_CONFIRM_HELP\": \"Confermare la password\",\n \"SLIDE_6_TITLE\": \"Conferma:\",\n \"COMPUTING_PUBKEY\": \"Calcolando...\",\n \"LAST_SLIDE_CONGRATULATION\": \"Hai riempito tutti i campi richiesti.<br/><b>Puoi inviare la richiesta di creazione del conto</b>.<br/><br/>Per tua informazione, la chiave pubblica qui sotto identifica il tuo futuro conto.<br/>Puo essere communicata a chi ti deve pagare per esempio.<br/>Quando tuo conto verrà approvato potrai trovare la chiave qui <b>{{'ACCOUNT.TITLE'|translate}}</b>.\",\n \"CONFIRMATION_MEMBER_ACCOUNT\": \"<b class=\\\"assertive\\\">Warning:</b> tuo identificare segreto, tua password e tuo pseudonimo non si possono cambiare.<br/><b>Ricordali per sempre!</b><br/><b>Sei sicuro/a</b>di voler inviare questa richiesta di creazione di conto?\",\n \"CONFIRMATION_WALLET_ACCOUNT\": \"<b class=\\\"assertive\\\">Warning:</b> tuo identificare segreto, tua password e tuo pseudonimo non si possono cambiare..<br/><b>Ricordali per sempre!</b><br/><b>Sei sicuro/a</b> di voler continuare?\",\n \"CHECKING_PSEUDO\": \"Verificazione in corso...\",\n \"PSEUDO_AVAILABLE\": \"Pseudonimo disponibile\",\n \"PSEUDO_NOT_AVAILABLE\": \"Pseudonimo indisponibile\",\n \"INFO_LICENSE\": \"TPer aderire alla moneta, ti chiediamo di leggere e accetare le condizioni della licenza.\",\n \"BTN_ACCEPT\": \"Accetto\",\n \"BTN_ACCEPT_LICENSE\": \"Accetto la licenza\"\n },\n \"POPUP_REGISTER\": {\n \"TITLE\": \"Pseudonimo\",\n \"HELP\": \"Un pseudonimo è necessario per che gli altri ti possino trovare.\"\n },\n \"SELECT_IDENTITY_MODAL\": {\n \"TITLE\": \"Selezionare una identità\",\n \"HELP\": \"Più <b>identità diverse</b> sono state inviate per la chiave pubblica <span class=\\\"gray\\\"><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}</span>.<br/>Seleziona un dossier da usare :\"\n },\n \"SELECT_WALLET_MODAL\": {\n \"TITLE\": \"Selezione del portafoglio\"\n },\n \"WALLET_LIST\": {\n \"TITLE\": \"Portafoglio secondario\",\n \"BTN_NEW\": \"Aggiungi un portfolio\",\n \"NO_WALLET\": \"Nessun portafoglio secondario\",\n \"BTN_DELETE\": \"Rimuovi un portafoglio secondario ...\",\n \"BTN_RENAME\": \"Rinominare il portafoglio\",\n \"EDIT_POPOVER\": {\n \"TITLE\": \"Rinominare il portafoglio\",\n \"HELP\": \"Compila il nuovo nome\",\n \"NAME_HELP\": \"Nome del portafoglio\"\n }\n },\n \"SECURITY\":{\n \"ADD_QUESTION\" : \"Aggiungere domanda personalizzata\",\n \"BTN_CLEAN\" : \"Svuotare\",\n \"BTN_RESET\" : \"Reset\",\n \"DOWNLOAD_REVOKE\": \"Salvare un file di revoca\",\n \"DOWNLOAD_REVOKE_HELP\" : \"Avere une file di revoca è necessario in caso di smarrimento dei tuoi credenziali. Ti permette <b> di rimuovere tuo conto dalla Web Of Trust</b>, per farlo tornare ad essere un semplice portafoglio.\",\n \"HELP_LEVEL\": \"Scegliere <strong> almeno{{nb}} domande </strong> :\",\n \"LEVEL\": \"Livello di sicurezza\",\n \"LOW_LEVEL\": \"Basso <span class=\\\"hidden-xs\\\">(minimo di 2 domande)</span>\",\n \"MEDIUM_LEVEL\": \"Medio <span class=\\\"hidden-xs\\\">(minimo di 4 domande)</span>\",\n \"QUESTION_1\": \"Qual'era il nome del tuo miglior amico quando eri adolescente ?\",\n \"QUESTION_2\": \"Qual'era il nome del tuo primo animale domestico?\",\n \"QUESTION_3\": \"Qual'è il primo piatto che imparasti a cucinare?\",\n \"QUESTION_4\": \"Qual'è il primo film che hai visto al cinema?\",\n \"QUESTION_5\": \"Qual'era la destinazione del tuo primo volo?\",\n \"QUESTION_6\": \"Qual'era il nome del tuo professore preferito in scuola ?\",\n \"QUESTION_7\": \"Quale sarebbe il tuo lavoro preferito?\",\n \"QUESTION_8\": \"Qual'è il tuo libro per bimbi preferito?\",\n \"QUESTION_9\": \"Qual'era il marchio della tua prima macchina?\",\n \"QUESTION_10\": \"Qual'era il tuo nomignolo da ragazzino/a ?\",\n \"QUESTION_11\": \"Qual'era il tuo personaggio di film o attore preferito quand eri studente?\",\n \"QUESTION_12\": \"Qual'era il tuo musicista/cantante/grupo preferito quand eri studente ?\",\n \"QUESTION_13\": \"In che città si sono conosciuti tuoi genitori ?\",\n \"QUESTION_14\": \"Qual'era il nome del tuo primo capo ?\",\n \"QUESTION_15\": \"Qual'è il nome della strada dove sei cresciuto/a ?\",\n \"QUESTION_16\": \"Qual'è il nome della tua spiaggia preferita ?\",\n \"QUESTION_17\": \"Qual'è il primo album che ti sei comprato ?\",\n \"QUESTION_18\": \"Qual'è il nome della squadra di sport preferita ?\",\n \"QUESTION_19\": \"Cosa faceva tuo nonno ?\",\n \"RECOVER_ID\": \"Ricuperare mia password...\",\n \"RECOVER_ID_HELP\": \"Se hai un<b<file di backup dei tuoi credenziali</b>, li puoi trovare rispondendo correttamente alle tue domande personalizzate.\",\n \"REVOCATION_WITH_FILE\" : \"Revocare il mio conto membro...\",\n \"REVOCATION_WITH_FILE_DESCRIPTION\": \"Se pensi di aver perso <b>definitivamente tuoi credenziali</b> di conto membro (o che la sicurezza del tuo conto è compromessa), puoi usare <b>il file di revoca</b> del conto <b>per forzare la sua uscita permanente dalla Tela di Fiducia</b>.\",\n \"REVOCATION_WITH_FILE_HELP\": \"Se hai <b>definitivamente perso tuoi credenziali (o se la sicurezza del tuo conto è compromessa), puoi usare <b>il file di revoca</b> del conto <b>per uscire dalla Web Of Trust</b>.\",\n \"REVOCATION_WALLET\": \"Revocare questo conto subito\",\n \"REVOCATION_WALLET_HELP\": \"Richiedere la cancellazione dell'identità <b>revocherà la tua adesione alla tua rete</ b> (con certezza per il pseudonimo e la chiave pubblica associata). Il conto non potrà più produrre il Dividendo Universale.<br/>Nonostante ciò, puoi ancora usare il conto come semplice portafoglio.\",\n \"REVOCATION_FILENAME\": \"revocation-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt\",\n \"SAVE_ID\": \"Salvare miei credenziali...\",\n \"SAVE_ID_HELP\": \"Creare un file di backup, per <b>ricuperare vostra password</b> (e l'identificativo segreto) <b> in caso di smarrimento</b>. Il file è <b>sicuro</ b> (cryptato) utilizzando le domande personalizzate.\",\n \"STRONG_LEVEL\": \"Alto <span class=\\\"hidden-xs \\\">(minimo di 6 domande)</span>\",\n \"TITLE\": \"Conto e sicurezza\"\n },\n \"FILE_NAME\": \"{{currency}} - Account statement {{pubkey|formatPubkey}} to {{currentTime|formatDateForFile}}.csv\",\n \"HEADERS\": {\n \"TIME\": \"Date\",\n \"AMOUNT\": \"Amount\",\n \"COMMENT\": \"Comment\"\n }\n },\n \"TRANSFER\": {\n \"TITLE\": \"Bonifico\",\n \"SUB_TITLE\": \"Fare un bonifico\",\n \"FROM\": \"Da\",\n \"TO\": \"A\",\n \"AMOUNT\": \"Importo\",\n \"AMOUNT_HELP\": \"Importo\",\n \"COMMENT\": \"Commenti\",\n \"COMMENT_HELP\": \"Commenti\",\n \"BTN_SEND\": \"Inviare\",\n \"BTN_ADD_COMMENT\": \"Scrivere un comento ?\",\n \"WARN_COMMENT_IS_PUBLIC\": \"Ti avvertiamo <b>che i commenti sono pubblici</b> (non cifrati).\",\n \"MODAL\": {\n \"TITLE\": \"Bonifico\"\n }\n },\n \"ERROR\": {\n \"UNKNOWN_URI_FORMAT\": \"Formato URI sconosciuto\",\n \"POPUP_TITLE\": \"Errore\",\n \"UNKNOWN_ERROR\": \"Errore\",\n \"CRYPTO_UNKNOWN_ERROR\": \"Suo navigatore non sembra compatibile con le funzionalità di cryptografia.\",\n \"EQUALS_TO_PSEUDO\": \"Deve essere diverso dal pseudonimo\",\n \"EQUALS_TO_SALT\": \"Deve essere diverso dal identificativo segreto\",\n \"FIELD_REQUIRED\": \"Campo obbligatorio.\",\n \"FIELD_TOO_SHORT\": \"Valore troppo corto.\",\n \"FIELD_TOO_SHORT_WITH_LENGTH\": \"Valore troppo corto ({{minLength}} caratteri min)\",\n \"FIELD_TOO_LONG\": \"Valore troppo lungo\",\n \"FIELD_TOO_LONG_WITH_LENGTH\": \"Valore troppo lungo ({{maxLength}} caractteri max)\",\n \"FIELD_MIN\": \"Valore minimo : {{min}}\",\n \"FIELD_MAX\": \"Valore massimo : {{max}}\",\n \"FIELD_ACCENT\": \"Virgole e caratteri accentati vietati\",\n \"FIELD_NOT_NUMBER\": \"Valore numerico atteso\",\n \"FIELD_NOT_INT\": \"Valore intero atteso\",\n \"FIELD_NOT_EMAIL\": \"Indirizzo mail non valido\",\n \"PASSWORD_NOT_CONFIRMED\": \"Non corrisponde alla password.\",\n \"SALT_NOT_CONFIRMED\": \"Non corrisponde al identificativo segreto.\",\n \"SEND_IDENTITY_FAILED\": \"Iscrizione fallita.\",\n \"SEND_CERTIFICATION_FAILED\": \"Certificazione fallita.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY\": \"Non puoi inviare certificazioni perche tuo conto <b>non è ancora un conto membro</b>.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF\": \"Non puoi inviare certificazioni adesso perche <b>non sei ancora membro</b>.<br/><br/>Devi ancora entrare nella WOT.\",\n \"IDENTITY_TO_CERTIFY_HAS_NO_SELF\": \"Impossibile certificare questo conto. Nessuna richiesta di certificazione trovata o bisogna rinnovarla.\",\n \"LOGIN_FAILED\": \"Errore di login.\",\n \"LOAD_IDENTITY_FAILED\": \"Impossibile caricare la tua identità.\",\n \"LOAD_REQUIREMENTS_FAILED\": \"Impossibile caricare i prerequisiti dell'identità.\",\n \"SEND_MEMBERSHIP_IN_FAILED\": \"Ingresso nella WOT fallito.\",\n \"SEND_MEMBERSHIP_OUT_FAILED\": \"Errore nel invio della revocazione.\",\n \"REFRESH_WALLET_DATA\": \"Impossibile aggiornare il portafoglio.\",\n \"GET_CURRENCY_PARAMETER\": \"Impossibile ricuperare i parametri della moneta.\",\n \"GET_CURRENCY_FAILED\": \"Impossibile caricare la moneta. Riprovare più tardi.\",\n \"SEND_TX_FAILED\": \"Impossibile eseguire la transazione.\",\n \"ALL_SOURCES_USED\": \"Per favore aspetta il calcolo del prossimo blocco (Tutte le tue fonti di moneta sono state utilizzate).\",\n \"NOT_ENOUGH_SOURCES\": \"Non hai abbastanza cambio per inviare questo importo in una sola transazione.<br/>Importo massimo: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.\",\n \"ACCOUNT_CREATION_FAILED\": \"Errore nella creazione del tuo conto membro.\",\n \"RESTORE_WALLET_DATA_ERROR\": \"Errore nel aggiornamento delle impostazioni definite in local storage.\",\n \"LOAD_WALLET_DATA_ERROR\": \"Errore nel caricamento dei dati del portafoglio.\",\n \"COPY_CLIPBOARD_FAILED\": \"Impossibile copiare al clipboard\",\n \"TAKE_PICTURE_FAILED\": \"Impossibile ricuperare foto.\",\n \"SCAN_FAILED\": \"Impossibile scansionare il codice QR.\",\n \"SCAN_UNKNOWN_FORMAT\": \"Codice non riconosciuto.\",\n \"WOT_LOOKUP_FAILED\": \"Ricerca fallita.\",\n \"LOAD_PEER_DATA_FAILED\": \"Peer Duniter non accessibile. Riprovare più tardi.\",\n \"NEED_LOGIN_FIRST\": \"Accedi al tuo conto prima.\",\n \"AMOUNT_REQUIRED\": \"Importo necessario.\",\n \"AMOUNT_NEGATIVE\": \"Importo negativo non consentito.\",\n \"NOT_ENOUGH_CREDIT\": \"Saldo insufficiente\",\n \"INVALID_NODE_SUMMARY\": \"Impossibile comunicare col peer o indirizzo non valido\",\n \"INVALID_USER_ID\": \"Il campo del 'pseudonimo' non deve avere spazi vuoti o caratteri speciali.\",\n \"INVALID_COMMENT\": \"Il formato del campo 'reference' è errato.\",\n \"INVALID_PUBKEY\": \"If formato della chiave pubblica è errato.\",\n \"INVALID_PUBKEY_CHECKSUM\": \"Checkum non valido.\",\n \"IDENTITY_REVOKED\": \"Questa identità <b>è stata revocata</b>. Non puo più diventare membro.\",\n \"IDENTITY_REVOKED_WITH_TIME\": \"Questa identità <b>è stata revocata {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). Non puo più diventare membro.\",\n \"IDENTITY_PENDING_REVOCATION\": \"L'<b>annulamento di questa identità</b> è stata richiesta ed è in corso di evaluazione. Capacità ad inviare certificazioni disabilitata\",\n \"IDENTITY_INVALID_BLOCK_HASH\": \"Questa richiesta di certificazione non è più valida (perche si riferisce ad un blocco che è stato eliminato dai peers): la persona deve rinnovare la sua domanda di certificazione <b>prima</b> di essere certificata.\",\n \"IDENTITY_EXPIRED\": \"Questa identità è scaduta: la persona deve fare una nuova domanda di certificazione <b>prima di</b> essere certificata.\",\n \"IDENTITY_SANDBOX_FULL\": \"Il nodo Duniter utilizzato da Cesium non puo ricevere altre domande di certificazione per ora, la lista d'attesa è piena.<br/><br/>Riprova più tardi o scegli un'altro peer Duniter (nelle <b>Impostazioni</b>).\",\n \"IDENTITY_NOT_FOUND\": \"Identità non trovata\",\n \"IDENTITY_TX_FAILED\": \"Impossibile caricare le operazioni\",\n \"WOT_PENDING_INVALID_BLOCK_HASH\": \"Adesione non valida.\",\n \"WALLET_INVALID_BLOCK_HASH\": \"Tua domanda di certificazione non è più valida (perche si riferisce ad un blocco che è stato eliminato dai peers).<br/>Devi <a ng-click=\\\"doQuickFix('renew')\\\">rinnvoare la tua richiesta di adesione alla WOT</a> per risolvere il problema.\",\n \"WALLET_IDENTITY_EXPIRED\": \"La pubblicazione della tua identità <b>è scaduta</b>.<br/>Devi <a ng-click=\\\"doQuickFix('fixIdentity')\\\">ripubblicare la tua identità</a> per risolvere il problema.\",\n \"WALLET_REVOKED\": \"La tua identità è stata <b>revocata</b>: ne tuo pseudonimo ne tua chiave pubblica sarano utilizzati in futuro.\",\n \"WALLET_HAS_NO_SELF\": \"La tua identità deve prima essere stata pubblicata e non essere ancora scaduta.\",\n \"AUTH_REQUIRED\": \"Autenticazione necessaria.\",\n \"AUTH_INVALID_PUBKEY\": \"La chiave pubblica non corrisponde al conto conesso.\",\n \"AUTH_INVALID_SCRYPT\": \"Password o nome di utente non valido.\",\n \"AUTH_INVALID_FILE\": \"File di portachiavi non valido.\",\n \"AUTH_FILE_ERROR\": \"Impossibile aprire il file di portachiavi\",\n \"IDENTITY_ALREADY_CERTIFY\": \"Hai <b>già certificato</b> questa identità.<br/><br/>Tuo certificato è ancora valido (scade {{expiresIn|formatDuration}}).\",\n \"IDENTITY_ALREADY_CERTIFY_PENDING\": \"Hai <b>già certificato</b> questa identità.<br/><br/>Tua certificazione è ancora pendente (Scadenza del periodo di treatment {{expiresIn|formatDuration}}).\",\n \"UNABLE_TO_CERTIFY_TITLE\": \"Impossibile certificare\",\n \"LOAD_NEWCOMERS_FAILED\": \"Impossibile caricare i nuovi membri.\",\n \"LOAD_PENDING_FAILED\": \"Impossibile caricare le certificazioni pendenti.\",\n \"ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"Devi <b>essere membro</b> per poter fare questo.\",\n \"ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"Devi <b>essere membro</b> (o era un membro) per poter fare questo.\",\n \"ONLY_SELF_CAN_EXECUTE_THIS_ACTION\": \"Devi aver <b>publiccato tua identità</b> per poter fare questo.\",\n \"GET_BLOCK_FAILED\": \"Impossibile caricare il blocco\",\n \"INVALID_BLOCK_HASH\": \"Blocco non trovato (hash errato)\",\n \"DOWNLOAD_REVOCATION_FAILED\": \"Errore avvenuto nel download del file di cancellazione d'identità.\",\n \"REVOCATION_FAILED\": \"Errore avvenuto durante la richiesta di cancellazione dell'identità.\",\n \"SALT_OR_PASSWORD_NOT_CONFIRMED\": \"identificativo segreto o password sbagliati\",\n \"RECOVER_ID_FAILED\": \"Impossibile ricuperare la password\",\n \"LOAD_FILE_FAILED\" : \"Impossibile caricare il file\",\n \"NOT_VALID_REVOCATION_FILE\": \"File di cancellazione dell'identità errato (formato di file incorreto)\",\n \"NOT_VALID_SAVE_ID_FILE\": \"File di backup dei credenziali errato (formato di file incorreto)\",\n \"NOT_VALID_KEY_FILE\": \"File di portachiavi non valido (formato non riconosciuto)\",\n \"EXISTING_ACCOUNT\": \"Tuoi credenziali corrispondono a quelli di un conto già esistente,di cui <a ng-click=\\\"showHelpModal('pubkey')\\\">la chiave pubblica</a> è:\",\n \"EXISTING_ACCOUNT_REQUEST\": \"Per favore cambi tuoi credenziali in modo che corrispondino ad un conto non utilizzato.\",\n \"GET_LICENSE_FILE_FAILED\": \"Impossibile caricare il file della licenza\",\n \"CHECK_NETWORK_CONNECTION\": \"Nessun peer sembra disponibile.<br/><br/>Per favore <b>verifica la tua connessione Internet</b>.\",\n \"ISSUE_524_TX_FAILED\": \"Bonifico .<br/><br/>Un message a été envoyé aux développeurs pour faciliter la résolution du problème. <b>Merci de votre aide</b>.\"\n },\n \"INFO\": {\n \"POPUP_TITLE\": \"Informazioni\",\n \"CERTIFICATION_DONE\": \"Identità firmata con successo\",\n \"NOT_ENOUGH_CREDIT\": \"Saldo insufficiente\",\n \"TRANSFER_SENT\": \"Transazione inviata con successo\",\n \"COPY_TO_CLIPBOARD_DONE\": \"Copiato con successo\",\n \"MEMBERSHIP_OUT_SENT\": \"Revoca dell'identità inviata\",\n \"NOT_NEED_MEMBERSHIP\": \"Già un membro.\",\n \"IDENTITY_WILL_MISSING_CERTIFICATIONS\": \"Questa identità mancherà a breve di certificazioni (almeno {{willNeedCertificationCount}}).\",\n \"REVOCATION_SENT\": \"Revoca dell'identità inviata\",\n \"REVOCATION_SENT_WAITING_PROCESS\": \"Cancellazione dell'identità <b>inviata con successo</b>. In attesa di validazione.\",\n \"FEATURES_NOT_IMPLEMENTED\": \"Questa funzionalità non è ancora disponibile.<br/><br/>Vuoi contribuire per velocizzarne la disponibilità? ;)\",\n \"EMPTY_TX_HISTORY\": \"Nessuna operazione da esportare\"\n },\n \"CONFIRM\": {\n \"POPUP_TITLE\": \"<b>Conferma</b>\",\n \"POPUP_WARNING_TITLE\": \"<b>Avviso</b>\",\n \"POPUP_SECURITY_WARNING_TITLE\": \"<i class=\\\"icon ion-alert-circled\\\"></i> <b>Avvertimento di sicurezza</b>\",\n \"CERTIFY_RULES_TITLE_UID\": \"Certificare {{uid}}\",\n \"CERTIFY_RULES\": \"<b class=\\\"assertive\\\">Non certificare un conto</b> se credi che: <ul><li>1.) l'identità della persona potrebbe essere finta.<li>2.) la oersona ha già un conto certicato.<li>3.) la persona trasgredisce la regola 1 o 2 o entrambe. (Certifica conti finti o gemelli).</ul></small><br/>Sei sicuro/a di voler certificare questa identità?\",\n \"TRANSFER\": \"<b>Resoconto del bonifico:</b><br/><br/><ul><li> - Inviato da: <b>{{from}}</b></li><li> - A: <b>{{to}}</b></li><li> - Importo: <b>{{amount}} {{unit}}</b></li><li> - Comento: <i>{{comment}}</i></li></ul><br/><b>Sei sicuro di voler procedere con questo bonifico?</b>\",\n \"MEMBERSHIP_OUT\": \"Questa operazione è <b>irreversibile</b>.<br/></br/><b>Sei sicuro/a di voler cancellare la tua presenza nella WOT?</b>\",\n \"MEMBERSHIP_OUT_2\": \"Questa operazione è <b>irreversibile</b>!<br/><br/>Sei sicuro/a <b>di voler revocare la tua identità</b>?\",\n \"LOGIN_UNUSED_WALLET_TITLE\": \"Errore di battitura?\",\n \"LOGIN_UNUSED_WALLET\": \"Il conto sembra <b>inattivo</b>.<br/><br/>Probabilmente è un<b>errore di battitura</b> mientre digitavi i tuoi credenziali. Per favore riprova, verificando che la <b>chiave pubblica sia tua<b/>.\",\n \"FIX_IDENTITY\": \"Lo pseudonimo <b>{{uid}}</b> verrà pubblicato nuovamente. Si sostituirà alla precedente pubblicazione che è scaduta.<br/></br/><b>Sei sicuro/a</b> di voler procedere?\",\n \"FIX_MEMBERSHIP\": \"Tua domanda di certificazione sarà inviata alla rete.<br/></br/><b>Sei sicuro/a?</b>\",\n \"MEMBERSHIP\": \"Tua domanda per diventare membro sta per essere inviata alla rete.<br/></br/><b>Sei sicuro/a/b> di voler continuare ?\",\n \"RENEW_MEMBERSHIP\": \"Tua adesione verrà rinnovata.<br/></br/><b>Sei sicuro/a?</b>\",\n \"REVOKE_IDENTITY\": \"Stai per <b>revocare definitivamente questa identità</b>.<br/><br/>La chiave pubblica e lo pseudonimo associato <b>non saranno mai più utilizzati</b> (per un conto membro).<br/></br/><b>Sei sicuro/a</b> di voler revocare questa identità?\",\n \"REVOKE_IDENTITY_2\": \"Questa operazione è <b>irreversibile</b>!<br/><br/>Sei sicuro/a di volern<b>revocare questa identità</b>?\",\n \"NOT_NEED_RENEW_MEMBERSHIP\": \"Tua presenza nella rete non deve ancora essere rinnovata (scaderà tra {{membershipExpiresIn|formatDuration}}).<br/></br/><b>Sei sicuro/a</b> di voler rinnovare la tua presenza?\",\n \"SAVE_BEFORE_LEAVE\": \"Vuoi <b>salvare tue modifiche</b> prima di uscira dalla pagina?\",\n \"SAVE_BEFORE_LEAVE_TITLE\": \"Modifiche non salvate\",\n \"LOGOUT\": \"Sei sicuro/a di voler chiudere la sessione?\",\n \"USE_FALLBACK_NODE\": \"Peer <b>{{old}}</b> indisponibile o indirizzo errato.<br/><br/>Vuoi utilizzare temporanemante il <b>{{new}}</b> nodo?\",\n \"INVALID_FILE_FORMAT\": \"Formato file non valido.\",\n \"SAME_TX_RECIPIENT\": \"Il destinatario deve essere diverso dall'emittente.\"\n },\n \"MODE\": {\n \"DEMO\": {\n \"BADGE\": \"Demo\",\n \"MODE\": \"Modalità dimostrativa\",\n \"FEATURE_NOT_AVAILABLE\": \"Funzionalità <b>non disponibile</b> su questo sito dimostrativo.\",\n \"MODE_HELP\": \"Il cesio funziona in <b>modalità dimostrativa</b>: è disponibile la consultazione per conto, ma non è possibile eseguire alcuna operazione per conto.\",\n \"INSTALL_HELP\": \"Per <b>motivi di sicurezza</b> ti consigliamo di <b>installare</b> la tua copia del software.<br/>Visita il sito <a href='https://cesium.app'>www.cesium.app</a> per assistenza.\"\n },\n \"READONLY\": {\n \"BADGE\": \"Monit\",\n \"MODE\": \"Modalità di monitoraggio\",\n \"MODE_HELP\": \"Il cesio funziona in <b>modalità monitoraggio</b>: sono disponibili solo le funzionalità di monitoraggio della valuta.\",\n \"INSTALL_HELP\": \"Se desidera <b>creare un account di portafoglio</b> per inviare o ricevere valuta, ti consigliamo di <b>installare</b> la tua copia del software.<br/>Visita il sito <a href='https://cesium.app'>www.cesium.app</a> per assistenza.\"\n }\n },\n \"DOWNLOAD\": {\n \"POPUP_TITLE\": \"<b>File di cancellazione dell'identità/b>\",\n \"POPUP_REVOKE_MESSAGE\": \"Per migliorare la sicurezza del tuo conto, scarica <b>il documento di revoca del conto</b>. Ti consentirà di revocare tuo conto (nel caso di violazione del conto, della tua identità, conto creato con errori, etc.).<br/><br/><b>Tiene questo document al sicuro.</b>\"\n },\n \"HELP\": {\n \"TITLE\": \"Aiuto online\",\n \"JOIN\": {\n \"SECTION\": \"Entrare nella rete\",\n \"SALT\": \"Il tuo identificativo segreto è molto importante. E utilizzato per cryptare tua password che permette poi di calcolare tua <span class=\\\"text-italic\\\">chiave pubblica</span> (suo numero) è la chiave privata che ne consenta l'accesso.<br/><b>Ricordati bene di questo identificativo</b>, perche non ti potrà aiutare nessuno se lo perdi.<br/>Tra l'altro, non puo essere cambiato senza dover creare un conto nuovo.<br/><br/>Raccomandiamo che sia abbastanza lungo (8 caratteri almeno) è il più originale possibile. (buona entropia)\",\n \"PASSWORD\": \"La password è molto importante, è utilizzata per calcolare tuo numero di conto (tua chiave pubblica) e la chiave privata che ne consento l'accesso.<br/><b>Ricordatila bene</b>, perche non ti potrà aiutare nessuno se lo perdi.<br/>Tra l'altro, non puo essere cambiata senza dover creare un conto nuovo.<br/><br/>Una buona password (preferibilmente) è composta da almeno 8 caratteri, con almeno una maiuscola e un numero.\",\n \"PSEUDO\": \"Un pseudonimo è utilizzato quando ti iscrivi come <span class=\\\"text-italic\\\">membro</span>. E sempre associato ad un portafoglio (con sua <span class=\\\"text-italic\\\">chiave pubblica</span>).<br/>E pubblicato sulla rete perche gli altri membri possino identificarla, certificarla o invarle soldi. <br/> Lo pseudonimo deve essere unico nella rete (tra quelli utilizzati adesso e in passato).\"\n },\n \"LOGIN\": {\n \"SECTION\": \"Accedi\",\n \"PUBKEY\": \"Chiave pubblica del conto\",\n \"PUBKEY_DEF\": \"La chiave pubblica del portachiavi è generata dai credenziali, ma non corrispode ad un conto già utilizzato.<br/><b>Accertati che tua chiave pubblica corrisponda al tuo conto</b>. Nel caso contrario, sarai conesso/a ad un conto probabilmente mai usato, datto che il rischio di collisione con un conto esistente è molto ridotto.<br/><a href=\\\"https://en.wikipedia.org/wiki/Elliptic_curve_cryptography\\\" target=\\\"_ system\\\">Saperne di più sulla cryptografia </a> con chiave pubblica.\",\n \"METHOD\": \"Metodi di connessione\",\n \"METHOD_DEF\": \"Hai diverse opzioni per accedere ad un portafoglio:<br/> - Accedendo con <b>salatura (leggera o sicura)</b> tua password sarà cryptata dal tuo identificativo segreto per scoraggiare tentativi di attachi di 'brute force' (per esempio con passwords conosciute).<br/> - Accedendo con la <b>chiave pubblica</b> ti evita di dover digitare tuoi credenziali che ti saranno chiesti solo quando vorrai fare una operazione col conto.<br/> - Accedendo <b>con un portachiavi</b> che leggerà tue chiave pubbliche e private da un file esterno, senza che tu li debba entrare.\"\n },\n \"GLOSSARY\": {\n \"SECTION\": \"Glossario\",\n \"PUBKEY_DEF\": \"Una chiave pubblica permette di identificare un portafoglio. Puo anche identificare un membro. In Cesium è calcolata con la password e lo pseudonimo.\",\n \"MEMBER\": \"Membro\",\n \"MEMBER_DEF\": \"Un membro è una persona reale e viva, che desidera participare liberamente alla communità monetaria. Questo membro riceverà un Dividendo Universale, a secondo delle regole definite <span class=\\\"text-italic\\\">nei parametri della moneta</span>.\",\n \"CURRENCY_RULES\": \"Regole della moneta\",\n \"CURRENCY_RULES_DEF\": \"I parametri delle moneta sono state definite per sempre e per tutti. I parametri con i quali la moneta si comporta: il calcolo del Dividendo Universale, il numero di certificazioni necessarie per diventare membro, il numero massimo di certificazioni che un membro puo inviare, etc.<br/><br/>I parametri non possono essere modificati perche c'è una<span class=\\\"text-italic\\\">Blockchain</span> che implementa e esegue queste regole e verifica costantemente la loro applicazione. <a href=\\\"#/app/currency\\\">Vedere i parametri </a>.\",\n \"BLOCKCHAIN\": \"Blockchain\",\n \"BLOCKCHAIN_DEF\": \"La Blockchain è un sistema decentralizzato che, nel caso di Duniter, permette di rispettare e implementare <span class=\\\"text-italic\\\">le regole della moneta</span>.<br/><a href=\\\"http://en.duniter.org/presentation/\\\" target=\\\"_blank\\\">Saperne di più su Duniter</a> e il funzionamento della blockchain.\",\n \"UNIVERSAL_DIVIDEND_DEF\": \"Il Dividendo Universale (UD) è la quantità di moneta co-creata da ogni membro, seguendo le formule mathematiche definite nelle <span class=\\\"text-italic\\\">regole della moneta</span>.<br/>Al inizio di ogni periodo, il conto di ogni membro riceve una quantità uguale della nuova moneta creata. <br/><br/>Il DU conosce una crescita costante per rimanere equo nei confronti dei membri (attuali e passati). Viene calcolato tenendo in conto la speranza di vità media, cosi come dimostrato nella Teoria Relativa della Moneta (TRM).<br/><a href=\\\"http://trm.creationmonetaire.info\\\" target=\\\"_system\\\">Saperne di più sulla TRM</a> e la moneta libera.\"\n },\n \"TIP\": {\n \"MENU_BTN_CURRENCY\": \"Menu <b>{{'MENU.CURRENCY'|translate}}</b> permette la scoperta dei <b>parametri della moneta</b> e la sua condizione presente.\",\n \"CURRENCY_WOT\": \"Il <b>numero di membri</b> mostra <b>le dimensioni della WoT e la sua evoluzione </b>.\",\n \"CURRENCY_MASS\": \"In evidenza qui è <b>l'importo totale</b> attualmente in circolazione e la sua <b> ripartizione media </b> a testa.<br/><br/>Questa cifra permette di avere un'idea <b>del valore di qualsiasi importo</b>, in base a quello <b>hanno gli altri</b> sul loro conto (in media).\",\n \"CURRENCY_UNIT_RELATIVE\": \"L'unità usata qui (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) significa che gli importi in {{currency|capitalize}} sono stati divisi dal <b>Dividendo Universale</b> (DU).<br/><br/><small>Questa unità relativa <b>ha senso</b> perche è stabile in contrasto con la massa monetaria che cresce costantemente.</small>\",\n \"CURRENCY_CHANGE_UNIT\": \"Questa opzione <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> permette di <b>permutare unità</b> per vedere gli importi in <b>{{currency|capitalize}}</b>, non divisi dal Dividendo Universale (piuttosto che in “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”).\",\n \"CURRENCY_CHANGE_UNIT_TO_RELATIVE\": \"Questa opzione <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> permette <b>di permutare unità</b> per vedere gli importi in “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”, che è relativo al Dividendo Universale (l'importo co-prodotto da ogni membro).\",\n \"CURRENCY_RULES\": \"Le<b>regole</b> della moneta determinano il suo <b>esatto e previdibile</b> comportamento.<br/><br/> Considerate come il proprio DNA della moneta, queste regole rendono il codice monetario <b>trasparente e comprensibile</b>.\",\n \"MENU_BTN_NETWORK\": \"Menu <b>{{'MENU.NETWORK'|translate}}</b> permette la scopertà dello <b>stato della rete<b>.\",\n \"NETWORK_BLOCKCHAIN\": \"Tutte le transazioni monetarie sono registrate in <b>registro sicuro e a prova di manomissione</b>, spesso chiamato <b>blockchain</b>.\",\n \"NETWORK_PEERS\": \"I<b>peers</b> mostrati qui corrispondono a <b>dei computers che aggiornano e monitorano</b> la blockchain.<br/><br/>Più peers ci sono, più <b>decentralizzata</b> e più affidabile diventa la moneta.\",\n \"NETWORK_PEERS_BLOCK_NUMBER\": \"Questo <b>numero</b> (in verda) indica <b>l'ultimo blocco validato</b> dal peer (ultima pagina scritta nel regitro).<br/><br/>Il verda indica che il blocco è stato validato anche dalla <b>maggioranza degli altri peers</b>.\",\n \"NETWORK_PEERS_PARTICIPATE\": \"<b>Ogni membro</b>, che dispone di un computer connesso a Internet <b>puo partecipare, aggiungendosi come peer installando il software Duniter</b> (free/libre). <a target=\\\"_new\\\" href=\\\"{{installDocUrl}}\\\" target=\\\"_system\\\">Leggi il manuale d'installazione >></a>.\",\n \"MENU_BTN_ACCOUNT\": \"<b>{{'ACCOUNT.TITLE'|translate}}</b> permette l'accesso al saldo del conto e la cronologia delle transazioni.\",\n \"MENU_BTN_ACCOUNT_MEMBER\": \"Qui puoi consultare lo stato del tuo conto, la cronologia delle transazioni e le tue certificazioni.\",\n \"WALLET_CERTIFICATIONS\": \"Clicca qui per vedere i dettagli delle tue certificazioni (date o ricevute).\",\n \"WALLET_RECEIVED_CERTIFICATIONS\": \"Clicca qui per vedere i dettagli delle <b>certificazioni che hai ricevuto</b>.\",\n \"WALLET_GIVEN_CERTIFICATIONS\": \"Clicca qui per vedere i dettagli delle <b>certificazioni che hai date</b>.\",\n \"WALLET_BALANCE\": \"Il <b>soldo</b> del tuo conto è visibile qui.\",\n \"WALLET_BALANCE_RELATIVE\": \"{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>L'unità utilizzata (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) significa che questo importo in {{currency|capitalize}} è stato diviso dal <b>Dividendo Universale</b> (DU) co-creato da ogni membro.<br/>Ad oggi, 1 DU equivale a {{currentUD}} {{currency|capitalize}}.\",\n \"WALLET_BALANCE_CHANGE_UNIT\": \"Puoi <b>cambiare l'unità</b> in cui sono mostrati gli importi in <b><i class=\\\"icon ion-android-settings\\\"></i> {{'MENU.SETTINGS'|translate}}</b>.<br/><br/>Per esempio, per mostrare gli importi <b>direttamente in {{currency|capitalize}}</b> piuttosto che in unità relativa.\",\n \"WALLET_PUBKEY\": \"Questa è la chiave pubblica del tuo conto. La puoi dare ad un terzo perche possa identificare tuo conto.\",\n \"WALLET_SEND\": \"Paghi in pochi clics.\",\n \"WALLET_SEND_NO_MONEY\": \"Paghi in pochi clics.<br/>(Tuo saldo ancora non lo permette)\",\n \"WALLET_OPTIONS\": \"Questo bottone permette di fare <b>altre, meno frequenti azioni</b>.<br/><br/> Non dimenticarti di fare il tour guidato di Cesium quando hai un attimo!\",\n \"WALLET_RECEIVED_CERTS\": \"Questo mostra l'elenco delle persone che ti hanno fatto entrare nella WoT.\",\n \"WALLET_CERTIFY\": \"Questo bottone <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> permette di selezionare e certificare una identità.<br/><br/>Solo gli utenti <b>che sono già membri</b> possono certificare gli altri.\",\n \"WALLET_CERT_STOCK\": \"Tuo stock di certificazioni da dare è limitato a <b>{{sigStock}} certificazioni</b>.<br/><br/>Questo stock si rifornisce col tempo, man mano che le certificazioni inviate scadono.\",\n \"MENU_BTN_TX\": \"<b>{{'MENU.TRANSACTIONS'|translate}}</b> permette l'accesso alla cronologia delle transazioni, e permette di fare nuovi bonifici.\",\n \"MENU_BTN_WOT\": \"Il menu<b>{{'MENU.WOT'|translate}}</b> permette di cercare <b>utenti</b> della moneta (membri o non).\",\n \"WOT_SEARCH_TEXT_XS\": \"Per fare una ricerca nel annuario, digita <b>le prime lettere dello pseudonimo o della chiave pubblica di un utente</b>.<br/><br/>La ricerca inizierà automaticamente.\",\n \"WOT_SEARCH_TEXT\": \"Per cercare nel annuario, digita <b>le prime lettere dello pseudonimo o della chiave pubblica di un utente</b>.<br/><br/>Dopodichè calca <b>Enter</b> per avviare la ricerca.\",\n \"WOT_SEARCH_RESULT\": \"Visualizza la scheda dettagliata di un utente con un semplice click sulla linea.\",\n \"WOT_VIEW_CERTIFICATIONS\": \"La linea <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> mostra quanti membri hanno certificato questa identità.<br/><br/>Queste certificazioni dimostrano che il conto appartiene ad <b>una persona viva</b> e che questa persona non ha <b>nessun altro conto membro</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_COUNT\": \"Ci vogliono almeno <b>{{sigQty}} certificazioni</b> per diventare membro e co-produrre il <b>Dividendo Universale</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_CLICK\": \"Clicca qui per aprire <b>una lista di tutte le certificazioni</b> ricevute e date da questa identità.\",\n \"WOT_VIEW_CERTIFY\": \"Il bottone <b>{{'WOT.BTN_CERTIFY'|translate}}</b> permette di aggiungere tua certificazione a questa identità.\",\n \"CERTIFY_RULES\": \"<b>Attenzione:</b> Certifichi <b> solo persone reali e vive</b> che non hanno nessun altro conto membro.<br/><br/>L'affidabilità della moneta dipende della vigilanza di ciascuno.\",\n \"MENU_BTN_SETTINGS\": \"Les <b>{{'MENU.SETTINGS'|translate}}</b> ti permettono di configurare Cesium.<br/><br/>Per esempio, puoi <b>cambiare l'unità</b> in cui visualizzi la moneta.\",\n \"HEADER_BAR_BTN_PROFILE\": \"Clicca qui per entrare nel <b>tuo profilo utente</b>\",\n \"SETTINGS_CHANGE_UNIT\": \"Puoi cambiare <b>l'unità</b> della moneta cliccando qui.<br/><br/>- Disabilita questa opzione per vedere gli importi in {{currency|capitalize}}.<br/>- Abilita l'opzione per importi relativi in {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (<b>divisi</b> dal attuale Dividendo Universale).\",\n \"END_LOGIN\": \"Il tour guidato <b>è finito</b>.<br/><br/>Benvenuto nel <b>economia libera</b>!\",\n \"END_NOT_LOGIN\": \"Il tour guidato <b>è finito</b>.<br/><br/>Se desideri entrare nella Web of Trust {{currency|capitalize}}, basta cliccare <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> qui sotto.\",\n \"END_READONLY\": \"Il tour guidato <b>è finito</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}.\"\n }\n },\n \"API\" :{\n \"COMMON\": {\n \"LINK_DOC\": \"documentazione API\",\n \"LINK_DOC_HELP\": \"Documentazione dello sviluppatore\",\n \"LINK_STANDARD_APP\": \"versione classica\",\n \"LINK_STANDARD_APP_HELP\": \"Apri la versione classica di {{'COMMON.APP_NAME'|translate}}\"\n },\n \"HOME\": {\n \"TITLE\": \"Documentazione API {{'COMMON.APP_NAME'|translate}}\",\n \"MESSAGE\": \"Bienvenue dans la <b>documentation de l'API</b> {{'COMMON.APP_NAME'|translate}}.<br/>Connecter vos sites web à <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> très simplement !\",\n \"MESSAGE_SHORT\": \"Connecter vos sites à <a href=\\\"http://duniter.org\\\" target=\\\"_system\\\">Duniter</a> très simplement !\",\n \"DOC_HEADER\": \"Services disponibles :\"\n },\n \"TRANSFER\": {\n \"TITLE\": \"{{'COMMON.APP_NAME'|translate}} - Paiement en ligne\",\n \"TITLE_SHORT\": \"Pagamento online\",\n \"SUMMARY\": \"Récapitulatif de la commande :\",\n \"AMOUNT\": \"Montant :\",\n \"NAME\": \"Nom :\",\n \"PUBKEY\": \"Clé publique du destinaire :\",\n \"COMMENT\": \"Référence de la commande :\",\n \"DEMO\": {\n \"SALT\": \"demo\",\n \"PASSWORD\": \"demo\",\n \"PUBKEY\": \"3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1\",\n \"HELP\": \"<b>Mode démonstration</b> : Aucun paiement ne sera réellement envoyé pendant cette simulation.<br/>Veuillez utiliser les identifiants : <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>\",\n \"BAD_CREDENTIALS\": \"Vérifiez votre saisie.<br/>En mode démonstration, les identifiants sont : {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}\"\n },\n \"INFO\": {\n \"SUCCESS_REDIRECTING_WITH_NAME\": \"Paiement envoyé.<br/>Redirection vers <b>{{name}}</b>...\",\n \"SUCCESS_REDIRECTING\": \"Paiement envoyé.<br/>Redirection vers le site du vendeur...\",\n \"CANCEL_REDIRECTING_WITH_NAME\": \"Paiement annulé.<br/>Redirection vers <b>{{name}}</b>...\",\n \"CANCEL_REDIRECTING\": \"Paiement annulé.<br/>Redirection vers le site du vendeur...\"\n },\n \"ERROR\": {\n \"TRANSFER_FAILED\": \"Mancato pagamento\"\n }\n },\n \"DOC\": {\n \"DESCRIPTION_DIVIDER\": \"Descrizione\",\n \"URL_DIVIDER\": \"Indirizzo chiamata\",\n \"PARAMETERS_DIVIDER\": \"Impostazioni\",\n \"AVAILABLE_PARAMETERS\": \"Ecco l'elenco dei parametri disponibili :\",\n \"DEMO_DIVIDER\": \"Provare\",\n \"DEMO_HELP\": \"Per provare questo servizio, clicca sul bottone qui a fianco. Il risultato apparirà qui sotto .\",\n \"DEMO_RESULT\": \"Risultato della chiamata :\",\n \"DEMO_SUCCEED\": \"<i class=\\\"icon ion-checkmark\\\"></i> Successo !\",\n \"DEMO_CANCELLED\": \"<i class=\\\"icon ion-close\\\"></i> Annulato dal utente\",\n \"INTEGRATE_DIVIDER\": \"Integrare\",\n \"INTEGRATE_CODE\": \"Codice :\",\n \"INTEGRATE_RESULT\": \"Previsualizzare il risultato :\",\n \"INTEGRATE_PARAMETERS\": \"Parametri\",\n \"TRANSFER\": {\n \"TITLE\": \"Pagamenti\",\n \"DESCRIPTION\": \"Da un sito (per es. : un sito e-commerce) si può delegare il pagamento in moneta libera a Cesium API. Per invocare l'API, basta innescare l'apertura di una pagina con questo indirizzo:\",\n \"PARAM_PUBKEY\": \"Chiave pubblica del destinatario\",\n \"PARAM_PUBKEY_HELP\": \"Chiave pubblica del destinatario (obliggatoria)\",\n \"PARAM_AMOUNT\": \"Importo\",\n \"PARAM_AMOUNT_HELP\": \"Importo della transazione (obligatorio)\",\n \"PARAM_COMMENT\": \"Riferimento (o commento)\",\n \"PARAM_COMMENT_HELP\": \"Riferimento o commento. Ti può aiutare per esempio a trovare tuo pagamento nella blockchain.\",\n \"PARAM_NAME\": \"Nome (de destinatario o del sito web)\",\n \"PARAM_NAME_HELP\": \"Nom del sito web o del destinatario chiamando l'API. Può essere un nome leggibile (\\\"Mio sito\\\"), oppure l'indirizzo http del sito (\\\"MioSito.com\\\").\",\n \"PARAM_REDIRECT_URL\": \"Indirizzo web di redirezione\",\n \"PARAM_REDIRECT_URL_HELP\": \"Indirizzo web (URL) di redirezione, chiamato dopo aver inviato il pagamento. Può includere le seguenti stringe, che saranno sostituite con i valori della transazione : \\\"{tx}\\\", \\\"{hash}\\\", \\\"{comment}\\\", \\\"{amount}\\\" e {pubkey}.\",\n \"PARAM_CANCEL_URL\": \"Indirizzo web della cancellazione\",\n \"PARAM_CANCEL_URL_HELP\": \"Indirizzo web (URL) in caso dell'annullamento del pagamento dall'utente. Può includere le seguenti stringe, che saranno sostituite dinamicamente : \\\"{comment}\\\", \\\"{amount}\\\" e {pubkey}.\",\n \"EXAMPLES_HELP\": \"Ecco esempi di integrazione :\",\n \"EXAMPLE_BUTTON\": \"Bottone HTML\",\n \"EXAMPLE_BUTTON_DEFAULT_TEXT\": \"Pagare in {{currency|currencySymbol}}\",\n \"EXAMPLE_BUTTON_DEFAULT_STYLE\": \"Stile personnalizzato\",\n \"EXAMPLE_BUTTON_TEXT_HELP\": \"Testo del bottone\",\n \"EXAMPLE_BUTTON_BG_COLOR\": \"Colore del fondo\",\n \"EXAMPLE_BUTTON_BG_COLOR_HELP\": \"Per esempio: #fbc14c, black, lightgrey, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_FONT_COLOR\": \"Colore del testo\",\n \"EXAMPLE_BUTTON_FONT_COLOR_HELP\": \"Esempio: black, orange, rgb(180,180,180)\",\n \"EXAMPLE_BUTTON_TEXT_ICON\": \"Icona\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH\": \"Larghezza\",\n \"EXAMPLE_BUTTON_TEXT_WIDTH_HELP\": \"Esempio: 200px, 50%\",\n \"EXAMPLE_BUTTON_ICON_NONE\": \"Nessuna\",\n \"EXAMPLE_BUTTON_ICON_DUNITER\": \"Logo Duniter\",\n \"EXAMPLE_BUTTON_ICON_CESIUM\": \"Logo Cesium\",\n \"EXAMPLE_BUTTON_ICON_G1_COLOR\": \"Logo Ğ1\",\n \"EXAMPLE_BUTTON_ICON_G1_BLACK\": \"Logo Ğ1 (nero)\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"nl-NL\", {\n \"COMMON\": {\n \"APP_NAME\": \"Cesium\",\n \"APP_VERSION\": \"v{{version}}\",\n \"APP_BUILD\": \"build {{build}}\",\n \"PUBKEY\": \"Publieke sleutel\",\n \"MEMBER\": \"Lid\",\n \"BLOCK\": \"Blok\",\n \"BTN_OK\": \"OK\",\n \"BTN_YES\": \"Ja\",\n \"BTN_NO\": \"Nee\",\n \"BTN_SEND\": \"Verzenden\",\n \"BTN_SEND_MONEY\": \"Verstuur geld\",\n \"BTN_SEND_MONEY_SHORT\": \"Versturen\",\n \"BTN_SAVE\": \"Opslaan\",\n \"BTN_YES_SAVE\": \"Ja, opslaan\",\n \"BTN_YES_CONTINUE\": \"Ja, doorgaan\",\n \"BTN_SHOW\": \"Tonen\",\n \"BTN_SHOW_PUBKEY\": \"Toon sleutel\",\n \"BTN_RELATIVE_UNIT\": \"Gebruik relatieve eenheid\",\n \"BTN_BACK\": \"Terug\",\n \"BTN_NEXT\": \"Volgende\",\n \"BTN_CANCEL\": \"Annuleer\",\n \"BTN_CLOSE\": \"Sluit\",\n \"BTN_LATER\": \"Later\",\n \"BTN_LOGIN\": \"Aanmelden\",\n \"BTN_LOGOUT\": \"Uitloggen\",\n \"BTN_ADD_ACCOUNT\": \"Nieuwe Rekening\",\n \"BTN_SHARE\": \"Delen\",\n \"BTN_EDIT\": \"Bewerken\",\n \"BTN_DELETE\": \"Wissen\",\n \"BTN_ADD\": \"Toevoegen\",\n \"BTN_SEARCH\": \"Zoeken\",\n \"BTN_REFRESH\": \"Verwezenlijken\",\n \"BTN_START\": \"Beginnen\",\n \"BTN_CONTINUE\": \"Doorgaan\",\n \"BTN_UNDERSTOOD\": \"Ik heb het begrepen\",\n \"BTN_OPTIONS\": \"Opties\",\n \"BTN_HELP_TOUR\": \"Rondleiding\",\n \"BTN_HELP_TOUR_SCREEN\": \"Ontdek dit scherm\",\n \"BTN_DOWNLOAD\": \"Downloaden\",\n \"BTN_DOWNLOAD_ACCOUNT_STATEMENT\": \"Downloaden het rekeningoverzicht\",\n \"BTN_MODIFY\": \"Bewerken\",\n \"DAYS\": \"dagen\",\n \"NO_ACCOUNT_QUESTION\": \"Nog geen lid? Registreer nu!\",\n \"SEARCH_NO_RESULT\": \"Geen resultaten\",\n \"LOADING\": \"Even geduld...\",\n \"SEARCHING\": \"Zoeken...\",\n \"FROM\": \"Van\",\n \"TO\": \"Aan\",\n \"COPY\": \"Kopieren\",\n \"LANGUAGE\": \"Taal\",\n \"UNIVERSAL_DIVIDEND\": \"Universeel dividend\",\n \"UD\": \"UD\",\n \"DATE_PATTERN\": \"DD-MM-YYYY HH:mm\",\n \"DATE_FILE_PATTERN\": \"YYYY-MM-DD\",\n \"DATE_SHORT_PATTERN\": \"DD-MM-YY\",\n \"DATE_MONTH_YEAR_PATTERN\": \"MM-YYYY\",\n \"EMPTY_PARENTHESIS\": \"(leeg)\",\n \"UID\": \"Pseudoniem\",\n \"ENABLE\": \"Geactiveerd\",\n \"DISABLE\": \"Gedeactiveerd\",\n \"RESULTS_LIST\": \"Resultaten:\",\n \"RESULTS_COUNT\": \"{{count}} uitslagen\",\n \"EXECUTION_TIME\": \"uitgevoerd in {{duration|formatDurationMs}}\",\n \"SHOW_VALUES\": \"Toon waarden openlijk?\",\n \"POPOVER_ACTIONS_TITLE\": \"Opties\",\n \"POPOVER_FILTER_TITLE\": \"Filters\",\n \"SHOW_MORE\": \"Toon meer\",\n \"SHOW_MORE_COUNT\": \"(huidig limiet op {{limit}})\",\n \"POPOVER_SHARE\": {\n \"TITLE\": \"Delen\",\n \"SHARE_ON_TWITTER\": \"Deel op Twitter\",\n \"SHARE_ON_FACEBOOK\": \"Deel op Facebook\",\n \"SHARE_ON_DIASPORA\": \"Deel op Diaspora*\",\n \"SHARE_ON_GOOGLEPLUS\": \"Deel op Google+\"\n }\n },\n \"SYSTEM\": {\n \"PICTURE_CHOOSE_TYPE\": \"Selecteer bron:\",\n \"BTN_PICTURE_GALLERY\": \"Gallerij\",\n \"BTN_PICTURE_CAMERA\": \"<b>Camera</b>\"\n },\n \"MENU\": {\n \"HOME\": \"Welkom\",\n \"WOT\": \"Register\",\n \"CURRENCY\": \"Valuta\",\n \"CURRENCIES\": \"Valuta's\",\n \"ACCOUNT\": \"Mijn rekening\",\n \"SETTINGS\": \"Instellingen\",\n \"NETWORK\": \"Netwerk\",\n \"TRANSACTIONS\": \"Mijn transacties\"\n },\n \"ABOUT\": {\n \"TITLE\": \"Over\",\n \"LICENSE\": \"<b>Vrije</b> software (GNU AGPLv3 licentie).\",\n \"CODE\": \"Broncode:\",\n \"DEVELOPERS\": \"Ontwikkelaars:\",\n \"FORUM\": \"Forum:\",\n \"DEV_WARNING\": \"Waarschuwing\",\n \"DEV_WARNING_MESSAGE\": \"Deze applicatie is nog in actieve onwikkeling.<br/>Meld ons elk pobleem!\",\n \"DEV_WARNING_MESSAGE_SHORT\": \"Deze App is nog instabiel (in ontwikkeling).\",\n \"REPORT_ISSUE\": \"Meld een probleem\"\n },\n \"HOME\": {\n \"TITLE\": \"Cesium\",\n \"WELCOME\": \"Welkom bij de Cesium Applicatie!\",\n \"MESSAGE\": \"Bekijk je {{currency|abbreviate}} portefeilles in real time.\",\n \"BTN_REGISTRY\": \"Register\",\n \"BTN_CURRENCY\": \"Verken valuta\",\n \"BTN_ABOUT\": \"over\",\n \"BTN_HELP\": \"Help\",\n \"REPORT_ISSUE\": \"Meld een probleem\",\n \"NOT_YOUR_ACCOUNT_QUESTION\" : \"Is rekening <b><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}</b> niet van jou?\",\n \"BTN_CHANGE_ACCOUNT\": \"Dze rekening ontkoppelen\",\n \"CONNECTION_ERROR\": \"Node <b>{{server}}</b> onbereikbaar of ongeldig adres.<br/><br/>Controleer de internetverbinding, of schakel knooppunt <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">in parameters</a>.\"\n },\n \"SETTINGS\": {\n \"TITLE\": \"Instellingen\",\n \"NETWORK_SETTINGS\": \"Netwerk\",\n \"PEER\": \"Duniter knooppunt adres\",\n \"PEER_CHANGED_TEMPORARY\": \"Adres tijdelijk worden gebruikt\",\n \"USE_LOCAL_STORAGE\": \"Lokale opslag inschakelen\",\n \"USE_LOCAL_STORAGE_HELP\": \"Laat je instellingen opslaan\",\n \"ENABLE_HELPTIP\": \"Contextgebonden hulp inschakelen\",\n \"ENABLE_UI_EFFECTS\": \"Schakel visuele effecten\",\n \"HISTORY_SETTINGS\": \"Mijn rekening\",\n \"DISPLAY_UD_HISTORY\": \"Toon geproduceerde dividenden?\",\n \"AUTHENTICATION_SETTINGS\": \"Authentificatie\",\n \"REMEMBER_ME\": \"Onthoud mij\",\n \"REMEMBER_ME_HELP\": \"Hiermee kunt u blijven altijd aangesloten (niet aanbevolen).\",\n \"PLUGINS_SETTINGS\": \"Uitbreidingen\",\n \"BTN_RESET\": \"Herstel standaardinstellingen\",\n \"EXPERT_MODE\": \"Geavanceerde modus inschakelen\",\n \"EXPERT_MODE_HELP\": \"Toon meer details\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Duniter Knooppunt\",\n \"HOST\" : \"Adres\",\n \"HOST_HELP\": \"Aadres: server:poort\",\n \"USE_SSL\" : \"Secure?\",\n \"USE_SSL_HELP\" : \"(SSL-encryptie)\",\n \"BTN_SHOW_LIST\" : \"Lijst van knooppunten\"\n }\n },\n \"BLOCKCHAIN\": {\n \"HASH\": \"Hachee : {{hash}}\",\n \"VIEW\": {\n \"HEADER_TITLE\": \"Blok #{{number}}-{{hash|formatHash}}\",\n \"TITLE_CURRENT\": \"Huidige blok\",\n \"TITLE\": \"Blok #{{number|formatInteger}}\",\n \"COMPUTED_BY\": \"Berekend door het knooppunt\",\n \"SHOW_RAW\": \"Bekijk RAW-bestand\",\n \"TECHNICAL_DIVIDER\": \"Technische informatie\",\n \"VERSION\": \"Format versie\",\n \"HASH\": \"Hash berekend\",\n \"UNIVERSAL_DIVIDEND_HELP\": \"Munt gecoproduceerd door elk van de {{membersCount}} ledental\",\n \"EMPTY\": \"Er zijn geen gegevens in dit blok\",\n \"POW_MIN\": \"Mminimum moeilijkheid\",\n \"POW_MIN_HELP\": \"Moeilijkheid opgelegd hash te berekenen\",\n \"DATA_DIVIDER\": \"Gegevens\",\n \"IDENTITIES_COUNT\": \"Nieuwe identiteiten\",\n \"JOINERS_COUNT\": \"Nieuwe leden\",\n \"ACTIVES_COUNT\": \"Verlengingen\",\n \"ACTIVES_COUNT_HELP\": \"Leden die hun lidmaatschap te vernieuwen\",\n \"LEAVERS_COUNT\": \"Verlaters\",\n \"LEAVERS_COUNT_HELP\": \"Leden die niet langer wenst certificering\",\n \"EXCLUDED_COUNT\": \"Uitgesloten leden\",\n \"EXCLUDED_COUNT_HELP\": \"Oud-leden uitgesloten door niet-verlenging of gebrek aan certificeringen\",\n \"REVOKED_COUNT\": \"Identiteiten ingetrokken\",\n \"REVOKED_COUNT_HELP\": \"Deze rekeningen zullen niet langer leden\",\n \"TX_COUNT\": \"Transacties\",\n \"CERT_COUNT\": \"Certificeringen\",\n \"TX_TO_HIMSELF\": \"Ruil deal\",\n \"TX_OUTPUT_UNLOCK_CONDITIONS\": \"Omstandigheden van de introductie\",\n \"TX_OUTPUT_OPERATOR\": {\n \"AND\": \"en\",\n \"OR\": \"of\"\n },\n \"TX_OUTPUT_FUNCTION\": {\n \"SIG\": \"<b>handtekening</b> \",\n \"XHX\": \"<b>Wachtwoord</b>, wiens SHA256 =\",\n \"CSV\": \"Geblokkeerd\",\n \"CLTV\": \"Opgesloten\"\n }\n },\n \"LOOKUP\": {\n \"TITLE\": \"Blokken\",\n \"NO_BLOCK\": \"Geen blok\",\n \"LAST_BLOCKS\": \"Recente blokken :\",\n \"BTN_COMPACT\": \"Compact\"\n }\n },\n \"CURRENCY\": {\n \"SELECT\": {\n \"TITLE\": \"Valuta's\",\n \"CURRENCIES\": \"Bekende valuta's\",\n \"MEMBERS_COUNT\": \"{{membersCount}} leden\"\n },\n \"VIEW\": {\n \"TITLE\": \"Valuta\",\n \"TAB_CURRENCY\": \"Valuta\",\n \"TAB_WOT\": \"Gemeenschap\",\n \"TAB_NETWORK\": \"Netwerk\",\n \"CURRENCY_NAME\": \"Valuta naam\",\n \"MEMBERS\": \"Ledental\",\n \"MEMBERS_VARIATION\": \"Variatie since {{duration | formatDuration}}\",\n \"MONEY_DIVIDER\": \"Geld\",\n \"MASS\": \"Monetaire massa\",\n \"SHARE\": \"Aandeel per lid\",\n \"UD\": \"Universeel Dividend\",\n \"C_ACTUAL\": \"Huidige toename\",\n \"MEDIAN_TIME\": \"Blockchain tijd\",\n \"POW_MIN\": \"Algemene moeilijkheidsgraad\",\n \"MONEY_RULES_DIVIDER\": \"Monetaire regels\",\n \"C_RULE\": \"Toename\",\n \"UD_RULE\": \"Universeel dividend (formule)\",\n \"SIG_QTY_RULE\": \"Benodigd aantal certificaties om lid te worden\",\n \"SIG_STOCK\": \"Maximum aantal certificaties te versturen per lid\",\n \"SIG_PERIOD\": \"Minimum vertraging tussen 2 certificaties verzonden door één en dezelfde persoon.\",\n \"SIG_WINDOW\": \"Maximum vertraging voor een certificatie in behandeling wordt genomen\",\n \"STEP_MAX\": \"Maximum afstand tussen elk WoT lid en een nieuw lid.\",\n \"WOT_RULES_DIVIDER\": \"Lidmaatschapseisen\",\n \"XPERCENT\":\"Minimum percentage schildwachten te bereiken om de afstandsregel te respecteren\"\n }\n },\n \"NETWORK\": {\n \"VIEW\": {\n \"MEDIAN_TIME\": \"Blockchain tijd\",\n \"LOADING_PEERS\": \"Even geduld...\",\n \"NODE_ADDRESS\": \"Adres :\",\n \"ENDPOINTS\": {\n \"BMAS\": \"Endpoint (SSL)\",\n \"BMATOR\": \"Endpoint TOR\",\n \"ES_USER_API\": \"Knoop Cesium+\"\n }\n },\n \"INFO\": {\n \"ONLY_SSL_PEERS\": \"Les noeuds non SSL ont un affichage dégradé, car Cesium fonctionne en mode HTTPS.\"\n }\n },\n \"PEER\": {\n \"PEERS\": \"Knopen\",\n \"SIGNED_ON_BLOCK\": \"Getekend op blok\",\n \"MIRROR\": \"spiegel\",\n \"CURRENT_BLOCK\": \"Blok #\",\n \"VIEW\": {\n \"TITLE\": \"Knoop\",\n \"OWNER\": \"Maakt deel uit van\",\n \"SHOW_RAW_PEERING\": \"Zie netwerkdocument\",\n \"KNOWN_PEERS\": \"Bekende knopen :\",\n \"GENERAL_DIVIDER\": \"Algemene informatie\",\n \"ERROR\": {\n \"LOADING_TOR_NODE_ERROR\": \"Kan knooppunt niet worden opgehaald. De wachttijd wordt overschreden.\",\n \"LOADING_NODE_ERROR\": \"Kan knooppunt niet worden opgehaald\"\n }\n }\n },\n \"WOT\": {\n \"SEARCH_HELP\": \"Zoeken (lid of publieke sleutel)\",\n \"SEARCH_INIT_PHASE_WARNING\": \"Tijdens de pre-registratiefase, het zoeken van lopende registraties <b>kan lang</b> zijn. Dank je wel geduld...\",\n \"REGISTERED_SINCE\": \"Registratie\",\n \"REGISTERED_SINCE_BLOCK\": \"Geregistreerd op blok #\",\n \"NO_CERTIFICATION\": \"Geen gevalideerde certificaties\",\n \"NO_GIVEN_CERTIFICATION\": \"Geen uitgegeven certificaties\",\n \"NOT_MEMBER_PARENTHESIS\": \"(niet-lid)\",\n \"IDENTITY_REVOKED_PARENTHESIS\": \"(ingetrokken identiteit)\",\n \"MEMBER_PENDING_REVOCATION_PARENTHESIS\": \"(intrekking in behandeling)\",\n \"EXPIRE_IN\": \"Verloopt\",\n \"NOT_WRITTEN_EXPIRE_IN\": \"Uiterlijke<br/>behandeling\",\n \"EXPIRED\": \"Verlopen\",\n \"PSEUDO\": \"Pseudoniem\",\n \"SIGNED_ON_BLOCK\": \"Uitgegeven op block #{{block}}\",\n \"WRITTEN_ON_BLOCK\": \"Geschreven op block #{{block}}\",\n \"GENERAL_DIVIDER\": \"Algemene informatie\",\n \"NOT_MEMBER_ACCOUNT\": \"Simpele rekening (geen lid)\",\n \"NOT_MEMBER_ACCOUNT_HELP\": \"Dit is een eenvoudige rekening, zonder dat er een aanvraag voor lidmaatschap in de wacht wordt gezet.\",\n \"TECHNICAL_DIVIDER\": \"Technische informatie\",\n \"BTN_CERTIFY\": \"Certificeren\",\n \"BTN_YES_CERTIFY\": \"Ja, Certificeren\",\n \"BTN_SELECT_AND_CERTIFY\": \"Nieuwe certificatie\",\n \"ACCOUNT_OPERATIONS\": \"Operaties op de rekening\",\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"Identiteit {{title}}\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Register\",\n \"NEWCOMERS\": \"Nieuwe leden:\",\n \"PENDING\": \"Aspirant leden:\",\n \"REGISTERED\": \"Geregistreerd {{sigDate | formatFromNow}}\",\n \"MEMBER_FROM\": \"Lid sinds {{memberDate|medianFromNowShort}}\",\n \"BTN_NEWCOMERS\": \"Nieuwste leden\",\n \"BTN_PENDING\": \"Registraties in afwachting\",\n \"SHOW_MORE\": \"Toon meer\",\n \"SHOW_MORE_COUNT\": \"(huidige limiet op {{limit}})\",\n \"NO_PENDING\": \"Er zijn geen registraties in afwachting gevonden.\",\n \"NO_NEWCOMERS\": \"Er zijn geen nieuwe leden gevonden.\"\n },\n \"MODAL\": {\n \"TITLE\": \"Zoeken\"\n },\n \"CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certificaties\",\n \"SUMMARY\": \"Ontvangen certificaties\",\n \"LIST\": \"Details van ontvangen certificaties\",\n \"PENDING_LIST\": \"Certificaties in afwachting\",\n \"RECEIVED\": \"Ontvangen certificaties\",\n \"RECEIVED_BY\": \"Certificaties ontvanged door {{uid}}\",\n \"ERROR\": \"Ontvangen vertificaties met fout\",\n \"SENTRY_MEMBER\": \"Referent lid\"\n },\n \"GIVEN_CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Verzonden certificaties\",\n \"SUMMARY\": \"Verzonden certificaties\",\n \"LIST\": \"Details van verzonden certificaties\",\n \"PENDING_LIST\": \"Certificaties in afwachting\",\n \"SENT\": \"Verzonden certificaties\",\n \"SENT_BY\": \"Certificaties verzonden door {{uid}}\",\n \"ERROR\": \"Verzonden certificaties met fout\"\n }\n },\n \"LOGIN\": {\n \"TITLE\": \"<i class=\\\"icon ion-locked\\\"></i> Inloggen\",\n \"SALT\": \"Beveiligingszin\",\n \"SALT_HELP\": \"Zin ter beveiliging van je rekening\",\n \"SHOW_SALT\": \"Toon de beveiligingszin\",\n \"PASSWORD\": \"Wachtwoord\",\n \"PASSWORD_HELP\": \"Wachtwoord ter beveiliging van je rekening\",\n \"NO_ACCOUNT_QUESTION\": \"Nog geen rekening?\",\n \"CREATE_ACCOUNT\": \"Open een rekening\",\n \"FORGOTTEN_ID\": \"Wachtwoord vergeten?\"\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Mijn rekening\",\n \"BALANCE\": \"Saldo\",\n \"LAST_TX\": \"Recente transacties\",\n \"BALANCE_ACCOUNT\": \"Rekeningsaldo\",\n \"NO_TX\": \"Geen transacties\",\n \"SHOW_MORE_TX\": \"Show more\",\n \"SHOW_ALL_TX\": \"Show all\",\n \"TX_FROM_DATE\": \"(huidige limiet op {{fromTime|medianFromNowShort}})\",\n \"PENDING_TX\": \"Transacties in afwachting\",\n \"ERROR_TX\": \"Niet uitgevoerde transacties\",\n \"ERROR_TX_SENT\": \"Verzonden transacties\",\n \"ERROR_TX_RECEIVED\": \"Ontvangen transacties\",\n \"EVENTS\": \"Gebeurtenissen\",\n \"WAITING_MEMBERSHIP\": \"Lidmaatschapsverzoek verzonden. In afwachting van validatie.\",\n \"WAITING_CERTIFICATIONS\": \"Je hebt {{needCertificationCount}} certificatie(s) nodig om lid te worden\",\n \"WILL_MISSING_CERTIFICATIONS\": \"Je heeft binnenkort <b>onvoldoende certificaties</b> (ten minste {{willNeedCertificationCount}} benodigd)\",\n \"WILL_NEED_RENEW_MEMBERSHIP\": \"Je lidmaatschap <b>gaat verlopen op {{membershipExpiresIn|formatDurationTo}}</b>. Vergeet niet <a ng-click=\\\"doQuickFix('renew')\\\">je lidmaatschap te vernieuwen</a> voor die tijd.\",\n \"CERTIFICATION_COUNT\": \"Aantal certificaties\",\n \"CERTIFICATION_COUNT_SHORT\": \"Certificaties\",\n \"SIG_STOCK\": \"Voorraad uit te geven certificaties\",\n \"BTN_RECEIVE_MONEY\": \"Ontvangen\",\n \"BTN_MEMBERSHIP_IN_DOTS\": \"Lidmaatschap aanvragen...\",\n \"BTN_MEMBERSHIP_RENEW\": \"Lidmaatschap verlengen\",\n \"BTN_MEMBERSHIP_RENEW_DOTS\": \"Lidmaatschap verlengen...\",\n \"BTN_MEMBERSHIP_OUT_DOTS\": \"Lidmaatschap opzeggen...\",\n \"BTN_SEND_IDENTITY_DOTS\": \"Identiteit publiceren...\",\n \"BTN_SECURITY_DOTS\": \"Rekening en veiligheid...\",\n \"BTN_SHOW_DETAILS\": \"Tonen technische informatie\",\n \"BTN_REVOKE\": \"Deze identiteit<span class='hidden-xs hidden-sm'> definitief</span> opzeggen...\",\n \"NEW\": {\n \"TITLE\": \"Registratie\",\n \"SLIDE_1_TITLE\": \"Selecteer een valuta:\",\n \"SLIDE_2_TITLE\": \"Soort rekening:\",\n \"MEMBER_ACCOUNT\": \"Persoonlijke rekening (lidmaatschap)\",\n \"MEMBER_ACCOUNT_HELP\": \"Als je nog niet als individu geregistreerd bent (één rekening per individu mogelijk).\",\n \"WALLET_ACCOUNT\": \"Eenvoudige portefeille\",\n \"WALLET_ACCOUNT_HELP\": \"Als je een onderneming, stichting etc. vertegenwoordigd of eenvoudigweg een additionele portefeille nodig hebt. Geen individueel universeel dividend zal door deze rekening gecréeerd worden.\",\n \"SALT_WARNING\": \"Kies een beveiligingszin.<br/>Deze heb je nodig voor ieder verbinding met je rekening.<br/><br/><b>Zorg dat je deze zin goed onthoud</b>.<br/>Eenmaal verloren, is er geen mogelijkheid om hem te achterhalen!\",\n \"PASSWORD_WARNING\": \"Kies een wachtwoord.<br/>Deze heb je nodig voor ieder verbinding met je rekening.<br/><br/><b>Zorg dat je dit woord goed onthoud</b>.<br/>Eenmaal verloren, is er geen mogelijkheid om hem te achterhalen!\",\n \"PSEUDO_WARNING\": \"Kies een pseudoniem.<br/>Het dient om makkelijker gevonden te worden door anderen.<br/><br/>.Gebruik van spaties, komma's en accenten is niet toegestaan.<br/><div class='hidden-xs'><br/>Voorbeeld: <span class='gray'>JulesDeelder, JohanVermeer, etc.</span>\",\n \"PSEUDO\": \"Pseudoniem\",\n \"PSEUDO_HELP\": \"joe123\",\n \"SALT_CONFIRM\": \"Bevestig\",\n \"SALT_CONFIRM_HELP\": \"Bevestig de beveiligingszin\",\n \"PASSWORD_CONFIRM\": \"Bevestig\",\n \"PASSWORD_CONFIRM_HELP\": \"Bevestig het wachtwoord\",\n \"SLIDE_6_TITLE\": \"Bevestiging:\",\n \"COMPUTING_PUBKEY\": \"Berekening...\",\n \"LAST_SLIDE_CONGRATULATION\": \"Bravo! Je hebt alle verplichte velden ingevuld.<br/>Je kunt je <b>rekeningaanvraag verzenden</b>.<br/><br/>Ter informatie, de publieke sleutel hieronder identificeert je toekomstige rekening.<br/>Je kunt deze aan derde partijen communiceren om geld te ontvangen. Zodra je rekening geopend is, kun je de sleutel terugvinden onder <b>{{'ACCOUNT.TITLE'|translate}}</b>.\",\n \"CONFIRMATION_MEMBER_ACCOUNT\": \"<b class=\\\"assertive\\\">Waarschuwing:</b> je beveiligingszin, wachtwoord en pseudoniem kunnen hierna niet gewijzigd worden.<br/><b>Zorg dat ze goed onthoudt!</b><br/><b>Weet je zeker</b> dat je je persoonlijke rekeningaanvraag wil verzenden?\",\n \"CONFIRMATION_WALLET_ACCOUNT\": \"<b class=\\\"assertive\\\">Waarschuwing:</b> je wachtwoord en pseudoniem kunnen hierna niet gewijzigd worden.<br/><b>Zorg dat ze goed onthoudt!</b><br/><b>Weet je zeker</b> dat je deze portefeilleaanvraag wil verzenden?\",\n \"PSEUDO_AVAILABLE\": \"Deze naam is beschikbaar\",\n \"PSEUDO_NOT_AVAILABLE\": \"Deze gebruikersnaam is niet beschikbaar\",\n \"INFO_LICENSE\": \"Om de valuta te sluiten, vragen wij u om te lezen en deze licentie te accepteren.\",\n \"BTN_ACCEPT\": \"Ik accepteer\",\n \"BTN_ACCEPT_LICENSE\": \"Ik ga akkoord met de licentie\"\n },\n \"POPUP_REGISTER\": {\n \"TITLE\": \"Voer een pseudoniem in\",\n \"HELP\": \"Een pseudoniem is nodig voor anderen om je te kunnen vinden.\"\n },\n \"FILE_NAME\": \"{{currency}} - Rekeningafschrift {{pubkey|formatPubkey}} {{currentTime|formatDateForFile}}.csv\",\n \"HEADERS\": {\n \"TIME\": \"Datum\",\n \"AMOUNT\": \"Bedrag\",\n \"COMMENT\": \"Commentaar\"\n }\n },\n \"TRANSFER\": {\n \"TITLE\": \"Overboeken\",\n \"SUB_TITLE\": \"Geld overboeken\",\n \"FROM\": \"Van\",\n \"TO\": \"Aan\",\n \"AMOUNT\": \"Bedrag\",\n \"AMOUNT_HELP\": \"Bedrag\",\n \"COMMENT\": \"Opmerking\",\n \"COMMENT_HELP\": \"Opmerking (optioneel)\",\n \"BTN_SEND\": \"Verzenden\",\n \"BTN_ADD_COMMENT\": \"Opmerking toevoegen\",\n \"WARN_COMMENT_IS_PUBLIC\": \"Houd er rekening mee dat <b>reacties openbaar zijn </b> (niet-versleuteld).\",\n \"MODAL\": {\n \"TITLE\": \"Overboeking\"\n }\n },\n \"ERROR\": {\n \"POPUP_TITLE\": \"Error\",\n \"UNKNOWN_ERROR\": \"Unknown error\",\n \"CRYPTO_UNKNOWN_ERROR\": \"Your browser is not compatible with cryptographic features.\",\n \"FIELD_REQUIRED\": \"This field is required.\",\n \"FIELD_TOO_SHORT\": \"Value is too short (min {{minLength]] characters).\",\n \"FIELD_TOO_SHORT_WITH_LENGTH\": \"This field value is too short.\",\n \"FIELD_TOO_LONG\": \"Value is exceeding max length.\",\n \"FIELD_TOO_LONG_WITH_LENGTH\": \"Value is too long (max {{maxLength}} characters).\",\n \"FIELD_ACCENT\": \"Commas and accent characters not allowed\",\n \"FIELD_NOT_NUMBER\": \"Value is not a number\",\n \"FIELD_NOT_INT\": \"Value is not an integer\",\n \"PASSWORD_NOT_CONFIRMED\": \"Must match previous password.\",\n \"SALT_NOT_CONFIRMED\": \"Must match previous phrase.\",\n \"SEND_IDENTITY_FAILED\": \"Error while trying to register.\",\n \"SEND_CERTIFICATION_FAILED\": \"Could not certify identity.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY\": \"You could not send certification, because your account is <b>not a member account</b>.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF\": \"You could not send certification now, because your are <b>not a member</b> yet.<br/><br/>You still need certification to become a member.\",\n \"IDENTITY_TO_CERTIFY_HAS_NO_SELF\": \"This account could not be certified. No registration found, or need to renew.\",\n \"LOGIN_FAILED\": \"Error while sign in.\",\n \"LOAD_IDENTITY_FAILED\": \"Could not load identity.\",\n \"LOAD_REQUIREMENTS_FAILED\": \"Could not load identity requirements.\",\n \"SEND_MEMBERSHIP_IN_FAILED\": \"Error while sending registration as member.\",\n \"SEND_MEMBERSHIP_OUT_FAILED\": \"Error while sending membership revocation.\",\n \"REFRESH_WALLET_DATA\": \"Could not refresh wallet.\",\n \"GET_CURRENCY_PARAMETER\": \"Could not get currency parameters.\",\n \"GET_CURRENCY_FAILED\": \"Could not load currency.\",\n \"SEND_TX_FAILED\": \"Could not send transaction.\",\n \"ALL_SOURCES_USED\": \"Please wait the next block computation (All transaction sources has been used).\",\n \"NOT_ENOUGH_SOURCES\": \"Not enough changes to send this amount in one time.<br/>Maximum amount: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.\",\n \"ACCOUNT_CREATION_FAILED\": \"Error while creating your member account.\",\n \"RESTORE_WALLET_DATA_ERROR\": \"Error while reloading settings from local storage\",\n \"LOAD_WALLET_DATA_ERROR\": \"Error while loading wallet data.\",\n \"COPY_CLIPBOARD_FAILED\": \"Could not copy to clipboard\",\n \"TAKE_PICTURE_FAILED\": \"Could not get picture.\",\n \"SCAN_FAILED\": \"Could not scan QR code.\",\n \"SCAN_UNKNOWN_FORMAT\": \"Code not recognized.\",\n \"WOT_LOOKUP_FAILED\": \"Search failed.\",\n \"LOAD_PEER_DATA_FAILED\": \"Duniter peer not accessible. Please retry later.\",\n \"NEED_LOGIN_FIRST\": \"Please sign in first.\",\n \"AMOUNT_REQUIRED\": \"Amount is required.\",\n \"AMOUNT_NEGATIVE\": \"Negative amount not allowed.\",\n \"NOT_ENOUGH_CREDIT\": \"Not enough credit.\",\n \"INVALID_NODE_SUMMARY\": \"Unreachable peer or invalid address\",\n \"INVALID_USER_ID\": \"Field 'pseudonym' must not contains spaces or special characters.\",\n \"INVALID_COMMENT\": \"Field 'reference' has a bad format.\",\n \"INVALID_PUBKEY\": \"Public key has a bad format.\",\n \"IDENTITY_INVALID_BLOCK_HASH\": \"This membership application is no longer valid (because it references a block that network peers are cancelled): the person must renew its application for membership <b>before</b> being certified.\",\n \"IDENTITY_EXPIRED\": \"This identity has expired: this person must re-apply <b>before</b> being certified.\",\n \"IDENTITY_SANDBOX_FULL\": \"Could not register, because peer's sandbox is full.<br/><br/>Please retry later or choose another Duniter peer (in <b>Settings</b>).\",\n \"WOT_PENDING_INVALID_BLOCK_HASH\": \"Membership not valid.\",\n \"WALLET_INVALID_BLOCK_HASH\": \"Your membership application is no longer valid (because it references a block that network peers are cancelled).<br/>You must <a ng-click=\\\"doQuickFix('renew')\\\">renew your application for membership</a> to fix this issue.\",\n \"WALLET_IDENTITY_EXPIRED\": \"The publication of your identity <b>has expired</b>.<br/>You must <a ng-click=\\\"doQuickFix('fixIdentity')\\\">re-issue your identity</a> to resolve this issue.\",\n \"WALLET_HAS_NO_SELF\": \"Your identity must first have been published, and not expired.\",\n \"IDENTITY_ALREADY_CERTIFY\": \"You have <b>already certified</b> that identity.<br/><br/>Your certificate is still valid (expires {{expiresIn|formatDuration}}).\",\n \"IDENTITY_ALREADY_CERTIFY_PENDING\": \"You have <b>already certified</b> that identity.<br/><br/>Your certification is still pending (Deadline for treatment {{expiresIn|formatDuration}}).\",\n \"UNABLE_TO_CERTIFY_TITLE\": \"Unable to certify\",\n \"LOAD_NEWCOMERS_FAILED\": \"Unable to load new members.\",\n \"LOAD_PENDING_FAILED\": \"Unable to load pending registrations.\",\n \"ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"You must <b>be a member</b> in order to perform this action.\",\n \"ONLY_SELF_CAN_EXECUTE_THIS_ACTION\": \"You must have <b>published your identity</b> in order to perform this action.\",\n \"EXISTING_ACCOUNT\": \"Je gegevens komen overeen met een bestaande rekening, met de <a ng-click=\\\"showHelpModal('pubkey')\\\">publieke sleutel</a>:\",\n \"EXISTING_ACCOUNT_REQUEST\": \"Gelieve je gegevens te wijzigen zodat ze met een niet gebruikte rekening overeenkomen.\"\n },\n \"INFO\": {\n \"POPUP_TITLE\": \"Informatie\",\n \"CERTIFICATION_DONE\": \"Identiteit succesvol getekend\",\n \"NOT_ENOUGH_CREDIT\": \"Niet genoeg krediet\",\n \"TRANSFER_SENT\": \"Verzoek tot overboeken succesvol verzonden\",\n \"COPY_TO_CLIPBOARD_DONE\": \"Kopie geslaagd\",\n \"MEMBERSHIP_OUT_SENT\": \"Opzegging lidmaatschap succesvol verzonden\",\n \"NOT_NEED_MEMBERSHIP\": \"Je bent al lid.\",\n \"IDENTITY_WILL_MISSING_CERTIFICATIONS\": \"Deze identiteit heeft binnenkort onvoldoende certificaties (ten minste {{willNeedCertificationCount}} nodig).\",\n \"REVOCATION_SENT\": \"Intrekking succesvol verzonden\",\n \"REVOCATION_SENT_WAITING_PROCESS\": \"Intrekking <b>is succesvol verzonden</b>. Het wacht op verwerking.\",\n \"FEATURE_NOT_AVAILABLE_ON_DEMO\": \"Functionaliteit niet beschikbaar op deze demonstratiesite.<br/>Om <b>veiligheidsredenen</b> raden we u aan uw kopie van de software te <b>installeren</b>.<br/>Bezoek de website <a href='https://cesium.app'>www.cesium.app</a> voor hulp.\",\n \"EMPTY_TX_HISTORY\": \"Aucune operatie à exporteur\"\n },\n \"CONFIRM\": {\n \"POPUP_TITLE\": \"<b>Bevestiging</b>\",\n \"POPUP_WARNING_TITLE\": \"<b>Waarschuwing</b>\",\n \"CERTIFY_RULES_TITLE_UID\": \"Certificeer {{uid}}\",\n \"CERTIFY_RULES\": \"<b>Beveiligingswaarschuwing:</b><br/><br/><b class=\\\"assertive\\\">Certificeer een rekening niet</b> als je gelooft dat: <ul><li>1.) de aanvrager niet echt is.<li>2.) de aanvrager al een andere gecertificeerde rekening heeft.<li>3.) de aanvrager opzettelijk of door onzorgvuldigheid regel 1 of 2 overtreedt bij het verzenden van certificaten.</ul></small><br/>Weet je zeker dat je deze identieit wilt certificeren?\",\n \"TRANSFER\": \"<b>Samenvatting van de overboeking:</b><br/><br/><ul><li> - Van: <b>{{from}}</b></li><li> - Aan: <b>{{to}}</b></li><li> - Bedrag: <b>{{amount}} {{unit}}</b></li><li> - Opmerking: <i>{{comment}}</i></li></ul><br/><b>Weet je zeker dat je deze overboeking wil doen?</b>\",\n \"MEMBERSHIP_OUT\": \"<b>Waarschuwing</b>:<br/>Je staat op het punt je lidmaatschap te beëindigen. Dit kan <b>niet ongedaan</b> worden gemaakt.<br/></br/><b>Weet je zeker dat je door wil gaan?</b>\",\n \"LOGIN_UNUSED_WALLET_TITLE\": \"Typefout?\",\n \"LOGIN_UNUSED_WALLET\": \"Je bent ingelogged op een rekening die <b>inactief</b> lijkt te zijn.<br/><br/>Als deze rekening niet met de jouwe overeenkomt, komt dat waarschijnlijk door een <b>typefout</b> bij het inloggen.<br/><br/><b>Wilt u toch doorgaan met deze rekening?</b>\",\n \"FIX_IDENTITY\": \"De pseudoniem <b>{{uid}}</b> zal opnieuw gepubliceerd worden, waarmee de oude verlopen publicatie wordt vervangen.<br/></br/><bWeet je zeker</b> dat je door wil gaan?\",\n \"FIX_MEMBERSHIP\": \"Je verzoek to lidmaatschap zal verstuurd worden.<br/></br/><b>Weet je het zeker?</b>\",\n \"RENEW_MEMBERSHIP\": \"Je lidmaatschap zal verlengd worden.<br/></br/><b>Weet je het zeker?</b>\",\n \"REVOKE_IDENTITY\": \"<b>Beveiligingswaarschuwing:</b><br/>You will <b>definitely revoke this identity</b>.<br/><br/>The public key and the associated nickname <b>will never be used again</b> (for a member account).<br/></br/><b>Are you sure</b> you want to continue?\",\n \"REVOKE_IDENTITY_2\": \"Deze handeling is <b>niet terug te draaien</b>!<br/><br/><b>Weet je zeker</b> dat je door wil gaan?\",\n \"NOT_NEED_RENEW_MEMBERSHIP\": \"Je lidmaatschap hoeft niet verlengd te worden (het zal pas verlopen na {{membershipExpiresIn|formatDuration}}).<br/></br/><b>Weet je zeker</b> dat je een verlengingsaanvraag wil versturen?\",\n \"SAVE_BEFORE_LEAVE\": \"Wil je <b>je wijzigingen opslaan</b> voor je de pagina verlaat?\",\n \"SAVE_BEFORE_LEAVE_TITLE\": \"Wijzigingen niet opgeslagen\",\n \"LICENCE\": \"Ik heb gelezen en geaccepteerd de voorwaarden van de vergunning G1\"\n },\n \"DOWNLOAD\": {\n \"POPUP_TITLE\": \"<b>Intrekkingsdocument</b>\",\n \"POPUP_REVOKE_MESSAGE\": \"Om je rekening te beveiligen, download het <b>rekening intrekkingsdocument</b>. Dit heb je nodig om je rekening op te heffen (in het geval van diefstal, een verandering van ID, een ten onrechte gemaakte rekening, etc.).<br/><br/><b>Bewaar deze op een veilige plaats.</b>\"\n },\n \"HELP\": {\n \"TITLE\": \"Online help\",\n \"JOIN\": {\n \"SECTION\": \"Join\",\n \"SALT\": \"The protection phrase is very important. It is used to hash you password, which in turn is used to calculate your <span class=\\\"text-italic\\\">public account key</span> (its number) and the private key to access it. <b>Please remeber this phrase well</b>, because there is no way to recover it when lost. What's more, it cannot be changed without having to create a new account.<br/><br/>A good protection phrase must be sufficiently long (8 characters at the very least) and as original as possible.\",\n \"PASSWORD\": \"The password is very important. Together with the protection phrase, it is use to calculate your account number (public key) and the private key to access it. <b>Please remember it well</b>, because there is no way to recover it when lost. What's more, it cannot be changed without having to create a new account.<br/><br/>A good password is made (ideally) of at least 8 characters, with at least one capital and one number.\",\n \"PSEUDO\": \"A pseudonym is used only when joining as <span class=\\\"text-italic\\\">member</span>. It is always associated with a wallet (by its <span class=\\\"text-italic\\\">public key</span>). It is published on the network so that other users may identify it, certify or send money to the account. A pseudonym must be unique among all members (current and past).\"\n },\n \"GLOSSARY\": {\n \"SECTION\": \"Glossary\",\n \"PUBKEY_DEF\": \"Een publieke sleutel identificeert altijd een portemonnee. Het kan een lid identificeren. In Cesium wordt berekend met de geheime ID en wachtwoord.\",\n \"MEMBER\": \"Member\",\n \"MEMBER_DEF\": \"A member is a real and living human, wishing to participate freely to the monitary community. The member will receive universal dividend, according to the period and amount as defined in the <span class=\\\"text-italic\\\">currency parameters</span>.\",\n \"CURRENCY_RULES\": \"Currency rules\",\n \"CURRENCY_RULES_DEF\": \"The currency rules are defined only once, and for all. They set the parameters under which the currency will perform: universal dividend calculation, the amount of certifications needed to become a member, the maximum amount of certifications a member can send, etc.<br/><br/>The parameters cannot be modified because of the use of a <span class=\\\"text-italic\\\">Blockchain</span> which carries and executes these rules, and constantly verifies their correct application. <a href=\\\"#/app/currency\\\">See current parameters</a>.\",\n \"BLOCKCHAIN\": \"Blockchain\",\n \"BLOCKCHAIN_DEF\": \"The Blockchain is a decentralised system which, in case of Duniter, serves to carry and execute the <span class=\\\"text-italic\\\">currency rules</span>.<br/><a href=\\\"http://en.duniter.org/presentation/\\\" target=\\\"_blank\\\">Read more about Duniter</a> and the working of its blockchain.\",\n \"UNIVERSAL_DIVIDEND_DEF\": \"The Universal Dividend (UD) is the quantity of money co-created by each member, according to the period and the calculation defined in the <span class=\\\"text-italic\\\">currency rules</span>.<br/>Every term, the members receive an equal amount of new money on their account.<br/><br/>The UD undergoes a steady growth, to remain fair under its members (current and future), calculated by an average life expectancy, as demonstrated in the Relative Theory of Money (RTM).<br/><a href=\\\"http://trm.creationmonetaire.info\\\" target=\\\"_system\\\">Read more about RTM</a> and open money.\"\n },\n \"TIP\": {\n \"MENU_BTN_CURRENCY\": \"Menu <b>{{'MENU.CURRENCY'|translate}}</b> allows discovery of <b>currency parameters</b> and its state.\",\n \"CURRENCY_WOT\": \"The <b>member count</b> shows the <b>community's weight and evolution</b>.\",\n \"CURRENCY_MASS\": \"Shown here is the <b>total amount</b> currently in circulation and its <b>average distribution</b> per member.<br/><br/>This allows to estimate the <b>worth of any amount</b>, in respect to what <b>others own</b> on their account (on average).\",\n \"CURRENCY_UNIT_RELATIVE\": \"The unit used here (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) signifies that the amounts in {{currency|capitalize}} have been devided by the <b>Universal Dividend</b> (UD).<br/><br/><small>This relative unit is <b>relevant</b> because it is stable in contrast to the permanently growing monitary mass.</small>\",\n \"CURRENCY_CHANGE_UNIT\": \"This button allows to <b>switch the unit</b> to show amounts in <b>{{currency|capitalize}}</b>, undevided by the Universal Dividend (instead of in “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”).\",\n \"CURRENCY_CHANGE_UNIT_TO_RELATIVE\": \"This button allows to <b>switch the unit</b> to show amounts in “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”, which is relative to the Universal Dividend (the amount co-produced by each member).\",\n \"CURRENCY_RULES\": \"The <b>rules</b> of the currency determine its <b>exact and predictible</b> performance.<br/><br/>As a true DNA of the currency these rules make the monetary code <b>transparent and understandable</b>.\",\n \"NETWORK_BLOCKCHAIN\": \"All monetary transactions are recoded in a <b>public and tamper proof</b> ledger, generally referred to as the <b>blockchain</b>.\",\n \"NETWORK_PEERS\": \"The <b>peers</b> shown here correspond to <b>computers that update and check</b> the blockchain.<br/><br/>The more active peers there are, the more <b>decentralised</b> and therefore trustworhty the currency becomes.\",\n \"NETWORK_PEERS_BLOCK_NUMBER\": \"This <b>number</b> indicates the peer's <b>latest validated block</b> (last page written in the ledger).<br/><br/>Green indicates that the block was equally validated by the <b>majority of other peers</b>.\",\n \"NETWORK_PEERS_PARTICIPATE\": \"<b>Each member</b>, equiped with a computer with Internet, <b>can participate, adding a peer</b> simply by <b>installing the Duniter software</b> (free/libre and open source). <a href=\\\"{{installDocUrl}}\\\" target=\\\"_system\\\">Read the installation manual >></a>.\",\n \"MENU_BTN_ACCOUNT\": \"<b>{{'ACCOUNT.TITLE'|translate}}</b> allows access to your account balance and transaction history.\",\n \"MENU_BTN_ACCOUNT_MEMBER\": \"Here you can consult your account status, transaction history and your certifications.\",\n \"WALLET_CERTIFICATIONS\": \"Click here to reveiw the details of your certifications (given and received).\",\n \"WALLET_BALANCE\": \"Your account <b>balance</b> is shown here.\",\n \"WALLET_BALANCE_RELATIVE\": \"{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>The used unit (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) signifies that the amount in {{currency|capitalize}} has been divided by the <b>Universal Dividend</b> (UD) co-created by each member.<br/>At this moment, 1 UD equals {{currentUD}} {{currency|capitalize}}.\",\n \"WALLET_BALANCE_CHANGE_UNIT\": \"You can <b>change the unit</b> in which amounts are shown in <b><i class=\\\"icon ion-android-settings\\\"></i> {{'MENU.SETTINGS'|translate}}</b>.<br/><br/>For example, to display amounts <b>directly in {{currency|capitalize}}</b> instead of relative amounts.\",\n \"WALLET_SEND\": \"Issue a payment in just a few clicks.\",\n \"WALLET_SEND_NO_MONEY\": \"Issue a payment in just a few clicks.<br/>(Your balance does not allow this yet)\",\n \"WALLET_OPTIONS\": \"Please note that this button allows access to <b>other, less used actions</b>.<br/><br/>Don't forget to take a quick look, when you have a moment!\",\n \"WALLET_RECEIVED_CERTS\": \"This shows the list of persons that certified you.\",\n \"WALLET_CERTIFY\": \"The button <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> allows selecting an identity and certifying it.<br/><br/>Only users that are <b>already member</b> may certify others.\",\n \"WALLET_CERT_STOCK\": \"Your supply of certifications (to send) is limited to <b>{{sigStock}} certifications</b>.<br/><br/>This supply will replete itself over time, as and when earlier certifications expire.\",\n \"MENU_BTN_WOT\": \"The menu <b>{{'MENU.WOT'|translate}}</b> allows searching <b>users</b> of the currency (member or not).\",\n \"WOT_SEARCH_TEXT_XS\": \"To search in the registry, type the <b>first letters of a users pseudonym or public key</b>.<br/><br/>The search will start automatically.\",\n \"WOT_SEARCH_TEXT\": \"To search in the registry, type the <b>first letters of a users pseudonym or public key</b>.<br/><br/>Then hit <b>Enter</b> to start the search.\",\n \"WOT_SEARCH_RESULT\": \"Simply click a user row to view the details sheet.\",\n \"WOT_VIEW_CERTIFICATIONS\": \"The row <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> shows how many members members validated this identity.<br/><br/>These certifications testify that the account belongs to <b>a living human</b> and this person has <b>no other member account</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_COUNT\": \"There are at least <b>{{sigQty}} certifications</b> needed to become a member and receive the <b>Universal Dividend</b>.\",\n \"WOT_VIEW_CERTIFICATIONS_CLICK\": \"Click here to open <b>a list of all certifications</b> given to and by this identity.\",\n \"WOT_VIEW_CERTIFY\": \"The button <b>{{'WOT.BTN_CERTIFY'|translate}}</b> allows to add your certification to this identity.\",\n \"CERTIFY_RULES\": \"<b>Attention:</b> Only certify <b>real and living persons</b> that do not own any other certified account.<br/><br/>The trust carried by the currency depends on each member's vigilance!\",\n \"MENU_BTN_SETTINGS\": \"The <b>{{'MENU.SETTINGS'|translate}}</b> allow you to configure the Cesium application.<br/><br/>For example, you can <b>change the unit</b> in which the currency will be shown.\",\n \"HEADER_BAR_BTN_PROFILE\": \"Click here to access your <b>user profile</b>\",\n \"SETTINGS_CHANGE_UNIT\": \"You can <b>change the display unit</b> of amounts by clicking here.<br/><br/>- Deactivate the option to show amounts in {{currency|capitalize}}.<br/>- Activate the option for relative amounts in {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (<b>divided</b> by the current Universal Dividend).\",\n \"END_LOGIN\": \"This guided visit has <b>ended</b>.<br/><br/>Welcome to the <b>free economy</b>!\",\n \"END_NOT_LOGIN\": \"This guided visit has <b>ended</b>.<br/><br/>If you wish to join the currency {{currency|capitalize}}, simply click <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> below.\"\n }\n }\n}\n);\n}]);\n","// Ionic Starter App\n\n// angular.module is a global place for creating, registering and retrieving Angular modules\n// 'starter' is the name of this angular module example (also set in a <body> attribute in index.html)\n// the 2nd parameter is an array of 'requires'\n// 'starter.controllers' is found in controllers.js\nangular.module('cesium-api', ['ionic', 'ionic-material', 'ngMessages', 'pascalprecht.translate', 'ngApi', 'angular-cache',\n 'angular.screenmatch', 'angular-fullscreen-toggle',\n 'cesium.filters', 'cesium.config', 'cesium.platform', 'cesium.templates', 'cesium.translations', 'cesium.directives',\n // API dependencies :\n 'cesium.services', 'cesium.api.demo.services', 'cesium.login.controllers', 'cesium.help.controllers'\n])\n\n .config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {\n 'ngInject';\n $stateProvider\n\n .state('app', {\n url: \"/app\",\n abstract: true,\n templateUrl: \"templates/api/menu.html\",\n controller: 'ApiCtrl'\n })\n\n .state('app.home', {\n url: \"/home?result&service&cancel&node\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/api/home.html\",\n controller: 'ApiDocCtrl'\n }\n }\n })\n\n .state('api', {\n url: \"/v1\",\n abstract: true,\n templateUrl: \"templates/api/menu.html\",\n controller: 'ApiCtrl'\n })\n\n .state('api.transfer', {\n cache: false,\n url: \"/payment/:pubkey?name&amount&udAmount&comment&preferred_node&redirect_url&cancel_url&demo&error\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/api/transfer.html\",\n controller: 'ApiTransferCtrl'\n }\n }\n });\n\n // if none of the above states are matched, use this as the fallback\n $urlRouterProvider.otherwise('/app/home');\n }])\n\n .controller('ApiCtrl', ['$scope', '$state', '$translate', '$ionicPopover', 'UIUtils', 'Modals', 'csSettings', function ($scope, $state, $translate, $ionicPopover, UIUtils, Modals, csSettings){\n 'ngInject';\n\n // Fill locales\n $scope.locales = angular.copy(csSettings.locales);\n\n $scope.showAboutModal = function(e) {\n e.preventDefault(); // avoid to open link href\n Modals.showAbout();\n };\n\n $scope.showHome = function() {\n $state.go('app.home') ;\n };\n\n $scope.changeLanguage = function(langKey) {\n $translate.use(langKey);\n $scope.hideLocalesPopover();\n csSettings.data.locale = _.findWhere($scope.locales, {id: langKey});\n };\n\n /* -- show/hide locales popup -- */\n\n $scope.showLocalesPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'templates/api/popover_locales.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.localesPopover = popover;\n }\n });\n };\n\n $scope.hideLocalesPopover = function() {\n if ($scope.localesPopover) {\n $scope.localesPopover.hide();\n $scope.localesPopover = null;\n }\n };\n }])\n\n .controller('ApiDocCtrl', ['$scope', '$rootScope', '$state', '$translate', '$sce', 'csCurrency', function ($scope, $rootScope, $state, $translate, $sce, csCurrency){\n 'ngInject';\n\n $scope.loading = true;\n $scope.transferData = {\n pubkey: 'G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU',\n amount: 100,\n comment: 'REFERENCE',\n name: 'www.domain.com',\n preferred_node: undefined,\n redirect_url: 'http://www.domain.com/payment?ref={comment}&tx={tx}&node={node}',\n cancel_url: 'http://www.domain.com/payment?ref={comment}&cancel'\n };\n $scope.transferButton = {\n html: undefined,\n showParameters: false, // hide integration parameters, by default\n icons: [\n {\n label: 'API.DOC.TRANSFER.EXAMPLE_BUTTON_ICON_NONE'\n },\n {\n label: 'API.DOC.TRANSFER.EXAMPLE_BUTTON_ICON_DUNITER',\n filename: '../img/logo_duniter_32px.png'\n },\n {\n label: 'API.DOC.TRANSFER.EXAMPLE_BUTTON_ICON_CESIUM',\n filename: '../img/logo_32px.png'\n },\n {\n label: 'API.DOC.TRANSFER.EXAMPLE_BUTTON_ICON_G1_COLOR',\n filename: '../img/logo_g1_32px.png'\n },\n {\n label: 'API.DOC.TRANSFER.EXAMPLE_BUTTON_ICON_G1_BLACK',\n filename: '../img/logo_g1_32px_black.png'\n }\n ],\n style: {\n enable: false,\n text: 'Ğ1 pubkey',\n bgColor: '#fbc14c',\n fontColor: 'black',\n width: undefined\n }\n };\n $scope.transferButton.style.icon = $scope.transferButton.icons[1/*Duniter icon*/];\n $scope.transferDemoUrl = $rootScope.rootPath + $state.href('api.transfer', angular.merge({}, $scope.transferData, {\n demo: true,\n redirect_url: $rootScope.rootPath + '#/app/home?service=payment&result={tx}&node={node}',\n cancel_url: $rootScope.rootPath + '#/app/home?service=payment&cancel'\n }));\n\n $scope.enter = function(e, state) {\n if (!$scope.loading) return; // already enter\n\n $scope.result = {};\n if (state.stateParams && state.stateParams.service) {\n $scope.result.type = state.stateParams.service;\n }\n if (state.stateParams && state.stateParams.result) {\n $scope.result.content = state.stateParams.result;\n }\n if (state.stateParams && state.stateParams.cancel) {\n $scope.result.cancelled = true;\n }\n if (state.stateParams && state.stateParams.node) {\n $scope.result.node = state.stateParams.node;\n }\n\n csCurrency.get()\n .then(function(currency) {\n return $translate('API.DOC.TRANSFER.EXAMPLE_BUTTON_DEFAULT_TEXT', {currency: currency.name});\n })\n .then(function(buttonText) {\n $scope.transferButton.style.text = buttonText;\n $scope.loading = false;\n\n // compute HTML button\n $scope.computeTransferButtonHtml();\n });\n\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n // watch from update\n $scope.computeTransferButtonHtml = function() {\n if ($scope.loading) return; // skip if loading\n\n // Compute URL\n var url = $rootScope.rootPath + $state.href('api.transfer', $scope.transferData);\n\n var html;\n // Compute HTML: simple button\n if (!$scope.transferButton.style.enable){\n html = '<a href=\"'+url+'\">\\n'+\n ' <img src=\"'+$rootScope.rootPath + '../img/duniter_button.svg\">\\n'+\n '</a>';\n }\n // Compute HTML: advanced button\n else {\n html = '<a href=\"'+url+'\">\\n'+\n ' <div style=\"border-radius: 5px; min-height: 42px; text-align: center; padding: 5px; line-height: 30px; ';\n if ($scope.transferButton.style.width) {\n html += 'max-width: '+$scope.transferButton.style.width+'; ';\n }\n if ($scope.transferButton.style.bgColor) {\n html += 'background-color: '+$scope.transferButton.style.bgColor+'; ';\n }\n if ($scope.transferButton.style.fontColor) {\n html += 'color: '+$scope.transferButton.style.fontColor+'; ';\n }\n html += '\">\\n';\n if ($scope.transferButton.style.icon && $scope.transferButton.style.icon.filename) {\n html += ' <img style=\"vertical-align: middle;\" src=\"'+$rootScope.rootPath + $scope.transferButton.style.icon.filename+'\">\\n';\n }\n html += ' ' + $scope.transferButton.style.text + '\\n' +\n ' </div>\\n' +\n '</a>';\n }\n\n if ($scope.transferButton.html != html) {\n $scope.transferButton.html = html;\n $scope.$broadcast('$$rebind::transferButton'); // force rebind\n }\n };\n $scope.$watch('transferData', $scope.computeTransferButtonHtml, true);\n $scope.$watch('transferButton.style', $scope.computeTransferButtonHtml, true);\n }])\n\n .controller('ApiTransferCtrl', ['$scope', '$rootScope', '$timeout', '$controller', '$state', '$q', '$translate', '$filter', '$window', '$ionicHistory', 'BMA', 'CryptoUtils', 'UIUtils', 'csConfig', 'csSettings', 'csPlatform', 'csCurrency', 'csTx', 'csWallet', 'csDemoWallet', function($scope, $rootScope, $timeout, $controller, $state, $q, $translate, $filter,\n $window, $ionicHistory, BMA, CryptoUtils, UIUtils, csConfig, csSettings,\n csPlatform, csCurrency, csTx, csWallet, csDemoWallet) {\n 'ngInject';\n\n // WARN: Disable demo mode, on the API (a non-blocking warn message will be display later)\n var config = csConfig;\n if (config.demo) {\n config = angular.copy(config);\n config.demo = false;\n config.readonly = false;\n }\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('AuthCtrl', {$scope: $scope, csConfig: config}));\n\n $scope.loading = true;\n $scope.transferData = {\n amount: undefined,\n amounts: undefined,\n comment: undefined,\n pubkey: undefined,\n name: undefined,\n redirect_url: undefined,\n cancel_url: undefined,\n node: undefined\n };\n\n $scope.enter = function(e, state) {\n $rootScope.errorState = state.stateName;\n\n if (!$scope.loading) return; // already enter\n\n if (state.stateParams && state.stateParams.amount) {\n var amountStr = state.stateParams.amount.trim();\n var amounts = ((amountStr.indexOf('|') !== -1) && amountStr.split('|')) ||\n ((amountStr.indexOf(' ') !== -1) && amountStr.split(' ')) ||\n ((amountStr.indexOf(';') !== -1) && amountStr.split(';'));\n if (amounts) {\n $scope.transferData.amounts = amounts.reduce(function(res, amountStr) {\n var amount = normalizeAmount(amountStr);\n return amount > 0 ? res.concat(amount) : res;\n }, []);\n if ($scope.transferData.amounts.length === 1) {\n $scope.transferData.amount = $scope.transferData.amounts[0];\n delete $scope.transferData.amounts;\n }\n else {\n $scope.transferData.amounts.sort();\n }\n }\n else {\n $scope.transferData.amount = normalizeAmount(amountStr);\n }\n }\n if (state.stateParams && state.stateParams.pubkey) {\n $scope.transferData.pubkey = state.stateParams.pubkey;\n }\n if (state.stateParams && state.stateParams.name) {\n $scope.transferData.name= state.stateParams.name;\n }\n if (state.stateParams && state.stateParams.comment) {\n $scope.transferData.comment = state.stateParams.comment;\n }\n if (state.stateParams && state.stateParams.redirect_url) {\n $scope.transferData.redirect_url = state.stateParams.redirect_url;\n }\n if (state.stateParams && state.stateParams.cancel_url) {\n $scope.transferData.cancel_url = state.stateParams.cancel_url;\n }\n if (state.stateParams && state.stateParams.demo) {\n $scope.demo = true;\n }\n\n if (state.stateParams && state.stateParams.preferred_node) {\n var\n isHttpsMode = $window.location.protocol === 'https:',\n useSsl = isHttpsMode,\n preferredNode = state.stateParams.preferred_node;\n var matches = /^(?:(http[s]?:)\\/\\/)(.*)$/.exec(preferredNode);\n if (matches) {\n useSsl = matches[1] === 'https:';\n preferredNode = matches[2];\n }\n var parts = preferredNode.split(':');\n if (parts.length >= 1) {\n var port = parts[1] || (useSsl ? 443 : 80);\n $scope.node = {\n host: parts[0],\n port: port,\n useSsl: useSsl || (port == 443)\n };\n\n // Add a fallback node that use SSL\n if (!$scope.node.useSsl) {\n var node = angular.copy($scope.node);\n node.useSsl = true;\n node.port = 443;\n csSettings.data.fallbackNodes = csSettings.data.fallbackNodes || [];\n csSettings.data.fallbackNodes.splice(0,0,node);\n }\n }\n else {\n console.warn(\"[api] Invalid preferred node address: {0}. Using default node.\" + state.stateParams.preferred_node);\n }\n }\n\n // Start\n return $scope.start();\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n\n $scope.start = function() {\n if ($scope.starting) return;\n\n $scope.starting = true;\n $scope.loading = true;\n\n // Set BMA node\n if (!$scope.error && $scope.node && !BMA.node.same($scope.node)) {\n console.debug(\"[api] Using preferred node: {0}:{1}\".format($scope.node.host, $scope.node.port));\n BMA.stop();\n BMA.copy($scope.node);\n $scope.node.server = BMA.server;\n }\n\n // Start platform (or restart) platform\n // This will start the BMA node\n return csPlatform.restart()\n .then(csCurrency.get)\n .then(function(currency) {\n $scope.currency = currency;\n $scope.node = currency.node;\n $scope.loading = false;\n $scope.error = false;\n $scope.starting = false;\n // Reset history cache\n $ionicHistory.clearCache();\n })\n // Error during load (BMA not alive ?)\n .catch(function(err) {\n console.error(err && err.message || err);\n $scope.error = true;\n $scope.loading = false;\n $scope.starting = false;\n\n // Make sure to retry if user choose a fallback node\n var unsubscribe = BMA.api.node.on.start($scope, function() {\n $scope.start();\n unsubscribe();\n });\n })\n ;\n };\n\n function normalizeAmount(amountStr) {\n return parseFloat((amountStr||'0').trim().replace(new RegExp('[.,]'), '.')).toFixed(2) * 100;\n }\n\n function onLogin(authData) {\n\n // User cancelled\n if (!authData) return $scope.onCancel();\n\n // Make sure amount require fields\n if (!$scope.transferData.amount || !$scope.transferData.pubkey) {\n $scope.form.$submitted=true;\n UIUtils.loading.hide();\n return $q.reject();\n }\n\n // Avoid multiple click\n if ($scope.sending) return;\n $scope.sending = true;\n delete $scope.transferData.error;\n\n var wallet = $scope.demo ? csDemoWallet.instance(authData) : csWallet.instance('api', BMA);\n\n UIUtils.loading.show();\n\n wallet.start({restore: false/*skip restore from local storage*/})\n .then(function() {\n return wallet.login({\n auth: true,\n authData: authData,\n minData: true,\n sources: true,\n tx: {enable: false}\n });\n })\n .then(function(walletData) {\n if (!walletData) return;\n\n $scope.login = true;\n\n UIUtils.loading.hide();\n return $scope.askTransferConfirm(walletData);\n })\n .then(function(confirm) {\n if (!confirm) return;\n\n // sent transfer\n return UIUtils.loading.show()\n .then(function(){\n var amount = parseInt($scope.transferData.amount); // remove 2 decimals on quantitative mode\n return wallet.transfer($scope.transferData.pubkey, amount, $scope.transferData.comment, false /*always quantitative mode*/);\n })\n .then(function(txRes) {\n\n UIUtils.loading.hide();\n return txRes;\n })\n .catch(function(err) {\n UIUtils.onError()(err);\n return false;\n });\n })\n .then(function(txRes) {\n if (txRes) {\n return $scope.onSuccess(txRes);\n }\n else {\n $scope.sending = false;\n }\n })\n .catch(function(err){\n // when user cancel\n if (err && err === 'CANCELLED') {\n return $scope.onCancel();\n }\n // When wallet is empty\n if (err && err === 'RETRY') {\n $scope.sending = false;\n return;\n }\n $scope.sending = false;\n UIUtils.onError()(err);\n });\n }\n\n\n $scope.askTransferConfirm = function(walletData) {\n return $translate(['COMMON.UD', 'COMMON.EMPTY_PARENTHESIS'])\n .then(function(translations) {\n return $translate('CONFIRM.TRANSFER', {\n from: walletData.isMember ? walletData.uid : $filter('formatPubkey')(walletData.pubkey),\n to: $scope.transferData.name || $filter('formatPubkey')($scope.transferData.pubkey),\n amount: $scope.transferData.amount / 100,\n unit: $filter('abbreviate')($rootScope.currency.name),\n comment: (!$scope.transferData.comment || $scope.transferData.comment.trim().length === 0) ? translations['COMMON.EMPTY_PARENTHESIS'] : $scope.transferData.comment\n });\n })\n .then(UIUtils.alert.confirm);\n };\n\n $scope.onSuccess = function(txRes) {\n if (!$scope.transferData.redirect_url) {\n return UIUtils.toast.show('INFO.TRANSFER_SENT');\n }\n\n return ($scope.transferData.name ? $translate('API.TRANSFER.INFO.SUCCESS_REDIRECTING_WITH_NAME', $scope.transferData) : $translate('API.TRANSFER.INFO.SUCCESS_REDIRECTING'))\n .then(function(message){\n return UIUtils.loading.show({template: message});\n })\n .then(function() {\n var url = $scope.transferData.redirect_url;\n // Make replacements\n url = url.replace(/\\{pubkey\\}/g, $scope.transferData.pubkey);\n url = url.replace(/\\{hash\\}/g, txRes.hash||'');\n url = url.replace(/\\{comment\\}/g, $scope.transferData.comment||'');\n url = url.replace(/\\{amount\\}/g, $scope.transferData.amount && ($scope.transferData.amount/100).toString() || '');\n url = url.replace(/\\{tx\\}/g, encodeURI(txRes.tx));\n url = url.replace(/\\{node\\}/g, encodeURI(BMA.host+':'+BMA.port));\n\n return $scope.redirectToUrl(url, 2500);\n });\n };\n\n $scope.onCancel = function() {\n if (!$scope.transferData.cancel_url) {\n $scope.formData.salt = undefined;\n $scope.formData.password = undefined;\n return; // nothing to do\n }\n\n return ($scope.transferData.name ? $translate('API.TRANSFER.INFO.CANCEL_REDIRECTING_WITH_NAME', $scope.transferData) : $translate('API.TRANSFER.INFO.CANCEL_REDIRECTING'))\n .then(function(message){\n return UIUtils.loading.show({template: message});\n })\n .then(function() {\n var url = $scope.transferData.cancel_url;\n // Make replacements - fix #548\n url = url.replace(/\\{pubkey\\}/g, $scope.transferData.pubkey);\n url = url.replace(/\\{comment\\}/g, $scope.transferData.comment||'');\n url = url.replace(/\\{amount\\}/g, $scope.transferData.amount && ($scope.transferData.amount/100).toString() || '');\n\n return $scope.redirectToUrl(url, 1500);\n });\n };\n\n $scope.redirectToUrl = function(url, timeout) {\n if (!url) return;\n\n return $timeout(function() {\n // if iframe: send to parent\n if (window.top && window.top.location) {\n window.top.location.href = url;\n }\n else if (parent && parent.document && parent.document.location) {\n parent.document.location.href = url;\n }\n else {\n window.location.assign(url);\n }\n return UIUtils.loading.hide();\n }, timeout||0);\n };\n\n /* -- methods need by Login controller -- */\n\n $scope.closeModal = onLogin;\n\n }])\n\n .run(['csSettings', function(csSettings) {\n 'ngInject';\n\n csSettings.data.rememberMe = false;\n csSettings.data.useLocalStorage = false;\n // Force auth idle to 30s\n csSettings.data.keepAuthIdle = 30;\n\n //csPlatform.start();\n }])\n;\n","angular.module('cesium.directives', [])\n\n // Add new compare-to directive (need for form validation)\n .directive(\"compareTo\", function() {\n return {\n require: \"?ngModel\",\n link: function(scope, element, attributes, ngModel) {\n if (ngModel && attributes.compareTo) {\n ngModel.$validators.compareTo = function(modelValue) {\n return modelValue == scope.$eval(attributes.compareTo);\n };\n\n scope.$watch(attributes.compareTo, function() {\n ngModel.$validate();\n });\n }\n }\n };\n })\n\n // Add new different-to directive (need for form validation)\n .directive(\"differentTo\", function() {\n return {\n require: \"?ngModel\",\n link: function(scope, element, attributes, ngModel) {\n if (ngModel && attributes.differentTo) {\n ngModel.$validators.differentTo = function(modelValue) {\n return modelValue != scope.$eval(attributes.differentTo);\n };\n\n scope.$watch(attributes.differentTo, function() {\n ngModel.$validate();\n });\n }\n }\n };\n })\n\n .directive('numberFloat', function() {\n var NUMBER_REGEXP = new RegExp('^[0-9]+([.,][0-9]+)?$');\n\n return {\n require: '?ngModel',\n link: function(scope, element, attributes, ngModel) {\n if (ngModel) {\n ngModel.$validators.numberFloat = function(value) {\n return ngModel.$isEmpty(value) || NUMBER_REGEXP.test(value);\n };\n }\n }\n };\n })\n\n .directive('numberInt', function() {\n var INT_REGEXP = new RegExp('^[0-9]+$');\n return {\n require: 'ngModel',\n link: function(scope, element, attrs, ngModel) {\n if (ngModel) {\n ngModel.$validators.numberInt = function (value) {\n return ngModel.$isEmpty(value) || INT_REGEXP.test(value);\n };\n }\n }\n };\n })\n\n .directive('email', function() {\n var EMAIL_REGEXP = new RegExp('^[a-z0-9!#$%&\\'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&\\'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$');\n return {\n require: 'ngModel',\n link: function(scope, element, attrs, ngModel) {\n if (ngModel) {\n ngModel.$validators.email = function (value) {\n return ngModel.$isEmpty(value) || EMAIL_REGEXP.test(value);\n };\n }\n }\n };\n })\n\n .directive('requiredIf', function() {\n return {\n require: '?ngModel',\n link: function(scope, element, attributes, ngModel) {\n if (ngModel && attributes.requiredIf) {\n ngModel.$validators.required = function(value) {\n return !(scope.$eval(attributes.requiredIf)) || !ngModel.$isEmpty(value);\n };\n\n scope.$watch(attributes.requiredIf, function() {\n ngModel.$validate();\n });\n }\n }\n };\n })\n\n .directive('geoPoint', function() {\n return {\n require: '?ngModel',\n link: function(scope, element, attributes, ngModel) {\n if (ngModel) {\n ngModel.$validators.geoPoint = function(value) {\n return ngModel.$isEmpty(value) ||\n // twice are defined\n (angular.isDefined(value.lat) && angular.isDefined(value.lon)) ||\n // or twice are NOT defined (=empty object - can be useful to override data in ES node)\n (angular.isUndefined(value.lat) && angular.isUndefined(value.lon));\n };\n }\n }\n };\n })\n\n // Add a copy-on-click directive\n .directive('copyOnClick', ['$window', 'Device', 'UIUtils', function ($window, Device, UIUtils) {\n 'ngInject';\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n var showCopyPopover = function (event) {\n var value = attrs.copyOnClick;\n if (value && Device.clipboard.enable) {\n // copy to clipboard\n Device.clipboard.copy(value)\n .then(function(){\n UIUtils.toast.show('INFO.COPY_TO_CLIPBOARD_DONE');\n })\n .catch(UIUtils.onError('ERROR.COPY_CLIPBOARD'));\n }\n else if (value) {\n var rows = value && value.indexOf('\\n') >= 0 ? value.split('\\n').length : 1;\n UIUtils.popover.show(event, {\n scope: scope,\n templateUrl: 'templates/common/popover_copy.html',\n bindings: {\n value: attrs.copyOnClick,\n rows: rows\n },\n autoselect: '.popover-copy ' + (rows <= 1 ? 'input' : 'textarea')\n });\n }\n };\n element.bind('click', showCopyPopover);\n element.bind('hold', showCopyPopover);\n }\n };\n }])\n\n // Add a select-on-click directive\n .directive('selectOnClick', ['$window', function ($window) {\n 'ngInject';\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n element.bind('click', function () {\n if ($window.getSelection && !$window.getSelection().toString() && this.value) {\n this.setSelectionRange(0, this.value.length);\n }\n });\n }\n };\n }])\n\n .directive('activeLink', ['$location', function ($location) {\n 'ngInject';\n return {\n restrict: 'A',\n link: function(scope, element, attrs, controller) {\n var clazz = attrs.activeLink;\n var path;\n if (attrs.activeLinkPathPrefix) {\n path = attrs.activeLinkPathPrefix.substring(1); //hack because path does not return including hashbang\n scope.location = $location;\n scope.$watch('location.path()', function (newPath) {\n if (newPath && newPath.indexOf(path) === 0) {\n element.addClass(clazz);\n } else {\n element.removeClass(clazz);\n }\n });\n }\n else if (attrs.href) {\n path = attrs.href.substring(1); //hack because path does not return including hashbang\n scope.location = $location;\n scope.$watch('location.path()', function (newPath) {\n if (newPath && newPath == path) {\n element.addClass(clazz);\n } else {\n element.removeClass(clazz);\n }\n });\n }\n }\n };\n }])\n\n // All this does is allow the message\n // to be sent when you tap return\n .directive('input', ['$timeout', function($timeout) {\n return {\n restrict: 'E',\n scope: {\n 'returnClose': '=',\n 'onReturn': '&',\n 'onFocus': '&',\n 'onBlur': '&'\n },\n link: function(scope, element, attr) {\n element.bind('focus', function(e) {\n if (scope.onFocus) {\n $timeout(function() {\n scope.onFocus();\n });\n }\n });\n element.bind('blur', function(e) {\n if (scope.onBlur) {\n $timeout(function() {\n scope.onBlur();\n });\n }\n });\n element.bind('keydown', function(e) {\n if (e.which == 13) {\n if (scope.returnClose) element[0].blur();\n if (scope.onReturn) {\n $timeout(function() {\n scope.onReturn();\n });\n }\n }\n });\n }\n };\n }])\n\n .directive('trustAsHtml', ['$sce', '$compile', '$parse', function($sce, $compile, $parse){\n return {\n restrict: 'A',\n compile: function (tElement, tAttrs) {\n var ngBindHtmlGetter = $parse(tAttrs.trustAsHtml);\n var ngBindHtmlWatch = $parse(tAttrs.trustAsHtml, function getStringValue(value) {\n return (value || '').toString();\n });\n $compile.$$addBindingClass(tElement);\n\n return function ngBindHtmlLink(scope, element, attr) {\n $compile.$$addBindingInfo(element, attr.trustAsHtml);\n\n scope.$watch(ngBindHtmlWatch, function ngBindHtmlWatchAction() {\n // we re-evaluate the expr because we want a TrustedValueHolderType\n // for $sce, not a string\n element.html($sce.getTrustedHtml($sce.trustAsHtml(ngBindHtmlGetter(scope))) || '');\n $compile(element.contents())(scope);\n });\n };\n }\n };\n }])\n\n /**\n * Close the current modal\n */\n .directive('modalClose', ['$ionicHistory', '$timeout', function($ionicHistory, $timeout) {\n return {\n restrict: 'AC',\n link: function($scope, $element) {\n $element.bind('click', function() {\n if ($scope.closeModal) {\n $ionicHistory.nextViewOptions({\n historyRoot: true,\n disableAnimate: true,\n expire: 300\n });\n // if no transition in 300ms, reset nextViewOptions\n // the expire should take care of it, but will be cancelled in some\n // cases. This directive is an exception to the rules of history.js\n $timeout( function() {\n $ionicHistory.nextViewOptions({\n historyRoot: false,\n disableAnimate: false\n });\n }, 300);\n $scope.closeModal();\n }\n });\n }\n };\n }])\n\n /**\n * Plugin extension point (see services/plugin-services.js)\n */\n .directive('csExtensionPoint', ['$state', '$compile', '$controller', '$templateCache', 'PluginService', function ($state, $compile, $controller, $templateCache, PluginService) {\n var getTemplate = function(extensionPoint) {\n var template = extensionPoint.templateUrl ? $templateCache.get(extensionPoint.templateUrl) : extensionPoint.template;\n if (!template) {\n console.error('[plugin] Could not found template for extension :' + (extensionPoint.templateUrl ? extensionPoint.templateUrl : extensionPoint.template));\n return '';\n }\n if (extensionPoint.controller) {\n template = '<ng-controller ng-controller=\"'+extensionPoint.controller+'\">' + template + '</div>';\n }\n return template;\n };\n\n var compiler = function(tElement, tAttributes) {\n\n if (angular.isDefined(tAttributes.name)) {\n var extensionPoints = PluginService.extensions.points.getActivesByName(tAttributes.name);\n if (extensionPoints.length > 0) {\n tElement.html(\"\");\n _.forEach(extensionPoints, function(extensionPoint){\n tElement.append(getTemplate(extensionPoint));\n });\n }\n }\n\n return {\n pre: function(scope, iElement, iAttrs){\n PluginService.extensions.points.current.set(iAttrs.name);\n },\n post: function(){\n PluginService.extensions.points.current.set();\n }\n };\n };\n\n\n return {\n restrict: \"E\",\n compile: compiler,\n scope: {\n content:'='\n }\n };\n }])\n\n .directive('onReadFile', ['$parse', function ($parse) {\n return {\n restrict: 'A',\n scope: false,\n link: function(scope, element, attrs) {\n var fn = $parse(attrs.onReadFile);\n\n element.on('change', function(onChangeEvent) {\n var reader = new FileReader();\n var fileData = {\n name: this.files[0].name,\n size: this.files[0].size,\n type: this.files[0].type\n };\n\n reader.onload = function(onLoadEvent) {\n scope.$applyAsync(function() {\n fn(scope, {\n file: {\n fileContent: onLoadEvent.target.result,\n fileData : fileData}\n });\n });\n };\n reader.readAsText((onChangeEvent.srcElement || onChangeEvent.target).files[0]);\n });\n }\n };\n }])\n\n.directive(\"dropZone\", ['$parse', function($parse) {\n return {\n restrict: 'A',\n scope: false,\n link: function(scope, elem, attrs) {\n var fn = $parse(attrs.dropZone);\n elem.bind('dragover', function (e) {\n e.stopPropagation();\n e.preventDefault();\n });\n elem.bind('dragenter', function(e) {\n e.stopPropagation();\n e.preventDefault();\n });\n elem.bind('dragleave', function(e) {\n e.stopPropagation();\n e.preventDefault();\n });\n elem.bind('drop', function(e) {\n e.stopPropagation();\n e.preventDefault();\n var file = e.dataTransfer.files[0];\n var fileData = {\n name: file.name,\n size: file.size,\n type: file.type\n };\n\n var reader = new FileReader();\n reader.onload = function(onLoadEvent) {\n scope.$apply(function () {\n fn(scope, {\n file: {\n file: file,\n fileContent: onLoadEvent.target.result,\n fileData : fileData}\n });\n });\n };\n reader.readAsText(e.dataTransfer.files[0]);\n });\n }\n };\n }])\n\n\n // See http://embed.plnkr.co/2vgnFe/\n .directive('fileSelect', ['$parse', function ($parse) {\n 'use strict';\n\n return {\n restrict: 'A',\n scope: false,\n template: '<input type=\"file\" style=\"display: none;\" />' +\n '<ng-transclude></ng-transclude>',\n transclude: true,\n link: function (scope, element, attrs) {\n var fn = $parse(attrs.fileSelect);\n\n var fileInput = element.children('input[file]');\n\n if (attrs.accept) {\n fileInput[0].accept = attrs.accept;\n }\n\n fileInput.on('change', function (onChangeEvent) {\n var reader = new FileReader();\n var file = this.files[0];\n var fileData = {\n name: file.name,\n size: file.size,\n type: file.type\n };\n\n reader.onload = function(onLoadEvent) {\n scope.$applyAsync(function() {\n fn(scope, {\n file: {\n file: file,\n fileContent: onLoadEvent.target.result,\n fileData : fileData}\n });\n });\n };\n reader.readAsText((onChangeEvent.srcElement || onChangeEvent.target).files[0]);\n });\n\n element.on('click', function () {\n fileInput[0].click();\n });\n }\n };\n }])\n\n\n // Un-authenticate when window closed\n // see: https://stackoverflow.com/questions/28197316/javascript-or-angularjs-defer-browser-close-or-tab-close-between-refresh\n .directive('windowExitUnauth', ['$window', 'csSettings', 'csWallet', function($window, csSettings, csWallet) {\n return {\n restrict: 'AE',\n link: function(element, attrs){\n var myEvent = $window.attachEvent || $window.addEventListener,\n chkevent = $window.attachEvent ? 'onunload' : 'unload'; /// make IE7, IE8 compatible\n\n myEvent(chkevent, function (e) { // For >=IE7, Chrome, Firefox\n if (csSettings.data && csSettings.data.keepAuthIdle != csSettings.constants.KEEP_AUTH_IDLE_SESSION) {\n return csWallet.unauth();\n }\n });\n }\n };\n }]);\n","// Cesium filters\nangular.module('cesium.filters', ['cesium.config', 'cesium.platform', 'pascalprecht.translate', 'cesium.translations'\n])\n\n .factory('filterTranslations', ['$rootScope', '$q', 'csPlatform', 'csSettings', 'csCurrency', '$translate', '$timeout', function($rootScope, $q, csPlatform, csSettings, csCurrency, $translate, $timeout) {\n 'ngInject';\n\n var\n started = false,\n startPromise,\n that = this;\n\n that.MEDIAN_TIME_OFFSET = 3600 /*G1 default value*/;\n\n // Update some translations, when locale changed\n function onLocaleChange() {\n console.debug('[filter] Loading translations for locale [{0}]'.format($translate.use()));\n return $translate(['COMMON.DATE_PATTERN', 'COMMON.DATE_SHORT_PATTERN', 'COMMON.UD', 'COMMON.DAYS'])\n .then(function(translations) {\n that.DATE_PATTERN = translations['COMMON.DATE_PATTERN'];\n if (that.DATE_PATTERN === 'COMMON.DATE_PATTERN') {\n that.DATE_PATTERN = 'YYYY-MM-DD HH:mm';\n }\n that.DATE_SHORT_PATTERN = translations['COMMON.DATE_SHORT_PATTERN'];\n if (that.DATE_SHORT_PATTERN === 'COMMON.DATE_SHORT_PATTERN') {\n that.DATE_SHORT_PATTERN = 'YYYY-MM-DD';\n }\n that.DATE_MONTH_YEAR_PATTERN = translations['COMMON.DATE_MONTH_YEAR_PATTERN'];\n if (that.DATE_MONTH_YEAR_PATTERN === 'COMMON.DATE_MONTH_YEAR_PATTERN') {\n that.DATE_MONTH_YEAR_PATTERN = 'MMM YY';\n }\n that.DAYS = translations['COMMON.DAYS'];\n if (that.DAYS === 'COMMON.DAYS') {\n that.DAYS = 'days';\n }\n that.UD = translations['COMMON.UD'];\n if (that.UD === 'COMMON.UD') {\n that.UD = 'UD';\n }\n });\n }\n\n // Update some translations, when locale changed\n function onCurrencyChange() {\n console.debug('[filter] Computing constants from currency parameters');\n that.MEDIAN_TIME_OFFSET = csCurrency.data.medianTimeOffset || that.MEDIAN_TIME_OFFSET;\n }\n\n that.ready = function() {\n if (started) return $q.when();\n return startPromise || that.start();\n };\n\n that.start = function() {\n startPromise = csPlatform.ready()\n .then(onLocaleChange)\n .then(function() {\n onCurrencyChange();\n started = true;\n\n csSettings.api.locale.on.changed($rootScope, onLocaleChange, this);\n csCurrency.api.data.on.ready($rootScope, onCurrencyChange, this);\n });\n return startPromise;\n };\n\n // Default action\n // Must be started with a delay, to allow settings override, before starting platform (need by Cesium API)\n $timeout(function() {\n that.start();\n });\n\n return that;\n }])\n\n .filter('formatInteger', function() {\n return function(input) {\n return !input ? '0' : (input < 10000000 ? numeral(input).format('0,0') : numeral(input).format('0,0.000 a'));\n };\n })\n\n .filter('formatAmount', ['csConfig', 'csSettings', 'csCurrency', '$filter', function(csConfig, csSettings, csCurrency, $filter) {\n var pattern = '0,0.0' + Array(csConfig.decimalCount || 4).join('0');\n var patternBigNumber = '0,0.000 a';\n var currencySymbol = $filter('currencySymbol');\n\n // Always add one decimal for relative unit\n var patternRelative = pattern + '0';\n var minValueRelative = 1 / Math.pow(10, (csConfig.decimalCount || 4) + 1 /*add one decimal in relative*/);\n\n function formatRelative(input, options) {\n var currentUD = options && options.currentUD ? options.currentUD : csCurrency.data.currentUD;\n if (!currentUD) {\n console.warn(\"formatAmount: currentUD not defined\");\n return;\n }\n var amount = input / currentUD;\n if (Math.abs(input) < minValueRelative && input !== 0) {\n amount = '~ 0';\n }\n else {\n amount = numeral(amount).format(patternRelative);\n }\n if (options && options.currency) {\n return amount + ' ' + currencySymbol(options.currency, true);\n }\n return amount;\n }\n\n function formatQuantitative(input, options) {\n var amount = numeral(input/100).format((input < -1000000000 || input > 1000000000) ? patternBigNumber : pattern);\n if (options && options.currency) {\n return amount + ' ' + currencySymbol(options.currency, false);\n }\n return amount;\n }\n\n return function(input, options) {\n if (input === undefined) return;\n return (options && angular.isDefined(options.useRelative) ? options.useRelative : csSettings.data.useRelative) ?\n formatRelative(input, options) :\n formatQuantitative(input, options);\n };\n }])\n\n .filter('formatAmountNoHtml', ['csConfig', 'csSettings', 'csCurrency', '$filter', function(csConfig, csSettings, csCurrency, $filter) {\n var minValue = 1 / Math.pow(10, csConfig.decimalCount || 4);\n var format = '0,0.0' + Array(csConfig.decimalCount || 4).join('0');\n var currencySymbol = $filter('currencySymbolNoHtml');\n\n function formatRelative(input, options) {\n var currentUD = options && options.currentUD ? options.currentUD : csCurrency.data.currentUD;\n if (!currentUD) {\n console.warn(\"formatAmount: currentUD not defined\");\n return;\n }\n var amount = input / currentUD;\n if (Math.abs(amount) < minValue && input !== 0) {\n amount = '~ 0';\n }\n else {\n amount = numeral(amount).format(format);\n }\n if (options && options.currency) {\n return amount + ' ' + currencySymbol(options.currency, true);\n }\n return amount;\n }\n\n function formatQuantitative(input, options) {\n var amount = numeral(input/100).format((input > -1000000000 && input < 1000000000) ? '0,0.00' : '0,0.000 a');\n if (options && options.currency) {\n return amount + ' ' + currencySymbol(options.currency, false);\n }\n return amount;\n }\n\n return function(input, options) {\n if (input === undefined) return;\n return (options && angular.isDefined(options.useRelative) ? options.useRelative : csSettings.data.useRelative) ?\n formatRelative(input, options) :\n formatQuantitative(input, options);\n };\n }])\n\n .filter('currencySymbol', ['filterTranslations', '$filter', 'csSettings', function(filterTranslations, $filter, csSettings) {\n return function(input, useRelative) {\n if (!input) return '';\n return (angular.isDefined(useRelative) ? useRelative : csSettings.data.useRelative) ?\n (filterTranslations.UD + '<sub>' + $filter('abbreviate')(input) + '</sub>') :\n $filter('abbreviate')(input);\n };\n }])\n\n .filter('currencySymbolNoHtml', ['filterTranslations', '$filter', 'csSettings', function(filterTranslations, $filter, csSettings) {\n return function(input, useRelative) {\n if (!input) return '';\n return (angular.isDefined(useRelative) ? useRelative : csSettings.data.useRelative) ?\n (filterTranslations.UD + ' ' + $filter('abbreviate')(input)) :\n $filter('abbreviate')(input);\n };\n }])\n\n .filter('formatDecimal', ['csConfig', 'csCurrency', function(csConfig, csCurrency) {\n var minValue = 1 / Math.pow(10, csConfig.decimalCount || 4);\n var format = '0,0.0' + Array(csConfig.decimalCount || 4).join('0');\n\n return function(input) {\n if (input === undefined) return '0';\n if (input === Infinity || input === -Infinity) {\n console.warn(\"formatDecimal: division by zero ? (is currentUD defined ?) = \" + csCurrency.data.currentUD);\n return 'error';\n }\n if (Math.abs(input) < minValue) return '~ 0';\n return numeral(input/*-0.00005*/).format(format);\n };\n }])\n\n .filter('formatNumeral', function() {\n return function(input, pattern) {\n if (input === undefined) return '0';\n // for DEBUG only\n //if (isNaN(input)) {\n // return 'NaN';\n //}\n if (Math.abs(input) < 0.0001) return '~ 0';\n return numeral(input).format(pattern);\n };\n })\n\n .filter('formatDate', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input)).local().format(filterTranslations.DATE_PATTERN || 'YYYY-MM-DD HH:mm') : '';\n };\n }])\n\n .filter('formatDateShort', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input)).local().format(filterTranslations.DATE_SHORT_PATTERN || 'YYYY-MM-DD') : '';\n };\n }])\n\n .filter('formatDateMonth', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input)).local().format(filterTranslations.DATE_MONTH_YEAR_PATTERN || 'MMM YY') : '';\n };\n }])\n\n .filter('formatDateForFile', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input)).local().format(filterTranslations.DATE_FILE_PATTERN || 'YYYY-MM-DD') : '';\n };\n }])\n\n .filter('formatTime', function() {\n return function(input) {\n return input ? moment.unix(parseInt(input)).local().format('HH:mm') : '';\n };\n })\n\n .filter('formatFromNow', function() {\n return function(input) {\n return input ? moment.unix(parseInt(input)).fromNow() : '';\n };\n })\n\n .filter('formatFromNowAndDate', ['filterTranslations', function(filterTranslations) {\n return function(input, options) {\n var m = input && moment.unix(parseInt(input));\n return m && (m.fromNow() + (options && options.separator || ' | ') + m.local().format(filterTranslations.DATE_PATTERN || 'YYYY-MM-DD HH:mm')) || '';\n };\n }])\n\n .filter('formatDurationTo', function() {\n return function(input) {\n return input ? moment.unix(moment().utc().unix() + parseInt(input)).fromNow() : '';\n };\n })\n\n .filter('formatDuration', function() {\n return function(input) {\n return input ? moment(0).from(moment.unix(parseInt(input)), true) : '';\n };\n })\n\n\n .filter('formatDurationTime', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n if (!input) return '';\n var sign = input && input < 0 ? '-' : '+';\n input = Math.abs(input);\n var day = Math.trunc(input/3600/24);\n var hour = Math.trunc(input/3600 - day*24);\n var min = Math.trunc(input/60 - day*24*60 - hour*60);\n return day > 0 ? (sign + day + ' ' + filterTranslations.DAYS + ' ' + hour + 'h ' + min + 'm') :\n (hour > 0 ? (sign + hour + 'h ' + min + 'm') : (sign + min + 'm')) ;\n };\n }])\n\n // Display time in ms or seconds (see i18n label 'COMMON.EXECUTION_TIME')\n .filter('formatDurationMs', function() {\n return function(input) {\n return input ? (\n (input < 1000) ?\n (input + 'ms') :\n (input/1000 + 's')\n ) : '';\n };\n })\n\n .filter('formatPeriod', function() {\n return function(input) {\n if (!input) {return null;}\n var duration = moment(0).from(moment.unix(parseInt(input)), true);\n return duration.split(' ').slice(-1)[0]; // keep only last words (e.g. remove \"un\" \"a\"...)\n };\n })\n\n .filter('formatFromNowShort', function() {\n return function(input) {\n return input ? moment.unix(parseInt(input)+offset).fromNow(true) : '';\n };\n })\n\n /* -- median time (apply currency offset)-- */\n\n .filter('medianDate', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input) + filterTranslations.MEDIAN_TIME_OFFSET).local().format(filterTranslations.DATE_PATTERN || 'YYYY-MM-DD HH:mm') : '';\n };\n }])\n\n .filter('medianDateShort', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input) + filterTranslations.MEDIAN_TIME_OFFSET).local().format(filterTranslations.DATE_SHORT_PATTERN || 'YYYY-MM-DD') : '';\n };\n }])\n\n\n .filter('medianTime', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input)+filterTranslations.MEDIAN_TIME_OFFSET).local().format('HH:mm') : '';\n };\n }])\n\n .filter('medianFromNow', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input) + filterTranslations.MEDIAN_TIME_OFFSET).fromNow() : '';\n };\n }])\n\n .filter('medianFromNowShort', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input)+filterTranslations.MEDIAN_TIME_OFFSET).fromNow(true) : '';\n };\n }])\n\n .filter('medianFromNowAndDate', ['filterTranslations', function(filterTranslations) {\n return function(input, options) {\n var m = input && moment.unix(parseInt(input)+filterTranslations.MEDIAN_TIME_OFFSET);\n return m && (m.fromNow() + (options && options.separator || ' | ') + m.local().format(filterTranslations.DATE_PATTERN || 'YYYY-MM-DD HH:mm')) || '';\n };\n }])\n\n\n /* -- text filter -- */\n\n .filter('capitalize', function() {\n return function(input) {\n if (!input) return '';\n input = input.toLowerCase();\n return input.length > 1 ? (input.substring(0,1).toUpperCase()+input.substring(1)) : input;\n };\n })\n\n .filter('abbreviate', function() {\n var _cache = {};\n return function(input) {\n var currency = input || '';\n if (_cache[currency]) return _cache[currency];\n if (currency.length > 3) {\n var unit = '', sepChars = ['-', '_', ' '];\n for (var i = 0; i < currency.length; i++) {\n var c = currency[i];\n if (i === 0) {\n unit = (c === 'g' || c === 'G') ? 'Ğ' : c ;\n }\n else if (i > 0 && sepChars.indexOf(currency[i-1]) != -1) {\n unit += c;\n }\n }\n currency = unit.toUpperCase();\n }\n else {\n currency = currency.toUpperCase();\n if (currency.charAt(0) === 'G') {\n currency = 'Ğ' + (currency.length > 1 ? currency.substr(1) : '');\n }\n }\n\n _cache[input] = currency;\n return currency;\n };\n })\n\n .filter('upper', function() {\n return function(input) {\n if (!input) return '';\n return input.toUpperCase();\n };\n })\n\n .filter('formatPubkey', function() {\n return function(input) {\n return input ? input.substr(0,8) : '';\n };\n })\n\n .filter('formatHash', function() {\n return function(input) {\n return input ? input.substr(0,4) + input.substr(input.length-4) : '';\n };\n })\n\n .filter('formatCategory', function() {\n return function(input) {\n return input && input.length > 28 ? input.substr(0,25)+'...' : input;\n };\n })\n\n // Convert to user friendly URL (e.g. \"Like - This\" -> \"like-this\")\n .filter('formatSlug', function() {\n return function(input) {\n return input ? encodeURIComponent(input\n .toLowerCase()\n .replace(/<[^>]+>/g,'') // Remove tag (like HTML tag)\n .replace(/[^\\w ]+/g,'')\n .replace(/ +/g,'-'))\n : '';\n };\n })\n\n // Convert a URI into parameter (e.g. \"http://hos/path\" -> \"http%3A%2F%2Fhost%2Fpath\")\n .filter('formatEncodeURI', function() {\n return function(input) {\n return input ? encodeURIComponent(input): '';\n };\n })\n\n .filter('truncText', function() {\n return function(input, size) {\n size = size || 500;\n return !input || input.length <= size ? input : (input.substr(0, size) + '...');\n };\n })\n\n .filter('truncUrl', function() {\n return function(input, size) {\n size = size || 25;\n var startIndex = input.startsWith('http://') ? 7 : (input.startsWith('https://') ? 8 : 0);\n startIndex = input.startsWith('www.', startIndex) ? startIndex + 4 : startIndex; // Remove sequence 'www.'\n return !input || (input.length-startIndex) <= size ? input.substr(startIndex) : (input.substr(startIndex, size) + '...');\n };\n })\n\n .filter('trustAsHtml', ['$sce', function($sce) {\n return function(html) {\n return $sce.trustAsHtml(html);\n };\n }])\n;\n"]} |