forked from axiom-team/astroport
1 line
3.5 MiB
1 line
3.5 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/app-controllers.js","dist/dist_js/app/controllers/join-controllers.js","dist/dist_js/app/controllers/login-controllers.js","dist/dist_js/app/controllers/help-controllers.js","dist/dist_js/app/controllers/wallet-controllers.js","dist/dist_js/app/controllers/wallets-controllers.js","dist/dist_js/app/controllers/wot-controllers.js","dist/dist_js/app/controllers/network-controllers.js","dist/dist_js/app/controllers/currency-controllers.js","dist/dist_js/app/controllers/transfer-controllers.js","dist/dist_js/app/controllers/settings-controllers.js","dist/dist_js/app/controllers/blockchain-controllers.js","dist/dist_js/plugins/es/js/entities/notification.js","dist/dist_js/plugins/es/js/entities/comment.js","dist/dist_js/plugins/es/js/entities/invitation.js","dist/dist_js/plugins/es/js/entities/peer.js","dist/dist_js/plugins/es/js/controllers/common-controllers.js","dist/dist_js/plugins/es/js/controllers/app-controllers.js","dist/dist_js/plugins/es/js/controllers/settings-controllers.js","dist/dist_js/plugins/es/js/controllers/wallet-controllers.js","dist/dist_js/plugins/es/js/controllers/wot-controllers.js","dist/dist_js/plugins/es/js/controllers/registry-controllers.js","dist/dist_js/plugins/es/js/controllers/profile-controllers.js","dist/dist_js/plugins/es/js/controllers/message-controllers.js","dist/dist_js/plugins/es/js/controllers/notification-controllers.js","dist/dist_js/plugins/es/js/controllers/blockchain-controllers.js","dist/dist_js/plugins/es/js/controllers/network-controllers.js","dist/dist_js/plugins/es/js/controllers/group-controllers.js","dist/dist_js/plugins/es/js/controllers/invitation-controllers.js","dist/dist_js/plugins/es/js/controllers/subscription-controllers.js","dist/dist_js/plugins/es/js/controllers/document-controllers.js","dist/dist_js/plugins/es/js/controllers/like-controllers.js","dist/dist_js/app/services/settings-services.js","dist/dist_js/plugins/graph/js/controllers/common-controllers.js","dist/dist_js/plugins/graph/js/controllers/blockchain-controllers.js","dist/dist_js/plugins/graph/js/controllers/network-controllers.js","dist/dist_js/plugins/graph/js/controllers/currency-controllers.js","dist/dist_js/plugins/graph/js/controllers/account-controllers.js","dist/dist_js/plugins/graph/js/controllers/docstats-controllers.js","dist/dist_js/plugins/graph/js/controllers/synchro-controllers.js","dist/dist_js/plugins/map/js/controllers/common-controllers.js","dist/dist_js/plugins/map/js/controllers/wot-controllers.js","dist/dist_js/plugins/map/js/controllers/registry-controllers.js","dist/dist_js/plugins/map/js/controllers/user-controllers.js","dist/dist_js/plugins/map/js/controllers/help-controllers.js","dist/dist_js/app/platform.js","dist/dist_js/app/services/network-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/desktop-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/controllers.js","dist/dist_js/app/templates.js","dist/dist_js/app/translations.js","dist/dist_js/app/plugins.js","dist/dist_js/plugins/translations.js","dist/dist_js/plugins/templates.js","dist/dist_js/plugins/es/js/plugin.js","dist/dist_js/plugins/es/js/services.js","dist/dist_js/plugins/es/js/services/comment-services.js","dist/dist_js/plugins/es/js/services/http-services.js","dist/dist_js/plugins/es/js/services/settings-services.js","dist/dist_js/plugins/es/js/services/registry-services.js","dist/dist_js/plugins/es/js/services/social-services.js","dist/dist_js/plugins/es/js/services/crypto-services.js","dist/dist_js/plugins/es/js/services/profile-services.js","dist/dist_js/plugins/es/js/services/notification-services.js","dist/dist_js/plugins/es/js/services/message-services.js","dist/dist_js/plugins/es/js/services/modal-services.js","dist/dist_js/plugins/es/js/services/blockchain-services.js","dist/dist_js/plugins/es/js/services/group-services.js","dist/dist_js/plugins/es/js/services/invitation-services.js","dist/dist_js/plugins/es/js/services/subscription-services.js","dist/dist_js/plugins/es/js/services/wallet-services.js","dist/dist_js/plugins/es/js/services/wot-services.js","dist/dist_js/plugins/es/js/services/tx-services.js","dist/dist_js/plugins/es/js/services/geo-services.js","dist/dist_js/plugins/es/js/services/document-services.js","dist/dist_js/plugins/es/js/services/network-services.js","dist/dist_js/plugins/es/js/services/like-services.js","dist/dist_js/plugins/es/js/controllers/currency-controllers.js","dist/dist_js/plugins/graph/js/plugin.js","dist/dist_js/plugins/graph/js/services.js","dist/dist_js/plugins/graph/js/services/data-services.js","dist/dist_js/plugins/graph/js/services/color-services.js","dist/dist_js/plugins/map/js/plugin.js","dist/dist_js/plugins/map/js/services.js","dist/dist_js/plugins/map/js/services/wot-services.js","dist/dist_js/plugins/map/js/services/registry-services.js","dist/dist_js/plugins/map/js/services/utils-services.js","dist/dist_js/plugins/map/js/controllers/network-controllers.js","dist/dist_js/plugins/map/js/controllers/settings-controllers.js","dist/dist_js/app/app.js","dist/dist_js/app/components.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","PluginExtensionPointController","$scope","PluginService","extensionPoint","extensions","points","current","get","AppController","$rootScope","$state","$ionicSideMenuDelegate","$q","$timeout","$ionicHistory","$controller","$window","csPlatform","csSettings","CryptoUtils","csCrypto","UIUtils","BMA","csWallet","Device","Modals","csConfig","csHttp","walletData","data","search","login","isLogin","auth","isAuth","motion","default","fullscreen","screen","isEnabled","showHome","nextViewOptions","historyRoot","go","then","loading","hide","createHelptipScope","isTour","tour","settings","helptip","enable","isSmall","helptipScope","$new","startHelpTour","event","skipClearCache","defaultPrevented","clearHistory","clearCache","$destroy","catch","err","disableHelpTour","preventDefault","stopPropagation","store","loadWalletData","options","console","warn","wallet","loadData","loadWallet","isStarted","ready","isDataLoaded","when","loginAndGo","state","closeProfilePopover","httpsMode","location","protocol","href","hashIndex","indexOf","rootPath","substr","httpsModeDebug","debug","logout","force","profilePopover","askConfirm","alert","confirm","show","isOpenLeft","toggleLeft","isDefault","onError","doAuth","isUserPubkey","api","on","deferred","resolve","unauth","showTransferModal","parameters","showTransfer","showAboutModal","showAbout","showJoinModal","showJoin","showSettings","showHelpModal","showHelp","showProfilePopover","popover","templateUrl","scope","autoremove","afterShow","ink","selector","isShown","showPeerInfoPopover","openLink","$event","uri","uid","USER_ID","test","copy","open","showFab","timeout","toggleOn","hideFab","toggleOff","doMotion","askFullscreen","isWeb","undefined","cancelText","okText","toggleFullscreen","toggleAll","HomeController","$translate","$http","csCache","csCurrency","locales","angular","smallscreen","showInstallHelp","enter","e","ionic","Platform","isIOS","window","StatusBar","overlaysWebView","stateParams","error","node","disableAnimate","disableBack","reload","inherit","notify","loadFeeds","$on","feedUrl","getFeedUrl","maxContentLength","feed","now","Date","format","responseType","cache","constants","LONG","success","items","reduce","res","item","title","content_text","content_html","date_published","time","moment","utc","unix","content","replace","endIndex","Math","max","lastIndexOf","truncated","author","concat","status","doQuickFix","action","changeLanguage","langKey","use","hideLocalesPopover","locale","findWhere","showLocalesPopover","localesPopover","JoinController","extend","JoinChooseAccountTypeModalController","formData","slides","slider","loop","effect","speed","load","currency","name","lockSwipes","slidePrev","unlockSwipes","slideNext","selectAccountTypeAndClose","type","demo","accountType","closeModal","helpAnchor","anchor","JoinModalController","$interval","pseudo","pager","showPager","slideBehavior","isLicenseRead","showUsername","showPassword","computing","userIdPattern","accountAvailable","walletId","children","getByPubkey","licenseFileUrl","getLicenseUrl","computeSlideBehavior","showAccountPubkey","scryptKeypair","username","password","keypair","util","encode_base58","signPk","checkAccountAvailable","formDataChanged","getCurrentFormName","index","activeIndex","formName","hasPreviousButton","hasNextButton","hasAcceptButton","focus","hasSendButton","doNext","$submitted","$valid","uiAlreadyUsed","doPrev","doNewAccount","messageKey","cssClass","okType","onErrorLogout","parameter","isNew","method","expectedPubkey","showMethods","alertIfUnusedWallet","needSelf","isUndefined","blockUid","toUpperCase","setSelf","self","membership","inside","ucode","errorCodes","MEMBERSHIP_ALREADY_SEND","requirements","downloadRevocationRegistration","downloadRevocation","startListenLicenseBottom","iframeEl","element","document","querySelector","contentWindow","licenseBottomInterval","yPos","body","scrollTop","scrollHeight","clientHeight","stopListenLicenseBottom","cancel","checkUid","wot","lookup","results","some","pub","uids","idty","$watch","tx","sources","identifierRecovery","i","LoginController","showLoginModal","LoginModalController","$ionicPopover","ionicReady","showPubkey","showComputePubkeyButton","autoComputePubkey","pubkeyPattern","PUBKEY","PUBKEY_WITH_CHECKSUM","isDefined","showNewAccountLink","expectedUid","scryptParamsValues","SCRYPT_PARAMS","label","params","init","grade","toLowerCase","rememberMe","keepAuthIdle","keepAuth","KEEP_AUTH_IDLE_SESSION","changeMethod","leave","methods","doLogin","skipForm","form","promise","scryptPrams","scrypt","pubkeyError","file","valid","readKeyFile","withSecret","trim","showWotLookupModal","pkChecksum","$error","checksum","rememberMeChanged","equals","keepAuthIdleChanged","methodChanged","paramsChanged","useLocalStorage","silent","onScryptFormChanged","computePubkey","salt","pwd","scryptSignPk","showAccountSecurityModal","showAccountSecurity","doScan","barcode","scan","parse","keyfile","parseData","signSk","base58","encode","hideMethodsPopover","find","changeScrypt","subTitle","read","BAD_PASSWORD","onFileChanged","fileData","size","fileContent","validatingFile","removeKeyFile","searchText","showWotLookup","q","showMethodsPopover","methodsPopover","AuthController","config","readonly","setForm","HelpController","$anchorScroll","HelpModalController","itemsClass","listClass","HelpTipController","csHelpConstants","continue","executeStep","partName","steps","step","next","showHelpTip","bindings","value","hasNext","backdropClickToClose","startWalletNoLoginTour","startWalletTour","startWalletCertTour","walletCerts","startTxTour","startWalletsTour","wallets","startHeaderTour","startSettingsTour","startWotLookupTour","cancelled","wotLookup","startWotTour","startWotCertTour","wotCerts","startCurrencyTour","startNetworkTour","network","finishTour","startIndex","contentParams","icon","position","isOpen","useRelative","glyph","is","retry","showNetworkTabIfNeed","tabs","querySelectorAll","triggerHandler","installDocUrl","getElementById","currentUD","hasCertificationsItem","isMember","pendingMembership","stepCount","skipAll","_getProfilBtnElement","elements","el","offsetWidth","style","all","HelpTourController","WalletController","$ionicPopup","$location","ModalUtils","csPopovers","csHelp","qrcodeId","$id","toggleQRCode","likeData","likes","abuses","refresh","enableSelectWallet","count","isDefaultWallet","cleanLocationHref","updateView","addListeners","showQRCode","$broadcast","setRegisterForm","registerForm","onWalletLogout","hideQRCode","removeListeners","listeners","$watchCollection","newEvents","oldEvents","remove","showUidPopup","reject","translations","newUid","buttons","text","onTap","hideActionsPopover","doMembershipIn","retryCount","membershipIn","keepSelf","info","showJoinMember","membershipOut","confirmAgain","out","toast","doUpdate","refreshData","renewMembership","wasMember","needRenew","minData","membershipExpiresIn","fixIdentity","sigDate","fixMembership","inheritedLogout","loadQrCode","svg","html","showCertifications","showGivenCertifications","showTxHistory","showLicenseModal","balance","done","showSecurityModal","showSelectIdentitiesModal","showSelectPubkeyIdentity","alternatives","showSelectWalletModal","showSelectWallet","showDefault","showBalance","excludedWalletId","newWallet","showActionsPopover","actionsPopover","showSharePopover","url","shareBaseUrl","share","titleKey","titleValues","postMessage","showSelectWalletPopover","WalletTxController","csTx","hasMinData","downloadHistoryFile","fromTime","balanceChanged","newVal","oldVal","walletHistoryAutoRefresh","push","newBlock","block","showTxErrors","goState","showMoreTx","walletHistoryTimeSecond","date","HTTP_LIMITATION","toUnlockUIArray","unlockTreeItem","leftPadding","operator","padding-left","child","padding-top","padding-bottom","showLockedOutputsPopover","lockedOutputs","popoverData","lockedOuputs","lockedOutput","amount","unlockFunctions","unlockConditions","unlockTree","hideLockedOutputsPopover","lockedOutputsPopover","stateName","WalletTxErrorController","filterReceivedTx","filterSentTx","hasReceivedTx","errors","hasSentTx","WalletSecurityModalController","isLastSlide","recover","isValidFile","hasSelf","canRevoke","needMembership","option","addQuestion","level","questions","toString","each","translation","checked","hasContent","recoverId","downloadSaveIDFile","selectOption","enableOnDemo","restore","question","answer","revocation","indexOfQuestions","LastIndexQuestions","cypherNonce","cypherPubkey","cypherSalt","cypherPwd","recoverForm","loginData","forceAuth","values","filter","record","getCryptedId","downloadSaveId","isRequired","revokeWithFile","revokeIdentity","downloadRevokeFile","revokeWalletIdentity","revoke","revocationError","downloadKeyFile","WalletListAbstractController","filterTranslations","updatingWalletId","stopped","setParameters","jobs","defaultWallet","walletLoadOptions","hasLoadError","loadCounter","updateWalletView","loadPromise","loaded","refreshOptions","merge","resetData","filterFn","entered","selectorSuffix","selectPrevented","addNewWallet","useLocalStorageEncryption","raisePromise","addListenersOnWallet","add","showNewWalletModal","instance","hasPubkey","select","WalletSelectModalController","isDefaultPrevented","WalletListViewController","editWallet","showEditPopup","newName","localName","storeData","downloadAsFile","downloadFile","selectAndRemoveWallet","showImportFileModal","authData","loginAndAddWallet","setEditForm","editForm","inheritedUpdateView","inheritedUpdateWalletView","WalletSelectPopoverController","closePopover","WalletListImportModalController","rows","row","cols","removeFile","WotLookupController","$focus","csWot","wotSearchTextId","enableFilter","enableWallets","allowMultiple","selection","showResultLabel","updateLocationHref","doSearch","initPhase","doGetPending","doGetNewcomers","doGetWallets","resetWotSearch","match","doSearchText","total","idties","doDisplayResult","countBy","hit","divider","offset","skipLocationUpdate","newcomers","hits","hasMore","searchFunction","pending","avatar","showMore","loadingMore","ok","expire","toggleCheck","identity","addToSelection","removeSelection","toggleSelect","selected","copyIdty","identityInSelection","splice","existIdtyInResult","scanQrCode","result","obj","identityInRes","WotLookupModalController","superEnter","WotIdentityAbstractController","disableCertifyButton","viewData","enableBack","pendingRevocation","canCertify","canSelectAndCertify","cert","received_cert","received_cert_pending","expiresIn","timeWarningExpire","alreadyCertified","certify","displayBalance","expired","previousCert","meta","timestamp","sig","prepareNewCert","unshift","pendingCertificationCount","selectAndCertify","confirmTitle","extendAll","given_cert_pending","removeActionParamInLocationHref","doAction","WotIdentityViewController","fadeSlideInRight","like","kinds","onLoadSuccess","showSelectIdentities","qrcode","WotIdentityTxViewController","WotCertificationsViewController","motions","receivedCertifications","fadeSlideIn","givenCertifications","fadeIn","skipItems","doMotionReceivedCertifications","ionListClass","doMotionGivenCertifications","isWallet","WotSelectPubkeyIdentityModalController","loadRequirements","NetworkLookupController","csNetwork","networkStarted","ionItemClass","expertMode","isHttps","endpoint","bma","ssl","ws2p","sort","asc","compactMode","helptipPrefix","enableLocationHref","isDefaultNode","same","host","port","expert","close","computeOptions","member","mirror","online","start","refreshing","changed","peers","memberPeersCount","isBusy","loadPeers","toggleSearchType","toggleSearchEndpoint","toggleSort","toggleCompactMode","selectPeer","peer","compacted","hasBma","server","getServer","isSsl","isTor","tor","context","clickEvent","showEndpointsPopover","endpointName","getEndpoints","ep","parseEndPoint","path","showWs2pPopover","privateAccessMessage","valueKey","NetworkLookupModalController","NetworkLookupPopoverController","PeerInfoPopoverController","blockchain","medianTime","powMin","useSsl","summary","duniter","latest","latestRelease","compare","isPreRelease","hasNewRelease","PeerViewController","isReachable","serverParts","lightInstance","peering","map","p","blockNumber","dns","getDns","keyID","sortBy","score","hasMainConsensusBlock","ipv4","ipv6","isWs2p","openRawPeering","openRawCurrentBlock","CurrencyViewController","M","MoverN","UD","cactual","c","dt","sigQty","sigStock","msWindow","msValidity","sigWindow","sigValidity","sigPeriod","difficulty","Nprev","stepMax","sentries","xpercent","durationFromLastUD","dtReeval","udReevalTime0","allRules","allWotRules","licenseUrl","mainBlockChanged","mainBlock","lastUDTime","avgGenTime","udTime0","monetaryMass","N","membersCount","NO_CURRENT_BLOCK","stats","ud","blocks","lastBlockWithUD","unitbase","dividend","pow","ud0","Mprev","MoverNprev","ceil","refreshPeers","showExtendActionsPopover","onAllRulesChange","onAllWotRulesChange","CurrencyLicenseModalController","FileSaver","licenseUrlHtml","Blob","saveAs","TransferController","TransferModalController","$filter","convertedBalance","destPub","comment","useComment","restPub","restAmount","udAmount","minAmount","commentPattern","COMMENT","commentInputId","digitKeyboardSettings","keyboard","digit","bindModel","decimal","decimalSeparator","resizeContent","digitKeyboardVisible","destUid","restUid","$$destroyed","onUseRelativeChanged","onAmountChanged","$setPristine","sending","parseFloat","RegExp","min","$invalid","doTransfer","hideDigitKeyboard","askTransferConfirm","toFixed","transferAll","transfer","hasRest","from","to","unit","restTo","addComment","formDataField","showUnitPopover","showDigitKeyboard","SettingsController","popupData","nodePopup","keepAuthIdleLabels","10","labelKey","labelParams","30","60","600","3600","9999","keepAuthIdles","blockValidityWindowLabels","0","6","12","24","blockValidityWindows","blockCount","setPopupForm","popupForm","defaultSettings","reset","pendingSaving","restart","changeNode","showNodePopup","newNode","temporary","isAlive","alive","stop","showNodeList","forceUseSsl","_popupStack","responseDeferred","showNetworkLookup","getBMA","hasValid4","save","saving","cleanupHelpTip","apply","onDataChanged","oldValue","newValue","BlockLookupController","searchTextId","defaultSizeLimit","doSearchLast","blocksSlice","oldestNumber","cleanData","b","doPrepareResult","formatDateShort","previousEmptyBlockDay","lastBlock","day","blockDay","notFirstEmpty","previousNotEmptyOrSameDay","onBlock","websocket","onListener","existingBlock","showBlock","selectBlock","BlockViewController","users","groupBy","issuers","issuer","outputs","output","unlockCondition","parseUnlockCondition","showUnlockConditionPopover","unlockConditionPopover","hideUnlockConditionsPopover","openRawBlock","EsNotification","markAsReadCallback","pubkeys","input","messagePrefixes","user","page","read_signature","code","reference","markAsRead","avatarIcon","Comment","creationTime","reply_to","replyCount","parent","replies","onRemoveListeners","otherComment","avatarStyle","setReplies","copyFromJson","addOnRemoveListener","listener","cleanAllListeners","removeAllReplies","addReplies","cm1","cm2","reply","containsReply","addReply","removeReply","replyId","findIndex","Invitation","separatorIndex","EsPeer","ESPicturesEditController","selectNewPicture","inputSelector","openPicturePopup","fileInput","click","camera","getPicture","imageData","pictures","src","isnew","image","resizeFile","removePicture","favoritePicture","rotatePicture","rotateSrc","dataURL","ESCategoryModalController","allCategories","categories","afterLoad","cat","ESCommentsController","defaultCommentSize","comments","animate","service","scrollToAnchor","loadAvatarAllParent","cmt","changes","elemList","getElementsByName","onKeypress","charCode","ctrlKey","focusNewComment","stateUrl","absolute","postUrl","autoselect","edit","newComment","forceIfSmall","removeParentLink","toggleExpandedReplies","expandedReplies","toggleExpandedParent","expandedParent","ESSocialsEditController","SocialUtils","socialData","reorder","addSocialNetwork","socials","social","startVelocity","editSocialNetwork","reorderSocialNetwork","fromIndex","toIndex","recipient","ESSocialsViewController","openSocial","ESAvatarModalController","$sce","initCrop","imageCropStep","imgSrc","resultBlob","fileReader","FileReader","readAsDataURL","onload","$applyAsync","getTrustedHtml","doCrop","doPrevious","clear","ESPositionEditController","esGeo","defaultCountry","plugins","es","loadingCurrentPosition","formPosition","searchModalOpened","tryToLocalize","getAddressToSearch","point","searchByAddress","updateGeoPoint","openSearchLocationModal","forceFallback","onCityChanged","geoPoint","lat","lon","onUseGeopointChanged","dirty","onGeopointChanged","address","city","cityParts","postcode","country","fallbackText","focusFirstInput","ESLookupPositionController","loadingPosition","geoDistanceLabels","distance","geoDistances","searchPosition","exact","shortName","ESSearchPositionItemController","locations","selectLocationIndex","onKeydown","keyCode","hideDropdown","onEnter","onArrowUpOrDown","showDropdown","selectLocation","velocity","onLocationChanged","requestId","license","exactMatch","ESSearchPositionModalController","firstSearch","dividerText","ESExtensionController","esSettings","isEnable","ESMenuExtendController","showRegistryLookupView","showNotificationsPopover","showMessagesPopover","showInvitationsPopover","ESProfilePopoverExtendController","showEditUserProfile","ESPluginSettingsController","esHttp","esModals","hasWindowNotification","keepEnableState","wasEnable","isFallbackNode","isFallback","changeEsNode","newEsNode","ES_USER_API_ENDPOINT","esEps","getEsEndpoints","esEp","onFormChanged","notifications","emitHtml5","Notification","permission","requestPermission","ESWalletViewController","showProfileHelp","showNewPageModal","showNewPage","ESWalletLikesController","esProfile","canEdit","loadLikes","ESWotLookupExtendController","openRegistryLookup","ESWotIdentityViewController","esLike","esWallet","esInvitation","KINDS","showNewMessageModal","profile","showMessageCompose","sent","showSuggestCertificationModal","hideCertificationActionsPopover","help","box","getKeypair","send","showAskCertificationModal","askCertification","delete","canDelete","moderator","showCertificationActionsPopover","certificationActionsPopover","ESRegistryLookupController","esRegistry","lastRecords","category","advanced","geoDistance","isNaN","geoUnit","finishEntered","d","defaultSearch","registry","instant","last","oldLocation","odlDistance","onGeoPointChanged","resolveLocationPosition","doGetLastRecords","hidePopovers","filters","term","tags","parseTags","multi_match","query","fields","boost","description","nested","bool","category.name","terms","category.id","locationCity","or","and","not","exists","field","match_phrase","geo_distance","request","highlight","should","minimum_should_match","doRequest","formatSlug","urlTitle","removeType","removeCategory","removeLocation","onToggleAdvanced","toggleAdvanced","showRecordTypeModal","showCategoryModal","filtersPopover","showFiltersPopover","hideFiltersPopover","ESWalletPagesController","ESRegistryRecordViewController","args","background-image","secondTry","picture","_source","pic","fromAttachment","pages","ESRegistryRecordEditController","nextParams","fromState","confirmSave","saved","confirmGo","raw","avatarClass","onFormDataChanged","needCategory","hasWaitDebounce","uniq","picturesCount","toAttachment","resizeSrc","imageSrc","_content","_content_type","update","currentView","stateId","rotateAvatar","rotating","fileChanged","target","files","goBack","showAvatarModal","ESViewEditProfileController","existing","socialReorder","source","updateWallet","descriptionHtml","parseAsHtml","showSuccessToast","doFinishSave","saveAndClose","submitAndSaveAndClose","removeProfile","ESMessageAbstractListController","esMessage","limit","fabButtonNewMessageId","s","markAllAsRead","msg","deleteAll","removeAll","messageId","showReplyModal","isReply","onMessageDelete","onNewOutboxMessage","onNewInboxMessage","notification","new","onUnauth","ESMessageInboxListController","ESMessageOutboxListController","ESMessageComposeController","ESMessageComposeModalController","doSend","forceNoContent","destName","ESMessageViewController","clearPageCache","recipientField","PopoverMessageController","onNewMessageNotification","NotificationsController","esNotification","preventSelect","codes","excludes","EXCLUDED_CODES","setWallet","aWallet","resetUnreadCount","unreadCount","lastNotification","readTime","onNewNotification","nextIndex","n","PopoverNotificationsController","ESBlockLookupController","esBlockchain","excludeCurrent","parseSearchText","took","itemRemove","toggleShowQuery","showQuery","ESNetworkLookupController","esNetwork","endpointFilter","ES_USER_API","toggleOnline","ESNetworkLookupModalController","ESNetworkLookupPopoverController","ESPeerInfoPopoverController","ESPeerViewController","getUrl","docCount","hasEsEndpoint","ESGroupListController","esGroup","showNewRecordModal","ESGroupViewController","fetchPictures","ESGroupEditController","InvitationsController","defaultSearchLimit","DEFAULT_LOAD_SIZE","includes","INVITATION_CODES","invitations","onNewInvitation","invitation","accept","showNewInvitationModal","showNewInvitation","PopoverInvitationController","NewInvitationModalController","recipients","suggestions","onUseCommentChanged","removeRecipient","removeSuggestion","showSelectRecipientModal","showSelectSuggestionModal","ViewSubscriptionsController","esSubscription","emailFrequencies","groups","addSubscription","showEmailModal","notImplemented","addToUI","subscriptions","editSubscription","oldRecord","removeFromUI","deleteSubscription","ModalEmailSubscriptionsController","frequencies","frequency","doSubmit","email","subscriptionForm","ES_SUBSCRIPTION_API","ESDocumentLookupController","esDocument","showHeaders","doc","selectDocument","startListenChanges","wsChanges","change","fromHit","_operation","onDeleteDocument","onNewDocument","updated","ESLastDocumentsController","inheritedComputeOptions","side","getTimeFunction","ESLikesController","abuseData","abuseLevels","staring","initLikes","kind","contains","markAsView","$parent","toggleLike","reportAbuse","toggle","delta","wasHitByPubkey","wasHitCount","setAbuseForm","abuseForm","showAbuseCommentPopover","GpCurrencyAbstractController","_truncDate","startOf","rangeDuration","timePct","firstBlockTime","scale","beginAtZero","height","width","maintainAspectRatio","times","t","stepUnit","parseInt","currencyAge","setScale","updateHiddenDataset","updateLocation","setSize","toggleScale","scales","yAxes","yAxe","ticks","callback","log10","setRangeDuration","startTime","endTime","rangeDurationSec","datasetOverride","hidden","yAxisID","dataset","display","onLegendClick","legendItem","datasetIndex","ci","chart","getDatasetMeta","datasets","union","difference","goPreviousRange","loadingRange","goNextRange","timeWindow","onRangeChanged","updateRange","updateTimePct","GpBlockchainTxCountController","gpData","gpColor","displayRightAxis","txCount","datePatterns","hour","month","formatAmount","currencySymbol","labelPattern","labels","local","colors","fix","responsive","gridLines","drawOnChartArea","legend","onClick","tooltips","enabled","callbacks","tooltipItems","yLabel","hoverBackgroundColor","rgba","calm","fill","borderColor","gray","borderWidth","backgroundColor","pointBackgroundColor","pointBorderColor","white","pointHoverBackgroundColor","pointHoverBorderColor","translucent","pointRadius","onChartClick","_index","GpBlockchainIssuersController","countByIssuer","barOptions","custom","GpPeerViewExtendController","GpCurrencyViewExtendController","GpCurrencyMonetaryMassController","displayShareAxis","hiddenDatasets","truncAmount","trunc","withDividend","formatDate","blocksPeriod","pointHitRadius","pointHoverRadius","showLine","energized","GpCurrencyDUController","dateFilter","GpCurrencyMembersCountController","withCurrent","xAxes","GpAccountBalanceController","defaultSetScale","abs","withUD","movement","formatDecimal","received","stacked","positive","assertive","lineTension","GpAccountSumTxController","history","inputChart","computeChartData","outputChart","txArray","formatPubkey","sumByPubkeys","sum","sumItems","reverse","pluck","onInputChartClick","onOutputChartClick","GpAccountCertificationController","formatInteger","deltaReceived","deltaGiven","given","displayFormat","addPlus","GpDocStatsController","chartIdPrefix","charts","series","color","royal","clickState","defaultChartOptions","serie","docstat","usedYAxisIDs","endsWith","previousValue","_chart","canvas","_datasetIndex","GpSynchroController","synchro","execution","MapEditPositionAbstractController","MapUtils","mapId","markers","center","zoom","lng","helpText","draggable","MapWotViewController","$templateCache","$interpolate","leafletData","mapWot","markersSearchLayer","icons","markerColor","iconColor","loadingMarker","layers","overlays","visible","bounds","showDescription","enableDescription","noBackdrop","cPart","loadMap","getMap","L","easyButton","leafletClasses","states","addTo","btn","Control","separate","control","localizeMe","layerGroup","searchTip","layer","propertyName","buildTip","val","moveToLocation","lnglat","_map","setView","panTo","popupMarkerId","popupMarker","_layers","openPopup","firstTipSubmit","tooltipLimit","extractMarkerLayer","marker","markerClusterLayer","markerClusterGroup","disableClusteringAtZoom","LOCALIZE_ZOOM","maxClusterRadius","showCoverageOnHover","iconCreateFunction","cluster","countByLayer","getAllChildMarkers","childCount","getChildCount","className","divIcon","iconSize","Point","eachLayer","addLayer","featureGroup","subGroup","fire","clearLayers","markerTemplate","shortPubkey","opacity","getMessageScope","searchMarker","Marker","centerHash","isNumber","mapwot","startMapWotTour","MapRegistryViewController","mapRegistry","shop","company","association","institution","pageMarkerTemplate","MapPageEditController","MapProfileEditController","MapHelpTipController","module","factory","Api","localStorage","flag","fallbackLocale","fallbackLanguage","fixLocale","localeParts","similarLocale","l","String","prototype","call","previousData","startPromise","fixedLocale","STORAGE_KEY","fixedSettings","cacheTimeMs","timeWarningExpireMembership","minVersion","sourceUrl","sourceLicenseUrl","newIssueUrl","userForumUrl","latestReleaseUrl","duniterLatestReleaseUrl","persistCache","walletHistorySliceSecond","showUDHistory","decimalCount","uiEffects","blockValidityWindow","header","defaultLanguage","en","fr-FR","es-ES","started","emitChangedEvent","raise","getObject","previousSettings","savedData","setObject","applyData","newData","localeChanged","localeId","storedData","numeral","language","registerEvent","getByPath","defaultValue","jsonFeed","interval","isHttpsMode","compact","knownBlocks","minOnlineBlockNumber","uidsByPubkeys","searchingPeersOnNetwork","difficulties","ws2pHeads","loadW2spHeads","heads","head","loadDifficulties","levels","newPeers","flushNewPeersAndSort","sortPeers","initJobs","addOrRefreshPeerFromJson","hasEndpoint","privateWs2pHeads","privateEPCount","hasEndPoint","currentNumber","useWs2p","applyPeerFilter","oldBlock","isBma","list","createPeerEntities","hasUpdates","existingPeer","existingMainBuid","existingOnline","refreshPeer","refreshedPeer","existingIndex","useBma","endpointsAsString","epStr","getHost","ws2pHeadKey","getPort","ROOT_BLOCK_HASH","hardship","updateMainBuid","ids","newPeersAdded","computeScoreAlphaValue","nbChars","charCodeAt","buids","previousPeer","pct","hasConsensusBlock","consensusBlockDelta","$q_started","hasPeers","getPeers","getTrustedPeers","getKnownBlocks","getMainBlockUid","mainBuid","CryptoAbstractService","isLoaded","array_to_string","buf","bb","Uint8Array","f","readAsText","crypto_sign_BYTES","crypto_secretbox_NONCEBYTES","crypto_box_MACBYTES","SEED_LENGTH","SIMPLE","r","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","msCrypto","Crypto","FullJSServiceFactory","nacl","base64","check","function_name","check_injectBytes","what","thing","expected_length","check_length","bs","MALLOC","nacl_raw","HEAPU8","set","injectBytes","nbytes","_malloc","FREE","pointer","_free","Target","decode_utf8","unescape","encodeURIComponent","encode_utf8","a","decode_base58","decode","decode_base64","encode_base64","hash_sha256","to_hex","crypto_hash_sha256","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","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","sm","crypto_sign_open","sign","m","sk","signedMsg","crypto_sign","defer","naclOptions","scryptOptions","requested_total_memory","loadedLib","checkAllLibLoaded","lib","fromSignKeypair","skFromSignSk","pkFromSignPk","pack","subarray","serviceImpl","regexpContent","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","recipientFieldName","cypherFieldNames","boxRecipientPk","fieldName","cypherTexts","cypherFieldName","records","issuerFieldName","issuerBoxPks","issuerBoxPk","$ionicPlatform","readyPromise","$ionicLoading","$ionicConfig","ionicMaterialInk","ionicMaterialMotion","Fullscreen","screenmatch","exports","loadingTextCache","bind","alertError","subtitle","template","alertInfo","hideLoading","showLoading","isSmallScreen","active","imageOnLoadResize","thumbnail","ctx","maxWidth","maxHeight","createElement","getContext","xoffset","yoffset","drawImage","dataurl","toDataURL","showPopover","popovers","_show","isResolved","getSelection","setSelectionRange","autofocus","$emit","_cleanup","removeClass","fromTemplateUrl","afterHidden","motionDelegate","delegate","motionTimeout","defaultSelector","createQRCodeObj","typeNumber","errorCorrectionLevel","mb","stringToBytes","stringToBytesFuncs","qr","addData","make","classList","ripple","blinds","panInLeft","pushDown","slideUp","cancelType","_getLoader","loader","duration","fullMsg","displayEffect","setEffects","views","transition","nothing","class","createSvgTag","img","createImgTag","fab","fabs","getElementsByClassName","showHelptip","preAction","postAction","retryTimeout","selectElementText","childNodes","range","createRange","selectNodeContents","removeAllRanges","addRange","selectedText","angle","PI","rotate","imageOnLoadRotate","CacheFactory","VERY_LONG","MEDIUM","SHORT","storageMode","getSettingsStorageMode","cacheNames","getCacheOptions","deleteOnExpire","onExpire","cacheFlushInterval","onSettingsChanged","newStorageMode","cacheName","setOptions","maxAge","counter","createCache","cachePrefix","clearAll","controller","buildDate","build","DATE_PATTERN","$ionicModal","$injector","DefaultModalController","resolved","openModal","modal","hideModal","propName","getParameters","hideDelay","ctrlName","fragments","animation","locals","ctrlEval","isControllerAs","controllerName","ctrlInstance","showJoinWallet","useDigitKeyboard","showLogin","showLicense","submit","popup","afterShowSaved","sockets","allCachePrefixes","processError","prepare","pkeys","queryParams","newUri","pkey","parseUri","parser","pathname","hostname","compareVersionNumbers","v1","v2","v1parts","v2parts","validateParts","x","NaN","forcedTimeout","headers","getWithCache","autoRefresh","put","post","Content-Type","ws","getWsUrl","_waitOpen","readyState","waitDuration","waitRetryDelay","round","_open","WebSocket","onerror","onmessage","JSON","onopen","openTime","onclose","closeEvent","socket","closing","_close","_remove","isClosed","closeAllWs","sock","isDesktop","nw","Shell","openExternal","openOptions","openTarget","win","moveTo","isCompatible","actualVersion","storage","sessionStorage","stringify","$log","standard","secure","removeItem","cordova","barcodeScanner","clipboard","$cordovaClipboard","sourceType","navigator","PictureSourceType","PHOTOLIBRARY","CAMERA","quality","destinationType","DestinationType","DATA_URL","encodingType","EncodingType","PNG","targetWidth","targetHeight","$cordovaCamera","Keyboard","modelScope","modelPath","getModelValue","setModelValue","paths","property","leftButton","rightButton","userAgent","isOSX","process","InAppBrowser","WELL_KNOWN_CURRENCIES","g1","medianTimeOffset","medianTimeBlocks","currencyName","BLOCK_NOT_FOUND","_safeLoadCurrentUD","blockIndex","base","getData","getDataField","currentBlock","receivedAt","bmaAlive","currentBlockField","getCurrent","lastValid","useCache","SIG","OUTPUT_OBJ","REGEX_ENDPOINT_PARAMS","BMAS","WS2P","BMATOR","WS2PTOR","CURRENCY","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","closeWs","wsByPath","cacheTime","requestKey","getRequestFn","_startPromise","execCount","postRequest","postByPath","REVOCATION_ALREADY_REGISTERED","IDENTITY_SANDBOX_FULL","NO_MATCHING_IDENTITY","UID_ALREADY_USED","NO_MATCHING_MEMBER","NO_IDTY_MATCHING_PUB_OR_UID","WRONG_SIGNATURE_MEMBERSHIP","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","node2","port2","certifiedBy","certifiersOf","requirementsWithCache","currentWithCache","pendings","timesWithCache","treeItem","treeItemId","childrenContent","childrenMatches","convertedOutput","treeItems","functions","epPrefix","otherNode","wasStarted","memberUidsByPubkey","getByUid","blockNumbers","getHttpRecursive","peersByLeaves","leaves","httpGetRequest","paramName","paramValues","paramValue","requestParams","getHttpWithRetryIfLimitation","lastUd","pathCount","getLatestRelease","html_url","tag_name","identityCache","requirementsCache","_addUniqueIds","idtyKeys","_sortAndSliceIdentities","_resetRequirements","canMembershipOut","certificationCount","needCertifications","needCertificationCount","willNeedCertificationCount","_fillRequirements","currencyParameters","invalid","membershipPendingExpiresIn","willExpireCertificationCount","willExpire","revocation_sig","pendingCerts","certifiers","_fillIdentitiesMeta","inputData","withCache","cacheKey","outdistanced","certCount","loadIdentityByLookup","revoked_on","certPubkeys","certsMap","idtyFullKey","others","certs","certFullKey","cert_time","block_number","block_hash","signed","loadCertifications","getFunction","lookupCertifications","_certId","lookupHasCertTime","lookupCerticationsByCertId","certId","written","certTime","pendingCertifications","pendingCertByBlocks","validBuid","writtenCertByPubkey","_sortCertifications","errorCertifications","dataByLookup","received_cert_error","given_cert","given_cert_error","addEvent","messageParams","revocationTime","addEvents","safeText","addUniqueId","allowExtension","excludeRevoked","blocUid","lookupResultCount","getNewcomersRecursive","maxResultSize","joiner","idtyKey","memberDate","getAllRecursive","letters","letter","pubkeyAttributeName","skipAddUid","uidsByPubkey","events","memberships","idtiesByBlock","idtiesByPubkey","ms","blockHash","otherIdtySamePubkey","aidty","reduceTxAndPush","processedTxMap","allowPendings","outputBase","walletIsIssuer","otherIssuers","otherRecipients","noffset","outputArray","conditions","outputAmount","powBase","outputCondition","sigMatches","outputPubkey","identifier","consumed","txPubkeys","blockstampTime","txKey","newTx","isUD","locktime","inputs","loadTx","nowInSec","validating","reduceTxFn","sliceTime","loadUDs","tx1","tx2","firstValidatedTxIndex","toTime","addSources","sourcesIndexByKey","srcKey","addSource","loadSourcesAndBalance","txPendings","txErrors","balanceFromSource","balanceWithPending","_processPendingTx","consumedSources","inputKey","srcIndex","txs","allTx","loadSources","currentTime","filename","medianDate","formatSymbol","Idle","defaultBMA","CsWallet","enableAuthIdle","encryptedData","resetKeypair","resetTxAndSources","hasEncryptedData","needLogin","needAuth","loginCheck","restoreData","openEncryptedData","checkAuthIdle","loadOptions","wasAuth","resetStore","isNeverUsed","secureContent","useEncryption","storageKey","childrenCount","contentStr","cypherContent","seckey","sessionStorageData","localStorageData","applyRestoredData","oldChildrenCount","oldChildren","removeAllChildrenWallets","newChildInstance","addChildWallet","cleanEventsByContext","loadTxAndSources","loadSigStock","loadMinData","loadFullData","unused","skipData","truncBase","getInputs","filterBase","sourcesAmount","minBase","maxBase","lowerInputs","floor","logs","amountBase","subUnit","rest","isBase","truncBaseOrMinBase","createAndSendTx","pendingTx","firstSlice","secondSlice","outputOffset","newSources","signedTx","transaction","txHash","getIdentityDocument","sideIn","signedMembership","insertAtFirst","getkeypairSaveId","nbCharSalt","getRevocationDocument","identityLines","idtySignature","setParent","removedChildren","getChildWalletByPubkey","getAllChildrenWallet","isAuthResult","newEnableAuthIdle","setIdle","watch","unwatch","getIdle","getWalletSettings","allSettings","newSettings","useEncryptionChanged","useStorageChanged","internal","addListener","needToLoadRequirements","signedCert","saveId","getSaveIDDocument","saveIdFile","revocationFile","fileName","cleanByContext","create","childIndex","parentWallet","constant","startWalletHelpTip","helpController","provider","eagerLoadingServices","extensionByStates","registerEagerLoadingService","serviceName","extendState","extension","extendStates","stateNames","$get","currentExtensionPointName","getActivesByName","extensionPointName","BMA_REGEXP","BMAS_REGEXP","WS2P_REGEXP","LOCAL_IP_ADDRESS","regex","copyValues","copyValuesFrom","getRaw","bmaRegex","bmasRegex","regExp","getIPv4","getIPv6","getURL","parseArrayValues","parseTransactions","array","itemObjProperties","arrayProperty","toHimself","$inject","$stateProvider","$urlRouterProvider","abstract","large","menuContent","otherwise","silentLocationChange","tab","preferHttp","tab-parameters","tab-wot","tab-network","tab-blocks","run","$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","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","CATEGORY","CATEGORIES","CATEGORY_SEARCH_HELP","LAST_MODIFICATION_DATE","SUBMIT_BY","BTN_LIKE","BTN_LIKE_REMOVE","LIKES_TEXT","ABUSES_TEXT","BTN_REPORT_ABUSE_DOTS","BTN_REMOVE_REPORTED_ABUSE","BTN_PUBLISH","BTN_PICTURE_DELETE","BTN_PICTURE_FAVORISE","BTN_PICTURE_ROTATE","BTN_ADD_PICTURE","NOTIFICATION","HAS_UNREAD","NOTIFICATIONS","MARK_ALL_AS_READ","NO_RESULT","SHOW_ALL","LOAD_NOTIFICATIONS_FAILED","REPORT_ABUSE","REASON_HELP","ASK_DELETE","REGISTRY","USER_PROFILE","MESSAGES","INVITATIONS","ORGANIZATION_ACCOUNT","ORGANIZATION_ACCOUNT_HELP","EVENT","MEMBER_WITHOUT_PROFILE","WS_CONNECTION_FAILED","BTN_SUGGEST_CERTIFICATIONS_DOTS","BTN_ASK_CERTIFICATIONS_DOTS","BTN_ASK_CERTIFICATION","SUGGEST_CERTIFICATIONS_MODAL","ASK_CERTIFICATIONS_MODAL","SEARCH","DIVIDER_PROFILE","DIVIDER_PAGE","DIVIDER_GROUP","SUGGEST_CERTIFICATIONS","ASK_CERTIFICATION","ASK_CERTIFICATIONS","INVITATION","BTN_DELETE_ALL","BTN_NEW_INVITATION","SUGGESTION_CERTIFICATION","SUGGESTED_BY","RECIPIENTS","RECIPIENTS_HELP","RECIPIENTS_MODAL_TITLE","RECIPIENTS_MODAL_HELP","SUGGESTION_IDENTITIES","SUGGESTION_IDENTITIES_HELP","SUGGESTION_IDENTITIES_MODAL_TITLE","SUGGESTION_IDENTITIES_MODAL_HELP","DELETE_ALL_CONFIRMATION","SEND_INVITATIONS_TO_CERTIFY","INVITATION_SENT","LOAD_INVITATIONS_FAILED","REMOVE_INVITATION_FAILED","REMOVE_ALL_INVITATIONS_FAILED","SEND_INVITATION_FAILED","BAD_INVITATION_FORMAT","COMMENTS","DIVIDER","SHOW_MORE_COMMENTS","COMMENT_HELP_REPLY_TO","REPLY","REPLY_TO","REPLY_TO_LINK","REPLY_TO_DELETED_COMMENT","REPLY_COUNT","DELETED_COMMENT","MODIFIED_ON","MODIFIED_PARENTHESIS","FAILED_SAVE_COMMENT","FAILED_REMOVE_COMMENT","REPLY_TITLE_PREFIX","FORWARD_TITLE_PREFIX","BTN_REPLY","BTN_COMPOSE","BTN_WRITE","NO_MESSAGE_INBOX","NO_MESSAGE_OUTBOX","MESSAGE_RECEIVED","INBOX","OUTBOX","LAST_INBOX","LAST_OUTBOX","BTN_LAST_MESSAGES","POPOVER_ACTIONS","DELETE_ALL","COMPOSE","TITLE_REPLY","OBJECT","OBJECT_HELP","ENCRYPTED_HELP","MESSAGE_HELP","CONTENT_CONFIRMATION","SENDER","RECIPIENT","NO_CONTENT","DELETE","REMOVE","REMOVE_ALL","USER_HAS_NO_PROFILE","MESSAGE_REMOVED","All_MESSAGE_REMOVED","MESSAGE_SENT","SEND_MSG_FAILED","LOAD_MESSAGES_FAILED","LOAD_MESSAGE_FAILED","MESSAGE_NOT_READABLE","USER_NOT_RECIPIENT","NOT_AUTHENTICATED_MESSAGE","REMOVE_MESSAGE_FAILED","MESSAGE_CONTENT_TOO_LONG","MARK_AS_READ_FAILED","REMOVE_All_MESSAGES_FAILED","MARK_ALL_AS_READ_FAILED","RECIPIENT_IS_MANDATORY","HEADER_MEDIAN_TIME","HEADER_BLOCK","HEADER_ISSUER","BTN_LAST","DISPLAY_QUERY","HIDE_QUERY","TX_SEARCH_FILTER","MEMBER_FLOWS","EXISTING_TRANSACTION","PERIOD","ISSUER","TX_PUBKEY","SEARCH_BLOCKS_FAILED","LOCATION_DIVIDER","SOCIAL_NETWORKS_DIVIDER","BTN_SHOW_WOT","BTN_SHOW_WOT_HELP","BTN_SHOW_PAGES","BTN_SHOW_PAGES_HELP","MY_PAGES","NO_PAGE","BTN_LAST_RECORDS","BTN_ADVANCED_SEARCH","LOCATION_HELP","RESULTS","RESULT_COUNT_LOCATION","RESULT_COUNT","LAST_RECORDS","LAST_RECORD_COUNT_LOCATION","LAST_RECORD_COUNT","POPOVER_FILTERS","LOCATION","MENU_TITLE","REMOVE_CONFIRMATION","SELECT_TYPE","ENUM","SHOP","COMPANY","ASSOCIATION","INSTITUTION","EDIT","TITLE_NEW","RECORD_TYPE","RECORD_TITLE","RECORD_TITLE_HELP","RECORD_DESCRIPTION","RECORD_DESCRIPTION_HELP","RECORD_ADDRESS","RECORD_ADDRESS_HELP","RECORD_CITY","RECORD_CITY_HELP","RECORD_SOCIAL_NETWORKS","RECORD_PUBKEY","RECORD_PUBKEY_HELP","WALLET","PAGE_DIVIDER","PAGE_DIVIDER_HELP","LOAD_CATEGORY_FAILED","LOAD_RECORD_FAILED","LOOKUP_RECORDS_FAILED","REMOVE_RECORD_FAILED","SAVE_RECORD_FAILED","RECORD_NOT_EXISTS","GEO_LOCATION_NOT_FOUND","RECORD_REMOVED","RECORD_SAVED","PROFILE","PROFILE_DIVIDER","PROFILE_DIVIDER_HELP","NO_PROFILE_DEFINED","BTN_REORDER","TITLE_HELP","DESCRIPTION_HELP","SOCIAL_HELP","MODAL_AVATAR","SELECT_FILE_HELP","BTN_SELECT_FILE","RESIZE_HELP","RESULT_HELP","REMOVE_PROFILE_FAILED","LOAD_PROFILE_FAILED","SAVE_PROFILE_FAILED","INVALID_SOCIAL_NETWORK_FORMAT","IMAGE_RESIZE_FAILED","PROFILE_REMOVED","PROFILE_SAVED","WARNING_PUBLIC_DATA","BTN_GEOLOC_ADDRESS","USE_GEO_POINT","LOADING_LOCATION","ADDRESS","ADDRESS_HELP","CITY","CITY_HELP","DISTANCE","DISTANCE_UNIT","DISTANCE_OPTION","PROFILE_POSITION","ALTERNATIVE_RESULT_DIVIDER","POSITION","CITY_REQUIRED_IF_STREET","REQUIRED_FOR_LOCATION","INVALID_FOR_LOCATION","GEO_LOCATION_FAILED","ADDRESS_LOCATION_FAILED","SUBSCRIPTION","SUBSCRIPTION_DIVIDER","SUBSCRIPTION_DIVIDER_HELP","NO_SUBSCRIPTION","SUBSCRIPTION_COUNT","HELP_TEXT","PROVIDER","EMAIL","DELETE_SUBSCRIPTION","LOAD_SUBSCRIPTIONS_FAILED","ADD_SUBSCRIPTION_FAILED","UPDATE_SUBSCRIPTION_FAILED","DELETE_SUBSCRIPTION_FAILED","MODAL_EMAIL","EMAIL_LABEL","EMAIL_HELP","FREQUENCY_LABEL","FREQUENCY_DAILY","FREQUENCY_WEEKLY","DOCUMENT","BTN_ACTIONS","LAST_DOCUMENTS_DOTS","LAST_DOCUMENTS","SHOW_QUERY","HEADER_TIME","HEADER_RECIPIENT","READ","BTN_REMOVE","HAS_CREATE_OR_UPDATE_PROFILE","REMOVED","LOAD_DOCUMENTS_FAILED","REMOVE_FAILED","REMOVE_ALL_FAILED","ES_SETTINGS","PLUGIN_NAME","PLUGIN_NAME_HELP","ENABLE_TOGGLE","ENABLE_REMOTE_STORAGE","ENABLE_REMOTE_STORAGE_HELP","ENABLE_MESSAGE_TOGGLE","PEER_HELP","ENABLE_TX_SENT","ENABLE_TX_RECEIVED","ENABLE_CERT_SENT","ENABLE_CERT_RECEIVED","ENABLE_HTML5_NOTIFICATION","ENABLE_HTML5_NOTIFICATION_HELP","ASK_ENABLE_TITLE","ASK_ENABLE","ES_WALLET","ES_PEER","DOCUMENTS","DOCUMENT_COUNT","EMAIL_SUBSCRIPTION_COUNT","NODE_STARTED","NODE_BMA_DOWN","NODE_BMA_UP","MEMBER_JOIN","MEMBER_LEAVE","MEMBER_EXCLUDE","MEMBER_REVOKE","MEMBER_ACTIVE","TX_SENT","TX_SENT_MULTI","TX_RECEIVED","TX_RECEIVED_MULTI","CERT_SENT","CERT_RECEIVED","LIKE_RECEIVED","FOLLOW_RECEIVED","STAR_RECEIVED","MODERATION_RECEIVED","DELETION_RECEIVED","ABUSE_RECEIVED","PAGE","NEW_COMMENT","UPDATE_COMMENT","NEW_REPLY_COMMENT","UPDATE_REPLY_COMMENT","FOLLOW_NEW_COMMENT","FOLLOW_UPDATE_COMMENT","FOLLOW_NEW","FOLLOW_UPDATE","LIKE","FAILED_TOGGLE_LIKE","ES_USE_FALLBACK_NODE","ES_CONNECTION_ERROR","ES_MAX_UPLOAD_BODY_SIZE","GROUP","CREATED_TIME","LAST_RESULTS_LIST","OPEN_RESULTS_LIST","MANAGED_RESULTS_LIST","OPEN_GROUP","OPEN_GROUP_HELP","MANAGED_GROUP","MANAGED_GROUP_HELP","OPEN","MANAGED","SEARCH_GROUPS_FAILED","DELETE_BY_MODERATOR","DELETE_PROFILE_FAILED","FOLLOW_CLOSE","ENABLE_SETTINGS_TOGGLE","TITLE_SMALL_DEVICE","BTN_GRAPH","GRAPH","LINEAR_SCALE","LOGARITHMIC_SCALE","BTN_SHOW_STATS","BTN_SHOW_DETAILED_STATS","RANGE_DURATION_DIVIDER","RANGE_DURATION","DAY","MONTH","BALANCE_DIVIDER","BALANCE_TITLE","TX_RECEIVED_LABEL","TX_SENT_LABEL","UD_LABEL","BALANCE_LABEL","INPUT_CHART_TITLE","OUTPUT_CHART_TITLE","BLOCKS_ISSUERS_DIVIDER","BLOCKS_ISSUERS_HELP","BLOCKS_ISSUERS_TITLE","BLOCKS_ISSUERS_LABEL","TX_DIVIDER","TX_AMOUNT_TITLE","TX_AMOUNT_PUBKEY_TITLE","TX_AMOUNT_LABEL","TX_COUNT_TITLE","TX_COUNT_LABEL","TX_AVG_BY_BLOCK","MONETARY_MASS_TITLE","MONETARY_MASS_LABEL","MONETARY_MASS_SHARE_LABEL","UD_TITLE","MEMBERS_COUNT_TITLE","MEMBERS_COUNT_LABEL","BLOCK_COUNT_LABEL","BLOCK_COUNT","DOC_STATS","USER_SETTINGS","USER_DELTA","MESSAGE_INBOX","MESSAGE_OUTBOX","INVITATION_CERTIFICATION","SOCIAL","PAGE_COMMENT","PAGE_RECORD","GROUP_RECORD","OTHER","HISTORY_DELETE","TX_ACCUMULATION_LABEL","UD_ACCUMULATION_LABEL","CERTIFICATION_TITLE","RECEIVED_CERT_LABEL","RECEIVED_CERT_DELTA_LABEL","GIVEN_CERT_LABEL","GIVEN_CERT_DELTA_LABEL","SYNCHRO","COUNT","INSERTS","UPDATES","DELETES","PERFORMANCE","DURATION","MAP","SEARCH_DOTS","BTN_LOCALIZE_ME","BTN_MAP","BTN_MAP_HELP","LAYER","LOAD_POSITION_FAILED","MARKER_HELP","LOCALIZE_ME_FAILED","MAP_DIVIDER","ENABLE_GOOGLE_API","ENABLE_GOOGLE_API_HELP","GOOGLE_API_KEY","BTN_GOOGLE_API","BTN_GOOGLE_API_WARNING","GOOGLE_API_KEY_PLACEHOLDER","WOT_BTN_LAYERS","WOT_BTN_SEARCH","RML9","BTN_EXPORT","BTN_OPEN","BTN_SWOW_TX","CHART","API_REGEXP","getEP","epRegex","isHttp","commons","refreshTreeLinks","addTreeLinks","mapById","incompleteCommentIdByParentIds","_id","order","loadDataByRecordId","recordId","loadAvatar","createOnDeleteListener","onRemoveListener","entity","stopListenChanges","EsHttp","enableCache","defaultSettingsNode","ANY_API_ENDPOINT","MAX_UPLOAD_BODY_SIZE","maxUploadBodySize","IMAGE_SRC","URL","HASH_TAG","USER_TAG","API_ENDPOINT","fallbackNodeIndex","truncUrlFilter","isSameNodeAsSettings","isSameNode","setIsFallbackNode","onSettingsReset","parseTagsFromText","reg","tag","cleanCache","isTemporary","byteCount","encodeURI","_inheritedOpen","checkNodeAlive","fallbackNode","fallbackNodes","newServer","old","skipInit","imageField","attachment","_type","_title","_name","moderators","sameAsSettings","getRequest","postParams","tagFields","fieldNames","fillRecordTags","ignoreFields","str","bodyLength","_version","escape","tagState","uidState","newLine","urls","parseUrlsFromText","link","hashTags","userTags","titles","suffix","lines","line","parseMarkdownTitlesFromText","findObjectInTree","attrName","Array","isArray","countHits","subscription","PluginServiceProvider","previousRemoteData","SETTINGS_SAVE_SPEC","askEnable","useRemoteStorage","txSent","txReceived","certSent","certReceived","enableGoogleApi","googleApiKey","enableMixedSearch","ignoreSettingsChanged","failEnable","onWalletAuth","loadSettings","storeSettingsLocally","refreshState","filteredData","copyUsingSpec","copySpec","storeSettingsRemotely","isEmitHtml5Enable","isMixedSearchEnable","esComment","onWalletReset","onWalletLoad","getCategories","readRecordFromHit","getCommons","geoDistanceObj","geoDistanceUnit","fecthPictures","esCrypto","PHONE","facebook","twitter","googleplus","youtube","github","tumblr","snapchat","linkedin","vimeo","instagram","wordpress","diaspora","bitcoin","curve25519","getTypeFromUrl","urlToMatch","slashPathIndex","getFromUrl","reduceArray","createForEncryption","dataToEncrypt","openArray","socialsToDecrypt","packArray","socialsToEncrypt","getProfile","getAll","found","fillAvatars","datas","pubkeyAtributeName","onWotSearch","dataByPubkey","mixedSearch","_id^4","constant_score","indices_boost","group","indices","avatarFieldName","memberCount","_fillSearchResultFromHit","onWotLoad","getFields","getAvatarAndName","wsUserEventCloseFn","MESSAGE_CODES","createFilterQuery","must","excludesCodes","must_not","gt","loadUnreadNotificationsCount","missing","postCount","getWalletNotifications","Promise","MEDIAN_TIME_OFFSET","warnCount","onNewUserEvent","newInvitation","markNotificationAsRead","$$phase","addNewNotification","emitEsNotification","newMessage","htmlToPlaintext","emitHtml5Notification","lang","onclick","browserNotification","postReadById","countWarnEvents","excludeCodes","ui","onWalletLogin","wsUserEvent","getUserEvent","postSearch","getChanges","walletNotifs","html5","emit","postSearchByType","getByTypeAndId","onWalletInit","messages","countUnreadMessages","onNewMessageEvent","doSendMessage","boxPath","searchMessages","decryptMessages","withSummary","fillSummary","sortFilteredMessages","titleMatch","contentMatch","onSendError","developers","developer","loadMessages","avatarField","filteredMessages","word","filterMessages","outbox","updateNotificationCountAndReadTime","notificationReadTime","showNotifications","onRead","REGEXPS","SEARCH_FILTER","LAST_AND","FIELDS","MINIMAL","COMMONS","ES_CORE_API_ENDPOINT","processSearchResult","fillAvatar","hasExcludedCurrent","unparsedText","filterType","filterText","_internal","_executeSearchRequest","getLastGroups","countUnreadInvitations","onWalletCertify","invitationstoRemove","where","deleteInvitation","onNewInvitationEvent","getInvitationById","jsons","deleteInvitationsByIds","certification","getIds","identitiesToExtend","deleteByIds","countBeforeDeletion","unreadCountBeforeDeletion","$sanitize","issuerContent","recipientContent","encryptedRecord","onWalletUnauth","fullKeypair","membershipsCache","cleanAllCache","lastJoinTime","joinTime","leaveTime","esWot","onLoadUDs","filtered","uds","googleSearchPositionByString","google","apiKey","display_name","address_components","long_name","geometry","osm","freegeoip","hasConfigApiKey","geolocation","getCurrentPosition","coords","latitude","longitude","addressdetails","village","town","road","suburb","hamlet","place_id","osmErr","street","googleErr","lat1","lon1","lat2","lon2","radlat1","radlat2","theta","radtheta","dist","sin","cos","acos","ip","_initOptions","stats.medianTime","nested_path","_readSearchHits","issuerField","docType","queryString","documents","EsNetwork","pod","emailSubscription","sortScore","addLike","postRecord","removeLike","removeRecord","getSearch","searchBaseQueryString","getLikeIds","existingLikeIds","likeId","issuerHitIndex","nav-buttons-right","menu-user","profile-popover-user","nav-buttons","hero","after-general","item-wallet","top","general","after-buttons","buttons-top-fab","tab_registry","tab_inbox","tab_outbox","network-buttons","blockchain-buttons","currencyCache","blockstat","_powBase","rawLightInstance","_initRangeOptions","maxRangeSize","defaultTotalRangeCount","subtract","aggs","blocksByIssuer","aggregations","buckets","agg","doc_count","deltaWithLastDividend","ranges","isBefore","txAmount","avgByBlock","avg","maxByBlock","getByRange","received_stats","sent_stats","getUds","fromMapping","ud_stats","unitbase_stats","udRanges","udFromMapping","pop","udRange","udsMap","truncTime","searchRequest","request_cache","inserts","updates","deletes","peer_count","apis","cardinality","css2Rgb","balanced","stable","startColor","startState","_state2side","defaultStateSize","sides","stateCounters","j","valueOf","mapObject","rgbArray","documents-buttons","parameters-actual","wot-actual","network-actual","AwesomeMarkers","Icon","searchAddress","northEast","southWest","boundingBox","top_left","bottom_right","geo_bounding_box","processLoadHits","commaRegexp","searchAddressItems","random","processRequestResultFn","subRes","leafletHelpers","FRANCE","isSameCenter","isSameCenterOnMap","setControlId","_container","superOnAdd","onAdd","container","DEFAULT_CENTER","overlaysNames","defaults","scrollWheelZoom","tileLayerOptions","attribution","baselayers","layerOptions","subdomains","continuousWorld","controls","updateCenter","invalidateSize","_resetView","isValidCenter","isSame","centerModel","mapCenter","initial","markerLocation","translatePromise","textPlaceholder","textErr","setId","overlayNames","overlayName","addEventListener","filter-buttons","after-position","markerMessageTemplate","offline","markerIdByPeerId","markerCounter","inheritedEnter","_getMarkerColor","countByColor","green","lightgreen","lightgray","getAttribution","markerIdByPeerIdToRemove","markerId","updateMarker","searchIp","peerId","common","deferIntercept","$urlRouter","disableChangeState","preventStateChange","currentScope","newUrl","oldUrl","listen","styleLightContent","bootstrap","component","csId","directive","require","ngModel","compareTo","$validators","modelValue","$eval","$validate","differentTo","NUMBER_REGEXP","numberFloat","$isEmpty","INT_REGEXP","attrs","numberInt","EMAIL_REGEXP","requiredIf","required","restrict","showCopyPopover","copyOnClick","clazz","activeLink","activeLinkPathPrefix","newPath","addClass","returnClose","onReturn","onFocus","onBlur","attr","which","blur","$compile","$parse","compile","tElement","tAttrs","ngBindHtmlGetter","trustAsHtml","ngBindHtmlWatch","$$addBindingClass","$$addBindingInfo","contents","$element","tAttributes","extensionPoints","append","getTemplate","pre","iElement","iAttrs","fn","onReadFile","onChangeEvent","onLoadEvent","srcElement","elem","dropZone","dataTransfer","$apply","transclude","fileSelect","attachEvent","onLocaleChange","onCurrencyChange","pattern","patternRelative","minValueRelative","formatRelative","formatQuantitative","minValue","Infinity","fromNow","separator","_cache","sepChars","charAt","uniformLanguageTag","determinePreferredLanguage","useSanitizeValueStrategy","useLoaderCache","$httpProvider","useXDomain","$compileProvider","debugInfoEnabled","imgSrcSanitizationWhitelist","$animateProvider","classNameFilter","CacheFactoryProvider","recycleFreq","storagePrefix","capacity","screenmatchConfigProvider","rules","$ionicConfigProvider","enableJsScrolling","scrolling","jsScrolling","maxCache","IdleProvider","idle","logoutIdle","logoutTimeout","exception","cause","removeChangeStateListener","enableChangeState","checkBmaNodeAlive","messageParam","errorState","isNewer","device","hideKeyboardAccessoryBar","disableScroll","release","newRelease","registerBackButtonAction","backView","exitApp","rtrim","arguments"],"mappings":"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","file":"../../dist_js/cesium.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","\nAppController.$inject = ['$scope', '$rootScope', '$state', '$ionicSideMenuDelegate', '$q', '$timeout', '$ionicHistory', '$controller', '$window', 'csPlatform', 'csSettings', 'CryptoUtils', 'csCrypto', 'UIUtils', 'BMA', 'csWallet', 'Device', 'Modals', 'csConfig', 'csHttp'];\nHomeController.$inject = ['$scope', '$state', '$timeout', '$ionicHistory', '$translate', '$http', 'UIUtils', 'csConfig', 'csCache', 'csPlatform', 'csCurrency', 'csSettings'];\nPluginExtensionPointController.$inject = ['$scope', 'PluginService'];angular.module('cesium.app.controllers', ['cesium.platform', 'cesium.services'])\n\n .config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app', {\n url: \"/app\",\n abstract: true,\n templateUrl: \"templates/menu.html\",\n controller: 'AppCtrl',\n data: {\n large: false\n }\n })\n\n .state('app.home', {\n url: \"/home?error\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/home/home.html\",\n controller: 'HomeCtrl'\n }\n }\n })\n\n .state('app.lock', {\n cache: false,\n url: \"/lock\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/common/view_passcode.html\",\n controller: 'PassCodeCtrl'\n }\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\n .controller('AppCtrl', AppController)\n\n .controller('HomeCtrl', HomeController)\n\n .controller('PluginExtensionPointCtrl', PluginExtensionPointController)\n\n;\n\n/**\n * Useful controller that could be reuse in plugin, using $scope.extensionPoint for condition rendered in templates\n */\nfunction PluginExtensionPointController($scope, PluginService) {\n 'ngInject';\n $scope.extensionPoint = PluginService.extensions.points.current.get();\n}\n\n/**\n * Abstract controller (inherited by other controllers)\n */\nfunction AppController($scope, $rootScope, $state, $ionicSideMenuDelegate, $q, $timeout,\n $ionicHistory, $controller, $window, csPlatform, csSettings, CryptoUtils, csCrypto,\n UIUtils, BMA, csWallet, Device, Modals, csConfig, csHttp\n) {\n 'ngInject';\n\n $scope.walletData = csWallet.data;\n $scope.search = {};\n $scope.login = csWallet.isLogin();\n $scope.auth = csWallet.isAuth();\n $scope.motion = UIUtils.motion.default;\n $scope.fullscreen = UIUtils.screen.fullscreen.isEnabled();\n\n $scope.showHome = function() {\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n return $state.go('app.home')\n .then(UIUtils.loading.hide);\n };\n\n ////////////////////////////////////////\n // Show Help tour\n ////////////////////////////////////////\n\n $scope.createHelptipScope = function(isTour) {\n if (!isTour && ($rootScope.tour || !$rootScope.settings.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 = $scope.$new();\n $controller('HelpTipCtrl', { '$scope': helptipScope});\n return helptipScope;\n };\n\n $scope.startHelpTour = function(event, skipClearCache) {\n if (event && event.defaultPrevented) return false; // Event stopped;\n\n $rootScope.tour = true; // to avoid other helptip to be launched (e.g. csWallet)\n\n // Clear cache history\n if (!skipClearCache) {\n $ionicHistory.clearHistory();\n return $ionicHistory.clearCache()\n .then(function() {\n $scope.startHelpTour(null, true/*continue*/);\n });\n }\n\n var helptipScope = $scope.createHelptipScope(true/*is tour*/);\n return helptipScope.startHelpTour()\n .then(function() {\n helptipScope.$destroy();\n delete $rootScope.tour;\n })\n .catch(function(err){\n delete $rootScope.tour;\n });\n };\n\n $scope.disableHelpTour = function(event) {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (csSettings.data.helptip && csSettings.data.helptip.enable) {\n $rootScope.settings.helptip.enable = false;\n csSettings.store();\n }\n\n };\n\n ////////////////////////////////////////\n // Login & wallet\n ////////////////////////////////////////\n\n $scope.isLogin = function() {\n return $scope.login;\n };\n\n // Load wallet data (after login)\n $scope.loadWalletData = function(options) {\n\n console.warn(\"[app-controller] DEPRECATED - Please use csWallet.load() instead of $scope.loadWalletData()\", new Error());\n\n options = options || {};\n var wallet = options.wallet || csWallet;\n return wallet.loadData(options)\n\n .then(function(walletData) {\n // cancel login\n if (!walletData) throw 'CANCELLED';\n return walletData;\n });\n };\n\n // Login and load wallet\n $scope.loadWallet = function(options) {\n\n console.warn(\"[app-controller] DEPRECATED - Please use csWallet.loginOrLoad() instead of $scope.loadWallet()\", new Error());\n\n // Make sure the platform is ready\n if (!csPlatform.isStarted()) {\n return csPlatform.ready().then(function(){\n return $scope.loadWallet(options);\n });\n }\n\n options = options || {};\n\n var wallet = options.wallet || csWallet;\n\n // If need auth\n if (options.auth && !wallet.isAuth()) {\n return wallet.auth(options)\n .then(function (walletData) {\n if (walletData) return walletData;\n // failed to auth\n throw 'CANCELLED';\n });\n }\n\n // If need login\n else if (!wallet.isLogin()) {\n return wallet.login(options)\n .then(function (walletData) {\n if (walletData) return walletData;\n // failed to login\n throw 'CANCELLED';\n });\n }\n\n // Already login or auth\n else if (!wallet.isDataLoaded(options)) {\n return $scope.loadWalletData(options);\n }\n else {\n return $q.when(wallet.data);\n }\n };\n\n // Login and go to a state (or wallet if not)\n $scope.loginAndGo = function(state, options) {\n $scope.closeProfilePopover();\n options = options || {};\n var wallet = options.wallet || csWallet;\n delete options.wallet;\n\n state = state || 'app.view_wallet';\n\n if (!wallet.isLogin()) {\n\n // Make sure to protect login modal, if HTTPS enable - fix #340\n if (csConfig.httpsMode && $window.location && $window.location.protocol !== 'https:') {\n var href = $window.location.href;\n var hashIndex = href.indexOf('#');\n var rootPath = (hashIndex != -1) ? href.substr(0, hashIndex) : href;\n rootPath = 'https' + rootPath.substr(4);\n href = rootPath + $state.href(state);\n if (csConfig.httpsModeDebug) {\n // Debug mode: just log, then continue\n console.debug('[httpsMode] --- Should redirect to: ' + href);\n }\n else {\n $window.location.href = href;\n return;\n }\n }\n\n return wallet.login(options)\n .then(function(){\n return $state.go(state, options);\n })\n .then(UIUtils.loading.hide);\n }\n else {\n return $state.go(state, options);\n }\n };\n\n // Logout\n $scope.logout = function(options) {\n options = options || {};\n var wallet = options.wallet || csWallet;\n if (!options.force && $scope.profilePopover) {\n // Make the popover if really closed, to avoid UI refresh on popover buttons\n return $scope.profilePopover.hide()\n .then(function(){\n options.force = true;\n return $scope.logout(options);\n });\n }\n if (options.askConfirm) {\n return UIUtils.alert.confirm('CONFIRM.LOGOUT')\n .then(function(confirm) {\n if (confirm) {\n options.askConfirm=false;\n return $scope.logout(options);\n }\n });\n }\n\n UIUtils.loading.show();\n return wallet.logout()\n .then(function() {\n // Close left menu if open\n if ($ionicSideMenuDelegate.isOpenLeft()) {\n $ionicSideMenuDelegate.toggleLeft();\n }\n\n // If default wallet: clear navigation history, then go back to home\n if (wallet.isDefault()) {\n $ionicHistory.clearHistory();\n\n return $ionicHistory.clearCache()\n .then(function() {\n return $scope.showHome();\n });\n }\n else {\n UIUtils.loading.hide(10);\n }\n })\n .catch(UIUtils.onError('ERROR.LOGOUT'));\n };\n // Do authentification\n $scope.doAuth = function(options) {\n var wallet = options && options.wallet || csWallet;\n return wallet.auth()\n .then(UIUtils.loading.hide);\n };\n\n // If connected and same pubkey\n $scope.isUserPubkey = function(pubkey) {\n return csWallet.isUserPubkey(pubkey);\n };\n\n // add listener on wallet event\n csWallet.api.data.on.login($scope, function(data, deferred) {\n $scope.login = true;\n return deferred ? deferred.resolve() : $q.when();\n });\n csWallet.api.data.on.logout($scope, function() {\n $scope.login = false;\n });\n csWallet.api.data.on.auth($scope, function(data, deferred) {\n $scope.auth = true;\n return deferred ? deferred.resolve() : $q.when();\n });\n csWallet.api.data.on.unauth($scope, function() {\n $scope.auth = false;\n });\n\n ////////////////////////////////////////\n // Useful modals\n ////////////////////////////////////////\n\n // Open transfer modal\n $scope.showTransferModal = function(parameters) {\n return Modals.showTransfer(parameters);\n };\n\n $scope.showAboutModal = function() {\n return Modals.showAbout();\n };\n\n $scope.showJoinModal = function() {\n $scope.closeProfilePopover();\n return Modals.showJoin();\n };\n\n $scope.showSettings = function() {\n $scope.closeProfilePopover();\n return $state.go('app.settings');\n };\n\n $scope.showHelpModal = function(parameters) {\n return Modals.showHelp(parameters);\n };\n\n ////////////////////////////////////////\n // Useful popovers\n ////////////////////////////////////////\n\n $scope.showProfilePopover = function(event) {\n return UIUtils.popover.show(event, {\n templateUrl :'templates/common/popover_profile.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.profilePopover = popover;\n $timeout(function() {\n UIUtils.ink({selector: '#profile-popover .ink, #profile-popover .ink-dark'});\n }, 100);\n }\n });\n };\n\n $scope.closeProfilePopover = function() {\n if ($scope.profilePopover && $scope.profilePopover.isShown()) {\n $timeout(function(){$scope.profilePopover.hide();});\n }\n };\n\n // Change peer info\n $scope.showPeerInfoPopover = function(event) {\n return UIUtils.popover.show(event, {\n templateUrl: 'templates/network/popover_peer_info.html',\n autoremove: true,\n scope: $scope.$new(true)\n });\n };\n\n ////////////////////////////////////////\n // Link management\n ////////////////////////////////////////\n\n $scope.openLink = function($event, uri, options) {\n $event.stopPropagation();\n $event.preventDefault();\n\n // Read URL like '@UID' (Used by home page, in feed's author url)\n if (uri && uri.startsWith('@')) {\n var uid = uri.substr(1);\n if (BMA.regexp.USER_ID.test(uid)) {\n $state.go('app.wot_identity_uid', {uid: uid});\n return false;\n }\n }\n\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 csHttp.uri.open(uri, options);\n\n return false;\n };\n\n ////////////////////////////////////////\n // Layout Methods\n ////////////////////////////////////////\n $scope.showFab = function(id, timeout) {\n UIUtils.motion.toggleOn({selector: '#'+id + '.button-fab'}, timeout);\n };\n\n $scope.hideFab = function(id, timeout) {\n UIUtils.motion.toggleOff({selector: '#'+id + '.button-fab'}, timeout);\n };\n\n // Could be override by subclass\n $scope.doMotion = function(options) {\n return $scope.motion.show(options);\n };\n\n\n ////////////////////////////////////////\n // Fullscreen mode\n ////////////////////////////////////////\n\n $scope.askFullscreen = function() {\n var skip = $scope.fullscreen || !UIUtils.screen.isSmall() || !Device.isWeb();\n if (skip) return;\n\n return UIUtils.alert.confirm('CONFIRM.FULLSCREEN', undefined, {\n cancelText: 'COMMON.BTN_NO',\n okText: 'COMMON.BTN_YES'\n })\n .then(function(confirm) {\n if (!confirm) return;\n $scope.toggleFullscreen();\n });\n };\n\n $scope.toggleFullscreen = function() {\n $scope.fullscreen = !UIUtils.screen.fullscreen.isEnabled();\n UIUtils.screen.fullscreen.toggleAll();\n };\n\n // removeIf(device)\n // Ask switching fullscreen\n $scope.askFullscreen();\n // endRemoveIf(device)\n}\n\n\nfunction HomeController($scope, $state, $timeout, $ionicHistory, $translate, $http, UIUtils,\n csConfig, csCache, csPlatform, csCurrency, csSettings) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.locales = angular.copy(csSettings.locales);\n $scope.smallscreen = UIUtils.screen.isSmall();\n $scope.showInstallHelp = false;\n\n $scope.enter = function(e, state) {\n if (ionic.Platform.isIOS()) {\n if(window.StatusBar) {\n // needed to fix Xcode 9 / iOS 11 issue with blank space at bottom of webview\n // https://github.com/meteor/meteor/issues/9041\n StatusBar.overlaysWebView(false);\n StatusBar.overlaysWebView(true);\n }\n }\n\n if (state && state.stateParams && state.stateParams.error) { // Error query parameter\n $scope.error = state.stateParams.error;\n $scope.node = csCurrency.data.node;\n $scope.loading = false;\n $ionicHistory.nextViewOptions({\n disableAnimate: true,\n disableBack: true,\n historyRoot: true\n });\n $state.go('app.home', {error: undefined}, {\n reload: false,\n inherit: true,\n notify: false});\n }\n else {\n // Wait platform to be ready\n csPlatform.ready()\n .then(function() {\n $scope.loading = false;\n $scope.loadFeeds();\n })\n .catch(function(err) {\n $scope.node = csCurrency.data.node;\n $scope.loading = false;\n $scope.error = err;\n });\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.reload = function() {\n $scope.loading = true;\n delete $scope.error;\n\n $timeout($scope.enter, 200);\n };\n\n $scope.loadFeeds = function() {\n var feedUrl = csSettings.getFeedUrl();\n if (!feedUrl || typeof feedUrl !== 'string') return; // Skip\n\n var maxContentLength = (csConfig.feed && csConfig.feed.maxContentLength) || 650;\n\n var now = Date.now();\n console.debug(\"[home] Loading feeds from {0}...\".format(feedUrl));\n\n $http.get(feedUrl, {responseType: 'json', cache: csCache.get(null, csCache.constants.LONG)})\n .success(function(feed) {\n console.debug('[home] Feeds loaded in {0}ms'.format(Date.now()-now));\n if (!feed || !feed.items || !feed.items.length) return; // skip if empty\n\n feed.items = feed.items.reduce(function(res, item) {\n if (!item || (!item.title && !item.content_text && !item.content_html)) return res; // Skip\n\n // Convert UTC time\n if (item.date_published) {\n item.time = moment.utc(item.date_published).unix();\n }\n // Convert content to HTML\n if (item.content_html) {\n item.content = item.content_html;\n }\n else {\n item.content = (item.content_text||'').replace(/\\n/g, '<br/>');\n }\n\n // Trunc content, if need\n if (maxContentLength !== -1 && item.content && item.content.length > maxContentLength) {\n var endIndex = Math.max(item.content.lastIndexOf(\" \", maxContentLength), item.content.lastIndexOf(\"<\", maxContentLength));\n item.content = item.content.substr(0, endIndex) + ' (...)';\n item.truncated = true;\n }\n\n // If author is missing, copy the main author\n item.author = item.author || feed.author;\n\n return res.concat(item);\n }, []);\n\n $scope.feed = feed;\n })\n .error(function(data, status) {\n console.error('[home] Failed to load feeds.');\n $scope.feed = null;\n });\n };\n\n /**\n * Catch click for quick fix\n * @param event\n */\n $scope.doQuickFix = function(action) {\n if (action === 'settings') {\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n $state.go('app.settings');\n }\n };\n\n $scope.changeLanguage = function(langKey) {\n $translate.use(langKey);\n $scope.hideLocalesPopover();\n csSettings.data.locale = _.findWhere($scope.locales, {id: langKey});\n csSettings.store();\n $scope.loadFeeds();\n };\n\n /* -- show/hide locales popup -- */\n\n $scope.showLocalesPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'templates/common/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 // For DEV ONLY\n /*$timeout(function() {\n $scope.loginAndGo();\n }, 500);*/\n}\n","\nJoinController.$inject = ['$scope', '$timeout', '$controller', 'Modals', 'csWallet'];\nJoinChooseAccountTypeModalController.$inject = ['$scope', '$state', 'Modals', 'UIUtils', 'csConfig', 'csCurrency'];\nJoinModalController.$inject = ['$scope', '$state', '$interval', '$q', '$timeout', 'Device', 'UIUtils', 'CryptoUtils', 'csSettings', 'Modals', 'csWallet', 'BMA', 'parameters'];angular.module('cesium.join.controllers', ['cesium.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n .state('app.join', {\n url: \"/join\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/home/home.html\",\n controller: 'JoinCtrl'\n }\n }\n })\n ;\n }])\n\n .controller('JoinCtrl', JoinController)\n\n .controller('JoinChooseAccountTypeModalCtrl', JoinChooseAccountTypeModalController)\n\n .controller('JoinModalCtrl', JoinModalController)\n;\n\nfunction JoinController($scope, $timeout, $controller, Modals, csWallet) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('HomeCtrl', {$scope: $scope}));\n\n $scope.showJoinModal = function() {\n if ($scope.loading) return $timeout($scope.showJoinModal, 500); // recursive call\n\n if (!csWallet.isLogin() && !$scope.error) {\n return $timeout(Modals.showJoin, 300);\n }\n };\n $scope.$on('$ionicView.enter', $scope.showJoinModal);\n\n}\n\nfunction JoinChooseAccountTypeModalController($scope, $state, Modals, UIUtils, csConfig, csCurrency) {\n 'ngInject';\n\n $scope.formData = {};\n $scope.slides = {\n slider: null,\n options: {\n loop: false,\n effect: 'slide',\n speed: 500\n }\n };\n $scope.loading = true;\n\n $scope.load = function() {\n if ($scope.loading) {\n return csCurrency.get()\n .then(function (currency) {\n if (!currency) return;\n $scope.currency = currency;\n $scope.formData.currency = currency.name;\n $scope.loading = false;\n })\n .catch(UIUtils.onError('ERROR.GET_CURRENCY_FAILED'));\n }\n };\n $scope.$on('modal.shown', $scope.load);\n\n $scope.$on(\"$ionicSlides.sliderInitialized\", function(event, data){\n // Disable swipe\n data.slider.lockSwipes();\n });\n\n $scope.slidePrev = function() {\n $scope.slides.slider.unlockSwipes();\n $scope.slides.slider.slidePrev();\n $scope.slides.slider.lockSwipes();\n };\n\n $scope.slideNext = function() {\n $scope.slides.slider.unlockSwipes();\n $scope.slides.slider.slideNext();\n $scope.slides.slider.lockSwipes();\n };\n\n $scope.selectAccountTypeAndClose = function(type) {\n if (csConfig.demo) {\n return UIUtils.alert.demo();\n }\n $scope.formData.accountType = type;\n $scope.closeModal($scope.formData);\n };\n\n /**\n * Catch click for quick fix\n * @param fix\n */\n $scope.doQuickFix = function(event) {\n if (event == 'settings') {\n $scope.closeModal();\n $state.go('app.settings');\n }\n };\n\n $scope.showHelpModal = function(helpAnchor) {\n Modals.showHelp({anchor: helpAnchor});\n };\n\n // TODO DEV only\n //$timeout(function() {\n //$scope.selectCurrency('g1');\n //$scope.selectAccountTypeAndClose('member');\n //}, 400);\n}\n\n\nfunction JoinModalController($scope, $state, $interval, $q, $timeout, Device, UIUtils, CryptoUtils, csSettings, Modals, csWallet, BMA, parameters) {\n 'ngInject';\n\n $scope.formData = {\n pseudo: parameters.uid || '',\n pubkey: parameters.pubkey || undefined\n };\n $scope.slides = {\n slider: null,\n options: {\n loop: false,\n effect: 'slide',\n speed: 500,\n pager: false,\n showPager: false\n }\n };\n $scope.slideBehavior = {};\n $scope.loading = true;\n\n $scope.isLicenseRead = Device.isIOS(); // always enable the button, on IOS fix #554\n $scope.showUsername = false;\n $scope.showPassword = false;\n $scope.formData.computing=false;\n $scope.smallscreen = UIUtils.screen.isSmall();\n $scope.userIdPattern = BMA.constants.regexp.USER_ID;\n $scope.accountAvailable = !!parameters.pubkey;\n\n // Read input parameters\n $scope.currency = parameters.currency;\n $scope.accountType = parameters.accountType || 'member';\n\n var wallet;\n\n $scope.load = function() {\n if ($scope.loading) {\n\n // Get the wallet\n wallet = (parameters.walletId && csWallet.children.get(parameters.walletId)) ||\n (parameters.pubkey && csWallet.children.getByPubkey(parameters.pubkey)) ||\n ((!parameters.pubkey || csWallet.isUserPubkey(parameters.pubkey)) && csWallet);\n if (!wallet) throw new Error(\"Cannot found the corresponding wallet, from parameters.pubkey or parameters.walletId\");\n\n console.debug(\"[join] Starting join modal on wallet {0}\".format(wallet.id));\n\n if ($scope.accountType === 'member') {\n $scope.licenseFileUrl = csSettings.getLicenseUrl();\n if ($scope.licenseFileUrl) {\n // Use HTML in iframe, when original file is markdown (fix #538)\n if ( $scope.licenseFileUrl.substring($scope.licenseFileUrl.length - 3) != '.txt') {\n $scope.licenseFileUrl = $scope.licenseFileUrl + '.html';\n }\n if (!$scope.isLicenseRead) {\n //$scope.startListenLicenseBottom();\n\n // Make sure to enable the next button when error occured - Fix issue #592\n $timeout(function() {\n if (!$scope.isLicenseRead) {\n $scope.isLicenseRead = true;\n }\n }, 5000);\n }\n }\n }\n\n $scope.slideBehavior = $scope.computeSlideBehavior();\n $scope.loading = false;\n }\n };\n $scope.$on('modal.shown', $scope.load);\n\n $scope.$on(\"$ionicSlides.sliderInitialized\", function(event, data){\n // Disable swipe\n data.slider.lockSwipes();\n });\n\n $scope.slidePrev = function() {\n $scope.slides.slider.unlockSwipes();\n $scope.slides.slider.slidePrev();\n $scope.slides.slider.lockSwipes();\n };\n\n $scope.slideNext = function() {\n $scope.slides.slider.unlockSwipes();\n $scope.slides.slider.slideNext();\n $scope.slides.slider.lockSwipes();\n };\n\n $scope.showAccountPubkey = function() {\n if (parameters.pubkey && parameters.pseudo === $scope.formData.pseudo) {\n $scope.formData.pubkey = parameters.pubkey;\n $scope.formData.computing = false;\n return;\n }\n\n $scope.formData.computing=true;\n\n CryptoUtils.scryptKeypair($scope.formData.username, $scope.formData.password)\n .then(function(keypair) {\n $scope.formData.pubkey = CryptoUtils.util.encode_base58(keypair.signPk);\n return $scope.checkAccountAvailable();\n })\n .then(function() {\n return $timeout(function(){\n $scope.formData.computing=false;\n }, 400);\n })\n .catch(function(err) {\n $scope.formData.pubkey = undefined;\n $scope.formData.computing=false;\n UIUtils.onError('ERROR.CRYPTO_UNKNOWN_ERROR')(err);\n });\n };\n\n $scope.formDataChanged = function() {\n $scope.formData.computing=false;\n $scope.formData.pubkey=null;\n };\n\n $scope.getCurrentFormName = function() {\n var index = $scope.slides.slider.activeIndex;\n if($scope.accountType === 'member') {\n index += ($scope.licenseFileUrl ? 0 : 1); // skip index 0, when no license file\n index += (parameters.pubkey && index >= 2 ? 2 : 0); // skip salt+pass, if already a pubkey\n if (index === 0) return \"licenseForm\";\n if (index === 1) return \"pseudoForm\";\n if (index === 2) return \"saltForm\";\n if (index === 3) return \"passwordForm\";\n if (index === 4) return \"confirmForm\";\n }\n else {\n if (index === 0) return \"saltForm\";\n if (index === 1) return \"passwordForm\";\n if (index === 2) return \"confirmForm\";\n }\n };\n\n $scope.computeSlideBehavior = function() {\n var formName = $scope.getCurrentFormName();\n\n var behavior;\n if (formName === \"licenseForm\") {\n behavior = {\n hasPreviousButton: false,\n hasNextButton: false,\n hasAcceptButton: true\n };\n }\n else if (formName === \"pseudoForm\") {\n behavior = {\n helpAnchor: 'join-pseudo',\n hasPreviousButton: $scope.licenseFileUrl && true,\n hasNextButton: true,\n focus: 'pseudo'\n };\n }\n else if (formName === \"saltForm\") {\n behavior = {\n helpAnchor: 'join-salt',\n hasPreviousButton: $scope.accountType === 'member',\n hasNextButton: true,\n focus: 'salt'\n };\n }\n else if (formName === \"passwordForm\") {\n behavior = {\n helpAnchor: 'join-password',\n hasPreviousButton: true,\n hasNextButton: true,\n focus: 'password'\n };\n }\n else if (formName === \"confirmForm\") {\n behavior = {\n hasPreviousButton: true,\n hasNextButton: false,\n hasSendButton: true,\n helpAnchor: 'join-pubkey'\n };\n }\n else {\n behavior = {\n hasPreviousButton: false,\n hasNextButton: true\n };\n }\n\n // removeIf(device)\n // Focus input text (only if NOT device, to avoid keyboard opening)\n // FIXME: this cause issue #464\n /*if (behavior.focus) {\n $timeout(function(){\n $focus(behavior.focus);\n }, 100);\n }*/\n // endRemoveIf(device)\n\n return behavior;\n };\n\n\n $scope.doNext = function() {\n var formName = $scope.getCurrentFormName();\n if (formName && $scope[formName]){\n $scope[formName].$submitted=true;\n if(!$scope[formName].$valid) {\n return;\n }\n if (formName === \"pseudoForm\" && $scope.uiAlreadyUsed) {\n return;\n }\n if (formName === \"passwordForm\") {\n $scope.showAccountPubkey();\n }\n }\n\n $scope.slideNext();\n\n $scope.slideBehavior = $scope.computeSlideBehavior();\n };\n\n $scope.doPrev = function() {\n $scope.slidePrev();\n $scope.slideBehavior = $scope.computeSlideBehavior();\n };\n\n $scope.doNewAccount = function(confirm) {\n\n if (!confirm) {\n\n var messageKey = ($scope.accountType === 'member') ? 'ACCOUNT.NEW.CONFIRMATION_MEMBER_ACCOUNT' :\n 'ACCOUNT.NEW.CONFIRMATION_WALLET_ACCOUNT';\n\n return UIUtils.alert.confirm(messageKey, undefined,\n {\n cssClass: 'warning',\n okText: $scope.accountType == 'member' ? 'COMMON.BTN_SEND' : 'COMMON.BTN_CONTINUE',\n okType: 'button-assertive'\n })\n .then(function(confirm) {\n if (confirm) {\n $scope.doNewAccount(true);\n }\n });\n }\n\n var onErrorLogout = function(message) {\n return function(err) {\n if (parameter.uid) {\n wallet.unauth()\n .then(function(){\n UIUtils.onError(message)(err);\n });\n }\n else {\n wallet.logout()\n .then(function(){\n UIUtils.onError(message)(err);\n });\n }\n throw new Error('CANCELLED');\n };\n };\n\n UIUtils.loading.show();\n\n return wallet.login({\n auth: true,\n isNew: true,\n method: 'SCRYPT_DEFAULT',\n expectedPubkey: $scope.formData.pubkey,\n showMethods: false\n })\n .then(function() {\n if ($scope.accountType === \"member\") {\n $scope.closeModal();\n csSettings.data.wallet = csSettings.data.wallet || {};\n csSettings.data.wallet.alertIfUnusedWallet = false; // do not alert if empty\n\n var needSelf = angular.isUndefined(parameters.uid) || angular.isUndefined(parameters.blockUid) ||\n (parameters.uid.toUpperCase() !== $scope.formData.pseudo.toUpperCase());\n if (!needSelf) {\n wallet.setSelf(parameters.uid, parameters.blockUid);\n }\n\n // Self promise (if need)\n var selfPromise = needSelf ?\n wallet.self($scope.formData.pseudo, false/*do NOT load membership here*/)\n .catch(onErrorLogout('ERROR.SEND_IDENTITY_FAILED')) :\n $q.when();\n\n return selfPromise\n .then(function() {\n // Send membership IN\n return wallet.membership.inside()\n .catch(function(err) {\n if (err && err.ucode != BMA.errorCodes.MEMBERSHIP_ALREADY_SEND) return;\n onErrorLogout('ERROR.SEND_MEMBERSHIP_IN_FAILED')(err);\n });\n })\n .then(function() {\n\n $scope.closeModal();\n\n // Redirect to wallet\n if (wallet.isDefault()) {\n return $state.go('app.view_wallet');\n } else {\n return $state.go('app.view_wallet_by_id', {id: wallet.id});\n }\n })\n .then(function() {\n // Wait 2s (for wallet load)\n // then ask to download revocation file\n return $timeout(function() {\n // Hide the loading indicator, if wallet already loaded\n if (wallet.isDataLoaded({requirements: true})) {\n UIUtils.loading.hide();\n }\n return $scope.downloadRevocationRegistration();\n },\n 2000);\n });\n }\n else{\n $scope.closeModal();\n\n // Redirect to wallet\n if (wallet.isDefault()) {\n $state.go('app.view_wallet');\n }\n else {\n $state.go('app.view_wallet_by_id', {id: wallet.id});\n }\n\n }\n })\n .catch(function(err) {\n UIUtils.loading.hide();\n if (err === 'CANCELLED') return;\n if (err && err.ucode != BMA.errorCodes.MEMBERSHIP_ALREADY_SEND) {\n console.error(\"[wallet] Node: already membership\", err);\n return; // OK\n }\n else {\n UIUtils.alert.error('ERROR.UNKNOWN_ERROR');\n }\n });\n };\n\n $scope.downloadRevocationRegistration = function() {\n return UIUtils.alert.confirm('DOWNLOAD.POPUP_REVOKE_MESSAGE', 'DOWNLOAD.POPUP_TITLE', {\n cssClass: 'warning',\n okText: 'COMMON.BTN_DOWNLOAD',\n okType: 'button-assertive',\n cancelText: 'COMMON.BTN_LATER'\n })\n .then(function(confirm) {\n if (!confirm) return;\n return wallet.downloadRevocation();\n });\n };\n\n $scope.showHelpModal = function(helpAnchor) {\n Modals.showHelp({anchor: helpAnchor});\n };\n\n $scope.startListenLicenseBottom = function(){\n var iframeEl = angular.element(document.querySelector('.modal #iframe-license'));\n iframeEl = iframeEl && iframeEl.length ? iframeEl[0] : undefined;\n if (!iframeEl || !iframeEl.contentWindow) {\n console.debug('[join] Waiting license frame to be load...');\n return $timeout($scope.startListenLicenseBottom, 1000);\n }\n\n $scope.licenseBottomInterval = $interval(function(){\n var yPos = iframeEl.contentWindow.document.body.scrollTop;\n var scrollHeight = iframeEl.contentWindow.document.body.scrollHeight;\n var clientHeight = iframeEl.contentWindow.document.body.clientHeight;\n var isBottom = (scrollHeight - clientHeight === yPos);\n if(isBottom){\n $scope.isLicenseRead = true;\n $scope.stopListenLicenseBottom();\n }\n }, 1000);\n };\n\n $scope.stopListenLicenseBottom = function() {\n if ($scope.licenseBottomInterval) {\n $interval.cancel($scope.licenseBottomInterval);\n delete $scope.licenseBottomInterval;\n }\n };\n $scope.$on('modal.hidden', $scope.stopListenLicenseBottom);\n\n $scope.checkUid = function(){\n if (!$scope.formData.pseudo || $scope.formData.pseudo.length < 3) {\n $scope.formData.computing=false;\n delete $scope.uiAlreadyUsed;\n return;\n }\n\n var uid = $scope.formData.pseudo.toUpperCase();\n $scope.formData.computing=true;\n\n // Same has given uid + self block: skip control\n if (parameters.uid && uid === parameters.uid.toUpperCase()) {\n $scope.formData.computing=false;\n $scope.uiAlreadyUsed = false;\n return;\n }\n else {\n // search on uid\n BMA.wot.lookup({ search: uid })\n .then(function(res) {\n $scope.uiAlreadyUsed = (res.results || []).some(function(pub){\n return (pub.uids || []).some(function(idty) {\n return (idty.uid.toUpperCase() === uid); // same Uid\n });\n });\n $scope.formData.computing=false;\n })\n .catch(function(err){\n console.error(err);\n $scope.formData.computing=false;\n $scope.uiAlreadyUsed = false;\n });\n }\n };\n $scope.$watch('formData.pseudo', $scope.checkUid, true);\n\n $scope.checkAccountAvailable = function() {\n if (parameters.pubkey) {\n $scope.accountAvailable = true;\n return;\n }\n\n delete $scope.accountAvailable;\n // Search for tx source, from pubkey\n return BMA.tx.sources({ pubkey: $scope.formData.pubkey })\n .then(function(res) {\n $scope.accountAvailable = !res || !res.sources.length;\n })\n .catch(function(err) {\n console.error(err);\n $scope.accountAvailable = false;\n });\n };\n\n $scope.identifierRecovery = function() {\n // Go back\n $scope.slides.slider.unlockSwipes();\n for (var i = 0; i < 2; i++) {\n $scope.slides.slider.slidePrev();\n }\n $scope.slides.slider.lockSwipes();\n // Recompute behavior\n $scope.slideBehavior = $scope.computeSlideBehavior();\n };\n\n // TODO: remove auto add account when done\n /*$timeout(function() {\n //$scope.selectCurrency('g1');\n //$scope.selectAccountType('member');\n $scope.formData.username=\"azertypoi\";\n $scope.formData.confirmUsername=$scope.formData.username;\n $scope.formData.password=\"azertypoi\";\n $scope.formData.confirmPassword=$scope.formData.password;\n $scope.formData.pseudo=\"azertypoi\";\n //$scope.doNext();\n //$scope.doNext();\n }, 400);*/\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","\nWalletController.$inject = ['$scope', '$rootScope', '$q', '$ionicPopup', '$timeout', '$state', '$translate', '$ionicPopover', '$location', 'UIUtils', 'ModalUtils', 'Modals', 'csPopovers', 'BMA', 'csConfig', 'csSettings', 'csWallet', 'csHelp'];\nWalletTxController.$inject = ['$scope', '$ionicPopover', '$state', '$timeout', '$location', 'UIUtils', 'Modals', 'csPopovers', 'BMA', 'csHttp', 'csSettings', 'csCurrency', 'csWallet', 'csTx'];\nWalletTxErrorController.$inject = ['$scope', 'UIUtils', 'csSettings', 'csWallet'];\nWalletSecurityModalController.$inject = ['$scope', 'UIUtils', 'csConfig', 'csWallet', '$translate', 'parameters'];angular.module('cesium.wallet.controllers', ['cesium.services', 'cesium.currency.controllers'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n $stateProvider\n\n\n .state('app.view_wallet', {\n url: \"/account?refresh\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wallet/view_wallet.html\",\n controller: 'WalletCtrl'\n }\n },\n data: {\n login: true,\n silentLocationChange: true\n }\n })\n\n .state('app.view_wallet_tx', {\n url: \"/history/account?refresh\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wallet/view_wallet_tx.html\",\n controller: 'WalletTxCtrl'\n }\n },\n data: {\n login: true,\n silentLocationChange: true\n }\n })\n\n .state('app.view_wallet_tx_errors', {\n url: \"/history/account/errors\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wallet/view_wallet_tx_error.html\",\n controller: 'WalletTxErrorCtrl'\n }\n },\n data: {\n login: true\n }\n })\n ;\n }])\n\n .controller('WalletCtrl', WalletController)\n\n .controller('WalletTxCtrl', WalletTxController)\n\n .controller('WalletTxErrorCtrl', WalletTxErrorController)\n\n .controller('WalletSecurityModalCtrl', WalletSecurityModalController)\n;\n\nfunction WalletController($scope, $rootScope, $q, $ionicPopup, $timeout, $state, $translate, $ionicPopover, $location,\n UIUtils, ModalUtils, Modals, csPopovers, BMA, csConfig, csSettings, csWallet, csHelp) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.settings = csSettings.data;\n $scope.qrcodeId = 'qrcode-wallet-' + $scope.$id;\n $scope.toggleQRCode = false;\n $scope.likeData = {\n likes: {},\n abuses: {}\n };\n\n var wallet;\n\n $scope.enter = function(e, state) {\n $scope.loading = $scope.loading || (state.stateParams && state.stateParams.refresh);\n $scope.enableSelectWallet = csWallet.children.count() > 0;\n if ($scope.loading) { // load once\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n $scope.isDefaultWallet = wallet.isDefault();\n $scope.walletId = wallet.id;\n\n $scope.cleanLocationHref(state);\n\n return $scope.load();\n }\n else {\n // update view (to refresh avatar + plugin data, such as profile, subscriptions...)\n UIUtils.loading.hide(10);\n $timeout($scope.updateView, 300);\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.load = function() {\n if (!wallet) return;\n\n return wallet.login()\n .then(function(walletData) {\n $scope.formData = walletData;\n $scope.loading=false; // very important, to avoid TX to be display before wallet.currentUd is loaded\n $scope.updateView();\n $scope.addListeners();\n\n $scope.showQRCode();\n if (wallet.isDefault()) $scope.showHelpTip();\n\n UIUtils.loading.hide(10); // loading could have be open (e.g. new account)\n })\n .catch(function(err){\n if (err === 'CANCELLED') {\n $scope.showHome();\n return;\n }\n UIUtils.onError('ERROR.LOAD_WALLET_DATA_ERROR')(err);\n });\n };\n\n $scope.updateView = function() {\n $scope.motion.show({selector: '#wallet .item'});\n $scope.$broadcast('$$rebind::rebind'); // force rebind\n };\n\n\n $scope.setRegisterForm = function(registerForm) {\n $scope.registerForm = registerForm;\n };\n\n // Clean controller data when logout\n $scope.onWalletLogout = function() {\n // clean QRcode\n $scope.hideQRCode();\n $scope.removeListeners();\n delete $scope.formData;\n wallet = null;\n $scope.loading = true;\n };\n\n $scope.addListeners = function() {\n $scope.listeners = [\n // Reset the view on logout\n wallet.api.data.on.logout($scope, $scope.onWalletLogout),\n\n // Listen new events (can appears from security wizard also)\n $scope.$watchCollection('formData.events', function(newEvents, oldEvents) {\n if (!oldEvents || $scope.loading || angular.equals(newEvents, oldEvents)) return;\n $scope.updateView();\n })\n ];\n };\n\n $scope.removeListeners = function() {\n _.forEach($scope.listeners, function(remove){\n remove();\n });\n $scope.listeners = [];\n };\n\n // Ask uid\n $scope.showUidPopup = function() {\n return $q(function(resolve, reject) {\n $translate(['ACCOUNT.NEW.TITLE', 'ACCOUNT.POPUP_REGISTER.TITLE', 'ACCOUNT.POPUP_REGISTER.HELP', 'COMMON.BTN_OK', 'COMMON.BTN_CANCEL'])\n .then(function (translations) {\n $scope.formData.newUid = (!!$scope.formData.uid ? ''+$scope.formData.uid : '');\n\n // Choose UID popup\n $ionicPopup.show({\n templateUrl: 'templates/wallet/popup_register.html',\n title: translations['ACCOUNT.POPUP_REGISTER.TITLE'],\n subTitle: translations['ACCOUNT.POPUP_REGISTER.HELP'],\n scope: $scope,\n buttons: [\n { text: translations['COMMON.BTN_CANCEL'] },\n {\n text: translations['COMMON.BTN_OK'],\n type: 'button-positive',\n onTap: function(e) {\n $scope.registerForm.$submitted=true;\n if(!$scope.registerForm.$valid || !$scope.formData.newUid) {\n //don't allow the user to close unless he enters a uid\n e.preventDefault();\n } else {\n return $scope.formData.newUid;\n }\n }\n }\n ]\n })\n .then(function(uid) {\n if (!uid) { // user cancel\n delete $scope.formData.uid;\n UIUtils.loading.hide();\n reject('CANCELLED');\n return;\n }\n resolve(uid);\n });\n });\n });\n };\n\n // Send self identity\n $scope.self = function() {\n $scope.hideActionsPopover();\n\n return $scope.showUidPopup()\n .then(function(uid) {\n if (!uid) return;\n\n UIUtils.loading.show();\n\n return wallet.self(uid)\n .then(function() {\n $scope.updateView();\n UIUtils.loading.hide();\n })\n .catch(function(err){\n UIUtils.onError('ERROR.SEND_IDENTITY_FAILED')(err)\n .then(function() {\n $scope.self(); // loop\n });\n });\n });\n };\n\n $scope.doMembershipIn = function(retryCount) {\n return wallet.membership.inside()\n .then(function() {\n $scope.updateView();\n UIUtils.loading.hide();\n })\n .catch(function(err) {\n if (err === 'CANCELLED') throw err;\n if (err && err.ucode != BMA.errorCodes.MEMBERSHIP_ALREADY_SEND) {\n console.error(\"[wallet] Node: already membership\", err);\n UIUtils.loading.hide();\n return; // OK\n }\n if (!retryCount || retryCount <= 2) {\n return $timeout(function() {\n return $scope.doMembershipIn((retryCount||0) + 1);\n }, 1000);\n }\n throw err;\n });\n };\n\n\n // Send membership IN\n $scope.membershipIn = function(keepSelf) {\n $scope.hideActionsPopover();\n\n if (wallet.isMember()) {\n return UIUtils.alert.info(\"INFO.NOT_NEED_MEMBERSHIP\");\n }\n\n var uid = angular.isDefined($scope.formData.blockUid) && $scope.formData.uid || undefined;\n\n // Approve the license\n return Modals.showJoinMember({\n uid : uid,\n blockUid: uid && $scope.formData.blockUid,\n pubkey: $scope.formData.pubkey\n })\n .catch(function(err) {\n if (err === 'CANCELLED') return;\n if (!wallet.data.uid) {\n UIUtils.onError('ERROR.SEND_IDENTITY_FAILED')(err);\n }\n else {\n UIUtils.onError('ERROR.SEND_MEMBERSHIP_IN_FAILED')(err);\n }\n });\n };\n\n // Send membership OUT\n $scope.membershipOut = function(confirm, confirmAgain) {\n $scope.hideActionsPopover();\n\n // Ask user confirmation\n if (!confirm) {\n return UIUtils.alert.confirm('CONFIRM.MEMBERSHIP_OUT', 'CONFIRM.POPUP_WARNING_TITLE', {\n cssClass: 'warning',\n okText: 'COMMON.BTN_YES',\n okType: 'button-assertive'\n })\n .then(function(confirm) {\n if (confirm) $scope.membershipOut(true); // loop with confirmation\n });\n }\n\n if (!confirmAgain) {\n return UIUtils.alert.confirm(\"CONFIRM.MEMBERSHIP_OUT_2\", 'CONFIRM.POPUP_TITLE', {\n cssClass: 'warning',\n okText: 'COMMON.BTN_YES',\n okType: 'button-assertive'\n })\n .then(function (confirm) {\n if (confirm) $scope.membershipOut(true, true); // loop with all confirmations\n });\n }\n\n UIUtils.loading.show();\n return wallet.membership.out()\n .then(function() {\n UIUtils.loading.hide();\n UIUtils.toast.show('INFO.MEMBERSHIP_OUT_SENT');\n })\n .catch(UIUtils.onError('ERROR.SEND_MEMBERSHIP_OUT_FAILED'));\n };\n\n // Updating wallet data\n $scope.doUpdate = function(silent) {\n console.debug('[wallet] Refreshing data...');\n return (silent ?\n wallet.refreshData() :\n UIUtils.loading.show()\n .then(wallet.refreshData)\n .then(UIUtils.loading.hide)\n )\n .then($scope.updateView)\n .catch(UIUtils.onError('ERROR.REFRESH_WALLET_DATA'));\n };\n\n /**\n * Renew membership\n */\n $scope.renewMembership = function(confirm) {\n\n // Make sure user is (or was) a member\n if (!wallet.isMember() && !$scope.formData.requirements.wasMember) {\n return UIUtils.alert.error(\"ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\");\n }\n\n // If renew is not need, ask confirmation\n if (!confirm && !$scope.formData.requirements.needRenew) {\n return $translate(\"CONFIRM.NOT_NEED_RENEW_MEMBERSHIP\", {membershipExpiresIn: $scope.formData.requirements.membershipExpiresIn})\n .then(function(message) {\n return UIUtils.alert.confirm(message);\n })\n .then(function(confirm) {\n if (confirm) {\n // loop with confirm\n return $scope.renewMembership(true);\n }\n });\n }\n\n return wallet.auth({minData: true}) // Ask user to auth, before confirmation - fix #508\n .then(function() {\n UIUtils.loading.hide();\n return UIUtils.alert.confirm(\"CONFIRM.RENEW_MEMBERSHIP\");\n })\n .then(function(confirm) {\n if (confirm) {\n UIUtils.loading.show();\n return $scope.doMembershipIn();\n }\n })\n .catch(function(err){\n if (err === 'CANCELLED') return;\n UIUtils.loading.hide();\n UIUtils.alert.error(err);\n });\n };\n\n\n /**\n * Fix identity (e.g. when identity expired)\n */\n $scope.fixIdentity = function() {\n if (!$scope.formData.uid) return;\n\n return $q.all([\n wallet.auth(),\n $translate('CONFIRM.FIX_IDENTITY', {uid: $scope.formData.uid})\n ])\n .then(function(res) {\n return UIUtils.alert.confirm(res[1]);\n })\n .then(function(confirm) {\n if (!confirm) return;\n UIUtils.loading.show();\n // Reset self data\n $scope.formData.blockUid = null;\n // Reset membership data\n $scope.formData.sigDate = null;\n return wallet.self($scope.formData.uid);\n })\n .then($scope.doMembershipIn)\n .catch(function(err){\n if (err === 'CANCELLED') return;\n UIUtils.loading.hide();\n UIUtils.alert.error(err);\n });\n };\n\n /**\n * Fix membership, when existing MS reference an invalid block\n */\n $scope.fixMembership = function() {\n if (!$scope.formData.uid) return;\n\n if (wallet.isMember()) {\n return UIUtils.alert.info(\"INFO.NOT_NEED_MEMBERSHIP\");\n }\n\n $scope.hideActionsPopover();\n\n return wallet.auth({silent: true})\n .then(function() {\n UIUtils.alert.confirm(\"CONFIRM.FIX_MEMBERSHIP\");\n })\n .then(function(confirm) {\n if (!confirm) return;\n UIUtils.loading.show();\n // Reset self data\n $scope.formData.blockUid = null;\n // Reset membership data\n $scope.formData.sigDate = null;\n return wallet.self($scope.formData.uid, false/*do NOT load membership here*/);\n })\n .then($scope.doMembershipIn)\n .catch(function(err){\n if (err === 'CANCELLED') return;\n UIUtils.loading.hide();\n UIUtils.alert.error(err);\n });\n };\n\n /**\n * Catch click for quick fix\n * @param fix\n */\n $scope.doQuickFix = function(event) {\n if (event === 'renew') {\n $scope.renewMembership();\n }\n else if (event === 'membership') {\n $scope.membershipIn(true/*keep self*/);\n }\n else if (event === 'fixMembership') {\n $scope.fixMembership(false);\n }\n else if (event === 'fixIdentity') {\n $scope.fixIdentity();\n }\n };\n\n /* -- UI actions -- */\n\n var inheritedLogout = $scope.logout;\n $scope.logout = function(options) {\n if ($scope.isDefaultWallet) {\n return inheritedLogout(options);\n }\n };\n\n $scope.startWalletTour = function() {\n $scope.hideActionsPopover();\n return csHelp.wallet.tour();\n };\n\n $scope.showHelpTip = function() {\n return csHelp.wallet.helptip();\n };\n\n $scope.showQRCode = function(timeout) {\n if (!wallet || !$scope.qrcodeId) return; // Skip\n\n // Get the DIV element\n var element = angular.element(document.querySelector('#' + $scope.qrcodeId + ' .content'));\n if (!element) {\n console.error(\"[wallet-controller] Cannot found div #{0} for the QRCode. Skipping.\".format($scope.qrcodeId));\n return;\n }\n\n wallet.loadQrCode()\n .then(function(svg) {\n element.html(svg);\n UIUtils.motion.toggleOn({selector: '#'+$scope.qrcodeId}, timeout || 1100);\n });\n };\n\n $scope.hideQRCode = function() {\n if (!$scope.qrcodeId) return;\n var element = angular.element(document.querySelector('#' + $scope.qrcodeId));\n if (element) {\n UIUtils.motion.toggleOff({selector: '#'+$scope.qrcodeId});\n }\n };\n\n $scope.showCertifications = function() {\n // Warn: do not use a simple link here (a ng-click is mandatory for help tour)\n if ($scope.isDefaultWallet) {\n $state.go(UIUtils.screen.isSmall() ? 'app.wallet_cert' : 'app.wallet_cert_lg', {\n type: 'received'\n });\n }\n else {\n $state.go(UIUtils.screen.isSmall() ? 'app.wallet_cert_by_id' : 'app.wallet_cert_lg_by_id', {\n id: $scope.walletId,\n type: 'received'\n });\n }\n };\n\n $scope.showGivenCertifications = function() {\n // Warn: do not use a simple link here (a ng-click is mandatory for help tour)\n if ($scope.isDefaultWallet) {\n $state.go(UIUtils.screen.isSmall() ? 'app.wallet_cert' : 'app.wallet_cert_lg', {\n type: 'given'\n });\n }\n else {\n $state.go(UIUtils.screen.isSmall() ? 'app.wallet_cert_by_id' : 'app.wallet_cert_lg_by_id', {\n id: $scope.walletId,\n type: 'given'\n });\n }\n };\n\n $scope.showTxHistory = function() {\n $state.go($scope.isDefaultWallet ? 'app.view_wallet_tx' : 'app.view_wallet_tx_by_id', {\n id: $scope.walletId\n });\n };\n\n $scope.showLicenseModal = function() {\n return ModalUtils.show('templates/currency/modal_license.html','CurrencyLicenseModalCtrl');\n };\n\n /* -- modals -- */\n\n // Transfer\n $scope.showTransferModal = function() {\n var hasCredit = (!!$scope.formData.balance && $scope.formData.balance > 0);\n if (!hasCredit && !csWallet.children.count()) {\n UIUtils.alert.info('INFO.NOT_ENOUGH_CREDIT');\n return;\n }\n return Modals.showTransfer({wallet: wallet.id})\n .then(function(done){\n if (done) {\n UIUtils.toast.show('INFO.TRANSFER_SENT');\n $scope.$broadcast('$$rebind::balance'); // force rebind balance\n $scope.motion.show({selector: '.item-pending'});\n }\n });\n };\n\n $scope.showSecurityModal = function(){\n $scope.hideActionsPopover();\n return Modals.showAccountSecurity({wallet: wallet})\n .then(function(res) {\n if (!res) return;\n\n if (res === 'self') {\n return $scope.self();\n }\n else if (res === 'membershipIn') {\n return $scope.membershipIn();\n }\n });\n };\n\n $scope.showSelectIdentitiesModal = function(){\n $scope.hideActionsPopover();\n\n return Modals.showSelectPubkeyIdentity({\n identities: [$scope.formData.requirements].concat($scope.formData.requirements.alternatives)\n })\n .then(function(idty) {\n if (!idty || !idty.uid) return;\n\n $scope.loading = true;\n\n // Set self (= uid + blockUid)\n return wallet.setSelf(idty.uid, idty.blockUid)\n .then(function() {\n $scope.loading=false;\n $scope.updateView();\n UIUtils.loading.hide();\n });\n });\n };\n\n $scope.showSelectWalletModal = function() {\n if (!csWallet.children.count()) return;\n\n return Modals.showSelectWallet({\n parameters: {\n showDefault: true,\n showBalance: false,\n excludedWalletId: $scope.walletId\n }\n })\n .then(function(newWallet) {\n if (!newWallet || wallet && newWallet.id === wallet.id) return;\n $scope.removeListeners();\n $scope.loading = true;\n wallet = newWallet;\n console.debug(\"[transfer] Using wallet {\" + wallet.id + \"}\");\n $scope.formData = {};\n return $scope.load();\n });\n };\n\n /* -- popovers -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'templates/wallet/popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n $scope.showSharePopover = function(event) {\n $scope.hideActionsPopover();\n\n var title = $scope.formData.name || $scope.formData.uid || $scope.formData.pubkey;\n // Use shareBasePath (fix #530) or rootPath (fix #390)\n var url = (csConfig.shareBaseUrl || $rootScope.rootPath) + $state.href('app.wot_identity', {pubkey: $scope.formData.pubkey, uid: $scope.formData.uid});\n\n // Override default position, is small screen - fix #545\n if (UIUtils.screen.isSmall()) {\n event = angular.element(document.querySelector('#wallet-share-anchor')) || event;\n }\n\n UIUtils.popover.share(event, {\n bindings: {\n url: url,\n titleKey: 'WOT.VIEW.POPOVER_SHARE_TITLE',\n titleValues: {title: title},\n postMessage: title\n }\n });\n };\n\n $scope.showSelectWalletPopover = function(event) {\n\n return csPopovers.showSelectWallet(event, {\n parameters: {\n excludedWalletId: $scope.walletId\n }})\n .then(function(newWallet) {\n if (!newWallet || newWallet.id === $scope.walletId) return; // nothing changed\n if (newWallet.isDefault()) {\n return $state.go('app.view_wallet');\n }\n return $state.go('app.view_wallet_by_id', {id: newWallet.id});\n });\n };\n\n // remove '?refresh' from the location URI\n $scope.cleanLocationHref = function(state) {\n if (state && state.stateParams && state.stateParams.refresh) {\n $timeout(function() {\n var stateParams = angular.copy(state.stateParams);\n delete stateParams.refresh;\n delete stateParams.id;\n $location.search(stateParams).replace();\n }, 300);\n }\n };\n}\n\n\nfunction WalletTxController($scope, $ionicPopover, $state, $timeout, $location,\n UIUtils, Modals, csPopovers, BMA, csHttp, csSettings, csCurrency, csWallet, csTx) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.settings = csSettings.data;\n $scope.listeners = [];\n $scope.qrcodeId = 'qrcode-wallet-tx-' + $scope.$id;\n\n var wallet;\n\n $scope.enter = function(e, state) {\n $scope.loading = $scope.loading || (state.stateParams && state.stateParams.refresh);\n $scope.enableSelectWallet = csWallet.children.count() > 0;\n if ($scope.loading) {\n\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n $scope.walletId = wallet.id;\n\n $scope.cleanLocationHref(state);\n\n return $scope.load();\n }\n else {\n $scope.addListeners();\n // Make sure to display new pending (e.g. sending using another screen button)\n $timeout($scope.updateView, 300);\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.leave = function() {\n $scope.removeListeners();\n };\n $scope.$on('$ionicView.leave', $scope.leave);\n\n $scope.load = function() {\n if (!wallet) return $q.reject('Missing wallet');\n\n var hasMinData = wallet.isDataLoaded({minData: true});\n var options = {\n requirements: !hasMinData, // load requirements (=minData) once\n minData: !hasMinData,\n sources: true,\n tx: {\n enable: true\n }\n };\n\n return wallet.login(options)\n .then(function(walletData) {\n $scope.formData = walletData;\n $scope.loading = false; // very important, to avoid TX to be display before wallet.currentUd is loaded\n $scope.updateView();\n $scope.addListeners();\n\n $scope.showFab('fab-transfer');\n $scope.showQRCode();\n if (wallet.isDefault()) $scope.showHelpTip();\n\n return UIUtils.loading.hide(10); // loading could have be open (e.g. during login phase)\n })\n .catch(function(err){\n if (err === 'CANCELLED') {\n $scope.showHome();\n return;\n }\n console.error(err);\n UIUtils.onError('ERROR.LOAD_WALLET_DATA_ERROR')(err);\n });\n };\n\n // remove '?refresh' from the location URI\n $scope.cleanLocationHref = function(state) {\n if (state && state.stateParams && state.stateParams.refresh) {\n $timeout(function() {\n var stateParams = angular.copy(state.stateParams);\n delete stateParams.refresh;\n delete stateParams.id;\n $location.search(stateParams).replace();\n }, 300);\n }\n };\n\n // Update view\n $scope.updateView = function() {\n if (!$scope.formData || $scope.loading) return;\n $scope.$broadcast('$$rebind::balance'); // force rebind balance\n $scope.$broadcast('$$rebind::rebind'); // force rebind\n $scope.motion.show({selector: '.view-wallet-tx .item', ink: false});\n };\n\n $scope.downloadHistoryFile = function(options) {\n options = options || {};\n options.fromTime = options.fromTime || -1; // default: full history\n var pubkey = $scope.formData.pubkey;\n csTx.downloadHistoryFile(pubkey, options);\n };\n\n // Updating wallet data\n $scope.doUpdate = function(silent) {\n console.debug('[wallet] TX history reloading...');\n var fromTime = $scope.formData && $scope.formData.tx && $scope.formData.tx.fromTime || undefined;\n var options = {\n sources: true,\n tx: {\n enable: true,\n fromTime: fromTime\n },\n api: false\n };\n return (silent ?\n // If silent: just refresh\n wallet.refreshData(options) :\n // If not silent: show/hide loading indicator\n UIUtils.loading.show()\n .then(function() {\n return wallet.refreshData(options);\n })\n .then(UIUtils.loading.hide)\n )\n .then($scope.updateView)\n .catch(UIUtils.onError('ERROR.REFRESH_WALLET_DATA'));\n };\n\n $scope.showQRCode = function(timeout) {\n if (!wallet || !$scope.qrcodeId) return; // Skip\n\n // Get the DIV element\n var element = angular.element(document.querySelector('#' + $scope.qrcodeId + ' .content'));\n if (!element) {\n console.error(\"[wallet-controller] Cannot found div #{0} for the QRCode. Skipping.\".format($scope.qrcodeId));\n return;\n }\n\n wallet.loadQrCode()\n .then(function(svg) {\n element.html(svg);\n UIUtils.motion.toggleOn({selector: '#'+$scope.qrcodeId}, timeout || 1100);\n });\n };\n\n $scope.hideQRCode = function() {\n if (!$scope.qrcodeId) return;\n var element = angular.element(document.querySelector('#' + $scope.qrcodeId));\n if (element) {\n UIUtils.motion.toggleOff({selector: '#'+$scope.qrcodeId});\n }\n };\n\n /* -- add listeners -- */\n\n $scope.addListeners = function() {\n $scope.listeners = [\n // Reload if wallet balanced changed\n wallet.api.data.on.balanceChanged($scope, $scope.updateView),\n // Reload if useRelative changed\n $scope.$watch('settings.useRelative', $scope.updateView, true),\n // Reload if showUDHistory changed\n $scope.$watch('settings.showUDHistory', function(newVal, oldVal) {\n if (!$scope.formData || $scope.loading || (newVal === oldVal)) return;\n $scope.doUpdate();\n }, true)\n ];\n\n // Listening new block (if auto refresh enable)\n if ($scope.settings.walletHistoryAutoRefresh) {\n $scope.listeners.push(\n csCurrency.api.data.on.newBlock($scope, function(block) {\n if ($scope.loading) return;\n console.debug(\"[wallet] Received new block. Will reload history.\");\n $timeout(function() {\n $scope.doUpdate(true);\n }, 500/*waiting for block propagation*/);\n })\n );\n }\n };\n\n $scope.removeListeners = function() {\n _.forEach($scope.listeners, function(remove){\n remove();\n });\n $scope.listeners = [];\n };\n\n /* -- popup / UI -- */\n\n // Transfer\n $scope.showTransferModal = function() {\n var hasCredit = (!!$scope.formData.balance && $scope.formData.balance > 0);\n if (!hasCredit && !csWallet.children.count()) {\n UIUtils.alert.info('INFO.NOT_ENOUGH_CREDIT');\n return;\n }\n return Modals.showTransfer({wallet: wallet.id})\n .then(function(done){\n if (done) {\n UIUtils.toast.show('INFO.TRANSFER_SENT');\n $scope.$broadcast('$$rebind::balance'); // force rebind balance\n $scope.motion.show({selector: '.item-pending'});\n }\n });\n };\n\n $scope.showHelpTip = function(index, isTour) {\n // TODO\n };\n\n $scope.showTxErrors = function(event) {\n if (wallet.isDefault()) {\n return $scope.goState('app.view_wallet_tx_errors');\n }\n return $scope.goState('app.view_wallet_tx_errors_by_id', {id: wallet.id});\n };\n\n $scope.showMoreTx = function(fromTime) {\n\n fromTime = fromTime ||\n ($scope.formData.tx.fromTime - csSettings.data.walletHistoryTimeSecond) ||\n (csHttp.date.now() - 2 * csSettings.data.walletHistoryTimeSecond);\n\n UIUtils.loading.show();\n return wallet.refreshData({tx: {enable: true, fromTime: fromTime}})\n .then(function() {\n $scope.updateView();\n UIUtils.loading.hide();\n })\n .catch(function(err) {\n // If http rest limitation: wait then retry\n if (err.ucode == BMA.errorCodes.HTTP_LIMITATION) {\n $timeout(function() {\n return $scope.showMoreTx(fromTime);\n }, 2000);\n }\n else {\n UIUtils.onError('ERROR.REFRESH_WALLET_DATA')(err);\n }\n });\n };\n\n $scope.showSelectWalletModal = function() {\n if (!csWallet.children.count()) return;\n\n return Modals.showSelectWallet({\n parameters: {\n showDefault: true,\n showBalance: false,\n excludedWalletId: $scope.walletId\n }\n })\n .then(function(newWallet) {\n if (!newWallet || wallet && newWallet.id === wallet.id) return;\n $scope.removeListeners();\n $scope.loading = true;\n wallet = newWallet;\n console.debug(\"[transfer] Using wallet {\" + wallet.id + \"}\");\n $scope.formData = {};\n return $scope.load();\n });\n };\n\n /* -- popover -- */\n\n var paddingIndent = 10;\n\n $scope.toUnlockUIArray = function(unlockTreeItem, leftPadding, operator) {\n leftPadding = leftPadding || 0;\n\n // If operator (AND, OR)\n if (unlockTreeItem.children && (unlockTreeItem.type == 'AND' || unlockTreeItem.type == 'OR')) {\n return unlockTreeItem.children.reduce(function(res, child, index){\n if (child.children && index > 0) {\n // Add space between expression block\n res = res.concat({\n style: {\n 'padding-left': leftPadding + 'px',\n 'padding-top': '10px',\n 'padding-bottom': '10px'\n },\n operator: unlockTreeItem.type\n });\n\n return res.concat($scope.toUnlockUIArray(child, leftPadding + paddingIndent));\n }\n return res.concat($scope.toUnlockUIArray(child, leftPadding + paddingIndent, index && unlockTreeItem.type));\n }, []);\n }\n\n return {\n style: {\n 'padding-left': leftPadding + 'px'\n },\n operator: operator,\n type: unlockTreeItem.type,\n value: unlockTreeItem.value\n };\n };\n\n $scope.showLockedOutputsPopover = function(tx, event) {\n if (!tx.lockedOutputs) return;\n\n // Convert condition into UI array\n $scope.popoverData = $scope.popoverData || {};\n $scope.popoverData.lockedOuputs = tx.lockedOutputs.reduce(function(res, lockedOutput){\n return res.concat({\n amount: lockedOutput.amount,\n unlockFunctions: lockedOutput.unlockFunctions,\n unlockConditions: $scope.toUnlockUIArray(lockedOutput.unlockTree)\n });\n }, []);\n\n // Open popover\n UIUtils.popover.show(event, {\n templateUrl: 'templates/wallet/tx_locked_outputs_popover.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideLockedOutputsPopover = function() {\n if ($scope.lockedOutputsPopover) {\n $scope.lockedOutputsPopover.hide();\n if ($scope.popoverData) {\n delete $scope.popoverData.unlockConditions;\n }\n $scope.lockedOutputsPopover = null;\n }\n };\n\n $scope.showSelectWalletPopover = function(event) {\n return csPopovers.showSelectWallet(event, {\n scope: $scope\n })\n .then(function(newWallet) {\n if (!newWallet || newWallet.id === wallet.id) return;\n if (newWallet.isDefault()) {\n return $scope.goState('app.view_wallet_tx');\n }\n return $scope.goState('app.view_wallet_tx_by_id', {id: newWallet.id});\n });\n };\n\n $scope.goState = function(stateName, stateParams) {\n $scope.hideLockedOutputsPopover();\n return $state.go(stateName, stateParams);\n };\n}\n\nfunction WalletTxErrorController($scope, UIUtils, csSettings, csWallet) {\n 'ngInject';\n\n var wallet;\n $scope.settings = csSettings.data;\n $scope.loading = true;\n $scope.formData = {};\n\n $scope.$on('$ionicView.enter', function(e, state) {\n\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n return $scope.load();\n });\n\n $scope.load = function() {\n if (!wallet) return;\n\n return wallet.login()\n .then(function(walletData) {\n $scope.formData = walletData;\n $scope.loading = false;\n $scope.doMotion();\n //$scope.showFab('fab-redo-transfer');\n UIUtils.loading.hide();\n });\n };\n\n // Updating wallet data\n $scope.doUpdate = function(silent) {\n\n $scope.loading = true;\n return (silent ?\n wallet.refreshData() :\n UIUtils.loading.show()\n .then(csWallet.refreshData)\n .then(UIUtils.loading.hide)\n )\n .then(function() {\n $scope.doMotion();\n $scope.loading = false;\n })\n .catch(function(err) {\n UIUtils.onError('ERROR.REFRESH_WALLET_DATA')(err);\n $scope.loading = false;\n });\n };\n\n $scope.filterReceivedTx = function(tx){\n return tx.amount && tx.amount > 0;\n };\n\n $scope.filterSentTx = function(tx){\n return tx.amount && tx.amount < 0;\n };\n\n $scope.hasReceivedTx = function(){\n return $scope.formData.tx && _($scope.formData.tx.errors || []).find($scope.filterReceivedTx) && true;\n };\n\n $scope.hasSentTx = function(){\n return $scope.formData.tx && _($scope.formData.tx.errors || []).find($scope.filterSentTx) && true;\n };\n\n}\n\nfunction WalletSecurityModalController($scope, UIUtils, csConfig, csWallet, $translate, parameters){\n\n var wallet = parameters && parameters.wallet || csWallet;\n\n $scope.slides = {\n slider: null,\n options: {\n loop: false,\n effect: 'slide',\n speed: 500\n }\n };\n $scope.isLastSlide = false;\n $scope.smallscreen = UIUtils.screen.isSmall();\n\n $scope.recover = {};\n $scope.isValidFile = false;\n\n\n $scope.login = wallet.isLogin();\n $scope.hasSelf = wallet.hasSelf();\n $scope.needSelf = $scope.login && wallet.data.requirements.needSelf;\n $scope.canRevoke = $scope.login && $scope.hasSelf && !wallet.data.requirements.revoked;\n $scope.needMembership = $scope.login && wallet.data.requirements.needMembership;\n $scope.option = $scope.login ? 'saveID' : 'recoverID';\n\n $scope.formData = {\n addQuestion: '',\n level: '4',\n questions : []\n };\n var questions = [];\n for (var i = 1; i<20; i++) {\n questions.push('ACCOUNT.SECURITY.QUESTION_' + i.toString());\n }\n $translate(questions)\n .then(function(translations){\n _.each(translations, function(translation){\n $scope.formData.questions.push({value: translation , checked: false});\n });\n });\n\n $scope.$on(\"$ionicSlides.sliderInitialized\", function(event, data){\n // Disable swipe\n data.slider.lockSwipes();\n });\n\n $scope.slidePrev = function() {\n $scope.slides.slider.unlockSwipes();\n $scope.slides.slider.slidePrev();\n $scope.slides.slider.lockSwipes();\n $scope.isLastSlide = false;\n\n };\n\n $scope.slideNext = function() {\n $scope.slides.slider.unlockSwipes();\n $scope.slides.slider.slideNext();\n $scope.slides.slider.lockSwipes();\n $scope.isLastSlide = ($scope.slides.slider.activeIndex === 3 && ($scope.option == \"saveID\" || $scope.option == \"recoverID\")) || ($scope.slides.slider.activeIndex === 2 && $scope.option == \"revocation\");\n };\n\n\n $scope.doNext = function(formName) {\n if (!formName) {\n switch ($scope.slides.slider.activeIndex) {\n case 1:\n switch ($scope.option) {\n case \"saveID\":\n formName = \"questionsForm\";\n break;\n case \"recoverID\":\n if ($scope.isValidFile) {\n $scope.slideNext();\n $scope.hasContent = false;\n $scope.fileData = '';\n\n }\n else {\n UIUtils.alert.error(\"ERROR.NOT_VALID_SAVE_ID_FILE\", \"ERROR.LOAD_FILE_FAILED\");\n }\n break;\n }\n break;\n\n case 2:\n switch ($scope.option) {\n case \"recoverID\":\n formName = \"recoverForm\";\n break;\n case \"saveID\":\n formName = \"answersForm\";\n break;\n }\n }\n }\n\n if (formName) {\n $scope[formName].$submitted = true;\n if (!$scope[formName].$valid) {\n return;\n }\n switch (formName) {\n case \"recoverForm\":\n $scope.recoverId();\n break;\n case \"answersForm\":\n $scope.downloadSaveIDFile();\n break;\n default:\n $scope.slideNext();\n }\n }\n };\n\n $scope.selectOption = function(option, enableOnDemo){\n if (!enableOnDemo && csConfig.demo) {\n return UIUtils.alert.demo();\n }\n $scope.option = option;\n $scope.slideNext();\n };\n\n $scope.restore = function(){\n if ($scope.slides.slider.activeIndex === 1 && $scope.option === 'saveID') {\n $scope.formData = {\n addQuestion: '',\n level: '4',\n questions: []\n };\n $translate(questions)\n .then(function (translations) {\n _.each(translations, function (translation) {\n $scope.formData.questions.push({value: translation, checked: false});\n });\n });\n }\n\n else if ($scope.slides.slider.activeIndex === 2 && $scope.option === 'saveID') {\n _.each($scope.formData.questions, function(question){\n question.answer = undefined;\n });\n }\n\n else if ($scope.slides.slider.activeIndex === 1 && $scope.option === 'recoverID'){\n $scope.hasContent = false;\n $scope.recover = {};\n $scope.fileData = '';\n $scope.isValidFile = false;\n }\n\n else if ($scope.slides.slider.activeIndex === 2 && $scope.option === 'recoverID'){\n _.each($scope.recover.questions, function(element){\n element.answer = undefined;\n });\n }\n\n else if ($scope.slides.slider.activeIndex === 2 && $scope.option === 'revocation'){\n $scope.isValidFile = false;\n $scope.hasContent = false;\n $scope.revocation = undefined;\n }\n };\n\n /**\n * Set the file content\n */\n $scope.onFileChanged = function(file) {\n $scope.hasContent = angular.isDefined(file) && file !== '';\n $scope.fileData = file.fileData ? file.fileData : '';\n $scope.isValidFile = $scope.fileData !== '' && $scope.fileData.type === 'text/plain';\n\n if ($scope.isValidFile && $scope.option === 'recoverID') {\n $scope.content = file.fileContent.split('\\n');\n var indexOfQuestions = _.indexOf($scope.content, 'Questions: ');\n var LastIndexQuestions = -1;\n _.each($scope.content, function (element, index) {\n if (/^Issuer:/.test(element)) {\n LastIndexQuestions = index;\n }\n else if (/^Crypted-Nonce:/.test(element)) {\n $scope.recover.cypherNonce = element.split(' ')[1];\n }\n else if (/^Crypted-Pubkey:/.test(element)) {\n $scope.recover.cypherPubkey = element.split(' ')[1];\n }\n else if (/^Crypted-Salt:/.test(element)) {\n $scope.recover.cypherSalt = element.split(' ')[1];\n }\n else if (/^Crypted-Pwd:/.test(element)) {\n $scope.recover.cypherPwd = element.split(' ')[1];\n }\n });\n $scope.recover.questions = [];\n for (var i = indexOfQuestions + 1; i < LastIndexQuestions; i++) {\n $scope.recover.questions.push({value: $scope.content[i]});\n }\n }\n else if ($scope.isValidFile && $scope.option === \"revocation\"){\n $scope.revocation = file.fileContent;\n }\n };\n\n $scope.recoverId = function(){\n if(!$scope.recoverForm.$valid){\n return;\n }\n\n $scope.recover.answer = '';\n _.each($scope.recover.questions, function(element){\n $scope.recover.answer += element.answer;\n });\n\n return wallet.recoverId($scope.recover)\n .then(function (recover){\n if (angular.isDefined(recover)) {\n $scope.recover = recover;\n $scope.slideNext();\n }\n else {\n UIUtils.alert.error('ERROR.RECOVER_ID_FAILED');\n }\n })\n .catch(UIUtils.onError('ERROR.RECOVER_ID_FAILED'));\n\n };\n\n /**\n * Save Id\n */\n $scope.addQuestion = function(){\n if ($scope.formData.addQuestion !== '') {\n $scope.formData.questions.push({value: $scope.formData.addQuestion, checked: true});\n $scope.formData.addQuestion = '';\n }\n };\n\n $scope.downloadSaveIDFile = function(){\n // Force user re-auth\n var loginData;\n return wallet.auth({\n forceAuth: true,\n expectedPubkey: $scope.pubkey,\n silent: true,\n success: function(values) {\n loginData = values;\n }\n })\n .catch(function(err) {\n if (err && err === 'CANCELLED') return;\n UIUtils.alert.error('ERROR.SALT_OR_PASSWORD_NOT_CONFIRMED', 'ERROR.LOGIN_FAILED');\n return;\n })\n .then(function(res) {\n if (!res) return;\n var file = {\n file: _.filter($scope.formData.questions, function (question) {\n return question.checked;\n })\n };\n var record = {\n salt: loginData.username,\n pwd: loginData.password,\n questions: '',\n answer: ''\n };\n _.each(file.file, function (question) {\n record.questions += question.value + '\\n';\n record.answer += question.answer;\n });\n\n return wallet.getCryptedId(record)\n .then(function(record){\n wallet.downloadSaveId(record);\n $scope.closeModal();\n });\n })\n ;\n };\n\n $scope.isRequired = function(){\n var questionChecked = _.filter($scope.formData.questions, function(question) {\n return question.checked;\n });\n return questionChecked.length < $scope.formData.level;\n };\n\n $scope.revokeWithFile = function(){\n if ($scope.isValidFile) {\n $scope.revokeIdentity();\n }\n else {\n UIUtils.alert.error(\"ERROR.NOT_VALID_REVOCATION_FILE\", \"ERROR.LOAD_FILE_FAILED\");\n }\n };\n\n /**\n * Download revocation file\n */\n $scope.downloadRevokeFile = function () {\n // Force re-authentication\n return wallet.auth({forceAuth: true})\n\n // Download file\n .then(function() {\n return wallet.downloadRevocation();\n })\n\n .then(function() {\n UIUtils.loading.hide();\n })\n\n .catch(function(err){\n if (err && err === 'CANCELLED') return;\n UIUtils.onError('ERROR.DOWNLOAD_REVOCATION_FAILED')(err);\n })\n ;\n\n };\n\n /**\n * Revoke wallet identity\n */\n $scope.revokeWalletIdentity = function () {\n if (!$scope.hasSelf) {\n return UIUtils.alert.error(\"ERROR.ONLY_SELF_CAN_EXECUTE_THIS_ACTION\");\n }\n\n // Make sure user re-auth\n return wallet.auth({forceAuth: true})\n .then(function(confirm) {\n UIUtils.loading.hide();\n if (!confirm) return;\n return $scope.revokeIdentity();\n })\n .catch(function (err) {\n if (err === 'CANCELLED') return;\n UIUtils.onError('ERROR.REVOCATION_FAILED')(err);\n });\n };\n\n /**\n * Revoke identity\n */\n $scope.revokeIdentity = function (confirm) {\n\n // Make sure user re-auth + confirm\n if (!confirm) {\n return UIUtils.alert.confirm(\"CONFIRM.REVOKE_IDENTITY\", 'CONFIRM.POPUP_WARNING_TITLE', {\n cssClass: 'warning',\n okText: 'COMMON.BTN_YES',\n okType: 'button-assertive'\n })\n .then(function (confirm) {\n if (!confirm) return;\n return UIUtils.alert.confirm(\"CONFIRM.REVOKE_IDENTITY_2\", 'CONFIRM.POPUP_TITLE', {\n cssClass: 'warning',\n okText: 'COMMON.BTN_YES',\n okType: 'button-assertive'\n });\n })\n .then(function (confirm) {\n if (confirm) $scope.revokeIdentity(true, true); // loop with confirmation\n });\n }\n\n return UIUtils.loading.show()\n .then(function () {\n if (!$scope.revocation){\n return wallet.revoke();\n }\n else {\n return wallet.revokeWithFile($scope.revocation);\n }\n })\n .then(function () {\n UIUtils.toast.show(\"INFO.REVOCATION_SENT\");\n $scope.closeModal();\n return UIUtils.loading.hide();\n })\n .catch(function(err) {\n if ($scope.revocation){\n $scope.isValidFile = false;\n $scope.revocationError = err && err.message || err || 'ERROR.REVOCATION_FAILED';\n UIUtils.loading.hide(10);\n }\n else {\n UIUtils.onError('ERROR.REVOCATION_FAILED')(err);\n }\n });\n };\n\n\n /**\n * Ask self (= send identity)\n */\n $scope.self = function () {\n return $scope.closeModal('self');\n };\n\n /**\n * Ask membership in\n */\n $scope.membershipIn = function () {\n return $scope.closeModal('membershipIn');\n };\n\n /**\n * Generate keyfile\n */\n $scope.downloadKeyFile = function (format) {\n // Force re-authentication\n return wallet.auth({forceAuth: true})\n\n // Download file\n .then(function() {\n return wallet.downloadKeyFile(format);\n })\n\n .then(function() {\n UIUtils.loading.hide();\n return $scope.closeModal();\n })\n\n .catch(function(err){\n if (err && err === 'CANCELLED') {\n UIUtils.loading.hide();\n return;\n }\n UIUtils.onError('ERROR.DOWNLOAD_KEYFILE_FAILED')(err);\n })\n ;\n };\n}\n","\nWalletListAbstractController.$inject = ['$scope', '$q', '$timeout', 'UIUtils', 'filterTranslations', 'csSettings', 'csCurrency', 'csWallet'];\nWalletListViewController.$inject = ['$scope', '$controller', '$state', '$timeout', '$q', '$translate', '$ionicPopover', '$ionicPopup', 'ModalUtils', 'UIUtils', 'Modals', 'csCurrency', 'csSettings', 'csWallet'];\nWalletSelectModalController.$inject = ['$scope', '$controller', 'parameters'];\nWalletListImportModalController.$inject = ['$scope', '$timeout', 'BMA', 'csWallet'];\nWalletSelectPopoverController.$inject = ['$scope', '$controller', 'UIUtils', 'parameters'];angular.module('cesium.wallets.controllers', ['cesium.services', 'cesium.currency.controllers'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n $stateProvider\n\n .state('app.view_wallets', {\n url: \"/wallets\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wallet/list/view_wallets.html\",\n controller: 'WalletListViewCtrl'\n }\n },\n data: {\n login: true\n }\n })\n\n .state('app.view_wallet_by_id', {\n url: \"/wallets/:id?refresh\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wallet/view_wallet.html\",\n controller: 'WalletCtrl'\n }\n },\n data: {\n login: true,\n silentLocationChange: true\n }\n })\n\n .state('app.view_wallet_tx_by_id', {\n url: \"/history/wallets/:id?refresh\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wallet/view_wallet_tx.html\",\n controller: 'WalletTxCtrl'\n }\n },\n data: {\n login: true,\n silentLocationChange: true\n }\n })\n\n .state('app.view_wallet_tx_errors_by_id', {\n url: \"/history/wallets/:id/errors\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wallet/view_wallet_tx_error.html\",\n controller: 'WalletTxErrorCtrl'\n }\n },\n data: {\n login: true\n }\n })\n ;\n }])\n .controller('WalletListAbstractCtrl', WalletListAbstractController)\n\n .controller('WalletListViewCtrl', WalletListViewController)\n\n .controller('WalletSelectModalCtrl', WalletSelectModalController)\n\n .controller('WalletListImportModalCtrl', WalletListImportModalController)\n\n .controller('WalletSelectPopoverCtrl', WalletSelectPopoverController)\n;\n\n\nfunction WalletListAbstractController($scope, $q, $timeout, UIUtils, filterTranslations, csSettings, csCurrency, csWallet) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.wallets = null;\n $scope.formData = {\n useRelative: csSettings.data.useRelative,\n showDefault: true,\n showBalance: false,\n balance: undefined,\n updatingWalletId: undefined,\n stopped: false,\n minData: true\n };\n $scope.motion = null; // no animation\n\n $scope.setParameters = function(parameters) {\n parameters = parameters || {};\n\n $scope.formData.useRelative = angular.isDefined(parameters.useRelative) ? parameters.useRelative : $scope.formData.useRelative;\n $scope.formData.showBalance = angular.isDefined(parameters.showBalance) ? parameters.showBalance : $scope.formData.showBalance;\n $scope.formData.minData = angular.isDefined(parameters.minData) ? parameters.minData : $scope.formData.minData;\n $scope.formData.excludedWalletId = parameters.excludedWalletId;\n $scope.formData.showDefault = (angular.isDefined(parameters.showDefault) ? parameters.showDefault : $scope.formData.showDefault) &&\n ($scope.formData.excludedWalletId !== 'default');\n\n };\n\n $scope.load = function(options) {\n\n options = options || {};\n $scope.loading = (options.silent !== false);\n $scope.formData.balance = undefined;\n $scope.formData.updatingWalletId = undefined;\n $scope.formData.stopped = false;\n\n // Load currency, and filter translations (need by 'formatAmount' filter)\n var jobs = [];\n\n jobs.push(csCurrency.name()\n .then(function(currency) {\n $scope.currency = currency;\n return filterTranslations.ready();\n }));\n\n // Get children wallets\n $scope.defaultWallet = $scope.formData.showDefault ? csWallet : undefined;\n if (!$scope.wallets) {\n jobs.push(\n csWallet.children.all()\n .then(function(children) {\n $scope.wallets=children;\n UIUtils.loading.hide();\n })\n );\n }\n\n // Prepare load options\n var walletLoadOptions = {\n silent: true,\n minData: $scope.formData.minData,\n sources: $scope.formData.showBalance,\n tx: {\n enable: false\n },\n api: true\n };\n var hasLoadError = false;\n var loadCounter = 0;\n var now = Date.now();\n var balance = 0;\n return (jobs.length ? $q.all(jobs) : $q.when())\n // Load wallet data (apply a timeout between each wallet)\n .then(function() {\n var wallets = $scope.formData.showDefault ? [csWallet].concat($scope.wallets) : $scope.wallets;\n if (!wallets.length) return;\n console.debug(\"[wallets] Loading {0} wallets...\".format(wallets.length));\n return wallets.reduce(function(res, wallet) {\n var skip= !options.refresh && wallet.isDataLoaded(walletLoadOptions);\n if (skip) {\n console.debug(\"[wallets] Wallet #{0} already loaded. Skipping\".format(wallet.id));\n return res.then(function(){\n balance += wallet.data.balance;\n $scope.updateWalletView(wallet.id);\n });\n }\n loadCounter++;\n return res.then(function() {\n if ($scope.formData.stopped) return; // skip if stopped\n // Loading next wallet, after waiting some time\n $scope.formData.updatingWalletId = wallet.id;\n var loadPromise;\n if (options.refresh && wallet.data.loaded) {\n var refreshOptions = angular.merge({\n // Refresh requirements if member account\n requirements: (!wallet.data.requirements.loaded || wallet.data.requirements.isMember || wallet.data.requirements.wasMember || wallet.data.requirements.pendingMembership)\n }, walletLoadOptions);\n loadPromise = wallet.refreshData(refreshOptions);\n }\n else {\n loadPromise = wallet.loadData(walletLoadOptions);\n }\n\n loadPromise.then(function(walletData) {\n balance += walletData.balance;\n $scope.updateWalletView(wallet.id);\n })\n .catch(function(err) {\n console.error(\"[wallets] Error while loading data of wallet #{0}\".format(wallet.id), err);\n hasLoadError = true;\n });\n return loadPromise;\n });\n }, $q.when());\n })\n .then(function() {\n if (hasLoadError) {\n return UIUtils.alert.error('ERROR.LOAD_WALLET_LIST_FAILED')\n .then(function() {\n $scope.resetData();\n $scope.cancel();\n });\n }\n // Stop\n if ($scope.formData.stopped) return;\n if (loadCounter) {\n console.debug(\"[wallets] Loaded data of {0} wallet(s) in {1}ms\".format(loadCounter, (Date.now() - now)));\n }\n $scope.formData.balance = balance;\n $scope.formData.updatingWalletId = undefined;\n $scope.loading = false;\n UIUtils.loading.hide();\n $scope.updateView();\n })\n .catch(function(err) {\n $scope.resetData();\n if (err && err === 'CANCELLED') {\n $scope.cancel();\n throw err;\n }\n return UIUtils.onError('ERROR.LOAD_WALLET_LIST_FAILED')(err);\n });\n };\n\n $scope.filterFn = function(parameters) {\n return function(wallet) {\n return !parameters || wallet.id !== parameters.excludedWalletId;\n };\n };\n\n\n // Clean controller data\n $scope.resetData = function() {\n console.debug(\"[wallets] Cleaning wallet list\");\n $scope.wallets = null;\n $scope.loading = true;\n $scope.entered = false;\n $scope.formData.balance = undefined;\n $scope.formData.updatingWalletId = undefined;\n };\n\n $scope.updateView = function(walletId) {\n if (!$scope.wallets || !$scope.wallets.length) return;\n\n var selectorSuffix = walletId && (' #wallet-' + walletId) || '';\n\n if ($scope.motion) {\n $scope.motion.show({selector: '.list .item.item-wallet' + selectorSuffix, ink: true});\n }\n else {\n UIUtils.ink({selector: '.list .item.item-wallet' + selectorSuffix});\n }\n };\n\n $scope.updateWalletView = function(walletId) {\n if ($scope.motion) {\n $scope.motion.show({selector: '.list #wallet-' + walletId, ink: true});\n }\n else {\n UIUtils.ink({selector: '.list #wallet-' + walletId});\n }\n };\n\n $scope.doUpdate = function(silent) {\n if ($scope.loading || !$scope.wallets || !$scope.wallets.length || $scope.formData.updatingWalletId) return $q.when();\n\n $scope.selectPrevented = true;\n $timeout(function() {\n $scope.selectPrevented = false;\n }, 1000);\n\n return $scope.load({silent: silent, refresh: true})\n .then(function() {\n $scope.loading = false;\n $scope.selectPrevented = false;\n if (silent) {\n $scope.$broadcast('$$rebind::rebind'); // force rebind\n }\n $scope.updateView();\n });\n };\n\n $scope.addNewWallet = function(wallet) {\n\n if (!wallet) return $q.reject(\"Missing 'wallet' argument\");\n\n // Make sure auth on the main wallet\n if (csSettings.data.useLocalStorageEncryption && !csWallet.isAuth()) {\n return csWallet.auth({minData: true})\n .then(function() {\n return $scope.addNewWallet(wallet); // loop\n })\n .catch(function(err) {\n if (err === 'CANCELLED') {\n return UIUtils.loading.hide();\n }\n UIUtils.onError('ERROR.ADD_SECONDARY_WALLET_FAILED')(err);\n });\n }\n\n // Call API extension on child wallet\n return csWallet.api.data.raisePromise.load(wallet.data)\n // continue, when plugins extension failed (just log in console)\n .catch(console.error)\n .then(function() {\n $scope.addListenersOnWallet(wallet);\n csWallet.children.add(wallet);\n });\n };\n\n /* -- modals -- */\n\n $scope.showNewWalletModal = function() {\n\n var wallet = csWallet.children.instance();\n return wallet.login({\n showNewAccountLink: false,\n title: 'ACCOUNT.WALLET_LIST.BTN_NEW',\n okText: 'COMMON.BTN_ADD',\n // Load data options :\n minData: true,\n sources: true,\n api: false,\n success: UIUtils.loading.show,\n method: 'PUBKEY' // Default method - fix #767\n })\n .then(function(data) {\n if (!data || !data.pubkey) { // User cancelled\n UIUtils.loading.hide(100);\n return;\n }\n\n // Avoid to add main wallet again\n if (csWallet.isUserPubkey(data.pubkey)) {\n throw new Error('ERROR.COULD_NOT_ADD_MAIN_WALLET');\n }\n\n // Avoid to add exists wallet again\n if (csWallet.children.hasPubkey(data.pubkey)) {\n throw new Error('ERROR.COULD_NOT_ADD_EXISTING_WALLET');\n }\n\n console.debug(\"[wallet] Adding secondary wallet {{0}}\".format(data.pubkey && data.pubkey.substring(0,8)));\n\n // Add the child wallet\n return $scope.addNewWallet(wallet)\n .then(function() {\n UIUtils.loading.hide();\n $scope.updateView();\n });\n })\n .catch(UIUtils.onError('ERROR.ADD_SECONDARY_WALLET_FAILED'));\n };\n\n /* -- Method to override by subclasses-- */\n\n $scope.addListenersOnWallet = function(wallet) {\n // Can be override by subclass\n };\n\n $scope.cancel = function() {\n console.warn(\"cancel() must be implement by subclass\");\n };\n\n $scope.select = function(event, wallet) {\n console.warn(\"select() must be implement by subclass\");\n };\n}\n\nfunction WalletSelectModalController($scope, $controller, parameters) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('WalletListAbstractCtrl', {$scope: $scope}));\n\n $scope.$on('modal.shown', function() {\n $scope.setParameters(parameters);\n $scope.load();\n });\n\n $scope.cancel = function() {\n $scope.closeModal();\n };\n\n $scope.select = function(event, wallet) {\n if (event.isDefaultPrevented() || !wallet || $scope.selectPrevented) return;\n $scope.closeModal(wallet);\n };\n\n // Default actions\n if (parameters) {\n $scope.setParameters(parameters);\n }\n}\n\nfunction WalletListViewController($scope, $controller, $state, $timeout, $q, $translate, $ionicPopover, $ionicPopup,\n ModalUtils, UIUtils, Modals, csCurrency, csSettings, csWallet){\n 'ngInject';\n\n $scope.settings = csSettings.data;\n $scope.listeners = [];\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('WalletListAbstractCtrl', {$scope: $scope, parameters: {}}));\n\n // Override defaults\n $scope.formData.name = undefined;\n $scope.motion = UIUtils.motion.default;\n $scope.entered = false;\n\n $scope.enter = function(e, state) {\n // First enter\n if (!$scope.entered) {\n $scope.entered = true;\n $scope.setParameters({\n showDefault: true,\n showBalance: true,\n minData: false\n });\n\n return $scope.load()\n .then(function() {\n UIUtils.loading.hide();\n if (!$scope.wallets) return; // user cancel, or error\n $scope.addListeners();\n $scope.showFab('fab-add-wallet');\n });\n }\n // If already enter\n else {\n // Re-add listeners\n $scope.addListeners();\n if ($scope.formData.stopped) {\n $scope.loading = false;\n $scope.formData.stopped = false;\n $scope.formData.updatingWalletId = undefined;\n $scope.updateView();\n }\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.leave = function() {\n $scope.formData.stopped = true;\n $scope.formData.updatingWalletId = undefined;\n $scope.loading = false;\n $scope.removeListeners();\n };\n $scope.$on('$ionicView.leave', $scope.leave);\n\n $scope.cancel = function() {\n $scope.showHome();\n };\n\n $scope.select = function(event, wallet) {\n if (event.isDefaultPrevented() || !wallet || $scope.selectPrevented) return;\n if (wallet.isDefault()) {\n $state.go('app.view_wallet');\n }\n else {\n $state.go('app.view_wallet_by_id', {id: wallet.id});\n }\n event.preventDefault();\n };\n\n $scope.editWallet = function(event, wallet) {\n\n event.preventDefault();\n\n return $scope.showEditPopup(wallet)\n .then(function(newName) {\n if (!newName) return;\n\n // Auth (if encryption is need)\n return (csSettings.data.useLocalStorageEncryption ? csWallet.auth({minData: true}) : $q.when())\n\n // Save changes\n .then(function() {\n wallet.data.localName = newName;\n csWallet.storeData();\n UIUtils.loading.hide();\n $scope.updateView();\n })\n .catch(function(err) {\n if (err === 'CANCELLED') {\n return UIUtils.loading.hide();\n }\n UIUtils.onError('ERROR.SAVE_WALLET_LIST_FAILED')(err);\n });\n });\n };\n\n $scope.downloadAsFile = function() {\n if (!$scope.wallets) return; // user cancel\n return csWallet.children.downloadFile();\n };\n\n\n\n $scope.selectAndRemoveWallet = function() {\n $scope.hideActionsPopover();\n return Modals.showSelectWallet({\n wallets: $scope.wallets,\n showDefault: false\n })\n .then(function(wallet) {\n if (!wallet || !wallet.id) return; // User has cancelled\n\n // Auth (if encryption is need))\n return (csSettings.data.useLocalStorageEncryption ? csWallet.auth({minData: true}) : $q.when())\n\n // Remove the wallet\n .then(function() {\n return csWallet.children.remove(wallet.id);\n })\n // Refresh UI\n .then(function() {\n UIUtils.loading.hide();\n $scope.updateView();\n })\n .catch(UIUtils.onError('ERROR.REMOVE_SECONDARY_WALLET_FAILED'));\n });\n };\n\n $scope.showImportFileModal = function() {\n $scope.hideActionsPopover();\n\n var loginAndAddWallet = function(authData) {\n if (!authData || !authData.pubkey) return $q.reject('Invalid authentication data');\n console.debug(\"[wallet] Adding secondary wallet {\"+authData.pubkey.substring(0,8)+\"}\");\n var wallet = csWallet.children.instance();\n return wallet.login({\n authData: authData,\n // Load data options :\n minData: true,\n sources: true,\n api: false,\n success: UIUtils.loading.show\n })\n .then(function(walletData) {\n walletData.localName = authData.localName;\n return $scope.addNewWallet(wallet);\n });\n };\n\n return ModalUtils.show(\n 'templates/wallet/list/modal_import_file.html',\n 'WalletListImportModalCtrl'\n )\n .then(function(items){\n\n if (!items || !items.length) return; // User cancel\n\n UIUtils.loading.show();\n\n // Auth (if encryption is need)\n return (csSettings.data.useLocalStorageEncryption ? csWallet.auth({minData: true}) : $q.when())\n .then(function() {\n // Add wallet one after one\n return items.reduce(function(promise, authData){\n return promise.then(function() {\n return loginAndAddWallet(authData);\n });\n }, $q.when());\n })\n .then(function() {\n UIUtils.loading.hide();\n $scope.updateView();\n })\n .catch(function(err) {\n if (err === 'CANCELLED') {\n return UIUtils.loading.hide();\n }\n UIUtils.onError('ERROR.ADD_SECONDARY_WALLET_FAILED')(err);\n });\n });\n };\n\n /* -- popups -- */\n\n $scope.setEditForm = function(editForm) {\n $scope.editForm = editForm;\n };\n\n $scope.showEditPopup = function(wallet) {\n return $q(function(resolve, reject) {\n $translate(['ACCOUNT.WALLET_LIST.EDIT_POPOVER.TITLE', 'ACCOUNT.WALLET_LIST.EDIT_POPOVER.HELP', 'COMMON.BTN_OK', 'COMMON.BTN_CANCEL'])\n .then(function (translations) {\n $scope.formData.name = wallet.data.localName || wallet.data.name || wallet.data.uid || (wallet.data.pubkey && wallet.data.pubkey.substring(0, 8)) || '';\n\n // Choose UID popup\n $ionicPopup.show({\n templateUrl: 'templates/wallet/list/popup_edit_name.html',\n title: translations['ACCOUNT.WALLET_LIST.EDIT_POPOVER.TITLE'],\n subTitle: translations['ACCOUNT.WALLET_LIST.EDIT_POPOVER.HELP'],\n scope: $scope,\n buttons: [\n { text: translations['COMMON.BTN_CANCEL'] },\n {\n text: translations['COMMON.BTN_OK'],\n type: 'button-positive',\n onTap: function(e) {\n $scope.editForm.$submitted=true;\n if(!$scope.editForm.$valid || !$scope.formData.name) {\n //don't allow the user to close unless he enters a name\n e.preventDefault();\n } else {\n return $scope.formData.name;\n }\n }\n }\n ]\n })\n .then(function(name) {\n if (!name) { // user cancel\n delete $scope.formData.name;\n UIUtils.loading.hide();\n return;\n }\n resolve(name);\n });\n });\n });\n };\n\n /* -- popovers -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'templates/wallet/list/popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n /* -- listeners -- */\n\n // Clean controller data when logout\n $scope.onWalletLogout = function() {\n $scope.resetData();\n $scope.removeListeners();\n };\n\n $scope.addListeners = function() {\n\n // First remove lod listeners, if any\n $scope.removeListeners();\n\n $scope.listeners = [\n csWallet.api.data.on.logout($scope, $scope.onWalletLogout)\n ];\n\n // Auto-update on new block\n if (csSettings.data.walletHistoryAutoRefresh) {\n $scope.listeners.push(\n csCurrency.api.data.on.newBlock($scope, function (block) {\n if ($scope.loading) return;\n console.debug(\"[wallet-list] Received new block. Will reload list.\");\n $timeout(function () {\n $scope.doUpdate(true);\n }, 300/*waiting for node cache propagation*/);\n }));\n }\n\n // Listen auth events on each wallet\n _.forEach($scope.wallets||[], $scope.addListenersOnWallet);\n };\n\n $scope.addListenersOnWallet = function(wallet) {\n if (!wallet) return;\n $scope.listeners.push(wallet.api.data.on.unauth($scope, $scope.updateView));\n $scope.listeners.push(wallet.api.data.on.auth($scope, function (data, deferred) {\n $timeout($scope.updateView);\n return deferred ? deferred.resolve() : $q.when();\n }));\n };\n\n $scope.removeListeners = function() {\n _.forEach($scope.listeners, function(remove){\n remove();\n });\n $scope.listeners = [];\n };\n\n var inheritedUpdateView = $scope.updateView;\n $scope.updateView = function() {\n inheritedUpdateView();\n $scope.$broadcast('$$rebind::rebind'); // force rebind\n };\n\n var inheritedUpdateWalletView = $scope.updateWalletView;\n $scope.updateWalletView = function(walletId) {\n inheritedUpdateWalletView(walletId);\n $scope.$broadcast('$$rebind::rebind'); // force rebind\n };\n\n // Detect changes in settings useRelative\n $scope.$watch('settings.useRelative', function(newVal, oldVal) {\n if (!$scope.formData || $scope.loading || (newVal === oldVal)) return;\n $scope.formData.useRelative = csSettings.data.useRelative;\n $scope.updateView();\n }, true);\n}\n\n\nfunction WalletSelectPopoverController($scope, $controller, UIUtils, parameters) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('WalletListAbstractCtrl', {$scope: $scope}));\n\n // Disable list motion\n $scope.motion = null;\n\n $scope.$on('popover.shown', function() {\n if ($scope.loading) {\n $scope.setParameters(parameters);\n $scope.load();\n }\n });\n\n $scope.updateView = function() {\n if (!$scope.wallets || !$scope.wallets.length) return;\n\n UIUtils.ink({selector: '.popover-wallets .list .item'});\n $scope.$broadcast('$$rebind::rebind'); // force rebind\n };\n\n $scope.select = function(event, wallet) {\n if (event.isDefaultPrevented() || !wallet || $scope.selectPrevented) return; // no selection\n $scope.closePopover(wallet);\n };\n\n}\n\nfunction WalletListImportModalController($scope, $timeout, BMA, csWallet) {\n 'ngInject';\n\n $scope.hasContent = false;\n $scope.content = null;\n $scope.fileData = '';\n $scope.isValidFile = false;\n $scope.validatingFile = false;\n\n $scope.onFileChanged = function(file) {\n $scope.validatingFile = true;\n\n $scope.hasContent = angular.isDefined(file) && file !== '';\n $scope.fileData = file.fileData ? file.fileData : '';\n var isValidFile = $scope.fileData !== '' &&\n ($scope.fileData.type === 'text/csv' || $scope.fileData.type === 'text/plain' || 'application/vnd.ms-excel' /*fix issue #810*/);\n\n // Bad file type: invalid file\n if (!isValidFile) {\n console.error(\"[wallet] Import failed. Invalid file type: \" + $scope.fileData.type);\n $scope.isValidFile = false;\n $scope.validatingFile = false;\n return;\n }\n\n // Parse file\n console.debug(\"[wallet] Parsing file to import...\");\n var rows = file.fileContent.split('\\n');\n $scope.content = rows.reduce(function(res, row) {\n // Skip empty row\n if (!row || !row.trim().length) return res;\n\n // Split\n var cols = row.split('\\t', 3) || undefined;\n\n // Invalid column count: mark file as invalid\n if (cols && cols.length != 3) {\n console.debug(\"[wallet] Import: skip invalid row: \" + row);\n isValidFile = false;\n return res;\n }\n\n var item = {\n pubkey: cols[0],\n uid: cols[1],\n localName: cols[2]\n };\n\n // Check pubkey validity\n if (!BMA.regexp.PUBKEY.test(item.pubkey)) {\n console.debug(\"[wallet] Invalid pubkey, found in this row: \", row);\n isValidFile = false;\n return res;\n }\n\n // Ignore if same as current wallet\n if (csWallet.isUserPubkey(item.pubkey)) {\n console.debug(\"[wallet] Pubkey equals to main wallet. Skip this row: \", row);\n return res;\n }\n\n // Ignore if already in children wallet\n if (csWallet.children.hasPubkey(item.pubkey)) {\n console.debug(\"[wallet] Pubkey already in wallet list. Skip this row\", row);\n return res;\n }\n\n // OK: add it to result\n return res.concat(item);\n }, []);\n\n $scope.isValidFile = isValidFile;\n\n $timeout(function() {\n $scope.validatingFile = false;\n }, 250); // need to have a loading effect\n };\n\n $scope.removeFile = function() {\n $scope.hasContent = false;\n $scope.content = null;\n $scope.fileData = '';\n $scope.isValidFile = false;\n $scope.validatingFile = false;\n };\n}\n","\nWotLookupController.$inject = ['$scope', '$state', '$q', '$timeout', '$focus', '$location', '$ionicPopover', '$ionicHistory', 'UIUtils', 'csConfig', 'csCurrency', 'csSettings', 'Device', 'BMA', 'csWallet', 'csWot'];\nWotLookupModalController.$inject = ['$scope', '$controller', '$focus', 'csWallet', 'parameters'];\nWotIdentityAbstractController.$inject = ['$scope', '$rootScope', '$state', '$translate', '$ionicHistory', '$q', 'UIUtils', 'Modals', 'csConfig', 'csSettings', 'csCurrency', 'csWot', 'csWallet'];\nWotIdentityViewController.$inject = ['$scope', '$rootScope', '$controller', '$timeout', '$state', 'UIUtils', 'Modals', 'csWallet'];\nWotIdentityTxViewController.$inject = ['$scope', '$timeout', '$q', 'BMA', 'csSettings', 'csWot', 'csTx', 'UIUtils'];\nWotCertificationsViewController.$inject = ['$scope', '$rootScope', '$controller', 'csSettings', 'csWallet', 'UIUtils'];\nWotSelectPubkeyIdentityModalController.$inject = ['$scope', '$q', 'csWot', 'parameters'];angular.module('cesium.wot.controllers', ['cesium.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n $stateProvider\n\n .state('app.wot_lookup', {\n url: \"/wot\",\n abstract: true,\n enableBack: false, // Workaround need for navigation outside tabs (enableBack is forced to 'true' in ViewXXXCtrl)\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/lookup.html\"\n }\n }\n })\n\n .state('app.wot_lookup.tab_search', {\n url: \"/search?q&type&hash\",\n views: {\n 'tab': {\n templateUrl: \"templates/wot/tabs/tab_lookup.html\",\n controller: 'WotLookupCtrl'\n }\n },\n data: {\n silentLocationChange: true,\n large: 'app.wot_lookup_lg'\n }\n })\n\n .state('app.wot_lookup_lg', {\n url: \"/wot/lg?q&type&hash\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/lookup_lg.html\",\n controller: 'WotLookupCtrl'\n }\n },\n data: {\n silentLocationChange: true\n }\n })\n\n .state('app.wot_identity', {\n url: \"/wot/:pubkey/:uid?action&block\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/view_identity.html\",\n controller: 'WotIdentityViewCtrl'\n }\n }\n })\n\n .state('app.wot_identity_uid', {\n url: \"/lookup/:uid?action\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/view_identity.html\",\n controller: 'WotIdentityViewCtrl'\n }\n }\n })\n\n .state('app.wot_identity_tx_uid', {\n url: \"/wot/tx/:pubkey/:uid?action\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/view_identity_tx.html\",\n controller: 'WotIdentityTxViewCtrl'\n }\n }\n })\n\n .state('app.wot_cert', {\n url: \"/wot/:pubkey/:uid/:type?block\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/view_certifications.html\",\n controller: 'WotCertificationsViewCtrl'\n }\n },\n data: {\n large: 'app.wot_cert_lg'\n }\n })\n\n .state('app.wot_cert_lg', {\n url: \"/wot/cert/lg/:pubkey/:uid?block\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/view_certifications.html\",\n controller: 'WotCertificationsViewCtrl'\n }\n }\n })\n\n // wallet cert\n .state('app.wallet_cert', {\n url: \"/account/cert/:type\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/view_certifications.html\",\n controller: 'WotCertificationsViewCtrl'\n }\n },\n data: {\n large: 'app.wallet_cert_lg'\n }\n })\n\n .state('app.wallet_cert_lg', {\n url: \"/account/cert/lg\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/view_certifications.html\",\n controller: 'WotCertificationsViewCtrl'\n }\n }\n })\n\n // wallet cert\n .state('app.wallet_cert_by_id', {\n url: \"/wallets/:id/cert/:type\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/view_certifications.html\",\n controller: 'WotCertificationsViewCtrl'\n }\n },\n data: {\n large: 'app.wallet_cert_lg_by_id'\n }\n })\n\n .state('app.wallet_cert_lg_by_id', {\n url: \"/wallets/:id/cert/lg\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/view_certifications.html\",\n controller: 'WotCertificationsViewCtrl'\n }\n }\n })\n ;\n }])\n\n .controller('WotLookupCtrl', WotLookupController)\n\n .controller('WotLookupModalCtrl', WotLookupModalController)\n\n .controller('WotIdentityAbstractCtrl', WotIdentityAbstractController)\n\n .controller('WotIdentityViewCtrl', WotIdentityViewController)\n\n .controller('WotIdentityTxViewCtrl', WotIdentityTxViewController)\n\n .controller('WotCertificationsViewCtrl', WotCertificationsViewController)\n\n .controller('WotSelectPubkeyIdentityModalCtrl', WotSelectPubkeyIdentityModalController)\n\n;\n\nfunction WotLookupController($scope, $state, $q, $timeout, $focus, $location, $ionicPopover, $ionicHistory,\n UIUtils, csConfig, csCurrency, csSettings, Device, BMA, csWallet, csWot) {\n 'ngInject';\n\n var defaultSearchLimit = 10;\n\n $scope.search = {\n text: '',\n loading: true,\n type: null,\n results: []\n };\n $scope.entered = false;\n $scope.wotSearchTextId = 'wotSearchText';\n $scope.enableFilter = true;\n $scope.enableWallets = false;\n $scope.allowMultiple = false;\n $scope.selection = [];\n $scope.showResultLabel = true;\n $scope.parameters = {}; // override in the modal controller\n\n $scope.enter = function(e, state) {\n if (!$scope.entered) {\n var params = angular.merge({}, $scope.parameters, state && state.stateParams);\n if (params && params.q) { // Query parameter\n $scope.search.text = params.q;\n $timeout(function() {\n $scope.doSearch();\n }, 100);\n }\n else if (params && params.hash) { // hash tag parameter\n $scope.search.text = '#' + params.hash;\n $timeout(function() {\n $scope.doSearch();\n }, 100);\n }\n else {\n $timeout(function() {\n // Init phase\n if (csCurrency.data.initPhase && !params.type) {\n $scope.doGetPending(0, undefined, true/*skipLocationUpdate*/);\n }\n // get new comers\n else if (params.type == 'newcomers' || (!csConfig.initPhase && !params.type)) {\n $scope.doGetNewcomers(0, undefined, true/*skipLocationUpdate*/);\n }\n else if (params.type == 'pending') {\n $scope.doGetPending(0, undefined, true/*skipLocationUpdate*/);\n }\n else if (params.type == 'wallets') {\n $scope.doGetWallets(0, undefined, true/*skipLocationUpdate*/);\n }\n\n }, 100);\n }\n // removeIf(device)\n // Focus on search text (only if NOT device, to avoid keyboard opening)\n $focus($scope.wotSearchTextId);\n // endRemoveIf(device)\n\n $scope.entered = true;\n\n $timeout(UIUtils.ink, 100);\n\n $scope.showHelpTip();\n }\n else {\n\n $scope.updateLocationHref();\n if ($scope.search.results && $scope.search.results.length) {\n $scope.motion.show({selector: '.lookupForm .list .item', ink: true});\n }\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.resetWotSearch = function() {\n $scope.search = {\n text: null,\n loading: false,\n type: 'newcomers',\n results: []\n };\n };\n\n $scope.updateLocationHref = function() {\n // removeIf(device)\n var stateParams = {\n q: undefined,\n hash: undefined,\n type: undefined\n };\n\n if ($scope.search.type === 'text') {\n var text = $scope.search.text.trim();\n if (text.match(/^#[\\wḡĞǦğàáâãäåçèéêëìíîïðòóôõöùúûüýÿ]+$/)) {\n stateParams.hash = text.substr(1);\n }\n else {\n stateParams.q = text;\n }\n }\n else if ($scope.search.type != 'last') {\n stateParams.type = $scope.search.type;\n }\n\n // Update location href\n $location.search(stateParams).replace();\n // endRemoveIf(device)\n };\n\n $scope.doSearchText = function() {\n\n $scope.doSearch();\n $scope.updateLocationHref();\n\n };\n\n $scope.doSearch = function() {\n var text = $scope.search.text.trim();\n if ((UIUtils.screen.isSmall() && text.length < 3) || !text.length) {\n $scope.search.results = undefined;\n $scope.search.type = 'none';\n $scope.search.total = undefined;\n return $q.when();\n }\n\n $scope.search.loading = true;\n $scope.search.type = 'text';\n return csWot.search(text)\n .then(function(idties){\n if ($scope.search.type != 'text') return; // could have change\n if ($scope.search.text.trim() !== text) return; // search text has changed before received response\n\n if ((!idties || !idties.length) && (BMA.regexp.PUBKEY.test(text) || BMA.regexp.PUBKEY_WITH_CHECKSUM.test(text))) {\n return BMA.uri.parse(text)\n .then(function(data) {\n $scope.doDisplayResult([data]);\n });\n }\n else {\n $scope.doDisplayResult(idties);\n\n // count, skipping divider\n var countBy = _.countBy(idties, function(hit) {\n return hit.divider && 'divider' || 'results';\n });\n $scope.search.total = countBy && countBy.results || 0;\n }\n })\n .catch(UIUtils.onError('ERROR.WOT_LOOKUP_FAILED'));\n };\n\n $scope.doGetNewcomers = function(offset, size, skipLocationUpdate) {\n offset = offset || 0;\n size = size || defaultSearchLimit;\n if (size < defaultSearchLimit) size = defaultSearchLimit;\n\n $scope.hideActionsPopover();\n $scope.search.loading = (offset === 0);\n $scope.search.type = 'newcomers';\n\n // Update location href\n if (!offset && !skipLocationUpdate) {\n $scope.updateLocationHref();\n }\n\n return csWot.newcomers(offset, size)\n .then(function(res){\n if ($scope.search.type !== 'newcomers') return false; // could have change\n $scope.doDisplayResult(res && res.hits, offset, size, res && res.total);\n return true;\n })\n .catch(function(err) {\n $scope.search.loading = false;\n $scope.search.results = (offset > 0) ? $scope.search.results : [];\n $scope.search.hasMore = false;\n $scope.search.total = undefined;\n UIUtils.onError('ERROR.LOAD_NEWCOMERS_FAILED')(err);\n });\n };\n\n $scope.doGetPending = function(offset, size, skipLocationUpdate) {\n offset = offset || 0;\n size = size || defaultSearchLimit;\n if (size < defaultSearchLimit) size = defaultSearchLimit;\n\n $scope.hideActionsPopover();\n $scope.search.loading = (offset === 0);\n $scope.search.type = 'pending';\n\n var searchFunction = csCurrency.data.initPhase ?\n csWot.all :\n csWot.pending;\n\n // Update location href\n if (!offset && !skipLocationUpdate) {\n $scope.updateLocationHref();\n }\n\n return searchFunction(offset, size)\n .then(function(res){\n if ($scope.search.type != 'pending') return false; // could have change\n $scope.doDisplayResult(res && res.hits, offset, size, res && res.total);\n // Always disable \"more\" on initphase\n $scope.search.hasMore = !csCurrency.data.initPhase && $scope.search.hasMore;\n return true;\n })\n .catch(function(err) {\n $scope.search.loading = false;\n $scope.search.results = (offset > 0) ? $scope.search.results : [];\n $scope.search.total = undefined;\n $scope.search.hasMore = false;\n UIUtils.onError('ERROR.LOAD_PENDING_FAILED')(err);\n });\n };\n\n $scope.doGetWallets = function(offset, size, skipLocationUpdate) {\n offset = offset || 0;\n size = size || defaultSearchLimit;\n if (size < defaultSearchLimit) size = defaultSearchLimit;\n\n $scope.hideActionsPopover();\n $scope.search.loading = (offset === 0);\n $scope.search.type = 'wallets';\n\n // Update location href\n if (!offset && !skipLocationUpdate) {\n $scope.updateLocationHref();\n }\n\n return csWallet.children.all()\n .then(function(children) {\n if (!children || $scope.search.type != 'wallets') return false; // could have change\n var res = [csWallet].concat(children).reduce(function(res, wallet, index) {\n var item = {\n id: index,\n pubkey: wallet.data.pubkey,\n uid: wallet.data.uid,\n name: wallet.data.localName || wallet.data.name,\n avatar: wallet.data.avatar\n };\n return res.concat(item);\n }, []);\n\n $scope.doDisplayResult(res, offset, size, res.length);\n $scope.search.hasMore = false;\n return true;\n });\n\n\n };\n\n $scope.showMore = function() {\n var offset = $scope.search.results ? $scope.search.results.length : 0;\n\n $scope.search.loadingMore = true;\n var searchFunction = ($scope.search.type == 'newcomers') ?\n $scope.doGetNewcomers :\n $scope.doGetPending;\n\n return searchFunction(offset)\n .then(function(ok) {\n if (ok) {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n }\n })\n .catch(function(err) {\n console.error(err);\n $scope.search.loadingMore = false;\n $scope.search.hasMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n $scope.select = function(item) {\n var state = item.state;\n\n // Identity\n if (!state && item.pubkey) {\n // identity = self -> open the user wallet\n state = csWallet.isUserPubkey(item.pubkey) ? 'app.view_wallet' : 'app.wot_identity';\n }\n\n if (state) {\n // Need to have a back button outside tabs\n $ionicHistory.nextViewOptions({\n historyRoot: false,\n disableAnimate: false,\n expire: 300\n });\n\n $state.go(state, item.stateParams||item);\n }\n };\n\n $scope.next = function() {\n // This method should be override by sub controller (e.g. modal controller)\n console.warn('Selected identities (should be override):', $scope.selection);\n };\n\n $scope.toggleCheck = function(index, e) {\n var identity = $scope.search.results[index];\n if (identity.checked) {\n $scope.addToSelection(identity);\n }\n else {\n $scope.removeSelection(identity, e);\n }\n };\n\n $scope.toggleSelect = function(identity){\n identity.selected = !identity.selected;\n };\n\n $scope.addToSelection = function(identity) {\n\n var copyIdty = angular.copy(identity);\n if (copyIdty.name) {\n copyIdty.name = copyIdty.name.replace('<em>', '').replace('</em>', ''); // remove highlight\n }\n\n $scope.selection.push(copyIdty);\n };\n\n $scope.removeSelection = function(identity, e) {\n\n // Remove from selection array\n var identityInSelection = _.findWhere($scope.selection, {id: identity.id});\n if (identityInSelection) {\n $scope.selection.splice($scope.selection.indexOf(identityInSelection), 1);\n }\n\n // Uncheck in result array, if exists\n if (!$scope.search.loading) {\n var existIdtyInResult = _.findWhere($scope.search.results, {id: identity.id});\n if (existIdtyInResult && existIdtyInResult.checked) {\n existIdtyInResult.checked = false;\n }\n }\n //e.preventDefault();\n };\n\n $scope.scanQrCode = function(){\n if (!Device.barcode.enable) {\n return;\n }\n Device.barcode.scan()\n .then(function(result) {\n if (!result) {\n return;\n }\n BMA.uri.parse(result)\n .then(function(obj){\n if (obj.pubkey) {\n $scope.search.text = obj.pubkey;\n }\n else if (result.uid) {\n $scope.search.text = obj.uid;\n }\n else {\n $scope.search.text = result;\n }\n $scope.doSearch();\n });\n })\n .catch(UIUtils.onError('ERROR.SCAN_FAILED'));\n };\n\n // Show help tip (show only not already shown)\n $scope.showHelpTip = function(index) {\n if (!$scope.isLogin()) return;\n index = angular.isDefined(index) ? index : csSettings.data.helptip.wotLookup;\n if (index < 0) return;\n if (index === 0) index = 1; // skip first step\n\n // Create a new scope for the tour controller\n var helptipScope = $scope.createHelptipScope();\n if (!helptipScope) return; // could be undefined, if a global tour already is already started\n\n return helptipScope.startWotLookupTour(index, false)\n .then(function(endIndex) {\n helptipScope.$destroy();\n csSettings.data.helptip.wotLookup = endIndex;\n csSettings.store();\n });\n };\n\n $scope.doDisplayResult = function(res, offset, size, total) {\n res = res || [];\n\n // pre-check result if already in selection\n if ($scope.allowMultiple && res.length && $scope.selection.length) {\n _.forEach($scope.selection, function(identity) {\n var identityInRes = _.findWhere(res, {id: identity.id});\n if (identityInRes) {\n identityInRes.checked = true;\n }\n });\n }\n\n if (!offset) {\n $scope.search.results = res || [];\n }\n else {\n $scope.search.results = $scope.search.results.concat(res);\n }\n $scope.search.total = angular.isDefined(total) ? total : undefined;\n $scope.search.loading = false;\n $scope.search.hasMore = $scope.search.results.length >= offset + size;\n\n $scope.smallscreen = UIUtils.screen.isSmall();\n\n if (!$scope.search.results.length) return;\n\n // Motion\n if (res.length > 0 && $scope.motion) {\n $scope.motion.show({selector: '.lookupForm .list .item', ink: true});\n }\n };\n\n /* -- show/hide popup -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'templates/wot/lookup_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n}\n\nfunction WotLookupModalController($scope, $controller, $focus, csWallet, parameters){\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('WotLookupCtrl', {$scope: $scope}));\n\n parameters = parameters || {};\n $scope.search.loading = false;\n $scope.enableFilter = angular.isDefined(parameters.enableFilter) ? parameters.enableFilter : false;\n $scope.enableWallets = angular.isDefined(parameters.enableWallets) ? (csWallet.isLogin() && csWallet.children.count() && parameters.enableWallets) : false;\n $scope.allowMultiple = angular.isDefined(parameters.allowMultiple) ? parameters.allowMultiple : false;\n $scope.parameters = parameters;\n $scope.showResultLabel = false;\n\n $scope.wotSearchTextId = 'wotSearchTextModal';\n\n if ($scope.allowMultiple && parameters.selection) {\n $scope.selection = parameters.selection;\n }\n\n var superEnter = $scope.enter;\n $scope.enter = function(e) {\n if ($scope.parameters && $scope.parameters.q) {\n $scope.search.text=$scope.parameters.q;\n if ($scope.parameters.q.trim().length > 2) {\n superEnter(e); // call enter, that launch the search\n }\n }\n };\n $scope.$on('modal.shown', $scope.enter);\n\n $scope.cancel = function(){\n $scope.closeModal();\n };\n\n $scope.select = function(identity){\n $scope.closeModal({\n pubkey: identity.pubkey,\n uid: identity.uid,\n name: identity.name && identity.name.replace(/<\\/?em>/ig, '')\n });\n };\n\n $scope.next = function() {\n $scope.closeModal($scope.selection);\n };\n\n $scope.updateLocationHref = function() {\n // Do NOT change location href\n };\n\n $scope.showHelpTip = function() {\n // silent\n };\n\n // removeIf(device)\n // Focus on search text (only if NOT device, to avoid keyboard opening)\n $focus($scope.wotSearchTextId);\n // endRemoveIf(device)\n}\n\n/**\n * Abtract controller that load identity, that expose some useful methods in $scope, like 'certify()'\n * @param $scope\n * @param $state\n * @param $timeout\n * @param UIUtils\n * @param Modals\n * @param csConfig\n * @param csWot\n * @param csWallet\n * @constructor\n */\nfunction WotIdentityAbstractController($scope, $rootScope, $state, $translate, $ionicHistory, $q,\n UIUtils, Modals, csConfig, csSettings, csCurrency, csWot, csWallet) {\n 'ngInject';\n\n $scope.formData = {\n hasSelf: true\n };\n $scope.disableCertifyButton = true;\n $scope.loading = true;\n\n $scope.$on('$ionicView.beforeEnter', function (event, viewData) {\n // Enable back button (workaround need for navigation outside tabs - https://stackoverflow.com/a/35064602)\n viewData.enableBack = UIUtils.screen.isSmall() ? true : viewData.enableBack;\n });\n\n $scope.load = function(pubkey, uid, options) {\n return csWot.load(pubkey, uid, options)\n .then(function(identity){\n if (!identity) return UIUtils.onError('ERROR.IDENTITY_NOT_FOUND')().then($scope.showHome);\n $scope.formData = identity;\n var isLogin = csWallet.isLogin();\n $scope.revoked = identity.requirements && (identity.requirements.revoked || identity.requirements.pendingRevocation);\n $scope.canCertify = identity.hasSelf && !$scope.revoked && (!isLogin || !csWallet.isUserPubkey(pubkey) || csWallet.children.count() > 0);\n $scope.canSelectAndCertify = identity.hasSelf && (csWallet.isUserPubkey(pubkey) || csWallet.children.hasPubkey(pubkey));\n var cert = isLogin && _.find((identity.received_cert||[]).concat(identity.received_cert_pending||[]), function (cert) {\n return cert.pubkey === csWallet.data.pubkey && cert.valid && cert.expiresIn > csSettings.data.timeWarningExpire;\n });\n $scope.alreadyCertified = (!$scope.canCertify || !isLogin || csWallet.children.count() > 0) ? false : !!cert;\n $scope.disableCertifyButton = $scope.alreadyCertified || $scope.revoked;\n $scope.loading = false;\n })\n .catch(function(err) {\n $scope.loading = false;\n UIUtils.onError('ERROR.LOAD_IDENTITY_FAILED')(err);\n });\n };\n\n\n $scope.doUpdate = function(silent) {\n if (!silent) {\n $scope.loading = true;\n UIUtils.loading.show();\n }\n var options = {\n cache: false, // No cache\n blockUid: $scope.formData.blockUid || undefined\n };\n return $scope.load($scope.formData.pubkey, $scope.formData.uid, options)\n .then(UIUtils.loading.hide);\n };\n\n // Certify the current identity\n $scope.certify = function() {\n\n // Select wallet, if many\n return (csWallet.children.count() ? Modals.showSelectWallet({displayBalance: false}) : $q.when(csWallet))\n .then(function(wallet) {\n if (!wallet) return; // user cancelled\n\n // Need user auth - fix #513\n return wallet.auth({minData: true})\n .then(function(walletData) {\n UIUtils.loading.hide();\n\n if (!csCurrency.data.initPhase && !walletData.isMember) {\n UIUtils.alert.error(walletData.requirements.needSelf ?\n 'ERROR.NEED_MEMBER_ACCOUNT_TO_CERTIFY' : 'ERROR.NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF');\n return;\n }\n\n if (!csCurrency.data.initPhase && !$scope.formData.hasSelf) {\n UIUtils.alert.error('ERROR.IDENTITY_TO_CERTIFY_HAS_NO_SELF');\n return;\n }\n\n // Check identity not expired\n if ($scope.formData.requirements.expired) {\n UIUtils.alert.error('ERROR.IDENTITY_EXPIRED');\n return;\n }\n\n // Check not already certified\n var previousCert = _.find($scope.formData.received_cert, function(cert) {\n return cert.pubkey === wallet.data.pubkey && cert.valid && cert.expiresIn > csSettings.data.timeWarningExpire;\n });\n if (previousCert) {\n $translate('ERROR.IDENTITY_ALREADY_CERTIFY', previousCert)\n .then(function(message) {\n UIUtils.alert.error(message, 'ERROR.UNABLE_TO_CERTIFY_TITLE');\n });\n return;\n }\n\n // Check no pending certification\n previousCert = _.findWhere($scope.formData.received_cert_pending, { pubkey: wallet.data.pubkey, valid: true});\n if (previousCert) {\n $translate('ERROR.IDENTITY_ALREADY_CERTIFY_PENDING', previousCert)\n .then(function(message) {\n UIUtils.alert.error(message, 'ERROR.UNABLE_TO_CERTIFY_TITLE');\n });\n return;\n }\n\n UIUtils.alert.confirm('CONFIRM.CERTIFY_RULES', 'CONFIRM.POPUP_SECURITY_WARNING_TITLE', {\n cssClass: 'warning',\n okText: 'WOT.BTN_YES_CERTIFY',\n okType: 'button-assertive'\n })\n .then(function(confirm){\n if (!confirm) {\n return;\n }\n UIUtils.loading.show();\n wallet.certify($scope.formData.uid,\n $scope.formData.pubkey,\n $scope.formData.blockUid || ($scope.formData.requirements && $scope.formData.requirements.meta && $scope.formData.requirements.meta.timestamp),\n $scope.formData.requirements && $scope.formData.requirements.meta && $scope.formData.requirements.meta.sig,\n $scope.formData.isMember,\n $scope.formData.wasMember)\n .then(function(cert) {\n UIUtils.loading.hide();\n if (cert) {\n $scope.prepareNewCert(wallet, cert);\n $scope.alreadyCertified = true;\n UIUtils.toast.show('INFO.CERTIFICATION_DONE');\n $scope.formData.received_cert_pending.unshift(cert);\n $scope.formData.requirements.pendingCertificationCount++;\n $scope.doMotion();\n }\n })\n .catch(UIUtils.onError('ERROR.SEND_CERTIFICATION_FAILED'));\n });\n })\n .catch(function(err) {\n if (err === 'CANCELLED') return;\n UIUtils.onError('ERROR.LOGIN_FAILED')(err);\n });\n });\n };\n\n // Select an identity and certify\n $scope.selectAndCertify = function() {\n\n // Select wallet, if many\n return (csWallet.children.count() ? Modals.showSelectWallet({displayBalance: false}) : $q.when(csWallet))\n .then(function(wallet) {\n // Need user auth - fix #513\n return wallet.auth({minData: true})\n .then(function (walletData) {\n if (!csCurrency.data.initPhase && !walletData.isMember) {\n UIUtils.alert.error(walletData.requirements.needSelf || walletData.requirements.needMembership ?\n 'ERROR.NEED_MEMBER_ACCOUNT_TO_CERTIFY' : 'ERROR.NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF');\n return;\n }\n UIUtils.loading.hide();\n // Open Wot lookup modal\n return Modals.showWotLookup();\n })\n .then(function (idty) {\n if (!idty || !idty.pubkey) {\n return; // cancelled\n }\n if (!idty.uid) { // not a member\n UIUtils.alert.error('ERROR.IDENTITY_TO_CERTIFY_HAS_NO_SELF');\n return;\n }\n\n UIUtils.loading.show();\n\n var options = {cache: false, blockUid: idty.blockUid};\n\n // load selected identity\n return csWot.load(idty.pubkey, idty.uid, options);\n })\n\n .then(function (identity) {\n if (!identity) return; // cancelled\n UIUtils.loading.hide();\n if (!identity || !identity.hasSelf) {\n UIUtils.alert.error('ERROR.IDENTITY_TO_CERTIFY_HAS_NO_SELF');\n return;\n }\n\n // Check identity not expired\n if (identity.requirements.expired) {\n UIUtils.alert.error('ERROR.IDENTITY_EXPIRED');\n return;\n }\n\n // Check not already certified\n var previousCert = _.findWhere(identity.received_cert, {pubkey: wallet.data.pubkey, valid: true});\n if (previousCert) {\n $translate('ERROR.IDENTITY_ALREADY_CERTIFY', previousCert)\n .then(function (message) {\n UIUtils.alert.error(message, 'ERROR.UNABLE_TO_CERTIFY_TITLE');\n });\n return;\n }\n\n // Check not pending certification\n previousCert = _.findWhere(identity.received_cert_pending, {pubkey: wallet.data.pubkey, valid: true});\n if (previousCert) {\n $translate('ERROR.IDENTITY_ALREADY_CERTIFY_PENDING', previousCert)\n .then(function (message) {\n UIUtils.alert.error(message, 'ERROR.UNABLE_TO_CERTIFY_TITLE');\n });\n return;\n }\n\n // Ask confirmation\n $translate('CONFIRM.CERTIFY_RULES_TITLE_UID', {uid: identity.uid})\n .then(function (confirmTitle) {\n return UIUtils.alert.confirm('CONFIRM.CERTIFY_RULES', confirmTitle);\n })\n .then(function (confirm) {\n if (!confirm) {\n return;\n }\n UIUtils.loading.show();\n\n // Send certification\n wallet.certify(identity.uid,\n identity.pubkey,\n identity.blockUid || (identity.requirements && identity.requirements.meta && identity.requirements.meta.timestamp),\n identity.requirements && identity.requirements.meta && identity.requirements.meta.sig,\n identity.isMember,\n identity.wasMember)\n .then(function (cert) {\n UIUtils.loading.hide();\n if (!cert) return;\n return csWot.extendAll([cert], 'pubkey')\n .then(function () {\n UIUtils.toast.show('INFO.CERTIFICATION_DONE');\n $scope.formData.given_cert_pending.unshift(cert);\n $scope.doMotion();\n });\n })\n .catch(UIUtils.onError('ERROR.SEND_CERTIFICATION_FAILED'));\n });\n })\n .catch(function (err) {\n if (err === 'CANCELLED') return;\n UIUtils.onError('ERROR.LOAD_IDENTITY_FAILED')(err);\n });\n });\n };\n\n // Add wallet's data to a new cert\n $scope.prepareNewCert = function(wallet, cert) {\n cert.uid = wallet.data.uid;\n cert.pubkey = wallet.data.pubkey;\n cert.isMember = wallet.data.isMember;\n cert.avatar = wallet.data.avatar;\n cert.name = wallet.data.name;\n };\n\n $scope.removeActionParamInLocationHref = function(state) {\n if (!state || !state.stateParams || !state.stateParams.action) return;\n\n var stateParams = angular.copy(state.stateParams);\n\n // Reset action param\n stateParams.action = null;\n\n // Update location href\n $ionicHistory.nextViewOptions({\n disableAnimate: true,\n disableBack: false,\n historyRoot: false\n });\n $state.go(state.stateName, stateParams,\n {\n reload: false,\n inherit: true,\n notify: false\n });\n };\n\n $scope.doAction = function(action, options) {\n if (action == 'certify') {\n return $scope.certify();\n }\n if (action == 'transfer') {\n $scope.showTransferModal(options);\n }\n };\n\n /* -- open screens -- */\n\n $scope.showCertifications = function() {\n var block = $scope.formData.requirements && $scope.formData.requirements.alternatives && $scope.formData.blockUid || undefined;\n // Warn: do not use a simple link here (a ng-click is mandatory for help tour)\n if (UIUtils.screen.isSmall() ) {\n $state.go('app.wot_cert', {\n pubkey: $scope.formData.pubkey,\n uid: $scope.formData.uid,\n type: 'received',\n block: block\n });\n }\n else {\n $state.go('app.wot_cert_lg', {\n pubkey: $scope.formData.pubkey,\n uid: $scope.formData.uid,\n block: block\n });\n }\n };\n\n $scope.showGivenCertifications = function() {\n var block = $scope.formData.requirements && $scope.formData.requirements.alternatives && $scope.formData.blockUid || undefined;\n // Warn: do not use a simple link here (a ng-click is mandatory for help tour)\n if (UIUtils.screen.isSmall() ) {\n $state.go('app.wot_cert', {\n pubkey: $scope.formData.pubkey,\n uid: $scope.formData.uid,\n type: 'given',\n block: block\n });\n }\n else {\n $state.go('app.wot_cert_lg', {\n pubkey: $scope.formData.pubkey,\n uid: $scope.formData.uid,\n block: block\n });\n }\n };\n\n $scope.showSharePopover = function(event) {\n var title = $scope.formData.name || $scope.formData.uid || $scope.formData.pubkey;\n // Use shareBasePath (fix #530) or rootPath (fix #390)\n var url = (csConfig.shareBaseUrl || $rootScope.rootPath) + $state.href('app.wot_identity', {pubkey: $scope.formData.pubkey, uid: $scope.formData.uid});\n // Override default position, is small screen - fix #545\n if (UIUtils.screen.isSmall()) {\n event = angular.element(document.querySelector('#wot-share-anchor-'+$scope.formData.pubkey)) || event;\n }\n UIUtils.popover.share(event, {\n bindings: {\n url: url,\n titleKey: 'WOT.VIEW.POPOVER_SHARE_TITLE',\n titleValues: {title: title},\n postMessage: title\n }\n });\n };\n}\n\n/**\n * Identity view controller - should extend WotIdentityAbstractCtrl\n */\nfunction WotIdentityViewController($scope, $rootScope, $controller, $timeout, $state, UIUtils, Modals, csWallet) {\n 'ngInject';\n // Initialize the super class and extend it.\n angular.extend(this, $controller('WotIdentityAbstractCtrl', {$scope: $scope}));\n\n $scope.motion = UIUtils.motion.fadeSlideInRight;\n $scope.qrcodeId = 'qrcode-wot-' + $scope.$id;\n\n // Init likes here, to be able to use in extension\n $scope.options = $scope.options || {};\n $scope.options.like = {\n kinds: ['LIKE', 'ABUSE'],\n index: 'user',\n type: 'profile'\n };\n $scope.likeData = {\n likes: {},\n abuses: {}\n };\n\n $scope.$on('$ionicView.enter', function(e, state) {\n\n var onLoadSuccess = function() {\n $scope.doMotion();\n if (state.stateParams && state.stateParams.action) {\n $timeout(function() {\n $scope.doAction(state.stateParams.action.trim());\n }, 100);\n\n $scope.removeActionParamInLocationHref(state);\n\n // Need by like controller\n $scope.likeData.id = $scope.formData.pubkey;\n }\n\n $scope.showQRCode();\n };\n var options = {\n cache: true,\n blockUid: state.stateParams && state.stateParams.block || undefined\n };\n\n if (state.stateParams &&\n state.stateParams.pubkey &&\n state.stateParams.pubkey.trim().length > 0) {\n if ($scope.loading) { // load once\n\n return $scope.load(state.stateParams.pubkey.trim(), state.stateParams.uid, options)\n .then(onLoadSuccess)\n .catch(UIUtils.onError(\"ERROR.LOAD_IDENTITY_FAILED\"));\n }\n }\n\n else if (state.stateParams &&\n state.stateParams.uid &&\n state.stateParams.uid.trim().length > 0) {\n if ($scope.loading) { // load once\n return $scope.load(null, state.stateParams.uid, options)\n .then(onLoadSuccess);\n }\n }\n\n // Redirect to home\n else {\n $scope.showHome();\n }\n\n });\n\n $scope.doMotion = function() {\n $scope.motion.show({selector: '.view-identity .list .item'});\n\n // Transfer button\n $scope.showFab('fab-transfer');\n\n // Certify button\n if (($scope.canCertify && !$scope.alreadyCertified) || $rootScope.tour) {\n $scope.showFab('fab-certify-' + $scope.formData.uid);\n }\n\n $scope.$broadcast('$csExtension.motion');\n };\n\n $scope.doQuickFix = function(event) {\n if (event === 'showSelectIdentities') {\n return $scope.showSelectIdentities();\n }\n };\n\n $scope.showSelectIdentities = function() {\n if (!$scope.formData.requirements || !$scope.formData.requirements.alternatives) return;\n\n return Modals.showSelectPubkeyIdentity({\n identities: [$scope.formData.requirements].concat($scope.formData.requirements.alternatives)\n })\n .then(function(res) {\n if (!res || !res.pubkey) return; // Skip if cancelled\n // open the identity\n return $state.go('app.wot_identity', {\n pubkey: res.pubkey,\n uid: res.uid,\n block: res.meta && res.meta.timestamp || res.blockUid\n });\n });\n };\n\n $scope.showQRCode = function(timeout) {\n if (!$scope.qrcodeId || !$scope.formData.pubkey) return; // Skip\n\n // Get the DIV element\n var element = angular.element(document.querySelector('#' + $scope.qrcodeId + ' .content'));\n if (!element) {\n console.error(\"[wot-controller] Cannot found div #{0} for the QRCode. Skipping.\".format($scope.qrcodeId));\n return;\n }\n\n console.debug(\"[wot-controller] Generating QR code for identity...\");\n $timeout(function() {\n var svg = UIUtils.qrcode.svg($scope.formData.pubkey);\n element.html(svg);\n UIUtils.motion.toggleOn({selector: '#'+$scope.qrcodeId}, timeout || 1100);\n });\n };\n\n $scope.hideQRCode = function() {\n if (!$scope.qrcodeId) return;\n var element = angular.element(document.querySelector('#' + $scope.qrcodeId));\n if (element) {\n UIUtils.motion.toggleOff({selector: '#'+$scope.qrcodeId});\n }\n };\n}\n\n/**\n * Identity tx view controller\n */\nfunction WotIdentityTxViewController($scope, $timeout, $q, BMA, csSettings, csWot, csTx, UIUtils) {\n 'ngInject';\n\n $scope.formData= {};\n $scope.loading = true;\n $scope.motion = UIUtils.motion.fadeSlideInRight;\n\n $scope.$on('$ionicView.enter', function(e, state) {\n if ($scope.loading) {\n $scope.pubkey = state.stateParams.pubkey;\n $scope.uid = state.stateParams.uid;\n $scope.load();\n }\n else {\n // update view\n $scope.updateView();\n }\n });\n\n // Load data\n $scope.load = function(fromTime) {\n return $q.all([\n csWot.extend({pubkey: $scope.pubkey}),\n csTx.load($scope.pubkey, fromTime)\n ])\n .then(function(res) {\n $scope.formData = angular.merge(res[0], res[1]);\n $scope.loading = false;\n $scope.updateView();\n });\n };\n\n // Updating data\n $scope.doUpdate = function(silent) {\n console.debug('[wot] TX history reloading...');\n $scope.formData = {};\n return (silent ?\n $scope.load() :\n UIUtils.loading.show()\n .then($scope.load)\n .then(UIUtils.loading.hide)\n )\n .then($scope.updateView)\n .catch(UIUtils.onError('ERROR.IDENTITY_TX_FAILED'));\n };\n\n // Update view\n $scope.updateView = function() {\n $scope.$broadcast('$$rebind::balance'); // force rebind balance\n $scope.$broadcast('$$rebind::rebind'); // force rebind\n $scope.motion.show();\n };\n\n $scope.downloadHistoryFile = function(options) {\n options = options || {};\n options.fromTime = options.fromTime || -1; // default: full history\n csTx.downloadHistoryFile($scope.pubkey, options);\n };\n\n $scope.showMoreTx = function(fromTime) {\n\n fromTime = fromTime ||\n ($scope.formData.tx.fromTime - csSettings.data.walletHistoryTimeSecond) ||\n (moment().utc().unix() - 2 * csSettings.data.walletHistoryTimeSecond);\n\n UIUtils.loading.show();\n return csTx.load($scope.pubkey, fromTime)\n .then(function(res) {\n angular.merge($scope.formData, res);\n $scope.updateView();\n UIUtils.loading.hide();\n })\n .catch(function(err) {\n // If http rest limitation: wait then retry\n if (err.ucode == BMA.errorCodes.HTTP_LIMITATION) {\n $timeout(function() {\n return $scope.showMoreTx(fromTime);\n }, 2000);\n }\n else {\n UIUtils.onError('ERROR.IDENTITY_TX_FAILED')(err);\n }\n });\n };\n\n}\n\n\n/**\n * Certifications controller - extend WotIdentityAbstractCtrl\n */\nfunction WotCertificationsViewController($scope, $rootScope, $controller, csSettings, csWallet, UIUtils) {\n 'ngInject';\n\n var wallet;\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('WotIdentityAbstractCtrl', {$scope: $scope}));\n\n // Values overwritten in tab controller (for small screen)\n $scope.motions = {\n receivedCertifications: angular.copy(UIUtils.motion.fadeSlideIn),\n givenCertifications: angular.copy(UIUtils.motion.fadeSlideInRight),\n avatar: angular.copy(UIUtils.motion.fadeIn),\n };\n $scope.motions.receivedCertifications.enable = true;\n $scope.motions.givenCertifications.enable = true;\n $scope.motions.avatar.enable = true;\n\n $scope.$on('$ionicView.enter', function(e, state) {\n if (state.stateParams && state.stateParams.type) {\n $scope.motions.receivedCertifications.enable = (state.stateParams.type != 'given');\n $scope.motions.givenCertifications.enable = (state.stateParams.type == 'given');\n $scope.motions.avatar.enable = false;\n }\n\n // First load\n if ($scope.loading) {\n var options = {\n cache: true,\n blockUid: state.stateParams && state.stateParams.block || undefined\n };\n\n if (state.stateParams &&\n state.stateParams.pubkey &&\n state.stateParams.pubkey.trim().length > 0) {\n\n return $scope.load(state.stateParams.pubkey.trim(), state.stateParams.uid, options)\n .then(function () {\n $scope.doMotion();\n $scope.showHelpTip();\n });\n }\n\n else {\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n if (!wallet.isLogin()) {\n return $scope.showHome();\n }\n return $scope.load(wallet.data.pubkey, wallet.data.uid, options)\n .then(function () {\n $scope.doMotion();\n $scope.showHelpTip();\n });\n }\n }\n\n else {\n $scope.doMotion();\n }\n });\n\n $scope.$on('$ionicView.leave', function() {\n $scope.loading = true;\n });\n\n // Updating data\n $scope.doUpdate = function() {\n var options = {\n cache: false, // No cache\n blockUid: $scope.formData.blockUid || undefined\n };\n return $scope.load($scope.formData.pubkey, $scope.formData.uid, options)\n .then(function() {\n $scope.doMotion();\n $scope.showHelpTip();\n });\n };\n\n $scope.doMotion = function(skipItems) {\n\n // Motions received certifications part\n $scope.doMotionReceivedCertifications(0, skipItems);\n\n // Motion on avatar part\n if ($scope.motions.avatar.enable) {\n $scope.motions.avatar.show({selector: '.col-avatar .' + $scope.motions.avatar.ionListClass});\n }\n\n // Motion on given certification part\n $scope.doMotionGivenCertifications($scope.motions.receivedCertifications.enable ? 100 : 10, skipItems);\n };\n\n // Effects on received certifcations\n $scope.doMotionReceivedCertifications = function(timeout, skipItems) {\n if ($scope.motions.receivedCertifications.enable) {\n if (!skipItems) {\n $scope.motions.receivedCertifications.show({selector: '.list.certifications .item', timeout: timeout});\n }\n\n // Fab button\n if (($scope.canCertify && !$scope.alreadyCertified) || $rootScope.tour) {\n $scope.showFab('fab-certify', timeout);\n }\n }\n // If not enable, make sure to hide fab button\n else {\n // Hide fab button\n if ($scope.canCertify || $rootScope.tour) {\n $scope.hideFab('fab-certify', 0);\n }\n }\n };\n\n // Effects on given certifcations\n $scope.doMotionGivenCertifications = function(timeout, skipItems) {\n\n if ($scope.motions.givenCertifications.enable) {\n if (!skipItems) {\n $scope.motions.givenCertifications.show({selector: '.list.given-certifications .item', timeout: timeout});\n }\n // Fab button\n if ($scope.canSelectAndCertify || $rootScope.tour) {\n $scope.showFab('fab-select-certify');\n }\n }\n\n // If not enable, make sure to hide fab button\n else {\n // Hide fab button\n if ($scope.canSelectAndCertify || $rootScope.tour) {\n $scope.hideFab('fab-select-certify', 0);\n }\n }\n };\n\n // Show help tip\n $scope.showHelpTip = function() {\n if (!$scope.isLogin()) return;\n if (!csSettings.data.helptip.enable) return;\n\n // Create a new scope for the tour controller\n var helptipScope = $scope.createHelptipScope();\n if (!helptipScope) return; // could be undefined, if a global tour already is already started\n\n var isWallet = csWallet.isUserPubkey($scope.formData.pubkey);\n var index = isWallet ? csSettings.data.helptip.walletCerts : csSettings.data.helptip.wotCerts;\n if (index < 0) return;\n\n var startFunc = isWallet ?\n helptipScope.startWalletCertTour(index, false) :\n helptipScope.startWotCertTour(index, false);\n\n return startFunc.then(function(endIndex) {\n helptipScope.$destroy();\n if (isWallet) {\n csSettings.data.helptip.walletCerts = endIndex;\n }\n else {\n csSettings.data.helptip.wotCerts = endIndex;\n }\n csSettings.store();\n });\n };\n}\n\n\n/**\n * Select identities from a pubkey (useful when many self on the same pubkey)\n * @param $scope\n * @param $q\n * @param csWot\n * @param parameters\n * @constructor\n */\nfunction WotSelectPubkeyIdentityModalController($scope, $q, csWot, parameters) {\n\n $scope.loading = true;\n\n $scope.load = function() {\n // If list of identities given by parameters: use it\n if (parameters && parameters.identities) {\n $scope.identities = parameters.identities;\n $scope.pubkey = $scope.identities[0].pubkey;\n $scope.loading = false;\n return $q.when();\n }\n\n // Or load from pubkey\n $scope.pubkey = parameters && parameters.pubkey;\n if (!pubkey) {\n return $q.reject('Missing parameters: [pubkey] or [identities]');\n }\n\n return csWot.loadRequirements({pubkey: pubkey, uid: uid})\n .then(function(data) {\n if (data && data.requirements) {\n $scope.identities = data.requirements;\n if (data.requirements.alternatives) {\n $scope.identities = [data.requirements].concat(data.requirements.alternatives);\n }\n else {\n $scope.identities = [data.requirements];\n }\n }\n $scope.loading = false;\n });\n };\n $scope.$on('modal.shown', $scope.load);\n}\n","\nNetworkLookupController.$inject = ['$scope', '$state', '$location', '$ionicPopover', '$window', '$translate', 'BMA', 'UIUtils', 'csConfig', 'csSettings', 'csCurrency', 'csNetwork', 'csWot'];\nPeerViewController.$inject = ['$scope', '$q', '$window', '$state', 'UIUtils', 'csWot', 'BMA'];\nNetworkLookupModalController.$inject = ['$scope', '$controller', 'parameters'];\nNetworkLookupPopoverController.$inject = ['$scope', '$controller'];\nPeerInfoPopoverController.$inject = ['$scope', '$q', 'csSettings', 'csCurrency', 'csHttp', 'BMA'];\nangular.module('cesium.network.controllers', ['cesium.services'])\n\n.config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.network', {\n url: \"/network?type&expert\",\n cache: false, // fix #766\n views: {\n 'menuContent': {\n templateUrl: \"templates/network/view_network.html\",\n controller: 'NetworkLookupCtrl'\n }\n },\n data: {\n silentLocationChange: true\n }\n })\n\n .state('app.view_peer', {\n url: \"/network/peer/:server?ssl&tor\",\n cache: false,\n views: {\n 'menuContent': {\n templateUrl: \"templates/network/view_peer.html\",\n controller: 'PeerViewCtrl'\n }\n },\n data: {\n preferHttp: true // avoid HTTPS if config has httpsMode=clever\n }\n });\n}])\n\n.controller('NetworkLookupCtrl', NetworkLookupController)\n\n.controller('PeerViewCtrl', PeerViewController)\n\n.controller('NetworkLookupModalCtrl', NetworkLookupModalController)\n\n.controller('NetworkLookupPopoverCtrl', NetworkLookupPopoverController)\n\n.controller('PeerInfoPopoverCtrl', PeerInfoPopoverController)\n\n;\n\nfunction NetworkLookupController($scope, $state, $location, $ionicPopover, $window, $translate,\n BMA, UIUtils, csConfig, csSettings, csCurrency, csNetwork, csWot) {\n 'ngInject';\n\n $scope.networkStarted = false;\n $scope.ionItemClass = '';\n $scope.expertMode = csSettings.data.expertMode && !UIUtils.screen.isSmall();\n $scope.isHttps = ($window.location.protocol === 'https:');\n $scope.search = {\n text: '',\n loading: true,\n type: undefined,\n results: [],\n endpoint: null,\n bma: undefined,\n ssl: undefined,\n ws2p: undefined,\n sort : undefined,\n asc: true\n };\n $scope.compactMode = true;\n $scope.listeners = [];\n $scope.helptipPrefix = 'helptip-network';\n $scope.enableLocationHref = true; // can be overrided by sub-controller (e.g. popup)\n\n $scope.removeListeners = function() {\n if ($scope.listeners.length) {\n console.debug(\"[network] Closing listeners\");\n _.forEach($scope.listeners, function(remove){\n remove();\n });\n $scope.listeners = [];\n }\n };\n\n /**\n * Enter in view\n */\n $scope.enter = function(e, state) {\n if ($scope.networkStarted) return;\n $scope.networkStarted = true;\n $scope.search.loading = true;\n csCurrency.get()\n .then(function (currency) {\n if (currency) {\n var isDefaultNode = BMA.node.same(currency.node);\n $scope.node = isDefaultNode ? BMA :\n BMA.instance(currency.node.host, currency.node.port);\n if (state && state.stateParams) {\n if (state.stateParams.type && ['mirror', 'member', 'offline'].indexOf(state.stateParams.type) != -1) {\n $scope.search.type = state.stateParams.type;\n }\n if (state.stateParams.expert) {\n $scope.expertMode = (state.stateParams.expert == 'true');\n }\n }\n $scope.load();\n }\n })\n .catch(function(err) {\n UIUtils.onError('ERROR.GET_CURRENCY_FAILED')(err);\n $scope.networkStarted = false;\n });\n };\n $scope.$on('$ionicParentView.enter', $scope.enter);\n\n /**\n * Leave the view\n */\n $scope.leave = function() {\n // Close node, if not the default BMA\n if ($scope.node !== BMA) {\n $scope.node.close();\n }\n if (!$scope.networkStarted) return;\n $scope.removeListeners();\n csNetwork.close();\n $scope.networkStarted = false;\n $scope.search.loading = true;\n };\n $scope.$on('$ionicView.beforeLeave', $scope.leave);\n $scope.$on('$ionicParentView.beforeLeave', $scope.leave);\n $scope.$on('$destroy', $scope.leave);\n\n\n $scope.computeOptions = function() {\n var options = {\n filter: {\n member: (!$scope.search.type || $scope.search.type === 'member'),\n mirror: (!$scope.search.type || $scope.search.type === 'mirror'),\n endpoint : (angular.isDefined($scope.search.endpoint) ? $scope.search.endpoint : null),\n bma : $scope.search.bma,\n ssl : $scope.search.ssl,\n ws2p : $scope.search.ws2p,\n online: !($scope.search.type && $scope.search.type === 'offline')\n },\n sort: {\n type : $scope.search.sort,\n asc : $scope.search.asc\n },\n expertMode: $scope.expertMode,\n // larger timeout when on expert mode\n timeout: csConfig.timeout && ($scope.expertMode ? (csConfig.timeout / 10) : (csConfig.timeout / 100))\n };\n return options;\n };\n\n $scope.load = function() {\n\n if ($scope.search.loading){\n // Start network scan\n csNetwork.start($scope.node, $scope.computeOptions());\n\n // Catch event on new peers\n $scope.refreshing = false;\n $scope.listeners.push(\n csNetwork.api.data.on.changed($scope, function(data){\n if (!$scope.refreshing) {\n $scope.refreshing = true;\n csWot.extendAll(data.peers)\n .then(function() {\n // Avoid to refresh if view has been leaving\n if ($scope.networkStarted) {\n $scope.updateView(data);\n }\n $scope.refreshing = false;\n });\n }\n }));\n }\n\n // Show help tip\n $scope.showHelpTip();\n };\n\n $scope.updateView = function(data) {\n console.debug(\"[peers] Updating UI\");\n $scope.$broadcast('$$rebind::rebind'); // force data binding\n $scope.search.results = data.peers;\n $scope.search.memberPeersCount = data.memberPeersCount;\n // Always tru if network not started (e.g. after leave+renter the view)\n $scope.search.loading = !$scope.networkStarted || csNetwork.isBusy();\n if (!$scope.loading) {\n $scope.$broadcast('$$rebind::rebind'); // force data binding\n }\n if ($scope.motion && $scope.search.results && $scope.search.results.length > 0) {\n $scope.motion.show({selector: '.item-peer'});\n }\n };\n\n $scope.refresh = function() {\n // Network\n $scope.search.loading = true;\n csNetwork.loadPeers();\n };\n\n $scope.sort = function() {\n $scope.search.loading = true;\n $scope.refreshing = true;\n csNetwork.sort($scope.computeOptions());\n $scope.updateView(csNetwork.data);\n };\n\n $scope.toggleSearchType = function(type){\n $scope.hideActionsPopover();\n if ($scope.search.type === type || type === 'none') {\n $scope.search.type = undefined;\n }\n else {\n $scope.search.type = type;\n }\n csNetwork.close();\n $scope.search.loading = true;\n $scope.load();\n\n // Update location href\n if ($scope.enableLocationHref) {\n $location.search({type: $scope.search.type}).replace();\n }\n };\n\n $scope.toggleSearchEndpoint = function(endpoint){\n $scope.hideActionsPopover();\n if ($scope.search.endpoint === endpoint || endpoint === null) {\n $scope.search.endpoint = null;\n }\n else {\n $scope.search.endpoint = endpoint;\n }\n $scope.sort();\n };\n\n $scope.toggleSort = function(sort){\n if ($scope.search.sort === sort && !$scope.search.asc) {\n $scope.search.asc = undefined;\n $scope.search.sort = undefined;\n }\n else {\n $scope.search.asc = ($scope.search.sort === sort) ? !$scope.search.asc : true;\n $scope.search.sort = sort;\n }\n $scope.sort();\n };\n\n $scope.toggleCompactMode = function() {\n $scope.compactMode = !$scope.compactMode;\n $scope.$broadcast('$$rebind::rebind'); // force data binding\n };\n\n $scope.selectPeer = function(peer) {\n if (peer.compacted && $scope.compactMode) {\n $scope.toggleCompactMode();\n return;\n }\n\n // Skip offline or not a BMA peer\n if (!peer.online || !peer.hasBma()) return;\n\n var stateParams = {server: peer.getServer()};\n if (peer.isSsl()) {\n stateParams.ssl = true;\n }\n if (peer.isTor()) {\n stateParams.tor = true;\n }\n $state.go('app.view_peer', stateParams);\n };\n\n $scope.$on('csView.action.refresh', function(event, context) {\n if (context === 'peers') {\n $scope.refresh();\n }\n });\n\n $scope.$on('csView.action.showActionsPopover', function(event, clickEvent) {\n $scope.showActionsPopover(clickEvent);\n });\n\n /* -- popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'templates/network/lookup_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n $scope.showEndpointsPopover = function($event, peer, endpointName) {\n $event.preventDefault();\n $event.stopPropagation();\n\n var endpoints = peer.getEndpoints(endpointName);\n endpoints = (endpoints||[]).reduce(function(res, ep) {\n var bma = BMA.node.parseEndPoint(ep) || BMA.node.parseEndPoint(ep, endpointName);\n return res.concat({\n label: 'NETWORK.VIEW.NODE_ADDRESS',\n value: peer.getServer(bma) + (bma && bma.path||'')\n });\n }, []);\n if (!endpoints.length) return;\n\n // Call extension points\n UIUtils.popover.show($event, {\n templateUrl: 'templates/network/popover_endpoints.html',\n bindings: {\n titleKey: 'NETWORK.VIEW.ENDPOINTS.' + endpointName,\n items: endpoints\n }\n });\n };\n\n $scope.showWs2pPopover = function($event, peer) {\n $event.stopPropagation();\n\n return $translate('NETWORK.VIEW.PRIVATE_ACCESS')\n .then(function(privateAccessMessage) {\n UIUtils.popover.show($event, {\n templateUrl: 'templates/network/popover_endpoints.html',\n bindings: {\n titleKey: 'NETWORK.VIEW.ENDPOINTS.WS2P',\n valueKey: 'NETWORK.VIEW.NODE_ADDRESS',\n items: [\n {\n label: 'NETWORK.VIEW.NODE_ADDRESS',\n value: !peer.bma.private ? (peer.getServer() + (peer.bma.path||'')) : privateAccessMessage\n },\n {\n label: 'NETWORK.VIEW.WS2PID',\n value: peer.bma.ws2pid\n },\n {\n label: 'NETWORK.VIEW.POW_PREFIX',\n value: peer.powPrefix\n }]\n }\n });\n });\n };\n\n\n\n /* -- help tip -- */\n\n // Show help tip\n $scope.showHelpTip = function(index, isTour) {\n index = angular.isDefined(index) ? index : csSettings.data.helptip.network;\n isTour = angular.isDefined(isTour) ? isTour : false;\n if (index < 0) return;\n\n // Create a new scope for the tour controller\n var helptipScope = $scope.createHelptipScope();\n if (!helptipScope) return; // could be undefined, if a global tour already is already started\n helptipScope.tour = isTour;\n\n return helptipScope.startNetworkTour(index, false)\n .then(function(endIndex) {\n helptipScope.$destroy();\n if (!isTour) {\n csSettings.data.helptip.network = endIndex;\n csSettings.store();\n }\n });\n };\n}\n\n\nfunction NetworkLookupModalController($scope, $controller, parameters) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('NetworkLookupCtrl', {$scope: $scope}));\n\n // Read parameters\n parameters = parameters || {};\n $scope.enableFilter = angular.isDefined(parameters.enableFilter) ? parameters.enableFilter : true;\n $scope.search.type = angular.isDefined(parameters.type) ? parameters.type : $scope.search.type;\n $scope.search.endpoint = angular.isDefined(parameters.endpoint) ? parameters.endpoint : $scope.search.endpoint;\n $scope.search.bma = angular.isDefined(parameters.bma) ? parameters.bma : $scope.search.bma;\n $scope.search.ssl = angular.isDefined(parameters.ssl) ? parameters.ssl : $scope.search.ssl;\n $scope.search.ws2p = angular.isDefined(parameters.ws2p) ? parameters.ws2p : $scope.search.ws2p;\n $scope.expertMode = angular.isDefined(parameters.expertMode) ? parameters.expertMode : $scope.expertMode;\n $scope.ionItemClass = parameters.ionItemClass || 'item-border-large';\n $scope.enableLocationHref = false;\n $scope.helptipPrefix = '';\n\n $scope.selectPeer = function(peer) {\n $scope.closeModal(peer);\n };\n\n $scope.$on('modal.hidden', function(){\n $scope.leave();\n });\n\n // Disable this unsed method - called by load()\n $scope.showHelpTip = function() {};\n\n // Enter the modal\n $scope.enter();\n}\n\n\nfunction NetworkLookupPopoverController($scope, $controller) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('NetworkLookupCtrl', {$scope: $scope}));\n\n // Read parameters\n var parameters = parameters || {};\n $scope.enableFilter = angular.isDefined(parameters.enableFilter) ? parameters.enableFilter : true;\n $scope.search.type = angular.isDefined(parameters.type) ? parameters.type : $scope.search.type;\n $scope.search.endpoint = angular.isDefined(parameters.endpoint) ? parameters.endpoint : $scope.search.endpoint;\n $scope.expertMode = angular.isDefined(parameters.expertMode) ? parameters.expertMode : $scope.expertMode;\n $scope.ionItemClass = parameters.ionItemClass || 'item-border-large';\n $scope.helptipPrefix = '';\n\n $scope.selectPeer = function(peer) {\n $scope.closePopover(peer);\n };\n\n $scope.$on('popover.hidden', function(){\n $scope.leave();\n });\n\n // Disable this unsed method - called by load()\n $scope.showHelpTip = function() {};\n\n // Enter the popover\n $scope.enter();\n}\n\nfunction PeerInfoPopoverController($scope, $q, csSettings, csCurrency, csHttp, BMA) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.formData = {};\n\n $scope.load = function() {\n\n console.debug(\"[peer-popover] Loading peer info...\");\n $scope.loading = true;\n $scope.formData = {};\n\n return $q.all([\n // get current block\n csCurrency.blockchain.current()\n .then(function(block) {\n $scope.formData.number = block.number;\n $scope.formData.medianTime = block.medianTime;\n $scope.formData.powMin = block.powMin;\n $scope.formData.useSsl = BMA.useSsl;\n })\n .catch(function() {\n delete $scope.formData.number;\n delete $scope.formData.medianTime;\n delete $scope.formData.powMin;\n delete $scope.formData.useSsl;\n // continue\n }),\n\n // Get node current version\n BMA.node.summary()\n .then(function(res){\n $scope.formData.version = res && res.duniter && res.duniter.version;\n $scope.formData.software = res && res.duniter && res.duniter.software;\n })\n .catch(function() {\n delete $scope.formData.version;\n delete $scope.formData.software;\n // continue\n }),\n\n // Get latest version\n BMA.version.latest()\n .then(function(latestRelease){\n $scope.formData.latestRelease = latestRelease;\n })\n .catch(function() {\n delete $scope.formData.latestRelease;\n // continue\n })\n ])\n .then(function() {\n // Compare, to check if newer\n if ($scope.formData.latestRelease && $scope.formData.software == 'duniter') {\n var compare = csHttp.version.compare($scope.formData.version, $scope.formData.latestRelease.version);\n $scope.formData.isPreRelease = compare > 0;\n $scope.formData.hasNewRelease = compare < 0;\n }\n else {\n $scope.formData.isPreRelease = false;\n $scope.formData.hasNewRelease = false;\n }\n $scope.loading = false;\n $scope.$broadcast('$$rebind::rebind'); // force data binding\n });\n };\n\n // Update UI on new block\n csCurrency.api.data.on.newBlock($scope, function(block) {\n if ($scope.loading) return;\n console.debug(\"[peer info] Received new block. Reload content\");\n $scope.load();\n });\n\n // Update UI on settings changed\n csSettings.api.data.on.changed($scope, function(data) {\n if ($scope.loading) return;\n console.debug(\"[peer info] Peer settings changed. Reload content\");\n $scope.load();\n });\n\n // Load data when enter\n $scope.load();\n}\n\nfunction PeerViewController($scope, $q, $window, $state, UIUtils, csWot, BMA) {\n 'ngInject';\n\n $scope.node = {};\n $scope.loading = true;\n $scope.isHttps = ($window.location.protocol === 'https:');\n $scope.isReachable = true;\n\n $scope.$on('$ionicView.beforeEnter', function (event, viewData) {\n // Enable back button (workaround need for navigation outside tabs - https://stackoverflow.com/a/35064602)\n viewData.enableBack = UIUtils.screen.isSmall() ? true : viewData.enableBack;\n });\n\n $scope.$on('$ionicView.enter', function(e, state) {\n var isDefaultNode = !state.stateParams || !state.stateParams.server;\n var server = state.stateParams && state.stateParams.server || BMA.server;\n var useSsl = state.stateParams && state.stateParams.ssl == \"true\" || (isDefaultNode ? BMA.useSsl : false);\n var useTor = state.stateParams.tor == \"true\" || (isDefaultNode ? BMA.useTor : false);\n\n return $scope.load(server, useSsl, useTor)\n .then(function() {\n return $scope.$broadcast('$csExtension.enter', e, state);\n })\n .then(function(){\n $scope.loading = false;\n })\n .catch(function() {\n $scope.loading = false;\n });\n });\n\n $scope.load = function(server, useSsl, useTor) {\n var node = {\n server: server,\n host: server,\n useSsl: useSsl,\n useTor: useTor\n };\n var serverParts = server.split(':');\n if (serverParts.length === 2) {\n node.host = serverParts[0];\n node.port = serverParts[1];\n }\n\n angular.merge($scope.node,\n useTor ?\n // For TOR, use a web2tor to access the endpoint\n BMA.lightInstance(node.host + \".to\", 443, true/*ssl*/, 60000 /*long timeout*/) :\n BMA.lightInstance(node.host, node.port, node.useSsl),\n node);\n\n $scope.isReachable = !$scope.isHttps || useSsl;\n if (!$scope.isReachable) {\n // Get node from the default BMA node\n return BMA.network.peers()\n .then(function(res) {\n // find the current peer\n var peers = (res && res.peers || []).reduce(function(res, json) {\n var peer = new Peer(json);\n return (peer.getEndpoints('BASIC_MERKLED_API') || []).reduce(function(res, ep) {\n var bma = BMA.node.parseEndPoint(ep);\n if((bma.dns === node.host || bma.ipv4 === node.host || bma.ipv6 === node.host) && (\n bma.port == node.port)) {\n peer.bma = bma;\n return res.concat(peer);\n }\n return res;\n }, res);\n }, []);\n var peer = peers.length && peers[0];\n\n // Current node found\n if (peer) {\n $scope.node.pubkey = peer.pubkey;\n $scope.node.currency = peer.currency;\n return csWot.extend($scope.node);\n }\n else {\n console.warn('Could not get peer from /network/peers');\n }\n });\n }\n\n return $q.all([\n\n // Get node peer info\n $scope.node.network.peering.self()\n .then(function(json) {\n $scope.node.pubkey = json.pubkey;\n $scope.node.currency = json.currency;\n })\n .catch(function(err){\n console.error(err && err.message || err);\n }),\n\n // Get known peers\n $scope.node.network.peers()\n .then(function(json) {\n var peers = (json && json.peers || []).map(function (p) {\n var peer = new Peer(p);\n peer.online = p.status === 'UP';\n peer.buid = peer.block;\n peer.blockNumber = peer.buid && peer.buid.split('-')[0];\n peer.dns = peer.getDns();\n peer.id = peer.keyID();\n peer.server = peer.getServer();\n return peer;\n });\n\n // Extend (add uid+name+avatar)\n return csWot.extendAll([$scope.node].concat(peers))\n .then(function() {\n // Final sort\n $scope.peers = _.sortBy(peers, function(p) {\n var score = 1;\n score += 10000 * (p.online ? 1 : 0);\n score += 1000 * (p.hasMainConsensusBlock ? 1 : 0);\n score += 100 * (p.uid ? 1 : 0);\n return -score;\n });\n $scope.motion.show({selector: '.item-peer'});\n });\n }),\n\n // Get current block\n $scope.node.blockchain.current()\n .then(function(json) {\n $scope.current = json;\n })\n ])\n .catch(function(err) {\n console.error(err && err.message || err);\n UIUtils.onError(useTor ? \"PEER.VIEW.ERROR.LOADING_TOR_NODE_ERROR\" : \"PEER.VIEW.ERROR.LOADING_NODE_ERROR\")(err);\n throw err;\n });\n };\n\n $scope.selectPeer = function(peer) {\n // Skipp offline or WS2P node\n if (!peer.online || peer.isWs2p()) return;\n\n var stateParams = {server: peer.getServer()};\n if (peer.isSsl()) {\n stateParams.ssl = true;\n }\n if (peer.isTor()) {\n stateParams.tor = true;\n }\n $state.go('app.view_peer', stateParams);\n };\n\n /* -- manage link to raw document -- */\n\n $scope.openRawPeering = function(event) {\n return $scope.openLink(event, $scope.node.url + '/network/peering');\n };\n\n $scope.openRawCurrentBlock = function(event) {\n return $scope.openLink(event, $scope.node.url + '/blockchain/current');\n };\n}\n","\nCurrencyViewController.$inject = ['$scope', '$q', '$timeout', '$ionicPopover', 'Modals', 'BMA', 'UIUtils', 'csSettings', 'csCurrency', 'csNetwork', 'ModalUtils'];\nCurrencyLicenseModalController.$inject = ['$scope', '$http', 'UIUtils', 'csSettings', 'FileSaver'];\nangular.module('cesium.currency.controllers', ['ngFileSaver', 'cesium.services'])\n\n.config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.currency', {\n url: \"/currency\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/currency/view_currency.html\",\n controller: 'CurrencyViewCtrl'\n }\n },\n data: {\n large: 'app.currency_lg'\n }\n })\n\n .state('app.currency.tab_parameters', {\n url: \"/parameters\",\n views: {\n 'tab-parameters': {\n templateUrl: \"templates/currency/tabs/tab_parameters.html\"\n }\n }\n })\n\n .state('app.currency.tab_wot', {\n url: \"/community\",\n views: {\n 'tab-wot': {\n templateUrl: \"templates/currency/tabs/tab_wot.html\"\n }\n }\n })\n\n .state('app.currency.tab_network', {\n url: \"/network\",\n views: {\n 'tab-network': {\n templateUrl: \"templates/currency/tabs/tab_network.html\",\n controller: 'NetworkLookupCtrl'\n }\n }\n })\n\n .state('app.currency.tab_blocks', {\n url: \"/blocks\",\n views: {\n 'tab-blocks': {\n templateUrl: \"templates/currency/tabs/tab_blocks.html\",\n controller: 'BlockLookupCtrl'\n }\n }\n })\n\n .state('app.currency_lg', {\n url: \"/currency/lg\",\n cache: false,\n views: {\n 'menuContent': {\n templateUrl: \"templates/currency/view_currency_lg.html\",\n controller: 'CurrencyViewCtrl'\n }\n }\n })\n ;\n\n}])\n\n .controller('CurrencyViewCtrl', CurrencyViewController)\n\n .controller('CurrencyLicenseModalCtrl', CurrencyLicenseModalController)\n;\n\nfunction CurrencyViewController($scope, $q, $timeout, $ionicPopover, Modals, BMA, UIUtils, csSettings, csCurrency, csNetwork, ModalUtils) {\n 'ngInject';\n\n $scope.formData = {\n useRelative: false, // Override in enter()\n currency: '',\n M: 0,\n MoverN: 0,\n UD: 0,\n cactual: 0,\n c: 0,\n dt: 0,\n sigQty: 0,\n sigStock: 0,\n msWindow: 0,\n msValidity: 0,\n sigWindow: 0,\n sigValidity: 0,\n sigPeriod: 0,\n medianTime : 0,\n difficulty : 0,\n Nprev: 0,\n stepMax: 0,\n sentries: 0,\n xpercent: 0,\n durationFromLastUD: 0,\n blockUid: null,\n dtReeval: 0,\n udReevalTime0: 0,\n allRules: angular.isDefined(csSettings.data.currency && csSettings.data.currency.allRules) ?\n csSettings.data.currency.allRules :\n csSettings.data.expertMode,\n allWotRules: angular.isDefined(csSettings.data.currency && csSettings.data.currency.allWotRules) ?\n csSettings.data.currency.allWotRules :\n csSettings.data.expertMode,\n licenseUrl: csSettings.getLicenseUrl()\n };\n $scope.loading = true;\n $scope.screen = UIUtils.screen;\n\n $scope.enter = function(e, state) {\n if ($scope.loading) { // run only once (first enter)\n $scope.formData.useRelative = csSettings.data.useRelative;\n csCurrency.get()\n .then($scope.load)\n .then(function() {\n // Show help tip, if login\n if ($scope.isLogin()) {\n $scope.showHelpTip();\n }\n })\n .catch(UIUtils.onError('ERROR.GET_CURRENCY_FAILED'));\n\n csNetwork.api.data.on.mainBlockChanged($scope, function(mainBlock) {\n if ($scope.loading) return;\n if ($scope.formData.blockUid !== mainBlock.buid) {\n console.debug(\"[currency] Updating parameters UI (new main block detected)\");\n $timeout($scope.load, 1000 /*waiting propagation to requested node*/);\n }\n });\n }\n // Notify extensions\n $scope.$broadcast('$csExtension.enter', state);\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.load = function() {\n // Load data from node\n var data = {}, M, lastUDTime, now = Date.now();\n return $q.all([\n\n // Get the currency parameters\n BMA.blockchain.parameters()\n .then(function(json){\n data.currency = json.currency;\n data.c = json.c;\n data.dt = json.dt;\n data.sigQty = json.sigQty;\n data.sigStock = json.sigStock;\n data.msWindow = json.msWindow;\n data.msValidity = json.msValidity;\n data.sigWindow = json.sigWindow;\n data.sigValidity = json.sigValidity;\n data.sigPeriod = json.sigPeriod;\n data.stepMax = json.stepMax;\n data.xpercent = json.xpercent;\n data.avgGenTime = json.avgGenTime;\n data.dtReeval = json.dtReeval;\n data.udTime0 = json.udTime0;\n data.udReevalTime0 = json.udReevalTime0;\n\n // Compat with Duniter < 1.0\n if (!data.dtReeval) {\n data.dtReeval = data.dt;\n }\n }),\n\n // Get the current block information\n csCurrency.blockchain.current()\n .then(function(block){\n M = block.monetaryMass;\n data.N = block.membersCount;\n data.medianTime = block.medianTime;\n data.difficulty = block.powMin;\n data.blockUid = [block.number, block.hash].join('-');\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 M = 0;\n data.N = 0;\n data.medianTime = moment().utc().unix();\n data.difficulty = 0;\n data.blockUid = null;\n return;\n }\n throw err;\n }),\n\n // Get the UD informations\n BMA.blockchain.stats.ud()\n .then(function(res){\n if (res.result.blocks.length) {\n var lastBlockWithUD = res.result.blocks[res.result.blocks.length - 1];\n return BMA.blockchain.block({ block: lastBlockWithUD })\n .then(function(block){\n data.currentUD = (block.unitbase > 0) ? block.dividend * Math.pow(10, block.unitbase) : block.dividend;\n lastUDTime = block.medianTime;\n data.Nprev = block.membersCount;\n });\n }\n // block #0\n else {\n lastUDTime=0;\n data.Nprev=0;\n return BMA.blockchain.parameters()\n .then(function(json){\n data.currentUD = json.ud0;\n });\n }\n })\n ])\n\n // Process loaded data\n .then(function(){\n var Mprev = M - data.currentUD * data.Nprev; // remove fresh money\n var MoverNprev = data.Nprev ? (Mprev / data.Nprev) : 0;\n data.cactual = MoverNprev ? 100 * data.currentUD / MoverNprev : 0;\n data.M = M;\n data.MoverN = data.Nprev ? ((Mprev ? Mprev : M/*need at currency start only*/) / data.Nprev) : 0;\n data.UD = data.currentUD;\n data.durationFromLastUD = lastUDTime ? data.medianTime - lastUDTime : 0;\n data.sentries = Math.ceil(Math.pow(data.N, 1/ data.stepMax));\n\n // Apply to formData\n angular.extend($scope.formData, data);\n\n console.debug(\"[currency] Parameters loaded in \" + (Date.now() - now) + 'ms' );\n $scope.loading = false;\n $scope.$broadcast('$$rebind::rebind'); // force bind of currency name\n\n // Set Ink\n UIUtils.ink();\n\n return UIUtils.loading.hide();\n })\n .catch(function(err) {\n $scope.loading = false;\n UIUtils.onError('ERROR.LOAD_PEER_DATA_FAILED')(err);\n });\n };\n\n $scope.refresh = function() {\n if ($scope.loading) return;\n\n $scope.loading= true;\n UIUtils.loading.show();\n\n // Load data\n return $scope.load()\n .then(function() {\n // Notify extensions\n $scope.$broadcast('csView.action.refresh', 'currency');\n });\n };\n\n $scope.refreshPeers = function() {\n $scope.$broadcast('csView.action.refresh', 'peers');\n return $q.when(); // need by 'ion-refresher'\n };\n\n $scope.showExtendActionsPopover = function(event) {\n $scope.$broadcast('csView.action.showActionsPopover', event);\n };\n\n $scope.onAllRulesChange = function() {\n csSettings.data.currency = csSettings.data.currency || {};\n if (csSettings.data.currency.allRules !== $scope.formData.allRules) {\n csSettings.data.currency.allRules = $scope.formData.allRules;\n csSettings.store();\n }\n };\n $scope.$watch('formData.allRules', $scope.onAllRulesChange);\n\n $scope.onAllWotRulesChange = function() {\n csSettings.data.currency = csSettings.data.currency || {};\n if (csSettings.data.currency.allWotRules !== $scope.formData.allWotRules) {\n csSettings.data.currency.allWotRules = $scope.formData.allWotRules;\n csSettings.store();\n }\n };\n $scope.$watch('formData.allWotRules', $scope.onAllWotRulesChange);\n\n /* -- help tip -- */\n\n\n $scope.startCurrencyTour = function() {\n $scope.hideActionsPopover();\n return $scope.showHelpTip(0, true);\n };\n\n $scope.showHelpTip = function(index, isTour) {\n index = angular.isDefined(index) ? index : csSettings.data.helptip.currency;\n isTour = angular.isDefined(isTour) ? isTour : false;\n if (index < 0) return;\n\n // Create a new scope for the tour controller\n var helptipScope = $scope.createHelptipScope(isTour);\n if (!helptipScope) return; // could be undefined, if a global tour already is already started\n helptipScope.tour = isTour;\n\n return helptipScope.startCurrencyTour(index, false)\n .then(function(endIndex) {\n helptipScope.$destroy();\n csSettings.data.helptip.currency = endIndex;\n csSettings.store();\n });\n };\n\n /* -- modals -- */\n\n $scope.showLicenseModal = function() {\n return ModalUtils.show('templates/currency/modal_license.html','CurrencyLicenseModalCtrl');\n };\n\n $scope.showHelpModal = function(helpAnchor) {\n Modals.showHelp({anchor: helpAnchor});\n };\n\n /* -- popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'templates/currency/popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n}\n\n\nfunction CurrencyLicenseModalController($scope, $http, UIUtils, csSettings, FileSaver) {\n 'ngInject';\n\n $scope.loading = true;\n\n $scope.load = function() {\n if ($scope.loading) {\n $scope.licenseUrl = csSettings.getLicenseUrl();\n // Use HTML in iframe, when original file is markdown (fix #538)\n if ($scope.licenseUrl && $scope.licenseUrl.substring($scope.licenseUrl.length - 3) != '.txt') {\n $scope.licenseUrlHtml = $scope.licenseUrl + '.html';\n $scope.licenseUrl = $scope.licenseUrl +'.txt';\n }\n $scope.loading = false;\n }\n };\n $scope.$on('modal.shown', $scope.load);\n\n $scope.downloadFile = function() {\n if (!$scope.licenseUrl) return;\n return $http.get($scope.licenseUrl)\n .success(function(data){\n var file = new Blob([data], {type: 'text/plain; charset=utf-8'});\n FileSaver.saveAs(file, 'license.txt');\n }).error(function(){\n UIUtils.onError('ERROR.GET_LICENSE_FILE_FAILED')();\n });\n\n };\n}\n","\nTransferController.$inject = ['$scope', '$controller', 'UIUtils'];\nTransferModalController.$inject = ['$scope', '$q', '$translate', '$timeout', '$filter', '$focus', 'Device', 'BMA', 'UIUtils', 'Modals', 'csWallet', 'csWot', 'csCurrency', 'csSettings', 'parameters'];angular.module('cesium.transfer.controllers', ['cesium.services', 'cesium.currency.controllers'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n $stateProvider\n\n .state('app.new_transfer', {\n cache: false,\n url: \"/transfer?amount&udAmount&comment&restPub&all&wallet\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wallet/new_transfer.html\",\n controller: 'TransferCtrl'\n }\n }\n })\n\n .state('app.new_transfer_pubkey_uid', {\n cache: false,\n url: \"/transfer/:pubkey/:uid?amount&udAmount&comment&restPub&all&wallet\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wallet/new_transfer.html\",\n controller: 'TransferCtrl'\n }\n }\n })\n\n .state('app.new_transfer_pubkey', {\n cache: false,\n url: \"/transfer/:pubkey?amount&udAmount&comment&restPub&all&wallet\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wallet/new_transfer.html\",\n controller: 'TransferCtrl'\n }\n }\n })\n ;\n }])\n\n .controller('TransferCtrl', TransferController)\n\n .controller('TransferModalCtrl', TransferModalController)\n;\n\nfunction TransferController($scope, $controller, UIUtils) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('TransferModalCtrl', {$scope: $scope, parameters: {}}));\n\n $scope.enter = function(e, state) {\n\n // Apply state parameters\n if (state && state.stateParams) {\n $scope.setParameters(state.stateParams);\n }\n\n // Load wallet\n return $scope.load()\n .then(UIUtils.loading.hide);\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.setForm = function(form) {\n $scope.form = form;\n };\n\n // override modal close\n $scope.closeModal = function() {\n return $scope.showHome();\n };\n}\n\nfunction TransferModalController($scope, $q, $translate, $timeout, $filter, $focus, Device, BMA, UIUtils, Modals,\n csWallet, csWot, csCurrency, csSettings, parameters) {\n 'ngInject';\n\n var\n wallet,\n minQuantitativeAmount = 0.01;\n\n $scope.convertedBalance = 0;\n $scope.formData = {\n destPub: null,\n amount: null,\n comment: null,\n useRelative: csSettings.data.useRelative,\n useComment: false,\n all: false,\n restPub: null,\n restAmount: null,\n walletId: null\n };\n $scope.udAmount = null;\n $scope.minAmount = minQuantitativeAmount;\n $scope.commentPattern = BMA.regexp.COMMENT;\n $scope.currency = csCurrency.data.name;\n $scope.loading = true;\n $scope.commentInputId = 'transferComment-' + $scope.$id;\n $scope.enableSelectWallet = true;\n\n // Define keyboard settings, to bind with model (If small screen AND mobile devices)\n $scope.smallscreen = angular.isDefined($scope.smallscreen) ? $scope.smallscreen : UIUtils.screen.isSmall();\n if ($scope.smallscreen || Device.enable) {\n $scope.digitKeyboardSettings = $scope.digitKeyboardSettings || Device.keyboard.digit.settings.bindModel(\n $scope,\n 'formData.amount',\n {\n decimal: true,\n decimalSeparator: '.',\n resizeContent:false\n });\n $scope.digitKeyboardVisible = false;\n }\n\n $scope.setParameters = function(parameters) {\n if (!parameters) return;\n if (parameters.pubkey) {\n $scope.formData.destPub = parameters.pubkey;\n }\n if (parameters.uid) {\n $scope.destUid = parameters.uid;\n $scope.destPub = '';\n }\n else {\n $scope.destUid = '';\n $scope.destPub = parameters.pubkey;\n }\n if (parameters.amount) {\n $scope.formData.amount = parameters.amount;\n $scope.formData.useRelative=false;\n }\n else if (parameters.udAmount) {\n $scope.formData.amount = parameters.udAmount;\n $scope.formData.useRelative=true;\n }\n if (parameters.comment) {\n $scope.formData.useComment=true;\n $scope.formData.comment = parameters.comment;\n }\n if (parameters.restPub || parameters.all) {\n $scope.restUid = '';\n $scope.restPub = parameters.restPub;\n $scope.formData.restPub = parameters.restPub;\n $scope.formData.all = true;\n }\n else {\n $scope.formData.all = false;\n }\n if (!parameters.wallet || parameters.wallet === \"default\") {\n $scope.formData.walletId = csWallet.id;\n }\n else {\n $scope.formData.walletId = parameters.wallet;\n }\n };\n // Read default parameters\n $scope.setParameters(parameters);\n\n $scope.load = function() {\n $scope.enableSelectWallet = csWallet.children.count() > 0;\n\n wallet = $scope.enableSelectWallet && ($scope.formData.walletId ? csWallet.children.get($scope.formData.walletId) : csWallet) || csWallet;\n if (!wallet.isDefault()) {\n console.debug(\"[transfer] Using wallet {\" + wallet.id + \"}\");\n }\n // Make to sure to load full wallet data (balance)\n return wallet.login({sources: true, silent: true})\n .then(function(data) {\n if (!wallet || $scope.$$destroyed) return; // user have cancelled before end of load\n $scope.walletData = data;\n $scope.formData.walletId = wallet.id;\n $scope.onUseRelativeChanged();\n $scope.onAmountChanged();\n\n $scope.$watch('walletData.balance', $scope.onAmountChanged, true);\n $scope.$watch('formData.amount', $scope.onAmountChanged, true);\n\n $scope.$watch('formData.useRelative', $scope.onUseRelativeChanged, true);\n $scope.$watch('walletData.balance', $scope.onUseRelativeChanged, true);\n\n UIUtils.ink({selector: '.modal-transfer .ink'});\n\n if (!$scope.destPub || $scope.destUid) {\n $scope.loading = false;\n }\n else {\n // Fill the uid from the pubkey\n return csWot.extend({pubkey: $scope.destPub})\n .then(function(res) {\n $scope.destUid = res && (res.name || res.uid);\n if ($scope.destUid) {\n $scope.destPub = '';\n }\n $scope.loading = false;\n });\n }\n })\n .catch(function(err){\n if (err === 'CANCELLED') return $scope.cancel(); // close the modal\n UIUtils.onError('ERROR.LOGIN_FAILED')(err);\n });\n };\n $scope.$on('modal.shown', $scope.load);\n\n $scope.cancel = function() {\n $scope.closeModal();\n wallet = null;\n };\n\n // When changing use relative UD\n $scope.onUseRelativeChanged = function() {\n $scope.currency = csCurrency.data.name;\n if ($scope.formData.useRelative) {\n $scope.convertedBalance = $scope.walletData.balance / csCurrency.data.currentUD;\n $scope.minAmount = minQuantitativeAmount / (csCurrency.data.currentUD / 100);\n } else {\n $scope.convertedBalance = $scope.walletData.balance / 100;\n $scope.minAmount = minQuantitativeAmount;\n }\n if ($scope.form && !$scope.loading) {\n $scope.form.$setPristine(true);\n }\n };\n\n $scope.onAmountChanged = function() {\n if ($scope.sending) return; // skip if sending TX\n\n var amount = $scope.formData.amount;\n if (amount && typeof amount === \"string\") {\n amount = parseFloat(amount.replace(new RegExp('[.,]'), '.'));\n }\n\n var valid = true;\n\n // Avoid amount less than the minimal - fix #373\n if (amount && amount < $scope.minAmount) {\n valid = false;\n $scope.form.amount.$error = $scope.form.amount.$error || {};\n $scope.form.amount.$error.min = true;\n }\n else if ($scope.form.amount && $scope.form.amount.$error && $scope.form.amount.$error.min){\n delete $scope.form.amount.$error.min;\n }\n\n // Avoid amount greater than the balance\n if (amount && amount > $scope.convertedBalance){\n $scope.form.$valid = false;\n $scope.form.amount.$invalid = true;\n $scope.form.amount.$error = $scope.form.amount.$error || {};\n $scope.form.amount.$error = {max: true};\n }\n else if ($scope.form.amount && $scope.form.amount.$error && $scope.form.amount.$error.max){\n delete $scope.form.amount.$error.max;\n }\n\n $scope.form.$valid = valid;\n if ($scope.form.amount) $scope.form.amount.$invalid = !valid;\n\n if (!valid || !$scope.formData.all || !amount) {\n $scope.formData.restAmount = undefined;\n }\n else {\n if ($scope.formData.useRelative) {\n $scope.formData.restAmount = $scope.walletData.balance - amount * csCurrency.data.currentUD;\n if ($scope.formData.restAmount < minQuantitativeAmount) {\n $scope.formData.restAmount = 0;\n }\n } else {\n $scope.formData.restAmount = $scope.walletData.balance - amount * 100;\n }\n }\n };\n\n $scope.doTransfer = function() {\n if ($scope.loading) return; // Skip\n\n $scope.form.$submitted=true;\n\n if(!$scope.form.$valid || !$scope.formData.destPub || !$scope.formData.amount) {\n return;\n }\n var amount = $scope.formData.amount;\n if (typeof amount === \"string\") {\n amount = parseFloat(amount.replace(new RegExp('[.,]'), '.'));\n }\n\n // Avoid multiple call\n if ($scope.sending) return;\n $scope.sending = true;\n\n var currentUD;\n return $q.all([\n // Make sure user is auth\n wallet.auth({silent: true}),\n\n // Get current UD\n csCurrency.currentUD()\n .then(function(res) {\n currentUD = res;\n }),\n\n // Hide digit keyboard\n $scope.hideDigitKeyboard(300)\n ])\n .then($scope.askTransferConfirm)\n .then(function(confirm){\n if (!confirm) {\n $scope.sending = false;\n return;\n }\n\n return UIUtils.loading.show()\n .then(function(){\n // convert amount\n if ($scope.formData.useRelative) {\n amount = currentUD * amount;\n }\n else {\n amount = amount.toFixed(2) * 100; // remove 2 decimals on quantitative mode\n }\n\n // convert comment: trim, then null if empty\n var comment = $scope.formData.comment && $scope.formData.comment.trim();\n if (comment && !comment.length) {\n comment = null;\n }\n var hasRest = $scope.formData.all && $scope.formData.restAmount > 0;\n if (hasRest) {\n return wallet.transferAll($scope.formData.destPub, amount, comment, $scope.formData.useRelative, $scope.formData.restPub);\n }\n else {\n return wallet.transfer($scope.formData.destPub, amount, comment, $scope.formData.useRelative);\n }\n })\n .then(function() {\n UIUtils.loading.hide();\n return $scope.closeModal(true);\n })\n .then(function(res) {\n $timeout(function() {\n $scope.sending = false;\n UIUtils.toast.show('INFO.TRANSFER_SENT');\n }, 500);\n return res;\n });\n })\n .catch(function(err) {\n $scope.sending = false;\n // Wallet auth cancelled by user\n if (err === 'CANCELLED') return;\n UIUtils.onError('ERROR.SEND_TX_FAILED')(err);\n });\n };\n\n $scope.askTransferConfirm = function() {\n return $translate(['COMMON.UD', 'COMMON.EMPTY_PARENTHESIS'])\n .then(function(translations) {\n var hasRest = $scope.formData.all && $scope.formData.restAmount > 0;\n return $translate(hasRest ? 'CONFIRM.TRANSFER_ALL' : 'CONFIRM.TRANSFER', {\n from: $scope.walletData.isMember ? $scope.walletData.uid : $filter('formatPubkey')($scope.walletData.pubkey),\n to: $scope.destUid || $scope.destPub,\n amount: $scope.formData.amount,\n unit: $scope.formData.useRelative ? translations['COMMON.UD'] : $filter('abbreviate')($scope.currency),\n comment: (!$scope.formData.comment || $scope.formData.comment.trim().length === 0) ? translations['COMMON.EMPTY_PARENTHESIS'] : $scope.formData.comment,\n restAmount: hasRest && $filter('formatAmount')($scope.formData.restAmount, {useRelative: $scope.formData.useRelative}),\n restTo: hasRest && ($scope.restUid || $scope.restPub)\n });\n })\n .then(UIUtils.alert.confirm);\n };\n\n $scope.addComment = function() {\n $scope.formData.useComment = true;\n // Focus on comment field\n // removeIf(device)\n if ($scope.commentInputId) {\n $timeout(function() {\n $focus($scope.commentInputId);\n }, 200);\n }\n // endRemoveIf(device)\n };\n\n /* -- modals -- */\n $scope.showWotLookupModal = function(formDataField) {\n\n formDataField = formDataField || 'destPub';\n\n // Hide numerical keyboard\n $scope.hideDigitKeyboard(0);\n\n return Modals.showWotLookup({enableWallets: true})\n .then(function(result){\n if (result) {\n if (formDataField === 'destPub') {\n $scope.destUid = result.uid;\n $scope.destPub = result.uid ? '' : result.pubkey;\n $scope.formData.destPub = result.pubkey;\n }\n else if (formDataField === 'restPub') {\n $scope.restUid = result.uid;\n $scope.restPub = result.uid ? '' : result.pubkey;\n $scope.formData.restPub = result.pubkey;\n }\n }\n });\n };\n\n $scope.showSelectWalletModal = function() {\n if (!$scope.enableSelectWallet) return;\n\n return Modals.showSelectWallet({\n useRelative: $scope.formData.useRelative,\n showDefault: true,\n showBalance: true\n })\n .then(function(newWallet) {\n if (!newWallet || (wallet && wallet.id === newWallet.id)) return;\n wallet = newWallet;\n $scope.walletData = wallet.data;\n console.debug(\"[transfer] Using wallet {\" + wallet.id + \"}\");\n $scope.onAmountChanged();\n });\n };\n\n /* -- popover -- */\n\n $scope.showUnitPopover = function($event) {\n UIUtils.popover.show($event, {\n templateUrl: 'templates/wallet/popover_unit.html',\n scope: $scope\n })\n .then(function(useRelative) {\n $scope.formData.useRelative = useRelative;\n });\n };\n\n /* -- keyboard -- */\n $scope.showDigitKeyboard = function() {\n // No keyboard settings, or already visible: skip\n if (!$scope.digitKeyboardSettings || $scope.digitKeyboardVisible) return;\n\n // Device enable: hide OS keyboard\n if (Device.enable) {\n\n // Hide device keyboard\n Device.keyboard.close();\n\n // Open the digit keyboard (with a delay)\n return $timeout(function() {\n $scope.digitKeyboardVisible = true;\n }, 200);\n }\n\n // Open the digit keyboard\n $scope.digitKeyboardVisible = true;\n return $q.when();\n };\n\n $scope.hideDigitKeyboard = function(timeout) {\n if (!$scope.digitKeyboardVisible) return $q.when();\n $scope.digitKeyboardVisible = false;\n return $timeout(function() {}, timeout||200);\n };\n}\n\n","\nSettingsController.$inject = ['$scope', '$q', '$window', '$ionicHistory', '$ionicPopup', '$timeout', '$translate', '$ionicPopover', 'UIUtils', 'Modals', 'BMA', 'csHttp', 'csConfig', 'csCurrency', 'csSettings', 'csPlatform'];\nangular.module('cesium.settings.controllers', ['cesium.services', 'cesium.currency.controllers'])\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.settings', {\n url: \"/settings\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/settings/settings.html\",\n controller: 'SettingsCtrl'\n }\n }\n })\n ;\n }])\n\n .controller('SettingsCtrl', SettingsController)\n;\n\nfunction SettingsController($scope, $q, $window, $ionicHistory, $ionicPopup, $timeout, $translate, $ionicPopover,\n UIUtils, Modals, BMA, csHttp, csConfig, csCurrency, csSettings, csPlatform) {\n 'ngInject';\n\n $scope.formData = angular.copy(csSettings.data);\n $scope.popupData = {}; // need for the node popup\n $scope.loading = true;\n $scope.nodePopup = {};\n $scope.bma = BMA;\n\n\n $scope.keepAuthIdleLabels = {\n /*0: {\n labelKey: 'SETTINGS.KEEP_AUTH_OPTION.NEVER'\n },*/\n 10: {\n labelKey: 'SETTINGS.KEEP_AUTH_OPTION.SECONDS',\n labelParams: {value: 10}\n },\n 30: {\n labelKey: 'SETTINGS.KEEP_AUTH_OPTION.SECONDS',\n labelParams: {value: 30}\n },\n 60: {\n labelKey: 'SETTINGS.KEEP_AUTH_OPTION.MINUTE',\n labelParams: {value: 1}\n },\n 600: {\n labelKey: 'SETTINGS.KEEP_AUTH_OPTION.MINUTES',\n labelParams: {value: 10}\n },\n 3600: {\n labelKey: 'SETTINGS.KEEP_AUTH_OPTION.HOUR',\n labelParams: {value: 1}\n },\n 9999: {\n labelKey: 'SETTINGS.KEEP_AUTH_OPTION.ALWAYS'\n }\n };\n $scope.keepAuthIdles = _.keys($scope.keepAuthIdleLabels);\n\n $scope.blockValidityWindowLabels = {\n 0: {\n labelKey: 'SETTINGS.BLOCK_VALIDITY_OPTION.NONE'\n },\n 6: {\n labelKey: 'SETTINGS.BLOCK_VALIDITY_OPTION.N',\n labelParams: {count: 6, time: undefined /*defined in enter*/}\n },\n 12: {\n labelKey: 'SETTINGS.BLOCK_VALIDITY_OPTION.N',\n labelParams: {count: 12, time: undefined /*defined in enter*/}\n },\n 24: {\n labelKey: 'SETTINGS.BLOCK_VALIDITY_OPTION.N',\n labelParams: {count: 24, time: undefined /*defined in enter*/}\n }\n };\n $scope.blockValidityWindows = _.keys($scope.blockValidityWindowLabels);\n\n $scope.$on('$ionicView.enter', function() {\n $q.all([\n csSettings.ready(),\n csCurrency.parameters()\n .catch(function(err) {\n // Continue (will use default value)\n // Make sure to continue even if node is down - Fix #788\n })\n .then(function(parameters) {\n var avgGenTime = parameters && parameters.avgGenTime;\n if (!avgGenTime || avgGenTime < 0) {\n console.warn(\"[settings] Could not not currency parameters. Using default G1 'avgGenTime' (300s)\");\n avgGenTime = 300; /* = G1 value = 5min */\n }\n _.each($scope.blockValidityWindows, function(blockCount) {\n if (blockCount > 0) {\n $scope.blockValidityWindowLabels[blockCount].labelParams.time = avgGenTime * blockCount;\n }\n });\n })\n ])\n .then($scope.load);\n });\n\n $scope.setPopupForm = function(popupForm) {\n $scope.popupForm = popupForm;\n };\n\n $scope.load = function() {\n $scope.loading = true; // to avoid the call of csWallet.store()\n\n // Fill locales\n $scope.locales = angular.copy(csSettings.locales);\n\n // Apply settings\n angular.merge($scope.formData, csSettings.data);\n\n // Make sure to use full locale object (id+name)\n $scope.formData.locale = (csSettings.data.locale && csSettings.data.locale.id && _.findWhere($scope.locales, {id: csSettings.data.locale.id})) ||\n _.findWhere($scope.locales, {id: csSettings.defaultSettings.locale.id});\n\n\n return $timeout(function() {\n $scope.loading = false;\n // Set Ink\n UIUtils.ink({selector: '.item'});\n $scope.showHelpTip();\n }, 100);\n };\n\n $scope.reset = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n }\n $scope.pendingSaving = true;\n csSettings.reset()\n .then(csPlatform.restart)\n .then(function() {\n // reload\n $scope.load();\n $scope.pendingSaving = false;\n });\n };\n\n $scope.changeLanguage = function(langKey) {\n $translate.use(langKey);\n };\n\n // Change node\n $scope.changeNode= function(node) {\n var port = !!$scope.formData.node.port && $scope.formData.node.port != 80 && $scope.formData.node.port != 443 ? $scope.formData.node.port : undefined;\n node = node || {\n host: $scope.formData.node.host,\n port: port,\n useSsl: angular.isDefined($scope.formData.node.useSsl) ?\n $scope.formData.node.useSsl :\n ($scope.formData.node.port == 443)\n };\n $scope.showNodePopup(node)\n .then(function(newNode) {\n if (newNode.host === $scope.formData.node.host &&\n newNode.port === $scope.formData.node.port &&\n newNode.useSsl === $scope.formData.node.useSsl && !$scope.formData.node.temporary) {\n return; // same node = nothing to do\n }\n UIUtils.loading.show();\n\n BMA.isAlive(newNode)\n .then(function(alive) {\n if (!alive) {\n UIUtils.loading.hide();\n return UIUtils.alert.error('ERROR.INVALID_NODE_SUMMARY')\n .then(function(){\n $scope.changeNode(newNode); // loop\n });\n }\n UIUtils.loading.hide();\n angular.merge($scope.formData.node, newNode);\n delete $scope.formData.node.temporary;\n BMA.stop();\n BMA.copy(newNode);\n $scope.bma = BMA;\n\n // Restart platform (or start if not already started)\n csPlatform.restart();\n\n // Reset history cache\n return $ionicHistory.clearCache();\n });\n });\n };\n\n $scope.showNodeList = function() {\n // Check if need a filter on SSL node\n var forceUseSsl = (csConfig.httpsMode === 'true' || csConfig.httpsMode === true || csConfig.httpsMode === 'force') ||\n ($window.location && $window.location.protocol === 'https:') ? true : false;\n\n $ionicPopup._popupStack[0].responseDeferred.promise.close();\n return Modals.showNetworkLookup({\n enableFilter: true, // enable filter button\n bma: true, // only BMA node\n ssl: forceUseSsl ? true : undefined\n })\n .then(function (peer) {\n if (peer) {\n var bma = peer.getBMA();\n return {\n host: (bma.dns ? bma.dns :\n (peer.hasValid4(bma) ? bma.ipv4 : bma.ipv6)),\n port: bma.port || 80,\n useSsl: bma.useSsl || bma.port == 443\n };\n }\n })\n .then(function(newNode) {\n $scope.changeNode(newNode);\n });\n };\n\n // Show node popup\n $scope.showNodePopup = function(node) {\n return $q(function(resolve, reject) {\n $scope.popupData.newNode = node.port ? [node.host, node.port].join(':') : node.host;\n $scope.popupData.useSsl = node.useSsl;\n if (!!$scope.popupForm) {\n $scope.popupForm.$setPristine();\n }\n $translate(['SETTINGS.POPUP_PEER.TITLE', 'COMMON.BTN_OK', 'COMMON.BTN_CANCEL'])\n .then(function (translations) {\n // Choose UID popup\n $ionicPopup.show({\n templateUrl: 'templates/settings/popup_node.html',\n title: translations['SETTINGS.POPUP_PEER.TITLE'],\n scope: $scope,\n buttons: [\n { text: translations['COMMON.BTN_CANCEL'] },\n {\n text: translations['COMMON.BTN_OK'],\n type: 'button-positive',\n onTap: function(e) {\n $scope.popupForm.$submitted=true;\n if(!$scope.popupForm.$valid || !$scope.popupForm.newNode) {\n //don't allow the user to close unless he enters a node\n e.preventDefault();\n } else {\n return {\n server: $scope.popupData.newNode,\n useSsl: $scope.popupData.useSsl\n };\n }\n }\n }\n ]\n })\n .then(function(res) {\n if (!res) { // user cancel\n UIUtils.loading.hide();\n return;\n }\n var parts = res.server.split(':');\n parts[1] = parts[1] ? parts[1] : 80;\n resolve({\n host: parts[0],\n port: parts[1],\n useSsl: res.useSsl\n });\n });\n });\n });\n };\n\n $scope.save = function() {\n if ($scope.loading || $scope.pendingSaving) return $q.when();\n if ($scope.saving) {\n $scope.pendingSaving = true;\n // Retry later\n return $timeout(function() {\n $scope.pendingSaving = false;\n return $scope.save();\n }, 500);\n }\n $scope.saving = true;\n\n // Async - to avoid UI lock\n return $timeout(function() {\n // Make sure to format helptip\n $scope.cleanupHelpTip();\n\n // Applying\n csSettings.apply($scope.formData);\n\n // Store\n return csSettings.store();\n\n }, 100)\n .then(function() {\n //return $timeout(function() {\n $scope.saving = false;\n //}, 100);\n });\n };\n\n $scope.onDataChanged = function(oldValue, newValue, scope) {\n if ($scope.loading || $scope.pendingSaving) return $q.when();\n if ($scope.saving) {\n $scope.pendingSaving = true;\n // Retry later\n return $timeout(function() {\n $scope.pendingSaving = false;\n return $scope.onDataChanged(oldValue, newValue, scope);\n }, 500);\n }\n\n // Changes from the current scope: save changes\n if ((scope === $scope) && !angular.equals(oldValue, newValue)) {\n $scope.save();\n }\n };\n $scope.$watch('formData', $scope.onDataChanged, true);\n\n // Detected changes from outside (e.g. enabling encryption on wallet can be rollback if user cancel auth)\n csSettings.api.data.on.changed($scope, function(data) {\n if ($scope.loading || $scope.saving || $scope.pendingSaving) return;\n\n var updated = !angular.equals(data.useLocalStorageEncryption, $scope.formData.useLocalStorageEncryption);\n if (updated) {\n console.debug('[settings] Settings changed (outside the settings page). Reloading...');\n $scope.load();\n }\n });\n\n $scope.getServer = function() {\n if (!$scope.formData.node || !$scope.formData.node.host) return '';\n return csHttp.getServer($scope.formData.node.host, $scope.formData.node.port);\n };\n\n $scope.cleanupHelpTip = function() {\n var helptipChanged = $scope.formData.helptip.enable !== csSettings.data.helptip.enable;\n if (helptipChanged) {\n var enable = $scope.formData.helptip.enable;\n // Apply default values\n $scope.formData.helptip = angular.merge({}, csSettings.defaultSettings.helptip);\n // Then restore the enable flag\n $scope.formData.helptip.enable = enable;\n }\n };\n\n /* -- modals & popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'templates/settings/popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n $scope.startSettingsTour = function() {\n $scope.hideActionsPopover();\n\n return $scope.showHelpTip(0, true);\n };\n\n // Show help tip (show only not already shown)\n $scope.showHelpTip = function(index, tour) {\n if (!$scope.isLogin() && !tour) return;\n index = angular.isDefined(index) ? index : csSettings.data.helptip.settings;\n if (index < 0) return;\n if (index === 0) index = 1; // skip first step\n\n // Create a new scope for the tour controller\n var helptipScope = $scope.createHelptipScope(tour);\n if (!helptipScope) return; // could be undefined, if a global tour already is already started\n\n return helptipScope.startSettingsTour(index, false)\n .then(function(endIndex) {\n helptipScope.$destroy();\n csSettings.data.helptip.settings = endIndex;\n csSettings.store();\n });\n };\n}\n","\nBlockLookupController.$inject = ['$scope', '$timeout', '$focus', '$filter', '$state', '$anchorScroll', 'UIUtils', 'BMA', 'csCurrency', 'csWot', 'csSettings'];\nBlockViewController.$inject = ['$scope', '$ionicPopover', '$state', 'UIUtils', 'BMA', 'csCurrency', 'csWot'];\nangular.module('cesium.blockchain.controllers', ['cesium.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.blockchain', {\n url: \"/blockchain\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/blockchain/lookup.html\",\n controller: 'BlockLookupCtrl'\n }\n },\n data: {\n large: 'app.blockchain_lg'\n }\n })\n\n .state('app.blockchain_lg', {\n url: \"/blockchain/lg\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/blockchain/lookup_lg.html\",\n controller: 'BlockLookupCtrl'\n }\n }\n })\n\n .state('app.server_blockchain', {\n url: \"/network/peer/:server/blockchain?ssl&tor\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/blockchain/lookup.html\",\n controller: 'BlockLookupCtrl'\n }\n },\n data: {\n large: 'app.server_blockchain_lg'\n }\n })\n\n .state('app.server_blockchain_lg', {\n url: \"/network/peer/:server/blockchain/lg?ssl&tor\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/blockchain/lookup_lg.html\",\n controller: 'BlockLookupCtrl'\n }\n }\n })\n\n .state('app.view_block', {\n url: \"/block/:number\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/blockchain/view_block.html\",\n controller: 'BlockViewCtrl'\n }\n }\n })\n\n .state('app.view_block_hash', {\n url: \"/block/:number/:hash\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/blockchain/view_block.html\",\n controller: 'BlockViewCtrl'\n }\n }\n })\n\n .state('app.view_server_block_hash', {\n url: \"/network/peer/:server/block/:number/:hash?ssl&tor\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/blockchain/view_block.html\",\n controller: 'BlockViewCtrl'\n }\n }\n });\n }])\n\n .controller('BlockLookupCtrl', BlockLookupController)\n\n .controller('BlockViewCtrl', BlockViewController)\n\n;\n\nfunction BlockLookupController($scope, $timeout, $focus, $filter, $state, $anchorScroll, UIUtils, BMA, csCurrency, csWot, csSettings) {\n 'ngInject';\n\n $scope.search = {\n result: [],\n total: 0,\n loading: true,\n loadingMore: false,\n hasMore: false,\n type: 'last'\n };\n $scope.node = {};\n $scope.currency = false;\n $scope.entered = false;\n $scope.searchTextId = null;\n $scope.ionItemClass = 'item-border-large';\n $scope.defaultSizeLimit = UIUtils.screen.isSmall() ? 50 : 100;\n $scope.helptipPrefix = 'helptip-network';\n $scope.listeners = [];\n\n /**\n * Enter into the view\n * @param e\n * @param state\n */\n $scope.enter = function(e, state) {\n if (!$scope.entered) {\n if (state && state.stateParams && state.stateParams.q) { // Query parameter\n $scope.search.text = state.stateParams.q;\n if ($scope.search.text && $scope.search.text.trim().length) {\n $scope.search.type='text';\n }\n }\n\n // Load from server if need\n if (state && state.stateParams && state.stateParams.server) {\n var useSsl = state.stateParams.ssl == \"true\";\n var useTor = state.stateParams.tor == \"true\";\n\n var node = {\n server: state.stateParams.server,\n host: state.stateParams.server,\n useSsl: useSsl,\n useTor: useTor\n };\n var serverParts = state.stateParams.server.split(':');\n if (serverParts.length === 2) {\n node.host = serverParts[0];\n node.port = serverParts[1];\n }\n\n if (BMA.node.same(node)) {\n $scope.node = BMA;\n }\n else {\n $scope.node = useTor ?\n // For TOR, use a web2tor to access the endpoint\n BMA.instance(node.host + \".to\", 443, true/*ssl*/, 600000 /*long timeout*/) :\n BMA.instance(node.host, node.port, node.useSsl);\n return $scope.node.blockchain.parameters()\n .then(function(json) {\n $scope.currency = json.currency;\n $scope.enter(); // back to enter()\n });\n }\n }\n\n // Load currency if need\n if (!$scope.currency) {\n return csCurrency.get()\n .then(function(currency) {\n $scope.currency = currency ? currency.name : null;\n $scope.node = currency.node ? currency.node : BMA;\n\n if (!$scope.currency) {\n UIUtils.alert.error('ERROR.GET_CURRENCY_FAILED');\n return;\n }\n $scope.enter(); // back to enter(), with no stateParams\n })\n .catch(UIUtils.onError('ERROR.GET_CURRENCY_FAILED'));\n }\n\n $scope.compactMode = angular.isDefined($scope.compactMode) ? $scope.compactMode : true;\n $scope.expertMode = angular.isDefined($scope.expertMode) ? $scope.expertMode : !UIUtils.screen.isSmall() && csSettings.data.expertMode;\n\n $scope.doSearch();\n\n // removeIf(device)\n // Focus on search text (only if NOT device, to avoid keyboard opening)\n if ($scope.searchTextId) {\n $timeout(function(){\n $focus($scope.searchTextId);\n }, 100);\n }\n // endRemoveIf(device)\n\n $scope.addListeners();\n\n $scope.entered = true;\n\n $scope.showHelpTip();\n }\n else {\n $scope.addListeners();\n }\n };\n //$scope.$on('$ionicView.enter', $scope.enter);\n $scope.$on('$ionicParentView.enter', $scope.enter);\n\n\n /**\n * Leave the view\n * @param e\n * @param state\n */\n $scope.leave = function() {\n $scope.removeListeners();\n };\n //$scope.$on('$ionicView.leave', $scope.leave);\n $scope.$on('$ionicParentView.leave', $scope.leave);\n $scope.$on('$destroy', $scope.leave);\n\n $scope.doSearchLast = function() {\n $scope.search.type = 'last';\n return $scope.doSearch();\n };\n\n $scope.doSearch = function(from) {\n from = angular.isDefined(from) ? from : 0;\n\n $scope.search.loading = (from === 0);\n $scope.search.hasMore = false;\n\n var promise;\n\n // get blocks\n if (from === 0) {\n promise = $scope.node.blockchain.current(false)\n .then(function(current) {\n var size = current.number < $scope.defaultSizeLimit ? current.number : $scope.defaultSizeLimit;\n return $scope.node.blockchain.blocksSlice({count: size, from: current.number-size})\n .then(function(blocks) {\n if (!!blocks) blocks.splice(0,0,current);\n return blocks;\n });\n })\n .catch(function(err) {\n // Special case when block #0 not written yet\n if (err && err.ucode == BMA.errorCodes.NO_CURRENT_BLOCK) {\n return [];\n }\n throw err;\n });\n }\n else {\n var oldestNumber = $scope.search.results[$scope.search.results.length-1].number;\n var size = oldestNumber < $scope.defaultSizeLimit ? oldestNumber : $scope.defaultSizeLimit;\n promise = $scope.node.blockchain.blocksSlice({count: size, from: oldestNumber-size});\n }\n\n // process blocks\n return promise\n .then(function(blocks) {\n // If no result\n if (!blocks || !blocks.length) {\n $scope.doDisplayResult([], from, 0);\n $scope.search.loading = false;\n return;\n }\n\n // Transform to entities\n blocks = blocks.reduce(function(res, json){\n var block = new Block(json);\n block.cleanData(); // release arrays content\n return res.concat(block);\n }, []);\n\n // Order by number (desc)\n blocks = _.sortBy(blocks, function(b) {\n return -1 * b.number;\n });\n\n // Prepare then display results\n var total = ((from===0) ? blocks[0].number: $scope.search.results[0].number) + 1;\n return $scope.doPrepareResult(blocks, from)\n .then(function() {\n $scope.doDisplayResult(blocks, from, total);\n $scope.search.loading = false;\n });\n })\n\n .catch(function(err) {\n UIUtils.onError('BLOCKCHAIN.ERROR.SEARCH_BLOCKS_FAILED')(err);\n $scope.search.loading = false;\n });\n };\n\n var formatDateShort = $filter('formatDateShort');\n\n $scope.doPrepareResult = function(blocks, offset) {\n offset = angular.isDefined(offset) ? offset : 0;\n\n if ($scope.search.type=='last') {\n\n var previousEmptyBlockDay;\n if (offset > 0 && $scope.search.results.length) {\n var lastBlock = $scope.search.results[$scope.search.results.length-1];\n previousEmptyBlockDay = lastBlock.empty ? lastBlock.day : undefined;\n }\n\n _.forEach(blocks, function(block, index){\n // If empty\n if (block.empty) {\n // compute the day\n var blockDay = formatDateShort(block.medianTime);\n var notFirstEmpty = (index !== 0) || (offset !== 0);\n var previousNotEmptyOrSameDay = !previousEmptyBlockDay || (previousEmptyBlockDay == blockDay);\n block.compacted = notFirstEmpty && previousNotEmptyOrSameDay;\n previousEmptyBlockDay = blockDay;\n }\n else {\n previousEmptyBlockDay = undefined;\n }\n });\n }\n\n return csWot.extendAll(blocks, 'issuer');\n };\n\n $scope.doDisplayResult = function(res, offset, total) {\n if (!offset) {\n $scope.search.results = res || [];\n }\n else {\n $scope.search.results = $scope.search.results.concat(res);\n }\n $scope.search.hasMore = total && $scope.search.results.length < total;\n $scope.search.total = total || $scope.search.total;\n\n $scope.smallscreen = UIUtils.screen.isSmall();\n\n $scope.$broadcast('$$rebind::rebind'); // notify binder\n\n // Set Motion\n if (res && res.length) {\n $scope.motion.show({selector: '.list-blocks .item-block'});\n }\n };\n\n $scope.showMore = function() {\n var from = $scope.search.results ? $scope.search.results.length : 0;\n\n $scope.search.loadingMore = true;\n\n return $scope.doSearch(from)\n .then(function() {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n })\n .catch(function(err) {\n console.error(err);\n $scope.search.loadingMore = false;\n $scope.search.hasMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n $scope.removeListeners = function() {\n if ($scope.listeners.length) {\n console.debug(\"[block] Closing listeners\");\n _.forEach($scope.listeners, function(remove){\n remove();\n });\n $scope.listeners = [];\n }\n };\n\n $scope.addListeners = function() {\n if ($scope.listeners.length) return; // already started\n\n console.debug(\"[block] Starting listeners\");\n if ($scope.node === BMA) {\n $scope.listeners = [\n csCurrency.api.data.on.newBlock($scope, $scope.onBlock)\n ];\n }\n else {\n $scope.listeners = [\n $scope.node.websocket.block().onListener(function(json) {\n // Skip if WS closed (after leave view - should never happen) or invalid json\n if (!json) return;\n var block = new Block(json);\n block.cleanData(); // Remove unused content (arrays...)\n $scope.onBlock(block);\n })\n ];\n }\n };\n\n $scope.onBlock = function(block) {\n // Skip if still loading or if filter/sort is not the default (not last blocks)\n if ($scope.search.loading || $scope.search.type !== 'last' ||\n ($scope.search.sort && $scope.search.sort !== 'desc')) return; // skip\n\n // Make sure results is init\n $scope.search.results = $scope.search.results || [];\n\n if (!$scope.search.results.length) {\n console.debug('[blockchain] new block #{0} received (by websocket)'.format(block.number));\n // add it to result\n $scope.search.total++;\n $scope.search.results.push(block);\n\n // Prepare the new block, then show it\n $scope.doPrepareResult([block])\n .then(function() {\n return $scope.showBlock(block);\n });\n }\n else {\n // Find existing block, by number\n var existingBlock = _.findWhere($scope.search.results, {number: block.number});\n\n // replace existing block (fork could have replaced previous block)\n if (existingBlock) {\n if (existingBlock.hash !== block.hash) {\n console.debug('[blockchain] block #{0} updated (by websocket)'.format(block.number));\n // Replace existing content\n angular.copy(block, existingBlock);\n // Prepare the new block, then show it\n $scope.doPrepareResult([block, $scope.search.results[1]])\n .then(function() {\n return $scope.showBlock(existingBlock);\n });\n }\n }\n else {\n console.debug('[blockchain] new block #{0} received (by websocket)'.format(block.number));\n // Insert at index 0\n $scope.search.total++;\n $scope.search.results.splice(0, 0, block);\n\n // Prepare the new block, then show it\n $scope.doPrepareResult([block, $scope.search.results[1]])\n .then(function() {\n return $scope.showBlock(block);\n });\n }\n }\n };\n\n $scope.showBlock = function(block){\n // Force rebind\n $scope.$broadcast('$$rebind::rebind');\n $scope.motion.show({selector: '#block-'+block.number});\n };\n\n $scope.selectBlock = function(block) {\n if (block.compacted && $scope.compactMode) {\n $scope.toggleCompactMode();\n $timeout(function(){\n $anchorScroll('block-' + block.number);\n }, 900);\n }\n else if (BMA.node.same($scope.node)) {\n $state.go('app.view_block_hash', {number: block.number, hash: block.hash});\n }\n else {\n $state.go('app.view_server_block_hash', {server: $scope.node.server, ssl: $scope.node.useSsl, number: block.number, hash: block.hash});\n }\n };\n\n $scope.toggleCompactMode = function() {\n $scope.compactMode = !$scope.compactMode;\n $scope.doDisplayResult($scope.search.results, 0, $scope.search.total/*keep previous total*/);\n\n // Workaround to re-initialized the <ion-infinite-loop>\n if (!$scope.search.hasMore && $scope.search.results.length && $scope.search.type == 'last') {\n var lastBlock = $scope.search.results[$scope.search.results.length-1];\n if (lastBlock && lastBlock.number > 0) {\n $timeout(function() {\n $scope.search.hasMore = true;\n }, 500);\n }\n }\n };\n\n $scope.toggleSort = function(sort){\n if ($scope.search.sort === sort && !$scope.search.asc) {\n $scope.search.asc = undefined;\n $scope.search.sort = undefined;\n }\n else {\n $scope.search.asc = ($scope.search.sort === sort) ? !$scope.search.asc : true;\n $scope.search.sort = sort;\n }\n $scope.doSearch();\n };\n\n $scope.showHelpTip = function() {\n // TODO\n };\n}\n\n\nfunction BlockViewController($scope, $ionicPopover, $state, UIUtils, BMA, csCurrency, csWot) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.formData = {};\n $scope.compactMode = true; // TODO change to true\n\n $scope.$on('$ionicView.beforeEnter', function (event, viewData) {\n // Enable back button (workaround need for navigation outside tabs - https://stackoverflow.com/a/35064602)\n viewData.enableBack = UIUtils.screen.isSmall() ? true : viewData.enableBack;\n });\n\n /**\n * Enter on view\n */\n $scope.enter = function(e, state) {\n if (!$scope.loading) return; // call once\n\n if (state) {\n $scope.number = state.stateParams && angular.isDefined(state.stateParams.number) ? state.stateParams.number : 'current';\n $scope.hash = state.stateParams && state.stateParams.hash ? state.stateParams.hash : undefined;\n\n // Load from server if need\n if (state.stateParams && state.stateParams.server) {\n var useSsl = state.stateParams.ssl == \"true\";\n var useTor = state.stateParams.tor == \"true\";\n\n var node = {\n server: state.stateParams.server,\n host: state.stateParams.server,\n useSsl: useSsl,\n useTor: useTor\n };\n var serverParts = state.stateParams.server.split(':');\n if (serverParts.length == 2) {\n node.host = serverParts[0];\n node.port = serverParts[1];\n }\n\n if (BMA.node.same(node)) {\n $scope.node = BMA;\n }\n else {\n $scope.node = useTor ?\n // For TOR, use a web2tor to access the endpoint\n BMA.instance(node.host + \".to\", 443, true/*ssl*/, 600000 /*long timeout*/) :\n BMA.instance(node.host, node.port, node.useSsl);\n return $scope.node.blockchain.parameters()\n .then(function (json) {\n $scope.currency = json.currency;\n $scope.enter(); // back to enter(), with no stateParams\n });\n }\n }\n }\n\n if (!$scope.currency || !$scope.node) {\n csCurrency.get()\n .then(function (currency) {\n if (currency) {\n $scope.currency = currency.name;\n $scope.node = currency.node;\n $scope.load();\n }\n })\n .catch(UIUtils.onError('ERROR.GET_CURRENCY_FAILED'));\n }\n else {\n $scope.load();\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n /**\n * Leave the view\n */\n $scope.leave = function() {\n //console.debug(\"Leaving view peer...\");\n };\n $scope.$on('$ionicParentView.beforeLeave', $scope.leave);\n\n $scope.load = function() {\n if (!$scope.number) return;\n\n var promise = $scope.number == 'current' ?\n $scope.node.blockchain.current() :\n $scope.node.blockchain.block({block: $scope.number});\n\n return promise\n .then(function(json) {\n var block = new Block(json);\n block.parseData();\n if (!block || !angular.isDefined(block.number) || !block.hash) {\n $scope.loading = false;\n UIUtils.alert.error('ERROR.GET_BLOCK_FAILED');\n return;\n }\n if ($scope.hash && block.hash != $scope.hash) {\n $scope.loading = false;\n UIUtils.alert.error('ERROR.INVALID_BLOCK_HASH');\n return;\n }\n\n var users = [];\n if (block.joiners.length) {\n users = users.concat(block.joiners);\n }\n if (block.certifications.length) {\n users = block.certifications.reduce(function(res, cert) {\n cert.to = {\n pubkey: cert.to\n };\n cert.from = {\n pubkey: cert.from\n };\n return res.concat(cert.to , cert.from);\n }, users);\n block.certifications = _.groupBy(block.certifications, function(cert) {\n return cert.to.pubkey;\n });\n }\n if (block.transactions.length) {\n users = block.transactions.reduce(function(res, tx) {\n tx.issuers = tx.issuers.reduce(function(res, issuer) {\n return res.concat({pubkey: issuer});\n }, []);\n\n // Parse unlockConditions\n _.forEach(tx.outputs||[], function(output) {\n if (output.unlockCondition) {\n angular.merge(output, BMA.tx.parseUnlockCondition(output.unlockCondition));\n }\n });\n\n return res.concat(tx.issuers.concat(tx.outputs||[]));\n }, users);\n }\n\n var issuer = {pubkey: block.issuer};\n users.push(issuer);\n return csWot.extendAll(users)\n .then(function() {\n $scope.updateView({block: block, issuer: issuer});\n });\n })\n .catch(function(err) {\n $scope.loading = false;\n UIUtils.onError('ERROR.GET_BLOCK_FAILED')(err);\n });\n };\n\n $scope.updateView = function(data) {\n $scope.formData = data.block;\n //angular.copy(data.block, $scope.formData);\n $scope.issuer = data.issuer;\n $scope.loading = false;\n };\n\n $scope.toggleCompactMode = function() {\n $scope.compactMode = !$scope.compactMode;\n };\n\n /* -- popover -- */\n\n var paddingIndent = 10;\n\n $scope.toUnlockUIArray = function(unlockTreeItem, leftPadding, operator) {\n leftPadding = leftPadding || paddingIndent;\n\n // If operator (AND, OR)\n if (unlockTreeItem.children && (unlockTreeItem.type == 'AND' || unlockTreeItem.type == 'OR')) {\n return unlockTreeItem.children.reduce(function(res, child, index){\n if (child.children && index > 0) {\n // Add space between expression block\n res = res.concat({\n style: {\n 'padding-left': leftPadding + 'px',\n 'padding-top': '10px',\n 'padding-bottom': '10px'\n },\n operator: unlockTreeItem.type\n });\n\n return res.concat($scope.toUnlockUIArray(child, leftPadding + paddingIndent));\n }\n return res.concat($scope.toUnlockUIArray(child, leftPadding + paddingIndent, index && unlockTreeItem.type));\n }, []);\n }\n\n return {\n style: {\n 'padding-left': leftPadding + 'px'\n },\n operator: operator,\n type: unlockTreeItem.type,\n value: unlockTreeItem.value\n };\n };\n\n $scope.showUnlockConditionPopover = function(output, event) {\n if (!output.unlockTree) return;\n\n // Convert condition into UI array\n $scope.popoverData = $scope.popoverData || {};\n $scope.popoverData.unlockConditions = $scope.toUnlockUIArray(output.unlockTree);\n\n // Open popover\n UIUtils.popover.show(event, {\n templateUrl: 'templates/blockchain/unlock_condition_popover.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.unlockConditionPopover = popover;\n }\n });\n };\n\n $scope.hideUnlockConditionsPopover = function() {\n if ($scope.unlockConditionPopover) {\n $scope.unlockConditionPopover.hide();\n $scope.unlockConditionPopover = null;\n }\n };\n\n $scope.goState = function(stateName, stateParams) {\n $scope.hideUnlockConditionsPopover();\n $state.go(stateName, stateParams);\n };\n\n /* -- manage link to raw document -- */\n\n $scope.openRawBlock = function(event) {\n return $scope.openLink(event, $scope.node.url + '/blockchain/block/' + $scope.formData.number);\n };\n\n /* -- help tip -- */\n\n // Show help tip\n $scope.showHelpTip = function(index) {\n // No helptip here (done in network controller)\n };\n}\n\n","\nfunction EsNotification(json, markAsReadCallback) {\n\n var messagePrefixes = {\n 'user': 'EVENT.USER.',\n 'page': 'EVENT.PAGE.'\n };\n\n var that = this;\n\n // Avoid undefined errors\n json = json || {};\n\n that.id = json.id || ('' + Date.now()); // Keep id if exists, otherwise create it from timestamp\n that.type = json.type && json.type.toLowerCase();\n that.time = json.time;\n that.hash = json.hash;\n that.read = json.read_signature ? true : false;\n\n that.message = json.code && (json.reference && messagePrefixes[json.reference.index] ?\n messagePrefixes[json.reference.index] + json.code :\n 'EVENT.' + json.code) || json.message;\n that.params = json.params;\n\n if (markAsReadCallback && (typeof markAsReadCallback === \"function\") ) {\n that.markAsReadCallback = markAsReadCallback;\n }\n\n function _formatHash(input) {\n return input ? input.substr(0,4) + input.substr(input.length-4) : '';\n }\n\n that.markAsRead = function() {\n if (that.markAsReadCallback) {\n that.markAsReadCallback(that);\n }\n };\n\n var pubkeys;\n\n json.code = json.code || '';\n\n // Membership\n if (json.code.startsWith('MEMBER_')) {\n that.avatarIcon = 'ion-person';\n that.icon = 'ion-information-circled positive';\n that.state = 'app.view_wallet';\n that.medianTime = that.time;\n }\n\n // TX\n else if (json.code.startsWith('TX_')) {\n that.avatarIcon = 'ion-card';\n that.icon = (json.code === 'TX_SENT') ? 'ion-paper-airplane dark' : 'ion-archive balanced';\n that.medianTime = that.time;\n pubkeys = json.params.length > 0 ? json.params[0] : null;\n if (pubkeys && pubkeys.indexOf(',') == -1) {\n that.pubkey = pubkeys;\n }\n that.state = 'app.view_wallet_tx';\n that.stateParams = {refresh: true};\n }\n\n // Certifications\n else if (json.code.startsWith('CERT_')) {\n that.avatarIcon = (json.code === 'CERT_RECEIVED') ? 'ion-ribbon-b' : 'ion-ribbon-a';\n that.icon = (json.code === 'CERT_RECEIVED') ? 'ion-ribbon-b balanced' : 'ion-ribbon-a gray';\n that.pubkey = json.params.length > 0 ? json.params[0] : null;\n that.medianTime = that.time;\n that.state = 'app.wallet_cert';\n that.stateParams = {\n type: (json.code === 'CERT_RECEIVED') ? 'received' : 'given'\n };\n }\n\n // Message\n else if (json.code.startsWith('MESSAGE_')) {\n that.avatarIcon = 'ion-email';\n that.icon = 'ion-email dark';\n pubkeys = json.params.length > 0 ? json.params[0] : null;\n if (pubkeys && pubkeys.indexOf(',') === -1) {\n that.pubkey = pubkeys;\n }\n that.id = json.reference.id; // Do not care about notification ID, because notification screen use message _id\n }\n\n // user profile record\n else if (json.reference && json.reference.index === 'user' && json.reference.type === 'profile') {\n that.pubkey = json.params.length > 0 ? json.params[0] : null;\n that.state = 'app.wot_identity';\n that.stateParams = {\n pubkey: that.pubkey,\n uid: json.params && json.params[3],\n };\n if (json.code.startsWith('LIKE_')) {\n that.avatarIcon = 'ion-person';\n that.icon = 'ion-ios-heart positive';\n }\n else if (json.code.startsWith('STAR_')) {\n that.avatarIcon = 'ion-person';\n that.icon = 'ion-star gray';\n }\n else if (json.code.startsWith('FOLLOW_')) {\n that.avatarIcon = 'ion-person';\n that.icon = 'ion-ios-people gray';\n }\n else if (json.code.startsWith('ABUSE_')) {\n that.avatarIcon = 'ion-person';\n that.icon = 'ion-android-warning assertive';\n }\n else if (json.code.startsWith('MODERATION_')) {\n that.state = 'app.wot_identity';\n that.stateParams = {\n pubkey: json.reference.id,\n uid: json.params && json.params[3],\n };\n that.avatarIcon = 'ion-alert-circled';\n that.icon = 'ion-alert-circled energized';\n\n // If deletion has been asked, change the message\n var level = json.params && json.params[4] || 0;\n if (json.code === 'MODERATION_RECEIVED' && level == 5) {\n that.message = 'EVENT.USER.DELETION_RECEIVED';\n that.icon = 'ion-trash-a assertive';\n }\n }\n else {\n that.icon = 'ion-person dark';\n }\n\n }\n\n // page record\n else if (json.reference && json.reference.index === 'page') {\n that.pubkey = json.params.length > 0 ? json.params[0] : null;\n that.avatarIcon = 'ion-social-buffer';\n if (json.reference.anchor) {\n that.icon = 'ion-ios-chatbubble-outline dark';\n that.state = 'app.view_page_anchor';\n that.stateParams = {\n id: json.reference.id,\n title: json.params[1],\n anchor: _formatHash(json.reference.anchor)\n };\n }\n else {\n that.icon = 'ion-social-buffer dark';\n that.state = 'app.view_page';\n that.stateParams = {\n id: json.reference.id,\n title: json.params[1]\n };\n }\n\n if (json.code.startsWith('LIKE_')) {\n that.icon = 'ion-ios-heart positive';\n }\n else if (json.code.startsWith('FOLLOW_')) {\n that.avatarIcon = 'ion-person';\n }\n else if (json.code.startsWith('ABUSE_')) {\n that.icon = 'ion-alert-circled energized';\n }\n else if (json.code.startsWith('MODERATION_')) {\n that.avatarIcon = 'ion-alert-circled';\n that.icon = 'ion-alert-circled energized';\n\n // If deletion has been asked, change the message\n if (json.code === 'MODERATION_RECEIVED' && json.level === 5) {\n that.message = 'EVENT.PAGE.DELETION_RECEIVED';\n that.icon = 'ion-trash-a assertive';\n }\n }\n }\n\n // info message\n else if (json.type === 'INFO') {\n that.avatarIcon = 'ion-information';\n that.icon = 'ion-information-circled positive';\n }\n // warn message\n else if (json.type === 'WARN') {\n that.avatarIcon = 'ion-alert-circled';\n that.icon = 'ion-alert-circled energized';\n }\n // error message\n else if (json.type === 'ERROR') {\n that.avatarIcon = 'ion-close';\n that.icon = 'ion-close-circled assertive';\n }\n\n return that;\n}\n","\nfunction Comment(id, json) {\n\n var that = this;\n\n that.id = id;\n that.message = null; // set in copyFromJson()\n that.html = null; // set in copyFromJson()\n that.issuer = null; // set in copyFromJson()\n that.time = null; // set in copyFromJson()\n that.creationTime = null; // set in copyFromJson()\n that.reply_to = null; // set in copyFromJson()\n\n that.replyCount = 0;\n that.parent = null;\n that.replies = [];\n that.onRemoveListeners = [];\n\n that.copy = function(otherComment) {\n // Mandatory fields\n that.message = otherComment.message;\n that.html = otherComment.html;\n that.issuer = otherComment.issuer;\n that.time = otherComment.time;\n that.creationTime = otherComment.creationTime || that.time; // fill using time, for backward compatibility\n\n // Optional fields\n that.id = otherComment.id || that.id;\n that.reply_to = otherComment.reply_to || that.reply_to;\n that.uid = otherComment.uid || that.uid;\n that.name = otherComment.name || that.name;\n that.avatarStyle = otherComment.avatarStyle || that.avatarStyle;\n if (otherComment.parent) {\n that.parent = otherComment.parent;\n }\n if (otherComment.replies) that.setReplies(otherComment.replies);\n };\n\n that.copyFromJson = function(json) {\n that.message = json.message;\n that.issuer = json.issuer;\n that.time = json.time;\n that.creationTime = json.creationTime || that.time;\n that.reply_to = json.reply_to;\n };\n\n that.addOnRemoveListener = function(listener) {\n if (listener && (typeof listener === \"function\") ) {\n that.onRemoveListeners.push(listener);\n }\n };\n\n that.cleanAllListeners = function() {\n that.onRemoveListeners = [];\n };\n\n that.setReplies = function(replies) {\n that.removeAllReplies();\n that.addReplies(replies);\n };\n\n that.addReplies = function(replies) {\n if (!replies || !replies.length) return;\n replies = replies.sort(function(cm1, cm2) {\n return (cm1.time - cm2.time);\n });\n _.forEach(replies, function(reply) {\n reply.parent = that;\n that.replies.push(reply);\n });\n that.replyCount += replies.length;\n };\n\n that.containsReply = function(reply) {\n return that.replies.indexOf(reply) != -1;\n };\n\n that.addReply = function(reply) {\n that.replyCount += 1;\n that.replies.push(reply);\n that.replies = that.replies.sort(function(cm1, cm2) {\n return (cm1.time - cm2.time);\n });\n reply.parent = that;\n };\n\n that.removeAllReplies = function() {\n if (that.replyCount) {\n var replies = that.replies.splice(0, that.replies.length);\n that.replyCount = 0;\n _.forEach(replies, function (reply) {\n reply.remove();\n });\n }\n };\n\n that.removeReply = function(replyId) {\n var index = _.findIndex(that.replies, {id: replyId});\n if (index != -1) {\n that.replyCount--;\n var reply = that.replies.splice(index, 1)[0];\n delete reply.parent;\n }\n };\n\n that.remove = function() {\n if (that.parent) {\n that.parent.removeReply(that.id);\n delete that.parent;\n }\n //that.removeAllReplies();\n if (that.onRemoveListeners.length) {\n _.forEach(that.onRemoveListeners, function(listener) {\n listener(that);\n });\n that.issuer = null;\n that.message = null;\n that.cleanAllListeners();\n }\n };\n\n // Init from json\n if (json && typeof json === \"object\") {\n that.copyFromJson(json);\n }\n}\n","\nfunction Invitation(json) {\n\n var that = this;\n\n // Avoid undefined errors\n json = json || {};\n\n that.type = json.type && json.type.toLowerCase();\n that.time = json.time;\n that.id = json.id;\n\n // Invitation to certify\n if (that.type == 'certification') {\n\n that.comment = json.comment;\n that.icon = 'ion-ribbon-a';\n that.okText= 'WOT.BTN_CERTIFY';\n\n // read the identity to certify\n if (!json.content || json.content.indexOf('-') == -1) {\n console.error('[invitation] Empty content for invitation [{0}]'.format(that.id));\n that.message = 'INVITATION.ERROR.BAD_INVITATION_FORMAT';\n that.pubkey = json.issuer;\n return;\n }\n\n var separatorIndex = json.content.lastIndexOf('-');\n if (separatorIndex == -1) {\n console.error('[invitation] Bad content format for invitation [{0}]: {1}'.format(that.id, json.content));\n that.message = 'INVITATION.ERROR.BAD_INVITATION_FORMAT';\n that.pubkey = json.issuer;\n return;\n }\n\n var identity = {\n uid: json.content.substr(0, separatorIndex),\n pubkey: json.content.substr(separatorIndex+1)\n };\n\n // Prepare the state action\n that.state = 'app.wot_identity';\n that.stateParams = {\n pubkey: identity.pubkey,\n uid: identity.uid,\n action: 'certify'\n };\n\n // Ask certification to himself\n if (identity.pubkey == json.issuer) {\n that.pubkey = json.issuer;\n that.uid = identity.uid;\n that.message = 'INVITATION.ASK_CERTIFICATION';\n }\n\n // Ask certification to someone else\n else {\n that.issuer = {\n pubkey: json.issuer\n };\n that.message = 'INVITATION.SUGGESTION_CERTIFICATION';\n that.pubkey = identity.pubkey;\n that.uid = identity.uid;\n }\n\n }\n\n}\n","\n\nfunction EsPeer(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\nEsPeer.prototype.regexp = {\n API_REGEXP: /^([A-Z_]+)(?:[ ]+([a-z_][a-z0-9-_.ğĞ]*))?(?:[ ]+([0-9.]+))?(?:[ ]+([0-9a-f:]+))?(?:[ ]+([0-9]+))(?:\\/[^\\/]+)?$/,\n LOCAL_IP_ADDRESS: /^127[.]0[.]0.|192[.]168[.]|10[.]0[.]0[.]|172[.]16[.]/\n};\n\nEsPeer.prototype.keyID = function () {\n var ep = this.ep || this.getEP();\n if (ep.useBma) {\n return [this.pubkey || \"Unknown\", ep.dns, ep.ipv4, ep.ipv6, ep.port, ep.useSsl, ep.path].join('-');\n }\n return [this.pubkey || \"Unknown\", ep.ws2pid, ep.path].join('-');\n};\n\nEsPeer.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\nEsPeer.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\nEsPeer.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\nEsPeer.prototype.getEP = function() {\n if (this.ep) return this.ep;\n var ep = null;\n var epRegex = this.regexp.API_REGEXP;\n this.endpoints.forEach(function(epStr){\n var matches = !ep && epRegex.exec(epStr);\n if (matches) {\n ep = {\n \"api\": matches[1] || '',\n \"dns\": matches[2] || '',\n \"ipv4\": matches[3] || '',\n \"ipv6\": matches[4] || '',\n \"port\": matches[5] || 80,\n \"path\": matches[6] || '',\n \"useSsl\": matches[5] == 443\n };\n }\n });\n return ep || {};\n};\n\nEsPeer.prototype.getEndpoints = function(regexp) {\n if (!regexp) return this.endpoints;\n if (typeof regexp === 'string') regexp = new RegExp('^' + regexp);\n return this.endpoints.reduce(function(res, ep){\n return ep.match(regexp) ? res.concat(ep) : res;\n }, []);\n};\n\nEsPeer.prototype.hasEndpoint = function(endpoint){\n var regExp = this.regexp[endpoint] || new RegExp('^' + endpoint);\n var endpoints = this.getEndpoints(regExp);\n return endpoints && endpoints.length > 0;\n};\n\nEsPeer.prototype.hasEsEndpoint = function() {\n var endpoints = this.getEsEndpoints();\n return endpoints && endpoints.length > 0;\n};\n\nEsPeer.prototype.getEsEndpoints = function() {\n return this.getEndpoints(/^(ES_CORE_API|ES_USER_API|ES_SUBSCRIPTION_API|GCHANGE_API)/);\n};\n\nEsPeer.prototype.getDns = function() {\n var ep = this.ep || this.getEP();\n return ep.dns ? ep.dns : null;\n};\n\nEsPeer.prototype.getIPv4 = function() {\n var ep = this.ep || this.getEP();\n return ep.ipv4 ? ep.ipv4 : null;\n};\n\nEsPeer.prototype.getIPv6 = function() {\n var ep = this.ep || this.getEP();\n return ep.ipv6 ? ep.ipv6 : null;\n};\n\nEsPeer.prototype.getPort = function() {\n var ep = this.ep || this.getEP();\n return ep.port ? ep.port : null;\n};\n\nEsPeer.prototype.getHost = function() {\n var ep = this.ep || this.getEP();\n return ((ep.port == 443 || ep.useSsl) && ep.dns) ? ep.dns :\n (this.hasValid4(ep) ? ep.ipv4 :\n (ep.dns ? ep.dns :\n (ep.ipv6 ? '[' + ep.ipv6 + ']' :'')));\n};\n\nEsPeer.prototype.getURL = function() {\n var ep = this.ep || this.getEP();\n var host = this.getHost();\n var protocol = (ep.port == 443 || ep.useSsl) ? 'https' : 'http';\n return protocol + '://' + host + (ep.port ? (':' + ep.port) : '');\n};\n\nEsPeer.prototype.getServer = function() {\n var ep = this.ep || this.getEP();\n var host = this.getHost();\n return host + (host && ep.port ? (':' + ep.port) : '');\n};\n\nEsPeer.prototype.hasValid4 = function(ep) {\n return ep.ipv4 &&\n /* exclude private address - see https://fr.wikipedia.org/wiki/Adresse_IP */\n !ep.ipv4.match(this.regexp.LOCAL_IP_ADDRESS) ?\n true : false;\n};\n\nEsPeer.prototype.isReachable = function () {\n return !!this.getServer();\n};\n\nEsPeer.prototype.isSsl = function() {\n var ep = this.ep || this.getEP();\n return ep.useSsl;\n};\n\nEsPeer.prototype.isTor = function() {\n var ep = this.ep || this.getEP();\n return ep.useTor;\n};\n\nEsPeer.prototype.isHttp = function() {\n var ep = this.ep || this.getEP();\n return !bma.useTor;\n};\n\n","\nESPicturesEditController.$inject = ['$scope', 'UIUtils', '$q', 'Device'];\nESSocialsEditController.$inject = ['$scope', '$focus', '$filter', 'UIUtils', 'SocialUtils'];\nESSocialsViewController.$inject = ['$scope'];\nESCommentsController.$inject = ['$scope', '$filter', '$state', '$focus', '$timeout', '$anchorScroll', 'UIUtils'];\nESCategoryModalController.$inject = ['$scope', 'UIUtils', '$timeout', 'parameters'];\nESAvatarModalController.$inject = ['$scope', '$sce'];\nESPositionEditController.$inject = ['$scope', 'csConfig', 'esGeo', 'ModalUtils'];\nESLookupPositionController.$inject = ['$scope', '$q', 'csConfig', 'esGeo', 'ModalUtils'];\nESSearchPositionItemController.$inject = ['$scope', '$timeout', 'ModalUtils', 'csConfig', 'esGeo'];\nESSearchPositionModalController.$inject = ['$scope', '$q', '$translate', 'esGeo', 'parameters'];angular.module('cesium.es.common.controllers', ['ngResource', 'cesium.es.services'])\n\n .controller('ESPicturesEditCtrl', ESPicturesEditController)\n\n .controller('ESPicturesEditCtrl', ESPicturesEditController)\n\n .controller('ESSocialsEditCtrl', ESSocialsEditController)\n\n .controller('ESSocialsViewCtrl', ESSocialsViewController)\n\n .controller('ESCommentsCtrl', ESCommentsController)\n\n .controller('ESCategoryModalCtrl', ESCategoryModalController)\n\n .controller('ESAvatarModalCtrl', ESAvatarModalController)\n\n .controller('ESPositionEditCtrl', ESPositionEditController)\n\n .controller('ESLookupPositionCtrl', ESLookupPositionController)\n\n .controller('ESSearchPositionItemCtrl', ESSearchPositionItemController)\n\n .controller('ESSearchPositionModalCtrl', ESSearchPositionModalController)\n;\n\n\nfunction ESPicturesEditController($scope, UIUtils, $q, Device) {\n 'ngInject';\n\n $scope.selectNewPicture = function(inputSelector) {\n if (Device.enable){\n $scope.openPicturePopup();\n }\n else {\n var fileInput = angular.element(document.querySelector(inputSelector||'#pictureFile'));\n if (fileInput && fileInput.length > 0) {\n fileInput[0].click();\n }\n }\n };\n\n $scope.openPicturePopup = function() {\n Device.camera.getPicture()\n .then(function(imageData) {\n $scope.pictures.push({\n src: \"data:image/png;base64,\" + imageData,\n isnew: true // use to prevent visibility hidden (if animation)\n });\n })\n .catch(UIUtils.onError('ERROR.TAKE_PICTURE_FAILED'));\n };\n\n $scope.onFileChanged = function(event) {\n if (!event || !event.file) return;\n UIUtils.loading.show();\n var file = event.file;\n return UIUtils.image.resizeFile(file)\n .then(function(imageData) {\n $scope.pictures.push({\n src: imageData,\n isnew: true // use to prevent visibility hidden (if animation)\n });\n UIUtils.loading.hide(100);\n })\n .catch(function(err) {\n console.error(err);\n UIUtils.loading.hide();\n });\n };\n\n $scope.removePicture = function(index){\n $scope.pictures.splice(index, 1);\n };\n\n $scope.favoritePicture = function(index){\n if (index > 0) {\n var item = $scope.pictures[index];\n $scope.pictures.splice(index, 1);\n $scope.pictures.splice(0, 0, item);\n }\n };\n\n $scope.rotatePicture = function(index){\n var item = $scope.pictures[index];\n UIUtils.image.rotateSrc(item.src)\n .then(function(dataURL){\n item.src = dataURL;\n });\n };\n}\n\n\nfunction ESCategoryModalController($scope, UIUtils, $timeout, parameters) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.allCategories = [];\n $scope.categories = [];\n this.searchText = '';\n\n // modal title\n this.title = parameters && parameters.title;\n\n $scope.afterLoad = function(result) {\n $scope.categories = result;\n $scope.allCategories = result;\n $scope.loading = false;\n $timeout(function() {\n UIUtils.ink();\n }, 10);\n };\n\n this.doSearch = function() {\n var searchText = this.searchText.toLowerCase().trim();\n if (searchText.length > 1) {\n $scope.loading = true;\n $scope.categories = $scope.allCategories.reduce(function(result, cat) {\n if (cat.parent && cat.name.toLowerCase().search(searchText) != -1) {\n return result.concat(cat);\n }\n return result;\n }, []);\n\n $scope.loading = false;\n }\n else {\n $scope.categories = $scope.allCategories;\n }\n };\n\n // load categories\n if (parameters && parameters.categories) {\n $scope.afterLoad(parameters.categories);\n }\n else if (parameters && parameters.load) {\n parameters.load()\n .then(function(res){\n $scope.afterLoad(res);\n });\n }\n\n}\n\n\n\nfunction ESCommentsController($scope, $filter, $state, $focus, $timeout, $anchorScroll, UIUtils) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.defaultCommentSize = 5;\n $scope.formData = {};\n $scope.comments = {};\n\n $scope.$on('$recordView.enter', function(e, state) {\n // First enter\n if ($scope.loading) {\n $scope.anchor = state && state.stateParams.anchor;\n }\n // second call (when using cached view)\n else if (!$scope.loading && $scope.id) {\n $scope.load($scope.id, {animate: false});\n }\n });\n\n $scope.$on('$recordView.load', function(event, id, service) {\n $scope.id = id || $scope.id;\n $scope.service = service || $scope.service;\n console.debug(\"[ES] [comment] Will use {\" + service.index + \"} service\");\n if ($scope.id) {\n $scope.load($scope.id)\n .then(function() {\n // Scroll to anchor\n $scope.scrollToAnchor();\n });\n }\n });\n\n $scope.load = function(id, options) {\n options = options || {};\n options.from = options.from || 0;\n // If anchor has been defined, load all comments\n options.size = options.size || ($scope.anchor && -1/*all*/);\n options.size = options.size || $scope.defaultCommentSize;\n options.animate = angular.isDefined(options.animate) ? options.animate : true;\n options.loadAvatarAllParent = angular.isDefined(options.loadAvatarAllParent) ? options.loadAvatarAllParent : true;\n $scope.loading = true;\n return $scope.service.load(id, options)\n .then(function(data) {\n if (!options.animate && data.result.length) {\n _.forEach(data.result, function(cmt) {\n cmt.isnew = true;\n });\n }\n $scope.comments = data;\n $scope.comments.hasMore = (data.total > data.result.length);\n $scope.loading = false;\n $scope.service.changes.start(id, data, $scope);\n\n // Set Motion\n $scope.motion.show({\n selector: '.comments .item',\n ink: false\n });\n });\n };\n\n $scope.$on('$recordView.beforeLeave', function(){\n if ($scope.comments) {\n if (!$scope.service) {\n console.error('[comment] Comment controller has no service ! Unable to listen changes...');\n return;\n }\n $scope.service.changes.stop($scope.comments);\n }\n });\n\n $scope.scrollToAnchor = function() {\n if (!$scope.anchor) return;\n var elemList = document.getElementsByName($scope.anchor);\n // Waiting for the element\n if (!elemList || !elemList.length) {\n return $timeout($scope.scrollToAnchor, 500);\n }\n // If many, remove all anchor except the last one\n for (var i = 0; i<elemList.length-1; i++) {\n angular.element(elemList[i]).remove();\n }\n // Scroll to the anchor\n $anchorScroll($scope.anchor);\n // Remove the anchor. This will the CSS class 'positive-100-bg' on the comment\n $timeout(function () {\n $scope.anchor = null;\n }, 1500);\n };\n\n $scope.showMore = function(){\n var from = 0;\n var size = -1;\n $scope.load($scope.id, {from: from, size: size, loadAvatarAllParent: false})\n .then(function() {\n // Set Motion\n $scope.motion.show({\n selector: '.card-avatar'\n });\n });\n };\n\n $scope.onKeypress = function(event) {\n // If Ctrl + Enter: submit\n if (event && event.charCode == 10 && event.ctrlKey) {\n $scope.save();\n event.preventDefault();\n }\n };\n\n $scope.save = function() {\n if (!$scope.formData.message || !$scope.formData.message.length) return;\n\n $scope.loadWallet({minData: true, auth: true})\n .then(function() {\n UIUtils.loading.hide();\n var comment = $scope.formData;\n $scope.formData = {};\n $scope.focusNewComment();\n return $scope.service.save($scope.id, $scope.comments, comment);\n })\n .then(function() {\n $scope.comments.total++;\n })\n .catch(UIUtils.onError('COMMENTS.ERROR.FAILED_SAVE_COMMENT'));\n };\n\n $scope.share = function(event, comment) {\n var params = angular.copy($state.params);\n var stateUrl;\n if (params.anchor) {\n params.anchor= $filter('formatHash')(comment.id);\n stateUrl = $state.href($state.current.name, params, {absolute: true});\n }\n else {\n stateUrl = $state.href($state.current.name, params, {absolute: true}) + '/' + $filter('formatHash')(comment.id);\n }\n var index = _.findIndex($scope.comments.result, {id: comment.id});\n var url = stateUrl + '?u=' + (comment.uid||$filter('formatPubkey')(comment.issuer));\n UIUtils.popover.show(event, {\n templateUrl: 'templates/common/popover_share.html',\n scope: $scope,\n bindings: {\n titleKey: 'COMMENTS.POPOVER_SHARE_TITLE',\n titleValues: {number: index ? index + 1 : 1},\n date: comment.creationTime,\n value: url,\n postUrl: stateUrl,\n postMessage: comment.message\n },\n autoselect: '.popover-share input'\n });\n };\n\n $scope.edit = function(comment) {\n var newComment = new Comment();\n newComment.copy(comment);\n $scope.formData = newComment;\n };\n\n $scope.remove = function(comment) {\n if (!comment) {return;}\n comment.remove();\n $scope.comments.total--;\n };\n\n $scope.reply = function(parent) {\n if (!parent || !parent.id) {return;}\n\n $scope.formData = {\n parent: parent\n };\n\n $scope.focusNewComment(true);\n };\n\n $scope.cancel = function() {\n $scope.formData = {};\n $scope.focusNewComment();\n };\n\n $scope.focusNewComment = function(forceIfSmall) {\n if (!UIUtils.screen.isSmall()) {\n $focus('comment-form-textarea');\n }\n else {\n if (forceIfSmall) $focus('comment-form-input');\n }\n };\n\n $scope.removeParentLink = function() {\n delete $scope.formData.parent;\n delete $scope.formData.reply_to;\n $scope.focusNewComment();\n };\n\n $scope.toggleExpandedReplies = function(comment, index) {\n comment.expandedReplies = comment.expandedReplies || {};\n comment.expandedReplies[index] = !comment.expandedReplies[index];\n };\n\n $scope.toggleExpandedParent = function(comment, index) {\n comment.expandedParent = comment.expandedParent || {};\n comment.expandedParent[index] = !comment.expandedParent[index];\n };\n}\n\nfunction ESSocialsEditController($scope, $focus, $filter, UIUtils, SocialUtils) {\n 'ngInject';\n\n $scope.socialData = {\n url: null,\n reorder: false\n };\n\n $scope.addSocialNetwork = function() {\n if (!$scope.socialData.url || $scope.socialData.url.trim().length === 0) {\n return;\n }\n\n $scope.formData.socials = $scope.formData.socials || [];\n var url = $scope.socialData.url.trim();\n\n var exists = _.findWhere($scope.formData.socials, {url: url});\n if (exists) { // duplicate entry\n $scope.socialData.url = '';\n return;\n }\n\n var social = SocialUtils.get(url);\n if (!social) {\n UIUtils.alert.error('PROFILE.ERROR.INVALID_SOCIAL_NETWORK_FORMAT');\n $focus('socialUrl');\n return; // stop here\n }\n $scope.formData.socials.push(social);\n $scope.socialData.url = '';\n\n // Set Motion\n $scope.motion.show({\n selector: '#social-' + $filter('formatSlug')(social.url),\n startVelocity: 10000\n });\n };\n\n $scope.editSocialNetwork = function(index) {\n var social = $scope.formData.socials[index];\n $scope.formData.socials.splice(index, 1);\n $scope.socialData.url = social.url;\n $focus('socialUrl');\n };\n\n\n $scope.reorderSocialNetwork = function(social, fromIndex, toIndex) {\n if (!social || fromIndex == toIndex) return; // no changes\n $scope.formData.socials.splice(fromIndex, 1);\n $scope.formData.socials.splice(toIndex, 0, social);\n };\n\n $scope.filterFn = function(social) {\n return !social.recipient || social.valid;\n };\n}\n\nfunction ESSocialsViewController($scope) {\n 'ngInject';\n\n $scope.openSocial = function(event, social) {\n return $scope.openLink(event, social.url, {\n type: social.type\n });\n };\n\n\n $scope.filterFn = function(social) {\n return !social.recipient || social.valid;\n };\n\n}\n\n\n\nfunction ESAvatarModalController($scope, $sce) {\n\n $scope.formData = {\n initCrop: false,\n imageCropStep: 0,\n imgSrc: undefined,\n result: undefined,\n resultBlob: undefined\n };\n\n $scope.onFileChanged = function(event) {\n if (!event || !event.file) return; // Skip\n\n var fileReader = new FileReader();\n fileReader.readAsDataURL(event.file);\n\n fileReader.onload = function(e) {\n var res = this.result;\n $scope.$applyAsync(function() {\n $scope.formData.imgSrc = $sce.getTrustedHtml(res);\n });\n };\n };\n\n $scope.doNext = function() {\n if ($scope.formData.imageCropStep === 2) {\n $scope.doCrop();\n }\n else if ($scope.formData.imageCropStep === 3) {\n $scope.closeModal($scope.formData.result);\n }\n };\n\n $scope.doPrevious = function() {\n $scope.formData.imageCropStep -= 1;\n };\n\n $scope.doCrop = function() {\n $scope.formData.initCrop = true;\n };\n\n $scope.clear = function() {\n $scope.formData = {\n initCrop: false,\n imageCropStep: 1,\n imgSrc: undefined,\n result: undefined,\n resultBlob: undefined\n };\n };\n\n}\n\n\nfunction ESPositionEditController($scope, csConfig, esGeo, ModalUtils) {\n 'ngInject';\n\n // The default country used for address localisation\n var defaultCountry = csConfig.plugins && csConfig.plugins.es && csConfig.plugins.es.defaultCountry;\n\n var loadingCurrentPosition = false;\n $scope.formPosition = {\n loading: false,\n enable: undefined\n };\n $scope.searchModalOpened = false;\n\n $scope.tryToLocalize = function() {\n if ($scope.formPosition.loading || loadingCurrentPosition) return;\n\n var searchText = $scope.getAddressToSearch();\n\n // No address, so try to localize by device\n if (!searchText) {\n loadingCurrentPosition = true;\n return esGeo.point.current()\n .then($scope.updateGeoPoint)\n .then(function() {\n loadingCurrentPosition = false;\n })\n .catch(function(err) {\n console.error(err); // Silent\n loadingCurrentPosition = false;\n });\n }\n\n $scope.formPosition.loading = true;\n return esGeo.point.searchByAddress(searchText)\n .then(function(res) {\n if (res && res.length == 1) {\n return $scope.updateGeoPoint(res[0]);\n }\n return $scope.openSearchLocationModal({\n text: searchText,\n results: res||[],\n forceFallback: !res || !res.length // force fallback search first\n });\n })\n .then(function() {\n $scope.formPosition.loading = false;\n })\n .catch(function(err) {\n console.error(err); // Silent\n $scope.formPosition.loading = false;\n });\n };\n\n $scope.onCityChanged = function() {\n if ($scope.loading) return;\n if ($scope.formPosition.enable) {\n if ($scope.formData.geoPoint) {\n // Invalidate the position\n $scope.formData.geoPoint.lat = undefined;\n $scope.formData.geoPoint.lon = undefined;\n }\n return $scope.tryToLocalize();\n }\n };\n\n $scope.onUseGeopointChanged = function() {\n if ($scope.loading) return;\n if (!$scope.formPosition.enable) {\n if ($scope.formData.geoPoint) {\n $scope.formData.geoPoint.lat = undefined;\n $scope.formData.geoPoint.lon = undefined;\n $scope.dirty = true;\n }\n }\n else {\n $scope.tryToLocalize();\n }\n };\n\n $scope.onGeopointChanged = function() {\n if ($scope.loading) {\n $scope.formPosition.enable = $scope.formData.geoPoint && !!$scope.formData.geoPoint.lat && !!$scope.formData.geoPoint.lon;\n }\n };\n $scope.$watch('formData.geoPoint', $scope.onGeopointChanged);\n\n $scope.getAddressToSearch = function() {\n return $scope.formData.address && $scope.formData.city ?\n [$scope.formData.address.trim(), $scope.formData.city.trim()].join(', ') :\n $scope.formData.city || $scope.formData.address || $scope.formData.location ;\n };\n\n $scope.updateGeoPoint = function(res) {\n // user cancel\n if (!res || !res.lat || !res.lon) {\n // nothing to do\n return;\n }\n\n $scope.dirty = true;\n $scope.formData.geoPoint = $scope.formData.geoPoint || {};\n $scope.formData.geoPoint.lat = parseFloat(res.lat);\n $scope.formData.geoPoint.lon = parseFloat(res.lon);\n\n if (res.address && res.address.city) {\n var cityParts = [res.address.city];\n if (res.address.postcode) {\n cityParts.push(res.address.postcode);\n }\n if (res.address.country != defaultCountry) {\n cityParts.push(res.address.country);\n }\n $scope.formData.city = cityParts.join(', ');\n }\n };\n\n /* -- modal -- */\n\n $scope.openSearchLocationModal = function(options) {\n\n if ($scope.searchModalOpened) return; // Skip\n\n $scope.searchModalOpened = true;\n options = options || {};\n\n var parameters = {\n text: options.text || $scope.getAddressToSearch(),\n results: options.results,\n fallbackText: options.fallbackText || $scope.formData.city,\n forceFallback: angular.isDefined(options.forceFallback) ? options.forceFallback : undefined\n };\n\n return ModalUtils.show(\n 'plugins/es/templates/common/modal_location.html',\n 'ESSearchPositionModalCtrl',\n parameters,\n {\n focusFirstInput: true\n }\n )\n .then(function(res) {\n $scope.searchModalOpened = false;\n $scope.updateGeoPoint(res);\n })\n .catch(function() {\n console.error(err);\n $scope.searchModalOpened = false;\n });\n };\n}\n\n\nfunction ESLookupPositionController($scope, $q, csConfig, esGeo, ModalUtils) {\n 'ngInject';\n\n // The default country used for address localisation\n var defaultCountry = csConfig.plugins && csConfig.plugins.es && csConfig.plugins.es.defaultCountry;\n var loadingPosition = false;\n\n $scope.geoDistanceLabels = [5,10,20,50,100,250,500].reduce(function(res, distance){\n res[distance] = {\n labelKey: 'LOCATION.DISTANCE_OPTION',\n labelParams: {value: distance}\n };\n return res;\n }, {});\n $scope.geoDistances = _.keys($scope.geoDistanceLabels);\n\n $scope.searchPosition = function(searchText) {\n if (loadingPosition) return $q.when();\n\n loadingPosition = true;\n\n // No address, so try to localize by device\n var promise = !searchText ?\n esGeo.point.current() :\n esGeo.point.searchByAddress(searchText)\n .then(function(res) {\n if (res && res.length == 1) {\n res[0].exact = true;\n return res[0];\n }\n return $scope.openSearchLocationModal({\n text: searchText,\n results: res||[],\n forceFallback: !res || !res.length // force fallback search first\n })\n .then(function(res) {\n // Compute point name\n if (res && res.address && res.address.city) {\n var cityParts = [res.address.city];\n if (res.address.postcode) {\n cityParts.push(res.address.postcode);\n }\n if (res.address.country != defaultCountry) {\n cityParts.push(res.address.country);\n }\n res.shortName = cityParts.join(', ');\n }\n return res;\n });\n });\n\n promise\n .then(function(res) {\n\n loadingPosition = false;\n\n // user cancel\n if (!res || !res.lat || !res.lon) return;\n\n return {\n lat: parseFloat(res.lat),\n lon: parseFloat(res.lon),\n name: res.shortName,\n exact: res.exact\n };\n\n })\n .catch(function(err) {\n console.error(err); // Silent\n loadingPosition = false;\n });\n\n return promise;\n };\n\n\n /* -- modal -- */\n\n $scope.openSearchLocationModal = function(options) {\n\n options = options || {};\n\n var parameters = {\n text: options.text || $scope.getAddressToSearch(),\n results: options.results,\n fallbackText: options.fallbackText || $scope.search.location,\n forceFallback: angular.isDefined(options.forceFallback) ? options.forceFallback : undefined\n };\n\n return ModalUtils.show(\n 'plugins/es/templates/common/modal_location.html',\n 'ESSearchPositionModalCtrl',\n parameters,\n {\n focusFirstInput: true\n //,scope: $scope\n }\n );\n };\n}\n\nfunction ESSearchPositionItemController($scope, $timeout, ModalUtils, csConfig, esGeo) {\n 'ngInject';\n\n // The default country used for address localisation\n var defaultCountry = csConfig.plugins && csConfig.plugins.es && csConfig.plugins.es.defaultCountry;\n //$scope.smallscreen = angular.isDefined($scope.smallscreen) ? $scope.smallscreen : UIUtils.screen.isSmall();\n\n var loadingPosition = false;\n var minLength = 3;\n $scope.locations = undefined;\n $scope.selectLocationIndex = -1;\n\n $scope.onKeydown = function(e) {\n\n switch(e.keyCode)\n {\n case 27://Esc\n $scope.hideDropdown();\n break;\n case 13://Enter\n if($scope.locations && $scope.locations.length)\n $scope.onEnter();\n break;\n case 38://Up\n $scope.onArrowUpOrDown(-1);\n e.preventDefault();\n break;\n case 40://Down\n $scope.onArrowUpOrDown(1);\n e.preventDefault();\n break;\n case 8://Backspace\n case 45://Insert\n case 46://Delete\n break;\n case 37://Left\n case 39://Right\n case 16://Shift\n case 17://Ctrl\n case 35://End\n case 36://Home\n break;\n default://All keys\n $scope.showDropdown();\n }\n };\n\n $scope.onEnter = function() {\n if ($scope.selectLocationIndex > -1) {\n $scope.selectLocation($scope.locations[$scope.selectLocationIndex]);\n }\n else {\n $scope.selectLocation($scope.locations[0]);\n }\n };\n\n $scope.onArrowUpOrDown = function(velocity) {\n if (!$scope.locations) return;\n\n $scope.selectLocationIndex+=velocity;\n if ($scope.selectLocationIndex >= $scope.locations.length) {\n $scope.selectLocationIndex = 0;\n }\n if ($scope.selectLocationIndex < 0) {\n $scope.selectLocationIndex = $scope.locations.length-1;\n }\n\n _.forEach($scope.locations||[], function(item, index) {\n item.selected = (index == $scope.selectLocationIndex);\n });\n\n // TODO: scroll to item ?\n };\n\n $scope.onLocationChanged = function() {\n if (loadingPosition || $scope.search.loading) return;\n $scope.search.geoPoint = undefined; // reset geo point\n\n $scope.showDropdown();\n };\n\n $scope.showDropdown = function() {\n var text = $scope.search.location && $scope.search.location.trim();\n if (!text || text.length < minLength) {\n return $scope.hideDropdown(true/*force, if still loading*/);\n }\n\n // Compute a request id, to apply response only if current request\n var requestId = ($scope.requestId && $scope.requestId + 1) || 1;\n $scope.requestId = requestId;\n\n loadingPosition = true;\n\n // Execute the given query\n return esGeo.point.searchByAddress(text)\n .then(function(res) {\n if ($scope.requestId != requestId) return; // Skip apply if not same request:\n\n loadingPosition = false;\n $scope.locations = res||[];\n $scope.license = res && res.length && res[0].license;\n })\n .catch(function(err) {\n $scope.hideDropdown();\n throw err;\n });\n };\n\n $scope.hideDropdown = function(force) {\n // force, even if still loading\n if (force) {\n $scope.locations = undefined;\n $scope.selectLocationIndex = -1;\n $scope.license = undefined;\n loadingPosition = false;\n return;\n }\n\n return $timeout(function() {\n if (loadingPosition) return;\n $scope.locations = undefined;\n $scope.license = undefined;\n loadingPosition = false;\n }, 500);\n };\n\n $scope.selectLocation = function(res, exactMatch) {\n loadingPosition = true; // avoid event\n if (res) {\n // Update position\n $scope.search.geoPoint = $scope.search.geoPoint || {};\n $scope.search.geoPoint.lat = parseFloat(res.lat);\n $scope.search.geoPoint.lon = parseFloat(res.lon);\n\n if (exactMatch) {\n $scope.search.geoPoint.exact = true;\n }\n else {\n // Update location name\n if (res && res.address && res.address.city) {\n var cityParts = [res.address.city];\n if (res.address.postcode) {\n cityParts.push(res.address.postcode);\n }\n if (res.address.country != defaultCountry) {\n cityParts.push(res.address.country);\n }\n $scope.search.location = cityParts.join(', ');\n }\n }\n }\n\n $scope.hideDropdown(true);\n };\n\n /* -- modal -- */\n\n $scope.openSearchLocationModal = function(options) {\n\n options = options || {\n text: $scope.search.location\n };\n\n var parameters = {\n text: options.text || $scope.search.location\n };\n\n return ModalUtils.show(\n 'plugins/es/templates/common/modal_location.html',\n 'ESSearchPositionModalCtrl',\n parameters,\n {\n focusFirstInput: true\n }\n )\n .then($scope.selectLocation);\n };\n\n}\n\nfunction ESSearchPositionModalController($scope, $q, $translate, esGeo, parameters) {\n 'ngInject';\n\n $scope.search = {\n text: parameters.text || '',\n fallbackText: parameters.fallbackText || undefined,\n forceFallback: angular.isDefined(parameters.forceFallback) ? parameters.forceFallback : false,\n loading: false,\n results: parameters.results || undefined\n };\n\n $scope.$on('modal.shown', function() {\n // Load search\n $scope.doSearch(true/*first search*/);\n });\n\n $scope.doSearch = function(firstSearch) {\n\n var text = $scope.search.text && $scope.search.text.trim();\n if (!text) {\n return $q.when(); // nothing to search\n }\n\n $scope.search.loading = true;\n\n // Compute alternative query text\n var fallbackText = firstSearch && $scope.search.fallbackText && $scope.search.fallbackText.trim();\n fallbackText = fallbackText && fallbackText != text ? fallbackText : undefined;\n\n // Execute the given query\n return ((firstSearch && $scope.search.forceFallback && $scope.search.results) ?\n $q.when($scope.search.results) :\n esGeo.point.searchByAddress(text)\n )\n .then(function(res) {\n if (res && res.length || !fallbackText) return res;\n\n // Fallback search\n return $q.all([\n $translate('LOCATION.MODAL.ALTERNATIVE_RESULT_DIVIDER', {address: fallbackText}),\n esGeo.point.searchByAddress(fallbackText)\n ])\n .then(function (res) {\n var dividerText = res[0];\n res = res[1];\n if (!res || !res.length) return res;\n\n return [{name: dividerText}].concat(res);\n });\n })\n .then(function(res) {\n $scope.search.loading = false;\n $scope.search.results = res||[];\n\n $scope.license = res && res.length && res[0].license;\n })\n .catch(function(err) {\n $scope.search.loading = false;\n $scope.search.results = [];\n $scope.license = undefined;\n throw err;\n })\n ;\n };\n\n}\n","\nESExtensionController.$inject = ['$scope', 'esSettings', 'PluginService'];\nESMenuExtendController.$inject = ['$scope', '$state', '$controller', 'UIUtils', 'csWallet'];\nESProfilePopoverExtendController.$inject = ['$scope', '$q', '$state', 'esSettings', 'csWallet'];angular.module('cesium.es.app.controllers', ['ngResource', 'cesium.es.services'])\n\n // Configure menu items\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Menu extension points\n PluginServiceProvider.extendState('app', {\n points: {\n // removeIf(device)\n 'nav-buttons-right': {\n templateUrl: \"plugins/es/templates/menu_extend.html\",\n controller: \"ESMenuExtendCtrl\"\n },\n // endRemoveIf(device)\n 'menu-user': {\n templateUrl: \"plugins/es/templates/menu_extend.html\",\n controller: \"ESMenuExtendCtrl\"\n }\n }\n });\n\n // Profile popover extension points\n PluginServiceProvider.extendState('app', {\n points: {\n 'profile-popover-user': {\n templateUrl: \"plugins/es/templates/common/popover_profile_extend.html\",\n controller: \"ESProfilePopoverExtendCtrl\"\n }\n }\n });\n }\n }])\n\n .controller('ESExtensionCtrl', ESExtensionController)\n\n .controller('ESMenuExtendCtrl', ESMenuExtendController)\n\n .controller('ESProfilePopoverExtendCtrl', ESProfilePopoverExtendController)\n\n\n;\n\n\n/**\n * Generic controller, that enable/disable depending on esSettings enable/disable\n */\nfunction ESExtensionController($scope, esSettings, PluginService) {\n 'ngInject';\n $scope.extensionPoint = PluginService.extensions.points.current.get();\n $scope.enable = esSettings.isEnable();\n esSettings.api.state.on.changed($scope, function(enable) {\n $scope.enable = enable;\n $scope.$broadcast('$$rebind::state');\n });\n}\n\n/**\n * Control menu extension\n */\nfunction ESMenuExtendController($scope, $state, $controller, UIUtils, csWallet) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESExtensionCtrl', {$scope: $scope}));\n\n $scope.showRegistryLookupView = function() {\n $state.go(UIUtils.screen.isSmall() ? 'app.wot_lookup.tab_registry': 'app.registry_lookup_lg');\n };\n\n $scope.showNotificationsPopover = function(event) {\n return UIUtils.popover.show(event, {\n templateUrl :'plugins/es/templates/notification/popover_notification.html',\n scope: $scope,\n autoremove: false, // reuse popover\n // Auto-close if open when un-authenticate\n afterShow: function(popover) {\n var listener = csWallet.api.data.on.unauth(popover.scope, function() {\n popover.scope.closePopover();\n listener();\n });\n }\n });\n };\n\n $scope.showMessagesPopover = function(event) {\n // Make sure tobe auth before opening this popover\n if (!csWallet.isAuth()) {\n return csWallet.auth({minData: true}).then(function(){\n UIUtils.loading.hide();\n return $scope.showMessagesPopover(event); // loop\n });\n }\n\n return UIUtils.popover.show(event, {\n templateUrl :'plugins/es/templates/message/popover_message.html',\n scope: $scope,\n autoremove: false, // reuse popover\n // Auto-close if open when un-authenticate\n afterShow: function(popover) {\n var listener = csWallet.api.data.on.unauth(popover.scope, function() {\n popover.scope.closePopover();\n listener();\n });\n }\n });\n };\n\n $scope.showInvitationsPopover = function(event) {\n // Make sure tobe auth before opening this popover\n if (!csWallet.isAuth()) {\n return csWallet.auth().then(function(){\n UIUtils.loading.hide();\n return $scope.showInvitationsPopover(event); // loop\n });\n }\n\n return UIUtils.popover.show(event, {\n templateUrl :'plugins/es/templates/invitation/popover_invitation.html',\n scope: $scope,\n autoremove: false, // reuse popover\n // Auto-close if open when un-authenticate\n afterShow: function(popover) {\n var listener = csWallet.api.data.on.unauth(popover.scope, function() {\n popover.scope.closePopover();\n listener();\n });\n }\n });\n };\n}\n\n/**\n * Control profile popover extension\n */\nfunction ESProfilePopoverExtendController($scope, $q, $state, esSettings, csWallet) {\n 'ngInject';\n\n $scope.updateView = function() {\n $scope.enable = csWallet.isLogin() && esSettings.isEnable();\n };\n\n $scope.showEditUserProfile = function() {\n $scope.closeProfilePopover();\n $state.go('app.edit_profile');\n };\n\n esSettings.api.state.on.changed($scope, $scope.updateView);\n csWallet.api.data.on.login($scope, function(data, deferred){\n $scope.enable = esSettings.isEnable();\n return deferred && deferred.resolve() || $q.when();\n });\n csWallet.api.data.on.logout($scope, function() {\n $scope.enable = false;\n });\n\n // Default action\n $scope.updateView();\n\n}\n","\nESPluginSettingsController.$inject = ['$scope', '$window', '$q', '$translate', '$ionicPopup', 'UIUtils', 'Modals', 'csHttp', 'csConfig', 'csSettings', 'esHttp', 'esSettings', 'esModals'];angular.module('cesium.es.settings.controllers', ['cesium.es.services'])\n\n // Configure menu items\n .config(['PluginServiceProvider', '$stateProvider', 'csConfig', function(PluginServiceProvider, $stateProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Extend settings via extension points\n PluginServiceProvider.extendState('app.settings', {\n points: {\n 'plugins': {\n templateUrl: \"plugins/es/templates/settings/settings_extend.html\",\n controller: \"ESExtensionCtrl\"\n }\n }\n });\n\n $stateProvider\n .state('app.es_settings', {\n url: \"/settings/es\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/settings/plugin_settings.html\",\n controller: 'ESPluginSettingsCtrl'\n }\n }\n });\n }\n }])\n\n .controller('ESPluginSettingsCtrl', ESPluginSettingsController)\n;\n\n\n/*\n * Settings extend controller\n */\nfunction ESPluginSettingsController ($scope, $window, $q, $translate, $ionicPopup,\n UIUtils, Modals, csHttp, csConfig, csSettings, esHttp, esSettings, esModals) {\n 'ngInject';\n\n $scope.hasWindowNotification = !!(\"Notification\" in window);\n $scope.formData = {};\n $scope.popupData = {}; // need for the node popup\n $scope.loading = true;\n\n $scope.enter= function(e, state) {\n $scope.load();\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.load = function(keepEnableState) {\n $scope.loading = true;\n\n var wasEnable = $scope.formData.enable;\n $scope.formData = csSettings.data.plugins && csSettings.data.plugins.es ?\n angular.copy(csSettings.data.plugins.es) : {\n enable: false,\n host: undefined,\n port: undefined\n };\n if (keepEnableState && wasEnable) {\n $scope.formData.enable = wasEnable;\n }\n\n $scope.isFallbackNode = $scope.formData.enable && esHttp.node.isFallback();\n $scope.server = $scope.getServer(esHttp);\n\n $scope.loading = false;\n };\n\n esSettings.api.state.on.changed($scope, function(enable) {\n $scope.load(true);\n });\n\n $scope.setPopupForm = function(popupForm) {\n $scope.popupForm = popupForm;\n };\n\n // Change ESnode\n $scope.changeEsNode= function(node) {\n node = node || {\n host: $scope.formData.host,\n port: $scope.formData.port && $scope.formData.port != 80 && $scope.formData.port != 443 ? $scope.formData.port : undefined,\n useSsl: angular.isDefined($scope.formData.useSsl) ?\n $scope.formData.useSsl :\n ($scope.formData.port == 443)\n };\n\n $scope.showNodePopup(node)\n .then(function(newNode) {\n if (newNode.host === $scope.formData.host &&\n newNode.port == $scope.formData.port &&\n newNode.useSsl == $scope.formData.useSsl) {\n UIUtils.loading.hide();\n return; // same node = nothing to do\n }\n UIUtils.loading.show();\n\n var newEsNode = esHttp.instance(newNode.host, newNode.port, newNode.useSsl);\n return newEsNode.isAlive() // ping the node\n .then(function(alive) {\n if (!alive) {\n UIUtils.loading.hide();\n return UIUtils.alert.error('ERROR.INVALID_NODE_SUMMARY')\n .then(function(){\n $scope.changeEsNode(newNode); // loop\n });\n }\n\n $scope.formData.host = newEsNode.host;\n $scope.formData.port = newEsNode.port;\n $scope.formData.useSsl = newEsNode.useSsl;\n\n return esHttp.copy(newEsNode);\n })\n .then(function() {\n $scope.server = $scope.getServer(esHttp);\n $scope.isFallbackNode = false;\n UIUtils.loading.hide();\n });\n });\n };\n\n // Show node popup\n $scope.showNodePopup = function(node) {\n\n return $q(function(resolve, reject) {\n var parts = [node.host];\n if (node.port && node.port != 80) {\n parts.push(node.port);\n }\n $scope.popupData.newNode = parts.join(':');\n $scope.popupData.useSsl = angular.isDefined(node.useSsl) ? node.useSsl : (node.port == 443);\n if (!!$scope.popupForm) {\n $scope.popupForm.$setPristine();\n }\n $translate(['ES_SETTINGS.POPUP_PEER.TITLE', 'ES_SETTINGS.POPUP_PEER.HELP', 'COMMON.BTN_OK', 'COMMON.BTN_CANCEL'])\n .then(function (translations) {\n // Choose UID popup\n $ionicPopup.show({\n templateUrl: 'templates/settings/popup_node.html',\n title: translations['ES_SETTINGS.POPUP_PEER.TITLE'],\n subTitle: translations['ES_SETTINGS.POPUP_PEER.HELP'],\n scope: $scope,\n buttons: [\n { text: translations['COMMON.BTN_CANCEL'] },\n {\n text: translations['COMMON.BTN_OK'],\n type: 'button-positive',\n onTap: function(e) {\n $scope.popupForm.$submitted=true;\n if(!$scope.popupForm.$valid || !$scope.popupForm.newNode) {\n //don't allow the user to close unless he enters a node\n e.preventDefault();\n } else {\n return {\n server: $scope.popupData.newNode,\n useSsl: $scope.popupData.useSsl\n };\n }\n }\n }\n ]\n })\n .then(function(res) {\n if (!res) { // user cancel\n UIUtils.loading.hide();\n return;\n }\n var parts = res.server.split(':');\n parts[1] = parts[1] ? parts[1] : (res.useSsl ? 443 : 80);\n resolve({\n host: parts[0],\n port: parts[1],\n useSsl: res.useSsl\n });\n });\n });\n });\n };\n\n $scope.showNodeList = function() {\n // Check if need a filter on SSL node\n var forceUseSsl = (csConfig.httpsMode === 'true' || csConfig.httpsMode === true || csConfig.httpsMode === 'force') ||\n ($window.location && $window.location.protocol === 'https:') ? true : false;\n\n $ionicPopup._popupStack[0].responseDeferred.promise.close();\n return esModals.showNetworkLookup({\n enableFilter: true,\n endpoint: esHttp.constants.ES_USER_API_ENDPOINT,\n ssl: forceUseSsl ? true: undefined\n })\n .then(function (peer) {\n if (!peer) return;\n var esEps = (peer.getEsEndpoints() || []).reduce(function(res, ep){\n var esEp = esHttp.node.parseEndPoint(ep);\n return esEp ? res.concat(esEp) : res;\n }, []);\n if (!esEps.length) return;\n var ep = esEps[0];\n return {\n host: (ep.dns ? ep.dns :\n (peer.hasValid4(ep) ? ep.ipv4 : ep.ipv6)),\n port: ep.port || 80,\n useSsl: ep.useSsl || ep.port == 443\n };\n })\n .then(function(newEsNode) {\n $scope.changeEsNode(newEsNode); // get back to node popup\n });\n };\n\n $scope.onFormChanged = function() {\n if ($scope.loading) return;\n\n if ($scope.hasWindowNotification &&\n $scope.formData.notifications.emitHtml5 !== (window.Notification.permission === \"granted\")){\n window.Notification.requestPermission(function (permission) {\n // If the user accepts, let's create a notification\n $scope.formData.notifications.emitHtml5 = (permission === \"granted\"); // revert to false if permission not granted\n $scope.onFormChanged(); // Loop\n });\n return;\n }\n\n $scope.loading = true;\n csSettings.data.plugins = csSettings.data.plugins || {};\n csSettings.data.plugins.es = csSettings.data.plugins.es ?\n angular.merge(csSettings.data.plugins.es, $scope.formData) :\n $scope.formData;\n\n // Fix old settings (unused)\n delete csSettings.data.plugins.es.newNode;\n\n csSettings.store()\n .then(function() {\n $scope.loading = false;\n });\n };\n $scope.$watch('formData', $scope.onFormChanged, true);\n\n $scope.getServer = function(node) {\n node = node || $scope.formData;\n if (!node.host) return undefined;\n return csHttp.getServer(node.host, node.port);\n };\n}\n","\nESWalletViewController.$inject = ['$scope', '$controller', '$state', 'csWallet', 'esModals'];\nESWalletLikesController.$inject = ['$scope', '$controller', 'UIUtils', 'esHttp', 'esProfile'];angular.module('cesium.es.wallet.controllers', ['cesium.es.services'])\n\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n PluginServiceProvider\n .extendStates(['app.view_wallet', 'app.view_wallet_by_id'], {\n points: {\n 'hero': {\n templateUrl: \"plugins/es/templates/wallet/view_wallet_extend.html\",\n controller: 'ESWalletLikesCtrl'\n },\n 'after-general': {\n templateUrl: \"plugins/es/templates/wallet/view_wallet_extend.html\",\n controller: 'ESWalletViewCtrl'\n }\n }\n })\n\n .extendState('app.view_wallets', {\n points: {\n 'item-wallet': {\n templateUrl: \"plugins/es/templates/wallet/item_wallet_extend.html\",\n controller: 'ESExtensionCtrl'\n }\n }\n })\n\n ;\n }\n\n }])\n\n\n .controller('ESWalletViewCtrl', ESWalletViewController)\n\n .controller('ESWalletLikesCtrl', ESWalletLikesController)\n\n;\n\nfunction ESWalletViewController($scope, $controller, $state, csWallet, esModals) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESExtensionCtrl', {$scope: $scope}));\n\n $scope.showProfileHelp = false;\n\n /* -- modals -- */\n\n $scope.showNewPageModal = function(event) {\n var wallet = ($state.params && $state.params.id) ? csWallet.children.get($state.params.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return;\n }\n\n return esModals.showNewPage({wallet: wallet});\n };\n}\n\n\nfunction ESWalletLikesController($scope, $controller, UIUtils, esHttp, esProfile) {\n 'ngInject';\n\n $scope.options = $scope.options || {};\n $scope.options.like = $scope.options.like || {\n index: 'user',\n type: 'profile',\n service: esProfile.like\n };\n $scope.canEdit = true; // Avoid to change like counter itself\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESLikesCtrl', {$scope: $scope}));\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESExtensionCtrl', {$scope: $scope}));\n\n // Load likes, when profile loaded\n $scope.$watch('formData.pubkey', function(pubkey) {\n if (pubkey) {\n $scope.loadLikes(pubkey);\n }\n });\n}\n","\nESWotLookupExtendController.$inject = ['$scope', '$controller', '$state'];\nESWotIdentityViewController.$inject = ['$scope', '$ionicPopover', '$q', '$controller', '$timeout', 'UIUtils', 'Modals', 'csWallet', 'esHttp', 'esLike', 'esModals', 'esWallet', 'esProfile', 'esInvitation'];angular.module('cesium.es.wot.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n PluginServiceProvider\n\n .extendState('app.wot_lookup', {\n points: {\n 'tabs': {\n templateUrl: \"plugins/es/templates/wot/lookup_extend.html\",\n controller: \"ESExtensionCtrl\"\n }\n }\n })\n\n .extendState('app.wot_lookup_lg', {\n points: {\n 'top': {\n templateUrl: \"plugins/es/templates/wot/lookup_lg_extend.html\",\n controller: \"ESWotLookupExtendCtrl\"\n }\n }\n })\n\n .extendStates(['app.wot_identity', 'app.wot_identity_uid'], {\n points: {\n 'hero': {\n templateUrl: \"plugins/es/templates/wot/view_identity_extend.html\",\n controller: 'ESWotIdentityViewCtrl'\n },\n 'general': {\n templateUrl: \"plugins/es/templates/wot/view_identity_extend.html\",\n controller: 'ESWotIdentityViewCtrl'\n },\n 'after-general': {\n templateUrl: \"plugins/es/templates/wot/view_identity_extend.html\",\n controller: 'ESWotIdentityViewCtrl'\n },\n 'buttons': {\n templateUrl: \"plugins/es/templates/wot/view_identity_extend.html\",\n controller: 'ESWotIdentityViewCtrl'\n },\n 'after-buttons': {\n templateUrl: \"plugins/es/templates/wot/view_identity_extend.html\",\n controller: 'ESWotIdentityViewCtrl'\n },\n 'buttons-top-fab': {\n templateUrl: \"plugins/es/templates/wot/view_identity_extend.html\",\n controller: 'ESWotIdentityViewCtrl'\n }\n }\n })\n\n .extendStates(['app.wot_cert', 'app.wot_cert_lg', 'app.wallet_cert', 'app.wallet_cert_lg'], {\n points: {\n 'nav-buttons': {\n templateUrl: \"plugins/es/templates/wot/view_certifications_extend.html\",\n controller: 'ESWotIdentityViewCtrl'\n },\n 'buttons': {\n templateUrl: \"plugins/es/templates/wot/view_certifications_extend.html\",\n controller: 'ESWotIdentityViewCtrl'\n }\n }\n })\n ;\n }\n\n }])\n\n\n .controller('ESWotLookupExtendCtrl', ESWotLookupExtendController)\n\n .controller('ESWotIdentityViewCtrl', ESWotIdentityViewController)\n\n;\n\nfunction ESWotLookupExtendController($scope, $controller, $state) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESExtensionCtrl', {$scope: $scope}));\n\n $scope.openRegistryLookup = function() {\n\n var text = $scope.search.text && $scope.search.text.trim() || '';\n var location = $scope.search.location && $scope.search.location.trim() || '';\n var stateParams = {\n q: text.length ? text : undefined,\n location: location.length ? location : undefined\n };\n\n $state.go('app.wot_lookup.tab_registry', stateParams);\n };\n}\n\nfunction ESWotIdentityViewController($scope, $ionicPopover, $q, $controller, $timeout, UIUtils, Modals, csWallet,\n esHttp, esLike, esModals, esWallet, esProfile, esInvitation) {\n 'ngInject';\n\n $scope.options = $scope.options || {};\n $scope.options.like = $scope.options.like || {\n kinds: esLike.constants.KINDS,\n index: 'user',\n type: 'profile',\n service: esProfile.like\n };\n $scope.smallscreen = angular.isDefined($scope.smallscreen) ? $scope.smallscreen : UIUtils.screen.isSmall();\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESLikesCtrl', {$scope: $scope}));\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESExtensionCtrl', {$scope: $scope}));\n\n $scope.canCertify = false; // disable certify on the popover (by default - override by the wot map controller)\n\n /* -- modals -- */\n\n $scope.showNewMessageModal = function(confirm) {\n\n // note: not need to select wallet here, because message modal will do it, if need\n return csWallet.login({minData: true, method: 'default'})\n .then(function() {\n UIUtils.loading.hide();\n\n // Ask confirmation, if user has no Cesium+ profil\n if (!confirm && !$scope.formData.profile) {\n return UIUtils.alert.confirm('MESSAGE.CONFIRM.USER_HAS_NO_PROFILE')\n .then(function (confirm) {\n // Recursive call (with confirm flag)\n if (confirm) return true;\n });\n }\n return true;\n })\n // Open modal\n .then(function(confirm) {\n if (!confirm) return false;\n\n return esModals.showMessageCompose({\n destPub: $scope.formData.pubkey,\n destUid: $scope.formData.name||$scope.formData.uid\n })\n .then(function(sent) {\n if (sent) UIUtils.toast.show('MESSAGE.INFO.MESSAGE_SENT');\n });\n });\n };\n\n $scope.showSuggestCertificationModal = function() {\n\n $scope.hideCertificationActionsPopover();\n\n var identities;\n\n return csWallet.auth({minData: true})\n .then(function(walletData) {\n UIUtils.loading.hide();\n if (!walletData) return;\n\n // Not allow for non-member - issue #561\n if (!walletData.isMember) {\n return UIUtils.alert.error('ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION');\n }\n\n return Modals.showWotLookup({\n allowMultiple: true,\n enableFilter: true,\n title: 'WOT.SUGGEST_CERTIFICATIONS_MODAL.TITLE',\n help: 'WOT.SUGGEST_CERTIFICATIONS_MODAL.HELP',\n okText: 'COMMON.BTN_NEXT',\n okType: 'button-positive'\n })\n .then(function(res) {\n if (!res || !res.length) return; // user cancelled\n identities = res;\n\n return $q.all([\n // Get keypair only once (if not done here, certification.send() with compute it many times)\n esWallet.box.getKeypair(walletData.keypair),\n // Ask confirmation\n UIUtils.alert.confirm('WOT.CONFIRM.SUGGEST_CERTIFICATIONS', undefined, {okText: 'COMMON.BTN_SEND'})\n ])\n .then(function(res) {\n if (!res) return;\n var keypair = res[0];\n var confirm = res[1];\n if (!confirm) return;\n var time = moment().utc().unix(); // use same date for each invitation\n return $q.all(\n identities.reduce(function(res, identity){\n return res.concat(\n esInvitation.send({\n issuer: walletData.pubkey,\n recipient: $scope.formData.pubkey,\n time: time,\n content: [identity.uid, identity.pubkey].join('-')\n }, keypair, 'certification')\n );\n }, [])\n );\n })\n .then(function() {\n UIUtils.toast.show('INVITATION.INFO.INVITATION_SENT');\n })\n .catch(UIUtils.onError('INVITATION.ERROR.SEND_INVITATION_FAILED'));\n });\n });\n };\n\n $scope.showAskCertificationModal = function() {\n\n $scope.hideCertificationActionsPopover();\n\n var identities;\n return (csWallet.children.count() ? Modals.showSelectWallet({displayBalance: false}) : $q.when(csWallet))\n .then(function(wallet) {\n if (!wallet) throw 'CANCELLED';\n return wallet.auth({minData: true});\n })\n .then(function(walletData) {\n UIUtils.loading.hide();\n if (!walletData) return;\n\n // Not allow for non-member - issue #561\n if (!walletData.isMember) {\n return UIUtils.alert.error('ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION');\n }\n\n return Modals.showWotLookup({\n allowMultiple: true,\n enableFilter: false,\n title: 'WOT.ASK_CERTIFICATIONS_MODAL.TITLE',\n help: 'WOT.ASK_CERTIFICATIONS_MODAL.HELP',\n okText: 'COMMON.BTN_NEXT',\n okType: 'button-positive'\n })\n .then(function(res) {\n if (!res || !res.length) return; // user cancelled\n identities = res;\n\n return $q.all([\n // Get keypair only once (if not done here, certification.send() with compute it many times)\n esWallet.box.getKeypair(walletData.keypair),\n // Ask confirmation\n UIUtils.alert.confirm('WOT.CONFIRM.ASK_CERTIFICATIONS', undefined, {okText: 'COMMON.BTN_SEND'})\n ])\n .then(function(res) {\n var keypair = res && res[0];\n var confirm = res && res[1];\n if (!keypair || !confirm) return;\n var time = moment().utc().unix(); // use same date for each invitation\n return $q.all(identities.reduce(function(res, identity){\n return res.concat(\n esInvitation.send({\n issuer: walletData.pubkey,\n recipient: identity.pubkey,\n time: time,\n content: [walletData.uid, walletData.pubkey].join('-')\n }, keypair, 'certification')\n );\n }, []))\n .then(function() {\n UIUtils.toast.show('INVITATION.INFO.INVITATION_SENT');\n })\n .catch(UIUtils.onError('INVITATION.ERROR.SEND_INVITATION_FAILED'));\n });\n });\n });\n };\n\n $scope.askCertification = function() {\n $scope.hideCertificationActionsPopover();\n\n return (csWallet.children.count() ? Modals.showSelectWallet({displayBalance: false}) : $q.when(csWallet))\n .then(function(wallet) {\n return wallet.auth({minData: true});\n })\n .then(function(walletData) {\n UIUtils.loading.hide();\n if (!walletData) return;\n\n // Not allow for non-member - issue #561\n if (!walletData.isMember) {\n return UIUtils.alert.error('ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION');\n }\n // ask confirmation\n return UIUtils.alert.confirm('WOT.CONFIRM.ASK_CERTIFICATION', undefined, {\n okText: 'COMMON.BTN_SEND'\n })\n .then(function(confirm) {\n if (!confirm) return;\n return esInvitation.send({\n issuer: walletData.pubkey,\n recipient: $scope.formData.pubkey,\n content: [walletData.uid, walletData.pubkey].join('-')\n },\n {\n type: 'certification',\n keypair: walletData.keypair\n })\n .then(function() {\n UIUtils.toast.show('INVITATION.INFO.INVITATION_SENT');\n })\n .catch(UIUtils.onError('INVITATION.ERROR.SEND_INVITATION_FAILED'));\n });\n });\n };\n\n /**\n * Delete the user profile (need moderator access, on Cs+ pod)\n * @param confirm\n * @returns {*}\n */\n $scope.delete = function(confirm) {\n\n if (!confirm) {\n $scope.hideActionsPopover();\n if (!$scope.formData.pubkey) return; // Skip\n\n return UIUtils.alert.confirm('PROFILE.CONFIRM.DELETE_BY_MODERATOR')\n .then(function(confirm) {\n if (confirm) return $scope.delete(confirm); // recursive call\n });\n }\n\n // TODO: ask for deletion of all data ? (e.g. message, comment, likes, etc.)\n // if (angular.isUndefined(allData)) {\n // return UIUtils.alert.confirm(...)\n // ...\n // }\n\n return UIUtils.loading.show()\n .then(function() {\n return esProfile.remove($scope.formData.pubkey);\n })\n .then(function() {\n return $scope.doUpdate();\n })\n .then(function() {\n return $timeout(function() {\n UIUtils.toast.show('DOCUMENT.INFO.REMOVED'); // toast\n }, 800);\n })\n .catch(UIUtils.onError(\"PROFILE.ERROR.DELETE_PROFILE_FAILED\"));\n };\n\n /* -- Load data -- */\n\n // Watch when profile loaded\n $scope.$watch('formData.pubkey', function(pubkey) {\n if (pubkey) {\n\n // Load likes,\n $scope.loadLikes(pubkey);\n\n // Enable deletion, if moderator\n $scope.canDelete = $scope.formData.profile && csWallet.isLogin() && csWallet.data.moderator === true;\n }\n\n });\n\n /* -- Popover -- */\n\n $scope.showCertificationActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/wot/popover_certification_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.certificationActionsPopover = popover;\n }\n });\n };\n\n $scope.hideCertificationActionsPopover = function() {\n if ($scope.certificationActionsPopover) {\n $scope.certificationActionsPopover.hide();\n $scope.certificationActionsPopover = null;\n }\n return true;\n };\n\n $scope.showActionsPopover = function (event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/wot/view_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n return true;\n };\n\n if ($scope.extensionPoint === 'buttons-top-fab') {\n // Show fab button, when parent execute motions\n $scope.$on('$csExtension.motion', function(event) {\n var canCompose = !!$scope.formData.profile;\n if (canCompose) {\n $scope.showFab('fab-compose-' + $scope.formData.pubkey);\n }\n });\n }\n\n // TODO : for DEV only\n /*$timeout(function() {\n if ($scope.extensionPoint != 'buttons') return;\n $scope.showSuggestCertificationModal();\n }, 1000);*/\n}\n","\nESRegistryLookupController.$inject = ['$scope', '$focus', '$timeout', '$filter', '$controller', '$location', '$translate', '$ionicPopover', 'Device', 'UIUtils', 'ModalUtils', 'BMA', 'csSettings', 'csWallet', 'esModals', 'esRegistry', 'esHttp'];\nESWalletPagesController.$inject = ['$scope', '$controller', '$timeout', 'UIUtils', 'esModals', 'csWallet'];\nESRegistryRecordViewController.$inject = ['$scope', '$rootScope', '$state', '$q', '$timeout', '$ionicPopover', '$ionicHistory', '$translate', '$controller', '$anchorScroll', 'csConfig', 'csWallet', 'esRegistry', 'UIUtils', 'esHttp'];\nESRegistryRecordEditController.$inject = ['$scope', '$timeout', '$state', '$q', '$ionicHistory', '$focus', '$translate', '$controller', 'Device', 'UIUtils', 'ModalUtils', 'csWallet', 'esHttp', 'esRegistry'];angular.module('cesium.es.registry.controllers', ['cesium.es.services', 'cesium.es.common.controllers'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.wot_lookup.tab_registry', {\n url: \"/page?q&type&hash&category&location&issuer&reload&lat&lon&d&last\",\n views: {\n 'tab_registry': {\n templateUrl: \"plugins/es/templates/registry/tabs/tab_registry.html\",\n controller: 'ESRegistryLookupCtrl'\n }\n },\n data: {\n large: 'app.registry_lookup_lg',\n silentLocationChange: true\n }\n })\n\n .state('app.registry_lookup_lg', {\n url: \"/wot/page/lg?q&type&hash&category&location&issuer&reload&lat&lon&d&last\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/registry/lookup_lg.html\",\n controller: 'ESRegistryLookupCtrl'\n }\n },\n data: {\n silentLocationChange: true\n }\n })\n\n .state('app.wallet_pages', {\n url: \"/account/pages?refresh\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/registry/view_wallet_pages.html\",\n controller: 'ESWalletPagesCtrl'\n }\n },\n data: {\n login: true,\n minData: true,\n silentLocationChange: true\n }\n })\n\n .state('app.wallet_pages_by_id', {\n url: \"/wallets/:id/pages?refresh\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/registry/view_wallet_pages.html\",\n controller: 'ESWalletPagesCtrl'\n }\n },\n data: {\n login: true,\n minData: true,\n silentLocationChange: true\n }\n })\n\n .state('app.view_page', {\n url: \"/page/view/:id/:title?refresh\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/registry/view_record.html\",\n controller: 'ESRegistryRecordViewCtrl'\n }\n }\n })\n\n .state('app.view_page_anchor', {\n url: \"/page/view/:id/:title/:anchor\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/registry/view_record.html\",\n controller: 'ESRegistryRecordViewCtrl'\n }\n }\n })\n\n .state('app.registry_add_record', {\n cache: false,\n url: \"/page/add/:type?wallet\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/registry/edit_record.html\",\n controller: 'ESRegistryRecordEditCtrl'\n }\n },\n data: {\n auth: true,\n minData: true\n }\n })\n\n .state('app.registry_edit_record', {\n cache: false,\n url: \"/page/edit/:id/:title?wallet\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/registry/edit_record.html\",\n controller: 'ESRegistryRecordEditCtrl'\n }\n },\n data: {\n auth: true,\n minData: true\n }\n })\n ;\n }])\n\n .controller('ESRegistryLookupCtrl', ESRegistryLookupController)\n\n .controller('ESWalletPagesCtrl', ESWalletPagesController)\n\n .controller('ESRegistryRecordViewCtrl', ESRegistryRecordViewController)\n\n .controller('ESRegistryRecordEditCtrl', ESRegistryRecordEditController)\n\n;\n\nfunction ESRegistryLookupController($scope, $focus, $timeout, $filter, $controller, $location, $translate, $ionicPopover,\n Device, UIUtils, ModalUtils, BMA, csSettings, csWallet, esModals, esRegistry, esHttp) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESLookupPositionCtrl', {$scope: $scope}));\n\n var defaultSearchLimit = 10;\n\n $scope.search = {\n text: '',\n results: [],\n loading: true,\n lastRecords: true,\n type: null,\n category: null,\n location: null,\n advanced: null,\n issuer: null,\n geoDistance: !isNaN(csSettings.data.plugins.es.geoDistance) ? csSettings.data.plugins.es.geoDistance : 20\n };\n $scope.searchTextId = 'registrySearchText';\n $scope.enableFilter = true;\n $scope.smallscreen = angular.isDefined($scope.smallscreen) ? $scope.smallscreen : UIUtils.screen.isSmall();\n\n $scope.options = angular.merge($scope.options||{}, {\n location: {\n show: true,\n help: 'REGISTRY.SEARCH.LOCATION_HELP'\n }\n });\n\n $scope.enter = function(e, state) {\n if (!$scope.entered || !$scope.search.results || $scope.search.results.length === 0) {\n\n // Resolve distance unit\n if (!$scope.geoUnit) {\n return $translate('LOCATION.DISTANCE_UNIT')\n .then(function(unit) {\n $scope.geoUnit = unit;\n return $scope.enter(e, state); // Loop\n });\n }\n\n var finishEntered = function() {\n // removeIf(device)\n // Focus on search text (only if NOT device, to avoid keyboard opening)\n if ($scope.searchTextId) {\n $focus($scope.searchTextId);\n }\n // endRemoveIf(device)\n\n $scope.entered = true;\n\n $scope.doSearch();\n };\n\n // Search by text\n if (state.stateParams && state.stateParams.q && (typeof state.stateParams.q == 'string')) {\n $scope.search.text=state.stateParams.q;\n }\n\n if (state.stateParams && state.stateParams.hash) { // hash tag parameter\n $scope.search.text = '#' + state.stateParams.hash;\n }\n\n // Search on location\n if (state.stateParams && state.stateParams.location) {\n $scope.search.location = state.stateParams.location;\n if (state.stateParams.lat && state.stateParams.lon) {\n $scope.search.geoPoint = {\n lat: parseFloat(state.stateParams.lat),\n lon: parseFloat(state.stateParams.lon)\n };\n }\n if (state.stateParams.d) {\n $scope.search.geoDistance = state.stateParams.d;\n }\n }\n else {\n var defaultSearch = csSettings.data.plugins.es.registry && csSettings.data.plugins.es.registry.defaultSearch;\n // Apply defaults from settings\n if (defaultSearch) {\n if (defaultSearch.location){\n angular.merge($scope.search, csSettings.data.plugins.es.registry.defaultSearch);\n }\n else {\n defaultSearch = undefined; // invalid\n }\n }\n // First time calling this view: apply profile location (if loaded)\n if (!defaultSearch && csWallet.isLogin() && csWallet.data.profile) {\n if (!csWallet.isDataLoaded()) {\n UIUtils.loading.show();\n return csWallet.loadData()\n .then(function() {\n UIUtils.loading.hide();\n return $scope.enter(e,state); // loop\n });\n }\n $scope.search.geoPoint = csWallet.data.profile.geoPoint;\n $scope.search.location = csWallet.data.profile.city||(csWallet.data.profile.geoPoint ? $translate.instant('LOCATION.PROFILE_POSITION') : undefined);\n }\n }\n\n // Search on type\n if (state.stateParams && (state.stateParams.type || state.stateParams.last)) {\n if (state.stateParams.last || state.stateParams.type == 'last') {\n $scope.search.lastRecords = true;\n $scope.search.type = undefined;\n }\n else {\n $scope.search.type = state.stateParams.type;\n }\n }\n else {\n $scope.search.lastRecords = false;\n }\n\n // Search on issuer\n if (state.stateParams && state.stateParams.issuer) {\n $scope.search.issuer = state.stateParams.issuer;\n }\n\n // Search on category\n if (state.stateParams && state.stateParams.category) {\n esRegistry.category.get({id: state.stateParams.category})\n .then(function(cat) {\n $scope.search.category = cat;\n finishEntered();\n })\n .catch(UIUtils.onError(\"REGISTRY.ERROR.LOAD_CATEGORY_FAILED\"));\n }\n else {\n finishEntered();\n }\n }\n $scope.showFab('fab-add-registry-record');\n\n };\n $scope.$on('$ionicView.enter', function(e, state) {\n // WARN: do not set by reference\n // because it can be overrided by sub controller\n return $scope.enter(e, state);\n });\n\n // Store some search options as settings defaults\n $scope.leave = function() {\n var dirty = false;\n\n csSettings.data.plugins.es.registry = csSettings.data.plugins.es.registry || {};\n csSettings.data.plugins.es.registry.defaultSearch = csSettings.data.plugins.es.registry.defaultSearch || {};\n\n // Check if location changed\n var location = $scope.search.location && $scope.search.location.trim();\n var oldLocation = csSettings.data.plugins.es.registry.defaultSearch.location;\n if (!oldLocation || (oldLocation !== location)) {\n csSettings.data.plugins.es.registry.defaultSearch = {\n location: location,\n geoPoint: location && $scope.search.geoPoint ? angular.copy($scope.search.geoPoint) : undefined\n };\n dirty = true;\n }\n\n // Check if distance changed\n var odlDistance = csSettings.data.plugins.es.geoDistance;\n if (!odlDistance || odlDistance !== $scope.search.geoDistance) {\n csSettings.data.plugins.es.geoDistance = $scope.search.geoDistance;\n dirty = true;\n }\n\n // execute with a delay, for better UI perf\n if (dirty) {\n $timeout(function() {\n csSettings.store();\n });\n }\n };\n $scope.$on('$ionicView.leave', function() {\n // WARN: do not set by reference\n // because it can be overrided by sub controller\n return $scope.leave();\n });\n\n $scope.onGeoPointChanged = function() {\n if ($scope.search.loading) return;\n\n if ($scope.search.geoPoint && $scope.search.geoPoint.lat && $scope.search.geoPoint.lon && !$scope.search.geoPoint.exact) {\n $scope.doSearch();\n $scope.updateLocationHref();\n }\n };\n $scope.$watch('search.geoPoint', $scope.onGeoPointChanged, true);\n\n $scope.resolveLocationPosition = function() {\n if ($scope.search.loadingPosition) return;\n\n $scope.search.loadingPosition = true;\n return $scope.searchPosition($scope.search.location)\n .then(function(res) {\n if (!res) {\n $scope.search.loading = false;\n $scope.search.results = undefined;\n $scope.search.total = 0;\n $scope.search.loadingPosition = false;\n $scope.search.geoPoint = undefined;\n throw 'CANCELLED';\n }\n $scope.search.geoPoint = res;\n if (res.shortName && !res.exact) {\n $scope.search.location = res.shortName;\n }\n $scope.search.loadingPosition = false;\n });\n };\n\n $scope.doGetLastRecords = function(from) {\n $scope.hidePopovers();\n\n $scope.search.text = undefined;\n return $scope.doSearch(from);\n };\n\n $scope.doSearchText = function() {\n $scope.doSearch();\n\n };\n\n $scope.doSearch = function(from) {\n $scope.search.loading = !from;\n\n // Resolve location position\n if ($scope.search.location && $scope.search.location.length >= 3 && !$scope.search.geoPoint) {\n return $scope.resolveLocationPosition()\n .then(function() {\n return $scope.doSearch(from); // Loop\n });\n }\n\n var text = $scope.search.text && $scope.search.text.trim() || '';\n $scope.search.lastRecords = !text || !text.length;\n var matches = [];\n var filters = [];\n if (text && text.length) {\n // pubkey : use a special 'term', because of 'non indexed' field\n if (BMA.regexp.PUBKEY.test(text /*case sensitive*/)) {\n filters.push({term : { pubkey: text}});\n }\n else {\n text = text.toLowerCase();\n var tags = text ? esHttp.util.parseTags(text) : undefined;\n var matchFields = [\"title\", \"description\", \"city\", \"address\"];\n matches.push({multi_match : { query: text,\n fields: matchFields,\n type: \"phrase_prefix\"\n }});\n matches.push({match : { title: {query: text, boost: 2}}});\n matches.push({prefix: {title: text}});\n matches.push({match : { description: text}});\n matches.push({\n nested: {\n path: \"category\",\n query: {\n bool: {\n filter: {\n match: { \"category.name\": text}\n }\n }\n }\n }\n });\n if (tags && tags.length) {\n filters.push({terms: {tags: tags}});\n }\n }\n }\n // issuer: use only on filter\n else if ($scope.search.issuer) {\n filters.push({term : { issuer: $scope.search.issuer}});\n }\n if ($scope.search.type) {\n filters.push({term: { type: $scope.search.type}});\n }\n if ($scope.search.category) {\n filters.push({\n nested: {\n path: \"category\",\n query: {\n bool: {\n filter: {\n term: { \"category.id\": $scope.search.category.id}\n }\n }\n }\n }\n });\n }\n\n var location = $scope.search.location && $scope.search.location.trim().toLowerCase();\n if ($scope.search.geoPoint && $scope.search.geoPoint.lat && $scope.search.geoPoint.lon) {\n\n // match location OR geo distance\n if (location && location.length) {\n var locationCity = location.split(',')[0];\n filters.push({\n or : [\n // No position defined\n {\n and: [\n {not: {exists: { field : \"geoPoint\" }}},\n {match_phrase: { city: locationCity }}\n ]\n },\n // Has position\n {geo_distance: {\n distance: $scope.search.geoDistance + $scope.geoUnit,\n geoPoint: {\n lat: $scope.search.geoPoint.lat,\n lon: $scope.search.geoPoint.lon\n }\n }}\n ]\n });\n }\n\n else {\n filters.push(\n {geo_distance: {\n distance: $scope.search.geoDistance + $scope.geoUnit,\n geoPoint: {\n lat: $scope.search.geoPoint.lat,\n lon: $scope.search.geoPoint.lon\n }\n }});\n }\n }\n\n var request = {\n highlight: {fields : {title : {}, description: {}, tags: {}}},\n from: from\n };\n if (matches.length > 0) {\n request.query = request.query || {bool: {}};\n request.query.bool.should = matches;\n // Exclude result with score=0\n request.query.bool.minimum_should_match = 1;\n }\n if (filters.length > 0) {\n request.query = request.query || {bool: {}};\n request.query.bool.filter = filters;\n }\n if ($scope.search.lastRecords) {\n request.sort = {creationTime : \"desc\"};\n }\n\n // Update href location\n $scope.updateLocationHref();\n\n // Execute the request\n return $scope.doRequest(request);\n };\n\n $scope.doRequest = function(options) {\n options = options || {};\n options.from = options.from || 0;\n options.size = options.size || defaultSearchLimit;\n if (options.size < defaultSearchLimit) options.size = defaultSearchLimit;\n $scope.search.loading = (options.from === 0);\n\n var requestId = ($scope.requestId && $scope.requestId + 1) || 1;\n $scope.requestId = requestId;\n\n return esRegistry.record.search(options)\n .then(function(res) {\n if ($scope.requestId != requestId) return; // Skip apply if not same request:\n\n if (!res || !res.hits || !res.hits.length) {\n $scope.search.results = (options.from > 0) ? $scope.search.results : [];\n $scope.search.total = (options.from > 0) ? $scope.search.total : 0;\n $scope.search.loading = false;\n $scope.search.hasMore = false;\n return;\n }\n var formatSlug = $filter('formatSlug');\n _.forEach(res.hits, function(record) {\n // Compute title for url\n record.urlTitle = formatSlug(record.title);\n });\n\n // Replace results, or append if 'show more' clicked\n if (!options.from) {\n $scope.search.results = res.hits;\n $scope.search.total = res.total;\n }\n else {\n $scope.search.results = $scope.search.results.concat(res.hits);\n }\n $scope.search.hasMore = $scope.search.results.length < res.total;\n $scope.search.loading = false;\n\n $scope.motion.show({selector: '.list .item', ink: true});\n })\n .catch(function(err) {\n $scope.search.loading = false;\n $scope.search.results = (options.from > 0) ? $scope.search.results : [];\n $scope.search.total = (options.from > 0) ? $scope.search.total : 0;\n $scope.search.hasMore = false;\n UIUtils.onError('REGISTRY.ERROR.LOOKUP_RECORDS_FAILED')(err);\n });\n };\n\n $scope.showMore= function() {\n var from = $scope.search.results ? $scope.search.results.length : 0;\n\n $scope.search.loadingMore = true;\n\n var searchFunction = ($scope.search.lastRecords) ?\n $scope.doGetLastRecords :\n $scope.doSearch;\n\n return searchFunction(from)\n .then(function() {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n })\n .catch(function(err) {\n console.error(err);\n $scope.search.loadingMore = false;\n $scope.search.hasMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n $scope.removeType = function() {\n $scope.search.type = null;\n $scope.doSearch();\n $scope.updateLocationHref();\n };\n\n $scope.removeCategory = function() {\n $scope.search.category = null;\n $scope.category = null;\n $scope.doSearch();\n $scope.updateLocationHref();\n };\n\n $scope.removeLocation = function() {\n $scope.search.location = null;\n $scope.search.geoPoint = null;\n $scope.doSearch();\n $scope.updateLocationHref();\n };\n\n // Update location href\n $scope.updateLocationHref = function(from) {\n // removeIf(device)\n // Skip when \"show more\"\n if (from) return;\n\n $timeout(function() {\n var text = $scope.search.text && $scope.search.text.trim();\n var location = $scope.search.location && $scope.search.location.trim();\n var stateParams = {\n location: location && location.length ? location : undefined,\n category: $scope.search.category ? $scope.search.category.id : undefined,\n last: $scope.search.lastRecords ? true : undefined,\n type: $scope.search.type ? $scope.search.type : undefined,\n lat: $scope.search.geoPoint && $scope.search.geoPoint.lat || undefined,\n lon: $scope.search.geoPoint && $scope.search.geoPoint.lon || undefined,\n d: $scope.search.geoPoint && $scope.search.geoDistance || undefined\n };\n if (text && text.match(/^#\\w+$/)) {\n stateParams.hash = text.substr(1);\n }\n else if (text && text.length){\n stateParams.q = text;\n }\n\n $location.search(stateParams).replace();\n });\n // endRemoveIf(device)\n };\n\n\n $scope.onToggleAdvanced = function() {\n if ($scope.search.entered && !$scope.search.lastRecords) {\n $scope.doSearch();\n $scope.updateLocationHref();\n }\n };\n $scope.$watch('search.advanced', $scope.onToggleAdvanced, true);\n\n $scope.toggleAdvanced = function() {\n $scope.search.advanced = !$scope.search.advanced;\n $timeout($scope.hidePopovers, 200);\n };\n\n /* -- modals -- */\n\n $scope.showRecordTypeModal = function(event) {\n $scope.hidePopovers();\n\n $timeout(function() {\n if (event.isDefaultPrevented()) return;\n\n ModalUtils.show('plugins/es/templates/registry/modal_record_type.html')\n .then(function(type){\n if (type) {\n $scope.search.type = type;\n $scope.doSearch();\n $scope.updateLocationHref();\n }\n });\n }, 350); // use timeout to allow event to be prevented in removeType()\n };\n\n $scope.showCategoryModal = function(event) {\n $timeout(function() {\n if (event.isDefaultPrevented()) return;\n\n // load categories\n esRegistry.category.all()\n .then(function (categories) {\n // open modal\n return ModalUtils.show('plugins/es/templates/common/modal_category.html', 'ESCategoryModalCtrl as ctrl',\n {categories: categories}, {focusFirstInput: true});\n })\n .then(function (cat) {\n if (cat && cat.parent) {\n $scope.search.category = cat;\n $scope.doSearch();\n $scope.updateLocationHref();\n }\n });\n }, 350); // use timeout to allow event to be prevented in removeCategory()\n };\n\n $scope.showNewPageModal = function() {\n $scope.hidePopovers();\n return esModals.showNewPage();\n };\n\n /* -- popovers -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl :'plugins/es/templates/registry/lookup_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.filtersPopover = null;\n }\n };\n\n $scope.showFiltersPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl :'plugins/es/templates/registry/lookup_popover_filters.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.filtersPopover = popover;\n }\n });\n };\n\n $scope.hideFiltersPopover = function() {\n if ($scope.filtersPopover) {\n $scope.filtersPopover.hide();\n $scope.filtersPopover = null;\n }\n };\n\n $scope.hidePopovers = function() {\n $scope.hideActionsPopover();\n $scope.hideFiltersPopover();\n };\n\n\n // TODO: remove auto add account when done\n /* $timeout(function() {\n $scope.search.text='lavenier';\n $scope.doSearch();\n }, 400);\n */\n}\n\n\nfunction ESWalletPagesController($scope, $controller, $timeout, UIUtils, esModals, csWallet) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESRegistryLookupCtrl', {$scope: $scope}));\n\n $scope.searchTextId = undefined; // avoid focus\n\n var wallet;\n\n // Override the default enter\n $scope.enter = function(e, state) {\n if (!$scope.entered) {\n\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n return wallet.login({minData: true})\n .then(function(walletData) {\n UIUtils.loading.hide();\n $scope.search.issuer = walletData.pubkey;\n $scope.search.advanced = true;\n $timeout($scope.doSearch, 100);\n $scope.showFab('fab-wallet-add-registry-record');\n });\n }\n else {\n // Asking refresh\n if (state.stateParams && state.stateParams.refresh) {\n return $timeout($scope.doSearch, 2000 /*waiting for propagation, if deletion*/);\n }\n }\n };\n\n $scope.doUpdate = function() {\n if (!wallet || !wallet.isLogin()) return;\n $scope.search.issuer = csWallet.data.pubkey;\n $scope.search.advanced = true;\n return $scope.doSearch();\n };\n\n // Override inherited, to pass the select wallet\n $scope.showNewPageModal = function() {\n $scope.hidePopovers();\n return esModals.showNewPage({wallet: wallet});\n };\n\n}\n\n\nfunction ESRegistryRecordViewController($scope, $rootScope, $state, $q, $timeout, $ionicPopover, $ionicHistory, $translate, $controller,\n $anchorScroll, csConfig, csWallet, esRegistry, UIUtils, esHttp) {\n 'ngInject';\n\n $scope.formData = {};\n $scope.id = null;\n $scope.category = {};\n $scope.pictures = [];\n $scope.canEdit = false;\n $scope.showTransfer = false;\n $scope.loading = true;\n $scope.motion = UIUtils.motion.fadeSlideIn;\n\n // Init likes here, to be able to use in extension\n $scope.options = $scope.options || {};\n $scope.options.like = {\n kinds: ['LIKE', 'ABUSE'],\n index: 'page',\n type: 'record'\n };\n $scope.likeData = {\n likes: {},\n abuses: {}\n };\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESLikesCtrl', {$scope: $scope}));\n\n $scope.$on('$ionicView.beforeEnter', function (event, viewData) {\n // Enable back button (workaround need for navigation outside tabs - https://stackoverflow.com/a/35064602)\n viewData.enableBack = UIUtils.screen.isSmall() ? true : viewData.enableBack;\n });\n\n $scope.$on('$ionicView.enter', function(e, state) {\n if (state.stateParams && state.stateParams.id) { // Load by id\n if ($scope.loading || state.stateParams.refresh) { // prevent reload if same id (if not forced)\n $scope.load(state.stateParams.id, state.stateParams.anchor);\n }\n $scope.$broadcast('$recordView.enter', state);\n }\n else {\n $state.go('app.wot_lookup.tab_registry');\n }\n });\n\n $scope.$on('$ionicView.beforeLeave', function(event, args){\n $scope.$broadcast('$recordView.beforeLeave', args);\n });\n\n $scope.load = function(id, anchor) {\n id = id || $scope.id;\n $scope.loading = true;\n\n return $q.all([\n esRegistry.record.load(id)\n .then(function (data) {\n $scope.id= data.id;\n $scope.formData = data.record;\n //console.debug('Loading record', $scope.formData);\n $scope.canEdit = csWallet.isUserPubkey($scope.formData.issuer) || csWallet.children.hasPubkey($scope.formData.issuer);\n $scope.showTransfer = !$scope.canEdit && $scope.formData.pubkey;\n $scope.issuer = data.issuer;\n // avatar\n $scope.avatar = $scope.formData.avatar;\n $scope.avatarStyle= $scope.formData.avatar && {'background-image':'url(\"'+$scope.avatar.src+'\")'};\n\n UIUtils.loading.hide();\n $scope.loading = false;\n // Set Motion (only direct children, to exclude .lazy-load children)\n $scope.motion.show({selector: '.list > .item, .list > ng-if > .item'});\n })\n .catch(function(err) {\n // Retry (ES could have error)\n if (!$scope.secondTry) {\n $scope.secondTry = true;\n $q(function() {\n $scope.load(id);\n }, 100);\n }\n else {\n $scope.loading = false;\n if (err && err.ucode === 404) {\n UIUtils.toast.show('REGISTRY.ERROR.RECORD_NOT_EXISTS');\n $state.go('app.wot_lookup.tab_registry');\n }\n else {\n UIUtils.onError('REGISTRY.ERROR.LOAD_RECORD_FAILED')(err);\n }\n }\n }),\n\n // Load pictures\n esRegistry.record.picture.all({id: id})\n .then(function(hit) {\n\n $scope.pictures = hit._source.pictures && hit._source.pictures.reduce(function(res, pic) {\n return res.concat(esHttp.image.fromAttachment(pic.file));\n }, []);\n\n // Set Motion\n if ($scope.pictures.length > 0) {\n $scope.motion.show({\n selector: '.lazy-load .item.card-gallery',\n startVelocity: 3000\n });\n }\n })\n .catch(function() {\n $scope.pictures = [];\n }),\n\n // Load other data (from child controller)\n $timeout(function() {\n return $scope.$broadcast('$recordView.load', id, esRegistry.record.comment);\n })\n ])\n .then(function() {\n // Display items in technical parts\n $scope.motion.show({\n selector: '.lazy-load .item',\n startVelocity: 3000\n });\n\n // scroll (if comment anchor)\n if (anchor) $timeout(function() {\n $anchorScroll(anchor);\n }, 1000);\n });\n };\n\n // Edit click\n $scope.edit = function() {\n var wallet = csWallet.isUserPubkey($scope.formData.issuer) ? csWallet : csWallet.children.getByPubkey($scope.formData.issuer);\n if (!wallet) return;\n UIUtils.loading.show();\n return $state.go('app.registry_edit_record', {id: $scope.id, wallet: wallet.id});\n };\n\n $scope.delete = function() {\n $scope.hideActionsPopover();\n\n var wallet = csWallet.isUserPubkey($scope.formData.issuer) ? csWallet : csWallet.children.getByPubkey($scope.formData.issuer);\n if (!wallet) return;\n\n // translate\n var translations;\n $translate(['REGISTRY.VIEW.REMOVE_CONFIRMATION', 'REGISTRY.INFO.RECORD_REMOVED'])\n .then(function(res) {\n translations = res;\n return UIUtils.alert.confirm(res['REGISTRY.VIEW.REMOVE_CONFIRMATION']);\n })\n .then(function(confirm) {\n if (confirm) {\n esRegistry.record.remove($scope.id, {wallet: wallet})\n .then(function () {\n if (wallet.data.pages && wallet.data.pages.count) {\n wallet.data.pages.count--;\n }\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n if (wallet.isDefault()) {\n $state.go('app.wallet_pages', {refresh: true});\n }\n else {\n $state.go('app.wallet_pages_by_id', {refresh: true, id: wallet.id});\n }\n\n UIUtils.toast.show(translations['REGISTRY.INFO.RECORD_REMOVED']);\n })\n .catch(UIUtils.onError('REGISTRY.ERROR.REMOVE_RECORD_FAILED'));\n }\n });\n };\n\n /* -- modals & popover -- */\n\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/registry/view_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n return true;\n };\n\n $scope.showSharePopover = function(event) {\n $scope.hideActionsPopover();\n var title = $scope.formData.title;\n // Use shareBasePath (fix #530) or rootPath (fix #390)\n var url = (csConfig.shareBaseUrl || $rootScope.rootPath) + $state.href('app.view_page', {title: title, id: $scope.id});\n // Override default position, is small screen - fix #545\n if (UIUtils.screen.isSmall()) {\n event = angular.element(document.querySelector('#registry-share-anchor-'+$scope.id)) || event;\n }\n UIUtils.popover.share(event, {\n bindings: {\n url: url,\n titleKey: 'REGISTRY.VIEW.POPOVER_SHARE_TITLE',\n titleValues: {title: title},\n time: $scope.formData.time,\n postMessage: title\n }\n });\n };\n\n}\n\nfunction ESRegistryRecordEditController($scope, $timeout, $state, $q, $ionicHistory, $focus, $translate, $controller,\n Device, UIUtils, ModalUtils, csWallet, esHttp, esRegistry) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESPositionEditCtrl', {$scope: $scope}));\n\n $scope.formData = {\n title: null,\n description: null,\n socials: [],\n geoPoint: null\n };\n\n $scope.loading = true;\n $scope.dirty = false;\n $scope.walletData = null;\n $scope.id = null;\n $scope.avatar = null;\n $scope.pictures = [];\n\n $scope.setForm = function(form) {\n $scope.form = form;\n };\n\n var wallet;\n\n $scope.$on('$ionicView.enter', function(e, state) {\n\n if ($scope.loading) {\n wallet = (state.stateParams && state.stateParams.wallet && state.stateParams.wallet != 'default') ? csWallet.children.get(state.stateParams.wallet) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n return wallet.login({minData: true})\n .then(function(walletData) {\n $scope.walletData = walletData;\n if (state.stateParams && state.stateParams.id) { // Load by id\n $scope.load(state.stateParams.id);\n }\n else {\n if (state.stateParams && state.stateParams.type) {\n $scope.updateView({\n record: {\n type: state.stateParams.type\n }\n });\n }\n }\n // removeIf(device)\n $focus('registry-record-title');\n // endRemoveIf(device)\n });\n }\n });\n\n $scope.$on('$stateChangeStart', function (event, next, nextParams, fromState) {\n if ($scope.dirty && !$scope.saving) {\n\n // stop the change state action\n event.preventDefault();\n\n if (!$scope.loading) {\n $scope.loading = true;\n return UIUtils.alert.confirm('CONFIRM.SAVE_BEFORE_LEAVE',\n 'CONFIRM.SAVE_BEFORE_LEAVE_TITLE', {\n cancelText: 'COMMON.BTN_NO',\n okText: 'COMMON.BTN_YES_SAVE'\n })\n .then(function(confirmSave) {\n $scope.loading = false;\n if (confirmSave) {\n $scope.form.$submitted=true;\n return $scope.save(false/*silent*/, true/*haswait debounce*/)\n .then(function(saved){\n if (saved) {\n $scope.dirty = false;\n }\n return saved; // change state only if not error\n });\n }\n else {\n $scope.dirty = false;\n return true; // ok, change state\n }\n })\n .then(function(confirmGo) {\n if (confirmGo) {\n // continue to the order state\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n $state.go(next.name, nextParams);\n }\n })\n .catch(function(err) {\n // Silent\n });\n }\n }\n });\n\n $scope.load = function(id) {\n $scope.loading = true;\n esRegistry.record.load(id, {\n raw: true\n })\n .then(function (data) {\n if (data && data.record) {\n $scope.updateView(data);\n }\n else {\n $scope.updateView({record: {}});\n }\n })\n .catch(function(err) {\n UIUtils.loading.hide(10);\n $scope.loading = false;\n UIUtils.onError('REGISTRY.ERROR.LOAD_RECORD_FAILED')(err);\n });\n };\n\n $scope.updateView = function(data) {\n $scope.formData = data.record || {};\n $scope.id= data.id;\n\n // avatar\n $scope.avatar = $scope.formData.avatar;\n if ($scope.avatar) {\n $scope.avatarStyle = $scope.avatar && {'background-image':'url(\"'+$scope.avatar.src+'\")'};\n $scope.avatarClass = {};\n }\n else {\n $scope.avatarStyle = undefined;\n $scope.avatarClass = {};\n $scope.avatarClass['cion-page-' + $scope.formData.type] = !$scope.avatar;\n }\n\n // pictures\n $scope.pictures = data.record && data.record.pictures || [];\n delete data.record.pictures; // remove, as already stored in $scope.pictures\n\n $scope.motion.show({\n selector: '.animate-ripple .item, .card-gallery',\n startVelocity: 3000\n });\n UIUtils.loading.hide();\n\n // Update loading - done with a delay, to avoid trigger onFormDataChanged()\n $timeout(function() {\n $scope.loading = false;\n }, 1000);\n };\n\n $scope.onFormDataChanged = function() {\n if ($scope.loading) return;\n $scope.dirty = true;\n };\n $scope.$watch('formData', $scope.onFormDataChanged, true);\n\n\n\n $scope.needCategory = function() {\n return $scope.formData.type && ($scope.formData.type=='company' || $scope.formData.type=='shop');\n };\n\n $scope.save = function(silent, hasWaitDebounce) {\n $scope.form.$submitted=true;\n if($scope.saving || // avoid multiple save\n !$scope.form.$valid ||\n (($scope.formData.type === 'shop' || $scope.formData.type === 'company') && (!$scope.formData.category || !$scope.formData.category.id))) {\n return $q.reject();\n }\n\n if (!hasWaitDebounce) {\n console.debug('[ES] [page] Waiting debounce end, before saving...');\n return $timeout(function() {\n return $scope.save(silent, true);\n }, 650);\n }\n\n $scope.saving = true;\n console.debug('[ES] [page] Saving record...');\n\n var showSuccessToast = function() {\n if (!silent) {\n return $translate('REGISTRY.INFO.RECORD_SAVED')\n .then(function(message){\n UIUtils.toast.show(message);\n });\n }\n };\n\n var promise = $q.when();\n return promise\n .then(function(){\n var json = $scope.formData;\n if (!$scope.needCategory()) {\n delete json.category;\n }\n json.time = moment().utc().unix();\n\n // geo point\n if (json.geoPoint && json.geoPoint.lat && json.geoPoint.lon) {\n json.geoPoint.lat = parseFloat(json.geoPoint.lat);\n json.geoPoint.lon = parseFloat(json.geoPoint.lon);\n }\n else{\n json.geoPoint = null;\n }\n\n // Social url must be unique in socials links - Fix #306:\n if (json.socials && json.socials.length) {\n json.socials = _.uniq(json.socials, false, function(social) {\n return social.url;\n });\n }\n\n // Pictures\n json.picturesCount = $scope.pictures.length;\n if (json.picturesCount > 0) {\n json.pictures = $scope.pictures.reduce(function (res, pic) {\n return res.concat({file: esHttp.image.toAttachment(pic)});\n }, []);\n }\n else {\n json.pictures = [];\n }\n\n // Avatar\n if ($scope.avatar && $scope.avatar.src) {\n return UIUtils.image.resizeSrc($scope.avatar.src, true) // resize to avatar\n .then(function(imageSrc) {\n json.avatar = esHttp.image.toAttachment({src: imageSrc});\n return json;\n });\n }\n else {\n // Workaround to allow content deletion, because of a bug in the ES attachment-mapper:\n // get error (in ES node) : MapperParsingException[No content is provided.] - AttachmentMapper.parse(AttachmentMapper.java:471\n json.avatar = {\n _content: '',\n _content_type: ''\n };\n return json;\n }\n })\n .then(function(json){\n // Create\n if (!$scope.id) {\n return esRegistry.record.add(json, {wallet: wallet});\n }\n // Update\n return esRegistry.record.update(json, {id: $scope.id, wallet: wallet});\n })\n\n .then(function(id) {\n console.info(\"[ES] [page] Record successfully saved.\");\n if (!$scope.id && wallet.data.pages && wallet.data.pages.count) {\n csWallet.data.pages.count++;\n }\n $scope.id = $scope.id || id;\n $scope.saving = false;\n $scope.dirty = false;\n\n showSuccessToast();\n\n $ionicHistory.clearCache($ionicHistory.currentView().stateId); // clear current view\n $ionicHistory.nextViewOptions({historyRoot: true});\n return $state.go('app.view_page', {id: $scope.id, refresh: true});\n })\n\n .catch(function(err) {\n $scope.saving = false;\n UIUtils.onError('REGISTRY.ERROR.SAVE_RECORD_FAILED')(err);\n });\n };\n\n $scope.openPicturePopup = function() {\n Device.camera.getPicture()\n .then(function(imageData) {\n if (imageData) {\n $scope.pictures.push({src: \"data:image/png;base64,\" + imageData});\n }\n })\n .catch(UIUtils.onError('ERROR.TAKE_PICTURE_FAILED'));\n };\n\n $scope.rotateAvatar = function(){\n if (!$scope.avatar || !$scope.avatar.src || $scope.rotating) return;\n\n $scope.rotating = true;\n\n return UIUtils.image.rotateSrc($scope.avatar.src)\n .then(function(imageData){\n $scope.avatar.src = imageData;\n $scope.avatarStyle={'background-image':'url(\"'+imageData+'\")'};\n $scope.dirty = true;\n $scope.rotating = false;\n })\n .catch(function(err) {\n console.error(err);\n $scope.rotating = false;\n });\n };\n\n $scope.fileChanged = function(event) {\n UIUtils.loading.show();\n return $q(function(resolve, reject) {\n var file = event.target.files[0];\n UIUtils.image.resizeFile(file)\n .then(function(imageData) {\n $scope.pictures.push({src: imageData});\n UIUtils.loading.hide();\n resolve();\n });\n });\n };\n\n $scope.removePicture = function(index){\n $scope.pictures.splice(index, 1);\n };\n\n $scope.favoritePicture = function(index){\n if (index > 0) {\n var item = $scope.pictures[index];\n $scope.pictures.splice(index, 1);\n $scope.pictures.splice(0, 0, item);\n }\n };\n\n $scope.cancel = function() {\n $ionicHistory.goBack();\n };\n\n /* -- modals -- */\n $scope.showAvatarModal = function() {\n if (Device.camera.enable) {\n return Device.camera.getPicture()\n .then(function(imageData) {\n if (!imageData) return;\n $scope.avatar = {src: \"data:image/png;base64,\" + imageData};\n $scope.avatarStyle={'background-image':'url(\"'+imageData+'\")'};\n $scope.dirty = true;\n $scope.avatarClass = {};\n })\n .catch(UIUtils.onError('ERROR.TAKE_PICTURE_FAILED'));\n }\n else {\n return ModalUtils.show('plugins/es/templates/common/modal_edit_avatar.html','ESAvatarModalCtrl',\n {})\n .then(function(imageData) {\n if (!imageData) return;\n $scope.avatar = {src: imageData};\n $scope.avatarStyle={'background-image':'url(\"'+imageData+'\")'};\n $scope.dirty = true;\n $scope.avatarClass = {};\n });\n }\n };\n\n $scope.showRecordTypeModal = function() {\n ModalUtils.show('plugins/es/templates/registry/modal_record_type.html')\n .then(function(type){\n if (type) {\n $scope.formData.type = type;\n if (!$scope.avatar) {\n $scope.avatarClass['cion-page-' + type] = true;\n }\n }\n });\n };\n\n $scope.showCategoryModal = function(parameters) {\n // load categories\n esRegistry.category.all()\n .then(function(categories){\n // open modal\n return ModalUtils.show('plugins/es/templates/common/modal_category.html', 'ESCategoryModalCtrl as ctrl',\n {categories: categories}, {focusFirstInput: true});\n })\n .then(function(cat){\n if (cat && cat.parent) {\n $scope.formData.category = cat;\n }\n });\n };\n}\n","\nESViewEditProfileController.$inject = ['$scope', '$q', '$timeout', '$state', '$focus', '$translate', '$controller', '$ionicHistory', '$ionicPopover', 'UIUtils', 'csWallet', 'esHttp', 'esProfile', 'ModalUtils', 'Device'];angular.module('cesium.es.profile.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n\n $stateProvider\n .state('app.edit_profile', {\n url: \"/wallet/profile/edit\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/user/edit_profile.html\",\n controller: 'ESViewEditProfileCtrl'\n }\n },\n cache: false,\n data: {\n auth: true\n }\n })\n\n .state('app.edit_profile_by_id', {\n url: \"/wallets/:id/profile/edit\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/user/edit_profile.html\",\n controller: 'ESViewEditProfileCtrl'\n }\n },\n cache: false,\n data: {\n login: true\n }\n });\n\n }])\n\n .controller('ESViewEditProfileCtrl', ESViewEditProfileController)\n\n\n;\n\nfunction ESViewEditProfileController($scope, $q, $timeout, $state, $focus, $translate, $controller,\n $ionicHistory, $ionicPopover,\n UIUtils, csWallet, esHttp, esProfile, ModalUtils, Device) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESPositionEditCtrl', {$scope: $scope}));\n\n $scope.formData = {\n title: null,\n description: null,\n socials: [],\n geoPoint: null\n };\n $scope.loading = true;\n $scope.dirty = false;\n $scope.walletData = null;\n $scope.avatar = null;\n $scope.existing = false;\n $scope.socialData = {\n url: null\n };\n $scope.socialReorder = true;\n\n var wallet;\n\n $scope.enter = function(e, state) {\n\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n $scope.walletId = wallet.id;\n\n return wallet.auth({\n minData: true\n })\n .then($scope.load)\n .catch(function(err){\n if (err == 'CANCELLED') {\n UIUtils.loading.hide(10);\n $scope.cancel();\n return;\n }\n UIUtils.onError('PROFILE.ERROR.LOAD_PROFILE_FAILED')(err);\n });\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.$on('$stateChangeStart', function (event, next, nextParams, fromState) {\n if ($scope.dirty && !$scope.saving) {\n\n // stop the change state action\n event.preventDefault();\n\n if (!$scope.loading) {\n $scope.loading = true;\n return UIUtils.alert.confirm('CONFIRM.SAVE_BEFORE_LEAVE',\n 'CONFIRM.SAVE_BEFORE_LEAVE_TITLE', {\n cancelText: 'COMMON.BTN_NO',\n okText: 'COMMON.BTN_YES_SAVE'\n })\n .then(function(confirmSave) {\n $scope.loading = false;\n if (confirmSave) {\n $scope.form.$submitted=true;\n return $scope.save(false/*silent*/, true/*haswait debounce*/)\n .then(function(saved){\n if (saved) {\n $scope.dirty = false;\n }\n return saved; // change state only if not error\n });\n }\n else {\n $scope.dirty = false;\n return true; // ok, change state\n }\n })\n .then(function(confirmGo) {\n if (confirmGo) {\n // continue to the order state\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n $state.go(next.name, nextParams);\n }\n })\n .catch(function(err) {\n // Silent\n });\n }\n }\n });\n\n $scope.load = function(walletData) {\n $scope.loading = true; // to avoid the call of doSave()\n return esProfile.get(walletData.pubkey, {\n raw: true\n })\n .then(function(profile) {\n if (profile) {\n $scope.avatar = esHttp.image.fromAttachment(profile.source.avatar);\n $scope.existing = true;\n $scope.updateView(walletData, profile.source);\n }\n else {\n $scope.avatar = undefined;\n $scope.existing = false;\n $scope.updateView(walletData, {});\n }\n\n UIUtils.loading.hide();\n\n // Update loading - done with a delay, to avoid trigger onFormDataChanged()\n return $timeout(function() {\n $scope.loading = false;\n }, 1000);\n })\n .then(function() {\n // removeIf(device)\n $focus('profile-name');\n // endRemoveIf(device)\n })\n .catch(UIUtils.onError('PROFILE.ERROR.LOAD_PROFILE_FAILED'));\n };\n\n $scope.setForm = function(form) {\n $scope.form = form;\n };\n\n $scope.updateView = function(walletData, profile) {\n $scope.walletData = walletData;\n $scope.formData = profile;\n if (profile.avatar) {\n $scope.avatarStyle={'background-image':'url(\"'+$scope.avatar.src+'\")'};\n }\n $scope.motion.show();\n };\n\n $scope.onFormDataChanged = function() {\n if ($scope.loading) return;\n $scope.dirty = true;\n };\n $scope.$watch('formData', $scope.onFormDataChanged, true);\n\n $scope.save = function(silent, hasWaitDebounce) {\n if($scope.form.$invalid || !$scope.walletData || ($scope.saving && !hasWaitDebounce)) {\n return $q.reject();\n }\n\n if (!hasWaitDebounce) {\n $scope.saving = true;\n return $timeout(function() {\n return $scope.save(silent, true);\n }, 650);\n }\n\n console.debug('[ES] [profile] Saving user profile...');\n\n var onError = function(message) {\n return function(err) {\n $scope.saving = false;\n UIUtils.onError(message)(err);\n };\n };\n\n var updateWallet = function(formData) {\n if (formData) {\n $scope.walletData.name = formData.title;\n if ($scope.avatar) {\n $scope.walletData.avatar = $scope.avatar;\n }\n else {\n delete $scope.walletData.avatar;\n }\n\n $scope.walletData.profile = angular.copy(formData);\n $scope.walletData.profile.descriptionHtml = esHttp.util.parseAsHtml(formData.description);\n }\n };\n\n var showSuccessToast = function() {\n if (!silent) {\n return $translate('PROFILE.INFO.PROFILE_SAVED')\n .then(function(message){\n UIUtils.toast.show(message);\n });\n }\n };\n\n var doFinishSave = function(formData) {\n // Social url must be unique in socials links - Fix #306:\n if (formData.socials && formData.socials.length) {\n formData.socials = _.uniq(formData.socials, false, function(social) {\n return social.url;\n });\n }\n\n // Workaround for old data\n if (formData.position) {\n formData.position = null;\n }\n\n // Make sure to convert lat/lon to float\n if (formData.geoPoint && formData.geoPoint.lat && formData.geoPoint.lon) {\n formData.geoPoint.lat = parseFloat(formData.geoPoint.lat);\n formData.geoPoint.lon = parseFloat(formData.geoPoint.lon);\n }\n else{\n formData.geoPoint = null; // force to null, need by ES update request\n }\n\n if (!$scope.existing) {\n return esProfile.add(formData, {wallet: wallet})\n .then(function() {\n console.info(\"[ES] [profile] Successfully created.\");\n $scope.existing = true;\n $scope.saving = false;\n $scope.dirty = false;\n updateWallet(formData);\n showSuccessToast();\n return true;\n })\n .catch(onError('PROFILE.ERROR.SAVE_PROFILE_FAILED'));\n }\n else {\n return esProfile.update(formData, {id: $scope.walletData.pubkey, wallet: wallet})\n .then(function() {\n console.info(\"[ES] Profile successfully updated.\");\n $scope.saving = false;\n $scope.dirty = false;\n updateWallet(formData);\n showSuccessToast();\n return true;\n })\n .catch(onError('PROFILE.ERROR.SAVE_PROFILE_FAILED'));\n }\n }; // end of doFinishSave\n\n if ($scope.avatar && $scope.avatar.src) {\n return UIUtils.image.resizeSrc($scope.avatar.src, true) // resize to thumbnail\n .then(function(imageSrc) {\n $scope.formData.avatar = esHttp.image.toAttachment({src: imageSrc});\n return doFinishSave($scope.formData);\n });\n }\n else {\n delete $scope.formData.avatar;\n return doFinishSave($scope.formData);\n }\n };\n\n $scope.saveAndClose = function() {\n return $scope.save()\n .then(function(saved) {\n if (saved) $scope.close();\n });\n };\n\n $scope.submitAndSaveAndClose = function() {\n $scope.form.$submitted=true;\n $scope.saveAndClose();\n };\n\n $scope.cancel = function() {\n $scope.dirty = false; // force not saved\n if (wallet.isDefault()) {\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n return $state.go('app.view_wallet');\n }\n else {\n return $state.go('app.view_wallet_by_id', {id: wallet.id});\n }\n };\n\n $scope.close = function() {\n if (wallet.isDefault()) {\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n return $state.go('app.view_wallet', {refresh: true});\n }\n else {\n return $state.go('app.view_wallet_by_id', {refresh: true, id: wallet.id});\n }\n };\n\n $scope.showAvatarModal = function() {\n if (Device.camera.enable) {\n return Device.camera.getPicture()\n .then(function(imageData) {\n if (!imageData) return;\n $scope.avatar = {src: \"data:image/png;base64,\" + imageData};\n $scope.avatarStyle={'background-image':'url(\"'+imageData+'\")'};\n $scope.dirty = true;\n })\n .catch(UIUtils.onError('ERROR.TAKE_PICTURE_FAILED'));\n }\n else {\n return ModalUtils.show('plugins/es/templates/common/modal_edit_avatar.html','ESAvatarModalCtrl',\n {})\n .then(function(imageData) {\n if (!imageData) return;\n $scope.avatar = {src: imageData};\n $scope.avatarStyle={'background-image':'url(\"'+imageData+'\")'};\n $scope.dirty = true;\n });\n }\n };\n\n $scope.rotateAvatar = function(){\n if (!$scope.avatar || !$scope.avatar.src || $scope.rotating) return;\n\n $scope.rotating = true;\n\n return UIUtils.image.rotateSrc($scope.avatar.src)\n .then(function(imageData){\n $scope.avatar.src = imageData;\n $scope.avatarStyle={'background-image':'url(\"'+imageData+'\")'};\n $scope.dirty = true;\n $scope.rotating = false;\n })\n .catch(function(err) {\n console.error(err);\n $scope.rotating = false;\n });\n };\n\n $scope.removeProfile = function(){\n // Hide popover if need\n $scope.hideActionsPopover();\n\n return $scope.existing && wallet.auth({minData: true})\n .then(function(walletData) {\n\n UIUtils.loading.hide();\n UIUtils.alert.confirm('PROFILE.CONFIRM.DELETE', undefined, {okText: 'COMMON.BTN_DELETE'})\n .then(function(confirm) {\n if (confirm){\n\n console.debug('[ES] [profile] Deleting user profile...');\n return esProfile.remove(walletData.pubkey, {wallet: wallet})\n .then(function () {\n if (wallet.isDefault()) {\n walletData.name=null; // keep local name, on children wallets\n }\n walletData.profile = null;\n walletData.avatar = null;\n console.debug('[ES] [profile] Successfully deleted');\n $scope.dirty = false;\n return $scope.close();\n })\n .then(function() {\n return $timeout(function() {\n UIUtils.toast.show('PROFILE.INFO.PROFILE_REMOVED');\n }, 750);\n })\n .catch(UIUtils.onError('PROFILE.ERROR.REMOVE_PROFILE_FAILED'));\n }\n });\n });\n };\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/user/edit_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n}\n\n\n","\nESMessageAbstractListController.$inject = ['$scope', '$state', '$translate', '$ionicHistory', '$ionicPopover', '$timeout', 'csWallet', 'esModals', 'UIUtils', 'esMessage'];\nESMessageInboxListController.$inject = ['$scope', '$controller'];\nESMessageOutboxListController.$inject = ['$scope', '$controller'];\nESMessageComposeController.$inject = ['$scope', '$controller'];\nESMessageComposeModalController.$inject = ['$scope', 'Modals', 'UIUtils', 'csWallet', 'esHttp', 'esMessage', 'parameters'];\nESMessageViewController.$inject = ['$scope', '$state', '$timeout', '$translate', '$ionicHistory', '$ionicPopover', 'UIUtils', 'esModals', 'esMessage', 'csWallet'];\nPopoverMessageController.$inject = ['$scope', 'UIUtils', '$state', 'csWallet', 'esHttp', 'esMessage', 'esModals', '$timeout'];angular.module('cesium.es.message.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.user_message', {\n url: \"/user/message\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/message/lookup.html\"\n }\n }\n })\n\n .state('app.user_message.tab_inbox', {\n url: \"/inbox\",\n views: {\n 'tab_inbox': {\n controller: 'ESMessageInboxListCtrl',\n templateUrl: \"plugins/es/templates/message/tabs/tab_list.html\"\n }\n },\n data: {\n auth: true,\n minData: true,\n large: 'app.user_messages_lg_inbox'\n }\n })\n\n .state('app.user_message.tab_outbox', {\n url: \"/outbox\",\n views: {\n 'tab_outbox': {\n controller: 'ESMessageOutboxListCtrl',\n templateUrl: \"plugins/es/templates/message/tabs/tab_list.html\"\n }\n },\n data: {\n auth: true,\n minData: true,\n large: 'app.user_messages_lg_outbox'\n }\n })\n\n .state('app.user_messages_lg_inbox', {\n url: \"/user/message/lg/inbox\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/message/lookup_lg.html\",\n controller: 'ESMessageInboxListCtrl'\n }\n },\n data: {\n auth: true,\n minData: true\n }\n })\n\n .state('app.user_messages_by_id', {\n url: \"/wallets/:id/message\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/message/lookup_by_id.html\"\n }\n }\n })\n\n .state('app.user_messages_by_id.tab_inbox', {\n url: \"/inbox\",\n views: {\n 'tab_inbox': {\n controller: 'ESMessageInboxListCtrl',\n templateUrl: \"plugins/es/templates/message/tabs/tab_list.html\"\n }\n },\n data: {\n large: 'app.user_messages_lg_inbox_by_id'\n }\n })\n\n .state('app.user_messages_by_id.tab_outbox', {\n url: \"/outbox\",\n views: {\n 'tab_outbox': {\n controller: 'ESMessageOutboxListCtrl',\n templateUrl: \"plugins/es/templates/message/tabs/tab_list.html\"\n }\n },\n data: {\n large: 'app.user_messages_lg_outbox_by_id'\n }\n })\n\n .state('app.user_messages_lg_inbox_by_id', {\n url: \"/wallets/:id/message/lg/inbox\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/message/lookup_lg.html\",\n controller: 'ESMessageInboxListCtrl'\n }\n }\n })\n\n .state('app.user_messages_lg_outbox', {\n url: \"/user/message/lg/outbox\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/message/lookup_lg.html\",\n controller: 'ESMessageOutboxListCtrl'\n }\n },\n data: {\n auth: true,\n minData: true\n }\n })\n\n .state('app.user_messages_lg_outbox_by_id', {\n url: \"/wallets/:id/message/lg/outbox\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/message/lookup_lg.html\",\n controller: 'ESMessageOutboxListCtrl'\n }\n }\n })\n\n .state('app.user_new_message', {\n cache: false,\n url: \"/user/message/new?pubkey&uid&title&content&isReply\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/message/compose.html\",\n controller: 'ESMessageComposeCtrl'\n }\n }\n })\n\n .state('app.user_view_message', {\n cache: false,\n url: \"/user/message/view/:type/:messageId\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/message/view_message.html\",\n controller: 'ESMessageViewCtrl'\n }\n },\n data: {\n auth: true,\n minData: true\n }\n })\n\n .state('app.user_view_message_by_id', {\n cache: false,\n url: \"/wallets/:id/message/view/:type/:messageId\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/message/view_message.html\",\n controller: 'ESMessageViewCtrl'\n }\n }\n })\n\n ;\n }])\n\n .controller('ESMessageAbstractListCtrl', ESMessageAbstractListController)\n\n .controller('ESMessageInboxListCtrl', ESMessageInboxListController)\n\n .controller('ESMessageOutboxListCtrl', ESMessageOutboxListController)\n\n .controller('ESMessageComposeCtrl', ESMessageComposeController)\n\n .controller('ESMessageComposeModalCtrl', ESMessageComposeModalController)\n\n .controller('ESMessageViewCtrl', ESMessageViewController)\n\n .controller('PopoverMessageCtrl', PopoverMessageController)\n\n;\n\nfunction ESMessageAbstractListController($scope, $state, $translate, $ionicHistory, $ionicPopover, $timeout,\n csWallet, esModals, UIUtils, esMessage) {\n 'ngInject';\n\n var defaultSearchLimit = 40;\n var wallet;\n var selectPrevented = false;\n\n $scope.search = {\n loading: true,\n results: [],\n hasMore : false,\n loadingMore : false,\n limit: defaultSearchLimit,\n type: 'last',\n text: null,\n options: {\n }\n };\n\n $scope.fabButtonNewMessageId = undefined;\n\n $scope.enter = function(s, state) {\n // First enter\n if ($scope.search.loading) {\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n $scope.isDefaultWallet = wallet.isDefault();\n $scope.walletId = wallet.id;\n\n wallet.auth({minData: true})\n .then(function() {\n if (!$scope.entered) {\n $scope.entered = true;\n $scope.type = $scope.type || state.stateParams && state.stateParams.type || 'inbox';\n $scope.load();\n }\n\n if ($scope.fabButtonNewMessageId) {\n $scope.showFab($scope.fabButtonNewMessageId);\n }\n })\n .catch(function(err) {\n if ('CANCELLED' === err) {\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n $scope.showHome();\n }\n });\n }\n // Not first entering: refresh the view\n else {\n $scope.updateView();\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.load = function(from, size, silent) {\n\n var options = angular.copy($scope.search.options);\n options.from = options.from || from || 0;\n options.size = options.size || size || defaultSearchLimit;\n options.type = $scope.type;\n options.summary = false;\n options.filter = ($scope.search.type == 'text' && $scope.search.text && $scope.search.text.trim().length > 0) ?\n $scope.search.text : undefined;\n options.wallet = wallet;\n\n $scope.search.loading = !silent;\n return esMessage.load(options)\n .then(function(res) {\n\n if (!options.from) {\n $scope.search.results = res || [];\n }\n else if (res){\n $scope.search.results = $scope.search.results.concat(res);\n }\n\n UIUtils.loading.hide();\n $scope.search.loading = false;\n $scope.search.hasMore = ($scope.search.results && $scope.search.results.length >= $scope.search.limit);\n $scope.updateView();\n })\n .catch(function(err) {\n $scope.search.loading = false;\n if (!options.from) {\n $scope.search.results = [];\n }\n $scope.search.hasMore = false;\n UIUtils.onError('MESSAGE.ERROR.LOAD_MESSAGES_FAILED')(err);\n });\n };\n\n $scope.updateView = function() {\n if ($scope.motion && $scope.motion.ionListClass && $scope.search.results.length) {\n $scope.motion.show({selector: '.view-messages .list .item'});\n }\n $scope.$broadcast('$$rebind::rebind'); // notifier binder\n };\n\n $scope.showMore = function() {\n $scope.search.limit = $scope.search.limit || defaultSearchLimit;\n $scope.search.limit += defaultSearchLimit;\n if ($scope.search.limit < defaultSearchLimit) {\n $scope.search.limit = defaultSearchLimit;\n }\n $scope.search.loadingMore = true;\n $scope.load(\n $scope.search.results.length, // from\n $scope.search.limit,\n true /*silent*/)\n .then(function() {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n $scope.markAllAsRead = function() {\n $scope.hideActionsPopover();\n if (!$scope.search.results || !$scope.search.results.length) return;\n\n UIUtils.alert.confirm('MESSAGE.CONFIRM.MARK_ALL_AS_READ')\n .then(function(confirm) {\n if (confirm) {\n esMessage.markAllAsRead()\n .then(function () {\n _.forEach($scope.search.results, function(msg){\n msg.read = true;\n });\n })\n .catch(UIUtils.onError('MESSAGE.ERROR.MARK_ALL_AS_READ_FAILED'));\n }\n });\n };\n\n $scope.delete = function(index) {\n var message = $scope.search.results[index];\n if (!message) return;\n\n UIUtils.alert.confirm('MESSAGE.CONFIRM.REMOVE')\n .then(function(confirm) {\n if (confirm) {\n esMessage.remove(message.id, $scope.type, {walletId: $scope.walletId})\n .then(function () {\n $scope.search.results.splice(index,1); // remove from messages array\n $scope.updateView();\n UIUtils.toast.show('MESSAGE.INFO.MESSAGE_REMOVED');\n })\n .catch(UIUtils.onError('MESSAGE.ERROR.REMOVE_MESSAGE_FAILED'));\n }\n });\n };\n\n $scope.deleteAll = function() {\n $scope.hideActionsPopover();\n if (!$scope.search.results || !$scope.search.results.length) return;\n\n UIUtils.alert.confirm('MESSAGE.CONFIRM.REMOVE_ALL')\n .then(function(confirm) {\n if (confirm) {\n esMessage.removeAll($scope.type, {walletId: $scope.walletId})\n .then(function () {\n $scope.search.results.splice(0,$scope.search.results.length); // reset array\n $scope.updateView();\n UIUtils.toast.show('MESSAGE.INFO.All_MESSAGE_REMOVED');\n })\n .catch(UIUtils.onError('MESSAGE.ERROR.REMOVE_All_MESSAGES_FAILED'));\n }\n });\n };\n\n $scope.doSearchLast = function() {\n $scope.search.type='last';\n $scope.search.loadingMore=false;\n $scope.search.limit = defaultSearchLimit;\n return $scope.load();\n };\n\n $scope.doSearch = function() {\n if (!$scope.search.text || $scope.search.text.length < 3) {\n return;\n }\n $scope.search.type='text';\n $scope.search.loadingMore=false;\n $scope.search.results = [];\n $scope.search.limit = defaultSearchLimit;\n\n console.debug('[message] [{0}] Searching for: {1}'.format($scope.type, $scope.search.text));\n return $scope.load();\n };\n\n\n $scope.refresh = function(silent) {\n selectPrevented = true; // Will disable select() to open the message\n return $scope.load(undefined, undefined, silent)\n .then(function() {\n selectPrevented = false;\n })\n .catch(function() {\n selectPrevented = false;\n });\n };\n\n $scope.select = function(message, event) {\n if (event.isDefaultPrevented() || $scope.search.loading || selectPrevented) return; // skip\n\n // Add a timeout, to be sure the refres action was not called before\n return $timeout(function() {\n if (selectPrevented || event.isDefaultPrevented()) return; // skip\n event.preventDefault();\n\n if ($scope.walletId === 'default') {\n return $state.go('app.user_view_message', {type: $scope.type, messageId:message.id});\n }\n else {\n return $state.go('app.user_view_message_by_id', {type: $scope.type, messageId:message.id, id: $scope.walletId});\n }\n }, 200);\n };\n\n /* -- Modals -- */\n\n $scope.showNewMessageModal = function(parameters) {\n return wallet.login({minData: true})\n .then(function() {\n UIUtils.loading.hide();\n\n parameters = parameters || {};\n parameters.wallet = $scope.walletId;\n\n return esModals.showMessageCompose(parameters)\n .then(function(id) {\n if (id) UIUtils.toast.show('MESSAGE.INFO.MESSAGE_SENT');\n });\n });\n };\n\n $scope.showReplyModal = function(index) {\n var message = $scope.search.results[index];\n if (!message) return;\n\n $translate('MESSAGE.REPLY_TITLE_PREFIX')\n .then(function (prefix) {\n var content = message.content ? message.content.replace(/^/g, ' > ') : null;\n content = content ? content.replace(/\\n/g, '\\n > ') : null;\n content = content ? content +'\\n' : null;\n return esModals.showMessageCompose({\n destPub: message.issuer,\n destUid: message.name||message.uid,\n title: prefix + message.title,\n content: content,\n isReply: true,\n wallet: $scope.walletId\n });\n })\n .then(function(sent) {\n if (sent) UIUtils.toast.show('MESSAGE.INFO.MESSAGE_SENT');\n });\n };\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/message/lookup_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n /* -- watch events (delete, received, sent) -- */\n\n // Message deletion\n $scope.onMessageDelete = function(id) {\n var index = _.findIndex($scope.search.results, function(msg) {\n return msg.id == id;\n });\n if (index) {\n $scope.search.results.splice(index,1); // remove from messages array\n }\n $scope.updateView();\n };\n esMessage.api.data.on.delete($scope, $scope.onMessageDelete);\n\n // Watch user sent message\n $scope.onNewOutboxMessage = function(id) {\n if ($scope.type !== 'outbox') return;\n // Add message sent to list\n $scope.search.loading = true;\n return $timeout(function() {\n // Load the message sent\n return esMessage.get(id, $scope.type, {summary: true, wallet: wallet});\n }, 500 /*waiting ES propagation*/)\n .then(function(msg) {\n $scope.search.results.splice(0,0,msg);\n $scope.search.loading = false;\n $scope.updateView();\n })\n .catch(function() {\n $scope.loading = false;\n });\n };\n esMessage.api.data.on.sent($scope, $scope.onNewOutboxMessage);\n\n // Watch received message\n $scope.onNewInboxMessage = function(notification) {\n if ($scope.type !== 'inbox' || !$scope.entered || !wallet.isUserPubkey(notification.issuer)) return;\n // Add message sent to list\n $scope.search.loading = true;\n // Load the the message\n return esMessage.get(notification.id, $scope.type, {summary: true, wallet: wallet})\n .then(function(msg) {\n $scope.search.results.splice(0,0,msg);\n $scope.search.loading = false;\n $scope.updateView();\n })\n .catch(function() {\n $scope.search.loading = false;\n });\n };\n esMessage.api.data.on.new($scope, $scope.onNewInboxMessage);\n\n // Watch unauth\n $scope.onUnauth = function() {\n // Reset all data\n $scope.search.results = undefined;\n $scope.search.loading = false;\n $scope.entered = false;\n };\n csWallet.api.data.on.unauth($scope, $scope.onUnauth);\n\n // for DEV only\n /*$timeout(function() {\n $scope.showNewMessageModal();\n }, 900);\n */\n}\n\nfunction ESMessageInboxListController($scope, $controller) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESMessageAbstractListCtrl', {$scope: $scope}));\n\n $scope.type = 'inbox';\n $scope.fabButtonNewMessageId = 'fab-add-message-record-inbox';\n\n}\n\n\nfunction ESMessageOutboxListController($scope, $controller) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESMessageAbstractListCtrl', {$scope: $scope}));\n\n $scope.type = 'outbox';\n $scope.fabButtonNewMessageId = 'fab-add-message-record-outbox';\n}\n\nfunction ESMessageComposeController($scope, $controller) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESMessageComposeModalCtrl', {$scope: $scope, parameters: {}}));\n\n\n $scope.enter = function(e, state) {\n\n // Apply state parameters\n if (state && state.stateParams) {\n $scope.setParameters(state.stateParams);\n }\n\n // Load wallet\n return $scope.load()\n .then(UIUtils.loading.hide);\n };\n $scope.$on('$ionicView.enter',$scope.enter);\n\n $scope.cancel = function() {\n $scope.sending = false;\n $scope.showHome();\n };\n\n $scope.setForm = function(form) {\n $scope.form = form;\n };\n\n $scope.closeModal = function() {\n $scope.sending = false;\n $scope.showHome();\n };\n\n}\n\nfunction ESMessageComposeModalController($scope, Modals, UIUtils, csWallet, esHttp, esMessage, parameters) {\n 'ngInject';\n\n var wallet;\n\n $scope.formData = {\n title: null,\n content: null,\n destPub: null,\n walletId: null\n };\n $scope.destUid = null;\n $scope.destPub = null;\n $scope.isReply = false;\n $scope.enableSelectWallet = true;\n $scope.sending = false;\n\n $scope.setParameters = function(parameters) {\n if (!parameters) return;\n\n if (parameters.pubkey || parameters.destPub) {\n $scope.formData.destPub = parameters.pubkey || parameters.destPub;\n if (parameters.uid || parameters.destUid) {\n $scope.destUid = parameters.uid || parameters.destUid;\n $scope.destPub = '';\n }\n else {\n $scope.destUid = '';\n $scope.destPub = $scope.formData.destPub;\n }\n }\n\n if (parameters.title) {\n $scope.formData.title = parameters.title;\n }\n\n if (parameters.content) {\n $scope.formData.content = parameters.content;\n }\n\n $scope.isReply = parameters.isReply || false;\n\n if (parameters.wallet) {\n $scope.formData.walletId = parameters.wallet;\n }\n };\n\n // Read default parameters\n $scope.setParameters(parameters);\n\n $scope.load = function() {\n $scope.enableSelectWallet = csWallet.children.count() > 0;\n\n wallet = $scope.enableSelectWallet && ($scope.formData.walletId ? csWallet.children.get($scope.formData.walletId) : csWallet) || csWallet;\n if (!wallet.isDefault()) {\n console.debug(\"[message] Using {\" + wallet.id + \"} wallet\");\n }\n else {\n console.debug(\"[message] Using default wallet\");\n }\n\n return wallet.login({minData: true, silent: true})\n .then(function(data) {\n $scope.walletData = data;\n })\n .catch(function(err){\n if (err === 'CANCELLED') {\n $scope.cancel();\n }\n });\n };\n $scope.$on('modal.shown', $scope.load);\n\n $scope.doSend = function(forceNoContent) {\n $scope.form.$submitted=true;\n if(!$scope.form.$valid) {\n return;\n }\n\n // Ask user confirmation if no content\n if (!forceNoContent && (!$scope.formData.content || !$scope.formData.content.trim().length)) {\n return UIUtils.alert.confirm('MESSAGE.COMPOSE.CONTENT_CONFIRMATION')\n .then(function(confirm) {\n if (confirm) {\n $scope.doSend(true);\n }\n });\n }\n\n $scope.sending = true;\n UIUtils.loading.show();\n var data = {\n issuer: wallet.data.pubkey,\n recipient: $scope.formData.destPub,\n title: $scope.formData.title,\n content: $scope.formData.content,\n time: moment().utc().unix()\n };\n\n esMessage.send(data, {wallet: wallet})\n .then(function(id) {\n $scope.id=id;\n UIUtils.loading.hide();\n $scope.closeModal(id);\n })\n .catch(function(err) {\n $scope.sending = false;\n // silent, if user cancelled;\n if (err === 'CANCELLED') {\n UIUtils.loading.hide();\n return;\n }\n UIUtils.onError('MESSAGE.ERROR.SEND_MSG_FAILED')(err);\n });\n };\n\n\n $scope.cancel = function() {\n $scope.closeModal();\n };\n\n /* -- Modals -- */\n\n $scope.showWotLookupModal = function() {\n Modals.showWotLookup()\n .then(function(result){\n if (result) {\n if (result.uid) {\n $scope.destUid = result.uid;\n $scope.destPub = '';\n }\n else {\n $scope.destUid = '';\n $scope.destPub = result.pubkey;\n }\n $scope.destName = result.name || result.uid;\n $scope.formData.destPub = result.pubkey;\n // TODO focus on title field\n //$focus('');\n }\n });\n };\n\n $scope.showSelectWalletModal = function() {\n if (!$scope.enableSelectWallet) return;\n\n return Modals.showSelectWallet({\n showDefault: true,\n showBalance: false\n })\n .then(function(newWallet) {\n if (!newWallet || (wallet && wallet.id === newWallet.id)) return;\n wallet = newWallet;\n $scope.walletData = wallet.data;\n console.debug(\"[message] Using {\" + wallet.id + \"} wallet\");\n });\n };\n\n\n\n // TODO : for DEV only\n /*$timeout(function() {\n $scope.formData.destPub = 'G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU';\n $scope.formData.title = 'test';\n $scope.formData.content = 'test';\n $scope.destPub = $scope.formData.destPub;\n\n $timeout(function() {\n //$scope.doSend();\n }, 800);\n }, 100);\n */\n}\n\n\nfunction ESMessageViewController($scope, $state, $timeout, $translate, $ionicHistory, $ionicPopover,\n UIUtils, esModals, esMessage, csWallet) {\n 'ngInject';\n\n $scope.formData = {};\n $scope.id = null;\n $scope.loading = true;\n\n var wallet;\n\n $scope.$on('$ionicView.beforeEnter', function (event, viewData) {\n // Enable back button (workaround need for navigation outside tabs - https://stackoverflow.com/a/35064602)\n viewData.enableBack = UIUtils.screen.isSmall() ? true : viewData.enableBack;\n });\n\n $scope.enter = function(e, state) {\n // First enter\n if ($scope.loading) {\n\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n $scope.isDefaultWallet = wallet.isDefault();\n $scope.walletId = wallet.id;\n\n var messageId = state.stateParams && state.stateParams.messageId;\n $scope.type = state.stateParams.type || 'inbox';\n\n // No message id: redirect\n if (angular.isUndefined(messageId)) {\n $scope.goBack();\n return;\n }\n\n wallet.auth({minData: true})\n .then(function () {\n return $scope.load(messageId, $scope.type);\n })\n .then(function(message) {\n\n UIUtils.loading.hide();\n if (!message) return; // SKip\n\n $scope.updateView(message);\n $scope.showFab('fab-view-message-reply');\n\n // Mark as read\n if (!message.read) {\n $timeout(function() {\n // Message has NOT changed\n if ($scope.id === message.id) {\n esMessage.markAsRead(message, {type: $scope.type, wallet: wallet})\n .then(function() {\n console.debug(\"[message] marked as read\");\n })\n .catch(UIUtils.onError('MESSAGE.ERROR.MARK_AS_READ_FAILED'));\n }\n }, 2000); // 2s\n }\n });\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.load = function(id, type) {\n type = type || 'inbox';\n return esMessage.get(id, type, {wallet: wallet})\n .catch(UIUtils.onError('MESSAGE.ERROR.LOAD_MESSAGE_FAILED'))\n .then(function(message) {\n if (!message.valid) {\n return UIUtils.alert.error(!$scope.isUserPubkey(message.recipient) ? 'MESSAGE.ERROR.USER_NOT_RECIPIENT' : 'MESSAGE.ERROR.NOT_AUTHENTICATED_MESSAGE',\n 'MESSAGE.ERROR.MESSAGE_NOT_READABLE')\n .then(function () {\n $scope.goBack(true/*clear cache*/);\n });\n }\n return message;\n });\n };\n\n $scope.updateView = function(message) {\n $scope.loading = false;\n $scope.id = message.id;\n $scope.formData = message;\n $scope.canDelete = true;\n $scope.motion.show({selector: '.view-message .list .item'});\n };\n\n $scope.delete = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n }\n\n UIUtils.alert.confirm('MESSAGE.CONFIRM.REMOVE')\n .then(function(confirm) {\n if (confirm) {\n return esMessage.remove($scope.id, $scope.type, {wallet: wallet})\n .then(function () {\n $scope.goBack(true/*clear page cache*/);\n UIUtils.toast.show('MESSAGE.INFO.MESSAGE_REMOVED');\n })\n .catch(UIUtils.onError('MESSAGE.ERROR.REMOVE_MESSAGE_FAILED'));\n }\n });\n };\n\n $scope.goBack = function(clearPageCache) {\n if (clearPageCache) {\n $ionicHistory.clearCache($ionicHistory.currentView().stateId); // clear current view\n }\n $ionicHistory.nextViewOptions({historyRoot: true});\n if ($scope.isDefaultWallet) {\n if ($scope.type) {\n $state.go('app.user_message.tab_' + $scope.type, {type: $scope.type});\n }\n }\n else {\n if ($scope.type) {\n $state.go('app.user_messages_by_id.tab_' + $scope.type, {type: $scope.type, id: $scope.walletId});\n }\n }\n };\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/message/view_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n /* -- Modals -- */\n\n $scope.showReplyModal = function() {\n var recipientField = ($scope.type === 'inbox') ? 'issuer' : 'recipient';\n $translate('MESSAGE.REPLY_TITLE_PREFIX')\n .then(function (prefix) {\n var content = $scope.formData.content ? $scope.formData.content.replace(/^/g, ' > ') : null;\n content = content ? content.replace(/\\n/g, '\\n > ') : null;\n content = content ? content +'\\n' : null;\n return esModals.showMessageCompose({\n destPub: $scope.formData[recipientField],\n destUid: $scope.formData.name||$scope.formData.uid,\n title: prefix + $scope.formData.title,\n content: content,\n isReply: true,\n walletId: wallet.id\n });\n })\n .then(function(sent) {\n if (sent) {\n UIUtils.toast.show('MESSAGE.INFO.MESSAGE_SENT')\n .then(function() {\n $ionicHistory.goBack();\n });\n }\n })\n ;\n };\n}\n\nfunction PopoverMessageController($scope, UIUtils, $state, csWallet, esHttp, esMessage, esModals, $timeout) {\n 'ngInject';\n\n var defaultSearchLimit = 40;\n var wallet;\n\n $scope.search = {\n loading : true,\n results: null,\n hasMore : false,\n loadingMore : false,\n limit: defaultSearchLimit\n };\n\n $scope.$on('popover.shown', function() {\n if ($scope.search.loading) {\n // TODO manage secondary wallets\n wallet = $scope.walletId && csWallet.children.get($scope.walletId) || csWallet;\n\n /* -- wallet listeners -- */\n if (wallet.isDefault()) {\n wallet.api.data.on.logout($scope, $scope.resetData);\n esMessage.api.data.on.new($scope, $scope.onNewMessageNotification);\n }\n\n $scope.load();\n }\n });\n\n $scope.load = function(from, size) {\n var options = {};\n options.from = from || 0;\n options.size = size || defaultSearchLimit;\n return esMessage.notifications.load(options)\n .then(function(notifications) {\n if (!from) {\n $scope.search.results = notifications;\n }\n else {\n $scope.search.results = $scope.search.results.concat(notifications);\n }\n $scope.search.loading = false;\n $scope.search.hasMore = ($scope.search.results && $scope.search.results.length >= $scope.search.limit);\n $scope.updateView();\n })\n .catch(function(err) {\n $scope.search.loading = false;\n if (!from) {\n $scope.search.results = [];\n }\n $scope.search.hasMore = false;\n UIUtils.onError('MESSAGE.ERROR.LOAD_NOTIFICATIONS_FAILED')(err);\n });\n };\n\n $scope.updateView = function() {\n if ($scope.motion && $scope.search.results && $scope.search.results.length) {\n $scope.motion.show({selector: '.popover-notification .item'});\n }\n };\n\n $scope.showMore = function() {\n $scope.search.limit = $scope.search.limit || defaultSearchLimit;\n $scope.search.limit = $scope.search.limit * 2;\n if ($scope.search.limit < defaultSearchLimit) {\n $scope.search.limit = defaultSearchLimit;\n }\n $scope.search.loadingMore = true;\n $scope.load(\n $scope.search.results.length, // from\n $scope.search.limit)\n .then(function() {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n // Listen notifications changes\n $scope.onNewMessageNotification = function(notification) {\n if ($scope.search.loading || $scope.search.loadingMore) return;\n\n if (!wallet.isUserPubkey(notification.issuer)) return; // skip\n\n // Prepend to list\n $scope.search.results.splice(0,0,notification);\n $scope.updateView();\n };\n\n $scope.select = function(notification) {\n if (!notification.read) notification.read = true;\n if ($scope.walletId === 'default') {\n $state.go('app.user_view_message', {messageId: notification.id});\n }\n else {\n $state.go('app.user_view_message_by_id', {messageId: notification.id, id: $scope.walletId});\n }\n $scope.closePopover(notification);\n };\n\n $scope.resetData = function() {\n if ($scope.search.loading) return;\n console.debug(\"[ES] [messages] Resetting data (settings or account may have changed)\");\n $scope.search.hasMore = false;\n $scope.search.results = [];\n $scope.search.loading = true;\n delete $scope.search.limit;\n };\n\n\n /* -- Modals -- */\n\n $scope.showNewMessageModal = function(parameters) {\n\n $scope.closePopover();\n\n $timeout(function() {\n parameters = parameters || {};\n parameters.walletId = wallet.id;\n\n esModals.showMessageCompose(parameters)\n .then(function(id) {\n if (id) UIUtils.toast.show('MESSAGE.INFO.MESSAGE_SENT');\n });\n }, 500); // Timeout need, to avoid freeze\n };\n\n /* -- listeners -- */\n\n esHttp.api.node.on.stop($scope, $scope.resetData);\n esHttp.api.node.on.start($scope, $scope.load);\n\n}\n","\nNotificationsController.$inject = ['$scope', '$ionicPopover', '$state', '$timeout', 'UIUtils', 'esHttp', 'csWallet', 'esNotification'];\nPopoverNotificationsController.$inject = ['$scope', '$timeout', '$controller', '$state', 'UIUtils', 'csWallet'];\nangular.module('cesium.es.notification.controllers', ['cesium.es.services'])\n\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.view_notifications', {\n url: \"/notifications\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/notification/view_notifications.html\",\n controller: 'NotificationsCtrl'\n }\n },\n data: {\n login: true\n }\n })\n .state('app.view_notifications_by_id', {\n url: \"/wallets/:id/notifications\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/notification/view_notifications.html\",\n controller: 'NotificationsCtrl'\n }\n },\n data: {\n login: true\n }\n })\n ;\n }])\n\n .controller('NotificationsCtrl', NotificationsController)\n\n .controller('PopoverNotificationsCtrl', PopoverNotificationsController)\n\n;\n\nfunction NotificationsController($scope, $ionicPopover, $state, $timeout, UIUtils, esHttp, csWallet, esNotification) {\n 'ngInject';\n\n var defaultSearchLimit = 40;\n\n $scope.preventSelect = false;\n $scope.search = {\n loading : true,\n results: null,\n hasMore : false,\n loadingMore : false,\n limit: defaultSearchLimit,\n options: {\n codes: {\n excludes: esNotification.constants.EXCLUDED_CODES\n }\n }\n };\n $scope.listeners = [];\n\n var wallet;\n\n $scope.setWallet = function(aWallet) {\n wallet = aWallet;\n };\n\n $scope.$on('$ionicView.enter', function(e, state) {\n if ($scope.search.loading) {\n\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n wallet.login({\n minData: true\n })\n .then(function() {\n $scope.load();\n UIUtils.loading.hide();\n\n $scope.addListeners();\n\n // Reset unread counter\n return $timeout(function() {\n $scope.resetUnreadCount();\n }, 1000);\n });\n }\n });\n\n $scope.refresh = function(silent) {\n return $scope.load(undefined, undefined, silent);\n };\n\n $scope.load = function(from, size, silent) {\n // Make sure wallet is init (need by PopoverInvitationCtrl)\n wallet = wallet || csWallet;\n\n if (!wallet.data.pubkey) {\n $scope.search.loading = true;\n return;\n }\n\n $scope.search.preventSelect = true;\n\n var options = angular.copy($scope.search.options);\n options.from = options.from || from || 0;\n options.size = options.size || size || defaultSearchLimit;\n options.pubkey = wallet.data.pubkey;\n $scope.search.loading = !silent;\n return esNotification.load(options)\n .then(function(res) {\n if (!options.from) {\n $scope.search.results = res || [];\n }\n else if (res){\n $scope.search.results = $scope.search.results.concat(res);\n }\n $scope.search.loading = false;\n $scope.search.preventSelect = false;\n $scope.search.hasMore = $scope.search.results.length >= $scope.search.limit;\n $scope.updateView();\n })\n .catch(function(err) {\n $scope.search.loading = false;\n if (!options.from) {\n $scope.search.results = [];\n }\n $scope.search.preventSelect = false;\n $scope.search.hasMore = false;\n UIUtils.onError('COMMON.NOTIFICATIONS.LOAD_NOTIFICATIONS_FAILED')(err);\n });\n };\n\n $scope.updateView = function() {\n if ($scope.motion && $scope.motion.ionListClass && $scope.search.results.length) {\n $scope.motion.show({selector: '.view-notification .item'});\n }\n };\n\n $scope.markAllAsRead = function() {\n $scope.hideActionsPopover();\n\n // Make sure to be auth before doing this\n if (!wallet.isAuth()) {\n return wallet.auth().then(function(){\n UIUtils.loading.hide();\n return $scope.markAllAsRead(); // loop\n });\n }\n\n if (!$scope.search.results.length) return;\n\n UIUtils.loading.show()\n .then(function() {\n wallet.data.notifications.unreadCount = 0;\n var lastNotification = $scope.search.results[0];\n wallet.data.notifications.time = lastNotification ? lastNotification.time : 0;\n _.forEach($scope.search.results, function (item) {\n if (item.markAsRead && typeof item.markAsRead == 'function') item.markAsRead();\n });\n\n return UIUtils.loading.hide();\n });\n };\n\n $scope.resetUnreadCount = function() {\n if ($scope.search.loading || !wallet.data.notifications) {\n return $timeout($scope.resetUnreadCount, 2000);\n }\n if (!wallet.data.notifications.unreadCount || !$scope.search.results || !$scope.search.results.length) return;\n wallet.data.notifications.unreadCount = 0;\n var lastNotification = $scope.search.results[0];\n var readTime = lastNotification.time ? lastNotification.time : 0;\n if (readTime && (!wallet.data.notifications.time || wallet.data.notifications.time != readTime)) {\n wallet.data.notifications.time = readTime;\n wallet.storeData();\n }\n };\n\n $scope.select = function(event, item) {\n\n if ($scope.search.loading || event.preventDefault() || $scope.search.preventSelect) return;\n\n if (item.markAsRead && typeof item.markAsRead == 'function') {\n $timeout(item.markAsRead);\n }\n if (item.state) {\n $state.go(item.state, item.stateParams);\n }\n };\n\n $scope.showMore = function() {\n $scope.search.limit = $scope.search.limit || defaultSearchLimit;\n $scope.search.limit += defaultSearchLimit;\n if ($scope.search.limit < defaultSearchLimit) {\n $scope.search.limit = defaultSearchLimit;\n }\n $scope.search.loadingMore = true;\n $scope.load(\n $scope.search.results.length, // from\n $scope.search.limit)\n .then(function() {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n // Listen notifications changes\n $scope.onNewNotification = function(notification) {\n if ($scope.search.loading || $scope.search.loadingMore) return;\n\n // Retrieve insertion index\n var nextIndex = _.findIndex($scope.search.results, function(n) {\n return notification.time > n.time;\n });\n if (nextIndex < 0) nextIndex = 0;\n\n // Update the array\n $scope.search.results.splice(nextIndex,0,notification);\n $scope.updateView();\n };\n\n $scope.resetData = function() {\n if ($scope.search.loading) return;\n console.debug(\"[ES] [notifications] Resetting data (settings or account may have changed)\");\n $scope.search.hasMore = false;\n $scope.search.results = [];\n $scope.search.loading = true;\n delete $scope.search.limit;\n };\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl :'plugins/es/templates/notification/popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n /* -- listeners -- */\n\n $scope.addListeners = function() {\n if (!wallet) throw \"Controller wallet not set !\";\n\n $scope.listeners = [\n esHttp.api.node.on.stop($scope, $scope.resetData),\n esHttp.api.node.on.start($scope, $scope.load),\n wallet.api.data.on.logout($scope, $scope.resetData)\n ];\n\n if (wallet.isDefault()) {\n // Subscribe to new notification\n $scope.listeners.push(\n esNotification.api.data.on.new($scope, $scope.onNewNotification)\n );\n }\n };\n\n $scope.removeListeners = function() {\n _.forEach($scope.listeners, function(remove){\n remove();\n });\n $scope.listeners = [];\n };\n}\n\nfunction PopoverNotificationsController($scope, $timeout, $controller, $state,\n UIUtils, csWallet) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('NotificationsCtrl', {$scope: $scope}));\n\n // Disable list motion\n $scope.motion = null;\n\n // Set the wallet to use\n $scope.setWallet(csWallet);\n\n $scope.$on('popover.shown', function() {\n if ($scope.search.loading) {\n $scope.addListeners();\n $scope.load();\n }\n });\n\n $scope.updateView = function() {\n if (!$scope.search.results.length) return;\n\n // Set Ink\n $timeout(function() {\n UIUtils.ink({selector: '.popover-notification .item.ink'});\n }, 100);\n };\n\n $scope.$on('popover.hidden', $scope.resetUnreadCount);\n\n $scope.select = function($event, notification) {\n if ($event.preventDefault() || !notification) return; // no selection\n if (notification.markAsRead && typeof notification.markAsRead == 'function') notification.markAsRead();\n if (notification.state) {\n $state.go(notification.state, notification.stateParams);\n }\n $scope.closePopover(notification);\n };\n}\n","\nESBlockLookupController.$inject = ['$scope', '$controller', '$ionicPopover', '$location', 'UIUtils', 'esBlockchain'];\nangular.module('cesium.es.blockchain.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.lookup_blocks_currency', {\n url: \"/currencies/:currency/blocks?q\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/blockchain/lookup.html\",\n controller: 'ESBlockLookupCtrl'\n }\n }\n })\n\n .state('app.blockchain_search', {\n url: \"/blockchain/search?q&type\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/blockchain/lookup.html\",\n controller: 'ESBlockLookupCtrl'\n }\n },\n data: {\n silentLocationChange: true\n }\n })\n ;\n }])\n\n .controller('ESBlockLookupCtrl', ESBlockLookupController)\n;\n\n\nfunction ESBlockLookupController($scope, $controller, $ionicPopover, $location, UIUtils, esBlockchain) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('BlockLookupCtrl', {$scope: $scope}));\n\n $scope.search.text = null;\n $scope.search.type = 'last';\n $scope.search.sort = undefined;\n $scope.search.asc = true;\n $scope.searchTextId = 'blockchainSearchText';\n $scope.compactMode = true;\n $scope.enableFilter = true;\n\n $scope.doSearchText = function() {\n if ((!$scope.search.text || !$scope.search.text.trim().length) &&\n (!$scope.search.filters || !$scope.search.filters.length) ) {\n return $scope.doSearchLast();\n }\n\n $scope.search.type = 'text';\n\n $scope.doSearch();\n\n // Update location href\n $location.search({q: $scope.search.query}).replace();\n };\n\n $scope.doSearchLast = function() {\n $scope.hideActionsPopover();\n\n $scope.search.type = 'last';\n $scope.search.sort = undefined;\n $scope.doSearch();\n\n $location.search({q: undefined}).replace();\n };\n\n\n // This method override the base class method\n $scope.doSearch = function(from) {\n if ($scope.search.error) return;\n\n from = angular.isDefined(from) ? from : 0;\n var promise;\n var request = {};\n\n $scope.search.loading = (from === 0);\n request.size = $scope.defaultSizeLimit;\n\n // last block\n if ($scope.search.type == 'last') {\n // Add '+1' to skip the indexed block with _id='current'\n request.from = (from === 0) ? 0 : from+1;\n // add sort\n if ($scope.search.sort) {\n request.sort = {};\n request.sort[$scope.search.sort] = !$scope.search.asc ? \"desc\" : \"asc\";\n }\n else { // default sort\n request.sort = {\n \"number\": \"desc\"\n };\n }\n request.excludeCurrent = (from === 0);\n\n promise = esBlockchain.block.search($scope.currency, request);\n }\n\n // Full text search\n else if ($scope.search.type == 'text') {\n\n // Parse text search into filters array\n var res = esBlockchain.block.parseSearchText($scope.search.text, $scope.search.filters);\n $scope.search.filters = res.filters;\n var query = $scope.search.filters.reduce(function(query, filter){\n return query + ' AND ' + filter.text;\n }, '');\n if (res.text.length) {\n query += ' AND ' + res.text;\n }\n\n $scope.search.query = query.substr(5);\n $scope.search.text = res.text;\n\n request.from = from;\n\n // add sort\n if ($scope.search.sort) {\n request.sort = $scope.search.sort + ':' + (!$scope.search.asc ? \"desc\" : \"asc\");\n }\n else { // default sort\n request.sort = \"number:desc\";\n }\n request.excludeCurrent = true;\n\n promise = esBlockchain.block.searchText($scope.currency, $scope.search.query, request);\n }\n\n var now = Date.now();\n return promise\n .then(function(result) {\n // Apply transformation need by UI (e.g add avatar and name...)\n return $scope.doPrepareResult(result.hits)\n .then(function() {\n return result;\n });\n })\n .then(function(result) {\n $scope.showPubkey = ($scope.search.sort == 'issuer');\n // Compute time only once (on first page)\n $scope.search.took = (from === 0) ? (Date.now() - now) : $scope.search.took;\n // Keep previous total, when already computed (because of current, that is excluded only in the first page)\n var total = (from === 0) ? result.total : $scope.search.total;\n $scope.doDisplayResult(result.hits, from, total);\n $scope.search.loading = false;\n })\n .catch(function(err) {\n $scope.search.error = true;\n $scope.search.loading = false;\n UIUtils.onError('BLOCKCHAIN.ERROR.SEARCH_BLOCKS_FAILED')(err)\n .then(function() {\n $scope.search.error = false;\n });\n });\n };\n\n $scope.toggleSort = function(sort){\n if ($scope.search.sort === sort && !$scope.search.asc) {\n $scope.search.asc = undefined;\n $scope.search.sort = undefined;\n }\n else {\n $scope.search.asc = ($scope.search.sort === sort) ? !$scope.search.asc : true;\n $scope.search.sort = sort;\n }\n $scope.doSearch();\n };\n\n $scope.showHelpTip = function() {\n\n };\n\n /* -- popups -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/blockchain/lookup_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n /* -- manage click -- */\n\n\n // Cancel search filter\n $scope.itemRemove = function(index) {\n $scope.search.filters.splice(index, 1);\n $scope.doSearchText();\n };\n\n //Show the query\n $scope.toggleShowQuery = function() {\n $scope.showQuery = !$scope.showQuery;\n };\n}\n\n","\nESNetworkLookupController.$inject = ['$scope', '$state', '$location', '$ionicPopover', '$window', '$translate', 'esHttp', 'UIUtils', 'csConfig', 'csSettings', 'csCurrency', 'esNetwork', 'csWot'];\nESNetworkLookupModalController.$inject = ['$scope', '$controller', 'parameters'];\nESPeerViewController.$inject = ['$scope', '$q', '$window', '$state', 'UIUtils', 'csWot', 'esHttp', 'csHttp', 'csSettings'];\nESNetworkLookupPopoverController.$inject = ['$scope', '$controller'];\nESPeerInfoPopoverController.$inject = ['$scope', '$q', 'csSettings', 'csCurrency', 'csHttp', 'esHttp'];angular.module('cesium.es.network.controllers', ['cesium.es.services'])\n\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n PluginServiceProvider.extendState('app.network', {\n points: {\n 'network-buttons': {\n templateUrl: \"plugins/es/templates/network/view_network_extend.html\",\n controller: 'ESExtensionCtrl'\n },\n 'blockchain-buttons': {\n templateUrl: \"plugins/es/templates/network/view_network_extend.html\",\n controller: 'ESExtensionCtrl'\n }\n }\n })\n ;\n }\n }])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.es_network', {\n url: \"/network/data?online&expert\",\n cache: false, // fix #766\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/network/view_es_network.html\",\n controller: 'ESNetworkLookupCtrl'\n }\n },\n data: {\n silentLocationChange: true\n }\n })\n\n .state('app.view_es_peer', {\n url: \"/network/data/peer/:server?ssl&tor\",\n cache: false,\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/network/view_es_peer.html\",\n controller: 'ESPeerViewCtrl'\n }\n },\n data: {\n preferHttp: true // avoid HTTPS if config has httpsMode=clever\n }\n });\n }])\n\n .controller('ESNetworkLookupCtrl', ESNetworkLookupController)\n\n .controller('ESNetworkLookupModalCtrl', ESNetworkLookupModalController)\n\n .controller('ESPeerViewCtrl', ESPeerViewController)\n\n .controller('ESNetworkLookupPopoverCtrl', ESNetworkLookupPopoverController)\n\n .controller('ESPeerInfoPopoverCtrl', ESPeerInfoPopoverController)\n\n;\n\n\nfunction ESNetworkLookupController($scope, $state, $location, $ionicPopover, $window, $translate,\n esHttp, UIUtils, csConfig, csSettings, csCurrency, esNetwork, csWot) {\n 'ngInject';\n\n $scope.networkStarted = false;\n $scope.ionItemClass = '';\n $scope.expertMode = csSettings.data.expertMode && !UIUtils.screen.isSmall();\n $scope.isHttps = ($window.location.protocol === 'https:');\n $scope.search = {\n text: '',\n loading: true,\n online: true,\n results: [],\n endpointFilter: esHttp.constants.ES_USER_API,\n sort : undefined,\n asc: true\n };\n $scope.compactMode = true;\n $scope.listeners = [];\n $scope.helptipPrefix = 'helptip-network';\n $scope.enableLocationHref = true; // can be overrided by sub-controller (e.g. popup)\n\n $scope.removeListeners = function() {\n if ($scope.listeners.length) {\n console.debug(\"[ES] [network] Closing listeners\");\n _.forEach($scope.listeners, function(remove){\n remove();\n });\n $scope.listeners = [];\n }\n };\n\n /**\n * Enter in view\n */\n $scope.enter = function(e, state) {\n if ($scope.networkStarted) return;\n $scope.networkStarted = true;\n $scope.search.loading = true;\n csCurrency.get()\n .then(function (currency) {\n if (currency) {\n $scope.node = !esHttp.node.same(currency.node.host, currency.node.port) ?\n esHttp.instance(currency.node.host, currency.node.port) : esHttp;\n if (state && state.stateParams) {\n if (state.stateParams.online === 'true') {\n $scope.search.online = true;\n }\n if (state.stateParams.expert) {\n $scope.expertMode = (state.stateParams.expert == 'true');\n }\n }\n $scope.load();\n }\n })\n .catch(function(err) {\n UIUtils.onError('ERROR.GET_CURRENCY_FAILED')(err);\n $scope.networkStarted = false;\n });\n };\n $scope.$on('$ionicParentView.enter', $scope.enter);\n\n /**\n * Leave the view\n */\n $scope.leave = function() {\n if (!$scope.networkStarted) return;\n $scope.removeListeners();\n esNetwork.close();\n $scope.networkStarted = false;\n $scope.search.loading = true;\n };\n $scope.$on('$ionicView.beforeLeave', $scope.leave);\n $scope.$on('$ionicParentView.beforeLeave', $scope.leave);\n $scope.$on('$destroy', $scope.leave);\n\n\n $scope.computeOptions = function() {\n var options = {\n filter: {\n member: (!$scope.search.type || $scope.search.type === 'member'),\n mirror: (!$scope.search.type || $scope.search.type === 'mirror'),\n endpointFilter : (angular.isDefined($scope.search.endpointFilter) ? $scope.search.endpointFilter : null),\n online: $scope.search.online && true\n },\n sort: {\n type : $scope.search.sort,\n asc : $scope.search.asc\n },\n expertMode: $scope.expertMode,\n // larger timeout when on expert mode\n timeout: csConfig.timeout && ($scope.expertMode ? (csConfig.timeout / 10) : (csConfig.timeout / 100))\n };\n return options;\n };\n\n $scope.load = function() {\n\n if ($scope.search.loading){\n // Start network scan\n esNetwork.start($scope.node, $scope.computeOptions());\n\n // Catch event on new peers\n $scope.refreshing = false;\n $scope.listeners.push(\n esNetwork.api.data.on.changed($scope, function(data){\n if (!$scope.refreshing) {\n $scope.refreshing = true;\n csWot.extendAll(data.peers)\n .then(function() {\n // Avoid to refresh if view has been leaving\n if ($scope.networkStarted) {\n $scope.updateView(data);\n }\n $scope.refreshing = false;\n });\n }\n }));\n }\n };\n\n $scope.updateView = function(data) {\n console.debug(\"[peers] Updating UI\");\n $scope.$broadcast('$$rebind::rebind'); // force data binding\n $scope.search.results = data.peers;\n $scope.search.memberPeersCount = data.memberPeersCount;\n // Always tru if network not started (e.g. after leave+renter the view)\n $scope.search.loading = !$scope.networkStarted || esNetwork.isBusy();\n if (!$scope.loading) {\n $scope.$broadcast('$$rebind::rebind'); // force data binding\n }\n if ($scope.motion && $scope.search.results && $scope.search.results.length > 0) {\n $scope.motion.show({selector: '.item-peer'});\n }\n };\n\n $scope.refresh = function() {\n // Network\n $scope.search.loading = true;\n esNetwork.loadPeers();\n };\n\n $scope.sort = function() {\n $scope.search.loading = true;\n $scope.refreshing = true;\n esNetwork.sort($scope.computeOptions());\n $scope.updateView(esNetwork.data);\n };\n\n $scope.toggleOnline = function(online){\n $scope.hideActionsPopover();\n $scope.search.online = (online !== false);\n esNetwork.close();\n $scope.search.loading = true;\n $scope.load();\n\n // Update location href\n if ($scope.enableLocationHref) {\n $location.search($scope.search.online ? {} : {online: false}).replace();\n }\n };\n\n $scope.toggleSearchEndpoint = function(endpoint){\n $scope.hideActionsPopover();\n if ($scope.search.endpointFilter === endpoint || endpoint === null) {\n $scope.search.endpointFilter = null;\n }\n else {\n $scope.search.endpointFilter = endpoint;\n }\n $scope.sort();\n };\n\n $scope.toggleSort = function(sort){\n if ($scope.search.sort === sort && !$scope.search.asc) {\n $scope.search.asc = undefined;\n $scope.search.sort = undefined;\n }\n else {\n $scope.search.asc = ($scope.search.sort === sort) ? !$scope.search.asc : true;\n $scope.search.sort = sort;\n }\n $scope.sort();\n };\n\n $scope.selectPeer = function(peer) {\n if (peer.compacted && $scope.compactMode) {\n $scope.toggleCompactMode();\n return;\n }\n\n // Skip offline\n if (!peer.online ) return;\n\n var stateParams = {server: peer.getServer()};\n if (peer.isSsl()) {\n stateParams.ssl = true;\n }\n if (peer.isTor()) {\n stateParams.tor = true;\n }\n $state.go('app.view_es_peer', stateParams);\n };\n\n $scope.$on('csView.action.refresh', function(event, context) {\n if (context === 'peers') {\n $scope.refresh();\n }\n });\n\n $scope.$on('csView.action.showActionsPopover', function(event, clickEvent) {\n $scope.showActionsPopover(clickEvent);\n });\n\n /* -- popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/network/lookup_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n $scope.showEndpointsPopover = function($event, peer, endpointFilter) {\n $event.preventDefault();\n $event.stopPropagation();\n\n var endpoints = peer.getEndpoints(endpointFilter);\n endpoints = (endpoints||[]).reduce(function(res, ep) {\n var bma = esHttp.node.parseEndPoint(ep);\n return res.concat({\n label: 'NETWORK.VIEW.NODE_ADDRESS',\n value: peer.getServer() + (bma.path||'')\n });\n }, []);\n if (!endpoints.length) return;\n\n // Call extension points\n UIUtils.popover.show($event, {\n templateUrl: 'templates/network/popover_endpoints.html',\n bindings: {\n titleKey: 'NETWORK.VIEW.ENDPOINTS.' + endpointFilter,\n items: endpoints\n }\n });\n };\n\n $scope.showWs2pPopover = function($event, peer) {\n $event.stopPropagation();\n\n return $translate('NETWORK.VIEW.PRIVATE_ACCESS')\n .then(function(privateAccessMessage) {\n UIUtils.popover.show($event, {\n templateUrl: 'templates/network/popover_endpoints.html',\n bindings: {\n titleKey: 'NETWORK.VIEW.ENDPOINTS.WS2P',\n valueKey: 'NETWORK.VIEW.NODE_ADDRESS',\n items: [\n {\n label: 'NETWORK.VIEW.NODE_ADDRESS',\n value: !peer.bma.private ? (peer.getServer() + (peer.bma.path||'')) : privateAccessMessage\n },\n {\n label: 'NETWORK.VIEW.WS2PID',\n value: peer.bma.ws2pid\n },\n {\n label: 'NETWORK.VIEW.POW_PREFIX',\n value: peer.powPrefix\n }]\n }\n });\n });\n };\n}\n\n\nfunction ESNetworkLookupModalController($scope, $controller, parameters) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESNetworkLookupCtrl', {$scope: $scope}));\n\n // Read parameters\n parameters = parameters || {};\n $scope.enableFilter = angular.isDefined(parameters.enableFilter) ? parameters.enableFilter : true;\n $scope.search.type = angular.isDefined(parameters.type) ? parameters.type : $scope.search.type;\n $scope.search.endpointFilter = angular.isDefined(parameters.endpointFilter) ? parameters.endpointFilter : $scope.search.endpointFilter;\n $scope.expertMode = angular.isDefined(parameters.expertMode) ? parameters.expertMode : $scope.expertMode;\n $scope.ionItemClass = parameters.ionItemClass || 'item-border-large';\n $scope.enableLocationHref = false;\n $scope.helptipPrefix = '';\n\n $scope.selectPeer = function(peer) {\n $scope.closeModal(peer);\n };\n\n $scope.$on('modal.hidden', function(){\n $scope.leave();\n });\n\n // Disable this unsed method - called by load()\n $scope.showHelpTip = function() {};\n\n // Enter the modal\n $scope.enter();\n}\n\n\nfunction ESNetworkLookupPopoverController($scope, $controller) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('NetworkLookupCtrl', {$scope: $scope}));\n\n // Read parameters\n var parameters = parameters || {};\n $scope.enableFilter = angular.isDefined(parameters.enableFilter) ? parameters.enableFilter : true;\n $scope.search.type = angular.isDefined(parameters.type) ? parameters.type : $scope.search.type;\n $scope.search.endpointFilter = angular.isDefined(parameters.endpointFilter) ? parameters.endpointFilter : $scope.search.endpointFilter;\n $scope.expertMode = angular.isDefined(parameters.expertMode) ? parameters.expertMode : $scope.expertMode;\n $scope.ionItemClass = parameters.ionItemClass || 'item-border-large';\n $scope.helptipPrefix = '';\n\n $scope.selectPeer = function(peer) {\n $scope.closePopover(peer);\n };\n\n $scope.$on('popover.hidden', function(){\n $scope.leave();\n });\n\n // Disable this unsed method - called by load()\n $scope.showHelpTip = function() {};\n\n // Enter the popover\n $scope.enter();\n}\n\nfunction ESPeerInfoPopoverController($scope, $q, csSettings, csCurrency, csHttp, esHttp) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.formData = {};\n\n $scope.load = function() {\n\n $scope.loading = true;\n $scope.formData = {};\n\n return $q.all([\n // get current block\n esHttp.blockchain.current()\n .then(function(block) {\n $scope.formData.number = block.number;\n $scope.formData.medianTime = block.medianTime;\n $scope.formData.powMin = block.powMin;\n $scope.formData.useSsl = esHttp.useSsl;\n })\n .catch(function() {\n delete $scope.formData.number;\n delete $scope.formData.medianTime;\n delete $scope.formData.powMin;\n delete $scope.formData.useSsl;\n // continue\n }),\n\n // Get node current version\n esHttp.node.summary()\n .then(function(res){\n $scope.formData.version = res && res.duniter && res.duniter.version;\n $scope.formData.software = res && res.duniter && res.duniter.software;\n })\n .catch(function() {\n delete $scope.formData.version;\n delete $scope.formData.software;\n // continue\n }),\n\n // Get latest version\n esHttp.version.latest()\n .then(function(latestRelease){\n $scope.formData.latestRelease = latestRelease;\n })\n .catch(function() {\n delete $scope.formData.latestRelease;\n // continue\n })\n ])\n .then(function() {\n // Compare, to check if newer\n if ($scope.formData.latestRelease && $scope.formData.software === 'cesium-plus-pod') {\n var compare = csHttp.version.compare($scope.formData.version, $scope.formData.latestRelease.version);\n $scope.formData.isPreRelease = compare > 0;\n $scope.formData.hasNewRelease = compare < 0;\n }\n else {\n $scope.formData.isPreRelease = false;\n $scope.formData.hasNewRelease = false;\n }\n $scope.loading = false;\n $scope.$broadcast('$$rebind::rebind'); // force data binding\n });\n };\n\n // Update UI on new block\n csCurrency.api.data.on.newBlock($scope, function(block) {\n if ($scope.loading) return;\n console.debug(\"[peer info] Received new block. Reload content\");\n $scope.load();\n });\n\n // Update UI on settings changed\n csSettings.api.data.on.changed($scope, function(data) {\n if ($scope.loading) return;\n console.debug(\"[peer info] Peer settings changed. Reload content\");\n $scope.load();\n });\n\n // Load data when enter\n $scope.load();\n}\n\nfunction ESPeerViewController($scope, $q, $window, $state, UIUtils, csWot, esHttp, csHttp, csSettings) {\n 'ngInject';\n\n $scope.node = {};\n $scope.loading = true;\n $scope.isHttps = ($window.location.protocol === 'https:');\n $scope.isReachable = true;\n $scope.options = {\n document: {\n index : csSettings.data.plugins.es && csSettings.data.plugins.es.document && csSettings.data.plugins.es.document.index || 'user',\n type: csSettings.data.plugins.es && csSettings.data.plugins.es.document && csSettings.data.plugins.es.document.type || 'profile'\n }\n };\n\n $scope.$on('$ionicView.beforeEnter', function (event, viewData) {\n // Enable back button (workaround need for navigation outside tabs - https://stackoverflow.com/a/35064602)\n viewData.enableBack = UIUtils.screen.isSmall() ? true : viewData.enableBack;\n });\n\n $scope.$on('$ionicView.enter', function(e, state) {\n var isDefaultNode = !state.stateParams || !state.stateParams.server;\n var server = state.stateParams && state.stateParams.server || esHttp.server;\n var useSsl = state.stateParams && state.stateParams.ssl == \"true\" || (isDefaultNode ? esHttp.useSsl : false);\n var useTor = state.stateParams.tor == \"true\" || (isDefaultNode ? esHttp.useTor : false);\n\n return $scope.load(server, useSsl, useTor)\n .then(function() {\n return $scope.$broadcast('$csExtension.enter', e, state);\n })\n .then(function(){\n $scope.loading = false;\n })\n .catch(function() {\n $scope.loading = false;\n });\n });\n\n $scope.load = function(server, useSsl, useTor) {\n var node = {\n server: server,\n host: server,\n useSsl: useSsl,\n useTor: useTor\n };\n var serverParts = server.split(':');\n if (serverParts.length === 2) {\n node.host = serverParts[0];\n node.port = serverParts[1];\n }\n node.url = csHttp.getUrl(node.host, node.port, undefined/*path*/, node.useSsl);\n\n angular.merge($scope.node,\n useTor ?\n // For TOR, use a web2tor to access the endpoint\n esHttp.lightInstance(node.host + \".to\", 443, 443, true/*ssl*/, 60000 /*long timeout*/) :\n esHttp.lightInstance(node.host, node.port, node.useSsl),\n node);\n\n $scope.isReachable = !$scope.isHttps || useSsl;\n if (!$scope.isReachable) {\n // Get node from the default node\n return esHttp.network.peers()\n .then(function(res) {\n // find the current peer\n var peers = (res && res.peers || []).reduce(function(res, json) {\n var peer = new EsPeer(json);\n if (!peer.hasEsEndpoint()) return res;\n var ep = esHttp.node.parseEndPoint(peer.getEsEndpoints()[0]);\n if((ep.dns == node.host || ep.ipv4 == node.host || ep.ipv6 == node.host) && (\n ep.port == node.port)) {\n peer.ep = ep;\n return res.concat(peer);\n }\n return res;\n }, []);\n var peer = peers.length && peers[0];\n\n // Current node found\n if (peer) {\n $scope.node.pubkey = peer.pubkey;\n $scope.node.currency = peer.currency;\n return csWot.extend($scope.node);\n }\n else {\n console.warn('Could not get peer from /network/peers');\n }\n });\n }\n\n return $q.all([\n\n // Get node peer info\n $scope.node.network.peering.self()\n .then(function(json) {\n $scope.node.pubkey = json.pubkey;\n $scope.node.currency = json.currency;\n }),\n\n // Get node doc count\n $scope.node.record.count($scope.options.document.index, $scope.options.document.type)\n .then(function(count) {\n $scope.node.docCount = count;\n }),\n\n // Get known peers\n $scope.node.network.peers()\n .then(function(json) {\n var peers = json.peers.reduce(function (res, p) {\n var peer = new EsPeer(p);\n if (!peer.hasEsEndpoint()) return res;\n peer.online = p.status === 'UP';\n peer.blockNumber = peer.block.replace(/-.+$/, '');\n peer.ep = esHttp.node.parseEndPoint(peer.getEsEndpoints()[0]);\n peer.dns = peer.getDns();\n peer.id = peer.keyID();\n peer.server = peer.getServer();\n return res.concat(peer);\n }, []);\n\n // Extend (add uid+name+avatar)\n return csWot.extendAll([$scope.node].concat(peers))\n .then(function() {\n // Final sort\n $scope.peers = _.sortBy(peers, function(p) {\n var score = 1;\n score += 10000 * (p.online ? 1 : 0);\n score += 1000 * (p.hasMainConsensusBlock ? 1 : 0);\n score += 100 * (p.name ? 1 : 0);\n return -score;\n });\n $scope.motion.show({selector: '.item-peer'});\n });\n }),\n\n // Get current block\n $scope.node.blockchain.current()\n .then(function(json) {\n $scope.current = json;\n })\n ])\n .catch(UIUtils.onError(useTor ? \"PEER.VIEW.ERROR.LOADING_TOR_NODE_ERROR\" : \"PEER.VIEW.ERROR.LOADING_NODE_ERROR\"));\n };\n\n $scope.selectPeer = function(peer) {\n // Skip offline\n if (!peer.online ) return;\n\n var stateParams = {server: peer.getServer()};\n if (peer.isSsl()) {\n stateParams.ssl = true;\n }\n if (peer.isTor()) {\n stateParams.tor = true;\n }\n $state.go('app.view_es_peer', stateParams);\n };\n\n /* -- manage link to raw document -- */\n\n $scope.openRawPeering = function(event) {\n return $scope.openLink(event, $scope.node.url + '/network/peering?pretty');\n };\n\n $scope.openRawCurrentBlock = function(event) {\n return $scope.openLink(event, $scope.node.url + '/network/peering?pretty');\n };\n}\n","\nESGroupListController.$inject = ['$scope', 'UIUtils', '$state', 'csWallet', 'esGroup', 'ModalUtils'];\nESGroupViewController.$inject = ['$scope', '$state', '$ionicPopover', '$ionicHistory', '$translate', 'UIUtils', 'csConfig', 'esGroup', 'csWallet'];\nESGroupEditController.$inject = ['$scope', 'esGroup', 'UIUtils', '$state', '$q', 'Device', '$ionicHistory', 'ModalUtils', '$focus', 'esHttp'];angular.module('cesium.es.group.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.groups', {\n url: \"/group?type&location\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/group/lookup.html\",\n controller: 'ESGroupListCtrl'\n }\n }\n })\n\n .state('app.add_group', {\n url: \"/group/add/:type\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/group/edit_group.html\",\n controller: 'ESGroupEditCtrl'\n }\n }\n })\n\n .state('app.edit_group', {\n url: \"/group/edit/:id\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/group/edit_group.html\",\n controller: 'ESGroupEditCtrl'\n }\n }\n })\n\n\n .state('app.view_group', {\n url: \"/group/view/:id\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/group/view_record.html\",\n controller: 'ESGroupViewCtrl'\n }\n }\n })\n\n ;\n }])\n\n .controller('ESGroupListCtrl', ESGroupListController)\n\n .controller('ESGroupViewCtrl', ESGroupViewController)\n\n .controller('ESGroupEditCtrl', ESGroupEditController)\n\n;\n\nfunction ESGroupListController($scope, UIUtils, $state, csWallet, esGroup, ModalUtils) {\n 'ngInject';\n\n var defaultSearchLimit = 40;\n\n $scope.search = {\n loading : true,\n results: null,\n type: 'last',\n hasMore : false,\n loadingMore : false,\n limit: defaultSearchLimit\n };\n $scope.enableFilter = !UIUtils.screen.isSmall();\n $scope.ionItemClass = 'item-border-large';\n\n $scope.$on('$ionicView.enter', function() {\n if ($scope.search.loading) {\n $scope.doSearch();\n }\n });\n\n $scope.doSearchText = function() {\n var text = $scope.search.text && $scope.search.text.trim();\n if (!text || !text.length) {\n return $scope.doSearchLast();\n }\n $scope.search.type='text';\n return $scope.doSearch();\n };\n\n $scope.doSearchLast = function() {\n $scope.search.type = 'last';\n return $scope.doSearch();\n };\n\n $scope.doSearch = function(from, size) {\n var options = {};\n options.from = from || 0;\n options.size = size || defaultSearchLimit;\n\n options.text = $scope.search.type == 'text' && $scope.search.text && $scope.search.text.trim();\n\n $scope.search.loading = true;\n return esGroup.record.search(options)\n .then(function(res) {\n if (!from) {\n $scope.search.results = res || [];\n }\n else if (res){\n $scope.search.results = $scope.search.results.concat(res);\n }\n $scope.search.loading = false;\n $scope.search.hasMore = $scope.search.results.length >= $scope.search.limit;\n $scope.updateView();\n })\n .catch(function(err) {\n $scope.search.loading = false;\n if (!from) {\n $scope.search.results = [];\n }\n $scope.search.hasMore = false;\n UIUtils.onError('GROUP.ERROR.SEARCH_GROUPS_FAILED')(err);\n });\n };\n\n $scope.updateView = function() {\n\n $scope.$broadcast('$$rebind::rebind'); // notify binder\n $scope.motion.show({selector: '.list.{0} .item'.format($scope.motion.ionListClass)});\n };\n\n $scope.select = function(item) {\n if (item && item.id) $state.go('app.view_group', {id: item.id});\n };\n\n $scope.showMore = function() {\n $scope.search.limit = $scope.search.limit || defaultSearchLimit;\n $scope.search.limit += defaultSearchLimit;\n if ($scope.search.limit < defaultSearchLimit) {\n $scope.search.limit = defaultSearchLimit;\n }\n $scope.search.loadingMore = true;\n $scope.load(\n $scope.search.results.length, // from\n $scope.search.limit)\n .then(function() {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n $scope.resetData = function() {\n if ($scope.search.loading) return;\n console.debug(\"[ES] [group] Resetting data (settings or account may have changed)\");\n $scope.search.hasMore = false;\n $scope.search.results = [];\n $scope.search.loading = true;\n delete $scope.search.limit;\n };\n // When logout: force reload\n csWallet.api.data.on.logout($scope, $scope.resetData);\n\n /* -- modals and views -- */\n\n $scope.showNewRecordModal = function() {\n $scope.loadWallet({minData: true})\n .then(function(walletData) {\n UIUtils.loading.hide();\n $scope.walletData = walletData;\n ModalUtils.show('plugins/es/templates/group/modal_record_type.html')\n .then(function(type){\n if (type) {\n $state.go('app.add_group', {type: type});\n }\n });\n });\n };\n}\n\n\nfunction ESGroupViewController($scope, $state, $ionicPopover, $ionicHistory, $translate,\n UIUtils, csConfig, esGroup, csWallet) {\n 'ngInject';\n\n $scope.formData = {};\n $scope.id = null;\n $scope.pictures = [];\n $scope.canEdit = false;\n $scope.loading = true;\n $scope.motion = UIUtils.motion.fadeSlideIn;\n\n $scope.$on('$ionicView.enter', function(e, state) {\n if (state.stateParams && state.stateParams.id) { // Load by id\n if ($scope.loading || state.stateParams.refresh) { // prevent reload if same id (if not forced)\n $scope.load(state.stateParams.id, state.stateParams.anchor);\n }\n UIUtils.loading.hide();\n $scope.$broadcast('$recordView.enter', state);\n }\n else {\n $state.go('app.groups');\n }\n });\n\n $scope.load = function(id) {\n esGroup.record.load(id, {\n fetchPictures: true\n })\n .then(function (data) {\n $scope.id = data.id;\n $scope.formData = data.record;\n $scope.issuer= data.issuer;\n $scope.canEdit = csWallet.isUserPubkey($scope.formData.issuer) || csWallet.children.hasPubkey($scope.formData.issuer);\n\n $scope.pictures = data.record.pictures || [];\n delete data.record.pictures; // remove, as already stored in $scope.pictures\n\n // Load other data (from child controller)\n $scope.$broadcast('$recordView.load', id, esGroup.record.comment);\n\n $scope.loading = false;\n UIUtils.loading.hide();\n $scope.updateView();\n\n })\n .catch(UIUtils.onError('GROUP.ERROR.LOAD_RECORD_FAILED'));\n };\n\n $scope.updateView = function() {\n $scope.motion.show();\n };\n\n // Edit click\n $scope.edit = function() {\n UIUtils.loading.show();\n $state.go('app.edit_group', {id: $scope.id});\n };\n\n $scope.delete = function() {\n $scope.hideActionsPopover();\n\n // translate\n var translations;\n $translate(['GROUP.VIEW.REMOVE_CONFIRMATION', 'GROUP.INFO.RECORD_REMOVED'])\n .then(function(res) {\n translations = res;\n return UIUtils.alert.confirm(res['GROUP.VIEW.REMOVE_CONFIRMATION']);\n })\n .then(function(confirm) {\n if (confirm) {\n esGroup.record.remove($scope.id)\n .then(function () {\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n $state.go('app.groups');\n UIUtils.toast.show(translations['GROUP.INFO.RECORD_REMOVED']);\n })\n .catch(UIUtils.onError('GROUP.ERROR.REMOVE_RECORD_FAILED'));\n }\n });\n };\n\n /* -- modals & popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/group/view_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n $scope.showSharePopover = function(event) {\n $scope.hideActionsPopover();\n\n var title = $scope.formData.title;\n // Use shareBasePath (fix #530) or rootPath (fix #390)\n var url = (csConfig.shareBaseUrl || $rootScope.rootPath) + $state.href('app.view_group', {id: $scope.id});\n // Override default position, is small screen - fix #545\n if (UIUtils.screen.isSmall()) {\n event = angular.element(document.querySelector('#group-share-anchor-'+$scope.id)) || event;\n }\n UIUtils.popover.share(event, {\n bindings: {\n url: url,\n titleKey: 'GROUP.VIEW.POPOVER_SHARE_TITLE',\n titleValues: {title: title},\n time: $scope.formData.time,\n postMessage: title\n }\n });\n };\n}\n\nfunction ESGroupEditController($scope, esGroup, UIUtils, $state, $q, Device,\n $ionicHistory, ModalUtils, $focus, esHttp) {\n 'ngInject';\n\n $scope.walletData = {};\n $scope.formData = {};\n $scope.id = null;\n $scope.pictures = [];\n $scope.loading = true;\n\n $scope.setForm = function(form) {\n $scope.form = form;\n };\n\n $scope.$on('$ionicView.enter', function(e, state) {\n $scope.loadWallet({minData: true})\n .then(function(walletData) {\n $scope.walletData = walletData;\n if (state.stateParams && state.stateParams.id) { // Load by id\n $scope.load(state.stateParams.id);\n }\n else {\n if (state.stateParams && state.stateParams.type) {\n $scope.formData.type=state.stateParams.type;\n }\n $scope.loading = false;\n UIUtils.loading.hide();\n $scope.updateView();\n }\n // removeIf(device)\n $focus('group-record-title');\n // endRemoveIf(device)\n });\n });\n\n $scope.load = function(id) {\n esGroup.record.load(id, {\n fetchPictures: true,\n html: false\n })\n .then(function (data) {\n $scope.formData = data.record;\n $scope.issuer= data.issuer;\n $scope.id= data.id;\n\n $scope.pictures = data.record.pictures || [];\n delete data.record.pictures; // remove, as already stored in $scope.pictures\n\n $scope.loading = false;\n UIUtils.loading.hide();\n $scope.updateView();\n\n })\n .catch(UIUtils.onError('GROUP.ERROR.LOAD_RECORD_FAILED'));\n };\n\n $scope.updateView = function() {\n $scope.motion.show({selector: '.list.{0} .item, .card-gallery'.format($scope.motion.ionListClass)});\n };\n\n $scope.save = function() {\n $scope.form.$submitted=true;\n if($scope.saving || // avoid multiple save\n !$scope.form.$valid ||\n ($scope.formData.type !== 'managed' && $scope.formData.type !== 'open')) {\n return;\n }\n $scope.saving = true;\n return UIUtils.loading.show()\n\n .then(function(){\n var json = $scope.formData;\n json.time = moment().utc().unix();\n\n // Resize pictures\n json.picturesCount = $scope.pictures.length;\n if (json.picturesCount > 0) {\n json.pictures = $scope.pictures.reduce(function(res, pic) {\n return res.concat({file: esHttp.image.toAttachment(pic)});\n }, []);\n return UIUtils.image.resizeSrc($scope.pictures[0].src, true) // resize avatar\n .then(function(imageSrc) {\n json.avatar = esHttp.image.toAttachment({src: imageSrc});\n return json;\n });\n }\n else {\n if (json.avatar) {\n // FIXME: this is a workaround to allow content deletion\n // Is it a bug in the ES attachment-mapper ?\n json.avatar = {\n _content: '',\n _content_type: ''\n };\n }\n json.pictures = [];\n return json;\n }\n })\n .then(function(json){\n // Create\n if (!$scope.id) {\n json.creationTime = moment().utc().unix();\n return esGroup.record.add(json);\n }\n // Update\n return esGroup.record.update(json, {id: $scope.id});\n })\n\n .then(function(id) {\n $scope.id = $scope.id || id;\n $scope.saving = false;\n $ionicHistory.clearCache($ionicHistory.currentView().stateId); // clear current view\n $ionicHistory.nextViewOptions({historyRoot: true});\n return $state.go('app.view_group', {id: $scope.id, refresh: true});\n })\n\n .catch(function(err) {\n $scope.saving = false;\n UIUtils.onError('GROUP.ERROR.SAVE_RECORD_FAILED')(err);\n });\n };\n\n $scope.openPicturePopup = function() {\n Device.camera.getPicture()\n .then(function(imageData) {\n $scope.pictures.push({src: \"data:image/png;base64,\" + imageData});\n })\n .catch(UIUtils.onError('ERROR.TAKE_PICTURE_FAILED'));\n };\n\n $scope.fileChanged = function(event) {\n UIUtils.loading.show();\n return $q(function(resolve, reject) {\n var file = event.target.files[0];\n UIUtils.image.resizeFile(file)\n .then(function(imageData) {\n $scope.pictures.push({src: imageData});\n UIUtils.loading.hide();\n resolve();\n });\n });\n };\n\n $scope.removePicture = function(index){\n $scope.pictures.splice(index, 1);\n };\n\n $scope.favoritePicture = function(index){\n if (index > 0) {\n var item = $scope.pictures[index];\n $scope.pictures.splice(index, 1);\n $scope.pictures.splice(0, 0, item);\n }\n };\n\n $scope.cancel = function() {\n $ionicHistory.goBack();\n };\n\n /* -- modals -- */\n $scope.showRecordTypeModal = function() {\n ModalUtils.show('plugins/es/templates/group/modal_record_type.html')\n .then(function(type){\n if (type) {\n $scope.formData.type = type;\n }\n });\n };\n\n}\n","\nInvitationsController.$inject = ['$scope', '$q', '$ionicPopover', '$state', '$timeout', 'UIUtils', 'csWallet', 'esHttp', 'esModals', 'esNotification', 'esInvitation'];\nPopoverInvitationController.$inject = ['$scope', '$controller', 'csWallet'];\nNewInvitationModalController.$inject = ['$scope', '$q', 'Modals', 'UIUtils', 'csWallet', 'esHttp', 'esWallet', 'esInvitation', 'parameters'];angular.module('cesium.es.invitation.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.view_invitations', {\n url: \"/invitations?id\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/invitation/view_invitations.html\",\n controller: 'InvitationsCtrl'\n }\n },\n data: {\n auth: true\n }\n })\n\n .state('app.view_invitations_by_id', {\n url: \"/wallets/:id/invitations\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/invitation/view_invitations.html\",\n controller: 'InvitationsCtrl'\n }\n },\n data: {\n login: true\n }\n })\n ;\n }])\n\n .controller('InvitationsCtrl', InvitationsController)\n\n .controller('PopoverInvitationCtrl', PopoverInvitationController)\n\n .controller('ESNewInvitationModalCtrl', NewInvitationModalController)\n;\n\nfunction InvitationsController($scope, $q, $ionicPopover, $state, $timeout, UIUtils, csWallet,\n esHttp, esModals, esNotification, esInvitation) {\n 'ngInject';\n\n var defaultSearchLimit = esInvitation.constants.DEFAULT_LOAD_SIZE;\n\n $scope.search = {\n loading : true,\n results: null,\n hasMore : false,\n loadingMore : false,\n limit: defaultSearchLimit,\n options: {\n codes: {\n includes: esNotification.constants.INVITATION_CODES\n }\n }\n };\n\n var wallet;\n\n $scope.setWallet = function(aWallet) {\n wallet = aWallet;\n };\n\n $scope.$on('$ionicView.enter', function(e, state) {\n if ($scope.search.loading) {\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n $scope.loadWallet({\n wallet: wallet,\n minData: true\n })\n .then(function() {\n\n $scope.addListeners();\n\n if (esHttp.isAlive()) {\n $scope.load();\n\n // Reset unread counter\n $scope.resetUnreadCount();\n\n $scope.showFab('fab-new-invitation');\n }\n });\n }\n });\n\n $scope.load = function(from, size) {\n var options = angular.copy($scope.search.options);\n options.from = options.from || from || 0;\n options.size = options.size || size || defaultSearchLimit;\n\n // Make sure wallet is init (need by PopoverInvitationCtrl)\n wallet = wallet || csWallet;\n\n return esInvitation.load(options, wallet.data.keypair)\n .then(function(invitations) {\n $scope.search.results = invitations;\n $scope.search.loading = false;\n $scope.search.hasMore = ($scope.search.results && $scope.search.results.length >= $scope.search.limit);\n $scope.updateView();\n UIUtils.loading.hide();\n })\n .catch(function(err) {\n if (err === 'CANCELLED') return $scope.cancel();\n $scope.search.loading = false;\n if (!from) {\n $scope.search.results = [];\n }\n $scope.search.hasMore = false;\n UIUtils.onError('INVITATION.ERROR.LOAD_INVITATIONS_FAILED')(err);\n });\n };\n\n $scope.cancel = function() {\n\n };\n\n $scope.updateView = function() {\n if ($scope.motion && $scope.search.results && $scope.search.results.length) {\n $scope.motion.show({selector: '.view-invitation .item'});\n }\n };\n $scope.$watchCollection('search.results', $scope.updateView);\n\n $scope.showMore = function() {\n $scope.search.limit = $scope.search.limit || defaultSearchLimit;\n $scope.search.limit = $scope.search.limit * 2;\n if ($scope.search.limit < defaultSearchLimit) {\n $scope.search.limit = defaultSearchLimit;\n }\n $scope.search.loadingMore = true;\n $scope.load(\n $scope.search.results.length, // from\n $scope.search.limit)\n .then(function() {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n $scope.onNewInvitation = function(invitation) {\n if ($scope.search.loading || $scope.search.loadingMore) return;\n\n // Insert the new invitation (ONLY if not already done by service. May occur when using same array instance)\n if (!$scope.search.results[0] || $scope.search.results[0] !== invitation) {\n $scope.search.results.splice(0,0,invitation);\n }\n };\n\n $scope.resetData = function() {\n if ($scope.search.loading) return;\n console.debug(\"[ES] [invitation] Resetting data (settings or account may have changed)\");\n $scope.search.hasMore = false;\n $scope.search.results = [];\n $scope.search.loading = true;\n delete $scope.search.limit;\n };\n\n $scope.resetUnreadCount = function() {\n if ($scope.search.loading || !wallet.data.invitations) {\n return $timeout($scope.resetUnreadCount, 2000);\n }\n if (!wallet.data.invitations.unreadCount) return;\n console.debug('[ES] [invitation] Resetting unread count');\n wallet.data.invitations.unreadCount = 0;\n if (!$scope.search.results || !$scope.search.results.length) return;\n var lastNotification = $scope.search.results[0];\n var readTime = lastNotification.time ? lastNotification.time : 0;\n if (readTime && (!wallet.data.invitations.readTime || wallet.data.invitations.readTime != readTime)) {\n wallet.data.invitations.readTime = readTime;\n wallet.storeData();\n }\n };\n\n $scope.deleteAll = function(confirm) {\n $scope.hideActionsPopover();\n if (!$scope.search.results.length) return;\n\n if (!confirm) {\n return UIUtils.alert.confirm('INVITATION.CONFIRM.DELETE_ALL_CONFIRMATION')\n .then(function(confirm) {\n if (confirm) return $scope.deleteAll(confirm); // recursive call\n });\n }\n\n return $q.all([\n UIUtils.loading.show(),\n esInvitation.deleteAll(wallet.data.pubkey)\n ])\n .then(function() {\n $scope.search.results.splice(0, $scope.search.results.length); // update list\n return UIUtils.loading.hide();\n })\n .catch(UIUtils.onError('INVITATION.ERROR.REMOVE_ALL_INVITATIONS_FAILED'));\n };\n\n $scope.delete = function(index) {\n var invitation = $scope.search.results[index];\n if (!invitation) return;\n\n return esInvitation.delete(invitation)\n .then(function() {\n // Remove from list (ONLY if not already done by service. May occur when using same array instance)\n if ($scope.search.results[index] && $scope.search.results[index] === invitation) {\n $scope.search.results.splice(index,1);\n }\n })\n .catch(UIUtils.onError('INVITATION.ERROR.REMOVE_INVITATION_FAILED'));\n };\n\n $scope.accept = function(invitation) {\n $scope.hideActionsPopover(); // need when PopoverInvitationController\n\n if (invitation.state) {\n $state.go(invitation.state, invitation.stateParams || {});\n }\n };\n\n /* -- Modal -- */\n\n $scope.showNewInvitationModal = function() {\n $scope.hideActionsPopover();\n\n return $timeout(function() {\n return esModals.showNewInvitation({});\n }, 500); // Timeout need, to avoid freeze\n };\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/invitation/popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n\n // Listeners\n $scope.addListeners = function() {\n if (!wallet) throw \"Controller wallet not set !\";\n\n $scope.listeners = [\n esHttp.api.node.on.stop($scope, $scope.resetData),\n esHttp.api.node.on.start($scope, $scope.load),\n wallet.api.data.on.logout($scope, $scope.resetData)\n ];\n\n if (wallet.isDefault()) {\n // Subscribe to new invitation\n $scope.listeners.push(\n esInvitation.api.data.on.new($scope, $scope.onNewInvitation)\n );\n }\n };\n}\n\nfunction PopoverInvitationController($scope, $controller, csWallet) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('InvitationsCtrl', {$scope: $scope}));\n\n // Disable list effects\n $scope.motion = null;\n\n // Set the wallet to use\n $scope.setWallet(csWallet);\n\n $scope.$on('popover.shown', function() {\n if ($scope.search.loading) {\n $scope.addListeners();\n $scope.load();\n }\n });\n\n $scope.updateView = function() {\n // no animation\n };\n\n $scope.$on('popover.hidden', $scope.resetUnreadCount);\n\n $scope.hideActionsPopover = function() {\n $scope.closePopover();\n };\n\n $scope.cancel = function() {\n $scope.closePopover();\n };\n}\n\n\nfunction NewInvitationModalController($scope, $q, Modals, UIUtils, csWallet, esHttp, esWallet, esInvitation, parameters) {\n 'ngInject';\n\n // Controller var\n var wallet;\n\n // Scope var\n $scope.recipients = [];\n $scope.suggestions = [];\n $scope.formData = {\n useComment: false,\n walletId: null\n };\n $scope.enableSelectWallet = true;\n\n /* -- scope functions -- */\n\n $scope.setParameters = function(parameters) {\n if (!parameters) return;\n if (!parameters.wallet || parameters.wallet === \"default\") {\n $scope.formData.walletId = csWallet.id;\n }\n else {\n $scope.formData.walletId = parameters.wallet;\n }\n };\n // Read default parameters\n $scope.setParameters(parameters);\n\n $scope.load = function() {\n $scope.enableSelectWallet = csWallet.children.count() > 0;\n\n wallet = $scope.enableSelectWallet && ($scope.formData.walletId ? csWallet.children.get($scope.formData.walletId) : csWallet) || csWallet;\n $scope.formData.walletId = wallet.id; // update the walletId (could have changed)\n if (!wallet.isDefault()) {\n console.debug(\"[transfer] Using {\" + wallet.id + \"} wallet\");\n }\n\n // Make to sure to load full wallet data (balance)\n return wallet.login({sources: true, silent: true})\n .then(function(data) {\n $scope.walletData = data;\n UIUtils.ink({selector: '.modal-invitation .ink'});\n\n if (!$scope.destPub || $scope.destUid) {\n $scope.loading = false;\n }\n else {\n // Fill the uid from the pubkey\n return csWot.extend({pubkey: $scope.destPub})\n .then(function(res) {\n $scope.destUid = res && (res.name || res.uid);\n if ($scope.destUid) {\n $scope.destPub = '';\n }\n $scope.loading = false;\n });\n }\n })\n .catch(function(err){\n if (err === 'CANCELLED') return $scope.cancel(); // close the modal\n UIUtils.onError('ERROR.LOGIN_FAILED')(err);\n });\n };\n $scope.$on('modal.shown', $scope.load);\n\n // When changing use comment\n $scope.onUseCommentChanged = function() {\n if (!$scope.formData.useComment) {\n $scope.formData.comment = null; // reset comment only when disable\n }\n };\n $scope.$watch('formData.useComment', $scope.onUseCommentChanged, true);\n\n\n $scope.removeRecipient= function(index, e) {\n $scope.recipients.splice(index, 1);\n e.preventDefault();\n };\n\n $scope.removeSuggestion = function(index, e) {\n $scope.suggestions.splice(index, 1);\n e.preventDefault();\n };\n\n $scope.cancel = function() {\n $scope.closeModal();\n };\n\n $scope.doSend = function() {\n $scope.form.$submitted=true;\n if(!$scope.form.$valid || !$scope.recipients.length || !$scope.suggestions.length) {\n return;\n }\n\n if (!wallet.isLogin()) return $scope.closeModal(); // should never happen\n\n // Make sure user is still authenticated\n return wallet.auth({silent: true})\n .then(function() {\n return $q.all([\n // Get keypair only once (if not done here, esInvitation.send() with compute it many times)\n esWallet.box.getKeypair(wallet.data.keypair),\n // Ask confirmation\n UIUtils.alert.confirm('INVITATION.CONFIRM.SEND_INVITATIONS_TO_CERTIFY', undefined, {okText: 'COMMON.BTN_SEND'})\n ]);\n })\n .then(function(res) {\n var keypair = res && res[0];\n var confirm = res && res[1];\n if (!keypair || !confirm) return;\n UIUtils.loading.show();\n var time = moment().utc().unix(); // use same date for each invitation\n var comment = $scope.formData.useComment && $scope.formData.comment && $scope.formData.comment.trim();\n return $q.all(\n $scope.recipients.reduce(function (res, recipient) {\n return res.concat($scope.suggestions.reduce(function (res, identity) {\n if (!identity.uid || !identity.pubkey) {\n console.error('Unable to send suggestion for this identity (no uid or pubkey)', identity);\n return res;\n }\n var invitation = {\n issuer: wallet.data.pubkey,\n recipient: recipient.pubkey,\n time: time,\n content: [identity.uid, identity.pubkey].join('-'),\n comment: comment\n };\n return res.concat(\n esInvitation.send(invitation, {\n wallet: wallet,\n type: 'certification'\n }));\n }, []));\n }, []))\n .then(function() {\n $scope.closeModal();\n return UIUtils.loading.hide();\n })\n .then(function() {\n UIUtils.toast.show('INVITATION.INFO.INVITATION_SENT');\n })\n .catch(UIUtils.onError('INVITATION.ERROR.SUGGEST_CERTIFICATIONS_FAILED'));\n });\n };\n\n /* -- Modals -- */\n\n $scope.showSelectRecipientModal = function(e) {\n if (e.isDefaultPrevented()) return;\n\n return Modals.showWotLookup({\n allowMultiple: true,\n enableFilter: true,\n title: 'INVITATION.NEW.RECIPIENTS_MODAL_TITLE',\n help: 'INVITATION.NEW.RECIPIENTS_MODAL_HELP',\n okText: 'COMMON.BTN_OK',\n okType: 'button-positive',\n selection: angular.copy($scope.recipients)\n })\n .then(function(res) {\n if (!res) return; // user cancel\n $scope.recipients = res;\n });\n\n };\n\n $scope.showSelectSuggestionModal = function(e) {\n if (e.isDefaultPrevented()) return;\n\n return Modals.showWotLookup({\n allowMultiple: true,\n enableFilter: true,\n title: 'INVITATION.NEW.SUGGESTION_IDENTITIES_MODAL_TITLE',\n help: 'INVITATION.NEW.SUGGESTION_IDENTITIES_MODAL_HELP',\n okText: 'COMMON.BTN_OK',\n okType: 'button-positive',\n selection: angular.copy($scope.suggestions)\n })\n .then(function(res) {\n if (!res) return; // user cancel\n $scope.suggestions = res;\n });\n };\n\n\n $scope.showSelectWalletModal = function() {\n if (!$scope.enableSelectWallet) return;\n\n return Modals.showSelectWallet()\n .then(function(wallet) {\n if (!wallet || $scope.formData.walletId === wallet.id) return;\n console.debug(\"[transfer] Using {\" + wallet.id + \"} wallet\");\n $scope.wallet = wallet;\n $scope.walletData = wallet.data;\n $scope.formData.walletId = wallet.id;\n $scope.onAmountChanged();\n });\n };\n}\n\n","\nViewSubscriptionsController.$inject = ['$scope', '$q', '$ionicHistory', 'csWot', 'csWallet', 'UIUtils', 'ModalUtils', 'esSubscription'];\nModalEmailSubscriptionsController.$inject = ['$scope', 'Modals', 'csSettings', 'esHttp', 'csWot', 'esModals', 'parameters'];angular.module('cesium.es.subscription.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n\n $stateProvider\n .state('app.edit_subscriptions', {\n cache: false,\n url: \"/wallet/subscriptions\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/subscription/edit_subscriptions.html\",\n controller: 'ViewSubscriptionsCtrl'\n }\n },\n data: {\n auth: true,\n minData: true\n }\n })\n\n .state('app.edit_subscriptions_by_id', {\n cache: false,\n url: \"/wallets/:id/subscriptions\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/subscription/edit_subscriptions.html\",\n controller: 'ViewSubscriptionsCtrl'\n }\n },\n data: {\n login: true,\n minData: true\n }\n });\n\n }])\n\n .controller('ViewSubscriptionsCtrl', ViewSubscriptionsController)\n\n .controller('ModalEmailSubscriptionsCtrl', ModalEmailSubscriptionsController)\n\n;\n\nfunction ViewSubscriptionsController($scope, $q, $ionicHistory, csWot, csWallet, UIUtils, ModalUtils, esSubscription) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.popupData = {}; // need for the node popup\n $scope.search = {\n results: [],\n loading: true\n };\n $scope.emailFrequencies = [\n {id: \"daily\", label: \"daily\"},\n {id: \"weekly\", label: \"weekly\"}\n ];\n\n var wallet;\n\n $scope.enter = function(e, state) {\n\n // First load\n if ($scope.loading) {\n\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n wallet.auth({minData: true})\n .then(function() {\n UIUtils.loading.hide();\n return $scope.load();\n })\n .then(function() {\n $scope.showFab('fab-add-subscription-record');\n })\n .catch(function(err){\n if (err === 'CANCELLED') {\n UIUtils.loading.hide(10);\n $scope.loading=true; // reset for force reload next time\n $ionicHistory.goBack();\n return;\n }\n UIUtils.onError('SUBSCRIPTION.ERROR.LOAD_SUBSCRIPTIONS_FAILED')(err);\n });\n }\n\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.load = function() {\n $scope.loading = true; // to avoid the call of doSave()\n return esSubscription.record.load(wallet.data.pubkey, wallet.data.keypair)\n .then(function(results) {\n // Group by type\n var groups = _.groupBy((results || []), function (record) {\n return [record.type, record.recipient].join('|');\n });\n return _.keys(groups).reduce(function (res, key) {\n var parts = key.split('|');\n return res.concat({\n type: parts[0],\n recipient: parts[1],\n items: groups[key]\n });\n }, []);\n })\n .then(function(results) {\n return csWot.extendAll(results, 'recipient');\n })\n // Display result\n .then($scope.updateView)\n .catch(function(err){\n UIUtils.loading.hide(10);\n if (err && err.ucode == 404) {\n $scope.updateView([]);\n $scope.existing = false;\n }\n else {\n UIUtils.onError('PROFILE.ERROR.LOAD_PROFILE_FAILED')(err);\n }\n });\n };\n\n $scope.updateView = function(results) {\n if (results) {\n $scope.search.results = results;\n }\n\n if ($scope.search.results && $scope.search.results.length) {\n $scope.motion.show();\n }\n $scope.search.loading = false;\n };\n\n $scope.addSubscription = function() {\n var type;\n $scope.showCategoryModal()\n .then(function(cat) {\n if (!cat) return;\n type = cat.id;\n // get subscription parameters\n if (type === 'email') {\n return $scope.showEmailModal();\n }\n else {\n UIUtils.alert.notImplemented();\n }\n })\n .then(function(record) {\n if (!record) return;\n UIUtils.loading.show();\n esSubscription.record.add(record, {wallet: wallet})\n .then($scope.addToUI)\n .then(function() {\n wallet.data.subscriptions = wallet.data.subscriptions || {count: 0};\n wallet.data.subscriptions.count++;\n UIUtils.loading.hide();\n $scope.updateView();\n })\n .catch(UIUtils.onError('SUBSCRIPTION.ERROR.ADD_SUBSCRIPTION_FAILED'));\n });\n };\n\n $scope.editSubscription = function(record) {\n\n // get subscription parameters\n var promise;\n var oldRecord = angular.copy(record);\n if (record.type === 'email') {\n promise = $scope.showEmailModal(record);\n }\n if (!promise) return;\n return promise\n .then(function(res) {\n if (!res) return;\n UIUtils.loading.show();\n record.id = oldRecord.id;\n return esSubscription.record.update(record, wallet)\n .then(function() {\n // If recipient change, update in results\n if (oldRecord.type !== record.type ||\n oldRecord.recipient !== record.recipient) {\n $scope.removeFromUI(oldRecord);\n return $scope.addToUI(record);\n }\n })\n .then(function() {\n UIUtils.loading.hide();\n $scope.updateView();\n })\n .catch(UIUtils.onError('SUBSCRIPTION.ERROR.UPDATE_SUBSCRIPTION_FAILED'));\n });\n };\n\n $scope.deleteSubscription = function(record, confirm) {\n if (!record || !record.id) return;\n\n if (!confirm) {\n return UIUtils.alert.confirm('SUBSCRIPTION.CONFIRM.DELETE_SUBSCRIPTION')\n .then(function(confirm) {\n if (confirm) return $scope.deleteSubscription(record, confirm);\n });\n }\n\n UIUtils.loading.show();\n esSubscription.record.remove(record.id, {wallet: wallet})\n .then(function() {\n wallet.data.subscriptions = wallet.data.subscriptions || {count: 1};\n wallet.data.subscriptions.count--;\n $scope.removeFromUI(record);\n UIUtils.loading.hide();\n })\n .catch(UIUtils.onError('SUBSCRIPTION.ERROR.DELETE_SUBSCRIPTION_FAILED'));\n };\n\n $scope.removeFromUI = function(record) {\n var subscriptions = _.findWhere($scope.search.results, {type: record.type, recipient: record.recipient});\n var index = _.findIndex(subscriptions.items, record);\n if (index >= 0) {\n subscriptions.items.splice(index, 1);\n }\n if (!subscriptions.items.length) {\n index = _.findIndex($scope.search.results, subscriptions);\n $scope.search.results.splice(index, 1);\n }\n };\n\n $scope.addToUI = function(record) {\n $scope.search.results = $scope.search.results || [];\n var subscriptions = _.findWhere($scope.search.results,\n {type: record.type, recipient: record.recipient});\n\n if (!subscriptions) {\n subscriptions = {type: record.type, recipient: record.recipient, items: []};\n return csWot.extendAll([subscriptions], 'recipient')\n .then(function(){\n subscriptions.items.push(record);\n $scope.search.results.push(subscriptions);\n return record;\n });\n }\n\n subscriptions.items.push(record);\n return $q.when(record);\n };\n\n /* -- modals -- */\n\n $scope.showCategoryModal = function() {\n // load categories\n return esSubscription.category.all()\n .then(function(categories){\n return ModalUtils.show('plugins/es/templates/common/modal_category.html', 'ESCategoryModalCtrl as ctrl',\n {categories : categories},\n {focusFirstInput: true}\n );\n })\n .then(function(cat){\n if (cat && cat.parent) {\n return cat;\n }\n });\n };\n\n $scope.showEmailModal = function(parameters) {\n return ModalUtils.show('plugins/es/templates/subscription/modal_email.html','ModalEmailSubscriptionsCtrl',\n parameters, {focusFirstInput: true});\n };\n}\n\n\nfunction ModalEmailSubscriptionsController($scope, Modals, csSettings, esHttp, csWot, esModals, parameters) {\n 'ngInject';\n\n $scope.frequencies = [\n {id: \"daily\", label: \"daily\"},\n {id: \"weekly\", label: \"weekly\"}\n ];\n $scope.formData = parameters || {};\n $scope.formData.content = $scope.formData.content || {};\n $scope.formData.content.frequency = $scope.formData.content.frequency || $scope.frequencies[0].id; // set to first value\n $scope.recipient = {};\n\n $scope.$on('modal.shown', function() {\n // Load recipient (uid, name, avatar...)\n if ($scope.formData.recipient) {\n $scope.recipient = {pubkey: $scope.formData.recipient};\n return csWot.extendAll([$scope.recipient]);\n }\n else {\n return esHttp.network.peering.self()\n .then(function(res){\n if (!res) return;\n $scope.formData.recipient = res.pubkey;\n $scope.recipient = {pubkey: $scope.formData.recipient};\n return csWot.extendAll([$scope.recipient]);\n });\n }\n });\n\n // Submit\n $scope.doSubmit = function() {\n $scope.form.$submitted = true;\n if (!$scope.form.$valid || !$scope.formData.content.email || !$scope.formData.content.frequency) return;\n\n var record = {\n type: 'email',\n recipient: $scope.formData.recipient,\n content: {\n email: $scope.formData.content.email,\n locale: csSettings.data.locale.id,\n frequency: $scope.formData.content.frequency\n }\n };\n $scope.closeModal(record);\n };\n\n $scope.cancel = function() {\n $scope.closeModal();\n };\n\n if (!!$scope.subscriptionForm) {\n $scope.subscriptionForm.$setPristine();\n }\n\n $scope.showNetworkLookup = function() {\n return esModals.showNetworkLookup({\n enableFilter: true,\n endpointFilter: esHttp.constants.ES_SUBSCRIPTION_API\n })\n .then(function (peer) {\n if (peer) {\n $scope.recipient = peer;\n $scope.formData.recipient = peer.pubkey;\n }\n });\n\n };\n}\n","\nESDocumentLookupController.$inject = ['$scope', '$ionicPopover', '$location', '$timeout', 'csSettings', 'csWallet', 'UIUtils', 'esHttp', 'esDocument'];\nESLastDocumentsController.$inject = ['$scope', '$controller', '$timeout', '$state', '$filter'];angular.module('cesium.es.document.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.document_search', {\n url: \"/data/search/:index/:type?q\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/document/lookup.html\",\n controller: 'ESDocumentLookupCtrl'\n }\n },\n data: {\n silentLocationChange: true\n }\n })\n ;\n }])\n\n .controller('ESDocumentLookupCtrl', ESDocumentLookupController)\n\n .controller('ESLastDocumentsCtrl', ESLastDocumentsController)\n;\n\nfunction ESDocumentLookupController($scope, $ionicPopover, $location, $timeout,\n csSettings, csWallet, UIUtils, esHttp, esDocument) {\n 'ngInject';\n\n $scope.search = $scope.search || {\n loading: true,\n hasMore: false,\n text: undefined,\n index: 'invitation',\n type: 'certification',\n results: [],\n sort: 'time',\n asc: false,\n loadingMore: false\n };\n $scope.entered = false;\n $scope.searchTextId = 'documentSearchText';\n $scope.ionItemClass = 'item-border-large';\n $scope.defaultSizeLimit = $scope.defaultSizeLimit || (UIUtils.screen.isSmall() ? 50 : 100);\n $scope.helptipPrefix = 'helptip-document';\n $scope.compactMode = angular.isDefined($scope.compactMode) ? $scope.compactMode : true;\n $scope._source = $scope._source || [\"issuer\", \"hash\", \"time\", \"creationTime\", \"title\", \"message\"];\n $scope.showHeaders = angular.isDefined($scope.showHeaders) ? $scope.showHeaders : true;\n\n /**\n * Enter into the view\n * @param e\n * @param state\n */\n $scope.enter = function(e, state) {\n if (!$scope.entered) {\n $scope.entered = true;\n $scope.search.index = state.stateParams && state.stateParams.index || $scope.search.index;\n $scope.search.type = state.stateParams && state.stateParams.type || $scope.search.type;\n $scope.search.text = state.stateParams && state.stateParams.q || $scope.search.text;\n $scope.search.last = !$scope.search.text;\n $scope.load();\n }\n $scope.expertMode = angular.isDefined($scope.expertMode) ? $scope.expertMode : !UIUtils.screen.isSmall() && csSettings.data.expertMode;\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.computeOptions = function(offset, size) {\n var options = {\n index: $scope.search.index,\n type: $scope.search.type,\n from: offset || 0,\n size: size || $scope.defaultSizeLimit\n };\n\n // add sort\n if ($scope.search.sort) {\n options.sort = {};\n options.sort[$scope.search.sort] = (!$scope.search.asc ? \"desc\" : \"asc\");\n }\n else { // default sort\n options.sort = {time:'desc'};\n }\n\n // Included fields\n options._source = options._source || $scope._source;\n\n return options;\n };\n\n $scope.load = function(offset, size, silent) {\n if ($scope.search.error) return;\n\n var options = $scope.computeOptions(offset, size);\n\n $scope.search.loading = !silent;\n\n var searchFn = $scope.search.last ?\n esDocument.search(options) :\n esDocument.searchText($scope.search.text||'', options);\n return searchFn\n .then(function(res) {\n if (!offset) {\n $scope.search.results = res.hits;\n $scope.search.took = res.took;\n }\n else {\n $scope.search.results = $scope.search.results.concat(res.hits);\n }\n $scope.search.total = res.total;\n\n UIUtils.loading.hide();\n $scope.search.loading = false;\n $scope.search.hasMore = res.hits && res.hits.length > 0 && res.total > $scope.search.results.length;\n\n $scope.updateView();\n })\n .catch(function(err) {\n $scope.search.results = [];\n $scope.search.loading = false;\n $scope.search.error = true;\n $scope.search.hasMore = false;\n UIUtils.onError('DOCUMENT.ERROR.LOAD_DOCUMENTS_FAILED')(err)\n .then(function() {\n $scope.search.error = false;\n });\n });\n };\n\n $scope.updateView = function() {\n if ($scope.motion && $scope.search.results && $scope.search.results.length) {\n $scope.motion.show({selector: '.list .item.item-document'});\n }\n $scope.$broadcast('$$rebind::rebind'); // notify binder\n };\n\n $scope.doSearchText = function() {\n $scope.search.last = $scope.search.text ? false : true;\n return $scope.load()\n .then(function() {\n // Update location href\n $location.search({q: $scope.search.text}).replace();\n });\n };\n\n $scope.doSearchLast = function() {\n $scope.search.last = true;\n $scope.search.text = undefined;\n return $scope.load();\n };\n\n $scope.removeAll = function() {\n $scope.hideActionsPopover();\n if (!$scope.search.results || !$scope.search.results.length) return;\n\n return UIUtils.alert.confirm('DOCUMENT.CONFIRM.REMOVE_ALL')\n .then(function(confirm) {\n if (!confirm) return;\n UIUtils.loading.show();\n return esDocument.removeAll($scope.search.results)\n .then(function() {\n $scope.search.loading = false;\n return $timeout(function() {\n UIUtils.toast.show('DOCUMENT.INFO.REMOVED'); // toast\n return $scope.load();\n }, 1000 /*waiting propagation*/);\n })\n .catch(UIUtils.onError('DOCUMENT.ERROR.REMOVE_ALL_FAILED'));\n });\n };\n\n $scope.remove = function($event, index) {\n var doc = $scope.search.results[index];\n if (!doc || $event.defaultPrevented) return;\n $event.stopPropagation();\n\n UIUtils.alert.confirm('DOCUMENT.CONFIRM.REMOVE')\n .then(function(confirm) {\n if (!confirm) return;\n return esDocument.remove(doc)\n .then(function () {\n $scope.search.results.splice(index,1); // remove from messages array\n $scope.$broadcast('$$rebind::rebind'); // notify binder\n UIUtils.toast.show('DOCUMENT.INFO.REMOVED'); // toast\n })\n .catch(UIUtils.onError('MESSAGE.ERROR.REMOVE_FAILED'));\n });\n };\n\n $scope.selectDocument = function(event, doc) {\n console.debug(\"Selected document: \", doc, esHttp);\n\n var url = esHttp.getUrl('/{0}/{1}/_search?pretty&q=_id:{2}'.format(doc.index, doc.type, doc.id));\n return $scope.openLink(event, url);\n };\n\n $scope.toggleCompactMode = function() {\n $scope.compactMode = !$scope.compactMode;\n $scope.updateView();\n\n // Workaround to re-initialized the <ion-infinite-loop>\n if (!$scope.search.hasMore && $scope.search.results.length && $scope.search.type == 'last') {\n $timeout(function() {\n $scope.search.hasMore = true;\n }, 500);\n }\n };\n\n $scope.toggleSort = function(sort){\n if ($scope.search.sort === sort && !$scope.search.asc) {\n $scope.search.asc = undefined;\n $scope.search.sort = undefined;\n }\n else {\n $scope.search.asc = ($scope.search.sort === sort) ? !$scope.search.asc : true;\n $scope.search.sort = sort;\n }\n $scope.load();\n };\n\n $scope.showMore = function() {\n if ($scope.search.loading) return;\n $scope.search.loadingMore = true;\n $scope.load(\n $scope.search.results.length, // from\n $scope.defaultSizeLimit,\n true/*silent*/)\n .then(function() {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n $scope.startListenChanges = function() {\n var now = Date.now();\n var source = $scope.search.index + '/' + $scope.search.type;\n var wsChanges = esHttp.websocket.changes(source);\n return wsChanges.open()\n .then(function(){\n console.debug(\"[ES] [document] Websocket opened in {0} ms\".format(Date.now()- now));\n wsChanges.on(function(change) {\n if (!$scope.search.last || !change) return; // ignore\n esDocument.fromHit(change)\n .then(function(doc) {\n if (change._operation === 'DELETE') {\n $scope.onDeleteDocument(doc);\n }\n else {\n $scope.onNewDocument(doc);\n }\n });\n });\n });\n };\n\n $scope.onNewDocument = function(document) {\n if (!$scope.search.last || $scope.search.loading) return; // skip\n console.debug(\"[ES] [document] Detected new document: \", document);\n var index = _.findIndex($scope.search.results, {id: document.id, index: document.index, type: document.type});\n if (index < 0) {\n $scope.search.total++;\n $scope.search.results.splice(0, 0, document);\n }\n else {\n document.updated = true;\n $timeout(function() {\n document.updated = false;\n }, 2000);\n $scope.search.results.splice(index, 1, document);\n }\n $scope.updateView();\n };\n\n $scope.onDeleteDocument = function(document) {\n if (!$scope.search.last || $scope.search.loading) return; // skip\n $timeout(function() {\n var index = _.findIndex($scope.search.results, {id: document.id, index: document.index, type: document.type});\n if (index < 0) return; // skip if not found\n console.debug(\"[ES] [document] Detected document deletion: \", document);\n $scope.search.results.splice(index, 1);\n $scope.search.total--;\n $scope.updateView();\n }, 750);\n };\n\n /* -- Modals -- */\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/document/lookup_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n /* -- watch events -- */\n\n $scope.resetData = function() {\n if ($scope.search.loading) return;\n console.debug(\"[ES] [document] Resetting data (settings or account may have changed)\");\n // Reset all data\n $scope.search.results = [];\n $scope.search.loading = false;\n $scope.search.total = undefined;\n $scope.search.loadingMore = false;\n $scope.entered = false;\n delete $scope.search.limit;\n };\n\n csWallet.api.data.on.unauth($scope, $scope.resetData);\n\n // for DEV only\n /*$timeout(function() {\n // launch default action fo DEV\n }, 900);\n */\n}\n\n\nfunction ESLastDocumentsController($scope, $controller, $timeout, $state, $filter) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESDocumentLookupCtrl', {$scope: $scope}));\n\n $scope.search = {\n loading: true,\n hasMore: true,\n text: undefined,\n index: 'user,page,group', type: 'profile,record,comment',\n results: undefined,\n sort: 'time',\n asc: false\n };\n $scope.expertMode = false;\n $scope.defaultSizeLimit = 20;\n $scope._source = [\"issuer\", \"hash\", \"time\", \"creationTime\", \"title\", \"avatar._content_type\", \"city\", \"message\", \"record\", \"type\"];\n $scope.showHeaders = false;\n\n $scope.$on('$ionicParentView.enter', $scope.enter);\n\n $scope.selectDocument = function(event, doc) {\n if (!doc || !event || event.defaultPrevented) return;\n event.stopPropagation();\n var anchor;\n if (doc.index === \"user\" && doc.type === \"profile\") {\n $state.go('app.wot_identity', {pubkey: doc.pubkey, uid: doc.name});\n }\n else if (doc.index === \"page\" && doc.type === \"record\") {\n $state.go('app.view_page', {title: doc.title, id: doc.id});\n }\n else if (doc.index === \"page\" && doc.type === \"comment\") {\n anchor = $filter('formatHash')(doc.id);\n $state.go('app.view_page_anchor', {title: doc.title, id: doc.record, anchor: anchor});\n }\n else if (doc.index === \"group\" && doc.type === \"record\") {\n $state.go('app.view_group', {title: doc.title, id: doc.id});\n }\n else if (doc.index === \"group\" && doc.type === \"comment\") {\n anchor = $filter('formatHash')(doc.id);\n $state.go('app.view_group_anchor', {title: doc.title, id: doc.record, anchor: anchor});\n }\n else {\n console.warn(\"Click on this kind of document not implement yet!\", doc);\n }\n };\n\n // Override parent function computeOptions\n var inheritedComputeOptions = $scope.computeOptions;\n $scope.computeOptions = function(offset, size){\n // Cal inherited function\n var options = inheritedComputeOptions(offset, size);\n\n if (!options.sort || options.sort.time) {\n var side = options.sort && options.sort.time || side;\n options.sort = [\n //{'creationTime': side},\n {'time': side}\n ];\n }\n\n options._source = options._source || $scope._source;\n options.getTimeFunction = function(doc) {\n doc.time = doc.creationTime || doc.time;\n return doc.time;\n };\n return options;\n };\n\n // Listen for changes\n $timeout(function() {\n $scope.startListenChanges();\n }, 1000);\n}\n","\nESLikesController.$inject = ['$scope', '$q', '$timeout', '$translate', '$ionicPopup', 'UIUtils', 'Modals', 'csWallet', 'esHttp', 'esLike'];angular.module('cesium.es.like.controllers', ['ngResource', 'cesium.es.services'])\n\n .controller('ESLikesCtrl', ESLikesController)\n;\n\nfunction ESLikesController($scope, $q, $timeout, $translate, $ionicPopup, UIUtils, Modals, csWallet, esHttp, esLike) {\n 'ngInject';\n\n $scope.entered = false;\n $scope.abuseData = {};\n $scope.abuseLevels = [\n {value: 1, label: 'LOW'},\n {value: 2, label: 'LOW'}\n ];\n $scope.staring = false;\n $scope.options = $scope.options || {};\n $scope.options.like = $scope.options.like || {\n kinds: esLike.constants.KINDS,\n index: undefined,\n type: undefined,\n id: undefined\n };\n\n $scope.$on('$recordView.enter', function(e, state) {\n // First enter\n if (!$scope.entered) {\n $scope.entered = false;\n // Nothing to do: main controller will trigger '$recordView.load' event\n }\n // second call (e.g. if cache)\n else if ($scope.id) {\n $scope.loadLikes($scope.id);\n }\n });\n\n $scope.$on('$recordView.load', function(event, id) {\n $scope.id = id || $scope.id;\n if ($scope.id) {\n $scope.loadLikes($scope.id);\n }\n });\n\n // Init Like service\n $scope.initLikes = function() {\n if (!$scope.likeData) {\n throw new Error(\"Missing 'likeData' in scope. Cannot load likes counter\");\n }\n if (!$scope.options.like.service) {\n if (!$scope.options.like.index || !$scope.options.like.type) {\n throw new Error(\"Missing 'options.like.index' or 'options.like.type' in scope. Cannot load likes counter\");\n }\n $scope.options.like.service = esLike.instance($scope.options.like.index, $scope.options.like.type);\n }\n if (!$scope.options.like.kinds) {\n // Get scope's kinds (e.g. defined in the parent scope)\n $scope.options.like.kinds = _.filter(esLike.constants.KINDS, function (kind) {\n var key = kind.toLowerCase() + 's';\n return angular.isDefined($scope.likeData[key]);\n });\n }\n };\n\n $scope.loadLikes = function(id) {\n if (!$scope.likeData || $scope.likeData.loading) return;// Skip\n\n id = id || $scope.likeData.id;\n $scope.initLikes();\n\n var kinds = $scope.options.like.kinds || [];\n if (!kinds.length) return; // skip\n\n $scope.likeData.loading = true;\n var now = Date.now();\n console.debug(\"[ES] Loading counter of {0}... ({1})\".format(id.substring(0,8), kinds));\n\n var issuers = csWallet.isLogin() ? csWallet.pubkeys() : undefined;\n\n return $q.all(_.map(kinds, function(kind) {\n var key = kind.toLowerCase() + 's';\n return $scope.options.like.service.count(id, {issuers: issuers, kind: kind})\n .then(function (res) {\n // Store result to scope\n if ($scope.likeData[key]) {\n angular.merge($scope.likeData[key], res);\n }\n });\n }))\n .then(function () {\n $scope.likeData.id = id;\n console.debug(\"[ES] Loading counter of {0} [OK] in {1}ms\".format(id.substring(0,8), Date.now()-now));\n\n if (_.contains(kinds, 'VIEW') && !$scope.canEdit) {\n $scope.markAsView();\n }\n\n // Publish to parent scope (to be able to use it in action popover's buttons)\n if ($scope.$parent) {\n console.debug(\"[ES] [likes] Adding data and functions to parent scope\");\n $scope.$parent.toggleLike = $scope.toggleLike;\n $scope.$parent.reportAbuse = $scope.reportAbuse;\n }\n\n $scope.likeData.loading = false;\n })\n .catch(function (err) {\n console.error(err && err.message || err);\n $scope.likeData.loading = false;\n });\n };\n\n $scope.toggleLike = function(event, options) {\n $scope.initLikes();\n if (!$scope.likeData.id) throw new Error(\"Missing 'likeData.id' in scope. Cannot apply toggle\");\n\n // Make sure to be auth before continue\n if (!csWallet.isLogin()) {\n return csWallet.auth({minData: true})\n .then(function(data){\n UIUtils.loading.hide();\n if (!data) throw new Error('CANCELLED');\n options.pubkey = options.pubkey || data.pubkey;\n return $scope.toggleLike(event, options); // loop\n });\n }\n\n options = options || {};\n options.kind = options.kind && options.kind.toUpperCase() || 'LIKE';\n var key = options.kind.toLowerCase() + 's';\n\n $scope.likeData[key] = $scope.likeData[key] || {};\n\n // Avoid too many call\n if ($scope.likeData[key].loading === true || $scope.likeData.loading) {\n event.preventDefault();\n return $q.reject();\n }\n\n if (!options.pubkey) {\n if (csWallet.children.count() === 0) {\n options.pubkey = csWallet.data.pubkey;\n }\n // Select the wallet, if many\n else {\n return Modals.showSelectWallet({displayBalance: false})\n .then(function (wallet) {\n if (!wallet) throw new Error('CANCELLED');\n options.pubkey = wallet.data.pubkey;\n return $scope.toggleLike(event, options); // Loop\n });\n }\n }\n\n var wallet = csWallet.getByPubkey(options.pubkey);\n if (!wallet) return;\n\n $scope.likeData[key].loading = true;\n return wallet.auth({minData: true})\n .then(function(walletData) {\n if (!walletData) {\n UIUtils.loading.hide();\n return;\n }\n\n // Check if member account\n if (!walletData.isMember) {\n // TODO: enable this\n //throw {message: \"ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\"};\n }\n\n // Apply like\n options.id = $scope.likeData.id;\n return $scope.options.like.service.toggle($scope.likeData.id, options);\n })\n .then(function(delta) {\n UIUtils.loading.hide();\n if (delta !== 0) {\n $scope.likeData[key].total = ($scope.likeData[key].total || 0) + delta;\n $scope.likeData[key].wasHitByPubkey = $scope.likeData[key].wasHitByPubkey || {};\n $scope.likeData[key].wasHitByPubkey[options.pubkey] = delta > 0;\n $scope.likeData[key].wasHitCount += delta;\n }\n $timeout(function() {\n $scope.likeData[key].loading = false;\n $scope.$broadcast('$$rebind::like'); // notify binder\n }, 1000);\n })\n .catch(function(err) {\n $scope.likeData[key].loading = false;\n if (err === 'CANCELLED') throw 'CANCELLED'; // User cancelled\n console.error(err);\n UIUtils.onError('LIKE.ERROR.FAILED_TOGGLE_LIKE')(err);\n event.preventDefault();\n });\n };\n\n $scope.setAbuseForm = function(form) {\n $scope.abuseForm = form;\n };\n\n $scope.showAbuseCommentPopover = function(event) {\n return $translate(['COMMON.REPORT_ABUSE.TITLE', 'COMMON.REPORT_ABUSE.SUB_TITLE','COMMON.BTN_SEND', 'COMMON.BTN_CANCEL'])\n .then(function(translations) {\n\n UIUtils.loading.hide();\n\n return $ionicPopup.show({\n templateUrl: 'plugins/es/templates/common/popup_report_abuse.html',\n title: translations['COMMON.REPORT_ABUSE.TITLE'],\n subTitle: translations['COMMON.REPORT_ABUSE.SUB_TITLE'],\n cssClass: 'popup-report-abuse',\n scope: $scope,\n buttons: [\n {\n text: translations['COMMON.BTN_CANCEL'],\n type: 'button-stable button-clear gray'\n },\n {\n text: translations['COMMON.BTN_SEND'],\n type: 'button button-positive ink',\n onTap: function(e) {\n $scope.abuseForm.$submitted=true;\n if(!$scope.abuseForm.$valid || !$scope.abuseData.comment) {\n //don't allow the user to close unless he enters a uid\n e.preventDefault();\n } else {\n return $scope.abuseData;\n }\n }\n }\n ]\n });\n })\n .then(function(res) {\n $scope.abuseData = {};\n if (!res || !res.comment) { // user cancel\n UIUtils.loading.hide();\n return undefined;\n }\n return res;\n });\n };\n\n $scope.reportAbuse = function(event, options) {\n\n // Make sure to be auth before continue\n if (!csWallet.isLogin()) {\n return csWallet.auth({minData: true})\n .then(function(data){\n UIUtils.loading.hide();\n if (!data) throw new Error('CANCELLED');\n options.pubkey = options.pubkey || data.pubkey;\n return $scope.reportAbuse(event, options); // loop\n });\n }\n\n if (!$scope.likeData || !$scope.likeData.abuses || $scope.likeData.abuses.wasHitCount) return; // skip\n if ($scope.likeData.abuses.wasHitCount) return; // already report\n\n options = options || {};\n\n if (!options.pubkey) {\n if (csWallet.children.count() === 0) {\n options.pubkey = csWallet.data.pubkey;\n }\n // Select the wallet, if many\n else {\n return Modals.showSelectWallet({displayBalance: false})\n .then(function (wallet) {\n if (!wallet) throw 'CANCELLED';\n options.pubkey = wallet.data.pubkey;\n return $scope.reportAbuse(event, options); // Loop\n });\n }\n }\n\n var wallet = csWallet.getByPubkey(options.pubkey);\n\n // Check if member account\n if (!wallet || !wallet.isMember()) {\n UIUtils.alert.info(\"ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\");\n return;\n }\n\n if (!options.comment) {\n // Ask a comment\n return $scope.showAbuseCommentPopover(event)\n // Loop, with options.comment filled\n .then(function(res) {\n if (!res || !res.comment) return; // Empty comment: skip\n options.comment = res.comment;\n options.level = res.level || (res.delete && 5) || undefined;\n return $scope.reportAbuse(event, options); // Loop, with the comment\n });\n }\n\n // Send abuse report\n options.kind = 'ABUSE';\n return $scope.toggleLike(event, options)\n .then(function() {\n console.log('BEFORE display toast');\n UIUtils.toast.show('COMMON.REPORT_ABUSE.CONFIRM.SENT');\n });\n };\n\n csWallet.api.data.on.reset($scope, function() {\n _.forEach($scope.options.like.kinds||[], function(kind) {\n var key = kind.toLowerCase() + 's';\n if ($scope.likeData[key]) {\n $scope.likeData[key].wasHitByPubkey = {};\n $scope.likeData[key].wasHitCount = 0;\n }\n });\n $scope.$broadcast('$$rebind::like'); // notify binder\n }, this);\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","\nGpCurrencyAbstractController.$inject = ['$scope', '$filter', '$ionicPopover', '$ionicHistory', '$state', 'csSettings', 'csCurrency', 'esHttp', 'UIUtils'];\nangular.module('cesium.graph.common.controllers', ['cesium.services'])\n\n .controller('GpCurrencyAbstractCtrl', GpCurrencyAbstractController)\n;\n\nfunction GpCurrencyAbstractController($scope, $filter, $ionicPopover, $ionicHistory, $state, csSettings, csCurrency, esHttp, UIUtils) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.formData = $scope.formData || {\n useRelative: csSettings.data.useRelative,\n timePct: 100,\n rangeDuration: 'day',\n firstBlockTime: 0,\n scale: 'linear',\n hide: [],\n beginAtZero: true\n };\n $scope.formData.useRelative = false; /*angular.isDefined($scope.formData.useRelative) ?\n $scope.formData.useRelative : csSettings.data.useRelative;*/\n $scope.scale = 'linear';\n $scope.height = undefined;\n $scope.width = undefined;\n $scope.maintainAspectRatio = true;\n $scope.times = [];\n\n function _truncDate(time) {\n return moment.unix(time).utc().startOf($scope.formData.rangeDuration).unix();\n }\n\n $scope.enter = function (e, state) {\n if ($scope.loading) {\n\n if (state && state.stateParams) {\n // remember state, to be able to refresh location\n $scope.stateName = state && state.stateName;\n $scope.stateParams = angular.copy(state && state.stateParams||{});\n\n if (!$scope.formData.currency && state && state.stateParams && state.stateParams.currency) { // Currency parameter\n $scope.formData.currency = state.stateParams.currency;\n }\n if (state.stateParams.t) {\n $scope.formData.timePct = state.stateParams.t;\n }\n else if (state.stateParams.timePct) {\n $scope.formData.timePct = state.stateParams.timePct;\n }\n if (state.stateParams.stepUnit) {\n $scope.formData.rangeDuration = state.stateParams.stepUnit;\n }\n if (state.stateParams.scale) {\n $scope.formData.scale = state.stateParams.scale;\n }\n // Allow to hide some dataset\n if (state.stateParams.hide) {\n $scope.formData.hide = state.stateParams.hide.split(',').reduce(function(res, index){\n return res.concat(parseInt(index));\n }, []);\n }\n }\n\n // Should be override by subclasses\n $scope.init(e, state);\n\n // Make sure there is currency, or load it not\n if (!$scope.formData.currency) {\n return csCurrency.get()\n .then(function (currency) {\n $scope.formData.currency = currency ? currency.name : null;\n $scope.formData.firstBlockTime = currency ? _truncDate(currency.firstBlockTime) : 0;\n if (!$scope.formData.firstBlockTime){\n console.warn('[graph] currency.firstBlockTime not loaded ! Should have been loaded by currrency service!');\n }\n $scope.formData.currencyAge = _truncDate(moment().utc().unix()) - $scope.formData.firstBlockTime;\n\n return $scope.enter(e, state);\n });\n }\n\n $scope.load() // Should be override by subclasses\n .then(function () {\n // Update scale\n $scope.setScale($scope.formData.scale);\n // Hide some dataset by index (read from state params)\n $scope.updateHiddenDataset();\n\n $scope.loading = false;\n });\n }\n };\n $scope.$on('$csExtension.enter', $scope.enter);\n $scope.$on('$ionicParentView.enter', $scope.enter);\n\n $scope.updateLocation = function() {\n if (!$scope.stateName) return;\n\n $ionicHistory.nextViewOptions({\n disableAnimate: true,\n disableBack: true,\n historyRoot: true\n });\n\n $scope.stateParams = $scope.stateParams || {};\n $scope.stateParams.t = ($scope.formData.timePct >= 0 && $scope.formData.timePct < 100) ? $scope.formData.timePct : undefined;\n $scope.stateParams.stepUnit = $scope.formData.rangeDuration != 'day' ? $scope.formData.rangeDuration : undefined;\n $scope.stateParams.hide = $scope.formData.hide && $scope.formData.hide.length ? $scope.formData.hide.join(',') : undefined;\n $scope.stateParams.scale = $scope.formData.scale != 'linear' ?$scope.formData.scale : undefined;\n\n $state.go($scope.stateName, $scope.stateParams, {\n reload: false,\n inherit: true,\n notify: false}\n );\n };\n\n // Allow to fixe size, form a template (e.g. in a 'ng-init' tag)\n $scope.setSize = function(height, width, maintainAspectRatio) {\n $scope.height = height;\n $scope.width = width;\n $scope.maintainAspectRatio = angular.isDefined(maintainAspectRatio) ? maintainAspectRatio : $scope.maintainAspectRatio;\n };\n\n // When parent view execute a refresh action\n $scope.$on('csView.action.refresh', function(event, context) {\n if (!context || context == 'currency') {\n return $scope.load();\n }\n });\n\n $scope.init = function(e, state) {\n // Should be override by subclasses\n };\n\n $scope.load = function() {\n // Should be override by subclasses\n };\n\n $scope.toggleScale = function() {\n $scope.setScale($scope.formData.scale === 'linear' ? 'logarithmic' : 'linear');\n $scope.updateLocation();\n };\n\n $scope.setScale = function(scale) {\n $scope.hideActionsPopover();\n $scope.formData.scale = scale;\n\n if (!$scope.options || !$scope.options.scales || !$scope.options.scales.yAxes) return;\n\n var format = $filter('formatInteger');\n\n _.forEach($scope.options.scales.yAxes, function(yAxe, index) {\n yAxe.type = scale;\n yAxe.ticks = yAxe.ticks || {};\n if (scale == 'linear') {\n yAxe.ticks.beginAtZero = angular.isDefined($scope.formData.beginAtZero) ? $scope.formData.beginAtZero : true;\n delete yAxe.ticks.min;\n yAxe.ticks.callback = function(value) {\n return format(value);\n };\n }\n else {\n //yAxe.ticks.min = 0;\n delete yAxe.ticks.beginAtZero;\n delete yAxe.ticks.callback;\n yAxe.ticks.callback = function(value, index) {\n if (!value) return;\n if (Math.log10(value)%1 === 0 || Math.log10(value/3)%1 === 0) {\n return format(value);\n }\n return '';\n };\n }\n });\n };\n\n $scope.setRangeDuration = function(rangeDuration) {\n $scope.hideActionsPopover();\n if ($scope.formData && rangeDuration == $scope.formData.rangeDuration) return;\n\n $scope.formData.rangeDuration = rangeDuration;\n\n // Restore default values\n delete $scope.formData.startTime;\n delete $scope.formData.endTime;\n delete $scope.formData.rangeDurationSec;\n //$scope.formData.timePct = 100;\n\n // Reload data\n $scope.load();\n // Update location\n $scope.updateLocation();\n };\n\n $scope.updateHiddenDataset = function(datasetOverride) {\n datasetOverride = datasetOverride || $scope.datasetOverride || {};\n\n _.forEach($scope.formData.hide||[], function(index) {\n if (!datasetOverride[index]) return; // skip invalid index\n\n // Hide the dataset (stroke the legend)\n datasetOverride[index].hidden = true;\n\n // If this dataset has an yAxis, hide it (if not used elsewhere)\n var yAxisID = datasetOverride[index].yAxisID;\n var yAxe = yAxisID && $scope.options && $scope.options.scales && _.findWhere($scope.options.scales.yAxes||[], {id: yAxisID});\n if (yAxisID && yAxe) {\n var yAxisDatasetCount = _.filter(datasetOverride, function(dataset) {\n return dataset.yAxisID === yAxisID;\n }).length;\n if (yAxisDatasetCount == 1) {\n yAxe.display = false;\n }\n }\n\n });\n };\n\n $scope.onLegendClick = function(e, legendItem) {\n var index = legendItem.datasetIndex;\n var ci = this.chart;\n var meta = ci.getDatasetMeta(index);\n\n // Hide/show the dataset\n meta.hidden = meta.hidden === null? !ci.data.datasets[index].hidden : null;\n\n // Update yAxis display (if used by only ONE dataset)\n if (ci.config && ci.config.data && ci.config.data.datasets) {\n var yAxisDatasetCount = _.filter(ci.config.data.datasets, function(dataset) {\n return dataset.yAxisID && dataset.yAxisID === meta.yAxisID;\n }).length;\n if (yAxisDatasetCount === 1) {\n ci.scales[meta.yAxisID].options.display = (meta.hidden !== false);\n }\n }\n\n // We hid a dataset ... rerender the chart\n ci.update();\n\n // Update window location\n $scope.formData.hide = $scope.formData.hide||[];\n $scope.formData.hide = meta.hidden ?\n _.union($scope.formData.hide, [index]) :\n _.difference($scope.formData.hide, [index]);\n $scope.updateLocation();\n };\n\n $scope.goPreviousRange = function() {\n if ($scope.loadingRange) return;\n $scope.loadingRange = true;\n\n $scope.formData.startTime -= $scope.times.length * $scope.formData.rangeDurationSec;\n if ($scope.formData.startTime < $scope.formData.firstBlockTime) {\n $scope.formData.startTime = $scope.formData.firstBlockTime;\n }\n $scope.formData.endTime = $scope.formData.startTime + $scope.times.length * $scope.formData.rangeDurationSec;\n\n // Reload data\n $scope.load().then(function(){\n // Update location\n $scope.updateLocation();\n\n $scope.loadingRange = false;\n });\n };\n\n $scope.goNextRange = function() {\n if ($scope.loadingRange) return;\n $scope.loadingRange = true;\n $scope.formData.startTime += $scope.times.length * $scope.formData.rangeDurationSec;\n if ($scope.formData.startTime > $scope.formData.firstBlockTime + $scope.formData.currencyAge - $scope.formData.timeWindow) {\n $scope.formData.startTime = $scope.formData.firstBlockTime + $scope.formData.currencyAge - $scope.formData.timeWindow;\n }\n $scope.formData.endTime = $scope.formData.startTime + $scope.times.length * $scope.formData.rangeDurationSec;\n\n // Reload data\n $scope.load().then(function(){\n // Update location\n $scope.updateLocation();\n\n $scope.loadingRange = false;\n });\n };\n\n $scope.onRangeChanged = function() {\n if ($scope.loadingRange) return;\n $scope.loadingRange = true;\n\n $scope.formData.startTime = $scope.formData.firstBlockTime + (parseFloat($scope.formData.timePct) / 100) * ($scope.formData.currencyAge - $scope.formData.timeWindow) ;\n $scope.formData.endTime = $scope.formData.startTime + $scope.times.length * $scope.formData.rangeDurationSec;\n\n // Reload data\n $scope.load().then(function(){\n // Update location\n $scope.updateLocation();\n\n $scope.loadingRange = false;\n });\n };\n\n $scope.updateRange = function(startTime, endTime, updateTimePct) {\n updateTimePct = angular.isDefined(updateTimePct) ? updateTimePct : true;\n\n $scope.formData.startTime = startTime;\n $scope.formData.endTime = endTime;\n $scope.formData.timeWindow = $scope.formData.timeWindow || $scope.formData.endTime - $scope.formData.startTime;\n $scope.formData.rangeDurationSec = $scope.formData.rangeDurationSec || $scope.formData.timeWindow / ($scope.times.length-1);\n\n if (updateTimePct) {\n $scope.formData.timePct = Math.ceil(($scope.formData.startTime - $scope.formData.firstBlockTime) * 100 /\n ($scope.formData.currencyAge - $scope.formData.timeWindow));\n }\n };\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/graph/templates/common/popover_range_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n}\n","\nGpBlockchainTxCountController.$inject = ['$scope', '$controller', '$q', '$state', '$filter', '$translate', 'gpData', 'gpColor'];\nGpBlockchainIssuersController.$inject = ['$scope', '$controller', '$q', '$state', '$translate', 'gpColor', 'gpData'];\nangular.module('cesium.graph.blockchain.controllers', ['chart.js', 'cesium.services', 'cesium.graph.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.blockchain_stats', {\n url: \"/blockchain/stats?currency&stepUnit&t&hide&scale\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/blockchain/view_stats.html\"\n }\n }\n })\n\n .state('app.currency_blockchain_stats', {\n url: \"/:currency/blockchain/stats\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/blockchain/view_stats.html\"\n }\n }\n })\n ;\n }])\n\n .controller('GpBlockchainTxCountCtrl', GpBlockchainTxCountController)\n .controller('GpBlockchainIssuersCtrl', GpBlockchainIssuersController)\n;\n\n\nfunction GpBlockchainTxCountController($scope, $controller, $q, $state, $filter, $translate, gpData, gpColor) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyAbstractCtrl', {$scope: $scope}));\n\n $scope.displayRightAxis = true;\n\n $scope.init = function(e, state) {\n if (state && state.stateParams) {\n\n // get the pubkey\n if (!$scope.formData.issuer && state && state.stateParams && state.stateParams.pubkey) { // Currency parameter\n $scope.formData.issuer = state.stateParams.pubkey;\n }\n }\n };\n\n $scope.load = function(updateTimePct) {\n\n var formData = $scope.formData;\n\n return $q.all([\n\n $translate($scope.formData.issuer?\n 'GRAPH.BLOCKCHAIN.TX_AMOUNT_PUBKEY_TITLE':\n 'GRAPH.BLOCKCHAIN.TX_AMOUNT_TITLE', formData),\n\n // translate i18n keys\n $translate(['GRAPH.BLOCKCHAIN.TX_AMOUNT_LABEL',\n 'GRAPH.BLOCKCHAIN.TX_COUNT_LABEL',\n 'GRAPH.BLOCKCHAIN.TX_AVG_BY_BLOCK',\n 'COMMON.DATE_PATTERN',\n 'COMMON.DATE_SHORT_PATTERN',\n 'COMMON.DATE_MONTH_YEAR_PATTERN']),\n\n // get data\n gpData.blockchain.txCount($scope.formData.currency, formData)\n ])\n .then(function(result) {\n\n var title = result[0];\n\n var translations = result[1];\n var datePatterns = {\n hour: translations['COMMON.DATE_PATTERN'],\n day: translations['COMMON.DATE_SHORT_PATTERN'],\n month: translations['COMMON.DATE_MONTH_YEAR_PATTERN']\n };\n\n result = result[2];\n\n if (!result || !result.times) return; // no data\n $scope.times = result.times;\n\n var formatInteger = $filter('formatInteger');\n var formatAmount = $filter('formatDecimal');\n $scope.currencySymbol = $filter('currencySymbolNoHtml')($scope.formData.currency, $scope.formData.useRelative);\n\n // Data\n if ($scope.formData.rangeDuration != 'hour') {\n $scope.data = [\n result.amount,\n result.count\n ];\n }\n else {\n $scope.data = [\n result.amount,\n result.count\n ];\n }\n\n // Labels\n var labelPattern = datePatterns[$scope.formData.rangeDuration];\n $scope.labels = result.times.reduce(function(res, time) {\n return res.concat(moment.unix(time).local().format(labelPattern));\n }, []);\n\n // Colors\n $scope.colors = gpColor.scale.fix(result.times.length);\n\n // Update range options with received values\n $scope.updateRange(result.times[0], result.times[result.times.length-1], updateTimePct);\n\n // Options\n $scope.options = {\n responsive: true,\n maintainAspectRatio: true,\n title: {\n display: true,\n text: title\n },\n scales: {\n yAxes: [\n {\n id: 'y-axis-amount',\n position: 'left'\n },\n {\n id: 'y-axis-count',\n display: $scope.displayRightAxis,\n position: 'right',\n gridLines: {\n drawOnChartArea: false\n }\n }\n ]\n },\n legend: {\n display: $scope.displayRightAxis,\n onClick: $scope.onLegendClick\n },\n tooltips: {\n enabled: true,\n mode: 'index',\n callbacks: {\n label: function(tooltipItems, data) {\n if (tooltipItems.datasetIndex === 0) {\n return data.datasets[tooltipItems.datasetIndex].label +\n ': ' + formatAmount(tooltipItems.yLabel) +\n ' ' + $scope.currencySymbol;\n }\n return data.datasets[tooltipItems.datasetIndex].label +\n ': ' + tooltipItems.yLabel;\n }\n }\n }\n };\n\n // Override dataset config\n $scope.datasetOverride = [\n {\n yAxisID: 'y-axis-amount',\n type: 'bar',\n label: translations['GRAPH.BLOCKCHAIN.TX_AMOUNT_LABEL'],\n hoverBackgroundColor: gpColor.rgba.calm(0.6)\n },\n {\n yAxisID: 'y-axis-count',\n type: 'line',\n label: translations['GRAPH.BLOCKCHAIN.TX_COUNT_LABEL'],\n fill: false,\n borderColor: gpColor.rgba.gray(0.5),\n borderWidth: 2,\n backgroundColor: gpColor.rgba.gray(0.5),\n pointBackgroundColor: gpColor.rgba.gray(0.5),\n pointBorderColor: gpColor.rgba.white(),\n pointHoverBackgroundColor: gpColor.rgba.gray(1),\n pointHoverBorderColor: gpColor.rgba.translucent(),\n pointRadius: 3\n }\n ];\n });\n };\n\n $scope.onChartClick = function(data, e, item) {\n if (!item) return;\n var from = $scope.times[item._index];\n var to = moment.unix(from).utc().add(1, $scope.formData.rangeDuration).unix();\n var query = '_exists_:transactions AND medianTime:>={0} AND medianTime:<{1}'.format(from, to);\n if ($scope.formData.issuer) {\n query += ' AND issuer:' + $scope.formData.issuer;\n }\n $state.go('app.blockchain_search', {q: query});\n };\n\n}\n\n\nfunction GpBlockchainIssuersController($scope, $controller, $q, $state, $translate, gpColor, gpData) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyAbstractCtrl', {$scope: $scope}));\n\n $scope.load = function() {\n return $q.all([\n $translate([\n 'GRAPH.BLOCKCHAIN.BLOCKS_ISSUERS_TITLE',\n 'GRAPH.BLOCKCHAIN.BLOCKS_ISSUERS_LABEL'\n ]),\n gpData.blockchain.countByIssuer($scope.formData.currency)\n ])\n .then(function(result) {\n var translations = result[0];\n result = result[1];\n if (!result || !result.data) return;\n\n // Data\n $scope.data = result.data;\n\n // Labels\n $scope.labels = result.labels;\n\n // Data to keep (for click or label)\n $scope.blockCount = result.blockCount;\n $scope.issuers = result.issuers;\n\n // Options\n $scope.barOptions = {\n responsive: true,\n maintainAspectRatio: $scope.maintainAspectRatio,\n title: {\n display: true,\n text: translations['GRAPH.BLOCKCHAIN.BLOCKS_ISSUERS_TITLE']\n },\n scales: {\n yAxes: [{\n type: 'linear',\n ticks: {\n beginAtZero: true\n }\n }]\n }\n };\n\n // Colors\n $scope.colors = gpColor.scale.custom(result.data.length);\n\n });\n };\n\n $scope.onChartClick = function(data, e, item) {\n if (!item) return;\n var issuer = $scope.issuers[item._index];\n $state.go('app.wot_identity', issuer);\n };\n}\n","\nGpPeerViewExtendController.$inject = ['$scope', '$timeout', 'PluginService', 'esSettings', 'csCurrency', 'gpData'];\nangular.module('cesium.graph.network.controllers', ['chart.js', 'cesium.graph.services'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n\n PluginServiceProvider\n .extendState('app.network', {\n points: {\n 'blockchain-buttons': {\n templateUrl: \"plugins/graph/templates/network/view_network_extend.html\",\n controller: 'ESExtensionCtrl'\n }\n }\n })\n\n .extendState('app.view_peer', {\n points: {\n 'general': {\n templateUrl: \"plugins/graph/templates/network/view_peer_extend.html\",\n controller: 'GpPeerViewExtendCtrl'\n }\n }\n })\n\n .extendState('app.es_network', {\n points: {\n 'documents-buttons': {\n templateUrl: \"plugins/graph/templates/network/view_es_network_extend.html\",\n controller: 'ESExtensionCtrl'\n }\n }\n })\n\n .extendState('app.view_es_peer', {\n points: {\n 'general': {\n templateUrl: \"plugins/graph/templates/network/view_es_peer_extend.html\",\n controller: 'ESExtensionCtrl'\n }\n }\n })\n ;\n\n $stateProvider\n .state('app.view_peer_stats', {\n url: \"/network/peer/:pubkey/stats\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/network/view_peer_stats.html\",\n controller: 'GpBlockchainTxCountCtrl'\n }\n }\n });\n }\n }])\n\n .controller('GpPeerViewExtendCtrl', GpPeerViewExtendController)\n\n;\n\nfunction GpPeerViewExtendController($scope, $timeout, PluginService, esSettings, csCurrency, gpData) {\n 'ngInject';\n\n $scope.extensionPoint = PluginService.extensions.points.current.get();\n $scope.enable = esSettings.isEnable();\n $scope.loading = true;\n $scope.node = $scope.node || {};\n\n esSettings.api.state.on.changed($scope, function(enable) {\n $scope.enable = enable;\n });\n\n /**\n * Enter into the view\n * @param e\n * @param state\n */\n $scope.enter = function(e, state) {\n\n if (!$scope.node.currency && state && state.stateParams && state.stateParams.currency) { // Currency parameter\n $scope.node.currency = state.stateParams.currency;\n }\n\n // Make sure there is currency, or load if not\n if (!$scope.node.currency) {\n return csCurrency.get()\n .then(function(currency) {\n $scope.node.currency = currency ? currency.name : null;\n return $scope.enter(e, state);\n });\n }\n\n // Make sure there is pubkey, or wait for parent load to be finished\n if (!$scope.node.pubkey) {\n return $timeout(function () {\n return $scope.enter(e, state);\n }, 500);\n }\n\n // load\n return $scope.load();\n };\n $scope.$on('$csExtension.enter', $scope.enter);\n\n $scope.load = function() {\n if (!$scope.node.currency && !$scope.node.pubkey) return;\n console.info(\"[Graph] [peer] Loading blocks count for [{0}]\".format($scope.node.pubkey.substr(0, 8)));\n\n return gpData.node.blockCount($scope.node.currency, $scope.node.pubkey)\n .then(function(count) {\n $scope.blockCount = count;\n $scope.loading = false;\n });\n };\n}\n","\nGpCurrencyViewExtendController.$inject = ['$scope', 'PluginService', 'UIUtils', 'esSettings'];\nGpCurrencyMonetaryMassController.$inject = ['$scope', '$controller', '$q', '$state', '$translate', 'UIUtils', 'gpColor', 'gpData', '$filter', 'csSettings'];\nGpCurrencyDUController.$inject = ['$scope', '$q', '$controller', '$translate', 'gpColor', 'gpData', '$filter', 'UIUtils'];\nGpCurrencyMembersCountController.$inject = ['$scope', '$controller', '$q', '$state', '$translate', 'gpColor', 'gpData', '$filter'];\nangular.module('cesium.graph.currency.controllers', ['chart.js', 'cesium.graph.services', 'cesium.graph.common.controllers'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n $stateProvider\n .state('app.currency.tab_parameters_stats', {\n url: \"/parameters/stats\",\n views: {\n 'tab-parameters': {\n templateUrl: \"plugins/graph/templates/currency/tabs/tab_parameters_stats.html\"\n }\n }\n })\n .state('app.currency.tab_wot_stats', {\n url: \"/community/stats\",\n views: {\n 'tab-wot': {\n templateUrl: \"plugins/graph/templates/currency/tabs/tab_wot_stats.html\",\n controller: 'GpCurrencyMembersCountCtrl'\n }\n }\n })\n .state('app.currency.tab_network_stats', {\n url: \"/network/stats\",\n views: {\n 'tab-network': {\n templateUrl: \"plugins/graph/templates/currency/tabs/tab_network_stats.html\"\n }\n }\n })\n .state('app.currency.tab_blocks_stats', {\n url: \"/blocks/stats\",\n views: {\n 'tab-blocks': {\n templateUrl: \"plugins/graph/templates/currency/tabs/tab_blocks_stats.html\"\n }\n }\n })\n .state('app.currency_stats_lg', {\n url: \"/currency/stats/lg?hide&scale\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/currency/view_stats_lg.html\"\n }\n }\n });\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n PluginServiceProvider\n .extendStates(['app.currency_name', 'app.currency', 'app.currency_name_lg', 'app.currency_lg'], {\n points: {\n 'parameters-actual': {\n templateUrl: \"plugins/graph/templates/currency/view_currency_extend.html\",\n controller: 'GpCurrencyViewExtendCtrl'\n },\n 'wot-actual': {\n templateUrl: \"plugins/graph/templates/currency/view_currency_extend.html\",\n controller: 'GpCurrencyViewExtendCtrl'\n },\n 'network-actual': {\n templateUrl: \"plugins/graph/templates/currency/view_currency_extend.html\",\n controller: 'GpCurrencyViewExtendCtrl'\n }\n }\n })\n .extendStates(['app.currency.tab_blocks'], {\n points: {\n 'buttons': {\n templateUrl: \"plugins/graph/templates/currency/tab_blocks_extend.html\",\n controller: 'GpCurrencyViewExtendCtrl'\n }\n }\n })\n ;\n }\n }])\n\n\n .controller('GpCurrencyViewExtendCtrl', GpCurrencyViewExtendController)\n\n .controller('GpCurrencyMonetaryMassCtrl', GpCurrencyMonetaryMassController)\n\n .controller('GpCurrencyDUCtrl', GpCurrencyDUController)\n\n .controller('GpCurrencyMembersCountCtrl', GpCurrencyMembersCountController)\n;\n\nfunction GpCurrencyViewExtendController($scope, PluginService, UIUtils, esSettings) {\n 'ngInject';\n\n $scope.extensionPoint = PluginService.extensions.points.current.get();\n $scope.enable = esSettings.isEnable();\n $scope.smallscreen = UIUtils.screen.isSmall();\n\n esSettings.api.state.on.changed($scope, function(enable) {\n $scope.enable = enable;\n });\n}\n\nfunction GpCurrencyMonetaryMassController($scope, $controller, $q, $state, $translate, UIUtils, gpColor, gpData, $filter, csSettings) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyAbstractCtrl', {$scope: $scope}));\n\n $scope.formData.useRelative = angular.isDefined($scope.formData.useRelative) ?\n $scope.formData.useRelative :\n csSettings.data.useRelative;\n $scope.displayShareAxis = true;\n $scope.hiddenDatasets = [];\n\n $scope.init = function(e, state) {\n // nothing to do here\n };\n\n $scope.onUseRelativeChanged = function() {\n if (!$scope.loading) {\n $scope.load();\n }\n };\n $scope.$watch('formData.useRelative', $scope.onUseRelativeChanged);\n\n var truncAmount = function(value) {\n return Math.trunc(value*100)/100;\n };\n\n $scope.load = function(from, size) {\n from = from || 0;\n size = size || 10000;\n\n return $q.all([\n $translate(['GRAPH.CURRENCY.MONETARY_MASS_TITLE',\n 'GRAPH.CURRENCY.MONETARY_MASS_LABEL',\n 'GRAPH.CURRENCY.MONETARY_MASS_SHARE_LABEL']),\n gpData.blockchain.withDividend($scope.formData.currency, {\n from: from,\n size: size\n })\n ])\n .then(function(result) {\n var translations = result[0];\n result = result[1];\n if (!result || !result.times) return;\n $scope.times = result.times;\n\n // Choose a date formatter, depending on the blocks period\n var blocksPeriod = result.times[result.times.length-1] - result.times[0];\n var formatDate;\n if (blocksPeriod < 31557600/* less than 1 year */) {\n formatDate = $filter('medianDateShort');\n }\n else {\n formatDate = $filter('formatDateMonth'); //see #683\n }\n\n var formatAmount = $filter('formatDecimal');\n $scope.currencySymbol = $filter('currencySymbolNoHtml')($scope.formData.currency, $scope.formData.useRelative);\n\n // Data: relative\n var data = [];\n if($scope.formData.useRelative) {\n\n // M/N\n data.push(\n result.blocks.reduce(function(res, block) {\n return res.concat(truncAmount(block.monetaryMass / block.dividend / block.membersCount));\n }, []));\n\n // Mass\n data.push(\n result.blocks.reduce(function(res, block) {\n return res.concat(truncAmount(block.monetaryMass / block.dividend));\n }, []));\n }\n\n // Data: quantitative\n else {\n // M/N\n data.push(\n result.blocks.reduce(function(res, block) {\n return res.concat(truncAmount(block.monetaryMass / block.membersCount / 100));\n }, []));\n\n // Mass\n data.push(\n result.blocks.reduce(function(res, block) {\n return res.concat(block.monetaryMass / 100);\n }, []));\n }\n $scope.data = data;\n\n // Labels\n $scope.labels = result.times.reduce(function(res, time) {\n return res.concat(formatDate(time));\n }, []);\n\n // Colors\n $scope.colors = gpColor.scale.fix(result.times.length);\n\n // Options\n $scope.options = {\n responsive: true,\n maintainAspectRatio: $scope.maintainAspectRatio,\n title: {\n display: true,\n text: translations['GRAPH.CURRENCY.MONETARY_MASS_TITLE']\n },\n legend: {\n display: $scope.displayShareAxis,\n onClick: $scope.onLegendClick\n },\n scales: {\n yAxes: [\n {\n id: 'y-axis-mn'\n },\n {\n id: 'y-axis-mass',\n display: $scope.displayShareAxis,\n position: 'right',\n gridLines: {\n drawOnChartArea: false\n }\n },\n\n ]\n },\n tooltips: {\n enabled: true,\n mode: 'index',\n callbacks: {\n label: function(tooltipItems, data) {\n return data.datasets[tooltipItems.datasetIndex].label +\n ': ' + formatAmount(tooltipItems.yLabel) +\n ' ' + $scope.currencySymbol;\n }\n }\n }\n };\n\n $scope.datasetOverride = [\n {\n yAxisID: 'y-axis-mn',\n type: 'line',\n label: translations['GRAPH.CURRENCY.MONETARY_MASS_SHARE_LABEL'],\n borderWidth: 2,\n pointRadius: 0,\n pointHitRadius: 4,\n pointHoverRadius: 3\n },\n {\n yAxisID: 'y-axis-mass',\n type: 'line',\n label: translations['GRAPH.CURRENCY.MONETARY_MASS_LABEL'],\n fill: false,\n showLine: true,\n borderColor: gpColor.rgba.energized(),\n borderWidth: 1,\n backgroundColor: gpColor.rgba.energized(),\n pointBackgroundColor: gpColor.rgba.energized(),\n pointBorderColor: gpColor.rgba.energized(),\n pointHoverBackgroundColor: gpColor.rgba.energized(),\n pointHoverBorderColor: gpColor.rgba.energized(),\n pointRadius: 0,\n pointHitRadius: 4,\n pointHoverRadius: 3\n }];\n\n $scope.setScale($scope.scale);\n\n // Keep only block number (need for click)\n $scope.blocks = result.blocks.reduce(function(res, block) {\n return res.concat(block.number);\n }, []);\n });\n\n };\n\n $scope.onChartClick = function(data, e, item) {\n if (!item) return;\n var number = $scope.blocks[item._index];\n $state.go('app.view_block', {number: number});\n };\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/graph/templates/currency/popover_monetary_mass_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n}\n\n\nfunction GpCurrencyDUController($scope, $q, $controller, $translate, gpColor, gpData, $filter, UIUtils) {\n 'ngInject';\n\n $scope.formData = {\n scale: 'linear',\n beginAtZero: false\n };\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyMonetaryMassCtrl', {$scope: $scope}));\n\n\n $scope.load = function(from, size) {\n from = from || 0;\n size = size || 10000;\n\n return $q.all([\n $translate([\n 'GRAPH.CURRENCY.UD_TITLE',\n 'COMMON.UNIVERSAL_DIVIDEND']),\n gpData.blockchain.withDividend($scope.formData.currency, {\n from: from,\n size: size\n })\n ])\n .then(function(result) {\n var translations = result[0];\n result = result[1];\n if (!result || !result.times) return;\n $scope.times = result.times;\n\n // Choose a date formatter, depending on the blocks period\n var blocksPeriod = result.times[result.times.length-1] - result.times[0];\n var dateFilter;\n if (blocksPeriod < 31557600/* less than 1 year */) {\n dateFilter = $filter('medianDateShort');\n }\n else {\n dateFilter = $filter('formatDateMonth');\n }\n\n var formatAmount = $filter('formatDecimal');\n $scope.currencySymbol = $filter('currencySymbolNoHtml')($scope.formData.currency, false);\n\n // Data\n $scope.data = [\n result.blocks.reduce(function(res, block) {\n return res.concat(block.dividend / 100);\n }, [])\n ];\n\n // Labels\n $scope.labels = result.times.reduce(function(res, time) {\n return res.concat(dateFilter(time));\n }, []);\n\n // Colors\n $scope.colors = result.blocks.reduce(function(res) {\n return res.concat(gpColor.rgba.calm(0.5));\n }, []);\n\n // Options\n $scope.options = {\n responsive: true,\n maintainAspectRatio: $scope.maintainAspectRatio,\n title: {\n display: true,\n text: translations['GRAPH.CURRENCY.UD_TITLE']\n },\n scales: {\n yAxes: [\n {\n id: 'y-axis-ud',\n ticks: {\n beginAtZero: $scope.formData.beginAtZero\n }\n }\n ]\n },\n tooltips: {\n enabled: true,\n mode: 'index',\n callbacks: {\n label: function(tooltipItems, data) {\n return data.datasets[tooltipItems.datasetIndex].label +\n ': ' + formatAmount(tooltipItems.yLabel) +\n ' ' + $scope.currencySymbol;\n }\n }\n }\n };\n $scope.setScale($scope.scale);\n\n $scope.datasetOverride = [\n {\n yAxisID: 'y-axis-ud',\n type: 'line',\n label: translations['COMMON.UNIVERSAL_DIVIDEND'],\n borderWidth: 2,\n pointRadius: 0,\n pointHitRadius: 4,\n pointHoverRadius: 3\n }];\n\n // Keep only block number (need for click)\n $scope.blocks = result.blocks.reduce(function(res, block) {\n return res.concat(block.number);\n }, []);\n });\n\n };\n\n /* -- Popover -- */\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/graph/templates/currency/popover_monetary_mass_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n}\n\n\nfunction GpCurrencyMembersCountController($scope, $controller, $q, $state, $translate, gpColor, gpData, $filter) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyAbstractCtrl', {$scope: $scope}));\n\n $scope.load = function(from, size) {\n from = from || 0;\n size = size || 10000;\n\n return $q.all([\n $translate(['GRAPH.CURRENCY.MEMBERS_COUNT_TITLE', 'GRAPH.CURRENCY.MEMBERS_COUNT_LABEL']),\n gpData.blockchain.withDividend($scope.formData.currency, {\n from: from,\n size: size,\n withCurrent: true\n })\n ])\n .then(function(result) {\n var translations = result[0];\n result = result[1];\n\n if (!result || !result.times) return;\n $scope.times = result.times;\n\n // Choose a date formatter, depending on the blocks period\n var blocksPeriod = result.times[result.blocks.length-1] - result.times[0];\n var dateFilter;\n if (blocksPeriod < 31557600/* less than 1 year*/) {\n dateFilter = $filter('medianDateShort');\n }\n else {\n dateFilter = $filter('formatDateMonth');\n }\n\n // Format time\n $scope.labels = result.times.reduce(function(res, time) {\n return res.concat(dateFilter(time));\n }, []);\n\n // Members count graph: -------------------------\n $scope.options = {\n responsive: true,\n maintainAspectRatio: $scope.maintainAspectRatio,\n title: {\n display: true,\n text: translations['GRAPH.CURRENCY.MEMBERS_COUNT_TITLE']\n },\n scales: {\n xAxes: [{\n position: 'bottom'\n }],\n yAxes: [{\n id: 'y-axis-1',\n ticks: {\n beginAtZero: false\n }\n }]\n }\n };\n $scope.datasetOverride = [{\n yAxisID: 'y-axis-1',\n type: 'line',\n label: translations['GRAPH.CURRENCY.MEMBERS_COUNT_LABEL'],\n borderWidth: 2,\n pointRadius: 0,\n pointHitRadius: 4,\n pointHoverRadius: 3\n }];\n\n // Data\n $scope.data = [\n result.blocks.reduce(function(res, block) {\n return res.concat(block.membersCount);\n }, [])\n ];\n\n // Colors\n $scope.colors = gpColor.scale.fix(result.blocks.length);\n });\n };\n\n $scope.onChartClick = function(data, e, item) {\n if (!item) return;\n if (!item._index) {\n $state.go('app.view_block', {number: 0});\n return;\n }\n var from = $scope.times[item._index-1];\n var to = moment.unix(from).utc().add(1, 'day').unix();\n $state.go('app.blockchain_search', {\n q: '(_exists_:joiners OR _exists_:leavers OR _exists_:revoked OR _exists_:excluded) AND medianTime:>{0} AND medianTime:<={1}'.format(from, to)\n });\n };\n\n\n}\n","\nGpAccountBalanceController.$inject = ['$scope', '$controller', '$q', '$state', '$filter', '$translate', 'csWot', 'gpData', 'gpColor', 'csWallet'];\nGpAccountSumTxController.$inject = ['$scope', '$controller', '$filter', '$state', 'csTx', 'gpColor'];\nGpAccountCertificationController.$inject = ['$scope', '$controller', '$q', '$state', '$filter', '$translate', 'gpData', 'gpColor', 'csWallet'];\nangular.module('cesium.graph.account.controllers', ['chart.js', 'cesium.graph.services'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n\n PluginServiceProvider\n .extendState('app.view_wallet_tx', {\n points: {\n 'buttons': {\n templateUrl: \"plugins/graph/templates/account/view_wallet_tx_extend.html\",\n controller: 'ESExtensionCtrl'\n }\n }\n })\n\n .extendState('app.view_wallet_tx_by_id', {\n points: {\n 'buttons': {\n templateUrl: \"plugins/graph/templates/account/view_wallet_tx_extend.html\",\n controller: 'ESExtensionCtrl'\n }\n }\n })\n\n .extendStates(['app.wot_identity_tx_uid', 'app.wot_identity_tx_uid_lg'], {\n points: {\n 'buttons': {\n templateUrl: \"plugins/graph/templates/account/view_identity_tx_extend.html\",\n controller: 'ESExtensionCtrl'\n }\n }\n })\n ;\n\n $stateProvider\n .state('app.view_wallet_stats', {\n url: \"/wallet/stats?t&stepUnit&hide&scale\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/account/view_stats.html\"\n }\n },\n data: {\n auth: true\n }\n })\n\n .state('app.view_wallet_stats_by_id', {\n url: \"/wallets/:id/stats?t&stepUnit&hide&scale\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/account/view_stats.html\"\n }\n },\n data: {\n auth: true\n }\n })\n\n .state('app.wot_identity_stats', {\n url: \"/wot/:pubkey/stats?t&stepUnit&hide&scale\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/account/view_stats.html\"\n }\n }\n });\n }\n }])\n\n .controller('GpAccountBalanceCtrl', GpAccountBalanceController)\n\n .controller('GpAccountSumTxCtrl', GpAccountSumTxController)\n\n .controller('GpAccountCertificationCtrl', GpAccountCertificationController)\n;\n\nfunction GpAccountBalanceController($scope, $controller, $q, $state, $filter, $translate, csWot, gpData, gpColor, csWallet) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyAbstractCtrl', {$scope: $scope}));\n\n $scope.init = function(e, state) {\n\n if (state && state.stateParams && state.stateParams.pubkey) { // Currency parameter\n $scope.formData.pubkey = state.stateParams.pubkey;\n }\n else if(csWallet.isLogin()) {\n $scope.formData.pubkey = csWallet.data.pubkey;\n }\n\n };\n\n var defaultSetScale = $scope.setScale;\n $scope.setScale = function(scale) {\n // linear scale: sent values as negative\n if (scale === 'linear') {\n $scope.data[$scope.data.length-2] = _.map($scope.data[$scope.data.length-2], function(value) {\n return -1 * Math.abs(value);\n });\n }\n // log scale: sent values as positive\n else {\n $scope.data[$scope.data.length-2] = _.map($scope.data[$scope.data.length-2], function(value) {\n return Math.abs(value);\n });\n }\n\n // call default implementation\n defaultSetScale(scale);\n };\n\n $scope.load = function(updateTimePct) {\n\n updateTimePct = angular.isDefined(updateTimePct) ? updateTimePct : true;\n\n var withUD = true;\n\n return csWot.load($scope.formData.pubkey, null/*uid*/, {cache: true})\n .then(function(identity) {\n $scope.identity = identity;\n withUD = $scope.identity.isMember || $scope.identity.wasMember;\n\n return $q.all([\n\n $translate('GRAPH.ACCOUNT.BALANCE_TITLE', $scope.formData),\n\n // translate i18n keys\n $translate(['GRAPH.ACCOUNT.UD_LABEL',\n 'GRAPH.ACCOUNT.TX_RECEIVED_LABEL',\n 'GRAPH.ACCOUNT.TX_SENT_LABEL',\n 'GRAPH.ACCOUNT.UD_ACCUMULATION_LABEL',\n 'GRAPH.ACCOUNT.TX_ACCUMULATION_LABEL',\n 'GRAPH.ACCOUNT.BALANCE_LABEL',\n 'COMMON.DATE_PATTERN',\n 'COMMON.DATE_SHORT_PATTERN',\n 'COMMON.DATE_MONTH_YEAR_PATTERN']),\n\n // get data\n gpData.blockchain.movement($scope.formData.currency, angular.copy($scope.formData, {withUD: withUD}))\n ]);\n })\n .then(function(result) {\n var title = result[0];\n var translations = result[1];\n result = result[2];\n\n if (!result || !result.times) return; // no data\n $scope.times = result.times;\n\n var formatDecimal = $filter('formatDecimal');\n $scope.currencySymbol = $filter('currencySymbolNoHtml')($scope.formData.currency, $scope.formData.useRelative);\n\n // Data\n $scope.data = [\n result.ud,\n result.received,\n result.sent,\n result.balance\n ];\n\n var datePatterns = {\n hour: translations['COMMON.DATE_PATTERN'],\n day: translations['COMMON.DATE_SHORT_PATTERN'],\n month: translations['COMMON.DATE_MONTH_YEAR_PATTERN']\n };\n // Labels\n var labelPattern = datePatterns[$scope.formData.rangeDuration];\n $scope.labels = result.times.reduce(function(res, time) {\n return res.concat(moment.unix(time).local().format(labelPattern));\n }, []);\n\n // Colors\n $scope.colors = gpColor.scale.fix(result.times.length);\n\n // Update range with received values\n $scope.updateRange(result.times[0], result.times[result.times.length-1], updateTimePct);\n\n // Options\n $scope.options = {\n responsive: true,\n maintainAspectRatio: true,\n title: {\n display: true,\n text: title\n },\n scales: {\n xAxes: [{\n stacked: true\n }],\n yAxes: [\n {\n id: 'y-axis-left',\n type: 'linear',\n position: 'left',\n stacked: true\n }\n ]\n },\n legend: {\n display: true,\n onClick: $scope.onLegendClick\n },\n tooltips: {\n enabled: true,\n mode: 'index',\n callbacks: {\n label: function(tooltipItems, data) {\n return data.datasets[tooltipItems.datasetIndex].label +\n ': ' +\n (!tooltipItems.yLabel ? '0' :\n (formatDecimal(tooltipItems.yLabel) + ' ' + $scope.currencySymbol));\n }\n }\n }\n };\n\n $scope.datasetOverride = [\n {\n yAxisID: 'y-axis-left',\n type: 'bar',\n label: translations['GRAPH.ACCOUNT.UD_LABEL'],\n backgroundColor: gpColor.rgba.energized(0.3),\n hoverBackgroundColor: gpColor.rgba.energized(0.5),\n borderWidth: 1\n },\n {\n yAxisID: 'y-axis-left',\n type: 'bar',\n label: translations['GRAPH.ACCOUNT.TX_RECEIVED_LABEL'],\n backgroundColor: gpColor.rgba.positive(0.4),\n hoverBackgroundColor: gpColor.rgba.positive(0.6),\n borderWidth: 1\n },\n {\n yAxisID: 'y-axis-left',\n type: 'bar',\n label: translations['GRAPH.ACCOUNT.TX_SENT_LABEL'],\n backgroundColor: gpColor.rgba.assertive(0.4),\n hoverBackgroundColor: gpColor.rgba.assertive(0.6),\n borderWidth: 1\n },\n {\n yAxisID: 'y-axis-left',\n type: 'line',\n label: translations['GRAPH.ACCOUNT.BALANCE_LABEL'],\n fill: 'origin',\n borderColor: gpColor.rgba.calm(0.5),\n borderWidth: 2,\n pointBackgroundColor: gpColor.rgba.calm(0.5),\n pointBorderColor: gpColor.rgba.white(),\n pointHoverBackgroundColor: gpColor.rgba.calm(1),\n pointHoverBorderColor: 'rgba(0,0,0,0)',\n pointRadius: 3,\n lineTension: 0.1\n }\n ];\n\n\n if (!withUD) {\n // remove UD\n $scope.data.splice(0,1);\n $scope.datasetOverride.splice(0,1);\n }\n else {\n // FIXME: fund why UD data not working well\n // remove UD\n /*$scope.data.splice(0,1);\n $scope.datasetOverride.splice(0,1);*/\n }\n });\n };\n\n $scope.onChartClick = function(data, e, item) {\n if (!item) return;\n var from = $scope.times[item._index];\n var to = moment.unix(from).utc().add(1, $scope.formData.rangeDuration).unix();\n var query = 'medianTime:>={0} AND medianTime:<{1}'.format(from, to);\n if ($scope.formData.pubkey) {\n query += ' AND (transactions.issuers:' + $scope.formData.pubkey + ' OR transactions.outputs:*' + $scope.formData.pubkey + ')';\n }\n $state.go('app.blockchain_search', {q: query});\n };\n}\n\n//TODO : Avoid csTx loading, switch to Elasticsearch\nfunction GpAccountSumTxController($scope, $controller, $filter, $state, csTx, gpColor) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyAbstractCtrl', {$scope: $scope}));\n\n // When opening the view\n $scope.init= function(e, state) {\n\n // Get the pubkey (from URL params) and store it in the page context ($scope)\n $scope.pubkey = (state && state.stateParams && state.stateParams.pubkey);\n\n };\n\n // When opening the view\n $scope.load = function(e, state) {\n if (!$scope.pubkey) return;\n\n // Load account TX data\n return csTx.load($scope.pubkey, -1)\n .then(function(result) {\n\n if (result && result.tx && result.tx.history) {\n //Charts data\n $scope.inputChart = $scope.computeChartData(_.filter(result.tx.history, function(tx) {\n return tx.amount > 0;\n }));\n $scope.outputChart = $scope.computeChartData(_.filter(result.tx.history, function(tx) {\n return tx.amount < 0;\n }));\n }\n });\n };\n\n // Load chart data: received amount by pubkey\n $scope.computeChartData = function(txArray) {\n\n var formatPubkey = $filter('formatPubkey');\n\n // Sum TX amount, with a group by pubkey\n var sumByPubkeys = {};\n _.forEach(txArray, function (tx) {\n sumByPubkeys[tx.pubkey] = sumByPubkeys[tx.pubkey] || {\n label: tx.name || tx.uid || formatPubkey(tx.pubkey),\n pubkey: tx.pubkey,\n sum: 0\n };\n sumByPubkeys[tx.pubkey].sum += Math.abs(tx.amount);\n });\n\n // Get values (from the map), then sort (desc) on sum\n var sumItems = _.sortBy(_.values(sumByPubkeys), 'sum').reverse();\n\n // Divide total amount by 100\n _.each(sumItems, function(item) {\n item.sum = item.sum / 100;\n });\n\n // Return arrays expected by angular-chart\n return {\n data: _.pluck(sumItems, 'sum'),\n labels: _.pluck(sumItems, 'label'),\n pubkeys: _.pluck(sumItems, 'pubkey'),\n colors: gpColor.scale.custom(\n Math.max(10, sumItems.length) // avoid strange colors\n )\n };\n };\n\n $scope.onInputChartClick = function(data, e, item) {\n if (!item) return;\n var pubkey = $scope.inputChart.pubkeys[item._index];\n $state.go('app.wot_identity', {pubkey: pubkey});\n };\n\n $scope.onOutputChartClick = function(data, e, item) {\n if (!item) return;\n var pubkey = $scope.outputChart.pubkeys[item._index];\n $state.go('app.wot_identity', {pubkey: pubkey});\n };\n}\n\n\n/**\n * Graph that display received/sent certification\n */\nfunction GpAccountCertificationController($scope, $controller, $q, $state, $filter, $translate, gpData, gpColor, csWallet) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyAbstractCtrl', {$scope: $scope}));\n\n $scope.init = function(e, state) {\n if (state && state.stateParams && state.stateParams.pubkey) { // Currency parameter\n $scope.formData.pubkey = state.stateParams.pubkey;\n }\n else if(csWallet.isLogin()) {\n $scope.formData.pubkey = csWallet.data.pubkey;\n }\n\n // for DEV only\n //$scope.formData.pubkey = '38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE';\n };\n\n $scope.load = function(updateTimePct) {\n\n var formData = $scope.formData;\n\n return $q.all([\n\n $translate('GRAPH.ACCOUNT.CERTIFICATION_TITLE', formData),\n\n // translate i18n keys\n $translate(['GRAPH.ACCOUNT.GIVEN_CERT_LABEL',\n 'GRAPH.ACCOUNT.RECEIVED_CERT_LABEL',\n 'GRAPH.ACCOUNT.GIVEN_CERT_DELTA_LABEL',\n 'GRAPH.ACCOUNT.RECEIVED_CERT_DELTA_LABEL',\n 'COMMON.DATE_PATTERN',\n 'COMMON.DATE_SHORT_PATTERN',\n 'COMMON.DATE_MONTH_YEAR_PATTERN']),\n\n // get data\n gpData.wot.certifications(formData)\n ])\n .then(function(result) {\n\n var title = result[0];\n var translations = result[1];\n result = result[2];\n\n if (!result || !result.times) return; // no data\n $scope.times = result.times;\n\n var formatInteger = $filter('formatInteger');\n\n // Data\n $scope.data = [\n result.deltaReceived,\n result.received,\n result.deltaGiven,\n result.given\n ];\n\n // Labels\n $scope.labels = result.labels;\n\n var displayFormats = {\n hour: translations['COMMON.DATE_PATTERN'],\n day: translations['COMMON.DATE_SHORT_PATTERN'],\n month: translations['COMMON.DATE_MONTH_YEAR_PATTERN']\n };\n var displayFormat = displayFormats[$scope.formData.rangeDuration];\n // Labels\n $scope.labels = result.times.reduce(function(res, time) {\n return res.concat(moment.unix(time).local().format(displayFormat));\n }, []);\n\n // Colors\n $scope.colors = gpColor.scale.fix(result.times.length);\n\n // Update options with received values\n $scope.updateRange(result.times[0], result.times[result.times.length-1], updateTimePct);\n\n // Options\n $scope.options = {\n responsive: true,\n maintainAspectRatio: true,\n title: {\n display: true,\n text: title\n },\n scales: {\n yAxes: [\n {\n id: 'y-axis-left',\n type: 'linear',\n position: 'left'\n },\n {\n id: 'y-axis-hide',\n type: 'linear',\n display: false,\n position: 'right'\n }\n ]\n },\n legend: {\n display: true\n },\n tooltips: {\n enabled: true,\n mode: 'index',\n callbacks: {\n label: function(tooltipItems, data) {\n // Should add a '+' before value ?\n var addPlus = (tooltipItems.datasetIndex === 0 || tooltipItems.datasetIndex === 2) && tooltipItems.yLabel > 0;\n return data.datasets[tooltipItems.datasetIndex].label +\n ': ' +\n (addPlus ? '+' : '') +\n !tooltipItems.yLabel ? '0' : formatInteger(tooltipItems.yLabel);\n }\n }\n }\n };\n\n $scope.datasetOverride = [\n {\n yAxisID: 'y-axis-left',\n type: 'bar',\n label: translations['GRAPH.ACCOUNT.RECEIVED_CERT_DELTA_LABEL'],\n borderColor: gpColor.rgba.positive(0.6),\n borderWidth: 1,\n backgroundColor: gpColor.rgba.positive(0.4),\n hoverBackgroundColor: gpColor.rgba.positive(0.6)\n },\n {\n yAxisID: 'y-axis-left',\n type: 'line',\n label: translations['GRAPH.ACCOUNT.RECEIVED_CERT_LABEL'],\n fill: false,\n borderColor: gpColor.rgba.positive(0.5),\n borderWidth: 2,\n backgroundColor: gpColor.rgba.positive(1),\n pointBackgroundColor: gpColor.rgba.positive(0.5),\n pointBorderColor: gpColor.rgba.white(),\n pointHoverBackgroundColor: gpColor.rgba.positive(1),\n pointHoverBorderColor: 'rgba(0,0,0,0)',\n pointRadius: 3\n },\n {\n yAxisID: 'y-axis-left',\n type: 'bar',\n label: translations['GRAPH.ACCOUNT.GIVEN_CERT_DELTA_LABEL'],\n borderColor: gpColor.rgba.assertive(0.6),\n borderWidth: 1,\n backgroundColor: gpColor.rgba.assertive(0.4),\n hoverBackgroundColor: gpColor.rgba.assertive(0.6)\n },\n {\n yAxisID: 'y-axis-left',\n type: 'line',\n label: translations['GRAPH.ACCOUNT.GIVEN_CERT_LABEL'],\n fill: false,\n borderColor: gpColor.rgba.assertive(0.4),\n borderWidth: 2,\n backgroundColor: gpColor.rgba.assertive(1),\n pointBackgroundColor: gpColor.rgba.assertive(0.4),\n pointBorderColor: gpColor.rgba.white(),\n pointHoverBackgroundColor: gpColor.rgba.assertive(1),\n pointHoverBorderColor: 'rgba(0,0,0,0)',\n pointRadius: 3,\n lineTension: 0.1\n }\n ];\n });\n };\n\n $scope.onChartClick = function(data, e, item) {\n if (!item) return;\n var from = $scope.times[item._index];\n var to = moment.unix(from).utc().add(1, $scope.formData.rangeDuration).unix();\n var query = '_exists_:transactions AND medianTime:>={0} AND medianTime:<{1}'.format(from, to);\n if ($scope.formData.pubkey) {\n query += ' AND (transactions.issuers:' + $scope.formData.pubkey + ' OR transactions.outputs:*' + $scope.formData.pubkey + ')';\n }\n $state.go('app.blockchain_search', {q: query});\n };\n}\n","\nGpDocStatsController.$inject = ['$scope', '$state', '$controller', '$q', '$translate', 'gpColor', 'gpData', '$filter'];\nangular.module('cesium.graph.docstats.controllers', ['chart.js', 'cesium.graph.services', 'cesium.graph.common.controllers'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n $stateProvider\n .state('app.doc_stats_lg', {\n url: \"/network/data/stats/:server?stepUnit&t&hide&scale&useSsl&useTor\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/docstats/view_stats.html\",\n controller: 'GpDocStatsCtrl'\n }\n }\n })\n\n // Deprecated URL\n .state('app.doc_stats_lg_old', {\n url: \"/data/stats?stepUnit&t&hide&scale&useSsl&useTor\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/docstats/view_stats.html\",\n controller: 'GpDocStatsCtrl'\n }\n }\n });\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // TODO: add buttons to link with doc stats\n }\n }])\n\n\n .controller('GpDocStatsCtrl', GpDocStatsController)\n;\n\nfunction GpDocStatsController($scope, $state, $controller, $q, $translate, gpColor, gpData, $filter) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyAbstractCtrl', {$scope: $scope}));\n\n $scope.formData.rangeDuration = 'month';\n\n $scope.displayRightAxis = true;\n $scope.hiddenDatasets = [];\n\n $scope.chartIdPrefix = 'docstats-chart-';\n $scope.charts = [\n\n // User count\n {\n id: 'user',\n title: 'GRAPH.DOC_STATS.USER.TITLE',\n series: [\n {\n key: 'user_profile',\n label: 'GRAPH.DOC_STATS.USER.USER_PROFILE',\n color: gpColor.rgba.royal(0.7),\n pointHoverBackgroundColor: gpColor.rgba.royal(),\n clickState: {\n name: 'app.document_search',\n params: {index:'user', type: 'profile'}\n }\n },\n {\n key: 'user_settings',\n label: 'GRAPH.DOC_STATS.USER.USER_SETTINGS',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray(),\n clickState: {\n name: 'app.document_search',\n params: {index:'user', type: 'settings'}\n }\n }\n ]\n },\n\n // User delta\n {\n id: 'user_delta',\n title: 'GRAPH.DOC_STATS.USER_DELTA.TITLE',\n series: [\n {\n key: 'user_profile_delta',\n label: 'GRAPH.DOC_STATS.USER_DELTA.USER_PROFILE',\n type: 'line',\n yAxisID: 'y-axis-delta',\n color: gpColor.rgba.royal(),\n pointHoverBackgroundColor: gpColor.rgba.royal()\n },\n {\n key: 'user_settings_delta',\n label: 'GRAPH.DOC_STATS.USER_DELTA.USER_SETTINGS',\n type: 'line',\n yAxisID: 'y-axis-delta',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray()\n }\n ]\n },\n\n // Message & Co.\n {\n id: 'message',\n title: 'GRAPH.DOC_STATS.MESSAGE.TITLE',\n series: [\n {\n key: 'message_inbox',\n label: 'GRAPH.DOC_STATS.MESSAGE.MESSAGE_INBOX',\n color: gpColor.rgba.royal(),\n pointHoverBackgroundColor: gpColor.rgba.royal(),\n clickState: {\n name: 'app.document_search',\n params: {index:'message', type: 'inbox'}\n }\n },\n {\n key: 'message_outbox',\n label: 'GRAPH.DOC_STATS.MESSAGE.MESSAGE_OUTBOX',\n color: gpColor.rgba.calm(),\n pointHoverBackgroundColor: gpColor.rgba.calm(),\n clickState: {\n name: 'app.document_search',\n params: {index:'message', type: 'outbox'}\n }\n },\n {\n key: 'invitation_certification',\n label: 'GRAPH.DOC_STATS.MESSAGE.INVITATION_CERTIFICATION',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray(),\n clickState: {\n name: 'app.document_search',\n params: {index:'invitation', type: 'certification'}\n }\n }\n ]\n },\n\n // Social Page & group\n {\n id: 'social',\n title: 'GRAPH.DOC_STATS.SOCIAL.TITLE',\n series: [\n {\n key: 'page_record',\n label: 'GRAPH.DOC_STATS.SOCIAL.PAGE_RECORD',\n color: gpColor.rgba.royal(),\n pointHoverBackgroundColor: gpColor.rgba.royal(),\n clickState: {\n name: 'app.document_search',\n params: {index:'page', type: 'record'}\n }\n },\n {\n key: 'group_record',\n label: 'GRAPH.DOC_STATS.SOCIAL.GROUP_RECORD',\n color: gpColor.rgba.calm(),\n pointHoverBackgroundColor: gpColor.rgba.calm(),\n clickState: {\n name: 'app.document_search',\n params: {index:'group', type: 'record'}\n }\n },\n {\n key: 'page_comment',\n label: 'GRAPH.DOC_STATS.SOCIAL.PAGE_COMMENT',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray(),\n clickState: {\n name: 'app.document_search',\n params: {index:'page', type: 'comment'}\n }\n }\n ]\n },\n\n // Other: deletion, doc, etc.\n {\n id: 'other',\n title: 'GRAPH.DOC_STATS.OTHER.TITLE',\n series: [\n {\n key: 'history_delete',\n label: 'GRAPH.DOC_STATS.OTHER.HISTORY_DELETE',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray(),\n clickState: {\n name: 'app.document_search',\n params: {index:'history', type: 'delete'}\n }\n }\n ]\n }\n ];\n\n var formatInteger = $filter('formatInteger');\n\n $scope.defaultChartOptions = {\n responsive: true,\n maintainAspectRatio: $scope.maintainAspectRatio,\n title: {\n display: true\n },\n legend: {\n display: true,\n onClick: $scope.onLegendClick\n },\n scales: {\n xAxes: [{\n stacked: true\n }],\n yAxes: [\n {\n id: 'y-axis',\n stacked: true\n },\n {\n id: 'y-axis-delta',\n stacked: false\n },\n {\n id: 'y-axis-delta-right',\n stacked: false,\n display: $scope.displayRightAxis,\n position: 'right',\n gridLines: {\n drawOnChartArea: false\n }\n }\n ]\n },\n tooltips: {\n enabled: true,\n mode: 'index',\n callbacks: {\n label: function(tooltipItems, data) {\n return data.datasets[tooltipItems.datasetIndex].label +\n ': ' + formatInteger(tooltipItems.yLabel);\n }\n }\n }\n };\n\n $scope.init = function(e, state) {\n if (state && state.stateParams) {\n // Manage URL parameters\n\n var server = state.stateParams && state.stateParams.server || undefined;\n if (server) {\n console.debug(\"[docstats] Will use server: \" + server);\n angular.merge($scope.formData, {\n server: state.stateParams.server,\n useSsl: state.stateParams.useSsl,\n useTor: state.stateParams.useTor\n });\n }\n }\n };\n\n $scope.load = function(updateTimePct) {\n\n return $q.all([\n // Get i18n keys (chart title, series labels, date patterns)\n $translate($scope.charts.reduce(function(res, chart) {\n return res.concat(chart.series.reduce(function(res, serie) {\n return res.concat(serie.label);\n }, [chart.title]));\n }, [\n 'COMMON.DATE_PATTERN',\n 'COMMON.DATE_SHORT_PATTERN',\n 'COMMON.DATE_MONTH_YEAR_PATTERN'\n ])),\n\n // get Data\n gpData.docstat.get($scope.formData)\n ])\n .then(function(result) {\n var translations = result[0];\n var datePatterns = {\n hour: translations['COMMON.DATE_PATTERN'],\n day: translations['COMMON.DATE_SHORT_PATTERN'],\n month: translations['COMMON.DATE_MONTH_YEAR_PATTERN']\n };\n\n result = result[1];\n if (!result || !result.times) return; // no data\n $scope.times = result.times;\n\n // Labels\n var labelPattern = datePatterns[$scope.formData.rangeDuration];\n $scope.labels = _.map(result.times, function(time) {\n return moment.unix(time).local().format(labelPattern);\n });\n\n // Update range options with received values\n $scope.updateRange(result.times[0], result.times[result.times.length-1], updateTimePct);\n\n $scope.setScale($scope.scale);\n\n // For each chart\n _.forEach($scope.charts, function(chart){\n\n // Prepare chart data\n var usedYAxisIDs = {};\n chart.data = _.map(chart.series, function(serie) {\n usedYAxisIDs[serie.yAxisID||'y-axis'] = true;\n // If 'delta' serie, then compute delta from the source serie\n if (serie.key.endsWith('_delta')) {\n var key = serie.key.substring(0, serie.key.length - '_delta'.length);\n return getDeltaFromValueArray(result[key]) || [];\n }\n return result[serie.key]||[];\n });\n\n // Options (with title)\n chart.options = angular.copy($scope.defaultChartOptions);\n chart.options.title.text = translations[chart.title];\n\n // Remove unused yAxis\n chart.options.scales.yAxes = chart.options.scales.yAxes.reduce(function(res, yAxe){\n return usedYAxisIDs[yAxe.id] ? res.concat(yAxe) : res;\n }, []);\n\n // Series datasets\n chart.datasetOverride = _.map(chart.series, function(serie) {\n return {\n yAxisID: serie.yAxisID || 'y-axis',\n type: serie.type || 'line',\n label: translations[serie.label],\n fill: serie.type !== 'line',\n borderWidth: 2,\n pointRadius: serie.type !== 'line' ? 0 : 2,\n pointHitRadius: 4,\n pointHoverRadius: 3,\n borderColor: serie.color,\n backgroundColor: serie.color,\n pointBackgroundColor: serie.color,\n pointBorderColor: serie.color,\n pointHoverBackgroundColor: serie.pointHoverBackgroundColor||serie.color,\n pointHoverBorderColor: serie.pointHoverBorderColor||gpColor.rgba.white()\n };\n });\n });\n });\n\n };\n\n $scope.onChartClick = function(data, e, item) {\n if (!item) return;\n var chart = _.find($scope.charts , function(chart) {\n return ($scope.chartIdPrefix + chart.id) === item._chart.canvas.id;\n });\n\n var serie = chart && chart.series[item._datasetIndex];\n var from = $scope.times[item._index];\n var to = moment.unix(from).utc().add(1, $scope.formData.rangeDuration).unix();\n\n if (serie && serie.clickState && serie.clickState.name) {\n var stateParams = serie.clickState.params ? angular.copy(serie.clickState.params) : {};\n\n // Compute query\n stateParams.q = 'time:>={0} AND time:<{1}'.format(from, to);\n\n return $state.go(serie.clickState.name, stateParams);\n }\n else if (serie) {\n console.debug('Click on item index={0} on range [{1},{2}]'.format(item._index, from, to));\n }\n };\n\n function getDeltaFromValueArray(values) {\n if (!values) return undefined;\n var previousValue;\n return _.map(values, function(value) {\n var newValue = (value !== undefined && previousValue !== undefined) ? (value - (previousValue || value)) : undefined;\n previousValue = value;\n return newValue;\n });\n }\n\n}\n","\nGpSynchroController.$inject = ['$scope', '$controller', '$q', '$translate', 'gpColor', 'gpData', '$filter'];\nangular.module('cesium.graph.synchro.controllers', ['chart.js', 'cesium.graph.services', 'cesium.graph.common.controllers'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n $stateProvider\n .state('app.doc_synchro_lg', {\n url: \"/network/data/synchro/:server?stepUnit&t&hide&scale&useSsl&useTor\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/synchro/view_stats.html\",\n controller: \"GpSynchroCtrl\"\n }\n }\n })\n\n // Deprecated URL\n .state('app.doc_synchro_lg_old', {\n url: \"/data/synchro?stepUnit&t&hide&scale&useSsl&useTor\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/synchro/view_stats.html\",\n controller: \"GpSynchroCtrl\"\n }\n }\n })\n ;\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // TODO: add buttons to link with doc stats\n }\n }])\n\n\n .controller('GpSynchroCtrl', GpSynchroController)\n;\n\nfunction GpSynchroController($scope, $controller, $q, $translate, gpColor, gpData, $filter) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyAbstractCtrl', {$scope: $scope}));\n\n $scope.formData.rangeDuration = 'month';\n\n $scope.hiddenDatasets = [];\n\n $scope.charts = [\n\n // Execution: number of doc\n {\n id: 'count',\n title: 'GRAPH.SYNCHRO.COUNT.TITLE',\n series: [\n {\n key: 'inserts',\n type: 'bar',\n label: 'GRAPH.SYNCHRO.COUNT.INSERTS',\n color: gpColor.rgba.royal(),\n pointHoverBackgroundColor: gpColor.rgba.royal()\n },\n {\n key: 'updates',\n type: 'bar',\n label: 'GRAPH.SYNCHRO.COUNT.UPDATES',\n color: gpColor.rgba.calm(),\n pointHoverBackgroundColor: gpColor.rgba.calm()\n },\n {\n key: 'deletes',\n type: 'bar',\n label: 'GRAPH.SYNCHRO.COUNT.DELETES',\n color: gpColor.rgba.assertive(0.5),\n pointHoverBackgroundColor: gpColor.rgba.assertive()\n }\n ]\n },\n\n // Execution: number of peers\n {\n id: 'peer',\n title: 'GRAPH.SYNCHRO.PEER.TITLE',\n series: [\n {\n key: 'ES_USER_API',\n label: 'GRAPH.SYNCHRO.PEER.ES_USER_API',\n color: gpColor.rgba.royal(),\n pointHoverBackgroundColor: gpColor.rgba.royal()\n },\n {\n key: 'ES_SUBSCRIPTION_API',\n label: 'GRAPH.SYNCHRO.PEER.ES_SUBSCRIPTION_API',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray()\n }\n ]\n },\n\n // Execution: number of peers\n {\n id: 'performance',\n title: 'GRAPH.SYNCHRO.PERFORMANCE.TITLE',\n series: [\n {\n key: 'duration',\n type: 'bar',\n label: 'GRAPH.SYNCHRO.PERFORMANCE.DURATION',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray()\n }\n ]\n }\n ];\n\n var formatInteger = $filter('formatInteger');\n\n $scope.defaultChartOptions = {\n responsive: true,\n maintainAspectRatio: $scope.maintainAspectRatio,\n title: {\n display: true\n },\n legend: {\n display: true,\n onClick: $scope.onLegendClick\n },\n scales: {\n xAxes: [{\n stacked: true\n }],\n yAxes: [\n {\n stacked: true,\n id: 'y-axis'\n }\n ]\n },\n tooltips: {\n enabled: true,\n mode: 'index',\n callbacks: {\n label: function(tooltipItems, data) {\n return data.datasets[tooltipItems.datasetIndex].label +\n ': ' + formatInteger(tooltipItems.yLabel);\n }\n }\n }\n };\n\n $scope.init = function(e, state) {\n if (state && state.stateParams) {\n // Manage URL parameters\n var server = state.stateParams && state.stateParams.server || undefined;\n if (server) {\n console.debug(\"[synchro] Will use server: \" + server);\n angular.merge($scope.formData, state.stateParams);\n }\n }\n };\n\n $scope.load = function(updateTimePct) {\n\n return $q.all([\n // Get i18n keys (chart title, series labels, date patterns)\n $translate($scope.charts.reduce(function(res, chart) {\n return res.concat(chart.series.reduce(function(res, serie) {\n return res.concat(serie.label);\n }, [chart.title]));\n }, [\n 'COMMON.DATE_PATTERN',\n 'COMMON.DATE_SHORT_PATTERN',\n 'COMMON.DATE_MONTH_YEAR_PATTERN'\n ])),\n\n // get Data\n gpData.synchro.execution.get($scope.formData)\n ])\n .then(function(result) {\n var translations = result[0];\n var datePatterns = {\n hour: translations['COMMON.DATE_PATTERN'],\n day: translations['COMMON.DATE_SHORT_PATTERN'],\n month: translations['COMMON.DATE_MONTH_YEAR_PATTERN']\n };\n\n result = result[1];\n if (!result || !result.times) return; // no data\n $scope.times = result.times;\n\n // Labels\n var labelPattern = datePatterns[$scope.formData.rangeDuration];\n $scope.labels = result.times.reduce(function(res, time) {\n return res.concat(moment.unix(time).local().format(labelPattern));\n }, []);\n\n // Update range options with received values\n $scope.updateRange(result.times[0], result.times[result.times.length-1], updateTimePct);\n\n $scope.setScale($scope.scale);\n\n // For each chart\n _.forEach($scope.charts, function(chart){\n\n // Data\n chart.data = [];\n _.forEach(chart.series, function(serie){\n chart.data.push(result[serie.key]||[]);\n });\n\n // Options (with title)\n chart.options = angular.copy($scope.defaultChartOptions);\n chart.options.title.text = translations[chart.title];\n\n // Series datasets\n chart.datasetOverride = chart.series.reduce(function(res, serie) {\n return res.concat({\n yAxisID: 'y-axis',\n type: serie.type || 'line',\n label: translations[serie.label],\n fill: true,\n borderWidth: 2,\n pointRadius: 0,\n pointHitRadius: 4,\n pointHoverRadius: 3,\n borderColor: serie.color,\n backgroundColor: serie.color,\n pointBackgroundColor: serie.color,\n pointBorderColor: serie.color,\n pointHoverBackgroundColor: serie.pointHoverBackgroundColor||serie.color,\n pointHoverBorderColor: serie.pointHoverBorderColor||gpColor.rgba.white()\n });\n }, []);\n });\n });\n };\n}\n","\nMapEditPositionAbstractController.$inject = ['$scope', '$timeout', '$q', 'MapUtils', '$translate'];\nangular.module('cesium.map.common.controllers', ['cesium.services', 'cesium.map.services'])\n\n .controller('MapEditPositionAbstractCtrl', MapEditPositionAbstractController)\n\n;\n\n/**\n * An abstract controller, that allow to edit psotion, using a map view (e.g. used by profile and page edition)\n * @param $scope\n * @param $timeout\n * @param $q\n * @param MapUtils\n * @param $translate\n * @constructor\n */\nfunction MapEditPositionAbstractController($scope, $timeout, $q, MapUtils, $translate) {\n 'ngInject';\n\n var listeners = [];\n $scope.mapId = 'map-user-profile-' + $scope.$id;\n $scope.map = MapUtils.map({\n markers: {},\n center: {\n zoom: 13\n }\n });\n $scope.loading = true;\n $scope.mapId = $scope.mapId || 'map-abstract-' + $scope.$id; // Should have beed override by sub-controllers\n\n $scope.enter = function(e, state) {\n\n // Wait parent controller load the profile\n if (!$scope.formData || (!$scope.formData.title && !$scope.formData.geoPoint)) {\n return $timeout($scope.enter, 500);\n }\n\n $scope.loading = true;\n return $scope.load();\n };\n $scope.$on('$csExtension.enter', $scope.enter);\n $scope.$on('$ionicParentView.enter', $scope.enter);\n\n $scope.load = function() {\n\n // no position define: remove existing listener\n if (!$scope.formData.geoPoint || !$scope.formData.geoPoint.lat || !$scope.formData.geoPoint.lon) {\n _.forEach(listeners, function(listener){\n listener(); // unlisten\n });\n listeners = [];\n delete $scope.map.markers.geoPoint;\n $scope.loading = false;\n return $q.when();\n }\n\n // If no marker exists on map: create it\n if (!$scope.map.markers.geoPoint) {\n\n return $translate('MAP.PROFILE.MARKER_HELP')\n .then(function(helpText) {\n\n $scope.map.markers.geoPoint = {\n message: helpText,\n lat: parseFloat($scope.formData.geoPoint.lat),\n lng: parseFloat($scope.formData.geoPoint.lon),\n draggable: true,\n focus: true\n };\n angular.extend($scope.map.center, {\n lat: $scope.map.markers.geoPoint.lat,\n lng: $scope.map.markers.geoPoint.lng\n });\n\n // Listening changes\n var listener = $scope.$watch('map.markers.geoPoint', function() {\n if ($scope.loading) return;\n if ($scope.map.markers.geoPoint && $scope.map.markers.geoPoint.lat && $scope.map.markers.geoPoint.lng) {\n $scope.formData.geoPoint = $scope.formData.geoPoint || {};\n $scope.formData.geoPoint.lat = $scope.map.markers.geoPoint.lat;\n $scope.formData.geoPoint.lon = $scope.map.markers.geoPoint.lng;\n }\n }, true);\n listeners.push(listener);\n\n\n // Make sure map appear, if shown later\n if (!$scope.ionItemClass) {\n $scope.ionItemClass = 'done in';\n }\n\n $scope.loading = false;\n });\n }\n\n // Marker exists: update lat/lon\n else {\n $scope.map.markers.geoPoint.lat = $scope.formData.geoPoint.lat;\n $scope.map.markers.geoPoint.lng = $scope.formData.geoPoint.lon;\n }\n };\n\n\n $scope.$watch('formData.geoPoint', function() {\n if ($scope.loading) return;\n $scope.load();\n }, true);\n\n}\n","\nMapWotViewController.$inject = ['$scope', '$filter', '$templateCache', '$interpolate', '$timeout', '$location', '$translate', '$q', '$controller', 'ionicReady', 'leafletData', 'UIUtils', 'csSettings', 'csWallet', 'MapUtils', 'mapWot'];\nangular.module('cesium.map.wot.controllers', ['cesium.services', 'cesium.map.services', 'cesium.map.help.controllers'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n\n PluginServiceProvider\n\n .extendState('app.wot_lookup.tab_search', {\n points: {\n 'nav-buttons': {\n template: '<button class=\"button button-icon button-clear\" ui-sref=\"app.view_wot_map\"><i class=\"icon ion-ios-location\"></i></button>'\n }\n }\n })\n\n .extendState('app.wot_lookup_lg', {\n points: {\n 'filter-buttons': {\n templateUrl: \"plugins/map/templates/wot/lookup_lg_extend.html\",\n controller: \"ESExtensionCtrl\"\n }\n }\n });\n\n $stateProvider\n .state('app.view_wot_map', {\n url: \"/wot/map?c¢er\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/map/templates/wot/view_map.html\",\n controller: 'MapWotViewCtrl'\n }\n },\n // Seems to works without cache ??\n //cache: false,\n data: {\n silentLocationChange: true\n }\n });\n }\n }])\n\n // Map view of the WOT\n .controller('MapWotViewCtrl', MapWotViewController)\n\n;\n\n\nfunction MapWotViewController($scope, $filter, $templateCache, $interpolate, $timeout, $location, $translate, $q, $controller,\n ionicReady,\n leafletData, UIUtils, csSettings, csWallet, MapUtils, mapWot) {\n 'ngInject';\n\n // Initialize the super classes and extend it.\n angular.extend(this, $controller('WotIdentityAbstractCtrl', { $scope: $scope}));\n angular.extend(this, $controller('ESWotIdentityViewCtrl', {$scope: $scope}));\n\n var\n // Create a hidden layer, to hold search markers\n markersSearchLayer,\n icons= {\n member: {\n type: 'awesomeMarker',\n icon: 'person',\n markerColor: 'blue'\n },\n pending: {\n type: 'awesomeMarker',\n icon: 'clock',\n markerColor: 'lightgreen',\n iconColor: 'gray'\n },\n wallet: {\n type: 'awesomeMarker',\n icon: 'key',\n markerColor: 'lightgray'\n }\n };\n\n $scope.loading = true;\n $scope.loadingMarker = true;\n $scope.mapId = 'map-wot-' + $scope.$id;\n\n $scope.map = MapUtils.map({\n cache: 'map-wot',\n layers: {\n overlays: {\n\n // User profile\n member: {\n type: 'featureGroup',\n name: 'MAP.WOT.VIEW.LAYER.MEMBER',\n visible: true\n },\n pending: {\n type: 'featureGroup',\n name: 'MAP.WOT.VIEW.LAYER.PENDING',\n visible: true\n },\n wallet: {\n type: 'featureGroup',\n name: 'MAP.WOT.VIEW.LAYER.WALLET',\n visible: true\n }\n }\n },\n bounds: {},\n markers: {},\n loading: true\n }, $scope.mapId);\n\n // Variables for marker\n $scope.showDescription = false;\n ionicReady().then(function() {\n $scope.enableDescription = !UIUtils.screen.isSmall() && ionic.Platform.grade.toLowerCase() === 'a';\n if (!$scope.enableDescription) {\n console.debug(\"[map] [wot] Disable profile description.\", ionic.Platform.grade);\n }\n });\n\n $scope.$on('$ionicView.beforeEnter', function (event, viewData) {\n // Enable back button (workaround need for navigation outside tabs - https://stackoverflow.com/a/35064602)\n viewData.enableBack = UIUtils.screen.isSmall() ? true : viewData.enableBack;\n });\n\n $scope.enter = function(e, state) {\n\n if ($scope.loading) {\n\n UIUtils.loading.show({\n noBackdrop: true // avoid a too long release\n });\n if (state.stateParams && state.stateParams.c) {\n var cPart = state.stateParams.c.split(':');\n $scope.map.center.lat = parseFloat(cPart[0]);\n $scope.map.center.lng = parseFloat(cPart[1]);\n $scope.map.center.zoom = parseInt(cPart[2]);\n }\n\n $scope.$watch(\"map.center\", function() {\n if (!$scope.loading) {\n return $timeout(function() {\n $scope.updateLocationHref();\n }, 300);\n }\n }, true);\n\n // Load the map (and init if need)\n var now = Date.now();\n $scope.loadMap()\n .then($scope.load)\n .then(function() {\n console.debug(\"[map] [wot] Loaded in \"+ (Date.now() - now) +\"ms\");\n\n $scope.showHelpTip();\n });\n }\n else {\n // Make sure to have previous center coordinate defined in the location URL\n $scope.updateLocationHref();\n $scope.showHelpTip();\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.loadMap = function() {\n return $q.all([\n $translate(['COMMON.BTN_HELP_TOUR_SCREEN', 'COMMON.BTN_REFRESH', 'MAP.COMMON.BTN_LOCALIZE_ME']),\n leafletData.getMap($scope.mapId)\n ]).then(function(res) {\n var translations = res[0];\n var map = res[1];\n if (!$scope.map.loading) return map; // already loaded\n\n if (!UIUtils.screen.isSmall()) {\n // Add a start tour button\n L.easyButton({\n position: 'topright', // inherited from L.Control -- the corner it goes in\n type: 'replace', // set to animate when you're comfy with css\n leafletClasses: true, // use leaflet classes to style the button?\n states:[{ // specify different icons and responses for your button\n stateName: 'show-help-tour',\n onClick: $scope.startHelpTour,\n title: translations['COMMON.BTN_HELP_TOUR_SCREEN'],\n icon: 'icon ion-easel'\n }]\n }\n ).addTo(map);\n\n // Add a refresh button\n L.easyButton({\n position: 'topright', // inherited from L.Control -- the corner it goes in\n type: 'replace', // set to animate when you're comfy with css\n leafletClasses: true, // use leaflet classes to style the button?\n states:[{ // specify different icons and responses for your button\n stateName: 'refresh',\n onClick: function(btn, map){\n return $scope.load(map);\n },\n title: translations['COMMON.BTN_REFRESH'],\n icon: 'icon ion-refresh'\n }]\n }\n ).addTo(map);\n }\n\n // Add loading control\n L.Control.loading({\n position: 'topright',\n separate: true\n }).addTo(map);\n\n // Add localize me control\n MapUtils.control.localizeMe({\n title: translations['MAP.COMMON.BTN_LOCALIZE_ME']\n })\n .addTo(map);\n\n // Add search control\n markersSearchLayer = L.layerGroup({visible: false});\n var searchTip = $interpolate($templateCache.get('plugins/map/templates/wot/item_search_tooltip.html'));\n MapUtils.control.search({\n layer: markersSearchLayer,\n propertyName: 'title',\n buildTip: function (text, val) {\n return searchTip(val.layer.options);\n },\n moveToLocation: function(lnglat, title, map) {\n if(this.options.zoom)\n this._map.setView(lnglat, this.options.zoom);\n else\n this._map.panTo(lnglat);\n var popupMarkerId = lnglat.layer && lnglat.layer.options && lnglat.layer.options.popupMarkerId;\n $timeout(function(){\n var popupMarker = popupMarkerId && _.find(map._layers, function(layer) {\n return (layer.options && layer.options.id === popupMarkerId);\n });\n if (popupMarker) popupMarker.openPopup();\n }, 400);\n },\n firstTipSubmit: true,\n tooltipLimit: 50\n }).addTo(map);\n\n // Add marker cluster layer\n var extractMarkerLayer = function(marker) {\n return marker.options && marker.options.layer;\n };\n var markerClusterLayer = L.markerClusterGroup({\n disableClusteringAtZoom: MapUtils.constants.LOCALIZE_ZOOM,\n maxClusterRadius: 65,\n showCoverageOnHover: false,\n iconCreateFunction: function (cluster) {\n var countByLayer = _.countBy(cluster.getAllChildMarkers(), extractMarkerLayer);\n var markerColor = countByLayer.member ? 'blue' : (countByLayer.pending ? 'lightgreen' : 'lightgray');\n var childCount = cluster.getChildCount();\n var className = 'marker-cluster ' + markerColor + ' marker-cluster-';\n if (childCount < 10) {\n className += 'small';\n } else if (childCount < 100) {\n className += 'medium';\n } else {\n className += 'large';\n }\n return L.divIcon({ html: '<div><span>' + childCount + '</span></div>', className: className, iconSize: new L.Point(40, 40) });\n }\n });\n map.eachLayer(function(layer) {\n // Add capabilities of 'featureGroup.subgroup', if layer is a group\n if (layer.addLayer){\n angular.extend(layer, L.featureGroup.subGroup(markerClusterLayer));\n }\n });\n markerClusterLayer.addTo(map);\n\n // Bind map with options (e.g. to received overlays visibility updates)\n // Cache no more need, as view is not cached\n //MapUtils.cache.bind($scope, $scope.mapId, $scope.map);\n\n $scope.map.loading = false;\n\n return map;\n });\n };\n\n // Load markers data\n $scope.load = function(map) {\n if (!map) {\n return leafletData.getMap($scope.mapId)\n // loop with the map object\n .then($scope.load);\n }\n\n $scope.loading = true;\n // Show loading indicator\n map.fire('dataloading');\n\n var options = {\n fields: {\n description: $scope.enableDescription\n }\n };\n\n // add bounding box\n if ($scope.map.bounds) {\n // FIXME - this is not working well\n //options.bounds = angular.copy($scope.map.bounds);\n //delete options.bounds.options;\n }\n\n // Load wot data, from service\n return mapWot.load(options)\n\n .then(function(res) {\n var markers = {};\n\n // Clean search layer\n markersSearchLayer.clearLayers();\n\n if (res && res.length) {\n\n var formatPubkey = $filter('formatPubkey');\n var markerTemplate = $templateCache.get('plugins/map/templates/wot/popup_marker.html');\n\n _.forEach(res, function (hit) {\n var type = hit.pending ? 'pending' : (hit.uid ? 'member' : 'wallet');\n var shortPubkey = formatPubkey(hit.pubkey);\n var id = hit.index + '_' + (hit.id || (hit.uid ? (hit.uid + ':' + hit.pubkey) : hit.pubkey)).replace(/-/g, '_');\n var marker = {\n layer: type,\n icon: icons[type],\n opacity: hit.uid ? 1 : 0.7,\n title: hit.name + ' | ' + shortPubkey,\n lat: hit.geoPoint.lat,\n lng: hit.geoPoint.lon,\n getMessageScope: function () {\n var scope = $scope.$new();\n scope.loadingMarker = true;\n scope.formData = {};\n scope.$applyAsync(function() {\n scope.formData = {\n pubkey: hit.pubkey,\n uid: hit.uid,\n name: hit.name,\n profile: hit\n };\n scope.loadingMarker = false;\n });\n return scope;\n },\n focus: false,\n message: markerTemplate,\n id: id\n };\n markers[id] = marker;\n\n // Create a search marker (will be hide)\n var searchText = hit.name + ((hit.uid && hit.uid != hit.name) ? (' | ' + hit.uid) : '') + ' | ' + shortPubkey;\n var searchMarker = angular.merge({\n type: type,\n opacity: 0,\n icon: L.divIcon({\n className: type + ' ng-hide',\n iconSize: L.point(0, 0)\n })\n }, {title: searchText, pubkey: hit.pubkey, uid: hit.uid, name: hit.name, pending: hit.pending, popupMarkerId: id});\n markersSearchLayer.addLayer(new L.Marker({\n lat: hit.geoPoint.lat,\n lng: hit.geoPoint.lon\n },\n searchMarker));\n });\n }\n\n $scope.map.markers = markers;\n\n return $timeout(function(){\n $scope.loading = false;\n\n // hide loading indicator\n map.fire('dataload');\n\n UIUtils.loading.hide();\n });\n })\n .catch(function(err) {\n $scope.map.markers = {};\n $scope.loading = false;\n UIUtils.onError('MAP.WOT.ERROR.LOAD_POSITION_FAILED')(err);\n });\n };\n\n // Update the browser location, to be able to refresh the page\n $scope.updateLocationHref = function(centerHash) {\n // removeIf(device)\n var params = $location.search() || {};\n if (!params.c || !MapUtils.center.isDefault($scope.map.center)) {\n centerHash = centerHash || '{0}:{1}:{2}'.format($scope.map.center.lat.toFixed(4), $scope.map.center.lng.toFixed(4), $scope.map.center.zoom);\n $location.search({c: centerHash}).replace();\n }\n // endRemoveIf(device)\n };\n\n /* -- help tip -- */\n\n // Show help tour\n $scope.startHelpTour = function() {\n return $scope.showHelpTip(0, true);\n };\n\n // Show help tip\n $scope.showHelpTip = function(index, isTour) {\n if (!isTour && !csWallet.isLogin()) return;\n\n index = angular.isDefined(index) ? index :\n (angular.isNumber(csSettings.data.helptip.mapwot) ? csSettings.data.helptip.mapwot : 0);\n isTour = angular.isDefined(isTour) ? isTour : false;\n\n if (index < 0 || index > 2/*max steps*/) return;\n\n // Create a new scope for the tour controller\n var helptipScope = $scope.createHelptipScope(isTour, 'MapHelpTipCtrl');\n if (!helptipScope) return; // could be undefined, if a global tour already is already started\n\n // Set isTour and mapId\n helptipScope.tour = isTour;\n helptipScope.mapId = $scope.mapId;\n\n return helptipScope.startMapWotTour(index, false)\n .then(function(endIndex) {\n helptipScope.$destroy();\n csSettings.data.helptip.mapwot = angular.isNumber(csSettings.data.helptip.mapwot) ?\n Math.max(endIndex, csSettings.data.helptip.mapwot) :\n endIndex;\n csSettings.store();\n });\n };\n}\n","\nMapRegistryViewController.$inject = ['$scope', '$filter', '$templateCache', '$interpolate', '$timeout', '$location', '$translate', '$q', 'ionicReady', 'leafletData', 'UIUtils', 'csSettings', 'csWallet', 'MapUtils', 'mapRegistry'];\nMapPageEditController.$inject = ['$scope', '$controller'];\nangular.module('cesium.map.registry.controllers', ['cesium.services', 'cesium.map.services', 'cesium.map.help.controllers', 'cesium.map.common.controllers'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n\n PluginServiceProvider\n\n .extendState('app.wot_lookup.tab_registry', {\n points: {\n 'nav-buttons': {\n template: '<button class=\"button button-icon button-clear\" ui-sref=\"app.view_registry_map\"><i class=\"icon ion-ios-location\"></i></button>'\n }\n }\n })\n\n .extendState('app.registry_lookup_lg', {\n points: {\n 'filter-buttons': {\n templateUrl: \"plugins/map/templates/registry/lookup_lg_extend.html\"\n }\n }\n })\n\n .extendState('app.registry_edit_record', {\n points: {\n 'after-position': {\n templateUrl: 'plugins/map/templates/common/edit_position_extend.html',\n controller: 'MapPageEditCtrl'\n }\n }\n });\n\n $stateProvider\n .state('app.view_registry_map', {\n url: \"/wot/pagemap?c¢er\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/map/templates/registry/view_map.html\",\n controller: 'MapRegistryViewCtrl'\n }\n },\n // Seems to works without cache ??\n //cache: false,\n data: {\n silentLocationChange: true\n }\n });\n }\n }])\n\n // Map view of the registry\n .controller('MapRegistryViewCtrl', MapRegistryViewController)\n\n .controller('MapPageEditCtrl', MapPageEditController)\n;\n\n\nfunction MapRegistryViewController($scope, $filter, $templateCache, $interpolate, $timeout, $location, $translate, $q,\n ionicReady, leafletData,\n UIUtils, csSettings, csWallet, MapUtils, mapRegistry) {\n 'ngInject';\n\n var\n // Create a hidden layer, to hold search markers\n markersSearchLayer,\n icons= {\n shop: {\n type: 'awesomeMarker',\n icon: 'page-shop',\n markerColor: 'blue'\n },\n company: {\n type: 'awesomeMarker',\n icon: 'page-company',\n markerColor: 'blue'\n },\n association: {\n type: 'awesomeMarker',\n icon: 'page-association',\n markerColor: 'lightgreen',\n iconColor: 'gray'\n },\n institution: {\n type: 'awesomeMarker',\n icon: 'page-institution',\n markerColor: 'lightgray'\n }\n };\n\n $scope.loading = true;\n $scope.loadingMarker = true;\n $scope.mapId = 'map-registry-' + $scope.$id;\n\n $scope.map = MapUtils.map({\n cache: 'map-registry',\n layers: {\n overlays: {\n // Pages\n shop: {\n type: 'featureGroup',\n name: 'MAP.REGISTRY.VIEW.LAYER.SHOP',\n visible: true\n },\n company: {\n type: 'featureGroup',\n name: 'MAP.REGISTRY.VIEW.LAYER.COMPANY',\n visible: true\n },\n association: {\n type: 'featureGroup',\n name: 'MAP.REGISTRY.VIEW.LAYER.ASSOCIATION',\n visible: true\n },\n institution: {\n type: 'featureGroup',\n name: 'MAP.REGISTRY.VIEW.LAYER.INSTITUTION',\n visible: true\n }\n }\n },\n bounds: {},\n markers: {},\n loading: true\n }, $scope.mapId);\n\n // Variables for marker\n $scope.formData = {};\n $scope.showDescription = false;\n ionicReady().then(function() {\n $scope.enableDescription = !UIUtils.screen.isSmall() && ionic.Platform.grade.toLowerCase() === 'a';\n if (!$scope.enableDescription) {\n console.debug(\"[map] [wot] Disable profile description.\", ionic.Platform.grade);\n }\n });\n\n $scope.$on('$ionicView.beforeEnter', function (event, viewData) {\n // Enable back button (workaround need for navigation outside tabs - https://stackoverflow.com/a/35064602)\n viewData.enableBack = UIUtils.screen.isSmall() ? true : viewData.enableBack;\n });\n\n $scope.enter = function(e, state) {\n\n if ($scope.loading) {\n if (state.stateParams && state.stateParams.c) {\n var cPart = state.stateParams.c.split(':');\n $scope.map.center.lat = parseFloat(cPart[0]);\n $scope.map.center.lng = parseFloat(cPart[1]);\n $scope.map.center.zoom = parseInt(cPart[2]);\n }\n\n $scope.$watch(\"map.center\", function() {\n if (!$scope.loading) {\n return $timeout(function() {\n $scope.updateLocationHref();\n }, 300);\n }\n }, true);\n\n // Load the map (and init if need)\n $scope.loadMap()\n .then(function() {\n if (csWallet.isLogin()) {\n $scope.showHelpTip();\n }\n return $scope.load();\n });\n }\n else {\n // Make sure to have previous center coordinate defined in the location URL\n $scope.updateLocationHref();\n if (csWallet.isLogin()) {\n $scope.showHelpTip();\n }\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.loadMap = function() {\n return $q.all([\n $translate(['COMMON.BTN_HELP_TOUR_SCREEN', 'COMMON.BTN_REFRESH', 'MAP.COMMON.BTN_LOCALIZE_ME']),\n leafletData.getMap($scope.mapId)\n ]).then(function(res) {\n var translations = res[0];\n var map = res[1];\n if (!$scope.map.loading) return map; // already loaded\n\n if (!UIUtils.screen.isSmall()) {\n\n // Add a refresh button\n L.easyButton({\n position: 'topright', // inherited from L.Control -- the corner it goes in\n type: 'replace', // set to animate when you're comfy with css\n leafletClasses: true, // use leaflet classes to style the button?\n states:[{ // specify different icons and responses for your button\n stateName: 'refresh',\n onClick: function(btn, map){\n return $scope.load(map);\n },\n title: translations['COMMON.BTN_REFRESH'],\n icon: 'icon ion-refresh'\n }]\n }\n ).addTo(map);\n }\n\n // Add loading control\n L.Control.loading({\n position: 'topright',\n separate: true\n }).addTo(map);\n\n // Add localize me control\n MapUtils.control.localizeMe({\n title: translations['MAP.COMMON.BTN_LOCALIZE_ME']\n })\n .addTo(map);\n\n // Add search control\n markersSearchLayer = L.layerGroup({visible: false});\n var searchTip = $interpolate($templateCache.get('plugins/map/templates/registry/item_search_tooltip.html'));\n MapUtils.control.search({\n layer: markersSearchLayer,\n propertyName: 'title',\n buildTip: function (text, val) {\n return searchTip(val.layer.options);\n },\n moveToLocation: function(lnglat, title, map) {\n if(this.options.zoom)\n this._map.setView(lnglat, this.options.zoom);\n else\n this._map.panTo(lnglat);\n var popupMarkerId = lnglat.layer && lnglat.layer.options && lnglat.layer.options.popupMarkerId;\n $timeout(function(){\n var popupMarker = popupMarkerId && _.find(map._layers, function(layer) {\n return (layer.options && layer.options.id === popupMarkerId);\n });\n if (popupMarker) popupMarker.openPopup();\n }, 400);\n },\n firstTipSubmit: true,\n tooltipLimit: 50\n }).addTo(map);\n\n // Add marker cluster layer\n var extractMarkerLayer = function(marker) {\n return marker.options && marker.options.layer;\n };\n var markerClusterLayer = L.markerClusterGroup({\n disableClusteringAtZoom: MapUtils.constants.LOCALIZE_ZOOM,\n maxClusterRadius: 65,\n showCoverageOnHover: false,\n iconCreateFunction: function (cluster) {\n var countByLayer = _.countBy(cluster.getAllChildMarkers(), extractMarkerLayer);\n var markerColor = countByLayer.shop||countByLayer.company ? 'blue' : (countByLayer.association ? 'lightgreen' : 'lightgray');\n var childCount = cluster.getChildCount();\n var className = 'marker-cluster ' + markerColor + ' marker-cluster-';\n if (childCount < 10) {\n className += 'small';\n } else if (childCount < 100) {\n className += 'medium';\n } else {\n className += 'large';\n }\n return L.divIcon({ html: '<div><span>' + childCount + '</span></div>', className: className, iconSize: new L.Point(40, 40) });\n }\n });\n map.eachLayer(function(layer) {\n // Add capabilities of 'featureGroup.subgroup', if layer is a group\n if (layer.addLayer){\n angular.extend(layer, L.featureGroup.subGroup(markerClusterLayer));\n }\n });\n markerClusterLayer.addTo(map);\n\n // Bind map with options (e.g. to received overlays visibility updates)\n // Cache no more need, as view is not cached\n //MapUtils.cache.bind($scope, $scope.mapId, $scope.map);\n\n $scope.map.loading = false;\n return map;\n });\n };\n\n // Load markers data\n $scope.load = function(map) {\n if (!map) {\n return leafletData.getMap($scope.mapId)\n // loop with the map object\n .then($scope.load);\n }\n\n $scope.loading = true;\n // Show loading indicator\n map.fire('dataloading');\n\n var options = {\n fields: {\n description: $scope.enableDescription\n }\n };\n\n // Load wot data, from service\n return mapRegistry.load(options)\n\n .then(function(res) {\n var markers = {};\n\n // Clean search layer\n markersSearchLayer.clearLayers();\n\n if (res && res.length) {\n\n var formatPubkey = $filter('formatPubkey');\n var pageMarkerTemplate = $templateCache.get('plugins/map/templates/registry/popup_marker.html');\n\n _.forEach(res, function (hit) {\n var shortPubkey = formatPubkey(hit.pubkey);\n var id = hit.index + '_' + (hit.id).replace(/-/g, '_');\n var marker = {\n layer: hit.type,\n icon: icons[hit.type],\n opacity: 1,\n title: hit.name + ' | ' + shortPubkey,\n lat: hit.geoPoint.lat,\n lng: hit.geoPoint.lon,\n getMessageScope: function () {\n var scope = $scope.$new();\n scope.loadingMarker = true;\n scope.formData = {};\n scope.$applyAsync(function() {\n angular.extend(scope.formData, hit);\n scope.loadingMarker = false;\n });\n return scope;\n },\n focus: false,\n message: pageMarkerTemplate,\n id: id\n };\n markers[id] = marker;\n\n // Create a search marker (will be hide)\n var searchText = hit.name + ' | ' + shortPubkey;\n var searchMarker = angular.merge({\n type: hit.type,\n opacity: 0,\n icon: L.divIcon({\n className: hit.type + ' ng-hide',\n iconSize: L.point(0, 0)\n })\n }, {title: searchText, pubkey: hit.pubkey, name: hit.name, popupMarkerId: id});\n markersSearchLayer.addLayer(new L.Marker({\n lat: hit.geoPoint.lat,\n lng: hit.geoPoint.lon\n },\n searchMarker));\n });\n }\n\n $scope.map.markers = markers;\n\n $scope.loading = false;\n\n // hide loading indicator\n map.fire('dataload');\n })\n .catch(function(err) {\n $scope.map.markers = {};\n $scope.loading = false;\n UIUtils.onError('MAP.WOT.ERROR.LOAD_POSITION_FAILED')(err);\n });\n };\n\n // Update the browser location, to be able to refresh the page\n $scope.updateLocationHref = function(centerHash) {\n // removeIf(device)\n var params = $location.search() || {};\n if (!params.c || !MapUtils.center.isDefault($scope.map.center)) {\n centerHash = centerHash || '{0}:{1}:{2}'.format($scope.map.center.lat.toFixed(4), $scope.map.center.lng.toFixed(4), $scope.map.center.zoom);\n $location.search({c: centerHash}).replace();\n }\n // endRemoveIf(device)\n };\n\n // removeIf(device)\n // Update the browser location, to be able to refresh the page\n // FIXME: not need, should be removed\n $scope.$on(\"centerUrlHash\", function(event, centerHash) {\n if (!$scope.loading) {\n\n return $timeout(function() {\n $scope.updateLocationHref(centerHash);\n }, 300);\n }\n });\n // endRemoveIf(device)\n\n\n /* -- help tip -- */\n\n // Show help tour\n $scope.startHelpTour = function() {\n return $scope.showHelpTip(0, true);\n };\n\n // Show help tip\n $scope.showHelpTip = function(index, isTour) {\n index = angular.isDefined(index) ? index :\n (angular.isNumber(csSettings.data.helptip.mapwot) ? csSettings.data.helptip.mapwot : 0);\n isTour = angular.isDefined(isTour) ? isTour : false;\n\n if (index < 0 || index > 2/*max steps*/) return;\n\n // Create a new scope for the tour controller\n var helptipScope = $scope.createHelptipScope(isTour, 'MapHelpTipCtrl');\n if (!helptipScope) return; // could be undefined, if a global tour already is already started\n\n // Set isTour and mapId\n helptipScope.tour = isTour;\n helptipScope.mapId = $scope.mapId;\n\n return helptipScope.startMapWotTour(index, false)\n .then(function(endIndex) {\n helptipScope.$destroy();\n csSettings.data.helptip.mapwot = angular.isNumber(csSettings.data.helptip.mapwot) ?\n Math.max(endIndex, csSettings.data.helptip.mapwot) :\n endIndex;\n csSettings.store();\n });\n };\n}\n\n\nfunction MapPageEditController($scope, $controller) {\n 'ngInject';\n\n $scope.mapId = 'map-page-' + $scope.$id;\n\n // Initialize the super classes and extend it.\n angular.extend(this, $controller('MapEditPositionAbstractCtrl', { $scope: $scope}));\n}\n","\nMapProfileEditController.$inject = ['$scope', '$controller'];\nangular.module('cesium.map.user.controllers', ['cesium.services', 'cesium.map.services', 'cesium.map.common.controllers'])\n\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n\n PluginServiceProvider\n\n .extendState('app.edit_profile', {\n points: {\n 'after-position': {\n templateUrl: 'plugins/map/templates/common/edit_position_extend.html',\n controller: 'MapProfileEditCtrl'\n }\n }\n })\n\n .extendState('app.edit_profile_by_id', {\n points: {\n 'after-position': {\n templateUrl: 'plugins/map/templates/common/edit_position_extend.html',\n controller: 'MapProfileEditCtrl'\n }\n }\n });\n }\n }])\n\n .controller('MapProfileEditCtrl', MapProfileEditController);\n\n\nfunction MapProfileEditController($scope, $controller) {\n 'ngInject';\n\n $scope.mapId = 'map-profile-' + $scope.$id;\n\n // Initialize the super classes and extend it.\n angular.extend(this, $controller('MapEditPositionAbstractCtrl', { $scope: $scope}));\n}\n","\nMapHelpTipController.$inject = ['$scope', '$controller'];\nangular.module('cesium.map.help.controllers', ['cesium.services'])\n\n .controller('MapHelpTipCtrl', MapHelpTipController)\n;\n\n\n/* ----------------------------\n* Help Tip\n* ---------------------------- */\nfunction MapHelpTipController($scope, $controller) {\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('HelpTipCtrl', {$scope: $scope}));\n\n $scope.mapId = undefined; // should be set by caller controllers\n\n /**\n * Features tour on map WOT\n * @returns {*}\n */\n $scope.startMapWotTour = function(startIndex, hasNext) {\n\n var steps = [\n\n function(){\n return $scope.showHelpTip('helptip-map-wot', {\n bindings: {\n content: 'MAP.HELP.TIP.WOT',\n icon: {\n position: 'center',\n glyph: 'ion-information-circled'\n }\n }\n });\n },\n\n function(){\n return $scope.showHelpTip(null, {\n selector: '#{0} .leaflet-control-search'.format($scope.mapId),\n bindings: {\n content: 'MAP.HELP.TIP.WOT_BTN_SEARCH',\n icon: {\n position: 'center'\n }\n }\n });\n },\n\n function () {\n return $scope.showHelpTip(null, {\n selector: '#{0} .leaflet-control-layers'.format($scope.mapId),\n bindings: {\n content: 'MAP.HELP.TIP.WOT_BTN_LAYERS',\n icon: {\n position: 'right'\n },\n hasNext: hasNext\n }\n });\n }\n ];\n\n // Launch steps\n return $scope.executeStep('mapwot', steps, startIndex);\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.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 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","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","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","\nangular.module('cesium.controllers', [\n 'cesium.app.controllers',\n 'cesium.join.controllers',\n 'cesium.login.controllers',\n 'cesium.help.controllers',\n 'cesium.wallet.controllers',\n 'cesium.wallets.controllers',\n 'cesium.currency.controllers',\n 'cesium.wot.controllers',\n 'cesium.transfer.controllers',\n 'cesium.settings.controllers',\n 'cesium.network.controllers',\n 'cesium.blockchain.controllers'\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","\nangular.module('cesium.plugins', [\n /* -- Generated plugin's modules -- */\n\n 'cesium.plugins.translations',\n 'cesium.plugins.templates',\n\n /* -- Plugins -- */\n\n // Graph plugin:\n // removeIf(ubuntu)\n // Graph should be disable for Ubuntu build - see issue #463\n 'cesium.graph.plugin',\n // endRemoveIf(ubuntu)\n\n // RML9 plugin:\n //'cesium.rml9.plugin',\n\n // ES plugin (Cesium+):\n 'cesium.es.plugin',\n\n // Map plugin (Cesium+):\n 'cesium.map.plugin'\n ])\n;\n","angular.module(\"cesium.plugins.translations\", []).config([\"$translateProvider\", function($translateProvider) {\n$translateProvider.translations(\"en-GB\", {\n \"COMMON\": {\n \"CATEGORY\": \"Category\",\n \"CATEGORIES\": \"Categories\",\n \"CATEGORY_SEARCH_HELP\": \"Search\",\n \"COMMENT_HELP\": \"Comments\",\n \"LAST_MODIFICATION_DATE\": \"Updated on \",\n \"SUBMIT_BY\": \"Submitted by\",\n \"BTN_LIKE\": \"I like\",\n \"BTN_LIKE_REMOVE\": \"I don't like anymore\",\n \"LIKES_TEXT\": \"{{total}} {{total > 1 ? 'people' : 'person'}} liked this page\",\n \"ABUSES_TEXT\": \"{{total}} {{total > 1 ? 'people' : 'person'}} reported a problem on this page\",\n \"BTN_REPORT_ABUSE_DOTS\": \"Report a problem or an abuse...\",\n \"BTN_REMOVE_REPORTED_ABUSE\": \"Cancel my problem report\",\n \"BTN_PUBLISH\": \"Publish\",\n \"BTN_PICTURE_DELETE\": \"Delete\",\n \"BTN_PICTURE_FAVORISE\": \"Default\",\n \"BTN_PICTURE_ROTATE\": \"Rotate\",\n \"BTN_ADD_PICTURE\": \"Add picture\",\n \"NOTIFICATION\": {\n \"TITLE\": \"New notification | {{'COMMON.APP_NAME'|translate}}\",\n \"HAS_UNREAD\": \"You have {{count}} unread notification{{count>0?'s':''}}\"\n },\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Notifications\",\n \"MARK_ALL_AS_READ\": \"Mark all as read\",\n \"NO_RESULT\": \"No notification\",\n \"SHOW_ALL\": \"Show all\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Could not load notifications\"\n },\n \"REPORT_ABUSE\": {\n \"TITLE\": \"Report a problem\",\n \"SUB_TITLE\": \"Please explain briefly the problem:\",\n \"REASON_HELP\": \"I explain the problem...\",\n \"ASK_DELETE\": \"Request removal?\",\n \"CONFIRM\": {\n \"SENT\": \"Request sent. Thnak you!\"\n }\n }\n },\n \"MENU\": {\n \"REGISTRY\": \"Pages\",\n \"USER_PROFILE\": \"My Profile\",\n \"MESSAGES\": \"Messages\",\n \"NOTIFICATIONS\": \"Notifications\",\n \"INVITATIONS\": \"Invitations\"\n },\n \"ACCOUNT\": {\n \"NEW\": {\n \"ORGANIZATION_ACCOUNT\": \"Account for an organization\",\n \"ORGANIZATION_ACCOUNT_HELP\": \"If you represent a company, association, etc.<br/>No universal dividend will be created by this account.\"\n },\n \"EVENT\": {\n \"MEMBER_WITHOUT_PROFILE\": \"You can <a ui-sref=\\\"app.edit_profile\\\">fill your Cesium+ profile</a> (optional) to provide better visibility of your account. This profile will be stored in <b>a directory independent</b> of the currency, but decentralized.\"\n },\n \"ERROR\": {\n \"WS_CONNECTION_FAILED\": \"Cesium can not receive notifications because of a technical error (connection to the Cesium + data node).<br/><br/>If the problem persists, please <b>choose another data node</b> in Cesium+ settings.\"\n }\n },\n \"WOT\": {\n \"BTN_SUGGEST_CERTIFICATIONS_DOTS\": \"Suggest identities to certify...\",\n \"BTN_ASK_CERTIFICATIONS_DOTS\": \"Ask members to certify me...\",\n \"BTN_ASK_CERTIFICATION\": \"Ask a certification\",\n \"SUGGEST_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Suggest certifications\",\n \"HELP\": \"Select your suggestions\"\n },\n \"ASK_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Ask certifications\",\n \"HELP\": \"Select recipients\"\n },\n \"SEARCH\": {\n \"DIVIDER_PROFILE\": \"Accounts\",\n \"DIVIDER_PAGE\": \"Pages\",\n \"DIVIDER_GROUP\": \"Groups\"\n },\n \"CONFIRM\": {\n \"SUGGEST_CERTIFICATIONS\": \"Are you sure you want <b>to send these certification suggestions</b>?\",\n \"ASK_CERTIFICATION\": \"Are you sure you want to <b>send a certification request</b>?\",\n \"ASK_CERTIFICATIONS\": \"Are you sure you want to <b>send a certification request</b> to these people?\"\n }\n },\n \"INVITATION\": {\n \"TITLE\": \"Invitations\",\n \"NO_RESULT\": \"No invitation received\",\n \"BTN_DELETE_ALL\": \"Delete all invitations\",\n \"BTN_DELETE\": \"Delete invitation\",\n \"BTN_NEW_INVITATION\": \"New invitation\",\n \"ASK_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> asks for your certification\",\n \"SUGGESTION_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{::pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> is suggested for certification\",\n \"SUGGESTED_BY\": \"Suggestion sent by <a class=\\\"positive\\\" href=\\\"#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}\\\">{{::issuer.name||issuer.uid}}</a>\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Invitations\"\n },\n \"LIST\": {\n \"TITLE\": \"Invitations\"\n },\n \"NEW\": {\n \"TITLE\": \"New invitation\",\n \"RECIPIENTS\": \"A\",\n \"RECIPIENTS_HELP\": \"Recipients of the invitation\",\n \"RECIPIENTS_MODAL_TITLE\": \"Recipients\",\n \"RECIPIENTS_MODAL_HELP\": \"Please choose recipients:\",\n \"SUGGESTION_IDENTITIES\": \"Suggestions for certification\",\n \"SUGGESTION_IDENTITIES_HELP\": \"Certifications to suggest\",\n \"SUGGESTION_IDENTITIES_MODAL_TITLE\": \"Suggestions\",\n \"SUGGESTION_IDENTITIES_MODAL_HELP\": \"Please choose your suggestions:\"\n },\n \"CONFIRM\": {\n \"DELETE_ALL_CONFIRMATION\": \"Removing invitations is <b>an irreversible operation</b>.<br/><br/><b>Are you sure</b> you want to continue\",\n \"SEND_INVITATIONS_TO_CERTIFY\": \"<b>Are you sure</b> you want <b>to sent this invitation to certify</b> ?\"\n },\n \"INFO\": {\n \"INVITATION_SENT\": \"Invitation sent\"\n },\n \"ERROR\": {\n \"LOAD_INVITATIONS_FAILED\": \"Error while loading invitations\",\n \"REMOVE_INVITATION_FAILED\": \"Error while deleting the invitation\",\n \"REMOVE_ALL_INVITATIONS_FAILED\": \"Error while deleting invitations\",\n \"SEND_INVITATION_FAILED\": \"Error while sending invitation\",\n \"BAD_INVITATION_FORMAT\": \"<span class=\\\"assertive\\\"><i class=\\\"ion-close-circled\\\"></i> Invitation unreadable (format unknown)</span> - sent by <a ui-sref=\\\"app.wot_identity({pubkey: '{{::pubkey}}', uid: '{{::uid}}' })\\\">{{::name||uid}}</a>\"\n }\n },\n \"COMMENTS\": {\n \"DIVIDER\": \"Comments\",\n \"SHOW_MORE_COMMENTS\": \"Show previous comments\",\n \"COMMENT_HELP\": \"Your comment, question...\",\n \"COMMENT_HELP_REPLY_TO\": \"Your answer...\",\n \"BTN_SEND\": \"Send\",\n \"POPOVER_SHARE_TITLE\": \"Message #{{number}}\",\n \"REPLY\": \"Reply\",\n \"REPLY_TO\": \"Respond to:\",\n \"REPLY_TO_LINK\": \"In response to \",\n \"REPLY_TO_DELETED_COMMENT\": \"In response to a deleted comment\",\n \"REPLY_COUNT\": \"{{replyCount}} responses\",\n \"DELETED_COMMENT\": \"Comment deleted\",\n \"MODIFIED_ON\": \"modified on {{time|formatDate}}\",\n \"MODIFIED_PARENTHESIS\": \"(modified then)\",\n \"ERROR\": {\n \"FAILED_SAVE_COMMENT\": \"Saving comment failed\",\n \"FAILED_REMOVE_COMMENT\": \"Deleting comment failed\"\n }\n },\n \"MESSAGE\": {\n \"REPLY_TITLE_PREFIX\": \"Re: \",\n \"FORWARD_TITLE_PREFIX\": \"Fw: \",\n \"BTN_REPLY\": \"Reply\",\n \"BTN_COMPOSE\": \"New message\",\n \"BTN_WRITE\": \"Write\",\n \"NO_MESSAGE_INBOX\": \"No message received\",\n \"NO_MESSAGE_OUTBOX\": \"No message sent\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Messages\",\n \"MESSAGE_RECEIVED\": \"You <b>received a message</b><br/>from\"\n },\n \"LIST\": {\n \"INBOX\": \"Inbox\",\n \"OUTBOX\": \"Outbox\",\n \"LAST_INBOX\": \"New messages\",\n \"LAST_OUTBOX\": \"Sent messages\",\n \"BTN_LAST_MESSAGES\": \"Recent messages\",\n \"TITLE\": \"Private messages\",\n \"SEARCH_HELP\": \"Search in messages\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Options\",\n \"DELETE_ALL\": \"Delete all messages\"\n }\n },\n \"COMPOSE\": {\n \"TITLE\": \"New message\",\n \"TITLE_REPLY\": \"Reply\",\n \"SUB_TITLE\": \"New message\",\n \"TO\": \"To\",\n \"OBJECT\": \"Object\",\n \"OBJECT_HELP\": \"Object\",\n \"ENCRYPTED_HELP\": \"Please note this message will be encrypted before sending so that only the recipient can read it and be sure you are the author.\",\n \"MESSAGE\": \"Message\",\n \"MESSAGE_HELP\": \"Message content\",\n \"CONTENT_CONFIRMATION\": \"No message content.<br/><br/>Are your sure you want to send this message?\"\n },\n \"VIEW\": {\n \"TITLE\": \"Message\",\n \"SENDER\": \"Sent by\",\n \"RECIPIENT\": \"Sent to\",\n \"NO_CONTENT\": \"Empty message\",\n \"DELETE\": \"Delete the message\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Are you sure you want to <b>delete this message</b>?<br/><br/> This operation is irreversible.\",\n \"REMOVE_ALL\": \"Are you sure you want to <b>delete all messages</b>?<br/><br/> This operation is irreversible.\",\n \"MARK_ALL_AS_READ\": \"Are you sure you want to <b>mark all message as read</b>?\",\n \"USER_HAS_NO_PROFILE\": \"This identity has no Cesium + profile. It may not use the Cesium + extension, so it <b>will not read your message</b>.<br/><br/>Are you sure you want <b>to continue</b>?\"\n },\n \"INFO\": {\n \"MESSAGE_REMOVED\": \"Message successfully deleted\",\n \"All_MESSAGE_REMOVED\": \"Messages successfully deleted\",\n \"MESSAGE_SENT\": \"Message sent\"\n },\n \"ERROR\": {\n \"SEND_MSG_FAILED\": \"Error while sending message.\",\n \"LOAD_MESSAGES_FAILED\": \"Error while loading messages.\",\n \"LOAD_MESSAGE_FAILED\": \"Error while loading message.\",\n \"MESSAGE_NOT_READABLE\": \"Unable to read message.\",\n \"USER_NOT_RECIPIENT\": \"You are not the recipient of this message: unable to read it.\",\n \"NOT_AUTHENTICATED_MESSAGE\": \"The authenticity of the message is not certain or its content is corrupted.\",\n \"REMOVE_MESSAGE_FAILED\": \"Error while deleting message\",\n \"MESSAGE_CONTENT_TOO_LONG\": \"Value too long ({{maxLength}} characters max).\",\n \"MARK_AS_READ_FAILED\": \"Unable to mark the message as 'read'.\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Error while loading messages notifications.\",\n \"REMOVE_All_MESSAGES_FAILED\": \"Error while removing all messages.\",\n \"MARK_ALL_AS_READ_FAILED\": \"Error while marking messages as read.\",\n \"RECIPIENT_IS_MANDATORY\": \"Recipient is mandatory.\"\n }\n },\n \"BLOCKCHAIN\": {\n \"LOOKUP\": {\n \"SEARCH_HELP\": \"Block number, hash...\",\n \"POPOVER_FILTER_TITLE\": \"Filter\",\n \"HEADER_MEDIAN_TIME\": \"Date / Time\",\n \"HEADER_BLOCK\": \"Block #\",\n \"HEADER_ISSUER\": \"Peer owner\",\n \"BTN_LAST\": \"Last blocks\",\n \"DISPLAY_QUERY\": \"View query\",\n \"HIDE_QUERY\": \"Hide query\",\n \"TX_SEARCH_FILTER\": {\n \"MEMBER_FLOWS\": \"<b class=\\\"ion-person\\\"></b> Members input/output\",\n \"EXISTING_TRANSACTION\": \"<b class=\\\"ion-card\\\"></b> Having transactions\",\n \"PERIOD\": \"<b class=\\\"ion-clock\\\"></b> Between <b class=\\\"gray\\\">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) and <b class=\\\"gray\\\">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})\",\n \"ISSUER\": \"<b class=\\\"ion-android-desktop\\\"></b> Computed by {{params[1]|formatPubkey}}\",\n \"TX_PUBKEY\": \"<b class=\\\"ion-card\\\"></b> Transactions concerning <b class=\\\"ion-key\\\"></b> {{params[1]|formatPubkey}}\"\n }\n },\n \"ERROR\": {\n \"SEARCH_BLOCKS_FAILED\": \"Error while searching blocks.\"\n }\n },\n \"REGISTRY\": {\n \"CATEGORY\": \"Main activity\",\n \"GENERAL_DIVIDER\": \"Basic information\",\n \"LOCATION_DIVIDER\": \"Address\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Social networks, web sites\",\n \"TECHNICAL_DIVIDER\": \"Technical data\",\n \"BTN_SHOW_WOT\": \"People\",\n \"BTN_SHOW_WOT_HELP\": \"Search for people\",\n \"BTN_SHOW_PAGES\": \"Pages\",\n \"BTN_SHOW_PAGES_HELP\": \"Search for pages\",\n \"BTN_NEW\": \"New page\",\n \"MY_PAGES\": \"My pages\",\n \"NO_PAGE\": \"No page\",\n \"SEARCH\": {\n \"TITLE\": \"Pages\",\n \"SEARCH_HELP\": \"What, Who: hairdresser, Lili's restaurant, ...\",\n \"BTN_ADD\": \"New\",\n \"BTN_LAST_RECORDS\": \"Recent pages\",\n \"BTN_ADVANCED_SEARCH\": \"Advanced search\",\n \"BTN_OPTIONS\": \"Advanced search\",\n \"TYPE\": \"Kind of organization\",\n \"LOCATION_HELP\": \"Where: City, Country\",\n \"RESULTS\": \"Results\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} result{{count>0?'s':''}}, near {{location}}\",\n \"RESULT_COUNT\": \"{{count}} result{{count>0?'s':''}}\",\n \"LAST_RECORDS\": \"Recent pages\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} recent page{{count>0?'s':''}}, near {{location}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} recent page{{count>0?'s':''}}\",\n \"POPOVER_FILTERS\": {\n \"BTN_ADVANCED_SEARCH\": \"Advanced options?\"\n }\n },\n \"VIEW\": {\n \"TITLE\": \"Registry\",\n \"CATEGORY\": \"Main activity:\",\n \"LOCATION\": \"Address:\",\n \"MENU_TITLE\": \"Options\",\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"REMOVE_CONFIRMATION\" : \"Are you sure you want to delete this reference?<br/><br/>This is irreversible.\"\n },\n \"TYPE\": {\n \"TITLE\": \"New page\",\n \"SELECT_TYPE\": \"Kind of organization:\",\n \"ENUM\": {\n \"SHOP\": \"Local shops\",\n \"COMPANY\": \"Company\",\n \"ASSOCIATION\": \"Association\",\n \"INSTITUTION\": \"Institution\"\n }\n },\n \"EDIT\": {\n \"TITLE\": \"Edit\",\n \"TITLE_NEW\": \"New page\",\n \"RECORD_TYPE\":\"Kind of organization\",\n \"RECORD_TITLE\": \"Name\",\n \"RECORD_TITLE_HELP\": \"Name\",\n \"RECORD_DESCRIPTION\": \"Description\",\n \"RECORD_DESCRIPTION_HELP\": \"Describe activity\",\n \"RECORD_ADDRESS\": \"Street\",\n \"RECORD_ADDRESS_HELP\": \"Street, building...\",\n \"RECORD_CITY\": \"City\",\n \"RECORD_CITY_HELP\": \"City, Country\",\n \"RECORD_SOCIAL_NETWORKS\": \"Social networks and web site\",\n \"RECORD_PUBKEY\": \"Public key\",\n \"RECORD_PUBKEY_HELP\": \"Public key to receive payments\"\n },\n \"WALLET\": {\n \"PAGE_DIVIDER\": \"Pages\",\n \"PAGE_DIVIDER_HELP\": \"Pages refer to activities accepting money or promoting it: local shops, companies, associations, institutions. They are stored outside the currency network, in <a ui-sref=\\\"app.es_network\\\">the Cesium+ network</a>.\"\n },\n \"ERROR\": {\n \"LOAD_CATEGORY_FAILED\": \"Loading main activities failed\",\n \"LOAD_RECORD_FAILED\": \"Loading failed\",\n \"LOOKUP_RECORDS_FAILED\": \"Error while loading records.\",\n \"REMOVE_RECORD_FAILED\": \"Deleting failed\",\n \"SAVE_RECORD_FAILED\": \"Saving failed\",\n \"RECORD_NOT_EXISTS\": \"Record not found\",\n \"GEO_LOCATION_NOT_FOUND\": \"City or zip code not found\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Page successfully deleted\",\n \"RECORD_SAVED\": \"Page successfully saved\"\n }\n },\n \"PROFILE\": {\n \"PROFILE_DIVIDER\": \"Cesium+ profile\",\n \"PROFILE_DIVIDER_HELP\": \"These are ancillary data, stored outside the currency network, in <a ui-sref=\\\"app.es_network\\\">the Cesium+ network</a>.\",\n \"NO_PROFILE_DEFINED\": \"No Cesium+ profile\",\n \"BTN_ADD\": \"Create my profile\",\n \"BTN_EDIT\": \"Edit my profile\",\n \"BTN_DELETE\": \"Delete my profile\",\n \"BTN_REORDER\": \"Reorder\",\n \"UID\": \"Pseudonym\",\n \"TITLE\": \"Lastname, FirstName\",\n \"TITLE_HELP\": \"Name\",\n \"DESCRIPTION\": \"About me\",\n \"DESCRIPTION_HELP\": \"About me...\",\n \"SOCIAL_HELP\": \"http://...\",\n \"GENERAL_DIVIDER\": \"General data\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Social networks and web site\",\n \"TECHNICAL_DIVIDER\": \"Technical data\",\n \"MODAL_AVATAR\": {\n \"TITLE\": \"Avatar\",\n \"SELECT_FILE_HELP\": \"<b>Choose an image file</b>:\",\n \"BTN_SELECT_FILE\": \"Choose an image\",\n \"RESIZE_HELP\": \"<b>Re-crop the image</b> if necessary. A click on the image allows to move it. Click on the area at the bottom left to zoom in.\",\n \"RESULT_HELP\": \"<b>Here is the result</b> as seen on your profile:\"\n },\n \"CONFIRM\": {\n \"DELETE\": \"Are you sure you want to <b>delete your Cesium+ profile ?</b><br/><br/>This operation is irreversible.\"\n },\n \"ERROR\": {\n \"REMOVE_PROFILE_FAILED\": \"Deleting profile failed\",\n \"LOAD_PROFILE_FAILED\": \"Could not load user profile.\",\n \"SAVE_PROFILE_FAILED\": \"Saving profile failed\",\n \"INVALID_SOCIAL_NETWORK_FORMAT\": \"Invalid format: please fill a valid Internet address.<br/><br/>Examples :<ul><li>- A Facebook page (https://www.facebook.com/user)</li><li>- A web page (http://www.domain.com)</li><li>- An email address (joe@dalton.com)</li></ul>\",\n \"IMAGE_RESIZE_FAILED\": \"Error while resizing picture\"\n },\n \"INFO\": {\n \"PROFILE_REMOVED\": \"Profile deleted\",\n \"PROFILE_SAVED\": \"Profile saved\"\n },\n \"HELP\": {\n \"WARNING_PUBLIC_DATA\": \"Please note that the information published here <b>is public</b>: visible including by <b>not logged in people</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}\"\n }\n },\n \"LOCATION\": {\n \"BTN_GEOLOC_ADDRESS\": \"Find my address on the map\",\n \"USE_GEO_POINT\": \"Appear on {{'COMMON.APP_NAME'|translate}} maps?\",\n \"LOADING_LOCATION\": \"Searching address...\",\n \"LOCATION_DIVIDER\": \"Localisation\",\n \"ADDRESS\": \"Address\",\n \"ADDRESS_HELP\": \"Address (optional)\",\n \"CITY\": \"City\",\n \"CITY_HELP\": \"City, Country\",\n \"DISTANCE\": \"Maximum distance around the city\",\n \"DISTANCE_UNIT\": \"mi\",\n \"DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"SEARCH_HELP\": \"City, Country\",\n \"PROFILE_POSITION\": \"Profile position\",\n \"MODAL\": {\n \"TITLE\": \"Search address\",\n \"SEARCH_HELP\": \"City, Country\",\n \"ALTERNATIVE_RESULT_DIVIDER\": \"Alternative results for <b>{{address}}</b>:\",\n \"POSITION\": \"lat/lon : {{lat}} / {{lon}}\"\n },\n \"ERROR\": {\n \"CITY_REQUIRED_IF_STREET\": \"Required if a street has been filled\",\n \"REQUIRED_FOR_LOCATION\": \"Required field to appear on the map\",\n \"INVALID_FOR_LOCATION\": \"Unknown address\",\n \"GEO_LOCATION_FAILED\": \"Unable to retrieve your current position. Please use the search button.\",\n \"ADDRESS_LOCATION_FAILED\": \"Unable to retrieve the address position\"\n }\n },\n \"SUBSCRIPTION\": {\n \"SUBSCRIPTION_DIVIDER\": \"Online services\",\n \"SUBSCRIPTION_DIVIDER_HELP\": \"Online services offer optional additional services, delegated to a third party.\",\n \"BTN_ADD\": \"Add a service\",\n \"BTN_EDIT\": \"Manage my services\",\n \"NO_SUBSCRIPTION\": \"No service defined\",\n \"SUBSCRIPTION_COUNT\": \"Services / Subscription\",\n \"EDIT\": {\n \"TITLE\": \"Online services\",\n \"HELP_TEXT\": \"Manage your subscriptions and other online services here\",\n \"PROVIDER\": \"Provider:\"\n },\n \"TYPE\": {\n \"ENUM\": {\n \"EMAIL\": \"Receive email notifications\"\n }\n },\n \"CONFIRM\": {\n \"DELETE_SUBSCRIPTION\": \"Are you sur you want to <b>delete this subscription</b>?\"\n },\n \"ERROR\": {\n \"LOAD_SUBSCRIPTIONS_FAILED\": \"Error while loading online services\",\n \"ADD_SUBSCRIPTION_FAILED\": \"Error while adding subscription\",\n \"UPDATE_SUBSCRIPTION_FAILED\": \"Error during subscription update\",\n \"DELETE_SUBSCRIPTION_FAILED\": \"Error while deleting subscription\"\n },\n \"MODAL_EMAIL\": {\n \"TITLE\" : \"Notification by email\",\n \"HELP\" : \"Fill out this form to <b>be notified by email</ b> of your account's events. <br/>Your email address will be encrypted only to be visible to the service provider.\",\n \"EMAIL_LABEL\" : \"Your email:\",\n \"EMAIL_HELP\": \"john@domain.com\",\n \"FREQUENCY_LABEL\": \"Frequency of notifications:\",\n \"FREQUENCY_DAILY\": \"Daily\",\n \"FREQUENCY_WEEKLY\": \"Weekly\",\n \"PROVIDER\": \"Service Provider:\"\n }\n },\n \"DOCUMENT\": {\n \"HASH\": \"Hash: \",\n \"LOOKUP\": {\n \"TITLE\": \"Document search\",\n \"BTN_ACTIONS\": \"Actions\",\n \"SEARCH_HELP\": \"issuer:AAA*, time:1508406169\",\n \"LAST_DOCUMENTS_DOTS\": \"Last documents:\",\n \"LAST_DOCUMENTS\": \"Last documents\",\n \"SHOW_QUERY\": \"Show query\",\n \"HIDE_QUERY\": \"Hide query\",\n \"HEADER_TIME\": \"Time/Hour\",\n \"HEADER_ISSUER\": \"Issuer\",\n \"HEADER_RECIPIENT\": \"Recipient\",\n \"READ\": \"Read\",\n \"BTN_REMOVE\": \"Delete this document\",\n \"BTN_COMPACT\": \"Compact\",\n \"HAS_CREATE_OR_UPDATE_PROFILE\": \"create or edit his profile\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Actions\",\n \"REMOVE_ALL\": \"Delete these documents...\"\n }\n },\n \"INFO\": {\n \"REMOVED\": \"Deleted document\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Are you sure you want to <b>delete this document</b>?\",\n \"REMOVE_ALL\": \"Are you sure you want to <b>delete these documents</b>?\"\n },\n \"ERROR\": {\n \"LOAD_DOCUMENTS_FAILED\": \"Error searching documents\",\n \"REMOVE_FAILED\": \"Error deleting the document\",\n \"REMOVE_ALL_FAILED\": \"Error deleting documents\"\n }\n },\n \"ES_SETTINGS\": {\n \"PLUGIN_NAME\": \"Cesium+\",\n \"PLUGIN_NAME_HELP\": \"User profiles, notifications, private messages\",\n \"ENABLE_TOGGLE\": \"Enable extension?\",\n \"ENABLE_REMOTE_STORAGE\": \"Enable remote storage for settings?\",\n \"ENABLE_REMOTE_STORAGE_HELP\": \"Enables (encrypted) storage of your settings on Cesium + nodes\",\n \"ENABLE_MESSAGE_TOGGLE\": \"Enable private messages?\",\n \"PEER\": \"Data peer address\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Data peer\",\n \"HELP\" : \"Set the address of the peer to use:\",\n \"PEER_HELP\": \"server.domain.com:port\"\n },\n \"NOTIFICATIONS\": {\n \"DIVIDER\": \"Notifications\",\n \"HELP_TEXT\": \"Enable the types of notifications you want to receive:\",\n \"ENABLE_TX_SENT\": \"Notify the validation of <b>sent payments</b>?\",\n \"ENABLE_TX_RECEIVED\": \"Notify the validation of <b>received payments</b>?\",\n \"ENABLE_CERT_SENT\": \"Notify the validation of <b>sent certifications</b>?\",\n \"ENABLE_CERT_RECEIVED\": \"Notify the validation of <b>received certifications</b>?\",\n \"ENABLE_HTML5_NOTIFICATION\": \"Warn with each new notification?\",\n \"ENABLE_HTML5_NOTIFICATION_HELP\": \"Opens a small popup window with each new notification.\"\n },\n \"CONFIRM\": {\n \"ASK_ENABLE_TITLE\": \"Optional features\",\n \"ASK_ENABLE\": \"Cesium+ extension is <b>disabled</b> in your settings, making some features inactive: <ul><li> <b><i class=\\\"icon ion-person\\\"></i> user profiles</b>;<li> <b><i class=\\\"icon ion-android-notifications\\\"></i> Notifications</b>;<li> <b><i class=\\\"icon ion-email\\\"></i> Private messages</b>.</ul><br/><br/><b>Do you want to enable</b> the extension?\"\n }\n },\n \"ES_WALLET\": {\n \"ERROR\": {\n \"RECIPIENT_IS_MANDATORY\": \"A recipient is required for encryption.\"\n },\n \"ES_PEER\": {\n \"NAME\": \"Name\",\n \"DOCUMENTS\": \"Documents\",\n \"SOFTWARE\": \"Software\",\n \"DOCUMENT_COUNT\": \"Number of documents\",\n \"EMAIL_SUBSCRIPTION_COUNT\": \"{{emailSubscription}} subscribers to email notification\"\n }\n },\n \"EVENT\": {\n \"NODE_STARTED\": \"Your node ES API <b>{{params[0]}}</b> is UP\",\n \"NODE_BMA_DOWN\": \"Node <b>{{params[0]}}:{{params[1]}}</b> (used by your ES API) is <b>unreachable</b>.\",\n \"NODE_BMA_UP\": \"Node <b>{{params[0]}}:{{params[1]}}</b> is reachable again.\",\n \"MEMBER_JOIN\": \"You are now a <b>member</b> of currency <b>{{params[0]}}</b>!\",\n \"MEMBER_LEAVE\": \"You are <b>not a member anymore</b> of currency <b>{{params[0]}}</b>!\",\n \"MEMBER_EXCLUDE\": \"You are <b>not more member</b> of the currency <b>{{params[0]}}</b>, for lack of renewal or lack of certifications.\",\n \"MEMBER_REVOKE\": \"Your account has been revoked. It will no longer be a member of the currency <b>{{params[0]}}</b>.\",\n \"MEMBER_ACTIVE\": \"Your membership to <b>{{params[0]}}</b> has been <b>renewed successfully</b>.\",\n \"TX_SENT\": \"Your payment to <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> was executed.\",\n \"TX_SENT_MULTI\": \"Your payment to <b>{{params[1]}}</b> was executed.\",\n \"TX_RECEIVED\": \"You received a payment from <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span>.\",\n \"TX_RECEIVED_MULTI\": \"You received a payment from <b>{{params[1]}}</b>.\",\n \"CERT_SENT\": \"Your <b>certification</b> to <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> was executed.\",\n \"CERT_RECEIVED\": \"You have <b>received a certification</b> from <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span>.\",\n \"USER\": {\n \"LIKE_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> like your profile\",\n \"FOLLOW_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> follows your activity\",\n \"STAR_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> rated you ({{params[3]}} <i class=\\\"ion-star\\\">)\",\n \"MODERATION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> asks you for a moderation on the profile: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> reported a profile to be deleted: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"ABUSE_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> has requested moderation on your profile\"\n },\n \"PAGE\": {\n \"NEW_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> has commented on your referencing: <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> has modified his comment on your referencing: <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> has replied to your comment on the referencing: <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> has modified his answer to your comment, on the referencing: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> has commented on the page: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> has modified his comment on the page: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> added a page: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> updated the page: <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> asks you for a moderation on the page: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> reported a page to be deleted: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"ABUSE_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> has requested moderation on your page: <b>{{params[2]}}</b>\"\n }\n },\n \"LIKE\": {\n \"ERROR\": {\n \"FAILED_TOGGLE_LIKE\": \"Unable to execute this action.\"\n }\n },\n \"CONFIRM\": {\n \"ES_USE_FALLBACK_NODE\": \"Data node <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the data node <b>{{new}}</b>?\"\n },\n \"ERROR\": {\n \"ES_CONNECTION_ERROR\": \"Data node <b>{{server}}</b> unreachable or invalid address.<br/><br/>Cesium will continue to work, <b>without the Cesium+</b> extension (user profiles, private messages, maps and graphics).<br/><br/>Check your Internet connection, or change data node in <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">extension settings</a>.\",\n \"ES_MAX_UPLOAD_BODY_SIZE\": \"The volume of data to be sent exceeds the limit set by the server.<br/><br/>Please try again after, for example, deleting photos.\"\n }\n}\n);\n\n$translateProvider.translations(\"en\", {\n \"COMMON\": {\n \"CATEGORY\": \"Category\",\n \"CATEGORIES\": \"Categories\",\n \"CATEGORY_SEARCH_HELP\": \"Search\",\n \"COMMENT_HELP\": \"Comments\",\n \"LAST_MODIFICATION_DATE\": \"Updated on \",\n \"SUBMIT_BY\": \"Submitted by\",\n \"BTN_LIKE\": \"I like\",\n \"BTN_LIKE_REMOVE\": \"I don't like anymore\",\n \"LIKES_TEXT\": \"{{total}} {{total > 1 ? 'people' : 'person'}} liked this page\",\n \"ABUSES_TEXT\": \"{{total}} {{total > 1 ? 'people' : 'person'}} reported a problem on this page\",\n \"BTN_REPORT_ABUSE_DOTS\": \"Report a problem or an abuse...\",\n \"BTN_REMOVE_REPORTED_ABUSE\": \"Cancel my problem report\",\n \"BTN_PUBLISH\": \"Publish\",\n \"BTN_PICTURE_DELETE\": \"Delete\",\n \"BTN_PICTURE_FAVORISE\": \"Default\",\n \"BTN_PICTURE_ROTATE\": \"Rotate\",\n \"BTN_ADD_PICTURE\": \"Add picture\",\n \"NOTIFICATION\": {\n \"TITLE\": \"New notification | {{'COMMON.APP_NAME'|translate}}\",\n \"HAS_UNREAD\": \"You have {{count}} unread notification{{count>0?'s':''}}\"\n },\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Notifications\",\n \"MARK_ALL_AS_READ\": \"Mark all as read\",\n \"NO_RESULT\": \"No notification\",\n \"SHOW_ALL\": \"Show all\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Could not load notifications\"\n },\n \"REPORT_ABUSE\": {\n \"TITLE\": \"Report a problem\",\n \"SUB_TITLE\": \"Please explain briefly the problem:\",\n \"REASON_HELP\": \"I explain the problem...\",\n \"ASK_DELETE\": \"Request removal?\",\n \"CONFIRM\": {\n \"SENT\": \"Request sent. Thnak you!\"\n }\n }\n },\n \"MENU\": {\n \"REGISTRY\": \"Pages\",\n \"USER_PROFILE\": \"My Profile\",\n \"MESSAGES\": \"Messages\",\n \"NOTIFICATIONS\": \"Notifications\",\n \"INVITATIONS\": \"Invitations\"\n },\n \"ACCOUNT\": {\n \"NEW\": {\n \"ORGANIZATION_ACCOUNT\": \"Account for an organization\",\n \"ORGANIZATION_ACCOUNT_HELP\": \"If you represent a company, association, etc.<br/>No universal dividend will be created by this account.\"\n },\n \"EVENT\": {\n \"MEMBER_WITHOUT_PROFILE\": \"You can <a ui-sref=\\\"app.edit_profile\\\">fill your Cesium+ profile</a> (optional) to provide better visibility of your account. This profile will be stored in <b>a directory independent</b> of the currency, but decentralized.\"\n },\n \"ERROR\": {\n \"WS_CONNECTION_FAILED\": \"Cesium can not receive notifications because of a technical error (connection to the Cesium + data node).<br/><br/>If the problem persists, please <b>choose another data node</b> in Cesium+ settings.\"\n }\n },\n \"WOT\": {\n \"BTN_SUGGEST_CERTIFICATIONS_DOTS\": \"Suggest identities to certify...\",\n \"BTN_ASK_CERTIFICATIONS_DOTS\": \"Ask members to certify me...\",\n \"BTN_ASK_CERTIFICATION\": \"Ask a certification\",\n \"SUGGEST_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Suggest certifications\",\n \"HELP\": \"Select your suggestions\"\n },\n \"ASK_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Ask certifications\",\n \"HELP\": \"Select recipients\"\n },\n \"SEARCH\": {\n \"DIVIDER_PROFILE\": \"Accounts\",\n \"DIVIDER_PAGE\": \"Pages\",\n \"DIVIDER_GROUP\": \"Groups\"\n },\n \"CONFIRM\": {\n \"SUGGEST_CERTIFICATIONS\": \"Are you sure you want <b>to send these certification suggestions</b>?\",\n \"ASK_CERTIFICATION\": \"Are you sure you want to <b>send a certification request</b>?\",\n \"ASK_CERTIFICATIONS\": \"Are you sure you want to <b>send a certification request</b> to these people?\"\n }\n },\n \"INVITATION\": {\n \"TITLE\": \"Invitations\",\n \"NO_RESULT\": \"No invitation received\",\n \"BTN_DELETE_ALL\": \"Delete all invitations\",\n \"BTN_DELETE\": \"Delete invitation\",\n \"BTN_NEW_INVITATION\": \"New invitation\",\n \"ASK_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> asks for your certification\",\n \"SUGGESTION_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{::pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> is suggested for certification\",\n \"SUGGESTED_BY\": \"Suggestion sent by <a class=\\\"positive\\\" href=\\\"#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}\\\">{{::issuer.name||issuer.uid}}</a>\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Invitations\"\n },\n \"LIST\": {\n \"TITLE\": \"Invitations\"\n },\n \"NEW\": {\n \"TITLE\": \"New invitation\",\n \"RECIPIENTS\": \"A\",\n \"RECIPIENTS_HELP\": \"Recipients of the invitation\",\n \"RECIPIENTS_MODAL_TITLE\": \"Recipients\",\n \"RECIPIENTS_MODAL_HELP\": \"Please choose recipients:\",\n \"SUGGESTION_IDENTITIES\": \"Suggestions for certification\",\n \"SUGGESTION_IDENTITIES_HELP\": \"Certifications to suggest\",\n \"SUGGESTION_IDENTITIES_MODAL_TITLE\": \"Suggestions\",\n \"SUGGESTION_IDENTITIES_MODAL_HELP\": \"Please choose your suggestions:\"\n },\n \"CONFIRM\": {\n \"DELETE_ALL_CONFIRMATION\": \"Removing invitations is <b>an irreversible operation</b>.<br/><br/><b>Are you sure</b> you want to continue\",\n \"SEND_INVITATIONS_TO_CERTIFY\": \"<b>Are you sure</b> you want <b>to sent this invitation to certify</b> ?\"\n },\n \"INFO\": {\n \"INVITATION_SENT\": \"Invitation sent\"\n },\n \"ERROR\": {\n \"LOAD_INVITATIONS_FAILED\": \"Error while loading invitations\",\n \"REMOVE_INVITATION_FAILED\": \"Error while deleting the invitation\",\n \"REMOVE_ALL_INVITATIONS_FAILED\": \"Error while deleting invitations\",\n \"SEND_INVITATION_FAILED\": \"Error while sending invitation\",\n \"BAD_INVITATION_FORMAT\": \"<span class=\\\"assertive\\\"><i class=\\\"ion-close-circled\\\"></i> Invitation unreadable (format unknown)</span> - sent by <a ui-sref=\\\"app.wot_identity({pubkey: '{{::pubkey}}', uid: '{{::uid}}' })\\\">{{::name||uid}}</a>\"\n }\n },\n \"COMMENTS\": {\n \"DIVIDER\": \"Comments\",\n \"SHOW_MORE_COMMENTS\": \"Show previous comments\",\n \"COMMENT_HELP\": \"Your comment, question...\",\n \"COMMENT_HELP_REPLY_TO\": \"Your answer...\",\n \"BTN_SEND\": \"Send\",\n \"POPOVER_SHARE_TITLE\": \"Message #{{number}}\",\n \"REPLY\": \"Reply\",\n \"REPLY_TO\": \"Respond to:\",\n \"REPLY_TO_LINK\": \"In response to \",\n \"REPLY_TO_DELETED_COMMENT\": \"In response to a deleted comment\",\n \"REPLY_COUNT\": \"{{replyCount}} responses\",\n \"DELETED_COMMENT\": \"Comment deleted\",\n \"MODIFIED_ON\": \"modified on {{time|formatDate}}\",\n \"MODIFIED_PARENTHESIS\": \"(modified then)\",\n \"ERROR\": {\n \"FAILED_SAVE_COMMENT\": \"Saving comment failed\",\n \"FAILED_REMOVE_COMMENT\": \"Deleting comment failed\"\n }\n },\n \"MESSAGE\": {\n \"REPLY_TITLE_PREFIX\": \"Re: \",\n \"FORWARD_TITLE_PREFIX\": \"Fw: \",\n \"BTN_REPLY\": \"Reply\",\n \"BTN_COMPOSE\": \"New message\",\n \"BTN_WRITE\": \"Write\",\n \"NO_MESSAGE_INBOX\": \"No message received\",\n \"NO_MESSAGE_OUTBOX\": \"No message sent\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Messages\",\n \"MESSAGE_RECEIVED\": \"You <b>received a message</b><br/>from\"\n },\n \"LIST\": {\n \"INBOX\": \"Inbox\",\n \"OUTBOX\": \"Outbox\",\n \"LAST_INBOX\": \"New messages\",\n \"LAST_OUTBOX\": \"Sent messages\",\n \"BTN_LAST_MESSAGES\": \"Recent messages\",\n \"TITLE\": \"Private messages\",\n \"SEARCH_HELP\": \"Search in messages\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Options\",\n \"DELETE_ALL\": \"Delete all messages\"\n }\n },\n \"COMPOSE\": {\n \"TITLE\": \"New message\",\n \"TITLE_REPLY\": \"Reply\",\n \"SUB_TITLE\": \"New message\",\n \"TO\": \"To\",\n \"OBJECT\": \"Object\",\n \"OBJECT_HELP\": \"Object\",\n \"ENCRYPTED_HELP\": \"Please note this message will be encrypted before sending so that only the recipient can read it and be sure you are the author.\",\n \"MESSAGE\": \"Message\",\n \"MESSAGE_HELP\": \"Message content\",\n \"CONTENT_CONFIRMATION\": \"No message content.<br/><br/>Are your sure you want to send this message?\"\n },\n \"VIEW\": {\n \"TITLE\": \"Message\",\n \"SENDER\": \"Sent by\",\n \"RECIPIENT\": \"Sent to\",\n \"NO_CONTENT\": \"Empty message\",\n \"DELETE\": \"Delete the message\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Are you sure you want to <b>delete this message</b>?<br/><br/> This operation is irreversible.\",\n \"REMOVE_ALL\": \"Are you sure you want to <b>delete all messages</b>?<br/><br/> This operation is irreversible.\",\n \"MARK_ALL_AS_READ\": \"Are you sure you want to <b>mark all message as read</b>?\",\n \"USER_HAS_NO_PROFILE\": \"This identity has no Cesium + profile. It may not use the Cesium + extension, so it <b>will not read your message</b>.<br/><br/>Are you sure you want <b>to continue</b>?\"\n },\n \"INFO\": {\n \"MESSAGE_REMOVED\": \"Message successfully deleted\",\n \"All_MESSAGE_REMOVED\": \"Messages successfully deleted\",\n \"MESSAGE_SENT\": \"Message sent\"\n },\n \"ERROR\": {\n \"SEND_MSG_FAILED\": \"Error while sending message.\",\n \"LOAD_MESSAGES_FAILED\": \"Error while loading messages.\",\n \"LOAD_MESSAGE_FAILED\": \"Error while loading message.\",\n \"MESSAGE_NOT_READABLE\": \"Unable to read message.\",\n \"USER_NOT_RECIPIENT\": \"You are not the recipient of this message: unable to read it.\",\n \"NOT_AUTHENTICATED_MESSAGE\": \"The authenticity of the message is not certain or its content is corrupted.\",\n \"REMOVE_MESSAGE_FAILED\": \"Error while deleting message\",\n \"MESSAGE_CONTENT_TOO_LONG\": \"Value too long ({{maxLength}} characters max).\",\n \"MARK_AS_READ_FAILED\": \"Unable to mark the message as 'read'.\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Error while loading messages notifications.\",\n \"REMOVE_All_MESSAGES_FAILED\": \"Error while removing all messages.\",\n \"MARK_ALL_AS_READ_FAILED\": \"Error while marking messages as read.\",\n \"RECIPIENT_IS_MANDATORY\": \"Recipient is mandatory.\"\n }\n },\n \"BLOCKCHAIN\": {\n \"LOOKUP\": {\n \"SEARCH_HELP\": \"Block number, hash...\",\n \"POPOVER_FILTER_TITLE\": \"Filter\",\n \"HEADER_MEDIAN_TIME\": \"Date / Time\",\n \"HEADER_BLOCK\": \"Block #\",\n \"HEADER_ISSUER\": \"Peer owner\",\n \"BTN_LAST\": \"Last blocks\",\n \"DISPLAY_QUERY\": \"View query\",\n \"HIDE_QUERY\": \"Hide query\",\n \"TX_SEARCH_FILTER\": {\n \"MEMBER_FLOWS\": \"<b class=\\\"ion-person\\\"></b> Members input/output\",\n \"EXISTING_TRANSACTION\": \"<b class=\\\"ion-card\\\"></b> Having transactions\",\n \"PERIOD\": \"<b class=\\\"ion-clock\\\"></b> Between <b class=\\\"gray\\\">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) and <b class=\\\"gray\\\">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})\",\n \"ISSUER\": \"<b class=\\\"ion-android-desktop\\\"></b> Computed by {{params[1]|formatPubkey}}\",\n \"TX_PUBKEY\": \"<b class=\\\"ion-card\\\"></b> Transactions concerning <b class=\\\"ion-key\\\"></b> {{params[1]|formatPubkey}}\"\n }\n },\n \"ERROR\": {\n \"SEARCH_BLOCKS_FAILED\": \"Error while searching blocks.\"\n }\n },\n \"REGISTRY\": {\n \"CATEGORY\": \"Main activity\",\n \"GENERAL_DIVIDER\": \"Basic information\",\n \"LOCATION_DIVIDER\": \"Address\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Social networks, web sites\",\n \"TECHNICAL_DIVIDER\": \"Technical data\",\n \"BTN_SHOW_WOT\": \"People\",\n \"BTN_SHOW_WOT_HELP\": \"Search for people\",\n \"BTN_SHOW_PAGES\": \"Pages\",\n \"BTN_SHOW_PAGES_HELP\": \"Search for pages\",\n \"BTN_NEW\": \"New page\",\n \"MY_PAGES\": \"My pages\",\n \"NO_PAGE\": \"No page\",\n \"SEARCH\": {\n \"TITLE\": \"Pages\",\n \"SEARCH_HELP\": \"What, Who: hairdresser, Lili's restaurant, ...\",\n \"BTN_ADD\": \"New\",\n \"BTN_LAST_RECORDS\": \"Recent pages\",\n \"BTN_ADVANCED_SEARCH\": \"Advanced search\",\n \"BTN_OPTIONS\": \"Advanced search\",\n \"TYPE\": \"Kind of organization\",\n \"LOCATION_HELP\": \"Where: City, Country\",\n \"RESULTS\": \"Results\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} result{{count>0?'s':''}}, near {{location}}\",\n \"RESULT_COUNT\": \"{{count}} result{{count>0?'s':''}}\",\n \"LAST_RECORDS\": \"Recent pages\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} recent page{{count>0?'s':''}}, near {{location}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} recent page{{count>0?'s':''}}\",\n \"POPOVER_FILTERS\": {\n \"BTN_ADVANCED_SEARCH\": \"Advanced options?\"\n }\n },\n \"VIEW\": {\n \"TITLE\": \"Registry\",\n \"CATEGORY\": \"Main activity:\",\n \"LOCATION\": \"Address:\",\n \"MENU_TITLE\": \"Options\",\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"REMOVE_CONFIRMATION\" : \"Are you sure you want to delete this reference?<br/><br/>This is irreversible.\"\n },\n \"TYPE\": {\n \"TITLE\": \"New page\",\n \"SELECT_TYPE\": \"Kind of organization:\",\n \"ENUM\": {\n \"SHOP\": \"Local shops\",\n \"COMPANY\": \"Company\",\n \"ASSOCIATION\": \"Association\",\n \"INSTITUTION\": \"Institution\"\n }\n },\n \"EDIT\": {\n \"TITLE\": \"Edit\",\n \"TITLE_NEW\": \"New page\",\n \"RECORD_TYPE\":\"Kind of organization\",\n \"RECORD_TITLE\": \"Name\",\n \"RECORD_TITLE_HELP\": \"Name\",\n \"RECORD_DESCRIPTION\": \"Description\",\n \"RECORD_DESCRIPTION_HELP\": \"Describe activity\",\n \"RECORD_ADDRESS\": \"Street\",\n \"RECORD_ADDRESS_HELP\": \"Street, building...\",\n \"RECORD_CITY\": \"City\",\n \"RECORD_CITY_HELP\": \"City, Country\",\n \"RECORD_SOCIAL_NETWORKS\": \"Social networks and web site\",\n \"RECORD_PUBKEY\": \"Public key\",\n \"RECORD_PUBKEY_HELP\": \"Public key to receive payments\"\n },\n \"WALLET\": {\n \"PAGE_DIVIDER\": \"Pages\",\n \"PAGE_DIVIDER_HELP\": \"Pages refer to activities accepting money or promoting it: local shops, companies, associations, institutions. They are stored outside the currency network, in <a ui-sref=\\\"app.es_network\\\">the Cesium+ network</a>.\"\n },\n \"ERROR\": {\n \"LOAD_CATEGORY_FAILED\": \"Loading main activities failed\",\n \"LOAD_RECORD_FAILED\": \"Loading failed\",\n \"LOOKUP_RECORDS_FAILED\": \"Error while loading records.\",\n \"REMOVE_RECORD_FAILED\": \"Deleting failed\",\n \"SAVE_RECORD_FAILED\": \"Saving failed\",\n \"RECORD_NOT_EXISTS\": \"Record not found\",\n \"GEO_LOCATION_NOT_FOUND\": \"City or zip code not found\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Page successfully deleted\",\n \"RECORD_SAVED\": \"Page successfully saved\"\n }\n },\n \"PROFILE\": {\n \"PROFILE_DIVIDER\": \"Cesium+ profile\",\n \"PROFILE_DIVIDER_HELP\": \"These are ancillary data, stored outside the currency network, in <a ui-sref=\\\"app.es_network\\\">the Cesium+ network</a>.\",\n \"NO_PROFILE_DEFINED\": \"No Cesium+ profile\",\n \"BTN_ADD\": \"Create my profile\",\n \"BTN_EDIT\": \"Edit my profile\",\n \"BTN_DELETE\": \"Delete my profile\",\n \"BTN_REORDER\": \"Reorder\",\n \"UID\": \"Pseudonym\",\n \"TITLE\": \"Lastname, FirstName\",\n \"TITLE_HELP\": \"Name\",\n \"DESCRIPTION\": \"About me\",\n \"DESCRIPTION_HELP\": \"About me...\",\n \"SOCIAL_HELP\": \"http://...\",\n \"GENERAL_DIVIDER\": \"General data\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Social networks and web site\",\n \"TECHNICAL_DIVIDER\": \"Technical data\",\n \"MODAL_AVATAR\": {\n \"TITLE\": \"Avatar\",\n \"SELECT_FILE_HELP\": \"<b>Choose an image file</b>:\",\n \"BTN_SELECT_FILE\": \"Choose an image\",\n \"RESIZE_HELP\": \"<b>Re-crop the image</b> if necessary. A click on the image allows to move it. Click on the area at the bottom left to zoom in.\",\n \"RESULT_HELP\": \"<b>Here is the result</b> as seen on your profile:\"\n },\n \"CONFIRM\": {\n \"DELETE\": \"Are you sure you want to <b>delete your Cesium+ profile ?</b><br/><br/>This operation is irreversible.\"\n },\n \"ERROR\": {\n \"REMOVE_PROFILE_FAILED\": \"Deleting profile failed\",\n \"LOAD_PROFILE_FAILED\": \"Could not load user profile.\",\n \"SAVE_PROFILE_FAILED\": \"Saving profile failed\",\n \"INVALID_SOCIAL_NETWORK_FORMAT\": \"Invalid format: please fill a valid Internet address.<br/><br/>Examples :<ul><li>- A Facebook page (https://www.facebook.com/user)</li><li>- A web page (http://www.domain.com)</li><li>- An email address (joe@dalton.com)</li></ul>\",\n \"IMAGE_RESIZE_FAILED\": \"Error while resizing picture\"\n },\n \"INFO\": {\n \"PROFILE_REMOVED\": \"Profile deleted\",\n \"PROFILE_SAVED\": \"Profile saved\"\n },\n \"HELP\": {\n \"WARNING_PUBLIC_DATA\": \"Please note that the information published here <b>is public</b>: visible including by <b>not logged in people</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}\"\n }\n },\n \"LOCATION\": {\n \"BTN_GEOLOC_ADDRESS\": \"Find my address on the map\",\n \"USE_GEO_POINT\": \"Appear on {{'COMMON.APP_NAME'|translate}} maps?\",\n \"LOADING_LOCATION\": \"Searching address...\",\n \"LOCATION_DIVIDER\": \"Localisation\",\n \"ADDRESS\": \"Address\",\n \"ADDRESS_HELP\": \"Address (optional)\",\n \"CITY\": \"City\",\n \"CITY_HELP\": \"City, Country\",\n \"DISTANCE\": \"Maximum distance around the city\",\n \"DISTANCE_UNIT\": \"mi\",\n \"DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"SEARCH_HELP\": \"City, Country\",\n \"PROFILE_POSITION\": \"Profile position\",\n \"MODAL\": {\n \"TITLE\": \"Search address\",\n \"SEARCH_HELP\": \"City, Country\",\n \"ALTERNATIVE_RESULT_DIVIDER\": \"Alternative results for <b>{{address}}</b>:\",\n \"POSITION\": \"lat/lon : {{lat}} / {{lon}}\"\n },\n \"ERROR\": {\n \"CITY_REQUIRED_IF_STREET\": \"Required if a street has been filled\",\n \"REQUIRED_FOR_LOCATION\": \"Required field to appear on the map\",\n \"INVALID_FOR_LOCATION\": \"Unknown address\",\n \"GEO_LOCATION_FAILED\": \"Unable to retrieve your current position. Please use the search button.\",\n \"ADDRESS_LOCATION_FAILED\": \"Unable to retrieve the address position\"\n }\n },\n \"SUBSCRIPTION\": {\n \"SUBSCRIPTION_DIVIDER\": \"Online services\",\n \"SUBSCRIPTION_DIVIDER_HELP\": \"Online services offer optional additional services, delegated to a third party.\",\n \"BTN_ADD\": \"Add a service\",\n \"BTN_EDIT\": \"Manage my services\",\n \"NO_SUBSCRIPTION\": \"No service defined\",\n \"SUBSCRIPTION_COUNT\": \"Services / Subscription\",\n \"EDIT\": {\n \"TITLE\": \"Online services\",\n \"HELP_TEXT\": \"Manage your subscriptions and other online services here\",\n \"PROVIDER\": \"Provider:\"\n },\n \"TYPE\": {\n \"ENUM\": {\n \"EMAIL\": \"Receive email notifications\"\n }\n },\n \"CONFIRM\": {\n \"DELETE_SUBSCRIPTION\": \"Are you sur you want to <b>delete this subscription</b>?\"\n },\n \"ERROR\": {\n \"LOAD_SUBSCRIPTIONS_FAILED\": \"Error while loading online services\",\n \"ADD_SUBSCRIPTION_FAILED\": \"Error while adding subscription\",\n \"UPDATE_SUBSCRIPTION_FAILED\": \"Error during subscription update\",\n \"DELETE_SUBSCRIPTION_FAILED\": \"Error while deleting subscription\"\n },\n \"MODAL_EMAIL\": {\n \"TITLE\" : \"Notification by email\",\n \"HELP\" : \"Fill out this form to <b>be notified by email</ b> of your account's events. <br/>Your email address will be encrypted only to be visible to the service provider.\",\n \"EMAIL_LABEL\" : \"Your email:\",\n \"EMAIL_HELP\": \"john@domain.com\",\n \"FREQUENCY_LABEL\": \"Frequency of notifications:\",\n \"FREQUENCY_DAILY\": \"Daily\",\n \"FREQUENCY_WEEKLY\": \"Weekly\",\n \"PROVIDER\": \"Service Provider:\"\n }\n },\n \"DOCUMENT\": {\n \"HASH\": \"Hash: \",\n \"LOOKUP\": {\n \"TITLE\": \"Document search\",\n \"BTN_ACTIONS\": \"Actions\",\n \"SEARCH_HELP\": \"issuer:AAA*, time:1508406169\",\n \"LAST_DOCUMENTS_DOTS\": \"Last documents:\",\n \"LAST_DOCUMENTS\": \"Last documents\",\n \"SHOW_QUERY\": \"Show query\",\n \"HIDE_QUERY\": \"Hide query\",\n \"HEADER_TIME\": \"Time/Hour\",\n \"HEADER_ISSUER\": \"Issuer\",\n \"HEADER_RECIPIENT\": \"Recipient\",\n \"READ\": \"Read\",\n \"BTN_REMOVE\": \"Delete this document\",\n \"BTN_COMPACT\": \"Compact\",\n \"HAS_CREATE_OR_UPDATE_PROFILE\": \"create or edit his profile\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Actions\",\n \"REMOVE_ALL\": \"Delete these documents...\"\n }\n },\n \"INFO\": {\n \"REMOVED\": \"Deleted document\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Are you sure you want to <b>delete this document</b>?\",\n \"REMOVE_ALL\": \"Are you sure you want to <b>delete these documents</b>?\"\n },\n \"ERROR\": {\n \"LOAD_DOCUMENTS_FAILED\": \"Error searching documents\",\n \"REMOVE_FAILED\": \"Error deleting the document\",\n \"REMOVE_ALL_FAILED\": \"Error deleting documents\"\n }\n },\n \"ES_SETTINGS\": {\n \"PLUGIN_NAME\": \"Cesium+\",\n \"PLUGIN_NAME_HELP\": \"User profiles, notifications, private messages\",\n \"ENABLE_TOGGLE\": \"Enable extension?\",\n \"ENABLE_REMOTE_STORAGE\": \"Enable remote storage for settings?\",\n \"ENABLE_REMOTE_STORAGE_HELP\": \"Enables (encrypted) storage of your settings on Cesium + nodes\",\n \"ENABLE_MESSAGE_TOGGLE\": \"Enable private messages?\",\n \"PEER\": \"Data peer address\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Data peer\",\n \"HELP\" : \"Set the address of the peer to use:\",\n \"PEER_HELP\": \"server.domain.com:port\"\n },\n \"NOTIFICATIONS\": {\n \"DIVIDER\": \"Notifications\",\n \"HELP_TEXT\": \"Enable the types of notifications you want to receive:\",\n \"ENABLE_TX_SENT\": \"Notify the validation of <b>sent payments</b>?\",\n \"ENABLE_TX_RECEIVED\": \"Notify the validation of <b>received payments</b>?\",\n \"ENABLE_CERT_SENT\": \"Notify the validation of <b>sent certifications</b>?\",\n \"ENABLE_CERT_RECEIVED\": \"Notify the validation of <b>received certifications</b>?\",\n \"ENABLE_HTML5_NOTIFICATION\": \"Warn with each new notification?\",\n \"ENABLE_HTML5_NOTIFICATION_HELP\": \"Opens a small popup window with each new notification.\"\n },\n \"CONFIRM\": {\n \"ASK_ENABLE_TITLE\": \"Optional features\",\n \"ASK_ENABLE\": \"Cesium+ extension is <b>disabled</b> in your settings, making some features inactive: <ul><li> <b><i class=\\\"icon ion-person\\\"></i> user profiles</b>;<li> <b><i class=\\\"icon ion-android-notifications\\\"></i> Notifications</b>;<li> <b><i class=\\\"icon ion-email\\\"></i> Private messages</b>.</ul><br/><br/><b>Do you want to enable</b> the extension?\"\n }\n },\n \"ES_WALLET\": {\n \"ERROR\": {\n \"RECIPIENT_IS_MANDATORY\": \"A recipient is required for encryption.\"\n },\n \"ES_PEER\": {\n \"NAME\": \"Name\",\n \"DOCUMENTS\": \"Documents\",\n \"SOFTWARE\": \"Software\",\n \"DOCUMENT_COUNT\": \"Number of documents\",\n \"EMAIL_SUBSCRIPTION_COUNT\": \"{{emailSubscription}} subscribers to email notification\"\n }\n },\n \"EVENT\": {\n \"NODE_STARTED\": \"Your node ES API <b>{{params[0]}}</b> is UP\",\n \"NODE_BMA_DOWN\": \"Node <b>{{params[0]}}:{{params[1]}}</b> (used by your ES API) is <b>unreachable</b>.\",\n \"NODE_BMA_UP\": \"Node <b>{{params[0]}}:{{params[1]}}</b> is reachable again.\",\n \"MEMBER_JOIN\": \"You are now a <b>member</b> of currency <b>{{params[0]}}</b>!\",\n \"MEMBER_LEAVE\": \"You are <b>not a member anymore</b> of currency <b>{{params[0]}}</b>!\",\n \"MEMBER_EXCLUDE\": \"You are <b>not more member</b> of the currency <b>{{params[0]}}</b>, for lack of renewal or lack of certifications.\",\n \"MEMBER_REVOKE\": \"Your account has been revoked. It will no longer be a member of the currency <b>{{params[0]}}</b>.\",\n \"MEMBER_ACTIVE\": \"Your membership to <b>{{params[0]}}</b> has been <b>renewed successfully</b>.\",\n \"TX_SENT\": \"Your payment to <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> was executed.\",\n \"TX_SENT_MULTI\": \"Your payment to <b>{{params[1]}}</b> was executed.\",\n \"TX_RECEIVED\": \"You received a payment from <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span>.\",\n \"TX_RECEIVED_MULTI\": \"You received a payment from <b>{{params[1]}}</b>.\",\n \"CERT_SENT\": \"Your <b>certification</b> to <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> was executed.\",\n \"CERT_RECEIVED\": \"You have <b>received a certification</b> from <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span>.\",\n \"USER\": {\n \"LIKE_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> like your profile\",\n \"FOLLOW_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> follows your activity\",\n \"STAR_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> rated you ({{params[3]}} <i class=\\\"ion-star\\\">)\",\n \"MODERATION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> asks you for a moderation on the profile: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> reported a profile to be deleted: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"ABUSE_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> has requested moderation on your profile\"\n },\n \"PAGE\": {\n \"NEW_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> has commented on your referencing: <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> has modified his comment on your referencing: <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> has replied to your comment on the referencing: <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> has modified his answer to your comment, on the referencing: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> has commented on the page: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> has modified his comment on the page: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> added a page: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> updated the page: <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> asks you for a moderation on the page: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> reported a page to be deleted: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"ABUSE_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> has requested moderation on your page: <b>{{params[2]}}</b>\"\n }\n },\n \"LIKE\": {\n \"ERROR\": {\n \"FAILED_TOGGLE_LIKE\": \"Unable to execute this action.\"\n }\n },\n \"CONFIRM\": {\n \"ES_USE_FALLBACK_NODE\": \"Data node <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the data node <b>{{new}}</b>?\"\n },\n \"ERROR\": {\n \"ES_CONNECTION_ERROR\": \"Data node <b>{{server}}</b> unreachable or invalid address.<br/><br/>Cesium will continue to work, <b>without the Cesium+</b> extension (user profiles, private messages, maps and graphics).<br/><br/>Check your Internet connection, or change data node in <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">extension settings</a>.\",\n \"ES_MAX_UPLOAD_BODY_SIZE\": \"The volume of data to be sent exceeds the limit set by the server.<br/><br/>Please try again after, for example, deleting photos.\"\n }\n}\n);\n\n$translateProvider.translations(\"eo-EO\", {\n \"COMMON\": {\n \"CATEGORY\": \"Kategorio\",\n \"CATEGORIES\": \"Kategorioj\",\n \"CATEGORY_SEARCH_HELP\": \"Serĉado\",\n \"COMMENT_HELP\": \"Komento\",\n \"LAST_MODIFICATION_DATE\": \"Ĝisdatigita la\",\n \"SUBMIT_BY\": \"Submetita de\",\n \"BTN_LIKE\": \"Mi ŝatas\",\n \"LIKES_TEXT\": \"{{total}} persono{{total > 1 ? 'j' : ''}} ŝatis tiun ĉi paĝon\",\n \"ABUSES_TEXT\": \"{{total}} persono{{total > 1 ? 'j' : ''}} atentigis pri problemo\",\n \"BTN_REPORT_ABUSE_DOTS\": \"Atentigi pri problemo aŭ misuzo...\",\n \"BTN_REMOVE_REPORTED_ABUSE\": \"Nuligi mian atentigon\",\n \"BTN_PUBLISH\": \"Publikigi\",\n \"BTN_PICTURE_DELETE\": \"Forigi\",\n \"BTN_PICTURE_FAVORISE\": \"Precipa\",\n \"BTN_PICTURE_ROTATE\": \"Turni\",\n \"BTN_ADD_PICTURE\": \"Aldoni foton\",\n \"NOTIFICATION\": {\n \"TITLE\": \"Nova avizo | {{'COMMON.APP_NAME'|translate}}\",\n \"HAS_UNREAD\": \"Vi havas {{count}} avizo{{count>0?'j':''}}n ne legita{{count>0?'j':''}}n\"\n },\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Avizoj\",\n \"MARK_ALL_AS_READ\": \"Ĉion marki legita\",\n \"NO_RESULT\": \"Neniu avizo\",\n \"SHOW_ALL\": \"Vidi ĉion\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Malsukceso por ŝarĝi la avizojn\"\n },\n \"REPORT_ABUSE\": {\n \"TITLE\": \"Atentigi pri problemo\",\n \"SUB_TITLE\": \"Bonvolu klarigi rapide la problemon:\",\n \"REASON_HELP\": \"Mi klarigas la problemon...\",\n \"ASK_DELETE\": \"Peti la forigon?\",\n \"CONFIRM\": {\n \"SENT\": \"Atentigo sendita. Dankon!\"\n }\n }\n },\n \"MENU\": {\n \"REGISTRY\": \"Paĝoj\",\n \"USER_PROFILE\": \"Mia profilo\",\n \"MESSAGES\": \"Mesaĝoj\",\n \"NOTIFICATIONS\": \"Avizoj\",\n \"INVITATIONS\": \"Invitoj\"\n },\n \"ACCOUNT\": {\n \"NEW\": {\n \"ORGANIZATION_ACCOUNT\": \"Konto por organizaĵo\",\n \"ORGANIZATION_ACCOUNT_HELP\": \"Se vi reprezentas entreprenon, asocion, ktp.<br/>Neniu universala dividendo estos kreita per tiu ĉi konto.\"\n },\n \"EVENT\": {\n \"MEMBER_WITHOUT_PROFILE\": \"Vi povas <a ui-sref=\\\"app.edit_profile\\\">tajpi vian profilon Cesium+</a> (kromebleco) por disponi pli bonan videblecon por via konto.\"\n },\n \"ERROR\": {\n \"WS_CONNECTION_FAILED\": \"Cesium ne povas ricevi la avizojn pro teknika eraro (konekto al la daten-nodo Cesium+).<br/><br/>Se la problemo daŭradas, bonvolu <b>elekti alian daten-nodon</b> ĉe la parametroj Cesium+.\"\n }\n },\n \"WOT\": {\n \"BTN_SUGGEST_CERTIFICATIONS_DOTS\": \"Sugesti identecojn atestotajn...\",\n \"BTN_ASK_CERTIFICATIONS_DOTS\": \"Peti membrojn atesti min...\",\n \"BTN_ASK_CERTIFICATION\": \"Peti atestaĵon\",\n \"SUGGEST_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Sugesti atestadojn\",\n \"HELP\": \"Elekti viajn sugestojn\"\n },\n \"ASK_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Peti atestaĵojn\",\n \"HELP\": \"Elekti la ricevontojn\"\n },\n \"SEARCH\": {\n \"DIVIDER_PROFILE\": \"Kontoj\",\n \"DIVIDER_PAGE\": \"Paĝoj\",\n \"DIVIDER_GROUP\": \"Grupoj\"\n },\n \"CONFIRM\": {\n \"SUGGEST_CERTIFICATIONS\": \"Ĉu vi certas, ke vi volas <b>sendi tiujn sugestojn por atestado</b>?\",\n \"ASK_CERTIFICATION\": \"Ĉu vi certas, ke vi volas <b>sendi atesto-peton</b>?\",\n \"ASK_CERTIFICATIONS\": \"Ĉu vi certas, ke vi volas <b>sendi atesto-peton</b> al tiuj personoj?\"\n }\n },\n \"INVITATION\": {\n \"TITLE\": \"Invitoj\",\n \"NO_RESULT\": \"Neniu invito atendanta\",\n \"BTN_DELETE_ALL\": \"Forigi ĉiujn invitojn\",\n \"BTN_DELETE\": \"Forigi la inviton\",\n \"BTN_NEW_INVITATION\": \"Nova invito\",\n \"ASK_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> petas vian atestadon\",\n \"SUGGESTION_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{::pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> estas sugestita al vi por atestado\",\n \"SUGGESTED_BY\": \"Sugesto sendita de <a class=\\\"positive\\\" href=\\\"#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}\\\">{{::issuer.name||issuer.uid}}</a>\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Invitoj\"\n },\n \"LIST\": {\n \"TITLE\": \"Invitoj\"\n },\n \"NEW\": {\n \"TITLE\": \"Nova invito\",\n \"RECIPIENTS\": \"Al\",\n \"RECIPIENTS_HELP\": \"Ricevontoj de la invito\",\n \"RECIPIENTS_MODAL_TITLE\": \"Ricevontoj\",\n \"RECIPIENTS_MODAL_HELP\": \"Bonvolu elekti la ricevontojn:\",\n \"SUGGESTION_IDENTITIES\": \"Sugestoj por atestado\",\n \"SUGGESTION_IDENTITIES_HELP\": \"Atestadoj sugestotaj\",\n \"SUGGESTION_IDENTITIES_MODAL_TITLE\": \"Sugestoj\",\n \"SUGGESTION_IDENTITIES_MODAL_HELP\": \"Bonvolu elekti viajn sugestojn:\"\n },\n \"CONFIRM\": {\n \"DELETE_ALL_CONFIRMATION\": \"La forigo de la invitoj estas <b>neinversigebla ago</b>.<br/><br/><b>Ĉu vi certas</b>, ke vi volas daŭrigi?\",\n \"SEND_INVITATIONS_TO_CERTIFY\": \"Ĉu vi certas, ke vi volas <b>sendi tiun inviton atestotan</b>?\"\n },\n \"INFO\": {\n \"INVITATION_SENT\": \"Invito sendita\"\n },\n \"ERROR\": {\n \"LOAD_INVITATIONS_FAILED\": \"Malsukceso por ŝarĝi la invitojn\",\n \"REMOVE_INVITATION_FAILED\": \"Eraro dum la forigo de la invito\",\n \"REMOVE_ALL_INVITATIONS_FAILED\": \"Eraro dum la forigo de la invitoj\",\n \"SEND_INVITATION_FAILED\": \"Eraro dum la sendo de la invito\",\n \"BAD_INVITATION_FORMAT\": \"<span class=\\\"assertive\\\"><i class=\\\"ion-close-circled\\\"></i> Invito nelegebla (strukturo nekonata)</span> - sendita de <a ui-sref=\\\"app.wot_identity({pubkey: '{{::pubkey}}', uid: '{{::uid}}' })\\\">{{::name||uid}}</a>\"\n }\n },\n \"COMMENTS\": {\n \"DIVIDER\": \"Komentoj\",\n \"SHOW_MORE_COMMENTS\": \"Afiŝi la antaŭajn komentojn\",\n \"COMMENT_HELP\": \"Via komento, demando, ktp.\",\n \"COMMENT_HELP_REPLY_TO\": \"Via respondo...\",\n \"BTN_SEND\": \"Sendi\",\n \"POPOVER_SHARE_TITLE\": \"Mesaĝo #{{number}}\",\n \"REPLY\": \"Respondi\",\n \"REPLY_TO\": \"Respondo al:\",\n \"REPLY_TO_LINK\": \"Responde al \",\n \"REPLY_TO_DELETED_COMMENT\": \"Responde al forigita komento\",\n \"REPLY_COUNT\": \"{{replyCount}} respondoj\",\n \"DELETED_COMMENT\": \"Komento forigita\",\n \"MODIFIED_ON\": \"modifita la {{time|formatDate}}\",\n \"MODIFIED_PARENTHESIS\": \"(modifita poste)\",\n \"ERROR\": {\n \"FAILED_SAVE_COMMENT\": \"Eraro dum la konservo de la komento\",\n \"FAILED_REMOVE_COMMENT\": \"Eraro dum la forigo de la komento\"\n }\n },\n \"MESSAGE\": {\n \"REPLY_TITLE_PREFIX\": \"Resp: \",\n \"FORWARD_TITLE_PREFIX\": \"Tr: \",\n \"BTN_REPLY\": \"Respondi\",\n \"BTN_COMPOSE\": \"Nova mesaĝo\",\n \"BTN_WRITE\": \"Skribi\",\n \"NO_MESSAGE_INBOX\": \"Neniu mesaĝo ricevita\",\n \"NO_MESSAGE_OUTBOX\": \"Neniu mesaĝo sendita\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Mesaĝoj\",\n \"MESSAGE_RECEIVED\": \"Vi <b>ricevis mesaĝon</b><br/>de\"\n },\n \"LIST\": {\n \"INBOX\": \"Ricevujo\",\n \"OUTBOX\": \"Senditaj mesaĝoj\",\n \"LAST_INBOX\": \"Novaj mesaĝoj\",\n \"LAST_OUTBOX\": \"Senditaj mesaĝoj\",\n \"BTN_LAST_MESSAGES\": \"Freŝdataj mesaĝoj\",\n \"TITLE\": \"Mesaĝoj\",\n \"SEARCH_HELP\": \"Serĉado en la mesaĝoj\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Kromaĵoj\",\n \"DELETE_ALL\": \"Forigi ĉiujn mesaĝojn\"\n }\n },\n \"COMPOSE\": {\n \"TITLE\": \"Nova mesaĝo\",\n \"TITLE_REPLY\": \"Respondi\",\n \"SUB_TITLE\": \"Nova mesaĝo\",\n \"TO\": \"Al\",\n \"OBJECT\": \"Temo\",\n \"OBJECT_HELP\": \"Temo\",\n \"ENCRYPTED_HELP\": \"Bonvolu noti, ke tiu ĉi mesaĝo estos ĉifrita antaŭ sendo, tiel ke nur la adresato povos legi ĝin, kaj ke li estos certa, ke vi ja estas ties aŭtoro.\",\n \"MESSAGE\": \"Mesaĝo\",\n \"MESSAGE_HELP\": \"Enhavo de la mesaĝo\",\n \"CONTENT_CONFIRMATION\": \"La enhavo de la mesaĝo estas malplena.<br/><br/>Ĉu vi volas tamen sendi la mesaĝon?\"\n },\n \"VIEW\": {\n \"TITLE\": \"Mesaĝo\",\n \"SENDER\": \"Sendita de\",\n \"RECIPIENT\": \"Sendita al\",\n \"NO_CONTENT\": \"Mesaĝo malplena\",\n \"DELETE\": \"Forigi la mesaĝon\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Ĉu vi certas, ke vi volas <b>forigi tiun ĉi mesaĝon</b>?<br/><br/>Tiu ago estas neinversigebla.\",\n \"REMOVE_ALL\" : \"Ĉu vi certas, ke vi volas <b>forigi ĉiujn mesaĝojn</b>?<br/><br/>Tiu ago estas neinversigebla.\",\n \"MARK_ALL_AS_READ\": \"Ĉu vi certas, ke vi volas <b>marki ĉiujn mesaĝojn legitaj</b>?\",\n \"USER_HAS_NO_PROFILE\": \"Tiu identeco havas neniun profilon Cesium+. Eblas ke ĝi ne uzas la krom-programon Cesium+, kaj <b>do ne legos vian mesaĝon</b>.<br/><br/>Ĉu vi certas, ke vi volas tamen <b>daŭrigi</b>?\"\n },\n \"INFO\": {\n \"MESSAGE_REMOVED\": \"Mesaĝo forigita\",\n \"All_MESSAGE_REMOVED\": \"Ĉiuj mesaĝoj estis forigitaj\",\n \"MESSAGE_SENT\": \"Mesaĝo sendita\"\n },\n \"ERROR\": {\n \"SEND_MSG_FAILED\": \"Eraro dum la sendo de la mesaĝo.\",\n \"LOAD_MESSAGES_FAILED\": \"Eraro dum la ricevo de la mesaĝoj.\",\n \"LOAD_MESSAGE_FAILED\": \"Eraro dum la ricevo de la mesaĝo.\",\n \"MESSAGE_NOT_READABLE\": \"Legado de la mesaĝo neebla.\",\n \"USER_NOT_RECIPIENT\": \"Vi ne estas la adresato de tiu ĉi mesaĝo: malĉifrado neebla.\",\n \"NOT_AUTHENTICATED_MESSAGE\": \"La aŭtenteco de la mesaĝo estas dubinda aŭ ties enhavo estas difektita.\",\n \"REMOVE_MESSAGE_FAILED\": \"Malsukceso por forigi la mesaĝon\",\n \"MESSAGE_CONTENT_TOO_LONG\": \"Signaro tro longa ({{maxLength}} signoj maksimume).\",\n \"MARK_AS_READ_FAILED\": \"Neeblas marki la mesaĝon 'legita'.\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Eraro dum la ricevo de la mesaĝo-avizoj.\",\n \"REMOVE_All_MESSAGES_FAILED\": \"Eraro dum la forigo de ĉiuj mesaĝoj.\",\n \"MARK_ALL_AS_READ_FAILED\": \"Eraro por marki la mesaĝojn legitaj.\",\n \"RECIPIENT_IS_MANDATORY\": \"La adresato estas deviga.\"\n }\n },\n \"BLOCKCHAIN\": {\n \"LOOKUP\": {\n \"SEARCH_HELP\": \"Numero de bloko, haketo, publika ŝlosilo, ktp.\",\n \"POPOVER_FILTER_TITLE\": \"Filtriloj\",\n \"HEADER_MEDIAN_TIME\": \"Dato / Horo\",\n \"HEADER_BLOCK\": \"Bloko #\",\n \"HEADER_ISSUER\": \"Nodo elsendinta\",\n \"BTN_LAST\": \"Lastaj blokoj\",\n \"DISPLAY_QUERY\": \"Afiŝi la informpeton\",\n \"HIDE_QUERY\": \"Kaŝi la informpeton\",\n \"TX_SEARCH_FILTER\": {\n \"MEMBER_FLOWS\": \"<b class=\\\"ion-person\\\"></b> Eniroj/eliroj de membroj\",\n \"EXISTING_TRANSACTION\": \"<b class=\\\"ion-card\\\"></b> Kun spezoj\",\n \"PERIOD\": \"<b class=\\\"ion-clock\\\"></b> Inter <b class=\\\"gray\\\">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) kaj <b class=\\\"gray\\\">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})\",\n \"ISSUER\": \"<b class=\\\"ion-android-desktop\\\"></b> Kalkulita de <b class=\\\"ion-key\\\"></b> {{params[1]|formatPubkey}}\",\n \"TX_PUBKEY\": \"<b class=\\\"ion-card\\\"></b> Spezoj koncernantaj <b class=\\\"ion-key\\\"></b> {{params[1]|formatPubkey}}\"\n }\n },\n \"ERROR\": {\n \"SEARCH_BLOCKS_FAILED\": \"Eraro dum la serĉado de la blokoj.\"\n }\n },\n \"GROUP\": {\n \"GENERAL_DIVIDER\": \"Ĝeneralaj informoj\",\n \"LOCATION_DIVIDER\": \"Adreso\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Sociaj retoj kaj retejo\",\n \"TECHNICAL_DIVIDER\": \"Teknikaj informoj\",\n \"CREATED_TIME\": \"Kreita {{creationTime|formatFromNow}}\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Invitoj\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Grupoj\",\n \"SEARCH_HELP\": \"Nomo de grupo, vortoj, loko, ktp.\",\n \"LAST_RESULTS_LIST\": \"Novaj grupoj:\",\n \"OPEN_RESULTS_LIST\": \"Malfermitaj grupoj:\",\n \"MANAGED_RESULTS_LIST\": \"Fermitaj grupoj:\",\n \"BTN_LAST\": \"Novaj grupoj\",\n \"BTN_NEW\": \"Mi aldonas grupon\"\n },\n \"TYPE\": {\n \"TITLE\": \"Nova grupo\",\n \"SELECT_TYPE\": \"Tipo de grupo:\",\n \"OPEN_GROUP\": \"Malfermita grupo\",\n \"OPEN_GROUP_HELP\": \"Malfermita grupo estas alirebla de iu ajn membro de la mono.\",\n \"MANAGED_GROUP\": \"Administrita grupo\",\n \"MANAGED_GROUP_HELP\": \"Administrita grupo estas mastrumata de administrantoj kaj moderigantoj, kiuj povas akcepti, rifuzi aŭ eksigi membron.\",\n \"ENUM\": {\n \"OPEN\": \"Malfermita grupo\",\n \"MANAGED\": \"Administrita grupo\"\n }\n },\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"MENU_TITLE\": \"Kromaĵoj\",\n \"REMOVE_CONFIRMATION\" : \"Ĉu vi certas, ke vi volas forigi tiun ĉi grupon?<br/><br/>Tiu ago estas neinversigebla.\"\n },\n \"EDIT\": {\n \"TITLE\": \"Grupo\",\n \"TITLE_NEW\": \"Nova grupo\",\n \"RECORD_TITLE\": \"Titolo\",\n \"RECORD_TITLE_HELP\": \"Titolo\",\n \"RECORD_DESCRIPTION\": \"Priskribo\",\n \"RECORD_DESCRIPTION_HELP\": \"Priskribo\"\n },\n \"ERROR\": {\n \"SEARCH_GROUPS_FAILED\": \"Malsukceso por traserĉi grupojn\",\n \"REMOVE_RECORD_FAILED\": \"Malsukceso por forigi la grupon\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Grupo forigita\"\n }\n },\n \"REGISTRY\": {\n \"CATEGORY\": \"Ĉefa agado\",\n \"GENERAL_DIVIDER\": \"Ĝeneralaj informoj\",\n \"LOCATION_DIVIDER\": \"Adreso\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Sociaj retoj kaj retejo\",\n \"TECHNICAL_DIVIDER\": \"Teknikaj informoj\",\n \"BTN_SHOW_WOT\": \"Personoj\",\n \"BTN_SHOW_WOT_HELP\": \"Traserĉi personojn\",\n \"BTN_SHOW_PAGES\": \"Paĝoj\",\n \"BTN_SHOW_PAGES_HELP\": \"Traserĉi paĝojn\",\n \"BTN_NEW\": \"Krei paĝon\",\n \"MY_PAGES\": \"Miaj paĝoj\",\n \"NO_PAGE\": \"Neniu paĝo\",\n \"SEARCH\": {\n \"TITLE\": \"Paĝoj\",\n \"SEARCH_HELP\": \"Kio, Kiu: restoracio, Ĉe Marcelo, ...\",\n \"BTN_ADD\": \"Nova\",\n \"BTN_LAST_RECORDS\": \"Freŝdataj paĝoj\",\n \"BTN_ADVANCED_SEARCH\": \"Sperta serĉado\",\n \"BTN_OPTIONS\": \"Sperta serĉado\",\n \"TYPE\": \"Tipo de paĝo\",\n \"LOCATION_HELP\": \"Kie: Poŝto-kodo, Urbo\",\n \"RESULTS\": \"Rezultoj\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} rezulto{{count>0?'j':''}}, proksime de {{location}}\",\n \"RESULT_COUNT\": \"{{count}} rezulto{{count>0?'j':''}}\",\n \"LAST_RECORDS\": \"Freŝdataj paĝoj\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} paĝo{{count>0?'j':''}} freŝdata{{count>0?'j':''}}, proksime de {{location}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} paĝo{{count>0?'j':''}} freŝdata{{count>0?'j':''}}\",\n \"POPOVER_FILTERS\": {\n \"BTN_ADVANCED_SEARCH\": \"Spertaj kromaĵoj?\"\n }\n },\n \"VIEW\": {\n \"TITLE\": \"Adresaro\",\n \"CATEGORY\": \"Ĉefa agado:\",\n \"LOCATION\": \"Adreso:\",\n \"MENU_TITLE\": \"Kromaĵoj\",\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"REMOVE_CONFIRMATION\" : \"Ĉu vi certas, ke vi volas forigi tiun ĉi paĝon?<br/><br/>Tiu ago estas neinversigebla.\"\n },\n \"TYPE\": {\n \"TITLE\": \"Tipoj\",\n \"SELECT_TYPE\": \"Tipo de paĝo:\",\n \"ENUM\": {\n \"SHOP\": \"Loka komerco\",\n \"COMPANY\": \"Entrepreno\",\n \"ASSOCIATION\": \"Asocio\",\n \"INSTITUTION\": \"Institucio\"\n }\n },\n \"EDIT\": {\n \"TITLE\": \"Redaktado\",\n \"TITLE_NEW\": \"Nova paĝo\",\n \"RECORD_TYPE\":\"Tipo de paĝo\",\n \"RECORD_TITLE\": \"Nomo\",\n \"RECORD_TITLE_HELP\": \"Nomo\",\n \"RECORD_DESCRIPTION\": \"Priskribo\",\n \"RECORD_DESCRIPTION_HELP\": \"Priskribo de la agado\",\n \"RECORD_ADDRESS\": \"Strato\",\n \"RECORD_ADDRESS_HELP\": \"Strato, konstruaĵo...\",\n \"RECORD_CITY\": \"Urbo\",\n \"RECORD_CITY_HELP\": \"Urbo\",\n \"RECORD_SOCIAL_NETWORKS\": \"Sociaj retoj kaj retejo\",\n \"RECORD_PUBKEY\": \"Publika ŝlosilo\",\n \"RECORD_PUBKEY_HELP\": \"Publika ŝlosilo por ricevi la pagojn\"\n },\n \"WALLET\": {\n \"PAGE_DIVIDER\": \"Paĝoj\",\n \"PAGE_DIVIDER_HELP\": \"La paĝoj listigas agadojn, kiuj akceptas la liberan monon aŭ helpas ĝin: komercoj, entreprenoj, asocioj, institucioj.\"\n },\n \"ERROR\": {\n \"LOAD_CATEGORY_FAILED\": \"Malsukceso por ŝarĝi la liston de la agadoj\",\n \"LOAD_RECORD_FAILED\": \"Eraro dum la ŝarĝado de la paĝo\",\n \"LOOKUP_RECORDS_FAILED\": \"Eraro dum la serĉado\",\n \"REMOVE_RECORD_FAILED\": \"Malsukceso por forigi la paĝon\",\n \"SAVE_RECORD_FAILED\": \"Eraro dum la konservado\",\n \"RECORD_NOT_EXISTS\": \"Paĝo neekzistanta\",\n \"GEO_LOCATION_NOT_FOUND\": \"Urbo aŭ poŝto-kodo ne trovita\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Paĝo forigita\",\n \"RECORD_SAVED\": \"Paĝo konservita\"\n }\n },\n \"PROFILE\": {\n \"PROFILE_DIVIDER\": \"Profilo Cesium+\",\n \"PROFILE_DIVIDER_HELP\": \"Temas pri kromaj datenoj, stokitaj ekster la mon-reto.\",\n \"NO_PROFILE_DEFINED\": \"Neniu profilo tajpita\",\n \"BTN_ADD\": \"Tajpi mian profilon\",\n \"BTN_EDIT\": \"Redakti mian profilon\",\n \"BTN_DELETE\": \"Forigi mian profilon\",\n \"BTN_REORDER\": \"Reordigi\",\n \"UID\": \"Pseŭdonimo\",\n \"TITLE\": \"Familia nomo, Persona nomo\",\n \"TITLE_HELP\": \"Familia nomo, Persona nomo\",\n \"DESCRIPTION\": \"Pri mi\",\n \"DESCRIPTION_HELP\": \"Pri mi...\",\n \"SOCIAL_HELP\": \"http://...\",\n \"GENERAL_DIVIDER\": \"Ĝeneralaj informoj\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Sociaj retoj, retejoj\",\n \"TECHNICAL_DIVIDER\": \"Teknikaj informoj\",\n \"MODAL_AVATAR\": {\n \"TITLE\": \"Profil-foto\",\n \"SELECT_FILE_HELP\": \"Bonvolu <b>elekti bildo-dosieron</b>:\",\n \"BTN_SELECT_FILE\": \"Elekti foton\",\n \"RESIZE_HELP\": \"<b>Rekadri la bildon</b>, laŭbezone. Pluigi klakon sur la bildo ebligas movi ĝin. Alklaku la zonon malsupre maldekstre por zomi.\",\n \"RESULT_HELP\": \"<b>Jen la rezulto</b> tiel videbla ĉe via profilo:\"\n },\n \"CONFIRM\": {\n \"DELETE\": \"Ĉu vi certas, ke vi volas <b>forigi vian profilon Cesium+ ?</b><br/><br/>Tiu ago estas neinversigebla.\"\n },\n \"ERROR\": {\n \"REMOVE_PROFILE_FAILED\": \"Malsukceso por forigi la profilon\",\n \"LOAD_PROFILE_FAILED\": \"Malsukceso por ŝarĝi la profilon de la uzanto.\",\n \"SAVE_PROFILE_FAILED\": \"Eraro dum la konservado\",\n \"INVALID_SOCIAL_NETWORK_FORMAT\": \"Strukturo ne rekonata: bonvolu tajpi validan adreson.<br/><br/>Ezemploj:<ul><li>- Facebook-paĝo (https://www.facebook.com/uzanto)</li><li>- Retpaĝo (http://www.miaretejo.net)</li><li>- Retadreso (joe@dalton.com)</li></ul>\",\n \"IMAGE_RESIZE_FAILED\": \"Eraro dum la reformatigo de la bildo\"\n },\n \"INFO\": {\n \"PROFILE_REMOVED\": \"Profilo forigita\",\n \"PROFILE_SAVED\": \"Profilo konservita\"\n },\n \"HELP\": {\n \"WARNING_PUBLIC_DATA\": \"La informoj afiŝitaj en via profilo <b>estas publikaj</b>: videblaj inkluzive de la personoj <b>ne konektitaj</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}\"\n }\n },\n \"LOCATION\": {\n \"BTN_GEOLOC_ADDRESS\": \"Trovi mian adreson surmape\",\n \"USE_GEO_POINT\": \"Aperi sur la mapoj {{'COMMON.APP_NAME'|translate}}?\",\n \"LOADING_LOCATION\": \"Serĉado de la adreso...\",\n \"LOCATION_DIVIDER\": \"Adreso\",\n \"ADDRESS\": \"Strato\",\n \"ADDRESS_HELP\": \"Strato, adres-aldonaĵo...\",\n \"CITY\": \"Urbo\",\n \"CITY_HELP\": \"Poŝto-kodo, Urbo, Lando\",\n \"DISTANCE\": \"Maksimuma distanco ĉirkaŭ la urbo\",\n \"DISTANCE_UNIT\": \"km\",\n \"DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"SEARCH_HELP\": \"Poŝto-kodo, Urbo\",\n \"PROFILE_POSITION\": \"Loko de la profilo\",\n \"MODAL\": {\n \"TITLE\": \"Serĉado de la adreso\",\n \"SEARCH_HELP\": \"Urbo, Poŝto-kodo, Lando\",\n \"ALTERNATIVE_RESULT_DIVIDER\": \"Alternativaj rezultoj por <b>{{address}}</b>:\",\n \"POSITION\": \"Lat/Lon: {{lat}}/{{lon}}\"\n },\n \"ERROR\": {\n \"CITY_REQUIRED_IF_STREET\": \"Deviga kampo (ĉar strato estas tajpita)\",\n \"REQUIRED_FOR_LOCATION\": \"Deviga kampo por aperi sur la mapo\",\n \"INVALID_FOR_LOCATION\": \"Adreso nekonata\",\n \"GEO_LOCATION_FAILED\": \"Neeblas ricevi vian lokiĝon. Bonvolu uzi la serĉo-butonon.\",\n \"ADDRESS_LOCATION_FAILED\": \"Neeblas ricevi la lokon per la adreso\"\n }\n },\n \"SUBSCRIPTION\": {\n \"SUBSCRIPTION_DIVIDER\": \"Retaj servoj\",\n \"SUBSCRIPTION_DIVIDER_HELP\": \"La retaj servoj proponas pliajn nedevigajn servojn, delegitajn al aliulo.\",\n \"BTN_ADD\": \"Aldoni servon\",\n \"BTN_EDIT\": \"Mastrumi miajn servojn\",\n \"NO_SUBSCRIPTION\": \"Neniu servo uzata\",\n \"SUBSCRIPTION_COUNT\": \"Servoj / Abonoj\",\n \"EDIT\": {\n \"TITLE\": \"Retaj servoj\",\n \"HELP_TEXT\": \"Mastrumu ĉi tie viajn abonojn kaj aliajn retajn servojn\",\n \"PROVIDER\": \"Provizanto:\"\n },\n \"TYPE\": {\n \"ENUM\": {\n \"EMAIL\": \"Ricevi la avizojn per retmesaĝo\"\n }\n },\n \"CONFIRM\": {\n \"DELETE_SUBSCRIPTION\": \"Ĉu vi certas, ke vi volas <b>forigi tiun abonon</b>?\"\n },\n \"ERROR\": {\n \"LOAD_SUBSCRIPTIONS_FAILED\": \"Eraro dum la ŝarĝo de la retaj servoj\",\n \"ADD_SUBSCRIPTION_FAILED\": \"Malsukceso por sendi la abonon\",\n \"UPDATE_SUBSCRIPTION_FAILED\": \"Malsukceso por ĝisdatigi la abonon\",\n \"DELETE_SUBSCRIPTION_FAILED\": \"Eraro dum la forigo de la abono\"\n },\n \"MODAL_EMAIL\": {\n \"TITLE\" : \"Avizo per retmesaĝo\",\n \"HELP\" : \"Plenigu tiun ĉi formularon por <b>esti avizita per retmesaĝo</b> pri la okazaĵoj ĉe via konto.<br/>Via retadreso estos ĉifrita por esti videbla nur de la servo-provizanto.\",\n \"EMAIL_LABEL\" : \"Via retadreso:\",\n \"EMAIL_HELP\": \"johano.stelaro@esperanto.org\",\n \"FREQUENCY_LABEL\": \"Periodo de la avizoj:\",\n \"FREQUENCY_DAILY\": \"Ĉiutaga\",\n \"FREQUENCY_WEEKLY\": \"Ĉiusemajna\",\n \"PROVIDER\": \"Servo-provizanto:\"\n }\n },\n \"DOCUMENT\": {\n \"HASH\": \"Haketo: \",\n \"LOOKUP\": {\n \"TITLE\": \"Serĉado de dokumentoj\",\n \"BTN_ACTIONS\": \"Agoj\",\n \"SEARCH_HELP\": \"Sendanto:AAA*, tempo:1508406169\",\n \"LAST_DOCUMENTS_DOTS\": \"Lastaj dokumentoj:\",\n \"LAST_DOCUMENTS\": \"Lastaj dokumentoj\",\n \"SHOW_QUERY\": \"Vidi la informpeton\",\n \"HIDE_QUERY\": \"Kaŝi la informpeton\",\n \"HEADER_TIME\": \"Dato/Horo\",\n \"HEADER_ISSUER\": \"Sendanto\",\n \"HEADER_RECIPIENT\": \"Ricevonto\",\n \"READ\": \"Legita\",\n \"BTN_REMOVE\": \"Forigi tiun ĉi dokumenton\",\n \"BTN_COMPACT\": \"Densigi\",\n \"HAS_CREATE_OR_UPDATE_PROFILE\": \"kreis aŭ modifis sian profilon\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Agoj\",\n \"REMOVE_ALL\": \"Forigi tiujn ĉi dokumentojn...\"\n }\n },\n \"INFO\": {\n \"REMOVED\": \"Dokumento forigita\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Ĉu vi certas, ke vi volas <b>forigi tiun ĉi dokumenton</b>?\",\n \"REMOVE_ALL\": \"Ĉu vi certas, ke vi volas <b>forigi tiujn ĉi dokumentojn</b>?\"\n },\n \"ERROR\": {\n \"LOAD_DOCUMENTS_FAILED\": \"Eraro dum la serĉado de dokumentoj\",\n \"REMOVE_FAILED\": \"Eraro dum la forigo de la dokumento\",\n \"REMOVE_ALL_FAILED\": \"Eraro dum la forigo de la dokumentoj\"\n }\n },\n \"ES_SETTINGS\": {\n \"PLUGIN_NAME\": \"Cesium+\",\n \"PLUGIN_NAME_HELP\": \"Profiloj, avizoj, privataj mesaĝoj\",\n \"ENABLE_TOGGLE\": \"Aktivigi la krom-programon?\",\n \"ENABLE_REMOTE_STORAGE\": \"Aktivigi la foran stokadon?\",\n \"ENABLE_REMOTE_STORAGE_HELP\": \"Ebligas stoki (ĉifrite) viajn parametrojn ĉe la nodoj Cesium+\",\n \"ENABLE_MESSAGE_TOGGLE\": \"Aktivigi la privatajn mesaĝojn?\",\n \"PEER\": \"Adreso de la daten-nodo\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Daten-nodo\",\n \"HELP\" : \"Tajpu la adreson de la nodo, kiun vi volas uzi:\",\n \"PEER_HELP\": \"servo.domajno.com:port\"\n },\n \"NOTIFICATIONS\": {\n \"DIVIDER\": \"Avizoj\",\n \"HELP_TEXT\": \"Aktivigu la avizo-tipojn, kiujn vi deziras ricevi:\",\n \"ENABLE_TX_SENT\": \"Avizi pri la <b>senditaj pagoj</b>?\",\n \"ENABLE_TX_RECEIVED\": \"Avizi pri la <b>ricevitaj pagoj</b>?\",\n \"ENABLE_CERT_SENT\": \"Avizi pri la <b>senditaj atestaĵoj</b>?\",\n \"ENABLE_CERT_RECEIVED\": \"Avizi pri <b>la ricevitaj atestaĵoj</b>?\",\n \"ENABLE_HTML5_NOTIFICATION\": \"Anonci ĉiun novan avizon?\",\n \"ENABLE_HTML5_NOTIFICATION_HELP\": \"Malfermas fenestreton por ĉiu nova avizo.\"\n },\n \"CONFIRM\": {\n \"ASK_ENABLE_TITLE\": \"Kromaj funkcioj\",\n \"ASK_ENABLE\": \"La krom-programo Cesium+ estas <b>malaktivigita</b> ĉe viaj parametroj, kio senaktivigas la funkciojn: <ul><li> <b><i class=\\\"icon ion-person\\\"></i> Profiloj Cesium+</b>;<li> <b><i class=\\\"icon ion-android-notifications\\\"></i> Avizoj</b>;<li> <b><i class=\\\"icon ion-email\\\"></i> Privataj mesaĝoj</b>.<li> <b><i class=\\\"icon ion-location\\\"></i> Mapoj, ktp.</b>.</ul><br/><b>Ĉu vi deziras reaktivigi</b> la krom-programon?\"\n }\n },\n \"ES_WALLET\": {\n \"ERROR\": {\n \"RECIPIENT_IS_MANDATORY\": \"Adresito estas deviga por la ĉifrado.\"\n }\n },\n \"ES_PEER\": {\n \"NAME\": \"Nomo\",\n \"DOCUMENTS\": \"Dokumentoj\",\n \"SOFTWARE\": \"Programo\",\n \"DOCUMENT_COUNT\": \"Nombro de dokumentoj\",\n \"EMAIL_SUBSCRIPTION_COUNT\": \"{{emailSubscription}} abonantoj pri avizoj per retmesaĝoj\"\n },\n \"EVENT\": {\n \"NODE_STARTED\": \"Via nodo ES API <b>{{params[0]}}</b> ekis\",\n \"NODE_BMA_DOWN\": \"La nodo <b>{{params[0]}}:{{params[1]}}</b> (uzata de via nodo ES API) estas <b>neatingebla</b>.\",\n \"NODE_BMA_UP\": \"La nodo <b>{{params[0]}}:{{params[1]}}</b> estas denove alirebla.\",\n \"MEMBER_JOIN\": \"Vi estas nun <b>membro</b> de la mono <b>{{params[0]}}</b>!\",\n \"MEMBER_LEAVE\": \"Vi <b>ne plu estas membro</b> de la mono <b>{{params[0]}}</b>!\",\n \"MEMBER_EXCLUDE\": \"Vi <b>ne plu estas membro</b> de la mono <b>{{params[0]}}</b>, pro ne revalidiĝo aŭ pro manko da atestaĵoj.\",\n \"MEMBER_REVOKE\": \"La nuligo de via konto efektiviĝis. Ĝi ne plu povos esti membro-konto de la mono <b>{{params[0]}}</b>.\",\n \"MEMBER_ACTIVE\": \"La revalidiĝo de via aliĝo al la mono <b>{{params[0]}}</b> estis <b>ricevita</b>.\",\n \"TX_SENT\": \"Via <b>pago</b> al <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> efektiviĝis.\",\n \"TX_SENT_MULTI\": \"Via <b>pago</b> al <b>{{params[1]}}</b> efektiviĝis.\",\n \"TX_RECEIVED\": \"Vi <b>ricevis pagon</b> de <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span>.\",\n \"TX_RECEIVED_MULTI\": \"Vi <b>ricevis pagon</b> de <b>{{params[1]}}</b>.\",\n \"CERT_SENT\": \"Via <b>atestado</b> al <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> efektiviĝis.\",\n \"CERT_RECEIVED\": \"Vi <b>ricevis atestaĵon</b> de <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span>.\",\n \"USER\": {\n \"LIKE_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> ŝatas vian profilon\",\n \"FOLLOW_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> sekvas viajn agojn\",\n \"STAR_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> notis vin ({{params[3]}} <b class=\\\"ion-star\\\">)\",\n \"MODERATION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> petas de vi moderigon pri la profilo: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> atentigis pri profilo foriginda: <b>{{params[2]}}</b>\",\n \"ABUSE_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> atentigis pri via profilo\"\n },\n \"PAGE\": {\n \"NEW_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> komentis vian anoncon: <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> modifis sian komenton pri via anonco: <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> respondis al via komento pri la anonco: <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> modifis sian respondon al via komento pri la anonco: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> komentis la paĝon: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> modifis sian komenton ĉe la paĝo: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> aldonis la paĝon: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> modifis la paĝon: <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> petas de vis moderigon pri la paĝo: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> atentigis pri paĝo foriginda: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"ABUSE_RECEIVED\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> atentigis pri via paĝo: <b>{{params[2]}}</b>\"\n }\n },\n \"CONFIRM\": {\n \"ES_USE_FALLBACK_NODE\": \"Daten-nodo <b>{{old}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Ĉu vi volas provizore uzi la daten-nodon <b>{{new}}</b> ?\"\n },\n \"ERROR\": {\n \"ES_CONNECTION_ERROR\": \"Daten-nodo <b>{{server}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Cesium daŭrigos funkcii, <b>sen la krom-programo Cesium+</b> (uzanto-profiloj, privataj mesaĝoj, mapoj kaj grafikoj)<br/><br/>Kontrolu vian ret-konekton, aŭ ŝanĝu daten-nodon ĉe la <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">parametroj de la krom-programo</a>.\",\n \"ES_MAX_UPLOAD_BODY_SIZE\": \"La kvanto de datenoj sendotaj superas la limon fiksitan de la servilo.<br/>Bonvolu reprovi post, ekzemple, forigo de fotoj.\"\n }\n}\n);\n\n$translateProvider.translations(\"es-ES\", {\n \"COMMON\": {\n \"ABUSES_TEXT\": \"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'ont' : 'a'}} signalé un problème\",\n \"BTN_LIKE\": \"Me gusta\",\n \"BTN_LIKE_REMOVE\": \"Dejar de gustarme\",\n \"BTN_REMOVE_REPORTED_ABUSE\": \"Cancelar mi reporte\",\n \"BTN_REPORT_ABUSE_DOTS\": \"Reportar un problema o un abuso...\",\n \"COMMENT_HELP\": \"Comentario\",\n \"LIKES_TEXT\": \"A {{total}} persona{{total > 1 ? 's' : ''}} {{total > 1 ? 'les' : 'le'}} gusta esta página\",\n \"NOTIFICATION\": {\n \"HAS_UNREAD\": \"Tiene {{count}} notificaci{{count>0?'ones':'ón'}} no leída{{count>0?'s':''}}\",\n \"TITLE\": \"Nueva notificación | {{'COMMON.APP_NAME'|translate}}\"\n },\n \"REPORT_ABUSE\": {\n \"ASK_DELETE\": \"¿ Solicitar la eliminación ?\",\n \"CONFIRM\": {\n \"SENT\": \"Reporte enviado. ¡ Gracias !\"\n },\n \"REASON_HELP\": \"Yo explico el problema...\",\n \"SUB_TITLE\": \"Por favor explique brevemente el problema :\",\n \"TITLE\": \"Señalar un problema\"\n },\n\n \"CATEGORY\": \"Categoría\",\n \"CATEGORIES\": \"Categorías\",\n \"CATEGORY_SEARCH_HELP\": \"Búsqueda\",\n \"LAST_MODIFICATION_DATE\": \"Actualización el\",\n \"SUBMIT_BY\": \"Enviado por\",\n \"BTN_PUBLISH\": \"Publicar\",\n \"BTN_PICTURE_DELETE\": \"Suprimir\",\n \"BTN_PICTURE_FAVORISE\": \"Principal\",\n \"BTN_PICTURE_ROTATE\": \"Girar\",\n \"BTN_ADD_PICTURE\": \"Añadir una foto\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Notificaciones\",\n \"MARK_ALL_AS_READ\": \"Marcar todo como leído\",\n \"NO_RESULT\": \"Ningúna notificación\",\n \"SHOW_ALL\": \"Ver todo\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Fallo en la carga de las notificaciones\"\n }\n },\n \"DOCUMENT\": {\n \"HASH\": \"Hash: \",\n \"LOOKUP\": {\n \"BTN_COMPACT\": \"Compactar\",\n \"HAS_CREATE_OR_UPDATE_PROFILE\": \"ha creado o modificado su perfil\",\n \"LAST_DOCUMENTS_DOTS\": \"Últimos documentos :\",\n \"TITLE\": \"Búsqueda de documentos\",\n \"BTN_ACTIONS\": \"Acciones\",\n \"SEARCH_HELP\": \"issuer:AAA*, time:1508406169\",\n \"LAST_DOCUMENTS\": \"Últimos documentos\",\n \"SHOW_QUERY\": \"Ver la búsqueda\",\n \"HIDE_QUERY\": \"Esconder la búsqueda\",\n \"HEADER_TIME\": \"Fecha/Hora\",\n \"HEADER_ISSUER\": \"Emisor\",\n \"HEADER_RECIPIENT\": \"Destinatario\",\n \"READ\": \"Leído\",\n \"BTN_REMOVE\": \"Sumprimer este documento\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Acciones\",\n \"REMOVE_ALL\": \"Suprimir estos documentos...\"\n }\n },\n \"INFO\": {\n \"REMOVED\": \"Documento suprimido\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"¿ Desea <b>suprimir este documento</b> ?\",\n \"REMOVE_ALL\": \"¿ Desea <b>suprimer estos documentos</b> ?\"\n },\n \"ERROR\": {\n \"LOAD_DOCUMENTS_FAILED\": \"Error al buscar los documentos\",\n \"REMOVE_FAILED\": \"Error al suprimir el documento\",\n \"REMOVE_ALL_FAILED\": \"Error al suprimir los documentos\"\n }\n },\n \"MENU\": {\n \"REGISTRY\": \"Páginas\",\n \"USER_PROFILE\": \"Mi perfil\",\n \"MESSAGES\": \"Mensajes\",\n \"NOTIFICATIONS\": \"Notificaciones\",\n \"INVITATIONS\": \"Invitaciones\"\n },\n \"ACCOUNT\": {\n \"NEW\": {\n \"ORGANIZATION_ACCOUNT\": \"Cuenta para una organización\",\n \"ORGANIZATION_ACCOUNT_HELP\": \"Si representa una empresa, una asociación, etc.<br/>Ningún dividendo universal será creído por esta cuenta.\"\n },\n \"EVENT\": {\n \"MEMBER_WITHOUT_PROFILE\": \"Para obtener sus certificaciones más rapidamente, complete <a ui-sref=\\\"app.edit_profile\\\">su perfil usuario</a>. Los miembros concederán más fácilmente su confianza a una identidad verificable.\"\n },\n \"ERROR\": {\n \"WS_CONNECTION_FAILED\": \"Cesium no puede recibir las notificaciones, a causa de un error técnico (conexión al nodo de datos Cesium+).<br/><br/>Si el problema persiste, por favor <b>elige un otro nodo de datos</b> en los ajustes de Cesium+.\"\n }\n },\n \"WOT\": {\n \"BTN_SUGGEST_CERTIFICATIONS_DOTS\": \"Sugerir identidades a certificar…\",\n \"BTN_ASK_CERTIFICATIONS_DOTS\": \"Pedir a miembros que le certifiquen…\",\n \"BTN_ASK_CERTIFICATION\": \"Pedir una certificación\",\n \"SUGGEST_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Sugerir certificaciones\",\n \"HELP\": \"Selectionar sus sugerencias\"\n },\n \"ASK_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Solicitar certificaciones\",\n \"HELP\": \"Selectionar los destinatarios\"\n },\n \"SEARCH\": {\n \"DIVIDER_PROFILE\": \"Cuentas\",\n \"DIVIDER_PAGE\": \"Páginas\",\n \"DIVIDER_GROUP\": \"Grupos\"\n },\n \"CONFIRM\": {\n \"SUGGEST_CERTIFICATIONS\": \"¿Desea <b>enviar estas sugerencias de certificatión</b> ?\",\n \"ASK_CERTIFICATION\": \"¿Desea <b>enviar una solicitud de certificación</b> ?\",\n \"ASK_CERTIFICATIONS\": \"¿Desea <b>enviar una solicitud de certificación</b> a estas personas ?\"\n }\n },\n \"INVITATION\": {\n \"TITLE\": \"Invitaciones\",\n \"NO_RESULT\": \"Ningúna invitación en espera\",\n \"BTN_DELETE_ALL\": \"Suprimir todas las invitaciones\",\n \"BTN_DELETE\": \"Suprimir la invitación\",\n \"BTN_NEW_INVITATION\": \"Nueva invitación\",\n \"ASK_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> solicita su certificación\",\n \"SUGGESTION_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{::pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> ha sido sugerido/a para certificación\",\n \"SUGGESTED_BY\": \"Sugerencia mandada por <a class=\\\"positive\\\" href=\\\"#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}\\\">{{::issuer.name||issuer.uid}}</a>\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Invitaciones\"\n },\n \"LIST\": {\n \"TITLE\": \"Invitaciones\"\n },\n \"NEW\": {\n \"TITLE\": \"Nueva invitación\",\n \"RECIPIENTS\": \"A\",\n \"RECIPIENTS_HELP\": \"Destinatarios de la invitación\",\n \"RECIPIENTS_MODAL_TITLE\": \"Destinatarios\",\n \"RECIPIENTS_MODAL_HELP\": \"Por favor, elige los destinatarios :\",\n \"SUGGESTION_IDENTITIES\": \"Sugerencia de certificación\",\n \"SUGGESTION_IDENTITIES_HELP\": \"Certificaciones a sugerir\",\n \"SUGGESTION_IDENTITIES_MODAL_TITLE\": \"Sugerencias\",\n \"SUGGESTION_IDENTITIES_MODAL_HELP\": \"Por favor, elige sus sugerencias :\"\n },\n \"CONFIRM\": {\n \"DELETE_ALL_CONFIRMATION\": \"La supresión de las invitaciones es una <b>operación ireversible</b>.<br/><br/>¿ Desea continuar ?\",\n \"SEND_INVITATIONS_TO_CERTIFY\": \"¿ Desea <b>mandar esta invitación a certificar</b> ?\"\n },\n \"INFO\": {\n \"INVITATION_SENT\": \"Invitación mandada\"\n },\n \"ERROR\": {\n \"LOAD_INVITATIONS_FAILED\": \"Fallo en la carga de las invitaciones\",\n \"REMOVE_INVITATION_FAILED\": \"Fallo durante la supresión de la invitación\",\n \"REMOVE_ALL_INVITATIONS_FAILED\": \"Fallo durante la supresión de las invitaciones\",\n \"SEND_INVITATION_FAILED\": \"Fallo durante el envío de la invitación\",\n \"BAD_INVITATION_FORMAT\": \"<span class=\\\"assertive\\\"><i class=\\\"ion-close-circled\\\"></i> Invitación ilegible (formato desconocido)</span> - mandada por <a ui-sref=\\\"app.wot_identity({pubkey: '{{::pubkey}}', uid: '{{::uid}}' })\\\">{{::name||uid}}</a>\"\n }\n },\n \"COMMENTS\": {\n \"DIVIDER\": \"Comentarios\",\n \"SHOW_MORE_COMMENTS\": \"Visualizar los comentarios anteriores\",\n \"COMMENT_HELP\": \"Su comentario, preguntas, etc.\",\n \"COMMENT_HELP_REPLY_TO\": \"Su repuesta…\",\n \"BTN_SEND\": \"Mandar\",\n \"POPOVER_SHARE_TITLE\": \"Mensaje #{{number}}\",\n \"MODIFIED_ON\": \"modificado el {{time|formatDate}}\",\n \"MODIFIED_PARENTHESIS\": \"(modificado entonces)\",\n \"REPLY\": \"Responder\",\n \"REPLY_TO\": \"Repuesta a :\",\n \"REPLY_TO_LINK\": \"En repuesta a \",\n \"REPLY_TO_DELETED_COMMENT\": \"En repuesta a un comentario suprimido\",\n \"REPLY_COUNT\": \"{{replyCount}} repuestas\",\n \"DELETED_COMMENT\": \"Comentario suprimido\",\n \"ERROR\": {\n \"FAILED_SAVE_COMMENT\": \"Fallo durante el respaldo del comentario\",\n \"FAILED_REMOVE_COMMENT\": \"Fallo durante la supresión del comentario\"\n }\n },\n \"MESSAGE\": {\n \"REPLY_TITLE_PREFIX\": \"Rep: \",\n \"FORWARD_TITLE_PREFIX\": \"Tr: \",\n \"BTN_REPLY\": \"Responder\",\n \"BTN_COMPOSE\": \"Nuevo mensaje\",\n \"BTN_WRITE\": \"Escribir\",\n \"NO_MESSAGE_INBOX\": \"Ningun mensaje recibido\",\n \"NO_MESSAGE_OUTBOX\": \"Ningun mensaje mandado\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Mensajes\",\n \"MESSAGE_RECEIVED\": \"Ha <b>recibido un mensaje</b><br/>de\"\n },\n \"LIST\": {\n \"INBOX\": \"Bandeja de entrada\",\n \"OUTBOX\": \"Mensajes enviados\",\n \"LAST_INBOX\": \"Nuevos mensajes\",\n \"LAST_OUTBOX\": \"Mensajes enviados\",\n \"BTN_LAST_MESSAGES\": \"Mensajes recientes\",\n \"TITLE\": \"Mensajes\",\n \"SEARCH_HELP\": \"Buscar en mensajes\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Opciones\",\n \"DELETE_ALL\": \"Suprimir todos los mensajes\"\n }\n },\n \"COMPOSE\": {\n \"TITLE\": \"Nuevo mensaje\",\n \"TITLE_REPLY\": \"Responder\",\n \"SUB_TITLE\": \"Nuevo mensaje\",\n \"TO\": \"A\",\n \"OBJECT\": \"Objeto\",\n \"OBJECT_HELP\": \"Objeto\",\n \"ENCRYPTED_HELP\": \"Tenga en cuenta que este mensaje será cifrado antes del envío, con el fin de que solo el destinatario pueda leerlo, y que se tenga la seguridad de que la autoría es suya.\",\n \"MESSAGE\": \"Mensaje\",\n \"MESSAGE_HELP\": \"Contenido del mensaje\",\n \"CONTENT_CONFIRMATION\": \"El contenido del mensaje está vacío.<br/><br/>¿ Sin embargo, quiere mandar el mensaje ?\"\n },\n \"VIEW\": {\n \"TITLE\": \"Mensaje\",\n \"SENDER\": \"Enviado por\",\n \"RECIPIENT\": \"Enviado a\",\n \"NO_CONTENT\": \"Mensaje vacío\",\n \"DELETE\": \"Eliminar el mensaje\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"¿ Desea <b>suprimir este mensaje</b> ?<br/><br/>Esta operación es ireversible.\",\n \"REMOVE_ALL\" : \"¿ Desea <b>suprimir todos los mensajes</b> ?<br/><br/>Esta operación es ireversible.\",\n \"MARK_ALL_AS_READ\": \"¿ Desea <b>marcar todos los mensajes como leído</b> ?\",\n \"USER_HAS_NO_PROFILE\": \"Esta identidad no tiene ningún perfil Cesium+. Puede que no tenga habilitada la extensión Cesium+, y <b>no podrá ver su mensaje</b>.<br/><br/>¿ Desea <b>continuar</b> a pesar de todo ?\"\n },\n \"INFO\": {\n \"MESSAGE_REMOVED\": \"Mensaje suprimido\",\n \"All_MESSAGE_REMOVED\": \"Todos los mensajes fueron suprimido\",\n \"MESSAGE_SENT\": \"Mensaje mandado\"\n },\n \"ERROR\": {\n \"SEND_MSG_FAILED\": \"Fallo durante el envío del mensaje.\",\n \"LOAD_MESSAGES_FAILED\": \"Fallo durante la recuperación de los mensajes.\",\n \"LOAD_MESSAGE_FAILED\": \"Fallo durante la recuperación del mensaje.\",\n \"MESSAGE_NOT_READABLE\": \"Lectura del mensaje imposible.\",\n \"USER_NOT_RECIPIENT\": \"No está el destinatario de este mensaje : deciframiento imposible.\",\n \"NOT_AUTHENTICATED_MESSAGE\": \"La autenticidad del mensaje es dudosa o su contenido está corrupto.\",\n \"REMOVE_MESSAGE_FAILED\": \"Fallo en la supresión del mensaje\",\n \"MESSAGE_CONTENT_TOO_LONG\": \"Valor demasiado largo ({{maxLength}} carácteres max).\",\n \"MARK_AS_READ_FAILED\": \"Imposible marcar el mensaje como 'leído'.\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Fallo durante la recuperación de las notificaciones de mensajes.\",\n \"REMOVE_All_MESSAGES_FAILED\": \"Fallo durante la supresión de todos los mensajes.\",\n \"MARK_ALL_AS_READ_FAILED\": \"Fallo durante el marcaje de los mensajes como leído.\",\n \"RECIPIENT_IS_MANDATORY\": \"El destinatario es obligatorio.\"\n }\n },\n \"BLOCKCHAIN\": {\n \"LOOKUP\": {\n \"SEARCH_HELP\": \"Número de bloque, hash, llave pública, etc.\",\n \"POPOVER_FILTER_TITLE\": \"Filtros\",\n \"HEADER_MEDIAN_TIME\": \"Fecha / Hora\",\n \"HEADER_BLOCK\": \"Bloque #\",\n \"HEADER_ISSUER\": \"Nodo emisor\",\n \"BTN_LAST\": \"Últimos bloques\",\n \"DISPLAY_QUERY\": \"Mostrar la consulta\",\n \"HIDE_QUERY\": \"Ocultar la consulta\",\n \"TX_SEARCH_FILTER\": {\n \"MEMBER_FLOWS\": \"Entradas/salidas de miembros\",\n \"EXISTING_TRANSACTION\": \"Con transacciones\",\n \"PERIOD\": \"<b class=\\\"ion-clock\\\"></b> Entre el <b class=\\\"gray\\\">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) y el <b class=\\\"gray\\\">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})\",\n \"ISSUER\": \"<b class=\\\"ion-android-desktop\\\"></b> Calculado por <b class=\\\"ion-key\\\"></b> {{params[1]|formatPubkey}}\",\n \"TX_PUBKEY\": \"<b class=\\\"ion-card\\\"></b> Transacciones que implican <b class=\\\"ion-key\\\"></b> {{params[1]|formatPubkey}}\"\n }\n },\n \"ERROR\": {\n \"SEARCH_BLOCKS_FAILED\": \"Fallo en la búsqueda de los bloques.\"\n }\n },\n \"GROUP\": {\n \"GENERAL_DIVIDER\": \"Informaciones generales\",\n \"LOCATION_DIVIDER\": \"Dirección\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Redes sociales y página web\",\n \"TECHNICAL_DIVIDER\": \"Informaciones técnicas\",\n \"CREATED_TIME\": \"Creada {{creationTime|formatFromNow}}\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Invitaciones\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Grupos\",\n \"SEARCH_HELP\": \"Nombre de grupo, palabras , lugar, etc.\",\n \"LAST_RESULTS_LIST\": \"Nuevos grupos :\",\n \"OPEN_RESULTS_LIST\": \"Grupos abiertos :\",\n \"MANAGED_RESULTS_LIST\": \"Grupos cerrados :\",\n \"BTN_LAST\": \"Nuevos grupos\",\n \"BTN_NEW\": \"Añado un grupo\"\n },\n \"TYPE\": {\n \"TITLE\": \"Nuevo grupo\",\n \"SELECT_TYPE\": \"Tipo de grupo :\",\n \"OPEN_GROUP\": \"Grupo abierto\",\n \"OPEN_GROUP_HELP\": \"Un grupo abierto es accesible por cualquier miembro de la moneda.\",\n \"MANAGED_GROUP\": \"Grupo administrado\",\n \"MANAGED_GROUP_HELP\": \"Un grupo administrado es gestionado por administradores y moderadores, que pueden aceptar, rechazar o excluir un miembro en su seno.\",\n \"ENUM\": {\n \"OPEN\": \"Grupo abierto\",\n \"MANAGED\": \"Grupo administrado\"\n }\n },\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"MENU_TITLE\": \"Opciones\",\n \"REMOVE_CONFIRMATION\" : \"¿Desea eliminar este grupo?<br/><br/>Esta operación es irreversible.\"\n },\n \"EDIT\": {\n \"TITLE\": \"Grupo\",\n \"TITLE_NEW\": \"Nuevo grupo\",\n \"RECORD_TITLE\": \"Título\",\n \"RECORD_TITLE_HELP\": \"Título\",\n \"RECORD_DESCRIPTION\": \"Descripción\",\n \"RECORD_DESCRIPTION_HELP\": \"Descripción\"\n },\n \"ERROR\": {\n \"SEARCH_GROUPS_FAILED\": \"Fallo en la búsqueda de grupos\",\n \"REMOVE_RECORD_FAILED\": \"Error al eliminar el grupo\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Grupo eliminado\"\n }\n },\n \"REGISTRY\": {\n \"CATEGORY\": \"Actividad principal\",\n \"GENERAL_DIVIDER\": \"Informaciones generales\",\n \"LOCATION_DIVIDER\": \"Dirección\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Redes sociales y sitio web\",\n \"TECHNICAL_DIVIDER\": \"Informaciones técnicas\",\n \"BTN_SHOW_WOT\": \"Personas\",\n \"BTN_SHOW_WOT_HELP\": \"Buscar personas\",\n \"BTN_SHOW_PAGES\": \"Páginas\",\n \"BTN_SHOW_PAGES_HELP\": \"Búsqueda de páginas\",\n \"BTN_NEW\": \"Crear una página\",\n \"MY_PAGES\": \"Mis páginas\",\n \"NO_PAGE\": \"Sin páginas\",\n \"SEARCH\": {\n \"TITLE\": \"Páginas\",\n \"SEARCH_HELP\": \"Qué, Quién, ej: peluquería, restaurante Sol.\",\n \"BTN_ADD\": \"Nuevo\",\n \"BTN_LAST_RECORDS\": \"Páginas recientes\",\n \"BTN_ADVANCED_SEARCH\": \"búsqueda avanzada\",\n \"BTN_OPTIONS\": \"Búsqueda avanzada\",\n \"TYPE\": \"Tipo de página\",\n \"LOCATION_HELP\": \"Ciudad\",\n \"RESULTS\": \"Resultados\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} Resultado{{count>0?'s':''}}, cerca de {{location}}\",\n \"RESULT_COUNT\": \"{{count}} resultado{{count>0?'s':''}}\",\n \"LAST_RECORDS\": \"Páginas recientes\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} página{{count>0?'s':''}} reciente{{count>0?'s':''}}, cerca de {{location}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} página{{count>0?'s':''}} reciente{{count>0?'s':''}}\",\n \"POPOVER_FILTERS\": {\n \"BTN_ADVANCED_SEARCH\": \"Opciones avanzadas\"\n }\n },\n \"VIEW\": {\n \"TITLE\": \"Anuario\",\n \"CATEGORY\": \"Actividad principal :\",\n \"LOCATION\": \"Dirección :\",\n \"MENU_TITLE\": \"Opciones\",\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"REMOVE_CONFIRMATION\" : \"¿ Desea suprimir esta página ?<br/><br/>Esta operación es ireversible.\"\n },\n \"TYPE\": {\n \"TITLE\": \"Nueva página\",\n \"SELECT_TYPE\": \"Tipo de página :\",\n \"ENUM\": {\n \"SHOP\": \"Comercio local\",\n \"COMPANY\": \"Empresa\",\n \"ASSOCIATION\": \"Asociación\",\n \"INSTITUTION\": \"Institución\"\n }\n },\n \"EDIT\": {\n \"TITLE\": \"Edición\",\n \"TITLE_NEW\": \"Nueva página\",\n \"RECORD_TYPE\":\"Tipo de página\",\n \"RECORD_TITLE\": \"Nombre\",\n \"RECORD_TITLE_HELP\": \"Nombre\",\n \"RECORD_DESCRIPTION\": \"Descripción\",\n \"RECORD_DESCRIPTION_HELP\": \"Descripción de la actividad\",\n \"RECORD_ADDRESS\": \"Calle\",\n \"RECORD_ADDRESS_HELP\": \"Calle, edificio…\",\n \"RECORD_CITY\": \"Ciudad\",\n \"RECORD_CITY_HELP\": \"Ciudad\",\n \"RECORD_SOCIAL_NETWORKS\": \"Redes sociales y sitio web\",\n \"RECORD_PUBKEY\": \"Llave pública\",\n \"RECORD_PUBKEY_HELP\": \"Llave pública para recibir pagos\"\n },\n \"WALLET\": {\n \"PAGE_DIVIDER\": \"Páginas\",\n \"PAGE_DIVIDER_HELP\": \"Las páginas se refieren a colectivos que aceptan moneda o la promocionan: tiendas, empresas, negocios, asociaciones, instituciones. Se almacenan fuera de la red de la moneda, en <a ui-sref=\\\"app.es_network\\\">la red Cesium+</a>.\"\n },\n \"ERROR\": {\n \"LOAD_CATEGORY_FAILED\": \"Fallo en la carga de la lista de actividades\",\n \"LOAD_RECORD_FAILED\": \"Fallo durante la carga de la página\",\n \"LOOKUP_RECORDS_FAILED\": \"Fallo durante la ejecución de la búsqueda.\",\n \"REMOVE_RECORD_FAILED\": \"Fallo en la supresión de la página\",\n \"SAVE_RECORD_FAILED\": \"Fallo durante el respaldo\",\n \"RECORD_NOT_EXISTS\": \"Página inexistente\",\n \"GEO_LOCATION_NOT_FOUND\": \"Ciudad o código postal no encontrado\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Página suprimida\",\n \"RECORD_SAVED\": \"Página guardada\"\n }\n },\n \"PROFILE\": {\n \"PROFILE_DIVIDER\": \"Perfil Cesium+\",\n \"PROFILE_DIVIDER_HELP\": \"Estos son datos auxiliares, almacenados fuera de la red monetaria\",\n \"NO_PROFILE_DEFINED\": \"Ningún perfil Cesium+\",\n \"BTN_ADD\": \"Ingresar mi perfil\",\n \"BTN_EDIT\": \"Editar mi perfil\",\n \"BTN_DELETE\": \"Eliminar mi perfil\",\n \"BTN_REORDER\": \"Reordenar\",\n \"UID\": \"Seudónimo\",\n \"TITLE\": \"Nombre, Apellidos\",\n \"TITLE_HELP\": \"Nombre, Apellidos\",\n \"DESCRIPTION\": \"Sobre mí\",\n \"DESCRIPTION_HELP\": \"Sobre mí…\",\n \"SOCIAL_HELP\": \"http://...\",\n \"GENERAL_DIVIDER\": \"Informaciones generales\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Redes sociales, sitios web\",\n \"TECHNICAL_DIVIDER\": \"Informaciones técnicas\",\n \"MODAL_AVATAR\": {\n \"TITLE\": \"Foto de perfil\",\n \"SELECT_FILE_HELP\": \"Por favor, <b>elija una imagen</b>:\",\n \"BTN_SELECT_FILE\": \"Eligir una imagen\",\n \"RESIZE_HELP\": \"<b>Encuadre la imagen</b>, si es necesario. Un clic presionado sobre la imagen permite desplazarla. Haga clic en la zona inferior izquierda para hacer zoom.\",\n \"RESULT_HELP\": \"<b>Aquí está el resultado</b> tal como se verá sobre su perfil :\"\n },\n \"CONFIRM\": {\n \"DELETE\": \"¿Desea <b>eliminar su perfil Cesium+?</b><br/><br/>Esta operación es irreversible.\",\n \"DELETE_BY_MODERATOR\": \"¿Desea <b>eliminar este perfil Cesium+?</b><br/><br/>Esta operación es irreversible.\"\n },\n \"ERROR\": {\n \"DELETE_PROFILE_FAILED\": \"Error durante la eliminación del perfil\",\n \"REMOVE_PROFILE_FAILED\": \"Error de eliminación del perfil\",\n \"LOAD_PROFILE_FAILED\": \"Fallo en la carga del perfil usuario.\",\n \"SAVE_PROFILE_FAILED\": \"Fallo durante el respaldo\",\n \"INVALID_SOCIAL_NETWORK_FORMAT\": \"Formato inválido: por favor, indique una dirección válida.<br/><br/>Ejemplos :<ul><li>- Una página Facebook (https://www.facebook.com/user)</li><li>- Una página web (http://www.misitio.es)</li><li>- Una dirección de correo (joe@dalton.com)</li></ul>\",\n \"IMAGE_RESIZE_FAILED\": \"Falló el redimensionado de la imagen\"\n },\n \"INFO\": {\n \"PROFILE_REMOVED\": \"Perfil eliminado\",\n \"PROFILE_SAVED\": \"Perfil guardado\"\n },\n \"HELP\": {\n \"WARNING_PUBLIC_DATA\": \"La información de su perfil <b>es pública</b>: visible también por personas <b>sin cuenta</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}\"\n }\n },\n \"LIKE\": {\n \"ERROR\": {\n \"FAILED_TOGGLE_LIKE\": \"Imposible ejecutar esta acción.\"\n }\n },\n \"LOCATION\": {\n \"BTN_GEOLOC_ADDRESS\": \"Actualizar desde la dirección\",\n \"USE_GEO_POINT\": \"Aparecer en el mapa {{'COMMON.APP_NAME'|translate}}\",\n \"LOADING_LOCATION\": \"Encontrar la dirección…\",\n \"LOCATION_DIVIDER\": \"Dirección\",\n \"ADDRESS\": \"Calle\",\n \"ADDRESS_HELP\": \"Calle, número, etc…\",\n \"CITY\": \"Ciudad\",\n \"CITY_HELP\": \"Ciudad, País\",\n \"DISTANCE\": \"Distancia máxima alrededor de la ciudad\",\n \"DISTANCE_UNIT\": \"km\",\n \"DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"SEARCH_HELP\": \"Ciudad, País\",\n \"PROFILE_POSITION\": \"Posición del perfil\",\n \"MODAL\": {\n \"TITLE\": \"Búsqueda de dirección\",\n \"SEARCH_HELP\": \"Ciudad, País\",\n \"ALTERNATIVE_RESULT_DIVIDER\": \"Resultados alternativos para <b>{{address}}</b> :\",\n \"POSITION\": \"Latitud/Longitud : {{lat}} / {{lon}}\"\n },\n \"ERROR\": {\n \"CITY_REQUIRED_IF_STREET\": \"Requerido si una calle ha sido llenada\",\n \"REQUIRED_FOR_LOCATION\": \"Campo obligatorio para aparecer en el mapa\",\n \"INVALID_FOR_LOCATION\": \"Dirección desconocida\",\n \"GEO_LOCATION_FAILED\": \"No se puede recuperar su ubicación Por favor usa el botón de búsqueda.\",\n \"ADDRESS_LOCATION_FAILED\": \"No se puede recuperar la posición de la dirección.\"\n }\n },\n \"SUBSCRIPTION\": {\n \"SUBSCRIPTION_DIVIDER\": \"Servicios en línea\",\n \"SUBSCRIPTION_DIVIDER_HELP\": \"Los servicios en línea ofrecen servicios adicionales, proporcionados por un tercero.\",\n \"BTN_ADD\": \"Agregar un servicio\",\n \"BTN_EDIT\": \"Administrar mis servicios\",\n \"NO_SUBSCRIPTION\": \"Ningún servicio definido\",\n \"SUBSCRIPTION_COUNT\": \"Servicios / Suscripción\",\n \"EDIT\": {\n \"TITLE\": \"Servicios en línea\",\n \"HELP_TEXT\": \"Gestione sus suscripciones y otros servicios en línea aquí\",\n \"PROVIDER\": \"Proveedor:\"\n },\n \"TYPE\": {\n \"ENUM\": {\n \"EMAIL\": \"Recibir notificaciones por correo electrónico\"\n }\n },\n \"CONFIRM\": {\n \"DELETE_SUBSCRIPTION\": \"¿ Deseas <b>eliminar</b> esta suscripción ?\"\n },\n \"ERROR\": {\n \"LOAD_SUBSCRIPTIONS_FAILED\": \"Error al cargar servicios en línea\",\n \"ADD_SUBSCRIPTION_FAILED\": \"Error al agregar suscripción\",\n \"UPDATE_SUBSCRIPTION_FAILED\": \"Error durante la actualización de la suscripción\",\n \"DELETE_SUBSCRIPTION_FAILED\": \"Error al eliminar la suscripción\"\n },\n \"MODAL_EMAIL\": {\n \"TITLE\" : \"Notificación por correo electrónico\",\n \"HELP\" : \"Rellene este formulario para <b>ser notificado por correo electrónico</b> de los eventos de su cuenta. <br/> Su dirección de correo electrónico se cifrará y únicamente será visible para el proveedor de servicios.\",\n \"EMAIL_LABEL\" : \"Su correo electrónico :\",\n \"EMAIL_HELP\": \"maria@dominio.com\",\n \"FREQUENCY_LABEL\": \"Frecuencia de las notificaciones :\",\n \"FREQUENCY_DAILY\": \"Diaria\",\n \"FREQUENCY_WEEKLY\": \"Semanal\",\n \"PROVIDER\": \"Proveedor de servicio :\"\n }\n },\n \"ES_PEER\": {\n \"DOCUMENT_COUNT\": \"Número de documentos\",\n \"DOCUMENTS\": \"Documentos\",\n \"EMAIL_SUBSCRIPTION_COUNT\": \"{{emailSubscription}} suscrito/a{{emailSubscription ? 's' : ''}} a notificaciones por correo\",\n \"NAME\": \"Nombre\",\n \"SOFTWARE\": \"Software\"\n },\n \"ES_SETTINGS\": {\n \"PLUGIN_NAME\": \"Cesium+\",\n \"PLUGIN_NAME_HELP\": \"Perfiles, notificaciones, mensajes privados\",\n \"ENABLE_TOGGLE\": \"Activar la extensión\",\n \"ENABLE_MESSAGE_TOGGLE\": \"Activar los mensajes privados\",\n \"ENABLE_REMOTE_STORAGE\": \"Activar el almacenamiento remoto\",\n \"ENABLE_REMOTE_STORAGE_HELP\": \"Permite almacenar (con cifrado) sus ajustes en los nodos Cesium+\",\n \"PEER\": \"Dirección del nodo de datos\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Nodo de datos\",\n \"HELP\" : \"Ingrese la dirección del nodo que quiere utilizar:\",\n \"PEER_HELP\": \"servidor.dominio.com:puerto\"\n },\n \"NOTIFICATIONS\": {\n \"DIVIDER\": \"Notificaciones\",\n \"HELP_TEXT\": \"Active los tipos de notificaciones que desea recibir:\",\n \"ENABLE_TX_SENT\": \"Notificar la validación de los <b>pagos emitidos</b>\",\n \"ENABLE_TX_RECEIVED\": \"Notificar la validación de los <b>pagos recibidos</b>\",\n \"ENABLE_CERT_SENT\": \"Notificar la validación de las <b>certificaciones emitidas</b>\",\n \"ENABLE_CERT_RECEIVED\": \"Notificar la validación de las <b>certificaciones recibidas</b>\",\n \"ENABLE_HTML5_NOTIFICATION\": \"Avisar con cada nueva notificación\",\n \"ENABLE_HTML5_NOTIFICATION_HELP\": \"Abre una pequeña ventana emergente con cada nueva notificación.\"\n },\n \"CONFIRM\": {\n \"ASK_ENABLE_TITLE\": \"Otras funcionalidades\",\n \"ASK_ENABLE\": \"La extensión de Cesium+ está deshabilitada en sus ajutes, desactivando ciertas funcionalidades: <ul><li> <b><i class=\\\"icon ion-person\\\"></i> Perfiles de usuario/a</b>;<li> <b><i class=\\\"icon ion-android-notifications\\\"></i> Notificaciones</b>;<li> <b><i class=\\\"icon ion-email\\\"></i> Mensajes privados</b>.</ul><br/><br/>¿<b>Desea re-activar</b> la extensión?\"\n }\n },\n \"ES_WALLET\": {\n \"ERROR\": {\n \"RECIPIENT_IS_MANDATORY\": \"Un destinatario es obligatorio para el cifrado.\"\n }\n },\n \"EVENT\": {\n \"NODE_STARTED\": \"Su nodo ES API <b>{{params[0]}}</b> es comenzado\",\n \"NODE_BMA_DOWN\": \"El nodo <b>{{params[0]}}:{{params[1]}}</b> (utilizado por su nodo ES API) <b>no es localizable</b>.\",\n \"NODE_BMA_UP\": \"El nodo <b>{{params[0]}}:{{params[1]}}</b> es de nuevo accesible.\",\n \"MEMBER_JOIN\": \"Ahora es <b>miembro</b> de la moneda <b>{{params[0]}}</b> !\",\n \"MEMBER_LEAVE\": \"No es <b>miembro</b> de la moneda <b>{{params[0]}}</b>!\",\n \"MEMBER_EXCLUDE\": \"Usted ya no es miembro de la moneda <b>{{params[0]}}</b>, por falta de renovación o certificaciones.\",\n \"MEMBER_REVOKE\": \"Su membresía ha sido revocada. Ya no es miembro de la moneda <b>{{params[0]}}</b>.\",\n \"MEMBER_ACTIVE\": \"Su membresía a <b>{{params[0]}}</b> ha sido <b>renovada con éxito</b>.\",\n \"TX_SENT\": \"Su <b>pago</b> a <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> fue efectuado.\",\n \"TX_SENT_MULTI\": \"Su <b>pago</b> a <b>{{params[1]}}</b> fue efectuado.\",\n \"TX_RECEIVED\": \"Ha <b>recibido un pago</b> de <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span>.\",\n \"TX_RECEIVED_MULTI\": \"Ha <b>recibido un pago</b> de <b>{{params[1]}}</b>.\",\n \"CERT_SENT\": \"Su <b>certificación</b> a <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> fue efectuada.\",\n \"CERT_RECEIVED\": \"Ha <b>recibido una certificación</b> de <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span>.\",\n \"USER\": {\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> ha reportardo su perfil\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> ha reportado un perfil para suprimir : <b>{{params[2]}}</b>\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> sigue la actividad de su perfil\",\n \"LIKE_RECEIVED\": \"A <span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> le ha gustado su perfil</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> os pide moderación sobre el perfil : <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"STAR_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> os ha puntuado con ({{params[3]}} <b class=\\\"ion-star\\\">)\"\n },\n \"PAGE\": {\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> ha reportardo su página : <b>{{params[2]}}</b>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> ha reportado una página para suprimir : <b>{{params[2]}}</b>\",\n \"FOLLOW_CLOSE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> ha cerrado la página : <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> ha añadido la página : <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> ha comentado la página : <b>{{params[2]}}</b>\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> sigue su página : <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> ha modificado la página : <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> ha modificado su comentario en la página : <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> os pide moderación sobre la página : <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n\n \"NEW_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> ha comentado su referencia : <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> ha modificado su comentario sobre su referencia : <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> ha contestado a su comentario sobre la referencia : <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> ha modificado la repuesta a su comentario sobre la referencia : <b>{{params[2]}}</b>\"\n }\n },\n \"CONFIRM\": {\n \"ES_USE_FALLBACK_NODE\": \"Nodo de datos <b>{{old}}</b> inalcanzable o dirección no válida.<br/><br/>¿Desea utilizar temporalmente el nodo de datos <b>{{new}}</b>?\"\n },\n \"ERROR\": {\n \"ES_CONNECTION_ERROR\": \"Nodo de datos <b>{{server}}</b> inalcanzable o dirección no válida.<br/><br/>Cesium continuará funcionando, <b>sin la extensión Cesium+</b> (perfiles de usuario, mensajes privados), mapas y gráficos).<br/><br/>Verifique su conexión a Internet, o cambie el nodo de datos en <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\"> los ajustes de la extensión </a>.\",\n \"ES_MAX_UPLOAD_BODY_SIZE\": \"El volumen de datos a enviar excede el límite establecido por el servidor.<br/><br/>Por favor, inténtelo de nuevo después, por ejemplo, borrando fotos.\"\n }\n}\n);\n\n$translateProvider.translations(\"fr-FR\", {\n \"COMMON\": {\n \"CATEGORY\": \"Catégorie\",\n \"CATEGORIES\": \"Catégories\",\n \"CATEGORY_SEARCH_HELP\": \"Recherche\",\n \"COMMENT_HELP\": \"Commentaire\",\n \"LAST_MODIFICATION_DATE\": \"Mise à jour le\",\n \"SUBMIT_BY\": \"Soumis par\",\n \"BTN_LIKE\": \"J'aime\",\n \"BTN_LIKE_REMOVE\": \"Je n'aime plus\",\n \"LIKES_TEXT\": \"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'ont' : 'a'}} aimé cette page\",\n \"ABUSES_TEXT\": \"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'ont' : 'a'}} signalé un problème\",\n \"BTN_REPORT_ABUSE_DOTS\": \"Signaler un problème ou un abus...\",\n \"BTN_REMOVE_REPORTED_ABUSE\": \"Annuler mon signalement\",\n \"BTN_PUBLISH\": \"Publier\",\n \"BTN_PICTURE_DELETE\": \"Supprimer\",\n \"BTN_PICTURE_FAVORISE\": \"Principale\",\n \"BTN_PICTURE_ROTATE\": \"Tourner\",\n \"BTN_ADD_PICTURE\": \"Ajouter une photo\",\n \"NOTIFICATION\": {\n \"TITLE\": \"Nouvelle notification | {{'COMMON.APP_NAME'|translate}}\",\n \"HAS_UNREAD\": \"Vous avez {{count}} notification{{count>0?'s':''}} non lue{{count>0?'s':''}}\"\n },\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Notifications\",\n \"MARK_ALL_AS_READ\": \"Tout marquer comme lu\",\n \"NO_RESULT\": \"Aucune notification\",\n \"SHOW_ALL\": \"Voir tout\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Erreur de chargement des notifications\"\n },\n \"REPORT_ABUSE\": {\n \"TITLE\": \"Signaler un problème\",\n \"SUB_TITLE\": \"Merci d'expliquer succintement le problème :\",\n \"REASON_HELP\": \"J'explique le problème...\",\n \"ASK_DELETE\": \"Demander la suppression ?\",\n \"CONFIRM\": {\n \"SENT\": \"Signalement envoyé. Merci !\"\n }\n }\n },\n \"MENU\": {\n \"REGISTRY\": \"Pages\",\n \"USER_PROFILE\": \"Mon profil\",\n \"MESSAGES\": \"Messages\",\n \"NOTIFICATIONS\": \"Notifications\",\n \"INVITATIONS\": \"Invitations\"\n },\n \"ACCOUNT\": {\n \"NEW\": {\n \"ORGANIZATION_ACCOUNT\": \"Compte pour une organisation\",\n \"ORGANIZATION_ACCOUNT_HELP\": \"Si vous représentez une entreprise, une association, etc.<br/>Aucun dividende universel ne sera créé par ce compte.\"\n },\n \"EVENT\": {\n \"MEMBER_WITHOUT_PROFILE\": \"Vous pouvez <a ui-sref=\\\"app.edit_profile\\\">saisir votre profil Cesium+</a> (optionnel) pour offrir une meilleure visibilité de votre compte. Ce profil sera stocké dans <b>un annuaire indépendant</b> de la monnaie, mais décentralisé.\"\n },\n \"ERROR\": {\n \"WS_CONNECTION_FAILED\": \"Cesium ne peut pas recevoir les notifications, à cause d'une erreur technique (connexion au noeud de données Cesium+).<br/><br/>Si le problème persiste, veuillez <b>choisir un autre noeud de données</b> dans les paramètres Cesium+.\"\n }\n },\n \"WOT\": {\n \"BTN_SUGGEST_CERTIFICATIONS_DOTS\": \"Suggérer des identités à certifier...\",\n \"BTN_ASK_CERTIFICATIONS_DOTS\": \"Demander à des membres de me certifier...\",\n \"BTN_ASK_CERTIFICATION\": \"Demander une certification\",\n \"SUGGEST_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Suggérer des certifications\",\n \"HELP\": \"Sélectionner vos suggestions\"\n },\n \"ASK_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Demander des certifications\",\n \"HELP\": \"Sélectionner les destinataires\"\n },\n \"SEARCH\": {\n \"DIVIDER_PROFILE\": \"Comptes\",\n \"DIVIDER_PAGE\": \"Pages\",\n \"DIVIDER_GROUP\": \"Groupes\"\n },\n \"CONFIRM\": {\n \"SUGGEST_CERTIFICATIONS\": \"Êtes-vous sûr de vouloir <b>envoyer ces suggestions de certification</b> ?\",\n \"ASK_CERTIFICATION\": \"Êtes-vous sûr de vouloir <b>envoyer une demande de certification</b> ?\",\n \"ASK_CERTIFICATIONS\": \"Êtes-vous sûr de vouloir <b>envoyer une demande de certification</b> à ces personnes ?\"\n }\n },\n \"INVITATION\": {\n \"TITLE\": \"Invitations\",\n \"NO_RESULT\": \"Aucune invitation en attente\",\n \"BTN_DELETE_ALL\": \"Supprimer toutes les invitations\",\n \"BTN_DELETE\": \"Supprimer l'invitation\",\n \"BTN_NEW_INVITATION\": \"Nouvelle invitation\",\n \"ASK_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> demande votre certification\",\n \"SUGGESTION_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{::pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> vous est suggéré pour certification\",\n \"SUGGESTED_BY\": \"Suggestion envoyée par <a class=\\\"positive\\\" href=\\\"#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}\\\">{{::issuer.name||issuer.uid}}</a>\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Invitations\"\n },\n \"LIST\": {\n \"TITLE\": \"Invitations\"\n },\n \"NEW\": {\n \"TITLE\": \"Nouvelle invitation\",\n \"RECIPIENTS\": \"A\",\n \"RECIPIENTS_HELP\": \"Destinataires de l'invitation\",\n \"RECIPIENTS_MODAL_TITLE\": \"Destinataires\",\n \"RECIPIENTS_MODAL_HELP\": \"Veuillez choisir les destinataires :\",\n \"SUGGESTION_IDENTITIES\": \"Suggestions de certification\",\n \"SUGGESTION_IDENTITIES_HELP\": \"Certifications à suggérer\",\n \"SUGGESTION_IDENTITIES_MODAL_TITLE\": \"Suggestions\",\n \"SUGGESTION_IDENTITIES_MODAL_HELP\": \"Veuillez choisir vos suggestions :\"\n },\n \"CONFIRM\": {\n \"DELETE_ALL_CONFIRMATION\": \"La suppression des invitations est une <b>opération irréversible</b>.<br/><br/><b>Êtes-vous sûr</b> de vouloir continuer ?\",\n \"SEND_INVITATIONS_TO_CERTIFY\": \"Êtes-vous sûr de vouloir <b>envoyer cette invitation à certifier</b> ?\"\n },\n \"INFO\": {\n \"INVITATION_SENT\": \"Invitation envoyée\"\n },\n \"ERROR\": {\n \"LOAD_INVITATIONS_FAILED\": \"Échec du chargement des invitations\",\n \"REMOVE_INVITATION_FAILED\": \"Erreur lors de la suppression de l'invitation\",\n \"REMOVE_ALL_INVITATIONS_FAILED\": \"Erreur lors de la suppression des invitations\",\n \"SEND_INVITATION_FAILED\": \"Erreur lors de l'envoi de l'invitation\",\n \"BAD_INVITATION_FORMAT\": \"<span class=\\\"assertive\\\"><i class=\\\"ion-close-circled\\\"></i> Invitation illisible (format inconnu)</span> - envoyée par <a ui-sref=\\\"app.wot_identity({pubkey: '{{::pubkey}}', uid: '{{::uid}}' })\\\">{{::name||uid}}</a>\"\n }\n },\n \"COMMENTS\": {\n \"DIVIDER\": \"Commentaires\",\n \"SHOW_MORE_COMMENTS\": \"Afficher les commentaires précédents\",\n \"COMMENT_HELP\": \"Votre commentaire, question, etc.\",\n \"COMMENT_HELP_REPLY_TO\": \"Votre réponse...\",\n \"BTN_SEND\": \"Envoyer\",\n \"POPOVER_SHARE_TITLE\": \"Message #{{number}}\",\n \"REPLY\": \"Répondre\",\n \"REPLY_TO\": \"Réponse à :\",\n \"REPLY_TO_LINK\": \"En réponse à \",\n \"REPLY_TO_DELETED_COMMENT\": \"En réponse à un commentaire supprimé\",\n \"REPLY_COUNT\": \"{{replyCount}} réponses\",\n \"DELETED_COMMENT\": \"Commentaire supprimé\",\n \"MODIFIED_ON\": \"modifié le {{time|formatDate}}\",\n \"MODIFIED_PARENTHESIS\": \"(modifié ensuite)\",\n \"ERROR\": {\n \"FAILED_SAVE_COMMENT\": \"Erreur lors de la sauvegarde du commentaire\",\n \"FAILED_REMOVE_COMMENT\": \"Erreur lors de la suppression du commentaire\"\n }\n },\n \"MESSAGE\": {\n \"REPLY_TITLE_PREFIX\": \"Rep: \",\n \"FORWARD_TITLE_PREFIX\": \"Tr: \",\n \"BTN_REPLY\": \"Répondre\",\n \"BTN_COMPOSE\": \"Nouveau message\",\n \"BTN_WRITE\": \"Ecrire\",\n \"NO_MESSAGE_INBOX\": \"Aucun message reçu\",\n \"NO_MESSAGE_OUTBOX\": \"Aucun message envoyé\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Messages\",\n \"MESSAGE_RECEIVED\": \"Vous avez <b>reçu un message</b><br/>de\"\n },\n \"LIST\": {\n \"INBOX\": \"Boîte de réception\",\n \"OUTBOX\": \"Messages envoyés\",\n \"LAST_INBOX\": \"Nouveaux messages\",\n \"LAST_OUTBOX\": \"Messages envoyés\",\n \"BTN_LAST_MESSAGES\": \"Messages récents\",\n \"TITLE\": \"Messages\",\n \"SEARCH_HELP\": \"Recherche dans les messages\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Options\",\n \"DELETE_ALL\": \"Supprimer tous les messages\"\n }\n },\n \"COMPOSE\": {\n \"TITLE\": \"Nouveau message\",\n \"TITLE_REPLY\": \"Répondre\",\n \"SUB_TITLE\": \"Nouveau message\",\n \"TO\": \"A\",\n \"OBJECT\": \"Objet\",\n \"OBJECT_HELP\": \"Objet\",\n \"ENCRYPTED_HELP\": \"Veuillez noter que ce message sera chiffré avant envoi, afin que seul le destinataire puisse le lire, et qu'il soit assuré que vous soyez bien son auteur.\",\n \"MESSAGE\": \"Message\",\n \"MESSAGE_HELP\": \"Contenu du message\",\n \"CONTENT_CONFIRMATION\": \"Le contenu du message est vide.<br/><br/>Voulez-vous néanmoins envoyer le message ?\"\n },\n \"VIEW\": {\n \"TITLE\": \"Message\",\n \"SENDER\": \"Envoyé par\",\n \"RECIPIENT\": \"Envoyé à\",\n \"NO_CONTENT\": \"Message vide\",\n \"DELETE\": \"Supprimer le message\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Êtes-vous sûr de vouloir <b>supprimer ce message</b> ?<br/><br/>Cette opération est irréversible.\",\n \"REMOVE_ALL\" : \"Êtes-vous sûr de vouloir <b>supprimer tous les messages</b> ?<br/><br/>Cette opération est irréversible.\",\n \"MARK_ALL_AS_READ\": \"Êtes-vous sûr de vouloir <b>marquer tous les messages comme lus</b> ?\",\n \"USER_HAS_NO_PROFILE\": \"Cette identité n'a aucun profil Cesium+. Il se peut qu'elle n'utilise pas l'extension Cesium+, et <b>ne consultera donc pas votre message</b>.<br/><br/>Êtes-vous sûr de vouloir <b>continuer</b> malgré tout ?\"\n },\n \"INFO\": {\n \"MESSAGE_REMOVED\": \"Message supprimé\",\n \"All_MESSAGE_REMOVED\": \"Tous les messages ont été supprimés\",\n \"MESSAGE_SENT\": \"Message envoyé\"\n },\n \"ERROR\": {\n \"SEND_MSG_FAILED\": \"Erreur lors de l'envoi du message.\",\n \"LOAD_MESSAGES_FAILED\": \"Erreur lors de la récupération des messages.\",\n \"LOAD_MESSAGE_FAILED\": \"Erreur lors de la récupération du message.\",\n \"MESSAGE_NOT_READABLE\": \"Lecture du message impossible.\",\n \"USER_NOT_RECIPIENT\": \"Vous n'êtes pas le destinataire de ce message : déchiffrement impossible.\",\n \"NOT_AUTHENTICATED_MESSAGE\": \"L'authenticité du message est douteuse ou son contenu est corrompu.\",\n \"REMOVE_MESSAGE_FAILED\": \"Erreur de suppression du message\",\n \"MESSAGE_CONTENT_TOO_LONG\": \"Valeur trop longue ({{maxLength}} caractères max).\",\n \"MARK_AS_READ_FAILED\": \"Impossible de marquer le message comme 'lu'.\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Erreur lors de la récupération des notifications de messages.\",\n \"REMOVE_All_MESSAGES_FAILED\": \"Erreur lors de la suppression de tous les messages.\",\n \"MARK_ALL_AS_READ_FAILED\": \"Erreur lors du marquage des messages comme lus.\",\n \"RECIPIENT_IS_MANDATORY\": \"Le destinataire est obligatoire.\"\n }\n },\n \"BLOCKCHAIN\": {\n \"LOOKUP\": {\n \"SEARCH_HELP\": \"Numéro de bloc, hash, clé publique, etc.\",\n \"POPOVER_FILTER_TITLE\": \"Filtres\",\n \"HEADER_MEDIAN_TIME\": \"Date / Heure\",\n \"HEADER_BLOCK\": \"Bloc #\",\n \"HEADER_ISSUER\": \"Noeud émetteur\",\n \"BTN_LAST\": \"Derniers blocs\",\n \"DISPLAY_QUERY\": \"Afficher la requête\",\n \"HIDE_QUERY\": \"Masquer la requête\",\n \"TX_SEARCH_FILTER\": {\n \"MEMBER_FLOWS\": \"<b class=\\\"ion-person\\\"></b> Entrées/sorties de membres\",\n \"EXISTING_TRANSACTION\": \"<b class=\\\"ion-card\\\"></b> Avec transactions\",\n \"PERIOD\": \"<b class=\\\"ion-clock\\\"></b> Entre <b class=\\\"gray\\\">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) et <b class=\\\"gray\\\">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})\",\n \"ISSUER\": \"<b class=\\\"ion-android-desktop\\\"></b> Calculé par <b class=\\\"ion-key\\\"></b> {{params[1]|formatPubkey}}\",\n \"TX_PUBKEY\": \"<b class=\\\"ion-card\\\"></b> Transactions concernant <b class=\\\"ion-key\\\"></b> {{params[1]|formatPubkey}}\"\n }\n },\n \"ERROR\": {\n \"SEARCH_BLOCKS_FAILED\": \"Erreur de la recherche des blocs.\"\n }\n },\n \"GROUP\": {\n \"GENERAL_DIVIDER\": \"Informations générales\",\n \"LOCATION_DIVIDER\": \"Adresse\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Réseaux sociaux et site web\",\n \"TECHNICAL_DIVIDER\": \"Informations techniques\",\n \"CREATED_TIME\": \"Créé {{creationTime|formatFromNow}}\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Invitations\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Groupes\",\n \"SEARCH_HELP\": \"Nom de groupe, mots, lieu, etc.\",\n \"LAST_RESULTS_LIST\": \"Nouveaux groupes :\",\n \"OPEN_RESULTS_LIST\": \"Groupes ouverts :\",\n \"MANAGED_RESULTS_LIST\": \"Groupes fermés :\",\n \"BTN_LAST\": \"Nouveaux groupes\",\n \"BTN_NEW\": \"J'ajoute un groupe\"\n },\n \"TYPE\": {\n \"TITLE\": \"Nouveau groupe\",\n \"SELECT_TYPE\": \"Type de groupe :\",\n \"OPEN_GROUP\": \"Groupe ouvert\",\n \"OPEN_GROUP_HELP\": \"Un groupe ouvert est accessible par n'importe quel membre de la monnaie.\",\n \"MANAGED_GROUP\": \"Groupe administré\",\n \"MANAGED_GROUP_HELP\": \"un groupe administré est géré par des administrateurs et des modérateurs, qui peuvent accepter, refuser ou exclure un membre en son sein.\",\n \"ENUM\": {\n \"OPEN\": \"Groupe ouvert\",\n \"MANAGED\": \"Groupe administré\"\n }\n },\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"MENU_TITLE\": \"Options\",\n \"REMOVE_CONFIRMATION\" : \"Êtes-vous sûr de vouloir supprimer ce groupe ?<br/><br/>Cette opération est irréversible.\"\n },\n \"EDIT\": {\n \"TITLE\": \"Groupe\",\n \"TITLE_NEW\": \"Nouveau groupe\",\n \"RECORD_TITLE\": \"Titre\",\n \"RECORD_TITLE_HELP\": \"Titre\",\n \"RECORD_DESCRIPTION\": \"Description\",\n \"RECORD_DESCRIPTION_HELP\": \"Description\"\n },\n \"ERROR\": {\n \"SEARCH_GROUPS_FAILED\": \"Échec de la recherche de groupes\",\n \"REMOVE_RECORD_FAILED\": \"Erreur de la suppression du groupe\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Groupe supprimé\"\n }\n },\n \"REGISTRY\": {\n \"CATEGORY\": \"Activité principale\",\n \"GENERAL_DIVIDER\": \"Informations générales\",\n \"LOCATION_DIVIDER\": \"Adresse\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Réseaux sociaux et site web\",\n \"TECHNICAL_DIVIDER\": \"Informations techniques\",\n \"BTN_SHOW_WOT\": \"Personnes\",\n \"BTN_SHOW_WOT_HELP\": \"Rechercher des personnes\",\n \"BTN_SHOW_PAGES\": \"Pages\",\n \"BTN_SHOW_PAGES_HELP\": \"Rechercher des pages\",\n \"BTN_NEW\": \"Créer une page\",\n \"MY_PAGES\": \"Mes pages\",\n \"NO_PAGE\": \"Aucune page\",\n \"SEARCH\": {\n \"TITLE\": \"Pages\",\n \"SEARCH_HELP\": \"Quoi, Qui : restaurant, Chez Marcel, ...\",\n \"BTN_ADD\": \"Nouveau\",\n \"BTN_LAST_RECORDS\": \"Pages récentes\",\n \"BTN_ADVANCED_SEARCH\": \"Recherche avancée\",\n \"BTN_OPTIONS\": \"Recherche avancée\",\n \"TYPE\": \"Type de page\",\n \"LOCATION_HELP\": \"Où : Code postal, Ville\",\n \"RESULTS\": \"Résultats\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} résultat{{count>0?'s':''}}, près de {{location}}\",\n \"RESULT_COUNT\": \"{{count}} résultat{{count>0?'s':''}}\",\n \"LAST_RECORDS\": \"Pages récentes\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} page{{count>0?'s':''}} récente{{count>0?'s':''}}, près de {{location}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} page{{count>0?'s':''}} récente{{count>0?'s':''}}\",\n \"POPOVER_FILTERS\": {\n \"BTN_ADVANCED_SEARCH\": \"Options avancées ?\"\n }\n },\n \"VIEW\": {\n \"TITLE\": \"Annuaire\",\n \"CATEGORY\": \"Activité principale :\",\n \"LOCATION\": \"Adresse :\",\n \"MENU_TITLE\": \"Options\",\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"REMOVE_CONFIRMATION\" : \"Êtes-vous sûr de vouloir supprimer cette page ?<br/><br/>Cette opération est irréversible.\"\n },\n \"TYPE\": {\n \"TITLE\": \"Types\",\n \"SELECT_TYPE\": \"Type de page :\",\n \"ENUM\": {\n \"SHOP\": \"Commerce local\",\n \"COMPANY\": \"Entreprise\",\n \"ASSOCIATION\": \"Association\",\n \"INSTITUTION\": \"Institution\"\n }\n },\n \"EDIT\": {\n \"TITLE\": \"Edition\",\n \"TITLE_NEW\": \"Nouvelle page\",\n \"RECORD_TYPE\":\"Type de page\",\n \"RECORD_TITLE\": \"Nom\",\n \"RECORD_TITLE_HELP\": \"Nom\",\n \"RECORD_DESCRIPTION\": \"Description\",\n \"RECORD_DESCRIPTION_HELP\": \"Description de l'activité\",\n \"RECORD_ADDRESS\": \"Rue\",\n \"RECORD_ADDRESS_HELP\": \"Rue, bâtiment...\",\n \"RECORD_CITY\": \"Ville\",\n \"RECORD_CITY_HELP\": \"Ville\",\n \"RECORD_SOCIAL_NETWORKS\": \"Réseaux sociaux et site web\",\n \"RECORD_PUBKEY\": \"Clé publique\",\n \"RECORD_PUBKEY_HELP\": \"Clé publique de réception des paiements\"\n },\n \"WALLET\": {\n \"PAGE_DIVIDER\": \"Pages\",\n \"PAGE_DIVIDER_HELP\": \"Les pages référencent des activités acceptant la monnaie ou la favorisant : commerces, entreprises, associations, institutions. Elles sont stockées en dehors du réseau de la monnaie, dans <a ui-sref=\\\"app.es_network\\\">le réseau des nœuds Cesium+</a>.\"\n },\n \"ERROR\": {\n \"LOAD_CATEGORY_FAILED\": \"Erreur de chargement de la liste des activités\",\n \"LOAD_RECORD_FAILED\": \"Erreur lors du chargement de la page\",\n \"LOOKUP_RECORDS_FAILED\": \"Erreur lors de l'exécution de la recherche\",\n \"REMOVE_RECORD_FAILED\": \"Erreur lors de la suppression de la page\",\n \"SAVE_RECORD_FAILED\": \"Erreur lors de la sauvegarde\",\n \"RECORD_NOT_EXISTS\": \"Page inexistante\",\n \"GEO_LOCATION_NOT_FOUND\": \"Ville ou code postal non trouvé\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Page supprimée\",\n \"RECORD_SAVED\": \"Page sauvegardée\"\n }\n },\n \"PROFILE\": {\n \"PROFILE_DIVIDER\": \"Profil Cesium+\",\n \"PROFILE_DIVIDER_HELP\": \"Il s'agit de données annexes, optionnelles. Elles sont stockées en dehors du réseau de la monnaie, dans <a ui-sref=\\\"app.es_network\\\">le réseau Cesium+</a>.\",\n \"NO_PROFILE_DEFINED\": \"Aucun profil saisi\",\n \"BTN_ADD\": \"Saisir mon profil\",\n \"BTN_EDIT\": \"Editer mon profil\",\n \"BTN_DELETE\": \"Supprimer mon profil\",\n \"BTN_REORDER\": \"Réordonner\",\n \"UID\": \"Pseudonyme\",\n \"TITLE\": \"Nom, Prénom\",\n \"TITLE_HELP\": \"Nom, Prénom\",\n \"DESCRIPTION\": \"A propos de moi\",\n \"DESCRIPTION_HELP\": \"A propos de moi...\",\n \"SOCIAL_HELP\": \"http://...\",\n \"GENERAL_DIVIDER\": \"Informations générales\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Réseaux sociaux, sites web\",\n \"TECHNICAL_DIVIDER\": \"Informations techniques\",\n \"MODAL_AVATAR\": {\n \"TITLE\": \"Photo de profil\",\n \"SELECT_FILE_HELP\": \"Veuillez <b>choisir le fichier image</b> :\",\n \"BTN_SELECT_FILE\": \"Choisir une photo\",\n \"RESIZE_HELP\": \"<b>Recadrez l'image</b>, si besoin. Un clic maintenu sur l'image permet de la déplacer. Cliquez sur la zone en bas à gauche pour zoomer.\",\n \"RESULT_HELP\": \"<b>Voici le résultat</b> tel que visible sur votre profil :\"\n },\n \"CONFIRM\": {\n \"DELETE\": \"Êtes-vous sûr de vouloir <b>supprimer votre profil Cesium+ ?</b><br/><br/>Cette opération est irréversible.\",\n \"DELETE_BY_MODERATOR\": \"Êtes-vous sûr de vouloir <b>supprimer ce profil Cesium+ ?</b><br/><br/>Cette opération est irréversible.\"\n },\n \"ERROR\": {\n \"REMOVE_PROFILE_FAILED\": \"Erreur de suppression du profil\",\n \"LOAD_PROFILE_FAILED\": \"Erreur de chargement du profil\",\n \"SAVE_PROFILE_FAILED\": \"Erreur lors de la sauvegarde\",\n \"DELETE_PROFILE_FAILED\": \"Erreur lors de la suppression du profil\",\n \"INVALID_SOCIAL_NETWORK_FORMAT\": \"Format non pris en compte : veuillez indiquer une adresse valide.<br/><br/>Exemples :<ul><li>- Une page Facebook (https://www.facebook.com/user)</li><li>- Une page web (http://www.monsite.fr)</li><li>- Une adresse email (joe@dalton.com)</li></ul>\",\n \"IMAGE_RESIZE_FAILED\": \"Erreur lors du redimensionnement de l'image\"\n },\n \"INFO\": {\n \"PROFILE_REMOVED\": \"Profil supprimé\",\n \"PROFILE_SAVED\": \"Profil sauvegardé\"\n },\n \"HELP\": {\n \"WARNING_PUBLIC_DATA\": \"Les informations renseignées dans votre profil <b>sont publiques</b> : visibles y compris par des personnes <b>non connectées</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}\"\n }\n },\n \"LOCATION\": {\n \"BTN_GEOLOC_ADDRESS\": \"Trouver mon adresse sur la carte\",\n \"USE_GEO_POINT\": \"Apparaître sur les cartes {{'COMMON.APP_NAME'|translate}} ?\",\n \"LOADING_LOCATION\": \"Recherche de l'adresse...\",\n \"LOCATION_DIVIDER\": \"Adresse\",\n \"ADDRESS\": \"Rue\",\n \"ADDRESS_HELP\": \"Rue, complément d'adresse...\",\n \"CITY\": \"Ville\",\n \"CITY_HELP\": \"Code postal, Ville, Pays\",\n \"DISTANCE\": \"Distance maximale autour de la ville\",\n \"DISTANCE_UNIT\": \"km\",\n \"DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"SEARCH_HELP\": \"Code postal, Ville\",\n \"PROFILE_POSITION\": \"Position du profil\",\n \"MODAL\": {\n \"TITLE\": \"Recherche de l'adresse\",\n \"SEARCH_HELP\": \"Ville, Code postal, Pays\",\n \"ALTERNATIVE_RESULT_DIVIDER\": \"Résultats alternatifs pour <b>{{address}}</b> :\",\n \"POSITION\": \"Lat/Lon : {{lat}}/{{lon}}\"\n },\n \"ERROR\": {\n \"CITY_REQUIRED_IF_STREET\": \"Champ obligatoire (car une rue est saisie)\",\n \"REQUIRED_FOR_LOCATION\": \"Champ obligatoire pour apparaître sur la carte\",\n \"INVALID_FOR_LOCATION\": \"Adresse inconnue\",\n \"GEO_LOCATION_FAILED\": \"Impossible de récupérer votre position. Veuillez utiliser le bouton de recherche.\",\n \"ADDRESS_LOCATION_FAILED\": \"Impossible de récupérer la position à partir de l'adresse\"\n }\n },\n \"SUBSCRIPTION\": {\n \"SUBSCRIPTION_DIVIDER\": \"Services en ligne\",\n \"SUBSCRIPTION_DIVIDER_HELP\": \"Les services en ligne offrent des services supplémentaires et optionnels, délégués à un perstataire de votre choix. Par exemple, pour recevoir les notifications de paiement par email.\",\n \"BTN_ADD\": \"Ajouter un service\",\n \"BTN_EDIT\": \"Gérer mes services\",\n \"NO_SUBSCRIPTION\": \"Aucun service utilisé\",\n \"SUBSCRIPTION_COUNT\": \"Services / Abonnements\",\n \"EDIT\": {\n \"TITLE\": \"Services en ligne\",\n \"HELP_TEXT\": \"Gérez ici vos abonnements et autres services en ligne\",\n \"PROVIDER\": \"Prestataire :\"\n },\n \"TYPE\": {\n \"ENUM\": {\n \"EMAIL\": \"Recevoir les notifications par email\"\n }\n },\n \"CONFIRM\": {\n \"DELETE_SUBSCRIPTION\": \"Êtes-vous sûr de vouloir <b>supprimer cet abonnement</b> ?\"\n },\n \"ERROR\": {\n \"LOAD_SUBSCRIPTIONS_FAILED\": \"Erreur lors du chargement des services en ligne\",\n \"ADD_SUBSCRIPTION_FAILED\": \"Erreur de l'envoi de l'abonnement\",\n \"UPDATE_SUBSCRIPTION_FAILED\": \"Erreur de la mise à jour de l'abonnement\",\n \"DELETE_SUBSCRIPTION_FAILED\": \"Erreur lors de la suppression de l'abonnement\"\n },\n \"MODAL_EMAIL\": {\n \"TITLE\": \"Notification par email\",\n \"HELP\": \"Remplissez ce formulaire pour <b>être notifié par email</b> des événements de votre compte.<br/>Votre adresse email sera chiffrée pour n'être visible que par le prestataire de service.\",\n \"EMAIL_LABEL\": \"Votre email :\",\n \"EMAIL_HELP\": \"jean.dupond@domaine.com\",\n \"FREQUENCY_LABEL\": \"Fréquence des notifications :\",\n \"FREQUENCY_DAILY\": \"Journalier\",\n \"FREQUENCY_WEEKLY\": \"Hebdomadaire\",\n \"PROVIDER\": \"Prestataire du service :\"\n }\n },\n \"DOCUMENT\": {\n \"HASH\": \"Hash : \",\n \"LOOKUP\": {\n \"TITLE\": \"Recherche de documents\",\n \"BTN_ACTIONS\": \"Actions\",\n \"SEARCH_HELP\": \"issuer:AAA*, time:1508406169\",\n \"LAST_DOCUMENTS_DOTS\": \"Derniers documents :\",\n \"LAST_DOCUMENTS\": \"Derniers documents\",\n \"SHOW_QUERY\": \"Voir la requête\",\n \"HIDE_QUERY\": \"Masquer la requête\",\n \"HEADER_TIME\": \"Date/Heure\",\n \"HEADER_ISSUER\": \"Emetteur\",\n \"HEADER_RECIPIENT\": \"Destinataire\",\n \"READ\": \"Lu\",\n \"BTN_REMOVE\": \"Supprimer ce document\",\n \"BTN_COMPACT\": \"Compacter\",\n \"HAS_CREATE_OR_UPDATE_PROFILE\": \"a créé ou modifié son profil\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Actions\",\n \"REMOVE_ALL\": \"Supprimer ces documents...\"\n }\n },\n \"INFO\": {\n \"REMOVED\": \"Document supprimé\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Êtes-vous sûr de vouloir <b>supprimer ce document</b> ?\",\n \"REMOVE_ALL\": \"Êtes-vous sûr de vouloir <b>supprimer ces documents</b> ?\"\n },\n \"ERROR\": {\n \"LOAD_DOCUMENTS_FAILED\": \"Erreur lors de la recherche de documents\",\n \"REMOVE_FAILED\": \"Erreur lors de la suppression du document\",\n \"REMOVE_ALL_FAILED\": \"Erreur lors de la suppression des documents\"\n }\n },\n \"ES_SETTINGS\": {\n \"PLUGIN_NAME\": \"Cesium+\",\n \"PLUGIN_NAME_HELP\": \"Profils, notifications, messages privés\",\n \"ENABLE_TOGGLE\": \"Activer l'extension ?\",\n \"ENABLE_REMOTE_STORAGE\": \"Activer le stockage distant ?\",\n \"ENABLE_REMOTE_STORAGE_HELP\": \"Permet de stockage (chiffré) de vos paramètres sur les noeuds Cesium+\",\n \"ENABLE_MESSAGE_TOGGLE\": \"Activer les messages privés ?\",\n \"PEER\": \"Nœud de données Cesium+\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Nœud de données\",\n \"HELP\" : \"Saisissez l'adresse du nœud que vous voulez utiliser :\",\n \"PEER_HELP\": \"serveur.domaine.com:port\"\n },\n \"NOTIFICATIONS\": {\n \"DIVIDER\": \"Notifications\",\n \"HELP_TEXT\": \"Activez les types de notifications que vous souhaitez recevoir :\",\n \"ENABLE_TX_SENT\": \"Notifier les <b>paiements émis</b> ?\",\n \"ENABLE_TX_RECEIVED\": \"Notifier les <b>paiements reçus</b> ?\",\n \"ENABLE_CERT_SENT\": \"Notifier les <b>certifications émises</b> ?\",\n \"ENABLE_CERT_RECEIVED\": \"Notifier les <b>certifications reçues</b> ?\",\n \"ENABLE_HTML5_NOTIFICATION\": \"Avertir à chaque nouvelle notification ?\",\n \"ENABLE_HTML5_NOTIFICATION_HELP\": \"Ouvre une petite fenêtre à chaque nouvelle notification.\"\n },\n \"CONFIRM\": {\n \"ASK_ENABLE_TITLE\": \"Fonctionnalités optionnelles\",\n \"ASK_ENABLE\": \"L'extension Cesium+ est <b>désactivée</b> dans vos paramètres, rendant inactives les fonctionnalités : <ul><li> <b><i class=\\\"icon ion-person\\\"></i> Profils Cesium+</b>;<li> <b><i class=\\\"icon ion-android-notifications\\\"></i> Notifications</b>;<li> <b><i class=\\\"icon ion-email\\\"></i> Messages privés</b>.<li> <b><i class=\\\"icon ion-location\\\"></i> Cartes, etc.</b>.</ul><br/><b>Souhaitez-vous ré-activer</b> l'extension ?\"\n }\n },\n \"ES_WALLET\": {\n \"ERROR\": {\n \"RECIPIENT_IS_MANDATORY\": \"Un destinataire est obligatoire pour le chiffrement.\"\n }\n },\n \"ES_PEER\": {\n \"NAME\": \"Nom\",\n \"DOCUMENTS\": \"Documents\",\n \"SOFTWARE\": \"Logiciel\",\n \"DOCUMENT_COUNT\": \"Nombre de documents\",\n \"EMAIL_SUBSCRIPTION_COUNT\": \"{{emailSubscription}} abonné{{emailSubscription ? 's' : ''}} aux notifications par email\"\n },\n \"EVENT\": {\n \"NODE_STARTED\": \"Votre noeud ES API <b>{{params[0]}}</b> est démarré\",\n \"NODE_BMA_DOWN\": \"Le noeud <b>{{params[0]}}:{{params[1]}}</b> (utilisé par votre noeud ES API) est <b>injoignable</b>.\",\n \"NODE_BMA_UP\": \"Le noeud <b>{{params[0]}}:{{params[1]}}</b> est à nouveau accessible.\",\n \"MEMBER_JOIN\": \"Vous êtes maintenant <b>membre</b> de la monnaie <b>{{params[0]}}</b> !\",\n \"MEMBER_LEAVE\": \"Vous n'êtes <b>plus membre</b> de la monnaie <b>{{params[0]}}</b> !\",\n \"MEMBER_EXCLUDE\": \"Vous n'êtes <b>plus membre</b> de la monnaie <b>{{params[0]}}</b>, faute de non renouvellement ou par manque de certifications.\",\n \"MEMBER_REVOKE\": \"La révocation de votre compte a été effectuée. Il ne pourra plus être un compte membre de la monnaie <b>{{params[0]}}</b>.\",\n \"MEMBER_ACTIVE\": \"Votre renouvellement d'adhésion à la monnaie <b>{{params[0]}}</b> a été <b>pris en compte</b>.\",\n \"TX_SENT\": \"Votre <b>paiement</b> à <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> a été effectué.\",\n \"TX_SENT_MULTI\": \"Votre <b>paiement</b> à <b>{{params[1]}}</b> a été effectué.\",\n \"TX_RECEIVED\": \"Vous avez <b>reçu un paiement</b> de <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span>.\",\n \"TX_RECEIVED_MULTI\": \"Vous avez <b>reçu un paiement</b> de <b>{{params[1]}}</b>.\",\n \"CERT_SENT\": \"Votre <b>certification</b> à <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> a été effectuée.\",\n \"CERT_RECEIVED\": \"Vous avez <b>reçu une certification</b> de <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span>.\",\n \"USER\": {\n \"LIKE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> aime votre profil\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> suit votre activité\",\n \"STAR_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> vous a noté ({{params[3]}} <b class=\\\"ion-star\\\">)\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> vous demande une modération sur le profil : <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> demande la suppression d'un profil : <b>{{params[2]}}</b>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> a signalé votre profil\"\n },\n \"PAGE\": {\n \"NEW_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> a commenté votre page : <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> a modifié son commentaire sur votre page : <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> a répondu à votre commentaire sur la page : <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> a modifié sa réponse à votre commentaire sur la page : <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> a commenté la page : <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> a modifié son commentaire sur la page : <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> a ajouté la page : <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> a modifié la page : <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> vous demande une modération sur la page : <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> a signalé une page à supprimer : <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> a signalé votre page : <b>{{params[2]}}</b>\"\n }\n },\n \"LIKE\": {\n \"ERROR\": {\n \"FAILED_TOGGLE_LIKE\": \"Impossible d'exécuter cette action.\"\n }\n },\n \"CONFIRM\": {\n \"ES_USE_FALLBACK_NODE\": \"Nœud de données <b>{{old}}</b> injoignable ou adresse invalide.<br/><br/>Voulez-vous temporairement utiliser le nœud de données <b>{{new}}</b> ?\"\n },\n \"ERROR\": {\n \"ES_CONNECTION_ERROR\": \"Nœud de données <b>{{server}}</b> injoignable ou adresse invalide.<br/><br/>Cesium va continuer à fonctionner, <b>sans l'extension Cesium+</b> (profils utilisateur, messages privés, cartes et graphiques)<br/><br/>Vérifiez votre connexion Internet, ou changez de nœud de données dans les <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">paramètres de l'extension</a>.\",\n \"ES_MAX_UPLOAD_BODY_SIZE\": \"Le volume des données à envoyer dépasse la limite fixée par le serveur.<br/>Veuillez ré-essayer après avoir, par exemple, supprimer des photos.\"\n }\n}\n);\n\n$translateProvider.translations(\"it-IT\", {\n \"COMMON\": {\n \"CATEGORY\": \"Categoria\",\n \"CATEGORIES\": \"Categorie\",\n \"CATEGORY_SEARCH_HELP\": \"Ricerca\",\n \"LAST_MODIFICATION_DATE\": \"Aggiornato il \",\n \"SUBMIT_BY\": \"Inviato da\",\n \"BTN_PUBLISH\": \"Pubblicare\",\n \"BTN_PICTURE_DELETE\": \"Eliminare\",\n \"BTN_PICTURE_FAVORISE\": \"Predefinito\",\n \"BTN_PICTURE_ROTATE\": \"Girare\",\n \"BTN_ADD_PICTURE\": \"Aggiungere foto\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Notifiche\",\n \"MARK_ALL_AS_READ\": \"Segna tutte come lette\",\n \"NO_RESULT\": \"Nessuna notifica\",\n \"SHOW_ALL\": \"Mostrare tutte\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Impossibile caricare le notifiche\"\n }\n },\n \"MENU\": {\n \"REGISTRY\": \"Pagine\",\n \"USER_PROFILE\": \"Mio profilo\",\n \"MESSAGES\": \"Messaggi\",\n \"NOTIFICATIONS\": \"Notifiche\",\n \"INVITATIONS\": \"Inviti\"\n },\n \"ACCOUNT\": {\n \"NEW\": {\n \"ORGANIZATION_ACCOUNT\": \"Conto per enti\",\n \"ORGANIZATION_ACCOUNT_HELP\": \"Se rappresenta un'azienda, un'associazione, etc.<br/>Questo conto non potrà creare il Dividendo Universale.\"\n },\n \"EVENT\": {\n \"MEMBER_WITHOUT_PROFILE\": \"Per ottenere sue certificazioni più velocemente, riempire le informazioni<a ui-sref=\\\"app.edit_profile\\\">del suo profilo</a>. I membri della rete si fidano più volontieri di profili verificabili.\"\n },\n \"ERROR\": {\n \"WS_CONNECTION_FAILED\": \"Cesium non può ricevere notifiche a causa di un problema tecnico (di conessione al data node Cesium+).<br/><br/>Se il problema persiste, le chiediamo di <b>scegliere un'altro data node</b> nelle impostazioni di Cesium+.\"\n }\n },\n \"WOT\": {\n \"BTN_SUGGEST_CERTIFICATIONS_DOTS\": \"Suggerire delle identità da certificare..\",\n \"BTN_ASK_CERTIFICATIONS_DOTS\": \"Chiedere una certificazione ai membri...\",\n \"BTN_ASK_CERTIFICATION\": \"Chiedere una certificazione\",\n \"SUGGEST_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Suggerire delle certificazioni\",\n \"HELP\": \"Scegliere i suoi suggerimenti, aiuti\"\n },\n \"ASK_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Chiedere delle certificazioni\",\n \"HELP\": \"Selezionare un ricevente\"\n },\n \"SEARCH\": {\n \"DIVIDER_PROFILE\": \"Conti\",\n \"DIVIDER_PAGE\": \"Pagine\",\n \"DIVIDER_GROUP\": \"Gruppi\"\n },\n \"CONFIRM\": {\n \"SUGGEST_CERTIFICATIONS\": \"E’ sicuro(a) di voler <b>suggerire queste certificazioni</b> ?\",\n \"ASK_CERTIFICATION\": \" E’ sicuro(a) di voler <b>chiedere una certificazione</b> ?\",\n \"ASK_CERTIFICATIONS\": \" E’ sicuro(a) di voler <b>chiedere una certificazione</b> a questi membri ?\"\n }\n },\n \"INVITATION\": {\n \"TITLE\": \"Invitazioni\",\n \"NO_RESULT\": \"Nessun invito ricevuto\",\n \"BTN_DELETE_ALL\": \"Cancellare tutti gli inviti\",\n \"BTN_DELETE\": \"Cancellare l'invito\",\n \"BTN_NEW_INVITATION\": \"Nuovo invito\",\n \"ASK_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> ti ha chiesto una certificazione\",\n \"SUGGESTION_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{::pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> è proposto per ricevere una certificazione\",\n \"SUGGESTED_BY\": \"Suggerimento inviato da by <a class=\\\"positive\\\" href=\\\"#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}\\\">{{::issuer.name||issuer.uid}}</a>\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Inviti\"\n },\n \"LIST\": {\n \"TITLE\": \"Inviti\"\n },\n \"NEW\": {\n \"TITLE\": \"Nuovo invito\",\n \"RECIPIENTS\": \"A\",\n \"RECIPIENTS_HELP\": \"Riceventi dell'invito\",\n \"RECIPIENTS_MODAL_TITLE\": \"Riceventi\",\n \"RECIPIENTS_MODAL_HELP\": \"Scegliere riceventi:\",\n \"SUGGESTION_IDENTITIES\": \"Suggerimenti di identità da certificare\",\n \"SUGGESTION_IDENTITIES_HELP\": \"Suggerimenti di certificazioni\",\n \"SUGGESTION_IDENTITIES_MODAL_TITLE\": \"Suggerimenti\",\n \"SUGGESTION_IDENTITIES_MODAL_HELP\": \"Scegli tuoi sugerimenti:\"\n },\n \"CONFIRM\": {\n \"DELETE_ALL_CONFIRMATION\": \"Cancellare degli inviti è <b>una operazione irreversibile</b>.<br/><br/><b>Sei sicuro/a</b> di voler proseguire\",\n \"SEND_INVITATIONS_TO_CERTIFY\": \"<b>Sei sicuro/a</b> di voler <b>inviare questo suggerimento di certificazione</b> ?\"\n },\n \"INFO\": {\n \"INVITATION_SENT\": \"Invito inviato\"\n },\n \"ERROR\": {\n \"LOAD_INVITATIONS_FAILED\": \"Errore nel caricare gli inviti\",\n \"REMOVE_INVITATION_FAILED\": \"Errore nel cancellare gli inviti\",\n \"REMOVE_ALL_INVITATIONS_FAILED\": \"Errore nel cancellare inviti\",\n \"SEND_INVITATION_FAILED\": \"Errore nel invio degli inviti\",\n \"BAD_INVITATION_FORMAT\": \"<span class=\\\"assertive\\\"><i class=\\\"ion-close-circled\\\"></i> Invito illegibile (formatto sconosciuto)</span> - inviato da <a ui-sref=\\\"app.wot_identity({pubkey: '{{::pubkey}}', uid: '{{::uid}}' })\\\">{{::name||uid}}</a>\"\n }\n },\n \"COMMENTS\": {\n \"DIVIDER\": \"Commenti\",\n \"SHOW_MORE_COMMENTS\": \"Mostrare commenti precedenti\",\n \"COMMENT_HELP\": \"Suo commento o domanda...\",\n \"COMMENT_HELP_REPLY_TO\": \"Sua risposta...\",\n \"BTN_SEND\": \"Inviare\",\n \"POPOVER_SHARE_TITLE\": \"Messaggio #{{number}}\",\n \"REPLY\": \"Rispondere\",\n \"REPLY_TO\": \"Rispondere a:\",\n \"REPLY_TO_LINK\": \"In risposta a\",\n \"REPLY_TO_DELETED_COMMENT\": \"In risposta ad un commento cancellato\",\n \"REPLY_COUNT\": \"{{replyCount}} risposte\",\n \"DELETED_COMMENT\": \"Commento cancellato\",\n \"ERROR\": {\n \"FAILED_SAVE_COMMENT\": \"Salvare il commento cancellato\",\n \"FAILED_REMOVE_COMMENT\": \"Cancellazione del commento fallita\"\n }\n },\n \"MESSAGE\": {\n \"REPLY_TITLE_PREFIX\": \"Re: \",\n \"FORWARD_TITLE_PREFIX\": \"Fw: \",\n \"BTN_REPLY\": \"Rispondere\",\n \"BTN_COMPOSE\": \"Nuovo messaggio\",\n \"BTN_WRITE\": \"Scrivere\",\n \"NO_MESSAGE_INBOX\": \"Nessun messaggio ricevuto\",\n \"NO_MESSAGE_OUTBOX\": \"Nessun messaggio inviato\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Messaggi\",\n \"MESSAGE_RECEIVED\": \"Hai <b>ricevuto un messaggio/b><br/>da\"\n },\n \"LIST\": {\n \"INBOX\": \"In entrata\",\n \"OUTBOX\": \"In uscita\",\n \"TITLE\": \"Messaggi privati\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Opzioni\",\n \"DELETE_ALL\": \"Eliminare tutti i messaggi\"\n }\n },\n \"COMPOSE\": {\n \"TITLE\": \"Nuovo messaggio\",\n \"TITLE_REPLY\": \"Rispondere\",\n \"SUB_TITLE\": \"Nuovo messaggio\",\n \"TO\": \"A\",\n \"OBJECT\": \"Oggetto\",\n \"OBJECT_HELP\": \"Oggetto\",\n \"ENCRYPTED_HELP\": \"La informiamo che questo messaggio verrà criptato prima della sua spedizione in modo che solo il destinatario lo possa leggere e essere sicuro che ne sia Lei l'autore.\",\n \"MESSAGE\": \"Messaggio\",\n \"MESSAGE_HELP\": \"Contenuto del messaggio\",\n \"CONTENT_CONFIRMATION\": \"Nessun contenuto. <br/><br/>E’ sicura di voler inviare questo messaggio?\"\n },\n \"VIEW\": {\n \"TITLE\": \"Messaggio\",\n \"SENDER\": \"Inviato da\",\n \"RECIPIENT\": \"Inviato a\",\n \"NO_CONTENT\": \"Messaggio vuoto\",\n \"DELETE\": \"Cancellare il messaggio\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"E’ sicuro/a di voler <b>eliminare il messaggio</b>?<br/><br/> Questa operazione è irreversibile.\",\n \"REMOVE_ALL\": \"E’ sicuro/a di voler <b>eliminare tutti i messaggi</b>?<br/><br/> Questa operazione è irreversibile.\",\n \"MARK_ALL_AS_READ\": \"E’ sicuro/a di voler <b>segnare tutti i messaggi come letti/b>?\",\n \"USER_HAS_NO_PROFILE\": \"Questa identità non ha un profilo Cesium+. Pertanto non può <b>leggere il suo messaggio</b>.<br/><br/>E’ sicuro/a di voler <b>continuare</b>?\"\n },\n \"INFO\": {\n \"MESSAGE_REMOVED\": \"Messaggio eliminato correttamente\",\n \"All_MESSAGE_REMOVED\": \"Messaggi eliminati correttamente\",\n \"MESSAGE_SENT\": \"Messaggio inviato\"\n },\n \"ERROR\": {\n \"SEND_MSG_FAILED\": \"Errore nella spedizione del messaggio.\",\n \"LOAD_MESSAGES_FAILED\": \"Errore durante il caricamento dei messaggi.\",\n \"LOAD_MESSAGE_FAILED\": \"Errore durante il caricamento del messaggio.\",\n \"MESSAGE_NOT_READABLE\": \"Impossibile leggere il messaggio.\",\n \"USER_NOT_RECIPIENT\": \"Lei non è il destinatario del messaggio: impossibile leggerlo.\",\n \"NOT_AUTHENTICATED_MESSAGE\": \"Impossibile verificare l'autenticità del messaggio o contenuto corrotto.\",\n \"REMOVE_MESSAGE_FAILED\": \"Errore avvenuto durante l'eliminazione del messaggio\",\n \"MESSAGE_CONTENT_TOO_LONG\": \"Il contenuto supera il limite ({{maxLength}} caratteri ammessi).\",\n \"MARK_AS_READ_FAILED\": \"Impossibile segnare il messaggio come 'letto'.\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Errore nel caricare le notifiche.\",\n \"REMOVE_All_MESSAGES_FAILED\": \"Errore avvenuto durante l'eliminazione dei messaggi.\",\n \"MARK_ALL_AS_READ_FAILED\": \"Errore avvenuto nel segnare i messaggi come 'letti\",\n \"RECIPIENT_IS_MANDATORY\": \"Destinatario obbligatorio\"\n }\n },\n \"BLOCKCHAIN\": {\n \"LOOKUP\": {\n \"SEARCH_HELP\": \"Numero di blocco, hash...\",\n \"POPOVER_FILTER_TITLE\": \"Filtro\",\n \"HEADER_MEDIAN_TIME\": \"Data / Ora\",\n \"HEADER_BLOCK\": \"Blocco #\",\n \"HEADER_ISSUER\": \"Peer proprietario\",\n \"BTN_LAST\": \"Ultimi blocchi\",\n \"DISPLAY_QUERY\": \"Visualizzare query\",\n \"HIDE_QUERY\": \"Nascondere query\",\n \"TX_SEARCH_FILTER\": {\n \"MEMBER_FLOWS\": \"<b class=\\\"ion-person\\\"></b> Input/output Membri\",\n \"EXISTING_TRANSACTION\": \"<b class=\\\"ion-card\\\"></b> hanno transazioni\",\n \"PERIOD\": \"<b class=\\\"ion-clock\\\"></b> Tra <b class=\\\"gray\\\">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) e <b class=\\\"gray\\\">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})\",\n \"ISSUER\": \"<b class=\\\"ion-android-desktop\\\"></b> Calcolato da {{params[1]|formatPubkey}}\",\n \"TX_PUBKEY\": \"<b class=\\\"ion-card\\\"></b> Transazioni legate a <b class=\\\"ion-key\\\"></b> {{params[1]|formatPubkey}}\"\n }\n },\n \"ERROR\": {\n \"SEARCH_BLOCKS_FAILED\": \"Errore durante la ricerca dei blocchi.\"\n }\n },\n \"GROUP\": {\n \"GENERAL_DIVIDER\": \"Informazioni generali\",\n \"LOCATION_DIVIDER\": \"Indirizzo\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Presenza sui social e/o sito web\",\n \"TECHNICAL_DIVIDER\": \"Dati tecnici\",\n \"CREATED_TIME\": \"Creato {{creationTime|formatFromNow}}\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Inviti\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Gruppi\",\n \"SEARCH_HELP\": \"Nome del grupo, parole chiavi, luogo, etc.\",\n \"LAST_RESULTS_LIST\": \"Nuovi gruppi :\",\n \"OPEN_RESULTS_LIST\": \"Gruppi aperti :\",\n \"MANAGED_RESULTS_LIST\": \"Gruppi chiusi :\",\n \"BTN_LAST\": \"Nuovi gruppi\",\n \"BTN_NEW\": \"Aggiungo un grupo!\"\n },\n \"TYPE\": {\n \"TITLE\": \"Nuovo gruppo\",\n \"SELECT_TYPE\": \"Tipo di gruppo :\",\n \"OPEN_GROUP\": \"Gruppo aperto\",\n \"OPEN_GROUP_HELP\": \"Un gruppo aperto è accessibile da qualsiasi membro della moneta.\",\n \"MANAGED_GROUP\": \"Gruppo amministrato\",\n \"MANAGED_GROUP_HELP\": \"un gruppo amministrato è gestito da amministratori e moderatori, che possono accetare, rifiutare o escludere membri del gruppo.\",\n \"ENUM\": {\n \"OPEN\": \"Gruppo aperto\",\n \"MANAGED\": \"Gruppo amministrato\"\n }\n },\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"MENU_TITLE\": \"Opzioni\",\n \"REMOVE_CONFIRMATION\" : \"Sei sicuro/a di voler chiudere questo gruppo ?<br/><br/>Questa operazione è irreversibile.\"\n },\n \"EDIT\": {\n \"TITLE\": \"Gruppo\",\n \"TITLE_NEW\": \"Nuovo gruppo\",\n \"RECORD_TITLE\": \"Titolo\",\n \"RECORD_TITLE_HELP\": \"Titolo\",\n \"RECORD_DESCRIPTION\": \"Descrizione\",\n \"RECORD_DESCRIPTION_HELP\": \"Descrizione\"\n },\n \"ERROR\": {\n \"SEARCH_GROUPS_FAILED\": \"Errore nella ricerca di gruppi\",\n \"REMOVE_RECORD_FAILED\": \"Errore nel chiudere il gruppo\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Gruppo eliminato\"\n }\n },\n \"REGISTRY\": {\n \"CATEGORY\": \"Attività principale\",\n \"GENERAL_DIVIDER\": \"Informazioni di base\",\n \"LOCATION_DIVIDER\": \"Indirizzo\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Presenza sui social, sito web\",\n \"TECHNICAL_DIVIDER\": \"Dati tecnici\",\n \"BTN_SHOW_WOT\": \"Persone\",\n \"BTN_SHOW_WOT_HELP\": \"Cercare persone\",\n \"BTN_SHOW_PAGES\": \"Pagine\",\n \"BTN_SHOW_PAGES_HELP\": \"Cercare pagine\",\n \"BTN_NEW\": \"Aggiungere\",\n \"MY_PAGES\": \"Mie pagine\",\n \"NO_PAGE\": \"Nessuna pagina\",\n \"SEARCH\": {\n \"TITLE\": \"Pagine\",\n \"SEARCH_HELP\": \"Che, chi: parrucchiere, Pizza Efisio, ...\",\n \"BTN_ADD\": \"Nuovo\",\n \"BTN_LAST_RECORDS\": \"Pagine recenti\",\n \"BTN_ADVANCED_SEARCH\": \"Ricerca avanzata\",\n \"BTN_OPTIONS\": \"Ricerca avanzata\",\n \"TYPE\": \"Tipo di ente\",\n \"LOCATION_HELP\": \"Città\",\n \"RESULTS\": \"Risultati\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} risultato{{count>0?'i':''}}, vicino a {{location}}\",\n \"RESULT_COUNT\": \"{{count}} risultato{{count>0?'i':''}}\",\n \"LAST_RECORDS\": \"Pagine recenti:\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} pagina{{count>0?'e':''}} recente{{count>0?'i':''}}, vicino a{{location}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} pagina{{count>0?'e':''}} recente{{count>0?'i':''}}\",\n \"POPOVER_FILTERS\": {\n \"BTN_ADVANCED_SEARCH\": \"Opzioni avanzate ?\"\n }\n },\n \"VIEW\": {\n \"TITLE\": \"Annuario\",\n \"CATEGORY\": \"Attività principale:\",\n \"LOCATION\": \"Indirizzo:\",\n \"MENU_TITLE\": \"Impostazioni\",\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"REMOVE_CONFIRMATION\" : \"E’ sicuro/a di voler eliminare questo riferimento?<br/><br/>Questa operazione è irreversibile.\"\n },\n \"TYPE\": {\n \"TITLE\": \"Nuovo riferimento\",\n \"SELECT_TYPE\": \"Tipo di ente/organismo:\",\n \"ENUM\": {\n \"SHOP\": \"Negozi locali\",\n \"COMPANY\": \"Azienda\",\n \"ASSOCIATION\": \"Associazione\",\n \"INSTITUTION\": \"Istituto\"\n }\n },\n \"EDIT\": {\n \"TITLE\": \"Modificare\",\n \"TITLE_NEW\": \"Nuovo riferimento\",\n \"RECORD_TYPE\": \"Tipo di ente\",\n \"RECORD_TITLE\": \"Nome\",\n \"RECORD_TITLE_HELP\": \"Nome\",\n \"RECORD_DESCRIPTION\": \"Descrizione\",\n \"RECORD_DESCRIPTION_HELP\": \"Descrivere l'attività\",\n \"RECORD_ADDRESS\": \"Indirizzo\",\n \"RECORD_ADDRESS_HELP\": \"Indirizzo: Strada, numero civico...\",\n \"RECORD_CITY\": \"Città\",\n \"RECORD_CITY_HELP\": \"Città, Paese\",\n \"RECORD_SOCIAL_NETWORKS\": \"Presenza sui social e/o sito web\",\n \"RECORD_PUBKEY\": \"Chiave pubblica\",\n \"RECORD_PUBKEY_HELP\": \"Chiave pubblica per ricevere pagamenti\"\n },\n \"WALLET\": {\n \"PAGE_DIVIDER\": \"Pagine\",\n \"PAGE_DIVIDER_HELP\": \"Le pagine sono un elenco dei profesionisti che accettano o favoriscono: negozi, aziende, associazioni, istituti...\"\n },\n \"ERROR\": {\n \"LOAD_CATEGORY_FAILED\": \"Errore nel caricamento delle attività principali\",\n \"LOAD_RECORD_FAILED\": \"Caricamento fallito\",\n \"LOOKUP_RECORDS_FAILED\": \"Errore nel caricare i dati\",\n \"REMOVE_RECORD_FAILED\": \"Errore nella cancellazione\",\n \"SAVE_RECORD_FAILED\": \"Impossibile salvare\",\n \"RECORD_NOT_EXISTS\": \"Inesistente\",\n \"GEO_LOCATION_NOT_FOUND\": \"Città o CAP inesistente\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Pagina eliminata con successo.\",\n \"RECORD_SAVED\": \"Pagina salvata\"\n }\n },\n \"PROFILE\": {\n \"PROFILE_DIVIDER\": \"Profilo Cesium+\",\n \"PROFILE_DIVIDER_HELP\": \"Si tratta qui di data esterni, salvati fuori della rete della moneta.\",\n \"NO_PROFILE_DEFINED\": \"Nessun profilo Cesium+\",\n \"BTN_ADD\": \"Creare mio profilo\",\n \"BTN_EDIT\": \"Modificare mio profilo\",\n \"UID\": \"Pseudonimo\",\n \"TITLE\": \"Cognome, Nome\",\n \"TITLE_HELP\": \"Nome\",\n \"DESCRIPTION\": \"A proposito di me\",\n \"DESCRIPTION_HELP\": \"A proposito di me...\",\n \"SOCIAL_HELP\": \"http://...\",\n \"GENERAL_DIVIDER\": \"Informazioni generali\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Presenza sui social e sito/i web\",\n \"TECHNICAL_DIVIDER\": \"Dati tecnici\",\n \"MODAL_AVATAR\": {\n \"TITLE\": \"Avatar\",\n \"SELECT_FILE_HELP\": \"<b>Scegliere un'immagine</b>:\",\n \"BTN_SELECT_FILE\": \"Scegliere un'immagine\",\n \"RESIZE_HELP\": \"<b>Ritagliare l'immagine</b> se necessario. Cliccare sull'immagine permette di spostarla. Cliccando nella zona a basso sinistra permette di fare uno zoom-in.\",\n \"RESULT_HELP\": \"<b>Questo è il risultato</b> come visibile sul suo profilo:\"\n },\n \"ERROR\": {\n \"LOAD_PROFILE_FAILED\": \"Impossibile caricare il profilo dell’utente.\",\n \"SAVE_PROFILE_FAILED\": \"Impossibile salvare il profilo\",\n \"INVALID_SOCIAL_NETWORK_FORMAT\": \"Formatto scorretto: URL sbagliato.<br/><br/>Esempi: :<ul><li>- Una pagina Facebook (https://www.facebook.com/user)</li><li>- Un sito: (http://www.domain.com)</li><li>- Un indirizzo mail: (joe@dalton.com)</li></ul>\",\n \"IMAGE_RESIZE_FAILED\": \"Errore nel ritagliare l'immagine\"\n },\n \"INFO\": {\n \"PROFILE_SAVED\": \"Profilo salvato\"\n },\n \"HELP\": {\n \"WARNING_PUBLIC_DATA\": \"La informiamo che le informazioni qui pubblicate <b>sono pubbliche</b>: sono anche visibili <b>da gente non registrata/b>.\"\n }\n },\n \"LOCATION\": {\n \"BTN_GEOLOC_ADDRESS\": \"Trovare mio indirizzo sulla mappa\",\n \"USE_GEO_POINT\": \"Geo-localizzare (raccomandato)?\",\n \"LOADING_LOCATION\": \"Cercando indirizzo...\",\n \"LOCATION_DIVIDER\": \"Posizione\",\n \"ADDRESS\": \"Indirizzo\",\n \"ADDRESS_HELP\": \"Indirizzo (opzionale)\",\n \"CITY\": \"Città\",\n \"CITY_HELP\": \"Città, Paese\",\n \"DISTANCE\": \"Distanza massimale intorno alla città\",\n \"DISTANCE_UNIT\": \"km\",\n \"DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"SEARCH_HELP\": \"Città, CAP\",\n \"MODAL\": {\n \"TITLE\": \"Cercare indirizzo\",\n \"SEARCH_HELP\": \"Città, Paese\",\n \"ALTERNATIVE_RESULT_DIVIDER\": \"Risultati alternativi <b>{{address}}</b>:\",\n \"POSITION\": \"lat/lon : {{lat}} {{lon}}\"\n },\n \"ERROR\": {\n \"REQUIRED_FOR_LOCATION\": \"Campo obbligatorio per apparire sulla mappa\",\n \"INVALID_FOR_LOCATION\": \"Indirizzo sconosciuto\",\n \"GEO_LOCATION_FAILED\": \"Impossibile trovare sua posizione. Utilizzi il bottone di ricerca.\",\n \"ADDRESS_LOCATION_FAILED\": \"Indirizzo non trovato\"\n }\n },\n \"SUBSCRIPTION\": {\n \"SUBSCRIPTION_DIVIDER\": \"Servizi online\",\n \"SUBSCRIPTION_DIVIDER_HELP\": \"I servizi online offrono servizi addizionali opzionali, delegati ad terzi.\",\n \"BTN_ADD\": \"Aggiungere un servizio\",\n \"BTN_EDIT\": \"Gestire miei servizi\",\n \"NO_SUBSCRIPTION\": \"Nessun servizio utilizzato\",\n \"SUBSCRIPTION_COUNT\": \"Servizi/ Abbonamenti\",\n \"EDIT\": {\n \"TITLE\": \"Servizi online\",\n \"HELP_TEXT\": \"Qui si possono gestire gli abbonamenti e/o altri servizi online\",\n \"PROVIDER\": \"Prestatore :\"\n },\n \"TYPE\": {\n \"ENUM\": {\n \"EMAIL\": \"Ricevere notifiche per posta elettronica\"\n }\n },\n \"CONFIRM\": {\n \"DELETE_SUBSCRIPTION\": \"Sei sicuro/a di voler <b>cancellare questo abbonamento</b> ?\"\n },\n \"ERROR\": {\n \"LOAD_SUBSCRIPTIONS_FAILED\": \"Errore nel caricamento dei servizi online\",\n \"ADD_SUBSCRIPTION_FAILED\": \"Errore nel invio dell' abbonamento\",\n \"UPDATE_SUBSCRIPTION_FAILED\": \"Errore nel aggiornamento dell' abbonamento\",\n \"DELETE_SUBSCRIPTION_FAILED\": \"Errore nella cancellazine dell' abbonamento\"\n },\n \"MODAL_EMAIL\": {\n \"TITLE\" : \"Notifiche per posta elettronica\",\n \"HELP\" : \"Riempi questo formulario per <b>essere notificato/a per e-mail</b> degli eventi che avvengono sul tuo conto.<br/>Tuo indizzo mail sarà cifrato e solo il prestatore del servizio lo potrà vedere.\",\n \"EMAIL_LABEL\" : \"Tuo indirizzo mail :\",\n \"EMAIL_HELP\": \"cristiana.leonardi@dominio.com\",\n \"FREQUENCY_LABEL\": \"Frequenza delle notifiche :\",\n \"FREQUENCY_DAILY\": \"Quotidiano\",\n \"FREQUENCY_WEEKLY\": \"Settimanale\",\n \"PROVIDER\": \"Prestatore del servizio :\"\n }\n },\n \"DOCUMENT\": {\n \"HASH\": \"Hash: \",\n \"LOOKUP\": {\n \"TITLE\": \"Ricerca di documenti\",\n \"BTN_ACTIONS\": \"Azioni\",\n \"SEARCH_HELP\": \"issuer:AAA*, time:1508406169\",\n \"LAST_DOCUMENTS\": \"Ultimi documenti\",\n \"SHOW_QUERY\": \"Visualizzare la richiesta\",\n \"HIDE_QUERY\": \"Nacondere la richiesta\",\n \"HEADER_TIME\": \"Data/Ora\",\n \"HEADER_ISSUER\": \"Emittente\",\n \"HEADER_RECIPIENT\": \"Destinatario\",\n \"READ\": \"Letto\",\n \"BTN_REMOVE\": \"Eliminare questo documento\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Azioni\",\n \"REMOVE_ALL\": \"Eliminare questi documenti...\"\n }\n },\n \"INFO\": {\n \"REMOVED\": \"Documento eliminato\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Sei sicuro/a di voler <b>eliminare questo documento</b> ?\",\n \"REMOVE_ALL\": \"Si sicuro/a di voler <b>eliminare questi documenti</b> ?\"\n },\n \"ERROR\": {\n \"LOAD_DOCUMENTS_FAILED\": \"Errore nella ricerca dei documenti\",\n \"REMOVE_FAILED\": \"Errore nell'eliminazione del documento\",\n \"REMOVE_ALL_FAILED\": \"Errore nell'eliminazione dei documenti\"\n }\n },\n \"ES_SETTINGS\": {\n \"PLUGIN_NAME\": \"Cesium+\",\n \"PLUGIN_NAME_HELP\": \"Profili di utenti, notifiche, messaggi privati\",\n \"ENABLE_TOGGLE\": \"Abilitare l'estensione ?\",\n \"ENABLE_MESSAGE_TOGGLE\": \"Abilitare i messaggi? privati\",\n \"ENABLE_SETTINGS_TOGGLE\": \"Abilitare stoccaggio su dispositivi esterni per le impostazioni?\",\n \"PEER\": \"Indirizzo di data peers\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Data peer\",\n \"HELP\" : \"Definire l'indirizzo da usare per il peer:\",\n \"PEER_HELP\": \"server.domain.com:port\"\n },\n \"NOTIFICATIONS\": {\n \"DIVIDER\": \"Notifiche\",\n \"HELP_TEXT\": \"Scegliere le notifiche che accetta ricevere:\",\n \"ENABLE_TX_SENT\": \"Notificarmi di <b>pagamenti inviati</b> con successo?\",\n \"ENABLE_TX_RECEIVED\": \"Notificarmi di <b>pagamenti in entrata</b>?\",\n \"ENABLE_CERT_SENT\": \"Notificarmi delle <b>certificazioni inviate</b>?\",\n \"ENABLE_CERT_RECEIVED\": \"Notificarmi di <b>certificazioni ricevute</b>?\"\n },\n \"CONFIRM\": {\n \"ASK_ENABLE_TITLE\": \"Nuove funzionalità\",\n \"ASK_ENABLE\": \"Sono disponibili nuove funzionalità: <ul><li> <b><i class=\\\"icon ion-person\\\"></i>Profili di utenti</b>;<li> <b><i class=\\\"icon ion-android-notifications\\\"></i> Notifications</b>;<li> <b><i class=\\\"icon ion-email\\\"></i> Messaggi privati/b>.</ul><br/>Sono state <b>disabilitate</b> nelle sue impostazioni.<br/><br/><b>Desidera abilitare</b> queste funzionalità?\"\n }\n },\n \"ES_WALLET\": {\n \"ERROR\": {\n \"RECIPIENT_IS_MANDATORY\": \"Un destinatario è necessario per il criptaggio.\"\n }\n },\n \"EVENT\": {\n \"NODE_STARTED\": \"Suo nodo ES API <b>{{params[0]}}</b> è UP\",\n \"NODE_BMA_DOWN\": \"Nodo<b>{{params[0]}}:{{params[1]}}</b> (utilizzato dal suo ES API) è <b>indisponibile</b>.\",\n \"NODE_BMA_UP\": \"Nodo <b>{{params[0]}}:{{params[1]}}</b> è di nuovo attivo.\",\n \"MEMBER_JOIN\": \"E diventato <b>membro/a</b> della WoT della moneta <b>{{params[0]}}</b>!\",\n \"MEMBER_LEAVE\": \"Non <b>è più membro/a</b> della WoT della moneta <b>{{params[0]}}</b>!\",\n \"MEMBER_EXCLUDE\": \"Non è <b>più membro/a</b> della WoT della moneta<b>{{params[0]}}</b>, a causa di certificazioni non rinnovate o soglia di certificazioni non raggiunta.\",\n \"MEMBER_REVOKE\": \"Il suo conto è stato revocato. Da ora in poi non farà più parte della WoT. <b>{{params[0]}}</b>.\",\n \"MEMBER_ACTIVE\": \"La sua presenza nella WoT <b>{{params[0]}}</b> è stata <b>rinnovata correttamente</b>.\",\n \"TX_SENT\": \"Il suo pagamento <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> è stato eseguito.\",\n \"TX_SENT_MULTI\": \"Il suo pagamento <b>{{params[1]}}</b> è stato eseguito.\",\n \"TX_RECEIVED\": \"Ha ricevuto un pagamento da <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span>.\",\n \"TX_RECEIVED_MULTI\": \"Ha ricevuto un pagamento da <b>{{params[1]}}</b>.\",\n \"CERT_SENT\": \"Sua <b>certificazione</b> a favore di <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> è stata eseguita.\",\n \"CERT_RECEIVED\": \"Ha ricevuto <b>una certificazione</b> da parte di <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span>.\",\n \"PAGE\": {\n \"NEW_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> ha scritto un commento sul suo riferimento: <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> ha modificato il suo commento sul suo riferimento: <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> ha risposto al suo commento sul riferimento: <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> ha modificato sua risposta sul suo commento a proposito del riferimento: <b>{{params[2]}}</b>\"\n }\n },\n \"CONFIRM\": {\n \"ES_USE_FALLBACK_NODE\": \"Nodo<b>{{old}}</b> irraggiungibile o indirizzo sbagliato.<br/><br/>Vuoi utilizzare temporaneamente il nodo di dati <b>{{new}}</b> ?\"\n },\n \"ERROR\": {\n \"ES_CONNECTION_ERROR\": \"Nodo di dati<b>{{server}}</b> irraggiungibile o indirizzo sbagliato.<br/><br/>Cesium continuerà a funzionare <b>senza l'estensione Cesium+</b> (profili utenti, messaggi privati, mappe e grafici)<br/><br/>Verifica tua connessione o cambia nodo <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">impostazioni dell'estensione</a>.\",\n \"ES_MAX_UPLOAD_BODY_SIZE\": \"Il volume di data da inviare supera il limite imposto dal server.<br/><br/>Suggeriamo di riprovare dopo aver eliminato delle foto, per esempio.\"\n }\n }\n);\n\n$translateProvider.translations(\"nl-NL\", {\n \"COMMON\": {\n \"CATEGORY\": \"Categorie\",\n \"CATEGORIES\": \"Categorieën\",\n \"CATEGORY_SEARCH_HELP\": \"Zoeken\",\n \"LAST_MODIFICATION_DATE\": \"Vernieuwd op \",\n \"SUBMIT_BY\": \"Ingediend door\",\n \"BTN_PUBLISH\": \"Publiceren\",\n \"BTN_PICTURE_DELETE\": \"Wissen\",\n \"BTN_PICTURE_FAVORISE\": \"Default\",\n \"BTN_ADD_PICTURE\": \"Afbeelding toevoegen\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Notificaties\",\n \"MARK_ALL_AS_READ\": \"Markeer alles als gelezen\",\n \"NO_RESULT\": \"Geen berichten\",\n \"SHOW_ALL\": \"Toon alles\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Kan berichten niet laden\"\n }\n },\n \"MENU\": {\n \"REGISTRY\": \"Pagina's\",\n \"USER_PROFILE\": \"Mijn profiel\",\n \"MESSAGES\": \"Berichten\"\n },\n \"ACCOUNT\": {\n \"NEW\": {\n \"ORGANIZATION_ACCOUNT\": \"Ondernemingsrekening\",\n \"ORGANIZATION_ACCOUNT_HELP\": \"Als je een onderneming, vereniging etc. vertegenwoordigt.<br/>Deze rekening zal geen dividend créeren.\"\n },\n \"EVENT\": {\n \"MEMBER_WITHOUT_PROFILE\": \"Vul <a ui-sref=\\\"app.edit_profile\\\"je gebruikersprofiel</a> in om sneller een certificering te verkrijgen. Leden zullen een verfifieerbare identiteit eerder vertrouwen.\"\n }\n },\n \"COMMENTS\": {\n \"DIVIDER\": \"Commentaren\",\n \"SHOW_MORE_COMMENTS\": \"Toon eerdere commentaren\",\n \"COMMENT_HELP\": \"Jouw commentaar, vraag...\",\n \"COMMENT_HELP_REPLY_TO\": \"Jouw antwoord...\",\n \"BTN_SEND\": \"Verzenden\",\n \"POPOVER_SHARE_TITLE\": \"Bericht #{{number}}\",\n \"REPLY\": \"Antwoord\",\n \"REPLY_TO\": \"Antwoorden op:\",\n \"REPLY_TO_LINK\": \"In antwoord op \",\n \"REPLY_TO_DELETED_COMMENT\": \"In antwoord op een gewist bericht\",\n \"REPLY_COUNT\": \"{{replyCount}} antwoorden\",\n \"DELETED_COMMENT\": \"Bericht gewist\"\n },\n \"MESSAGE\": {\n \"REPLY_TITLE_PREFIX\": \"Re: \",\n \"FORWARD_TITLE_PREFIX\": \"Fw: \",\n \"BTN_REPLY\": \"Antwoord\",\n \"BTN_COMPOSE\": \"Nieuw bericht\",\n \"BTN_WRITE\": \"Schrijven\",\n \"NO_MESSAGE_INBOX\": \"Geen bericht ontvangen\",\n \"NO_MESSAGE_OUTBOX\": \"Geen bericht verzonden\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Berichten\",\n \"MESSAGE_RECEIVED\": \"Je hebt een <b>bericht ontvangen</b><br/>van\"\n },\n \"LIST\": {\n \"INBOX\": \"Inbox\",\n \"OUTBOX\": \"Verzonden\",\n \"TITLE\": \"Privé\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Opties\",\n \"DELETE_ALL\": \"Alle berichten wissen\"\n }\n },\n \"COMPOSE\": {\n \"TITLE\": \"Nieuw bericht\",\n \"TITLE_REPLY\": \"Antwoord\",\n \"SUB_TITLE\": \"Nieuw bericht\",\n \"TO\": \"Aan\",\n \"OBJECT\": \"Onderwerp\",\n \"OBJECT_HELP\": \"Onderwerp\",\n \"ENCRYPTED_HELP\": \"Please note this message will by encrypt before sending zodat alleen de ontvanger het kan lezen en zeker kan zijn dat jij de auteur bent.\",\n \"MESSAGE\": \"Bericht\",\n \"MESSAGE_HELP\": \"Berichtinhoud\",\n \"CONTENT_CONFIRMATION\": \"Geen berichtinhoud.<br/><br/>Weet je zeker dat je dit bericht wil verzenden?\"\n },\n \"VIEW\": {\n \"TITLE\": \"Bericht\",\n \"SENDER\": \"Verzonden door\",\n \"RECIPIENT\": \"Verzonden aan\",\n \"NO_CONTENT\": \"Leeg bericht\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Weet je zeker dat je <b>dit bericht wil wissen</b>?<br/><br/>Dit kan niet ongedaan gemaakt worden.\",\n \"REMOVE_ALL\": \"Weet je zeker dat je <b>alle berichten wil wissen</b>?<br/><br/>Dit kan niet ongedaan gemaakt worden.\",\n \"MARK_ALL_AS_READ\": \"Weet je zeker dat je <b>alle berichten als gelezen wil markeren</b>?\"\n },\n \"INFO\": {\n \"MESSAGE_REMOVED\": \"Bericht succesvol gewist\",\n \"All_MESSAGE_REMOVED\": \"Berichten succesvol gewist\",\n \"MESSAGE_SENT\": \"Bericht verzonden\"\n },\n \"ERROR\": {\n \"SEND_MSG_FAILED\": \"Fout tijdens verzending.\",\n \"LOAD_MESSAGES_FAILED\": \"Kan berichten niet laden.\",\n \"LOAD_MESSAGE_FAILED\": \"Kan bericht niet laden.\",\n \"MESSAGE_NOT_READABLE\": \"Kan bericht niet lezen.\",\n \"USER_NOT_RECIPIENT\": \"Je bent niet de geadresseerde van dit bericht: het kan niet gelezen worden.\",\n \"NOT_AUTHENTICATED_MESSAGE\": \"De authenticiteit van het bericht is onduidelijk of de inhoud is gecorrumpeerd.\",\n \"REMOVE_MESSAGE_FAILED\": \"Kan bericht niet wissen.\",\n \"MESSAGE_CONTENT_TOO_LONG\": \"Waarde te lang (max {{maxLength}} characters).\",\n \"MARK_AS_READ_FAILED\": \"Kan bericht niet als gelezen markeren.\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Kan niet alle berichtnotificaties laden.\",\n \"REMOVE_All_MESSAGES_FAILED\": \"Kan niet alle berichten wissen.\",\n \"MARK_ALL_AS_READ_FAILED\": \"Kan berichten niet als gelezen markeren.\"\n }\n },\n \"REGISTRY\": {\n \"CATEGORY\": \"Hoofdactiviteit\",\n \"GENERAL_DIVIDER\": \"Basisinformatie\",\n \"LOCATION_DIVIDER\": \"Adres\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Sociale media en website\",\n \"TECHNICAL_DIVIDER\": \"Technische informatie\",\n \"BTN_NEW\": \"Toevoegen\",\n \"SEARCH\": {\n \"TITLE\": \"Bedrijfsregister\",\n \"TITLE_SMALL_DEVICE\": \"Bedrijfsregister\",\n \"SEARCH_HELP\": \"Wie, Wat: kapper, Lili's restaurant, ...\",\n \"BTN_ADD\": \"Nieuw\",\n \"BTN_OPTIONS\": \"Geavanceerd zoeken\",\n \"TYPE\": \"Soort organisatie\",\n \"LOCATION\": \"Locatie\",\n \"LOCATION_HELP\": \"Plaats\",\n \"LAST_RECORDS\": \"Nieuwste referenties:\",\n \"RESULTS\": \"Resultaten:\"\n },\n \"VIEW\": {\n \"TITLE\": \"Register\",\n \"CATEGORY\": \"Hoofdactiviteit:\",\n \"LOCATION\": \"Adres:\",\n \"MENU_TITLE\": \"Opties\",\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"REMOVE_CONFIRMATION\" : \"Weet je zeker dat je deze referentie wil verwijderen?<br/><br/>Dit kan niet ongedaan worden gemaakt.\"\n },\n \"TYPE\": {\n \"TITLE\": \"Nieuwe referentie\",\n \"SELECT_TYPE\": \"Soort organizatie:\",\n \"ENUM\": {\n \"SHOP\": \"Locale winkel\",\n \"COMPANY\": \"Onderneming\",\n \"ASSOCIATION\": \"Stichting\",\n \"INSTITUTION\": \"Instituut\"\n }\n },\n \"EDIT\": {\n \"TITLE\": \"Bewerk\",\n \"TITLE_NEW\": \"Nieuwe referentie\",\n \"RECORD_TYPE\":\"Soort organizatie\",\n \"RECORD_TITLE\": \"Naam\",\n \"RECORD_TITLE_HELP\": \"Naam\",\n \"RECORD_DESCRIPTION\": \"Beschrijving\",\n \"RECORD_DESCRIPTION_HELP\": \"Omschrijf activiteit\",\n \"RECORD_ADDRESS\": \"Straat\",\n \"RECORD_ADDRESS_HELP\": \"Straat, gebouw...\",\n \"RECORD_CITY\": \"Plaats\",\n \"RECORD_CITY_HELP\": \"Plaats\",\n \"RECORD_SOCIAL_NETWORKS\": \"Sociale media en website\",\n \"RECORD_PUBKEY\": \"Publieke sleutel\",\n \"RECORD_PUBKEY_HELP\": \"Publieke sleutel om betalingen te ontvangen\"\n },\n \"ERROR\": {\n \"LOAD_CATEGORY_FAILED\": \"Laden hoofdactiveiten mislukt\",\n \"LOAD_RECORD_FAILED\": \"Laden datasheet mislukt\",\n \"LOOKUP_RECORDS_FAILED\": \"Opzoeken datasheets is mislukt.\",\n \"REMOVE_RECORD_FAILED\": \"Verwijderen datasheet mislukt\",\n \"SAVE_RECORD_FAILED\": \"Opslaan datasheet mislukt\",\n \"RECORD_NOT_EXISTS\": \"Datasheet niet gevonden\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Datasheet succesvol verwijderd\"\n }\n },\n \"PROFILE\": {\n \"UID\": \"Pseudoniem\",\n \"TITLE\": \"Naam\",\n \"TITLE_HELP\": \"Naam\",\n \"DESCRIPTION\": \"Over mij\",\n \"DESCRIPTION_HELP\": \"Over mij...\",\n \"ADDRESS\": \"Adres\",\n \"ADDRESS_HELP\": \"Adres (optioneel)\",\n \"CITY\": \"Plaats\",\n \"CITY_HELP\": \"Plaats (optioneel)\",\n \"SOCIAL_HELP\": \"http://...\",\n \"GENERAL_DIVIDER\": \"Algemene informatie\",\n \"LOCATION_DIVIDER\": \"Localisatie\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Sociale media en website\",\n \"TECHNICAL_DIVIDER\": \"Technische informatie\",\n \"ERROR\": {\n \"LOAD_PROFILE_FAILED\": \"Kon gebruikersprofiel niet laden.\",\n \"SAVE_PROFILE_FAILED\": \"Opslaan profiel mislukt\",\n \"INVALID_SOCIAL_NETWORK_FORMAT\": \"Ongeldig formaat: vul een geldig internetadres in.<br/><br/>Voorbeelden:<ul><li>- Een Facebookpagina (https://www.facebook.com/user)</li><li>- Een webpagina (http://www.domain.com)</li><li>- Een emailadres (joe@dalton.com)</li></ul>\",\n \"IMAGE_RESIZE_FAILED\": \"Fout tijdens afbeelding schalen\"\n },\n \"INFO\": {\n \"PROFILE_SAVED\": \"Profiel opgeslagen\"\n },\n \"HELP\": {\n \"WARNING_PUBLIC_DATA\": \"Let op, de informatie die hier is vastgelegd <b>is publiek</b>: zichtbaar ook voor <b>niet ingelogde gebruikers</b>.\"\n }\n },\n \"ES_SETTINGS\": {\n \"PLUGIN_NAME\": \"Cesium+\",\n \"ENABLE_TOGGLE\": \"Uitbreiding inschakelen?\",\n \"ENABLE_MESSAGE_TOGGLE\": \"Berichten inschakelen?\",\n \"ENABLE_SETTINGS_TOGGLE\": \"Globale opslag voor instellingen inschakelen?\",\n \"PEER\": \"Adres dataknooppunt\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Dataknoop\",\n \"HELP\" : \"Stel het te gebruiken adres in:\",\n \"PEER_HELP\": \"server.domein.com:poort\"\n },\n \"NOTIFICATIONS\": {\n \"DIVIDER\": \"Notificaties\",\n \"HELP_TEXT\": \"Schakel het type notificatie dat je wil ontvangen in:\",\n \"ENABLE_TX_SENT\": \"Bericht bij validatie van <b>verzonden betalingen</b>?\",\n \"ENABLE_TX_RECEIVED\": \"Bericht bij validatie van <b>ontvangen betalingen</b>?\",\n \"ENABLE_CERT_SENT\": \"Bericht bij validatie van <b>verzonden certificaties</b>?\",\n \"ENABLE_CERT_RECEIVED\": \"Bericht bij validatie van <b>ontvangen certificaties</b>?\"\n },\n \"CONFIRM\": {\n \"ASK_ENABLE_TITLE\": \"Optionele functies\",\n \"ASK_ENABLE\": \"Cesium+ is <b>uitgeschakeld</b> waardoor deze functies niet beschikbaar zijn: <ul><li> <b><i class=\\\"icon ion-person\\\"></i> Gebruikersprofielen</b>;<li> <b><i class=\\\"icon ion-android-notifcaitions\\\"></i> Notificaties</b>;<li> <b><i class=\\\"icon ion-email\\\"></i> Privéberichten</b>.</ul><br/><br/>Wil je deze functies <b>inschakelen</b>?\"\n }\n },\n \"EVENT\": {\n \"NODE_STARTED\": \"Je knoop ES API <b>{{params[0]}}</b> is UP\",\n \"NODE_BMA_DOWN\": \"Knooppunt <b>{{params[0]}}:{{params[1]}}</b> (gebruikt door je ES API) is <b>onbereikbaar</b>.\",\n \"NODE_BMA_UP\": \"Knooppunt <b>{{p0}}:{{params[1]}}</b> is weer bereikbaar.\",\n \"MEMBER_JOIN\": \"Je bent nu <b>lid</b> van valuta <b>{{params[0]}}</b>!\",\n \"MEMBER_LEAVE\": \"Je bent <b>geen lid meer</b> van valuta <b>{{params[0]}}</b>!\",\n \"MEMBER_ACTIVE\": \"Je lidmaatschap bij <b>{{params[0]}}</b> is met <b>succes verlengd</b>.\",\n \"TX_SENT\": \"Je <b>betaling</b> aan <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> is uitgevoerd.\",\n \"TX_SENT_MULTI\": \"Je <b>betaling</b> aan <b>{{params[1]}}</b> is uitgevoerd.\",\n \"TX_RECEIVED\": \"Je hebt een <b>betaling ontvangen</b> van <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span>.\",\n \"TX_RECEIVED_MULTI\": \"Je hebt een <b>betaling ontvangen</b> van <b>{{params[1]}}</b>.\",\n \"CERT_SENT\": \"Je <b>certificatie</b> van <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\" ><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> is uitgevoerd.\",\n \"CERT_RECEIVED\": \"Je hebt een <b>certificatie ontvangen</b> van <span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid}\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span>.\",\n \"PAGE\": {\n \"NEW_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> heeft gereageerd op jouw referentie: <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> heeft zijn/aar reactie op jouw referentie bewerkt: <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> hheeft gereageerd op jouw commentaar op referentie: <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span ng-class=\\\"{'gray': !notification.uid, 'positive':notification.uid }\\\"><i class=\\\"icon\\\" ng-class=\\\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\\\"></i> {{name||uid||params[1]}}</span> heeft zijn/haar reactie op jouw commentaar bewerkt, op referentie: <b>{{params[2]}}</b>\"\n }\n },\n \"CONFIRM\": {\n \"ES_USE_FALLBACK_NODE\": \"Knooppunt <b>{{old}}</b> onbereikbaar of ongeldig adres.<br/><br/>Tijdelijk knooppunt <b>{{new}}</b> gebruiken?\"\n },\n \"ERROR\": {\n \"ES_CONNECTION_ERROR\": \"Knooppunt <b>{{server}}</b> onbereikbaar of ongeldig adres.<br/><br/>Cesium zal verder weken, <b>zonder de Cesium+ uitbreiding</b> (gebruikersprofielens, privéberichten, kaarten en grafieken).<br/><br/>Controleer je internetverbinding, of verander je knooppunt in <a class=\\\"positive\\\" ng-click=\\\"doQuickFix('settings')\\\">instellingen</a>.\",\n \"ES_MAX_UPLOAD_BODY_SIZE\": \"De hoveelheid te verzenden gegevens is overschrijdt de serverlimiet.<br/><br/>Probeer het nogmaals na, bijvoorbeeld, het wissen foto's.\"\n }\n}\n);\n\n$translateProvider.translations(\"en-GB\", {\n \"NETWORK\": {\n \"VIEW\": {\n \"BTN_GRAPH\": \"Statistics\"\n }\n },\n \"GRAPH\": {\n \"COMMON\": {\n \"LINEAR_SCALE\" : \"Linear scale\",\n \"LOGARITHMIC_SCALE\" : \"Logarithmic scale\",\n \"BTN_SHOW_STATS\": \"See statistics\",\n \"BTN_SHOW_DETAILED_STATS\": \"Detailed statistics\",\n \"RANGE_DURATION_DIVIDER\": \"Step unit:\",\n \"RANGE_DURATION\": {\n \"HOUR\": \"Group by <b>hour</b>\",\n \"DAY\": \"Group by <b>day</b>\",\n \"MONTH\": \"Group by <b>month</b>\"\n }\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Statistics\",\n \"BTN_SHOW_STATS\": \"View account Statistics\",\n \"BALANCE_DIVIDER\": \"Account status\",\n \"BALANCE_TITLE\": \"Evolution of the account {{pubkey|formatPubkey}}\",\n \"TX_RECEIVED_LABEL\": \"Receipts\",\n \"TX_SENT_LABEL\": \"Spending\",\n \"UD_LABEL\": \"UD\",\n \"BALANCE_LABEL\": \"Balance\",\n \"INPUT_CHART_TITLE\": \"Sum of incoming flows, per transmitter:\",\n \"OUTPUT_CHART_TITLE\": \"Sum of outgoing flows, per recipient:\"\n },\n \"BLOCKCHAIN\": {\n \"TITLE\": \"Statistics\",\n \"BLOCKS_ISSUERS_DIVIDER\": \"Written blocks by members\",\n \"BLOCKS_ISSUERS_HELP\": \"<b>{{issuerCount|formatInteger}} members</b> calculated <b>{{blockCount|formatInteger}} blocks</b>\",\n \"BLOCKS_ISSUERS_TITLE\": \"Number of blocks calculated per member\",\n \"BLOCKS_ISSUERS_LABEL\": \"Number of blocks\",\n \"TX_DIVIDER\": \"Analysis of transactions\",\n \"TX_AMOUNT_TITLE\": \"Transaction volume\",\n \"TX_AMOUNT_PUBKEY_TITLE\": \"Volume of transactions calculated by {{issuer | formatPubkey}}\",\n \"TX_AMOUNT_LABEL\": \"Exchange volume\",\n \"TX_COUNT_TITLE\": \"Number of written transactions\",\n \"TX_COUNT_LABEL\": \"Number of transactions\",\n \"TX_AVG_BY_BLOCK\": \"Average per block\"\n },\n \"CURRENCY\": {\n \"MONETARY_MASS_TITLE\": \"Evolution of the monetary mass\",\n \"MONETARY_MASS_LABEL\": \"Monetary mass\",\n \"MONETARY_MASS_SHARE_LABEL\": \"Average per member\",\n \"UD_TITLE\": \"Evolution of the universal dividend\",\n \"MEMBERS_COUNT_TITLE\": \"Evolution of the number of members\",\n \"MEMBERS_COUNT_LABEL\": \"Number of members\"\n },\n \"PEER\": {\n \"VIEW\": {\n \"BLOCK_COUNT_LABEL\": \"Computed blocks count\",\n \"BLOCK_COUNT\": \"{{count}} blocks\",\n \"NO_BLOCK\": \"No block\"\n }\n },\n \"DOC_STATS\": {\n \"TITLE\": \"Data storage statistics (Cesium+)\",\n \"USER\": {\n \"TITLE\": \"Number of documents linked to an account\",\n \"USER_PROFILE\": \"User profiles\",\n \"USER_SETTINGS\": \"Saved settings\"\n },\n \"USER_DELTA\": {\n \"TITLE\": \"Delta / Number of documents linked to an account\",\n \"USER_PROFILE\": \"User profiles\",\n \"USER_SETTINGS\": \"Saved settings\"\n },\n \"MESSAGE\": {\n \"TITLE\": \"Number of documents related to the communication\",\n \"MESSAGE_INBOX\": \"Messages in inbox\",\n \"MESSAGE_OUTBOX\": \"Messages in outbox\",\n \"INVITATION_CERTIFICATION\": \"Invitations to certify\"\n },\n \"SOCIAL\": {\n \"TITLE\": \"Number of page or group\",\n \"PAGE_COMMENT\": \"Comments\",\n \"PAGE_RECORD\": \"Pages\",\n \"GROUP_RECORD\": \"Groups\"\n },\n \"OTHER\": {\n \"TITLE\": \"Other documents\",\n \"HISTORY_DELETE\": \"Deletion of documents\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"en\", {\n \"NETWORK\": {\n \"VIEW\": {\n \"BTN_GRAPH\": \"Statistics\"\n }\n },\n \"GRAPH\": {\n \"COMMON\": {\n \"LINEAR_SCALE\" : \"Linear scale\",\n \"LOGARITHMIC_SCALE\" : \"Logarithmic scale\",\n \"BTN_SHOW_STATS\": \"See statistics\",\n \"BTN_SHOW_DETAILED_STATS\": \"Detailed statistics\",\n \"RANGE_DURATION_DIVIDER\": \"Step unit:\",\n \"RANGE_DURATION\": {\n \"HOUR\": \"Group by <b>hour</b>\",\n \"DAY\": \"Group by <b>day</b>\",\n \"MONTH\": \"Group by <b>month</b>\"\n }\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Statistics\",\n \"BTN_SHOW_STATS\": \"View account Statistics\",\n \"BALANCE_DIVIDER\": \"Account status\",\n \"BALANCE_TITLE\": \"Evolution of the account {{pubkey|formatPubkey}}\",\n \"TX_RECEIVED_LABEL\": \"Receipts\",\n \"TX_SENT_LABEL\": \"Spending\",\n \"UD_LABEL\": \"UD\",\n \"BALANCE_LABEL\": \"Balance\",\n \"INPUT_CHART_TITLE\": \"Sum of incoming flows, per transmitter:\",\n \"OUTPUT_CHART_TITLE\": \"Sum of outgoing flows, per recipient:\"\n },\n \"BLOCKCHAIN\": {\n \"TITLE\": \"Statistics\",\n \"BLOCKS_ISSUERS_DIVIDER\": \"Written blocks by members\",\n \"BLOCKS_ISSUERS_HELP\": \"<b>{{issuerCount|formatInteger}} members</b> calculated <b>{{blockCount|formatInteger}} blocks</b>\",\n \"BLOCKS_ISSUERS_TITLE\": \"Number of blocks calculated per member\",\n \"BLOCKS_ISSUERS_LABEL\": \"Number of blocks\",\n \"TX_DIVIDER\": \"Analysis of transactions\",\n \"TX_AMOUNT_TITLE\": \"Transaction volume\",\n \"TX_AMOUNT_PUBKEY_TITLE\": \"Volume of transactions calculated by {{issuer | formatPubkey}}\",\n \"TX_AMOUNT_LABEL\": \"Exchange volume\",\n \"TX_COUNT_TITLE\": \"Number of written transactions\",\n \"TX_COUNT_LABEL\": \"Number of transactions\",\n \"TX_AVG_BY_BLOCK\": \"Average per block\"\n },\n \"CURRENCY\": {\n \"MONETARY_MASS_TITLE\": \"Evolution of the monetary mass\",\n \"MONETARY_MASS_LABEL\": \"Monetary mass\",\n \"MONETARY_MASS_SHARE_LABEL\": \"Average per member\",\n \"UD_TITLE\": \"Evolution of the universal dividend\",\n \"MEMBERS_COUNT_TITLE\": \"Evolution of the number of members\",\n \"MEMBERS_COUNT_LABEL\": \"Number of members\"\n },\n \"PEER\": {\n \"VIEW\": {\n \"BLOCK_COUNT_LABEL\": \"Computed blocks count\",\n \"BLOCK_COUNT\": \"{{count}} blocks\",\n \"NO_BLOCK\": \"No block\"\n }\n },\n \"DOC_STATS\": {\n \"TITLE\": \"Data storage statistics (Cesium+)\",\n \"USER\": {\n \"TITLE\": \"Number of documents linked to an account\",\n \"USER_PROFILE\": \"User profiles\",\n \"USER_SETTINGS\": \"Saved settings\"\n },\n \"USER_DELTA\": {\n \"TITLE\": \"Delta / Number of documents linked to an account\",\n \"USER_PROFILE\": \"User profiles\",\n \"USER_SETTINGS\": \"Saved settings\"\n },\n \"MESSAGE\": {\n \"TITLE\": \"Number of documents related to the communication\",\n \"MESSAGE_INBOX\": \"Messages in inbox\",\n \"MESSAGE_OUTBOX\": \"Messages in outbox\",\n \"INVITATION_CERTIFICATION\": \"Invitations to certify\"\n },\n \"SOCIAL\": {\n \"TITLE\": \"Number of page or group\",\n \"PAGE_COMMENT\": \"Comments\",\n \"PAGE_RECORD\": \"Pages\",\n \"GROUP_RECORD\": \"Groups\"\n },\n \"OTHER\": {\n \"TITLE\": \"Other documents\",\n \"HISTORY_DELETE\": \"Deletion of documents\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"eo-EO\", {\n \"NETWORK\": {\n \"VIEW\": {\n \"BTN_GRAPH\": \"Statistikoj\"\n }\n },\n \"GRAPH\": {\n \"COMMON\": {\n \"LINEAR_SCALE\" : \"Lineara skalo\",\n \"LOGARITHMIC_SCALE\" : \"Logaritma skalo\",\n \"BTN_SHOW_STATS\": \"Vidi la statistikojn\",\n \"BTN_SHOW_DETAILED_STATS\": \"Detalaj statistikoj\",\n \"RANGE_DURATION_DIVIDER\": \"Tempo-unuo:\",\n \"RANGE_DURATION\": {\n \"HOUR\": \"Horo\",\n \"DAY\": \"Tago\",\n \"MONTH\": \"Monato\"\n }\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Statistikoj\",\n \"BTN_SHOW_STATS\": \"Vidi la statistikojn de la konto\",\n \"BALANCE_DIVIDER\": \"Stato de la konto\",\n \"BALANCE_TITLE\": \"Evoluo de la konto {{pubkey|formatPubkey}}\",\n \"TX_RECEIVED_LABEL\": \"Enspezoj\",\n \"TX_SENT_LABEL\": \"Elspezoj\",\n \"TX_ACCUMULATION_LABEL\": \"Bilanco de la spezoj\",\n \"UD_LABEL\": \"UD\",\n \"UD_ACCUMULATION_LABEL\": \"Bilanco de la UD\",\n \"BALANCE_LABEL\": \"Saldo\",\n \"WOT_DIVIDER\": \"Reto de fido\",\n \"CERTIFICATION_TITLE\": \"Nombro de atestaĵoj - {{pubkey|formatPubkey}}\",\n \"RECEIVED_CERT_LABEL\": \"Tuto pri la ricevitaj\",\n \"RECEIVED_CERT_DELTA_LABEL\": \"Vario pri la ricevitaj\",\n \"GIVEN_CERT_LABEL\": \"Tuto pri la senditaj\",\n \"GIVEN_CERT_DELTA_LABEL\": \"Vario pri la senditaj\",\n \"INPUT_CHART_TITLE\": \"Sumo de la enirantaj fluoj, por ĉiu sendinto:\",\n \"OUTPUT_CHART_TITLE\": \"Sumo de la elirantaj fluoj, por ĉiu ricevinto:\"\n },\n \"BLOCKCHAIN\": {\n \"TITLE\": \"Statistikoj\",\n \"BLOCKS_ISSUERS_DIVIDER\": \"Analizo de la kalkul-distribuo\",\n \"BLOCKS_ISSUERS_HELP\": \"<b>{{issuerCount|formatInteger}} membroj</b> kalkulis <b>{{blockCount|formatInteger}} blokojn</b>\",\n \"BLOCKS_ISSUERS_TITLE\": \"Nombro de blokoj kalkulitaj por membro\",\n \"BLOCKS_ISSUERS_LABEL\": \"Nombro de blokoj\",\n \"TX_DIVIDER\": \"Analizo de la spezoj\",\n \"TX_AMOUNT_TITLE\": \"Kvanto de la spezoj\",\n \"TX_AMOUNT_PUBKEY_TITLE\": \"Kvanto de spezoj kalkulitaj de {{issuer | formatPubkey}}\",\n \"TX_AMOUNT_LABEL\": \"Kvanto interŝanĝita\",\n \"TX_COUNT_TITLE\": \"Nombro de spezoj skribitaj\",\n \"TX_COUNT_LABEL\": \"Nombro de spezoj\",\n \"TX_AVG_BY_BLOCK\": \"Meza nombro de spezoj / bloko\"\n\n },\n \"CURRENCY\": {\n \"MONETARY_MASS_TITLE\": \"Evoluo de la mona maso\",\n \"MONETARY_MASS_LABEL\": \"Mona maso\",\n \"MONETARY_MASS_SHARE_LABEL\": \"Mezumo por membro\",\n \"UD_TITLE\": \"Evoluo de la universala dividendo\",\n \"MEMBERS_COUNT_TITLE\": \"Evoluo de la nombro de membroj\",\n \"MEMBERS_COUNT_LABEL\": \"Nombro de membroj\"\n },\n \"PEER\": {\n \"VIEW\": {\n \"BLOCK_COUNT_LABEL\": \"Nombro de blokoj kalkulitaj\",\n \"BLOCK_COUNT\": \"{{count}} blokoj\",\n \"NO_BLOCK\": \"Neniu bloko\"\n }\n },\n \"DOC_STATS\": {\n \"TITLE\": \"Statistikoj pri stokado\",\n \"USER\": {\n \"TITLE\": \"Nombro de dokumentoj ligitaj al konto\",\n \"USER_PROFILE\": \"Uzanto-profiloj\",\n \"USER_SETTINGS\": \"Parametroj konservitaj\"\n },\n \"USER_DELTA\": {\n \"TITLE\": \"Variado de la nombro de dokumentoj ligitaj al konto\",\n \"USER_PROFILE\": \"Uzanto-profiloj\",\n \"USER_SETTINGS\": \"Parametroj konservitaj\"\n },\n \"MESSAGE\": {\n \"TITLE\": \"Nombro de dokumentoj ligitaj al komunikado\",\n \"MESSAGE_INBOX\": \"Mesaĝoj en ricevujo\",\n \"MESSAGE_OUTBOX\": \"Senditaj mesaĝoj konservitaj\",\n \"INVITATION_CERTIFICATION\": \"Invitoj atestotaj\"\n },\n \"SOCIAL\": {\n \"TITLE\": \"Nombro de paĝoj aŭ grupoj\",\n \"PAGE_COMMENT\": \"Komentoj\",\n \"PAGE_RECORD\": \"Paĝoj\",\n \"GROUP_RECORD\": \"Grupoj\"\n },\n \"OTHER\": {\n \"TITLE\": \"Aliaj dokumentoj\",\n \"HISTORY_DELETE\": \"Forigoj de dokumentoj\"\n }\n },\n \"SYNCHRO\": {\n \"TITLE\": \"Statistikoj pri sinkronigoj\",\n \"COUNT\": {\n \"TITLE\": \"Kvanto sinkronigita\",\n \"INSERTS\": \"Enmetoj\",\n \"UPDATES\": \"Ĝisdatigoj\",\n \"DELETES\": \"Forigoj\"\n },\n \"PEER\": {\n \"TITLE\": \"Nodoj informpetitaj\",\n \"ES_USER_API\": \"Nodoj pri datenoj de uzantoj\",\n \"ES_SUBSCRIPTION_API\": \"Nodoj pri retaj servoj\"\n },\n \"PERFORMANCE\": {\n \"TITLE\": \"Efikecoj pri efektiviĝo\",\n \"DURATION\": \"Tempo por efektiviĝo (ms)\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"es-ES\", {\n \"NETWORK\": {\n \"VIEW\": {\n \"BTN_GRAPH\": \"Estadística\"\n }\n },\n \"GRAPH\": {\n \"COMMON\": {\n \"LINEAR_SCALE\" : \"Escala lineal\",\n \"LOGARITHMIC_SCALE\" : \"Escala logarítmica\",\n \"BTN_SHOW_STATS\": \"Ver estadísticas\",\n \"BTN_SHOW_DETAILED_STATS\": \"Estadísticas detalladas\",\n \"RANGE_DURATION_DIVIDER\": \"Unidad de tiempo:\",\n \"RANGE_DURATION\": {\n \"HOUR\": \"Agrupar por <b>horas</b>\",\n \"DAY\": \"Agrupar por <b>días</b>\",\n \"MONTH\": \"Agrupar por <b>meses</b>\"\n }\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Estadísticas\",\n \"BTN_SHOW_STATS\": \"Ver estadísticas de la cuenta\",\n \"BALANCE_DIVIDER\": \"Balance de la cuenta\",\n \"BALANCE_TITLE\": \"Evolución de la cuenta {{pubkey|formatPubkey}}\",\n \"TX_RECEIVED_LABEL\": \"Recibido\",\n \"TX_SENT_LABEL\": \"Gastado\",\n \"UD_LABEL\": \"DU\",\n \"BALANCE_LABEL\": \"Saldo\",\n \"INPUT_CHART_TITLE\": \"Resumen de lo recibido, por emisor\",\n \"OUTPUT_CHART_TITLE\": \"Resumen de lo gastado, por destinatario\"\n },\n \"BLOCKCHAIN\": {\n \"TITLE\": \"Estadística\",\n \"BLOCKS_ISSUERS_DIVIDER\": \"Bloques escritos por cada miembro\",\n \"BLOCKS_ISSUERS_HELP\": \"<b>{{issuerCount|formatInteger}} miembros</b> han calculado <b>{{blockCount|formatInteger}} bloques</b>\",\n \"BLOCKS_ISSUERS_TITLE\": \"Número de bloques por miembro\",\n \"BLOCKS_ISSUERS_LABEL\": \"Número de bloques\",\n \"TX_DIVIDER\": \"Análisis de transacciones\",\n \"TX_AMOUNT_TITLE\": \"El volumen de transacciones\",\n \"TX_AMOUNT_PUBKEY_TITLE\": \"El volumen de transacciones calculado por {{issuer | formatPubkey}}\",\n \"TX_AMOUNT_LABEL\": \"Volumen intercambiado\",\n \"TX_COUNT_TITLE\": \"Número de transacciones escritas\",\n \"TX_COUNT_LABEL\": \"Número de transacciones\",\n \"TX_AVG_BY_BLOCK\": \"Promedio por bloque\"\n },\n \"CURRENCY\": {\n \"MONETARY_MASS_TITLE\": \"Evolución de la masa monetaria\",\n \"MONETARY_MASS_LABEL\": \"Masa monetaria\",\n \"MONETARY_MASS_SHARE_LABEL\": \"Promedio miembro\",\n \"UD_TITLE\": \"Evolución del dividendo universales\",\n \"MEMBERS_COUNT_TITLE\": \"Evolución del número de miembros\",\n \"MEMBERS_COUNT_LABEL\": \"Número de miembros\"\n },\n \"PEER\": {\n \"VIEW\": {\n \"BLOCK_COUNT_LABEL\": \"Número de bloques calculados\",\n \"BLOCK_COUNT\": \"{{count}} bloques\",\n \"NO_BLOCK\": \"Ningún bloque\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"fr-FR\", {\n \"NETWORK\": {\n \"VIEW\": {\n \"BTN_GRAPH\": \"Statistiques\"\n }\n },\n \"GRAPH\": {\n \"COMMON\": {\n \"LINEAR_SCALE\" : \"Echelle linéaire\",\n \"LOGARITHMIC_SCALE\" : \"Echelle logarithmique\",\n \"BTN_SHOW_STATS\": \"Voir les statistiques\",\n \"BTN_SHOW_DETAILED_STATS\": \"Statistiques détaillées\",\n \"RANGE_DURATION_DIVIDER\": \"Unité de temps :\",\n \"RANGE_DURATION\": {\n \"HOUR\": \"Heure\",\n \"DAY\": \"Jour\",\n \"MONTH\": \"Mois\"\n }\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Statistiques\",\n \"BTN_SHOW_STATS\": \"Voir les statistiques du compte\",\n \"BALANCE_DIVIDER\": \"Situation du compte\",\n \"BALANCE_TITLE\": \"Evolution du compte {{pubkey|formatPubkey}}\",\n \"TX_RECEIVED_LABEL\": \"Recettes\",\n \"TX_SENT_LABEL\": \"Dépenses\",\n \"TX_ACCUMULATION_LABEL\": \"Bilan des transactions\",\n \"UD_LABEL\": \"DU\",\n \"UD_ACCUMULATION_LABEL\": \"Bilan des DU\",\n \"BALANCE_LABEL\": \"Solde\",\n \"WOT_DIVIDER\": \"Toile de confiance\",\n \"CERTIFICATION_TITLE\": \"Nombre de certifications - {{pubkey|formatPubkey}}\",\n \"RECEIVED_CERT_LABEL\": \"Total reçues\",\n \"RECEIVED_CERT_DELTA_LABEL\": \"Variation reçues\",\n \"GIVEN_CERT_LABEL\": \"Total envoyées\",\n \"GIVEN_CERT_DELTA_LABEL\": \"Variation envoyées\",\n \"INPUT_CHART_TITLE\": \"Somme des flux entrants, par émetteur :\",\n \"OUTPUT_CHART_TITLE\": \"Somme des flux sortants, par destinaire :\"\n },\n \"BLOCKCHAIN\": {\n \"TITLE\": \"Statistiques\",\n \"BLOCKS_ISSUERS_DIVIDER\": \"Analyse de la répartition du calcul\",\n \"BLOCKS_ISSUERS_HELP\": \"<b>{{issuerCount|formatInteger}} membres</b> ont calculé <b>{{blockCount|formatInteger}} blocs</b>\",\n \"BLOCKS_ISSUERS_TITLE\": \"Nombre de blocs calculés par membre\",\n \"BLOCKS_ISSUERS_LABEL\": \"Nombre de blocs\",\n \"TX_DIVIDER\": \"Analyse des transactions\",\n \"TX_AMOUNT_TITLE\": \"Volume des transactions\",\n \"TX_AMOUNT_PUBKEY_TITLE\": \"Volume des transactions calculées par {{issuer | formatPubkey}}\",\n \"TX_AMOUNT_LABEL\": \"Volume échangé\",\n \"TX_COUNT_TITLE\": \"Nombre de transactions écrites\",\n \"TX_COUNT_LABEL\": \"Nombre de transactions\",\n \"TX_AVG_BY_BLOCK\": \"Nombre moyen de transactions / bloc\"\n\n },\n \"CURRENCY\": {\n \"MONETARY_MASS_TITLE\": \"Evolution de la masse monétaire\",\n \"MONETARY_MASS_LABEL\": \"Masse monétaire\",\n \"MONETARY_MASS_SHARE_LABEL\": \"Moyenne par membre\",\n \"UD_TITLE\": \"Evolution du dividende universel\",\n \"MEMBERS_COUNT_TITLE\": \"Evolution du nombre de membres\",\n \"MEMBERS_COUNT_LABEL\": \"Nombre de membres\"\n },\n \"PEER\": {\n \"VIEW\": {\n \"BLOCK_COUNT_LABEL\": \"Nombre de blocs calculés\",\n \"BLOCK_COUNT\": \"{{count}} blocs\",\n \"NO_BLOCK\": \"Aucun bloc\"\n }\n },\n \"DOC_STATS\": {\n \"TITLE\": \"Statistiques de stockage\",\n \"USER\": {\n \"TITLE\": \"Nombre de documents liés à un compte\",\n \"USER_PROFILE\": \"Profils utilisateur\",\n \"USER_SETTINGS\": \"Paramètres sauvegardés\"\n },\n \"USER_DELTA\": {\n \"TITLE\": \"Variation du nombre de documents liés à un compte\",\n \"USER_PROFILE\": \"Profils utilisateur\",\n \"USER_SETTINGS\": \"Paramètres sauvegardés\"\n },\n \"MESSAGE\": {\n \"TITLE\": \"Nombre de documents liés à la communication\",\n \"MESSAGE_INBOX\": \"Messages en boîte de réception\",\n \"MESSAGE_OUTBOX\": \"Messages envoyés sauvegardés\",\n \"INVITATION_CERTIFICATION\": \"Invitations à certifier\"\n },\n \"SOCIAL\": {\n \"TITLE\": \"Nombre de pages ou groupes\",\n \"PAGE_COMMENT\": \"Commentaires\",\n \"PAGE_RECORD\": \"Pages\",\n \"GROUP_RECORD\": \"Groupes\"\n },\n \"OTHER\": {\n \"TITLE\": \"Autres documents\",\n \"HISTORY_DELETE\": \"Suppressions de documents\"\n }\n },\n \"SYNCHRO\": {\n \"TITLE\": \"Statistiques de synchronisations\",\n \"COUNT\": {\n \"TITLE\": \"Volume synchronisé\",\n \"INSERTS\": \"Insertions\",\n \"UPDATES\": \"Mises à jour\",\n \"DELETES\": \"Suppressions\"\n },\n \"PEER\": {\n \"TITLE\": \"Noeuds requêtés\",\n \"ES_USER_API\": \"Noeuds données utilisateurs\",\n \"ES_SUBSCRIPTION_API\": \"Noeuds services en ligne\"\n },\n \"PERFORMANCE\": {\n \"TITLE\": \"Performances d'exécution\",\n \"DURATION\": \"Temps d'exécution (ms)\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"it-IT\", {\n \"NETWORK\": {\n \"VIEW\": {\n \"BTN_GRAPH\": \"Statistiche\"\n }\n },\n \"GRAPH\": {\n \"COMMON\": {\n \"LINEAR_SCALE\" : \"Scala lineare\",\n \"LOGARITHMIC_SCALE\" : \"Scala logaritmica\",\n \"BTN_SHOW_STATS\": \"Vedere le statistiche\",\n \"BTN_SHOW_DETAILED_STATS\": \"Statistiche dettagliate\",\n \"RANGE_DURATION_DIVIDER\": \"Unità di tempo :\",\n \"RANGE_DURATION\": {\n \"HOUR\": \"Ora\",\n \"DAY\": \"Giorno\",\n \"MONTH\": \"Mese\"\n }\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Statistiche\",\n \"BTN_SHOW_STATS\": \"Visualizzare le statistiche del conto\",\n \"BALANCE_DIVIDER\": \"Situazione del conto\",\n \"BALANCE_TITLE\": \"Evoluzione del conto {{pubkey|formatPubkey}}\",\n \"TX_RECEIVED_LABEL\": \"Incassi\",\n \"TX_SENT_LABEL\": \"Spese\",\n \"TX_ACCUMULATION_LABEL\": \"Bilancio delle transazioni\",\n \"UD_LABEL\": \"DU\",\n \"UD_ACCUMULATION_LABEL\": \"Bilancio dei DU\",\n \"BALANCE_LABEL\": \"Saldo\",\n \"WOT_DIVIDER\": \"Tela di fiducia\",\n \"CERTIFICATION_TITLE\": \"Numero di certificazioni - {{pubkey|formatPubkey}}\",\n \"RECEIVED_CERT_LABEL\": \"Totale ricevute\",\n \"RECEIVED_CERT_DELTA_LABEL\": \"Variazione ricevute\",\n \"GIVEN_CERT_LABEL\": \"Totale inviate\",\n \"GIVEN_CERT_DELTA_LABEL\": \"Variazione inviate\",\n \"INPUT_CHART_TITLE\": \"Somma dei flussi in entrata, par emittente :\",\n \"OUTPUT_CHART_TITLE\": \"Somma dei flussi in uscita, per destinatario :\"\n },\n \"BLOCKCHAIN\": {\n \"TITLE\": \"Statistiche\",\n \"BLOCKS_ISSUERS_DIVIDER\": \"Analisi della ripartizione del calcolo\",\n \"BLOCKS_ISSUERS_HELP\": \"<b>{{issuerCount|formatInteger}} membri</b> hanno calcolato <b>{{blockCount|formatInteger}} blocchi</b>\",\n \"BLOCKS_ISSUERS_TITLE\": \"Numero di blocchi calcolati a membro\",\n \"BLOCKS_ISSUERS_LABEL\": \"Numero di blocchi\",\n \"TX_DIVIDER\": \"Analisi delle transazioni\",\n \"TX_AMOUNT_TITLE\": \"Volume delle transazioni\",\n \"TX_AMOUNT_PUBKEY_TITLE\": \"Volume delle transazioni calcolato da {{issuer | formatPubkey}}\",\n \"TX_AMOUNT_LABEL\": \"Volume scambiato\",\n \"TX_COUNT_TITLE\": \"Numero di transazioni scritte\",\n \"TX_COUNT_LABEL\": \"Numero di transazioni\",\n \"TX_AVG_BY_BLOCK\": \"Numero medio di transazioni / blocco\"\n },\n \"CURRENCY\": {\n \"MONETARY_MASS_TITLE\": \"Evoluzione della massa monetaria\",\n \"MONETARY_MASS_LABEL\": \"Massa monetaria\",\n \"MONETARY_MASS_SHARE_LABEL\": \"Media a membro\",\n \"UD_TITLE\": \"Evoluzione del Dividendo Universale\",\n \"MEMBERS_COUNT_TITLE\": \"Evoluzione del numero di membri\",\n \"MEMBERS_COUNT_LABEL\": \"Numero di membri\"\n },\n \"PEER\": {\n \"VIEW\": {\n \"BLOCK_COUNT_LABEL\": \"Numero di blocchi calcolati\",\n \"BLOCK_COUNT\": \"{{count}} blocchi\",\n \"NO_BLOCK\": \"Nessun blocco\"\n }\n },\n \"DOC_STATS\": {\n \"TITLE\": \"Statistiche di stoccaggio\",\n \"USER\": {\n \"TITLE\": \"Numero di documenti legati ad un conto\",\n \"USER_PROFILE\": \"Profili dell'utente\",\n \"USER_SETTINGS\": \"Impostazioni salvate\"\n },\n \"MESSAGE\": {\n \"TITLE\": \"Numero di documenti legati alla conversazione\",\n \"MESSAGE_INBOX\": \"Messaggi in arrivo\",\n \"MESSAGE_OUTBOX\": \"Messaggi inviati salvati\",\n \"INVITATION_CERTIFICATION\": \"Invitazioni da certificare\"\n },\n \"SOCIAL\": {\n \"TITLE\": \"Numero di pagine o gruppi\",\n \"PAGE_COMMENT\": \"Commenti\",\n \"PAGE_RECORD\": \"Pagine\",\n \"GROUP_RECORD\": \"Gruppi\"\n },\n \"OTHER\": {\n \"TITLE\": \"Altri documenti\",\n \"HISTORY_DELETE\": \"Cronologia eliminazione documenti\"\n }\n },\n \"SYNCHRO\": {\n \"TITLE\": \"Statistiche di sincronizzazioni\",\n \"COUNT\": {\n \"TITLE\": \"Volume sincronizzato\",\n \"INSERTS\": \"Inserimenti\",\n \"UPDATES\": \"Aggiornamenti\",\n \"DELETES\": \"Eliminazioni\"\n },\n \"PEER\": {\n \"TITLE\": \"Nodi interrogati\",\n \"ES_USER_API\": \"Nodi dati utenti\",\n \"ES_SUBSCRIPTION_API\": \"Noeuds servizi online\"\n },\n \"PERFORMANCE\": {\n \"TITLE\": \"Prestazioni (performance) di esecuzione\",\n \"DURATION\": \"Tempo di esecuzione (ms)\"\n }\n }\n }\n }\n);\n\n$translateProvider.translations(\"nl-NL\", {\n \"NETWORK\": {\n \"VIEW\": {\n \"BTN_GRAPH\": \"Statistieken\"\n }\n },\n \"GRAPH\": {\n \"COMMON\": {\n \"LINEAR_SCALE\" : \"Lineaire schaal\",\n \"LOGARITHMIC_SCALE\" : \"Logaritmische schaal\",\n \"BTN_SHOW_STATS\": \"Zie statistieken\",\n \"BTN_SHOW_DETAILED_STATS\": \"Gedetailleerde statistieken\",\n \"RANGE_DURATION_DIVIDER\": \"Stap eenheid:\",\n \"RANGE_DURATION\": {\n \"HOUR\": \"Groep per <b>uur</b>\",\n \"DAY\": \"Groep per <b>dag</b>\",\n \"MONTH\": \"Groep per <b>maand</b>\"\n }\n },\n \"ACCOUNT\": {\n \"INPUT_CHART_TITLE\": \"Som van de binnenkomende stroom, door de zender:\",\n \"OUTPUT_CHART_TITLE\": \"Som van de uitstroom per bestemming:\"\n },\n \"BLOCKCHAIN\": {\n \"TITLE\": \"Statistieken\",\n \"BLOCKS_ISSUERS_DIVIDER\": \"Schriftelijke blokken door leden\",\n \"BLOCKS_ISSUERS_HELP\": \"<b>{{issuerCount|formatInteger}} leden</b> berekend <b>{{blockCount|formatInteger}} blokken</b>\",\n \"BLOCKS_ISSUERS_TITLE\": \"Aantal blokken berekend per lid\",\n \"BLOCKS_ISSUERS_LABEL\": \"Aantal blokken\",\n \"TX_DIVIDER\": \"Analyse van transacties\",\n \"TX_AMOUNT_TITLE\": \"Trading volume\",\n \"TX_AMOUNT_PUBKEY_TITLE\": \"Trading volume dat wordt berekend door {{issuer | formatPubkey}}\",\n \"TX_AMOUNT_LABEL\": \"Verhandeld volume\",\n \"TX_COUNT_TITLE\": \"Aantal schriftelijke transacties\",\n \"TX_COUNT_LABEL\": \"Aantal transacties\",\n \"TX_AVG_BY_BLOCK\": \"Gemiddeld aantal transacties / blok\"\n },\n \"CURRENCY\": {\n \"MONETARY_MASS_TITLE\": \"Evolutie van de monetaire massa\",\n \"MONETARY_MASS_LABEL\": \"Monetaire massa\",\n \"MONETARY_MASS_SHARE_LABEL\": \"Gemiddelde leden\",\n \"UD_TITLE\": \"Ontwikkeling van de universele dividend\",\n \"MEMBERS_COUNT_TITLE\": \"Evolutie van het aantal leden\",\n \"MEMBERS_COUNT_LABEL\": \"Aantal leden\"\n }\n }\n}\n);\n\n$translateProvider.translations(\"en-GB\", {\n \"MAP\": {\n \"COMMON\": {\n \"SEARCH_DOTS\": \"Search...\",\n \"BTN_LOCALIZE_ME\": \"Localize me\"\n },\n \"NETWORK\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Peers map\",\n \"BTN_MAP_HELP\": \"Open peers map\"\n },\n \"VIEW\": {\n \"TITLE\": \"Peers map\",\n \"LAYER\": {\n \"MEMBER\": \"Member peers\",\n \"MIRROR\": \"Mirror peers\",\n \"OFFLINE\": \"Offline peers\"\n }\n }\n },\n \"WOT\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Map\",\n \"BTN_MAP_HELP\": \"Open members map\"\n },\n \"VIEW\": {\n \"TITLE\": \"Members map\",\n \"LAYER\": {\n \"MEMBER\": \"<i class=\\\"icon ion-person positive\\\"></i> Members\",\n \"PENDING\": \"<i class=\\\"icon ion-clock energized\\\"></i> Pending registrations\",\n \"WALLET\": \"<i class=\\\"icon ion-card gray\\\"></i> Simple wallets\"\n }\n },\n \"ERROR\": {\n \"LOAD_POSITION_FAILED\": \"Can not retrieve the positions to display.\"\n }\n },\n \"REGISTRY\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Map\",\n \"BTN_MAP_HELP\": \"Open the map of the pages\"\n },\n \"VIEW\": {\n \"TITLE\": \"Map of pages\",\n \"LAYER\": {\n \"SHOP\": \"<i class=\\\"icon ion-page-shop positive\\\"></i> Local shops\",\n \"COMPANY\": \"<i class=\\\"icon ion-page-company positive\\\"></i> Companies\",\n \"ASSOCIATION\": \"<i class=\\\"icon ion-page-association energized\\\"></i> Associations\",\n \"INSTITUTION\": \"<i class=\\\"icon ion-page-institution gray\\\"></i> Institutions\"\n }\n }\n },\n \"PROFILE\": {\n \"MARKER_HELP\": \"<b>Drag and drop</b> this marker to <b>update<br/>your position</b>, or use the buttons<br/>on top of the map.\"\n },\n \"ERROR\": {\n \"LOCALIZE_ME_FAILED\": \"Unable to retrieve your current position\"\n },\n \"SETTINGS\": {\n \"MAP_DIVIDER\": \"Maps\",\n \"ENABLE_GOOGLE_API\": \"Enable Google API services?\",\n \"ENABLE_GOOGLE_API_HELP\": \"In the <b>members map</b>, allows you to display accounts with an address but without geolocation.\",\n \"GOOGLE_API_KEY\": \"Google API key\",\n \"BTN_GOOGLE_API\": \"Getting a key\",\n \"BTN_GOOGLE_API_WARNING\": \"requires a Google account\",\n \"GOOGLE_API_KEY_PLACEHOLDER\": \"eg: AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I\"\n },\n \"HELP\": {\n \"TIP\": {\n \"WOT\": \"This map displays <b>profiles with a position</b>, whether they are member accounts or not.<br/><br/>Only profiles with the option "appear on the map" has been activated.\",\n \"WOT_BTN_LAYERS\": \"<b>Filter the displayed data</b>: members, pending registrations, simple portfolios, etc.\",\n \"WOT_BTN_SEARCH\": \"You can <b>search</b> by name, public key, or member pseudonym.\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"en\", {\n \"MAP\": {\n \"COMMON\": {\n \"SEARCH_DOTS\": \"Search...\",\n \"BTN_LOCALIZE_ME\": \"Localize me\"\n },\n \"NETWORK\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Peers map\",\n \"BTN_MAP_HELP\": \"Open peers map\"\n },\n \"VIEW\": {\n \"TITLE\": \"Peers map\",\n \"LAYER\": {\n \"MEMBER\": \"Member peers\",\n \"MIRROR\": \"Mirror peers\",\n \"OFFLINE\": \"Offline peers\"\n }\n }\n },\n \"WOT\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Map\",\n \"BTN_MAP_HELP\": \"Open members map\"\n },\n \"VIEW\": {\n \"TITLE\": \"Members map\",\n \"LAYER\": {\n \"MEMBER\": \"<i class=\\\"icon ion-person positive\\\"></i> Members\",\n \"PENDING\": \"<i class=\\\"icon ion-clock energized\\\"></i> Pending registrations\",\n \"WALLET\": \"<i class=\\\"icon ion-card gray\\\"></i> Simple wallets\"\n }\n },\n \"ERROR\": {\n \"LOAD_POSITION_FAILED\": \"Can not retrieve the positions to display.\"\n }\n },\n \"REGISTRY\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Map\",\n \"BTN_MAP_HELP\": \"Open the map of the pages\"\n },\n \"VIEW\": {\n \"TITLE\": \"Map of pages\",\n \"LAYER\": {\n \"SHOP\": \"<i class=\\\"icon ion-page-shop positive\\\"></i> Local shops\",\n \"COMPANY\": \"<i class=\\\"icon ion-page-company positive\\\"></i> Companies\",\n \"ASSOCIATION\": \"<i class=\\\"icon ion-page-association energized\\\"></i> Associations\",\n \"INSTITUTION\": \"<i class=\\\"icon ion-page-institution gray\\\"></i> Institutions\"\n }\n }\n },\n \"PROFILE\": {\n \"MARKER_HELP\": \"<b>Drag and drop</b> this marker to <b>update<br/>your position</b>, or use the buttons<br/>on top of the map.\"\n },\n \"ERROR\": {\n \"LOCALIZE_ME_FAILED\": \"Unable to retrieve your current position\"\n },\n \"SETTINGS\": {\n \"MAP_DIVIDER\": \"Maps\",\n \"ENABLE_GOOGLE_API\": \"Enable Google API services?\",\n \"ENABLE_GOOGLE_API_HELP\": \"In the <b>members map</b>, allows you to display accounts with an address but without geolocation.\",\n \"GOOGLE_API_KEY\": \"Google API key\",\n \"BTN_GOOGLE_API\": \"Getting a key\",\n \"BTN_GOOGLE_API_WARNING\": \"requires a Google account\",\n \"GOOGLE_API_KEY_PLACEHOLDER\": \"eg: AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I\"\n },\n \"HELP\": {\n \"TIP\": {\n \"WOT\": \"This map displays <b>profiles with a position</b>, whether they are member accounts or not.<br/><br/>Only profiles with the option "appear on the map" has been activated.\",\n \"WOT_BTN_LAYERS\": \"<b>Filter the displayed data</b>: members, pending registrations, simple portfolios, etc.\",\n \"WOT_BTN_SEARCH\": \"You can <b>search</b> by name, public key, or member pseudonym.\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"eo-EO\", {\n \"MAP\": {\n \"COMMON\": {\n \"SEARCH_DOTS\": \"Traserĉi...\",\n \"BTN_LOCALIZE_ME\": \"Lokalizi min\"\n },\n \"NETWORK\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Mapo\",\n \"BTN_MAP_HELP\": \"Malfermi la mapon pri nodoj\"\n },\n \"VIEW\": {\n \"TITLE\": \"Mapo pri nodoj\",\n \"LAYER\": {\n \"MEMBER\": \"Membro-nodoj\",\n \"MIRROR\": \"Spegul-nodoj\",\n \"OFFLINE\": \"Nekonektitaj nodoj\"\n }\n }\n },\n \"WOT\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Mapo\",\n \"BTN_MAP_HELP\": \"Malfermi la mapon pri membroj\"\n },\n \"VIEW\": {\n \"TITLE\": \"Mapo pri membroj\",\n \"LAYER\": {\n \"MEMBER\": \"<i class=\\\"icon ion-person positive\\\"></i> Membroj\",\n \"PENDING\": \"<i class=\\\"icon ion-clock energized\\\"></i> Aliĝoj atendantaj\",\n \"WALLET\": \"<i class=\\\"icon ion-card gray\\\"></i> Simplaj monujoj\"\n }\n },\n \"ERROR\": {\n \"LOAD_POSITION_FAILED\": \"Neeblas ricevi la lokojn afiŝotajn.\"\n }\n },\n \"REGISTRY\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Mapo\",\n \"BTN_MAP_HELP\": \"Malfermi la mapon pri paĝoj\"\n },\n \"VIEW\": {\n \"TITLE\": \"Mapo pri paĝoj\",\n \"LAYER\": {\n \"SHOP\": \"<i class=\\\"icon ion-page-shop positive\\\"></i> Lokaj komercoj\",\n \"COMPANY\": \"<i class=\\\"icon ion-page-company positive\\\"></i> Entreprenoj\",\n \"ASSOCIATION\": \"<i class=\\\"icon ion-page-association energized\\\"></i> Asocioj\",\n \"INSTITUTION\": \"<i class=\\\"icon ion-page-institution gray\\\"></i> Institucioj\"\n }\n }\n },\n \"PROFILE\": {\n \"MARKER_HELP\": \"<b>Ŝovu-demetu</b> tiun ĉi markilon por <b>aktualigi<br/> vian lokon</b> sur la mapo, aŭ uzu la serĉo-butonon<br/>super la mapo.\"\n },\n \"ERROR\": {\n \"LOCALIZE_ME_FAILED\": \"Neeblas ricevi vian nunan lokon\"\n },\n \"SETTINGS\": {\n \"MAP_DIVIDER\": \"Mapoj\",\n \"ENABLE_GOOGLE_API\": \"Aktivigi la Google-API-servojn?\",\n \"ENABLE_GOOGLE_API_HELP\": \"Ebligas afiŝi sur la <b>mapo pri membroj</b> kontojn kun adreso sed sen iu GPS-lokalizo.\",\n \"GOOGLE_API_KEY\": \"Google-API-ŝlosilo\",\n \"BTN_GOOGLE_API\": \"Ekhavi ŝlosilon\",\n \"BTN_GOOGLE_API_WARNING\": \"Necesigas havi Google-konton\",\n \"GOOGLE_API_KEY_PLACEHOLDER\": \"Ekzemple: AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I\"\n },\n \"HELP\": {\n \"TIP\": {\n \"WOT\": \"Tiu ĉi mapo afiŝas <b>la profilojn kun loko</b>, ĉu ili rilatas al membro-kontoj aŭ ne.<br/><br/>Nur videblas la profiloj, kies kromaĵo "aperi sur la mapo" estis aktivigita.\",\n \"WOT_BTN_LAYERS\": \"<b>Filtru ĉi tie la afiŝitajn datenojn</b>: membroj, aliĝoj atendantaj, simplaj monujoj, ktp.\",\n \"WOT_BTN_SEARCH\": \"Vi povas <b>efektivigi serĉadon</b> laŭ nomo, publika ŝlosilo aŭ membro-pseŭdonimo.\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"fr-FR\", {\n \"MAP\": {\n \"COMMON\": {\n \"SEARCH_DOTS\": \"Rechercher...\",\n \"BTN_LOCALIZE_ME\": \"Me localiser\"\n },\n \"NETWORK\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Carte\",\n \"BTN_MAP_HELP\": \"Ouvrir la carte des noeuds\"\n },\n \"VIEW\": {\n \"TITLE\": \"Carte des noeuds\",\n \"LAYER\": {\n \"MEMBER\": \"Nœuds membre\",\n \"MIRROR\": \"Nœuds miroir\",\n \"OFFLINE\": \"Nœuds hors ligne\"\n }\n }\n },\n \"WOT\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Carte\",\n \"BTN_MAP_HELP\": \"Ouvrir la carte des membres\"\n },\n \"VIEW\": {\n \"TITLE\": \"Carte des membres\",\n \"LAYER\": {\n \"MEMBER\": \"<i class=\\\"icon ion-person positive\\\"></i> Membres\",\n \"PENDING\": \"<i class=\\\"icon ion-clock energized\\\"></i> Inscriptions en attente\",\n \"WALLET\": \"<i class=\\\"icon ion-card gray\\\"></i> Simples portefeuilles\"\n }\n },\n \"ERROR\": {\n \"LOAD_POSITION_FAILED\": \"Impossible de récupérer les positions à afficher.\"\n }\n },\n \"REGISTRY\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Carte\",\n \"BTN_MAP_HELP\": \"Ouvrir la carte des pages\"\n },\n \"VIEW\": {\n \"TITLE\": \"Carte des pages\",\n \"LAYER\": {\n \"SHOP\": \"<i class=\\\"icon ion-page-shop positive\\\"></i> Commerces locaux\",\n \"COMPANY\": \"<i class=\\\"icon ion-page-company positive\\\"></i> Entreprises\",\n \"ASSOCIATION\": \"<i class=\\\"icon ion-page-association energized\\\"></i> Associations\",\n \"INSTITUTION\": \"<i class=\\\"icon ion-page-institution gray\\\"></i> Institutions\"\n }\n }\n },\n \"PROFILE\": {\n \"MARKER_HELP\": \"<b>Glissez-déposez</b> ce marqueur pour <b>mettre<br/>à jour votre position</b> sur la carte, ou utilisez le bouton<br/>de recherche au-dessus de la carte.\"\n },\n \"ERROR\": {\n \"LOCALIZE_ME_FAILED\": \"Impossible de récupérer votre position actuelle\"\n },\n \"SETTINGS\": {\n \"MAP_DIVIDER\": \"Cartes\",\n \"ENABLE_GOOGLE_API\": \"Activer les services Google API ?\",\n \"ENABLE_GOOGLE_API_HELP\": \"Permet l'affichage dans la <b>carte des membres</b> des comptes ayant une adresse mais aucun positionnement GPS.\",\n \"GOOGLE_API_KEY\": \"Clé d'API Google\",\n \"BTN_GOOGLE_API\": \"Obtenir une clé\",\n \"BTN_GOOGLE_API_WARNING\": \"Nécessite d'avoir un compte Google\",\n \"GOOGLE_API_KEY_PLACEHOLDER\": \"Exemple : AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I\"\n },\n \"HELP\": {\n \"TIP\": {\n \"WOT\": \"Cette carte affiche <b>les profils ayant une position</b>, qu'ils correspondent à des comptes membre ou non.<br/><br/>Seuls sont visibles les profils dont l'option "apparaître sur la carte" a été activée.\",\n \"WOT_BTN_LAYERS\": \"<b>Filtrez ici les données affichées</b> : membres, inscriptions en attente, simples portefeuilles, etc.\",\n \"WOT_BTN_SEARCH\": \"Vous pouvez <b>effectuer une recherche</b> par nom, clef publique ou pseudonyme de membre.\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"it-IT\", {\n \"MAP\": {\n \"COMMON\": {\n \"SEARCH_DOTS\": \"Ricerca...\",\n \"BTN_LOCALIZE_ME\": \"Trovami\"\n },\n \"NETWORK\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Mappa dei peers\",\n \"BTN_MAP_HELP\": \"Aprire mappa dei peers\"\n },\n \"VIEW\": {\n \"TITLE\": \"Mappa dei peers\",\n \"LAYER\": {\n \"MEMBER\": \"Peers membri\",\n \"MIRROR\": \"Peers specchi\",\n \"OFFLINE\": \"Peers offline\"\n }\n }\n },\n \"WOT\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Mappa dei membri\",\n \"BTN_MAP_HELP\": \"Aprire mappa dei membri\"\n },\n \"VIEW\": {\n \"TITLE\": \"Mappa membri\",\n \"LAYER\": {\n \"MEMBER\": \"<i class=\\\"icon ion-person positive\\\"></i> Membri\",\n \"PENDING\": \"<i class=\\\"icon ion-clock energized\\\"></i> Registrazione pendenti\",\n \"WALLET\": \"<i class=\\\"icon ion-card gray\\\"></i> Portafogli osservatori\"\n }\n },\n \"ERROR\": {\n \"LOAD_POSITION_FAILED\": \"Errore nel caricamento delle posizioni.\"\n }\n },\n \"REGISTRY\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Mappa\",\n \"BTN_MAP_HELP\": \"Aprire la mappa delle pagine pro\"\n },\n \"VIEW\": {\n \"TITLE\": \"Mappa delle pagine pro\",\n \"LAYER\": {\n \"SHOP\": \"<i class=\\\"icon ion-page-shop positive\\\"></i> Negozi locali\",\n \"COMPANY\": \"<i class=\\\"icon ion-page-company positive\\\"></i> Aziende\",\n \"ASSOCIATION\": \"<i class=\\\"icon ion-page-association energized\\\"></i> Associazioni\",\n \"INSTITUTION\": \"<i class=\\\"icon ion-page-institution gray\\\"></i> Instituti\"\n }\n }\n },\n \"PROFILE\": {\n \"MARKER_HELP\": \"<b>Drag and drop</b> questo indicatore per <b>aggiornare<br/>tua posizione</b>, o usa i bottoni <br/>sopra la mappa.\"\n },\n \"ERROR\": {\n \"LOCALIZE_ME_FAILED\": \"Impossible trovare tua posizione attuale\"\n },\n \"SETTINGS\": {\n \"MAP_DIVIDER\": \"Mappe\",\n \"ENABLE_GOOGLE_API\": \"Abilitare i servizi Google API ?\",\n \"ENABLE_GOOGLE_API_HELP\": \"Sulla <b>mappa dei membri</b>, ti permette di visualizzare i conti con un indirizzo ma senza geolocalizzazione.\",\n \"GOOGLE_API_KEY\": \"Chiave Google API\",\n \"BTN_GOOGLE_API\": \"Ottenere una chiave\",\n \"BTN_GOOGLE_API_WARNING\": \"necessita un conto Google\",\n \"GOOGLE_API_KEY_PLACEHOLDER\": \"per es. : AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I\"\n },\n \"HELP\": {\n \"TIP\": {\n \"WOT\": \"Questa mappa mostra <b>profili che hanno fornito una posizione</b>, che siano conti membri o no.<br/><br/>Solo i profili che hanno attivato l'opzione "apparire sulla mappa" sono stati attivati.\",\n \"WOT_BTN_LAYERS\": \"<b>Filtrare i dati visibili</b>: membri, registrazioni pendenti, portafogli osservatori, etc.\",\n \"WOT_BTN_SEARCH\": \"Puoi <b>cercare</b> per nome, chiave pubblica, o pseudonimo del membro.\"\n }\n }\n }\n }\n );\n\n$translateProvider.translations(\"fr-FR\", {\n \"RML9\": {\n \"BTN_EXPORT\": \"Télécharger\",\n \"BTN_OPEN\": \"Ouvrir la page RML9\",\n \"BTN_SWOW_TX\": \"Voir les transactions\",\n \"FILE_NAME\": \"relevé du compte {{pubkey|formatPubkey}} au {{currentTime|formatDateForFile}}.csv\",\n \"HEADERS\": {\n \"TIME\": \"Date\",\n \"AMOUNT\": \"Montant\",\n \"COMMENT\": \"Commentaire\"\n },\n \"VIEW\": {\n \"TITLE\": \"RML9\",\n \"DIVIDER\": \"Dernières transactions :\",\n \"BALANCE\": \"Solde du compte\"\n },\n \"CHART\": {\n \"INPUT_CHART_TITLE\": \"Somme des flux entrants, par émetteur :\",\n \"OUTPUT_CHART_TITLE\": \"Somme des flux sortants, par destinaire :\"\n },\n \"SETTINGS\": {\n \"ENABLE_TOGGLE\": \"Activer le plugin RML9 ?\"\n }\n }\n}\n);\n}]);\n","angular.module('cesium.plugins.templates', []).run(['$templateCache', function($templateCache) {$templateCache.put('plugins/es/templates/blockchain/items_blocks.html','\\n<div class=\"item row row-header done in hidden-xs hidden-sm\">\\n\\n <!-- compact -->\\n <a class=\"pull-left gray button button-text button-small no-margin no-padding\" ng-class=\"{\\'positive\\': compactMode}\" ng-click=\"toggleCompactMode()\">\\n <i class=\"icon ion-navicon\"></i>\\n <b class=\"ion-arrow-down-b\" style=\"position: absolute; top: -8px; left: 2px; font-size: 8px;\"></b>\\n <b class=\"ion-arrow-up-b\" style=\"position: absolute; top: 6px; left: 2px; font-size: 8px;\"></b>\\n <span>{{\\'BLOCKCHAIN.LOOKUP.BTN_COMPACT\\'|translate}}</span>\\n </a>\\n\\n <a class=\"no-padding dark col col-header\" ng-if=\":rebind:expertMode\" ng-click=\"toggleSort(\\'medianTime\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'medianTime\\'\"></cs-sort-icon>\\n {{\\'BLOCKCHAIN.LOOKUP.HEADER_MEDIAN_TIME\\' | translate}}\\n </a>\\n <a class=\"no-padding dark col col-header\" ng-if=\":rebind:expertMode\" ng-click=\"toggleSort(\\'issuer\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'issuer\\'\"></cs-sort-icon>\\n {{\\'BLOCKCHAIN.LOOKUP.HEADER_ISSUER\\' | translate}}\\n </a>\\n <div class=\"col col-20\"> \\n </div>\\n <a class=\"no-padding dark col col-20 col-header\" ng-if=\":rebind:expertMode\" ng-click=\"toggleSort(\\'number\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'number\\'\"></cs-sort-icon>\\n {{\\'BLOCKCHAIN.LOOKUP.HEADER_BLOCK\\' | translate}}\\n </a>\\n</div>\\n\\n<div class=\"padding gray\" ng-if=\":rebind:!search.loading && !search.results.length\" translate>\\n COMMON.SEARCH_NO_RESULT\\n</div>\\n\\n<!-- blocks (large view) -->\\n<ng-if ng-if=\":rebind:!smallscreen\">\\n <ng-repeat ng-repeat=\"block in :rebind:search.results track by block.number\" ng-include=\"!block.empty ? \\'templates/blockchain/item_block_lg.html\\' : \\'templates/blockchain/item_block_empty_lg.html\\'\">\\n </ng-repeat>\\n</ng-if>\\n<!-- blocks (small screens) -->\\n<ng-if ng-if=\":rebind:smallscreen\">\\n <ng-repeat ng-repeat=\"block in :rebind:search.results track by block.number\" ng-include=\"::\\'templates/blockchain/item_block.html\\'\">\\n </ng-repeat>\\n</ng-if>\\n');\n$templateCache.put('plugins/es/templates/blockchain/lookup_form.html','<div class=\"lookupForm\">\\n\\n\\n <div class=\"item no-padding\">\\n\\n <div class=\"button button-small button-text button-stable button-icon-event padding no-padding-right ink\" ng-repeat=\"filter in search.filters\" ng-if=\"filter\">\\n <span ng-bind-html=\"\\'BLOCKCHAIN.LOOKUP.TX_SEARCH_FILTER.\\'+filter.type|translate:filter\"></span>\\n <i class=\"icon ion-close\" ng-click=\"itemRemove($index)\"></i>\\n\\n </div>\\n\\n <label class=\"item-input\">\\n <i class=\"icon ion-search placeholder-icon\"></i>\\n <input type=\"text\" class=\"visible-xs visible-sm\" placeholder=\"{{\\'BLOCKCHAIN.LOOKUP.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"doSearchText()\">\\n <input type=\"text\" class=\"hidden-xs hidden-sm\" id=\"{{searchTextId}}\" placeholder=\"{{\\'BLOCKCHAIN.LOOKUP.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" on-return=\"doSearchText()\">\\n <div class=\"helptip-anchor-center\">\\n <a id=\"helptip-blockchain-search-text\"></a>\\n </div>\\n\\n </label>\\n </div>\\n\\n\\n <div class=\"padding-top padding-xs\" style=\"display: block; height: 60px;\">\\n <div class=\"pull-left\">\\n <h4 ng-if=\"search.type==\\'last\\'\" translate>\\n BLOCKCHAIN.LOOKUP.LAST_BLOCKS\\n </h4>\\n <h4 ng-if=\"search.type==\\'text\\'\">\\n {{\\'COMMON.RESULTS_LIST\\'|translate}}\\n </h4>\\n <h5 class=\"dark\" ng-if=\"!search.loading && search.total\">\\n <span translate=\"COMMON.RESULTS_COUNT\" translate-values=\"{count: search.total}\"></span>\\n <small class=\"gray\" ng-if=\":rebind:search.took && expertMode\">\\n - {{:rebind:\\'COMMON.EXECUTION_TIME\\'|translate: {duration: search.took} }}\\n </small>\\n <small class=\"gray\" ng-if=\":rebind:expertMode && search.filters && search.filters.length\">\\n - <a ng-click=\"toggleShowQuery()\" ng-if=\"!showQuery\">\\n {{\\'DOCUMENT.LOOKUP.SHOW_QUERY\\'|translate }}\\n <i class=\"icon ion-arrow-down-b gray\"></i>\\n </a>\\n <a ng-click=\"toggleShowQuery()\" ng-if=\"showQuery\">\\n {{\\'DOCUMENT.LOOKUP.HIDE_QUERY\\'|translate }}\\n <i class=\"icon ion-arrow-up-b gray\"></i>\\n </a>\\n </small>\\n </h5>\\n <h5 class=\"gray\" ng-if=\"search.loading\">\\n <ion-spinner class=\"icon ion-spinner-small\" icon=\"android\"></ion-spinner>\\n <span translate>COMMON.SEARCHING</span>\\n <br>\\n </h5>\\n </div>\\n\\n <div class=\"pull-right hidden-xs hidden-sm\">\\n <a ng-if=\"enableFilter\" class=\"button button-text button-small ink icon ion-clock\" ng-class=\"{\\'button-text-positive\\': search.type==\\'last\\'}\" ng-click=\"doSearchLast()\">\\n {{\\'BLOCKCHAIN.LOOKUP.BTN_LAST\\' | translate}}\\n </a>\\n\\n <!--<a class=\"button button-text button-small ink icon icon-help\" ng-click=\"showHelpModal(\\'join-salt\\')\">\\n {{\\'BLOCKCHAIN.LOOKUP.HELP\\' | translate}}\\n </a>-->\\n \\n <button class=\"button button-small button-stable ink\" ng-click=\"doSearchText()\">\\n {{\\'COMMON.BTN_SEARCH\\' | translate:search}}\\n </button>\\n </div>\\n </div>\\n\\n <div class=\"item no-border no-padding\" ng-if=\":rebind:search.filters && search.filters.length && expertMode\">\\n <small class=\"no-padding no-margin\" ng-if=\"showQuery\">\\n <span class=\"gray text-wrap dark\">{{:rebind:search.query}}</span>\\n </small>\\n </div>\\n\\n <ion-list class=\"list list-blocks\" ng-class=\"::motion.ionListClass\">\\n\\n <ng-include src=\"::\\'plugins/es/templates/blockchain/items_blocks.html\\'\"></ng-include>\\n\\n </ion-list>\\n\\n <ion-infinite-scroll ng-if=\"search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"1%\">\\n </ion-infinite-scroll>\\n\\n</div>');\n$templateCache.put('plugins/es/templates/blockchain/lookup_popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>BLOCKCHAIN.LOOKUP.POPOVER_FILTER_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <!-- last blocks -->\\n <a ng-if=\"enableFilter\" class=\"item item-icon-left item-icon-right ink\" ng-click=\"doSearchLast()\">\\n <i class=\"icon ion-clock\"></i>\\n {{\\'BLOCKCHAIN.LOOKUP.BTN_LAST\\' | translate}}\\n <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"search.type==\\'last\\'\"></i>\\n </a>\\n\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/blockchain/lookup.html','<ion-view>\\n <ion-nav-title>\\n <span translate>BLOCKCHAIN.LOOKUP.TITLE</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n\\n <button class=\"button button-icon button-clear icon ion-navicon visible-xs visible-sm\" ng-click=\"toggleCompactMode()\">\\n <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>\\n <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>\\n </button>\\n\\n <button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n\\n </ion-nav-buttons>\\n\\n <ion-content class=\"padding no-padding-xs no-padding-sm\" scroll=\"true\">\\n <ng-include src=\"::\\'plugins/es/templates/blockchain/lookup_form.html\\'\"></ng-include>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/common/edit_pictures.html','<div class=\"gallery\" ng-controller=\"ESPicturesEditCtrl as ctrl\">\\n\\n <!-- Picture list -->\\n <div ng-repeat=\"picture in pictures\" class=\"item card card-gallery stable-bg\" ng-class=\"{\\'in done\\': picture.isnew}\">\\n <div>\\n <h2 ng-if=\"picture.title\">{{picture.title}}</h2>\\n <img ng-src=\"{{picture.src}}\">\\n </div>\\n <div class=\"item done in tabs tabs-secondary tabs-icon-left\">\\n <a class=\"tab-item stable-bg assertive\" ng-click=\"removePicture($index)\" title=\"{{\\'COMMON.BTN_PICTURE_DELETE\\' | translate}}\"><i class=\"icon ion-trash-a\"></i>{{\\'COMMON.BTN_PICTURE_DELETE\\'|translate}}</a>\\n <a class=\"tab-item stable-bg dark\" ng-click=\"rotatePicture($index)\" title=\"{{\\'COMMON.BTN_PICTURE_ROTATE\\' | translate}}\"><i class=\"icon ion-forward\"></i>{{\\'COMMON.BTN_PICTURE_ROTATE\\'|translate}}</a>\\n <a class=\"tab-item stable-bg\" ng-click=\"favoritePicture($index)\" ng-class=\"{\\'gray\\': $index !== 0, \\'positive\\': $index === 0}\" title=\"{{\\'COMMON.BTN_PICTURE_FAVORISE\\' | translate}}\"><i class=\"icon ion-star\"></i>{{\\'COMMON.BTN_PICTURE_FAVORISE\\'|translate}}</a>\\n </div>\\n </div>\\n\\n <!-- Add picture button -->\\n <div class=\"item card card-gallery card-gallery-new text-center padding ink\" file-select=\"onFileChanged(file)\" accept=\"image/*\">\\n <i class=\"ion-image stable\" style=\"font-size:150px\"></i>\\n <b class=\"ion-plus gray\" style=\"font-size:80px; position:absolute; top:25px; right: 5px;\"></b>\\n <p translate>COMMON.BTN_ADD_PICTURE</p>\\n </div>\\n\\n</div>\\n\\n');\n$templateCache.put('plugins/es/templates/common/edit_position.html','<div class=\"item item-divider\" translate>LOCATION.LOCATION_DIVIDER</div>\\n\\n<!-- street -->\\n<ion-item class=\"item-input item-floating-label item-button-right\">\\n <span class=\"input-label\">{{\\'LOCATION.ADDRESS\\' | translate}}</span>\\n <textarea placeholder=\"{{\\'LOCATION.ADDRESS_HELP\\' | translate}}\" ng-model=\"formData.address\" ng-model-options=\"{ debounce: 350 }\" rows=\"4\" cols=\"10\">\\n </textarea>\\n</ion-item>\\n\\n<!-- city -->\\n<div class=\"item item-input item-floating-label\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.geoPoint.$invalid}\">\\n <span class=\"input-label\" translate>LOCATION.CITY</span>\\n <input type=\"text\" placeholder=\"{{\\'LOCATION.CITY_HELP\\'|translate}}\" ng-model=\"formData.city\" ng-model-options=\"{ updateOn: \\'blur\\' }\" required-if=\"formData.address\" ng-change=\"onCityChanged()\">\\n</div>\\n<input type=\"hidden\" name=\"geoPoint\" ng-model=\"formData.geoPoint\" required-if=\"formPosition.enable\" geo-point>\\n<div class=\"form-errors\" ng-show=\"form.$submitted && form.city.$error\" ng-messages=\"form.city.$error\">\\n <div class=\"form-error\" ng-message=\"required\">\\n <span translate=\"LOCATION.ERROR.CITY_REQUIRED_IF_STREET\"></span>\\n </div>\\n</div>\\n<div class=\"form-errors\" ng-show=\"form.$submitted && form.geoPoint.$error\" ng-messages=\"form.geoPoint.$error\">\\n <div class=\"form-error\" ng-message=\"required\">\\n <span translate=\"LOCATION.ERROR.REQUIRED_FOR_LOCATION\" ng-if=\"!formData.city\"></span>\\n <span translate=\"LOCATION.ERROR.INVALID_FOR_LOCATION\" ng-if=\"formData.city\"></span>\\n </div>\\n <div class=\"form-error\" ng-message=\"geoPoint\">\\n <span translate=\"LOCATION.ERROR.REQUIRED_FOR_LOCATION\" ng-if=\"!formData.city\"></span>\\n <span translate=\"LOCATION.ERROR.INVALID_FOR_LOCATION\" ng-if=\"formData.city\"></span>\\n </div>\\n</div>\\n\\n\\n<!-- Position (lat/lon) -->\\n<div class=\"item row item-text-wrap no-padding\">\\n\\n <div class=\"col no-padding\">\\n\\n <!-- appear on map ? -->\\n <ion-checkbox ng-model=\"formPosition.enable\" ng-change=\"onUseGeopointChanged()\" class=\"item item-border-large done in\">\\n <div class=\"item-content\">\\n <span translate>LOCATION.USE_GEO_POINT</span>\\n <h4 class=\"gray\" ng-if=\"formPosition.loading\">\\n <ion-spinner class=\"icon ion-spinner-small\" icon=\"android\"></ion-spinner>\\n {{\\'LOCATION.LOADING_LOCATION\\'|translate}}\\n </h4>\\n </div>\\n </ion-checkbox>\\n </div>\\n\\n <div class=\"col col-10 no-padding\" style=\"min-width: 60px;\">\\n <div class=\"row text-center\">\\n\\n <a class=\"button button-stable button-small-padding\" title=\"{{\\'LOCATION.BTN_GEOLOC_ADDRESS\\'|translate}}\" ng-disabled=\"!formPosition.enable\" ng-click=\"openSearchLocationModal()\">\\n <i class=\"icon ion-home\" style=\"left: 15px;\"></i>\\n <b class=\"icon-secondary ion-search\" style=\"top: -9px; left:32px; font-size: 18px;\"></b>\\n </a>\\n\\n </div>\\n </div>\\n</div>\\n\\n\\n<cs-extension-point name=\"after-position\"></cs-extension-point>\\n');\n$templateCache.put('plugins/es/templates/common/edit_socials.html','<div class=\"list no-padding {{::motion.ionListClass}}\">\\n <!-- divider -->\\n <div class=\"item item-divider\">\\n\\n <span translate>PROFILE.SOCIAL_NETWORKS_DIVIDER</span>\\n\\n <a class=\"badge button button-text button-small button-small-padding\" ng-class=\"{\\'button-text-positive\\': socialData.reorder}\" ng-if=\"formData.socials && formData.socials.length > 1\" ng-click=\"socialData.reorder=!socialData.reorder\">\\n <span translate>PROFILE.BTN_REORDER</span>\\n </a>\\n </div>\\n</div>\\n\\n<ion-list show-reorder=\"socialData.reorder\">\\n\\n <ion-item class=\"item-icon-left item-social-edit done in\" type=\"no-padding item-text-wrap\" ng-if=\"formData.socials && formData.socials.length\" ng-repeat=\"social in formData.socials | filter:filterFn track by social.url\" id=\"social-{{social.url|formatSlug}}\">\\n <i class=\"icon ion-social-{{social.type}}\" ng-class=\"{\\'ion-bookmark\\': social.type == \\'other\\', \\'ion-link\\': social.type == \\'web\\', \\'ion-email\\': social.type == \\'email\\', \\'ion-iphone\\': social.type == \\'phone\\'}\"></i>\\n <p ng-if=\"social.type && social.type != \\'web\\'\">\\n {{social.type}}\\n <i class=\"ion-locked\" ng-if=\"social.recipient\"></i>\\n </p>\\n <h2>\\n <span>{{social.url}}</span>\\n <a class=\"gray hidden-device\" ng-if=\"!social.recipient && !socialData.reorder\" ng-click=\"formData.socials.splice($index, 1); dirty = true;\">\\n <b class=\"ion ion-trash-a\"></b> \\n </a>\\n <a class=\"gray hidden-device\" ng-if=\"!social.recipient && !socialData.reorder\" ng-click=\"editSocialNetwork($index)\">\\n <b class=\"ion ion-edit\"></b> \\n </a>\\n </h2>\\n <ion-option-button class=\"button-assertive\" ng-if=\"!social.recipient\" ng-click=\"formData.socials.splice($index, 1); dirty = true;\">\\n {{\\'COMMON.BTN_DELETE\\'|translate}}\\n </ion-option-button>\\n <ion-option-button class=\"button-info\" ng-if=\"!social.recipient\" ng-click=\"editSocialNetwork($index)\">\\n {{\\'COMMON.BTN_EDIT\\'|translate}}\\n </ion-option-button>\\n <ion-reorder-button class=\"ion-drag\" on-reorder=\"reorderSocialNetwork(social, $fromIndex, $toIndex)\">\\n </ion-reorder-button>\\n </ion-item>\\n</ion-list>\\n\\n<ion-list class=\"no-padding\">\\n <div class=\"item item-complex item-input-inset\">\\n <label class=\"item-input-wrapper\">\\n <input type=\"text\" style=\"width:100%\" placeholder=\"{{\\'PROFILE.SOCIAL_HELP\\'|translate}}\" id=\"socialUrl\" on-return=\"addSocialNetwork($event);\" ng-model=\"socialData.url\">\\n </label>\\n <button class=\"button button-small hidden-xs\" type=\"button\" ng-click=\"addSocialNetwork($event)\" translate>COMMON.BTN_ADD</button>\\n <button class=\"button button-small button-icon icon ion-android-add visible-xs\" type=\"button\" ng-click=\"addSocialNetwork($event)\">\\n </button>\\n </div>\\n\\n</ion-list>\\n');\n$templateCache.put('plugins/es/templates/common/item_comment_content.html','\\n<div class=\"item item-avatar done in\">\\n <span class=\"avatar\" ng-if=\"::!comment.avatar\" ng-class=\"::{\\'avatar-member\\': comment.uid, \\'avatar-wallet\\': !comment.uid}\"></span>\\n <span class=\"avatar\" ng-if=\"::comment.avatar\" style=\"background-image: url({{::comment.avatar.src}})\"></span>\\n\\n <a class=\"pull-left\" ui-sref=\"app.wot_identity({pubkey:comment.issuer, uid: comment.uid})\">\\n <span class=\"positive\" ng-if=\"::comment.uid\">\\n {{::comment.name||comment.uid}}\\n </span>\\n <span ng-if=\"::!comment.uid\" class=\"gray\">\\n <i class=\"icon ion-key gray\"></i>\\n {{::comment.name || (comment.issuer|formatPubkey)}}\\n </span>\\n </a> \\n <span trust-as-html=\"comment.html\"></span>\\n</div>\\n');\n$templateCache.put('plugins/es/templates/common/item_comment.html','<ng-init ng-init=\"level = level + 1\">\\n <a name=\"{{::comment.id|formatHash}}\"></a>\\n\\n <ion-item id=\"comment-{{::comment.id|formatHash}}\" class=\"card card-comment card-avatar stable-900-bg item-text-wrap no-padding\" ng-class=\"::{\\'in done\\': comment.isnew}\">\\n\\n <!-- Parent comment -->\\n <div class=\"card-header padding-left\" ng-if=\"comment.parent && !hideParent\">\\n <h5 class=\"gray underline\">\\n <ng-if ng-if=\"!comment.parent.issuer\">\\n {{\\'COMMENTS.REPLY_TO_DELETED_COMMENT\\'|translate}}\\n </ng-if>\\n <ng-if ng-if=\"comment.parent.issuer\">\\n <a ng-click=\"toggleExpandedParent(comment, $index)\">\\n {{\\'COMMENTS.REPLY_TO_LINK\\'|translate}}\\n <ng-if ng-if=\"::comment.parent.uid\">\\n {{::comment.parent.name||comment.parent.uid}}\\n </ng-if>\\n <ng-if ng-if=\"::!comment.parent.uid\">\\n <i class=\"ion-key\"></i>\\n {{::comment.parent.name|| (comment.parent.issuer|formatPubkey) }}\\n </ng-if>\\n </a>\\n <i ng-class=\"{\\'ion-arrow-down-b\\': !comment.expandedParent[$index], \\'ion-arrow-up-b\\': comment.expandedParent[$index]}\"></i>\\n </ng-if>\\n </h5>\\n <div class=\"padding-left\" ng-if=\"comment.expandedParent[$index]\">\\n <div class=\"card card-avatar card-avatar-small stable-bg item-text-wrap no-padding in done\">\\n <ng-include ng-init=\"comment = comment.parent\" src=\"\\'plugins/es/templates/common/item_comment_content.html\\'\">\\n </ng-include>\\n </div>\\n </div>\\n </div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/common/item_comment_content.html\\'\"></ng-include>\\n\\n <div class=\"card-footer gray\">\\n <small class=\"underline\">\\n <a ng-click=\"share($event, comment, $index)\">{{comment.creationTime | formatFromNow}}</a>\\n\\n <ng-if ng-if=\"comment.replyCount\">\\n | <a class=\"dark\" ng-click=\"toggleExpandedReplies(comment, $index)\">{{\\'COMMENTS.REPLY_COUNT\\'|translate:comment}}</a>\\n <i ng-class=\"{\\'ion-arrow-down-b\\': !comment.showReplies, \\'ion-arrow-up-b\\': comment.showReplies}\"></i>\\n </ng-if>\\n </small>\\n\\n <div class=\"pull-right\">\\n <a class=\"ion-android-share-alt\" ng-click=\"share($event, comment)\">\\n </a>\\n <a class=\"ion-edit\" ng-if=\"isUserPubkey(comment.issuer)\" ng-click=\"edit(comment)\">\\n </a>\\n <a class=\"ion-trash-a\" ng-if=\"isUserPubkey(comment.issuer)\" ng-click=\"remove(comment, $index)\">\\n </a>\\n <a class=\"ion-reply\" ng-click=\"reply(comment)\">\\n {{::\\'COMMENTS.REPLY\\'|translate}}\\n </a>\\n </div>\\n </div>\\n </ion-item>\\n\\n <!-- replies -->\\n <div ng-if=\"comment.expandedReplies[$index]\" class=\"padding-left card-avatar-small expanded\" ng-init=\"hideParent=true\">\\n <ng-include ng-repeat=\"comment in comment.replies track by comment.id\" src=\"\\'plugins/es/templates/common/item_comment.html\\'\">\\n </ng-include>\\n </div>\\n\\n</ng-init>\\n');\n$templateCache.put('plugins/es/templates/common/item_location_search.html',' <!-- search text -->\\n <div class=\"item no-padding\">\\n <div class=\"item-input\">\\n <i class=\"icon ion-location placeholder-icon\"></i>\\n <input type=\"text\" placeholder=\"{{(options.location.help||\\'LOCATION.SEARCH_HELP\\')|translate}}\" ng-model-options=\"{ debounce: 350 }\" ng-model=\"search.location\" ng-keydown=\"onKeydown($event)\" ng-change=\"onLocationChanged()\" ng-blur=\"hideDropdown()\">\\n </div>\\n </div>\\n\\n <!-- dropdown -->\\n <ul class=\"item no-padding list dropdown-list\" ng-if=\"locations\" scroll=\"true\">\\n\\n <div ng-if=\"!locations.length\" class=\"item padding assertive\">\\n <span translate>COMMON.SEARCH_NO_RESULT</span>\\n </div>\\n\\n <a ng-repeat=\"res in locations\" class=\"item item-border-large item-text-wrap ink done in {{res.selected && \\'active\\' || \\'\\'}}\" ng-class=\"::{\\'item-divider\\': !res.address, \\'item-icon-left\\': res.address}\" ng-click=\"::res.address ? selectLocation(res) : false\">\\n\\n <!-- if divider -->\\n <h4 class=\"text-italic\" ng-if=\"::!res.address\" ng-bind-html=\"res.name\"></h4>\\n\\n <!-- if divider -->\\n <ng-if ng-if=\"::res.address\">\\n\\n <i class=\"icon ion-location\"></i>\\n\\n <h3 ng-if=\"res.address.road\">\\n {{::res.address.road}}\\n </h3>\\n <h3>\\n <span ng-if=\"res.address.postcode\">{{::res.address.postcode}}</span>\\n {{::res.address.city||res.address.village}}\\n <span class=\"gray\">| {{::res.address.country}}</span>\\n </h3>\\n <h5 class=\"gray\">\\n {{\\'LOCATION.MODAL.POSITION\\'|translate:res }}\\n </h5>\\n </ng-if>\\n\\n </a>\\n\\n </ul>\\n');\n$templateCache.put('plugins/es/templates/common/modal_category.html','<ion-modal-view>\\n <ion-header-bar class=\"bar-positive\">\\n <button class=\"button button-clear\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button>\\n <h1 class=\"title\">{{ (ctrl.title || \\'COMMON.CATEGORIES\\') | translate}}</h1>\\n </ion-header-bar>\\n\\n <ion-content class=\"categoryModal\">\\n\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"list\">\\n <label class=\"item item-input\">\\n <i class=\"icon ion-search placeholder-icon\"></i>\\n <input type=\"text\" placeholder=\"{{\\'COMMON.CATEGORY_SEARCH_HELP\\'|translate}}\" ng-model=\"ctrl.searchText\" ng-model-options=\"{ debounce: 350 }\" ng-change=\"ctrl.doSearch()\">\\n </label>\\n\\n\\n <div ng-repeat=\"cat in categories\" class=\"item item-category item-text-wrap\" ng-class=\"{\\'item-divider\\': !cat.parent}\" ng-click=\"cat.parent ? closeModal(cat) : false\">\\n <h2 ng-bind-html=\"cat.name\"></h2>\\n </div>\\n </div>\\n </ion-content>\\n</ion-modal-view>\\n');\n$templateCache.put('plugins/es/templates/common/modal_edit_avatar.html','<ion-modal-view>\\n <ion-header-bar class=\"bar-positive\">\\n <button class=\"button button-clear visible-xs visible-sm\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button>\\n\\n <h1 class=\"title\" translate>PROFILE.MODAL_AVATAR.TITLE</h1>\\n\\n <button class=\"button button-clear icon-right visible-xs\" ng-click=\"doCrop()\" ng-disabled=\"formData.imageCropStep == 1\" ng-if=\"formData.imageCropStep <= 2\">\\n <span translate>COMMON.BTN_NEXT</span>\\n <i class=\"icon ion-ios-arrow-right\"></i>\\n </button>\\n <button class=\"button button-clear icon-right visible-xs\" ng-click=\"closeModal(formData.result)\" ng-if=\"formData.imageCropStep == 3\">\\n <i class=\"icon ion-android-done\"></i>\\n </button>\\n </ion-header-bar>\\n\\n <ion-content class=\"modal-avatar padding\">\\n\\n\\n <div ng-show=\"formData.imageCropStep == 1\">\\n\\n <p translate>PROFILE.MODAL_AVATAR.SELECT_FILE_HELP</p>\\n\\n <!-- Add picture drop zone -->\\n <div drop-zone=\"onFileChanged(file)\">\\n <div file-select=\"onFileChanged(file)\" accept=\"image/*\">\\n <i class=\"ion-image stable\" style=\"font-size:150px\"></i>\\n <b class=\"ion-plus gray\" style=\"position:relative; font-size:80px; top:-51px; right: 19px;\"></b>\\n <p class=\"gray\" translate>COMMON.CHOOSE_FILE</p>\\n </div>\\n </div>\\n </div>\\n\\n <div ng-show=\"formData.imageCropStep == 2\">\\n <p translate>PROFILE.MODAL_AVATAR.RESIZE_HELP</p>\\n\\n <!-- <image-crop\\n data-height=\"200\" //shape\\'s height\\n data-width=\"150\" //shape\\'s width\\n data-shape=\"square\" //the shape.. square or circle\\n data-step=\"imageCropStep\"//scope variable that will contain the current step of the crop (1. Waiting for source image; 2. Image loaded, waiting for crop; 3. Crop done)\\n src=\"imgSrc\" //scope variable that will be the source image for the crop (may be a Blob or base64 string)\\n data-result-blob=\"result\" //scope variable that will contain the Blob information\\n data-result=\"resultDataUrl\" //scope variable that will contain the image\\'s base64 string representation\\n crop=\"initCrop\" //scope variable that must be set to true when the image is ready to be cropped\\n padding=\"250\" //space, in pixels, rounding the shape\\n max-size=\"1024\" //max of the image, in pixels\\n ></image-crop> -->\\n\\n <div class=\"item card text-center padding ink\">\\n <image-crop data-height=\"200\" data-width=\"200\" data-shape=\"circle\" data-step=\"formData.imageCropStep\" src=\"formData.imgSrc\" data-result=\"formData.result\" data-result-blob=\"formData.resultBlob\" crop=\"formData.initCrop\" padding=\"150\" max-size=\"1024\">\\n </image-crop>\\n </div>\\n </div>\\n\\n <div ng-show=\"formData.imageCropStep == 3\">\\n <p translate>PROFILE.MODAL_AVATAR.RESULT_HELP</p>\\n\\n <div class=\"item card padding hero\" style=\"height: 110px;\">\\n <div class=\"content\">\\n <img class=\"avatar\" ng-src=\"{{formData.result|trustAsHtml}}\" style=\"height: 88px; width: 88px;\">\\n </div>\\n </div>\\n </div>\\n\\n <!-- buttons bar -->\\n <div class=\"padding hidden-xs text-right\">\\n <button class=\"button button-clear button-dark ink\" ng-click=\"closeModal()\" type=\"button\" ng-if=\"formData.imageCropStep <= 2\" translate>\\n COMMON.BTN_CANCEL\\n </button>\\n <button class=\"button button-stable icon-left ion-chevron-left ink\" ng-click=\"doPrevious()\" translate ng-if=\"formData.imageCropStep >= 2\">\\n COMMON.BTN_BACK\\n </button>\\n <button class=\"button button-calm icon-right ion-chevron-right ink\" ng-click=\"doCrop()\" translate ng-disabled=\"formData.imageCropStep === 1\" ng-if=\"formData.imageCropStep <= 2\">\\n COMMON.BTN_NEXT\\n </button>\\n <button class=\"button button-positive ink\" ng-click=\"closeModal(formData.result)\" translate ng-if=\"formData.imageCropStep === 3\">\\n COMMON.BTN_CONTINUE\\n </button>\\n </div>\\n\\n </ion-content>\\n</ion-modal-view>\\n');\n$templateCache.put('plugins/es/templates/common/modal_location.html','<ion-modal-view class=\"modal-full-height modal-search-location\">\\n <ion-header-bar class=\"bar-positive\">\\n <button class=\"button button-clear\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button>\\n <h1 class=\"title\" translate>LOCATION.MODAL.TITLE</h1>\\n </ion-header-bar>\\n\\n <ion-content class=\"padding no-padding-xs no-padding-sm\" scroll=\"true\">\\n\\n\\n <!-- search text -->\\n <div class=\"item item-input\">\\n <i class=\"icon ion-search placeholder-icon\"></i>\\n\\n <input type=\"text\" class=\"visible-xs visible-sm\" placeholder=\"{{\\'LOCATION.MODAL.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"doSearch()\">\\n <input type=\"text\" class=\"hidden-xs hidden-sm\" placeholder=\"{{\\'LOCATION.MODAL.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" on-return=\"doSearch()\">\\n </div>\\n\\n <div class=\"padding-top padding-xs\" style=\"display: block; height: 60px;\">\\n <div class=\"pull-left\" ng-if=\"!search.loading && search.results\">\\n <h4 translate>COMMON.RESULTS_LIST</h4>\\n </div>\\n\\n <div class=\"pull-right hidden-xs hidden-sm\">\\n <button class=\"button button-small button-stable ink\" ng-click=\"doSearch()\">\\n {{\\'COMMON.BTN_SEARCH\\' | translate}}\\n </button>\\n </div>\\n\\n </div>\\n\\n <div class=\"center padding\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div ng-if=\"!search.loading && search.results && (!search.results.length || !search.results[0].address)\" class=\"assertive padding\">\\n <span translate>COMMON.SEARCH_NO_RESULT</span>\\n </div>\\n\\n <ion-list ng-if=\"!search.loading\" class=\"padding-top {{::motion.ionListClass}}\">\\n <div ng-repeat=\"res in search.results\" class=\"item item-border-large item-text-wrap ink\" ng-class=\"::{\\'item-divider\\': !res.address, \\'item-icon-left item-icon-right\\': res.address}\" ng-click=\"res.address ? closeModal(res) : false\">\\n\\n <!-- if divider -->\\n <h4 class=\"text-italic\" ng-if=\"::!res.address\" ng-bind-html=\"res.name\"></h4>\\n\\n <!-- if divider -->\\n <ng-if ng-if=\"::res.address\">\\n\\n <i class=\"icon ion-location\"></i>\\n\\n <h2 ng-if=\"res.address.road\">\\n {{::res.address.road}}\\n </h2>\\n <h3>\\n <span ng-if=\"res.address.postcode\">{{::res.address.postcode}}</span>\\n {{::res.address.city||res.address.village}}\\n <span class=\"gray\">| {{::res.address.country}}</span>\\n </h3>\\n <h5 class=\"gray\">\\n {{\\'LOCATION.MODAL.POSITION\\'|translate:res }}\\n </h5>\\n\\n <i class=\"icon ion-ios-arrow-right\"></i>\\n </ng-if>\\n\\n </div>\\n </ion-list>\\n </ion-content>\\n\\n <ion-footer-bar class=\"stable-bg padding-left padding-right block\" ng-if=\"license\">\\n <div class=\"pull-right copyright\">\\n <span class=\"dark\">\\xA9 </span>\\n <a class=\"positive\" href=\"{{license.url}}\" target=\"_blank\">{{license.name}}</a>\\n </div>\\n </ion-footer-bar>\\n</ion-modal-view>\\n');\n$templateCache.put('plugins/es/templates/common/popover_profile_extend.html',' <!-- profile -->\\n <button ng-if=\":state:enable && auth\" class=\"button button-positive button-small ink\" ng-click=\"showEditUserProfile()\">\\n {{\\'PROFILE.BTN_EDIT\\' | translate}}\\n </button>\\n\\n');\n$templateCache.put('plugins/es/templates/common/popup_report_abuse.html','<form name=\"abuseForm\" ng-submit=\"\">\\n <div class=\"list\" ng-init=\"setAbuseForm(abuseForm)\">\\n\\n <!-- reason -->\\n <label class=\"item item-input\" ng-class=\"{\\'item-input-error\\': abuseForm.$submitted && abuseForm.comment.$invalid}\">\\n <textarea class=\"padding\" style=\"background-color: transparent;\" name=\"comment\" type=\"text\" placeholder=\"{{\\'COMMON.REPORT_ABUSE.REASON_HELP\\' | translate}}\" rows=\"3\" ng-model=\"abuseData.comment\" ng-minlength=\"8\" required></textarea>\\n </label>\\n <div class=\"form-errors\" ng-if=\"abuseForm.$submitted && abuseForm.comment.$error\" ng-messages=\"abuseForm.comment.$error\">\\n <div class=\"form-error\" ng-message=\"required\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n <div class=\"form-error\" ng-message=\"minlength\">\\n <span translate=\"ERROR.FIELD_TOO_SHORT\"></span>\\n </div>\\n </div>\\n\\n <div class=\"item item-toggle item-text-wrap dark\">\\n <div class=\"input-label\" translate>COMMON.REPORT_ABUSE.ASK_DELETE</div>\\n <label class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"abuseData.delete\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </label>\\n </div>\\n </div>\\n</form>\\n\\n\\n');\n$templateCache.put('plugins/es/templates/common/view_comments.html','\\n<form class=\"comments\" ng-controller=\"ESCommentsCtrl\" ng-submit=\"save()\">\\n\\n <div class=\"item item-divider\">\\n <i class=\"icon ion-chatboxes\"></i>\\n <span translate>COMMENTS.DIVIDER</span>\\n <span class=\"gray\" ng-if=\"comments.total\">({{comments.total}})</span>\\n </div>\\n\\n <span class=\"item item-more-comments\" ng-if=\"comments.hasMore\">\\n <small><a ng-click=\"showMore()\" translate>COMMENTS.SHOW_MORE_COMMENTS</a></small>\\n </span>\\n\\n <div class=\"padding-right\">\\n <ng-repeat ng-repeat=\"comment in comments.result track by comment.id\" ng-include=\"::\\'plugins/es/templates/common/item_comment.html\\'\">\\n </ng-repeat>\\n </div>\\n\\n <div class=\"hidden-xs hidden-sm padding-right\">\\n <div class=\"card card-comment item item-input item-button-right\">\\n\\n <!-- reply to comment-->\\n <ng-if ng-if=\"formData.parent\">\\n <div class=\"padding card-header text-right pull-left\" translate>COMMENTS.REPLY_TO</div><br>\\n <div class=\"padding-left\">\\n <div class=\"card card-avatar card-avatar-small stable-900-bg item-text-wrap no-padding in done\">\\n <ng-include ng-if=\"formData.parent.message\" ng-init=\"comment = formData.parent\" src=\"\\'plugins/es/templates/common/item_comment_content.html\\'\">\\n </ng-include>\\n <div class=\"item dark done in gray\" ng-if=\"!formData.parent.message\">\\n {{::\\'COMMENTS.DELETED_COMMENT\\'|translate}}\\n </div>\\n <div class=\"card-footer text-right gray\">\\n <div class=\"pull-right\">\\n <a class=\"ion-close\" ng-click=\"removeParentLink()\">\\n {{::\\'COMMON.BTN_CANCEL\\'|translate}}\\n </a>\\n </div>\\n </div>\\n </div>\\n </div>\\n </ng-if>\\n <textarea class=\"padding\" style=\"background-color: transparent;\" id=\"comment-form-textarea\" rows=\"3\" placeholder=\"{{formData.replyTo ? \\'COMMENTS.COMMENT_HELP_REPLY_TO\\' : \\'COMMENTS.COMMENT_HELP\\'|translate}}\" ng-model=\"formData.message\" ng-keypress=\"onKeypress($event)\">\\n </textarea>\\n <div class=\"card-footer text-right\">\\n <button type=\"button\" class=\"button button-small button-small-padding\" ng-class=\"{\\'button-positive\\': formData.message.length}\" ng-if=\"!formData.id\" ng-click=\"save()\" translate>\\n COMMON.BTN_SEND\\n </button>\\n <!-- Edit buttons -->\\n <ng-if ng-if=\"formData.id\">\\n <button type=\"button\" class=\"button button-small button-small-padding\" ng-click=\"cancel()\" translate>\\n COMMON.BTN_CANCEL\\n </button>\\n <button type=\"button\" class=\"button button-small button-small-padding button-positive\" ng-click=\"save()\" translate>\\n COMMON.BTN_SAVE\\n </button>\\n </ng-if>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\"visible-xs visible-sm\" style=\"margin-bottom\">\\n <div class=\"block\">\\n <!-- reply to comment-->\\n <div class=\"item item-input-inset done in\" ng-if=\"formData.parent\">\\n <div class=\"padding text-right pull-left\" translate>COMMENTS.REPLY_TO</div><br>\\n <div class=\"padding-left expanded\">\\n <div class=\"card card-comment stable-900-bg item-text-wrap no-padding in done\">\\n <ng-include ng-if=\"::formData.parent.message\" ng-init=\"comment = formData.parent\" src=\"\\'plugins/es/templates/common/item_comment_content.html\\'\">\\n </ng-include>\\n <span ng-if=\"::!formData.parent.message\" translate>\\n COMMENTS.DELETED_COMMENT\\n </span>\\n <div class=\"card-footer text-right gray\">\\n <div class=\"pull-right\">\\n <a class=\"ion-close\" ng-click=\"removeParentLink()\">\\n {{::\\'COMMON.BTN_CANCEL\\'|translate}}\\n </a>\\n </div>\\n </div>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\"item item-input-inset\">\\n <div class=\"item-input-wrapper\">\\n <input type=\"text\" id=\"comment-form-input\" style=\"width: 100%\" placeholder=\"{{\\'COMMENTS.COMMENT_HELP\\'|translate}}\" on-return=\"save();\" ng-model=\"formData.message\">\\n <button type=\"submit\" class=\"button button-small button-small-padding button-icon button-dark button-icon gray\">\\n <i class=\"icon ion-android-send\"></i>\\n </button>\\n </div>\\n </div>\\n </div>\\n </div>\\n</form>\\n');\n$templateCache.put('plugins/es/templates/common/view_likes.html','\\n<div class=\"likes\">\\n\\n <!-- likes -->\\n <ng-if ng-if=\"likeData.likes && likeData.likes.total\">\\n <span ng-class=\"{\\'gray\\': !likeData.likes.wasHitCount, \\'positive\\': likeData.likes.wasHitCount}\">\\n <a title=\"{{\\'COMMON.LIKES_TEXT\\'|translate: likeData.likes }}\" ng-click=\"!canEdit && toggleLike($event, {kind: \\'like\\'})\">\\n {{likeData.likes.total}}\\n <i class=\"icon ion-heart\"></i>\\n </a>\\n </span>\\n </ng-if>\\n\\n <!-- abuses -->\\n <ng-if ng-if=\"likeData.abuses && likeData.abuses.total\">\\n <span class=\"gray\" ng-if=\"likeData.likes && likeData.likes.total\"> | </span>\\n <a ng-class=\"{\\'assertive\\': likeData.abuses.wasHitCount}\" ng-click=\"!canEdit && reportAbuse($event)\" title=\"{{\\'COMMON.ABUSES_TEXT\\'|translate: likeData.abuses }}\">\\n {{likeData.abuses.total}}\\n <i class=\"icon ion-android-warning\"></i>\\n </a>\\n </ng-if>\\n</div>\\n');\n$templateCache.put('plugins/es/templates/common/view_pictures.html','<div class=\"item gallery done in\" ng-if=\"pictures && pictures.length>0\">\\n <div ng-repeat=\"picture in pictures\" class=\"item card card-gallery\">\\n <div class=\"ink\">\\n <h2 ng-if=\"picture.title\">{{::picture.title}}</h2>\\n <img ng-src=\"{{picture.src}}\">\\n </div>\\n </div>\\n</div>\\n');\n$templateCache.put('plugins/es/templates/currency/tab_blocks_extend.html','\\n<!-- Buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'nav-buttons\\'\">\\n\\n <button class=\"button button-icon button-clear icon ion-android-search visible-xs visible-sm\" ui-sref=\"app.blockchain_search\">\\n </button>\\n</ng-if>\\n');\n$templateCache.put('plugins/es/templates/document/item_document_comment.html','<ion-item id=\"doc-{{::doc.id}}\" class=\"item item-document item-document-comment item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom\" ng-class=\"{\\'compacted\\': compactMode}\" ng-click=\"selectDocument($event, doc)\">\\n\\n <i ng-show=\":rebind:!compactMode\" ng-if=\":rebind:!doc.avatar\" class=\"icon ion-ios-chatbubble-outline stable\"></i>\\n <i ng-show=\":rebind:!compactMode\" ng-if=\":rebind:doc.avatar\" class=\"avatar\" style=\"background-image: url(\\'{{:rebind:doc.avatar.src}}\\')\"></i>\\n\\n <div class=\"row no-padding\">\\n <div class=\"col\">\\n <h4>\\n <i class=\"ion-ios-chatbubble-outline dark\"></i>\\n <span class=\"gray\" ng-if=\":rebind:doc.name\">\\n <i class=\"ion-person\" ng-show=\":rebind:!compactMode\"></i>\\n {{:rebind:doc.name}}:\\n </span>\\n <span class=\"dark\">\\n <i class=\"ion-quote\" ng-if=\":rebind:!compactMode\"></i>\\n {{:rebind:doc.message|truncText:50}}\\n </span>\\n </h4>\\n <h4 class=\"gray\"> <i class=\"ion-clock\"></i> {{:rebind:doc.time|formatDate}}</h4>\\n </div>\\n\\n <div class=\"col\">\\n <h3>\\n <a ui-sref=\"app.wot_identity({pubkey: doc.pubkey, uid: doc.name})\">\\n\\n </a>\\n </h3>\\n </div>\\n\\n <div class=\"col\" ng-if=\":rebind:!compactMode\">\\n <a ng-if=\":rebind:login && doc.pubkey==walletData.pubkey\" ng-click=\"remove($event, $index)\" class=\"gray pull-right hidden-xs hidden-sm\" title=\"{{\\'DOCUMENT.LOOKUP.BTN_REMOVE\\'|translate}}\">\\n <i class=\"ion-trash-a\"></i>\\n </a>\\n </div>\\n\\n </div>\\n</ion-item>\\n');\n$templateCache.put('plugins/es/templates/document/item_document_page.html','<ion-item id=\"doc-{{::doc.id}}\" class=\"item item-document item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom\" ng-class=\"{\\'positive-100-bg\\': doc.updated}\" ng-click=\"selectDocument($event, doc)\">\\n\\n <i ng-if=\":rebind:doc.thumbnail\" class=\"avatar\" style=\"background-image: url({{:rebind:doc.thumbnail.src}})\"></i>\\n <i ng-if=\":rebind:!doc.thumbnail\" class=\"avatar icon dark cion-registry-{{doc.docType}}\"></i>\\n\\n <div class=\"row no-padding\">\\n <div class=\"col\">\\n <h3 ng-if=\"doc.title\">\\n {{:rebind:doc.title}}\\n </h3>\\n <h4>\\n <span class=\"dark\" ng-if=\":rebind:doc.picturesCount > 1\">\\n <i class=\"ion-camera\"></i> {{:rebind:doc.picturesCount}}\\n </span>\\n <span class=\"dark\" ng-if=\":rebind:doc.city\">\\n <i class=\"ion-location\"></i> {{:rebind:doc.city}}\\n </span>\\n <span class=\"gray\" ng-if=\":rebind:doc.name\">\\n <i class=\"ion-person\"></i> {{:rebind:doc.name}}\\n </span>\\n </h4>\\n </div>\\n\\n <div class=\"col col-33\">\\n <small class=\"gray pull-right\"><i class=\"ion-clock\"></i> {{:rebind:doc.time|formatDate}}\\n </small>\\n <a ng-if=\":rebind:login && doc.pubkey==walletData.pubkey\" ng-click=\"remove($event, $index)\" class=\"gray pull-right hidden-xs hidden-sm\" title=\"{{\\'DOCUMENT.LOOKUP.BTN_REMOVE\\'|translate}}\">\\n <i class=\"ion-trash-a\"></i>\\n </a>\\n </div>\\n\\n </div>\\n</ion-item>\\n');\n$templateCache.put('plugins/es/templates/document/item_document_profile.html','<ion-item id=\"doc-{{::doc.id}}\" class=\"item item-document item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom\" ng-class=\"{\\'compacted\\': compactMode}\" ng-click=\"selectDocument($event, doc)\">\\n\\n <i ng-show=\":rebind:!compactMode\" ng-if=\":rebind:doc.avatar\" class=\"avatar\" style=\"background-image: url({{:rebind:doc.avatar.src}})\"></i>\\n <i ng-show=\":rebind:!compactMode\" ng-if=\":rebind:!doc.avatar\" class=\"icon ion-person stable\"></i>\\n\\n <div class=\"row no-padding\">\\n <div class=\"col\">\\n <h4 ng-if=\":rebind:doc.title\">\\n <i class=\"ion-person gray\"></i>\\n <span class=\"dark\">\\n {{:rebind:doc.title}}\\n </span>\\n <span class=\"gray\">\\n {{:rebind:\\'DOCUMENT.LOOKUP.HAS_CREATE_OR_UPDATE_PROFILE\\' |translate}}\\n </span>\\n </h4>\\n <h4>\\n <span class=\"dark\" ng-if=\":rebind:doc.city\">\\n <i class=\"ion-location\"></i> {{:rebind:doc.city}}\\n </span>\\n <span class=\"gray\">\\n <i class=\"ion-clock\"></i> {{:rebind:doc.time|formatDate}}\\n </span>\\n </h4>\\n </div>\\n\\n <div class=\"col\" ng-if=\":rebind:!compactMode\">\\n <a ng-if=\":rebind:login && doc.pubkey==walletData.pubkey\" ng-click=\"remove($event, $index)\" class=\"gray pull-right\" title=\"{{\\'DOCUMENT.LOOKUP.BTN_REMOVE\\'|translate}}\">\\n <i class=\"ion-trash-a\"></i>\\n </a>\\n </div>\\n\\n </div>\\n</ion-item>\\n');\n$templateCache.put('plugins/es/templates/document/item_document.html','<ion-item id=\"doc-{{::doc.id}}\" class=\"item item-document item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom\" ng-click=\"selectDocument($event, doc)\">\\n\\n <i class=\"icon ion-document stable\" ng-if=\":rebind:!doc.avatar\"></i>\\n <i class=\"avatar\" ng-if=\":rebind:doc.avatar\" style=\"background-image: url(\\'{{:rebind:doc.avatar.src}}\\')\"></i>\\n\\n <div class=\"row no-padding\">\\n <div class=\"col\">\\n <h3 class=\"dark\">\\n <i class=\"ion-locked\" ng-if=\":rebind:doc.nonce\"></i>\\n {{:rebind:doc.time|formatDate}}</h3>\\n <h4 class=\"gray\">{{:rebind:\\'DOCUMENT.HASH\\'|translate}} {{:rebind:doc.hash|formatHash}}</h4>\\n </div>\\n\\n <div class=\"col\">\\n <h3>\\n <a ui-sref=\"app.wot_identity({pubkey: doc.pubkey, uid: doc.uid})\">\\n <span class=\"gray\">\\n <i class=\"ion-key\"></i> {{:rebind:doc.pubkey|formatPubkey}}\\n </span>\\n <span class=\"positive\" ng-if=\":rebind:doc.uid\">\\n <i class=\"ion-person\"></i> {{:rebind:doc.name||doc.uid}}\\n </span>\\n </a>\\n </h3>\\n </div>\\n\\n <div class=\"col\">\\n <a ng-if=\":rebind:login && doc.pubkey==walletData.pubkey\" ng-click=\"remove($index)\" class=\"gray pull-right\" title=\"{{\\'DOCUMENT.LOOKUP.BTN_REMOVE\\'|translate}}\">\\n <i class=\"ion-trash-a\"></i>\\n </a>\\n <h3 ng-if=\":rebind:doc.recipient\">\\n <a ui-sref=\"app.wot_identity({pubkey: doc.recipient.pubkey, uid: doc.recipient.uid})\">\\n <span class=\"gray\">\\n <i class=\"ion-key\"></i> {{:rebind:doc.recipient.pubkey|formatPubkey}}\\n </span>\\n <span class=\"positive\" ng-if=\":rebind:doc.recipient.uid\">\\n <i class=\"ion-person\"></i> {{:rebind:doc.recipient.name||doc.recipient.uid}}\\n </span>\\n </a>\\n </h3>\\n <h4 class=\"gray\" ng-if=\":rebind:doc.read_signature\">\\n <i class=\"ion-checkmark\"></i>\\n <span translate>DOCUMENT.LOOKUP.READ</span>\\n </h4>\\n\\n </div>\\n\\n </div>\\n</ion-item>\\n');\n$templateCache.put('plugins/es/templates/document/items_documents.html','\\n<div class=\"item row row-header done in hidden-xs hidden-sm\" ng-if=\"showHeaders\">\\n\\n <a class=\"no-padding dark col col-header\" ng-if=\":rebind:expertMode\" ng-click=\"toggleSort(\\'time\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'time\\'\"></cs-sort-icon>\\n {{\\'DOCUMENT.LOOKUP.HEADER_TIME\\' | translate}}\\n </a>\\n <a class=\"no-padding dark col col-header\" ng-if=\":rebind:expertMode\" ng-click=\"toggleSort(\\'issuer\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'issuer\\'\"></cs-sort-icon>\\n {{\\'DOCUMENT.LOOKUP.HEADER_ISSUER\\' | translate}}\\n </a>\\n <a class=\"no-padding dark col col-header\" ng-if=\":rebind:expertMode\" ng-click=\"toggleSort(\\'recipient\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'recipient\\'\"></cs-sort-icon>\\n {{\\'DOCUMENT.LOOKUP.HEADER_RECIPIENT\\' | translate}}\\n </a>\\n</div>\\n\\n<div class=\"padding gray\" ng-if=\":rebind:!search.loading && !search.results.length\" translate>\\n COMMON.SEARCH_NO_RESULT\\n</div>\\n\\n<!-- for each doc -->\\n<ng-repeat ng-repeat=\"doc in :rebind:search.results track by doc.id\" ng-switch on=\"doc.type\">\\n <div ng-switch-when=\"comment\">\\n <ng-include src=\"::\\'plugins/es/templates/document/item_document_comment.html\\'\"></ng-include>\\n </div>\\n <div ng-switch-when=\"profile\">\\n <ng-include src=\"::\\'plugins/es/templates/document/item_document_profile.html\\'\"></ng-include>\\n </div>\\n <div ng-switch-when=\"record\">\\n <ng-include ng-if=\"doc.index === \\'page\\'\" src=\"::\\'plugins/es/templates/document/item_document_page.html\\'\"></ng-include>\\n <ng-include ng-if=\"doc.index !== \\'page\\'\" src=\"::\\'plugins/es/templates/document/item_document.html\\'\"></ng-include>\\n </div>\\n <div ng-switch-default>\\n <ng-include src=\"::\\'plugins/es/templates/document/item_document.html\\'\"></ng-include>\\n </div>\\n</ng-repeat>\\n');\n$templateCache.put('plugins/es/templates/document/list_documents.html','\\n<ion-list class=\"list\" ng-class=\"::motion.ionListClass\">\\n\\n <ng-include src=\"::\\'plugins/es/templates/document/items_documents.html\\'\"></ng-include>\\n\\n</ion-list>\\n\\n<ion-infinite-scroll ng-if=\"!search.loading && search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"1%\">\\n</ion-infinite-scroll>\\n');\n$templateCache.put('plugins/es/templates/document/lookup_form.html','<div class=\"lookupForm\">\\n\\n\\n <div class=\"item no-padding\">\\n\\n <!--<div class=\"button button-small button-text button-stable button-icon-event padding no-padding-right ink\"\\n ng-repeat=\"filter in search.filters\" ng-if=\"filter\">\\n <span ng-bind-html=\"\\'DOCUMENT.LOOKUP.TX_SEARCH_FILTER.\\'+filter.type|translate:filter\"></span>\\n <i class=\"icon ion-close\" ng-click=\"itemRemove($index)\"></i>\\n\\n </div>-->\\n\\n <label class=\"item-input\">\\n <i class=\"icon ion-search placeholder-icon\"></i>\\n <input type=\"text\" class=\"visible-xs visible-sm\" placeholder=\"{{\\'DOCUMENT.LOOKUP.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"doSearchText()\">\\n <input type=\"text\" class=\"hidden-xs hidden-sm\" id=\"{{searchTextId}}\" placeholder=\"{{\\'DOCUMENT.LOOKUP.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" on-return=\"doSearchText()\">\\n <div class=\"helptip-anchor-center\">\\n <a id=\"{{helptipPrefix}}-search-text\"></a>\\n </div>\\n\\n </label>\\n </div>\\n\\n\\n <div class=\"padding-top padding-xs\" style=\"display: block; height: 60px;\">\\n <div class=\"pull-left\">\\n <h4 ng-if=\"search.last\" translate>\\n DOCUMENT.LOOKUP.LAST_DOCUMENTS\\n </h4>\\n <h4 ng-if=\"!search.last\">\\n {{\\'COMMON.RESULTS_LIST\\'|translate}}\\n </h4>\\n <h5 class=\"dark\" ng-if=\"!search.loading && search.total\">\\n <span translate=\"COMMON.RESULTS_COUNT\" translate-values=\"{count: search.total}\"></span>\\n <small class=\"gray\" ng-if=\":rebind:search.took && expertMode\">\\n - {{:rebind:\\'COMMON.EXECUTION_TIME\\'|translate: {duration: search.took} }}\\n </small>\\n <small class=\"gray\" ng-if=\":rebind:expertMode && search.filters && search.filters.length\">\\n - <a ng-click=\"toggleShowQuery()\" ng-if=\"!showQuery\">\\n <span translate>DOCUMENT.LOOKUP.SHOW_QUERY</span>\\n <i class=\"icon ion-arrow-down-b gray\"></i>\\n </a>\\n <a ng-click=\"toggleShowQuery()\" ng-if=\"showQuery\">\\n <span translate>DOCUMENT.LOOKUP.HIDE_QUERY</span>\\n <i class=\"icon ion-arrow-up-b gray\"></i>\\n </a>\\n </small>\\n </h5>\\n <h5 class=\"gray\" ng-if=\"search.loading\">\\n <ion-spinner class=\"icon ion-spinner-small\" icon=\"android\"></ion-spinner>\\n <span translate>COMMON.SEARCHING</span>\\n <br>\\n </h5>\\n </div>\\n\\n <div class=\"pull-right hidden-xs hidden-sm\">\\n <a class=\"button button-text button-small ink\" ng-if=\"login\" ng-click=\"showActionsPopover($event)\">\\n {{\\'DOCUMENT.LOOKUP.BTN_ACTIONS\\' | translate}}\\n <i class=\"icon ion-arrow-down-b\"></i>\\n </a>\\n \\n <button class=\"button button-small button-stable ink\" ng-click=\"doSearchText()\">\\n {{\\'COMMON.BTN_SEARCH\\' | translate:search}}\\n </button>\\n </div>\\n </div>\\n\\n <div class=\"item no-border no-padding\" ng-if=\":rebind:search.filters && search.filters.length && expertMode\">\\n <small class=\"no-padding no-margin\" ng-if=\"showQuery\">\\n <span class=\"gray text-wrap dark\">{{:rebind:search.query}}</span>\\n </small>\\n </div>\\n\\n <ion-list class=\"list\" ng-class=\"::motion.ionListClass\">\\n\\n <ng-include src=\"::\\'plugins/es/templates/document/items_documents.html\\'\"></ng-include>\\n\\n </ion-list>\\n\\n <ion-infinite-scroll ng-if=\"search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"1%\">\\n </ion-infinite-scroll>\\n\\n</div>');\n$templateCache.put('plugins/es/templates/document/lookup_popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>DOCUMENT.LOOKUP.POPOVER_ACTIONS.TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n <a class=\"item item-icon-left assertive ink\" ng-class=\"{\\'gray\\': !search.total}\" ng-click=\"removeAll()\">\\n <i class=\"icon ion-trash-a\"></i>\\n {{\\'DOCUMENT.LOOKUP.POPOVER_ACTIONS.REMOVE_ALL\\' | translate}}\\n </a>\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/document/lookup.html','<ion-view>\\n <ion-nav-title>\\n <span translate>DOCUMENT.LOOKUP.TITLE</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n\\n <button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n\\n </ion-nav-buttons>\\n\\n <ion-content class=\"padding no-padding-xs no-padding-sm\" scroll=\"true\">\\n\\n <ng-include src=\"::\\'plugins/es/templates/document/lookup_form.html\\'\"></ng-include>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/group/edit_group.html','<ion-view left-buttons=\"leftButtons\">\\n <ion-nav-title>\\n <span class=\"visible-xs\" ng-if=\"id\" ng-bind-html=\"formData.title\"></span>\\n <span class=\"visible-xs\" ng-if=\"!loading && !id\" translate>GROUP.EDIT.TITLE_NEW</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <button class=\"button button-icon button-clear visible-xs visible-sm\" ng-class=\"{\\'ion-android-send\\':!id, \\'ion-android-done\\': id}\" ng-click=\"save()\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content scroll=\"true\">\\n <div class=\"row no-padding\">\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\"> </div>\\n\\n <div class=\"col\">\\n <!-- loading -->\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <form name=\"recordForm\" novalidate=\"\" ng-submit=\"save()\">\\n\\n <!-- -->\\n <div class=\"list\" ng-class=\"motion.ionListClass\" ng-init=\"setForm(recordForm)\">\\n\\n <div class=\"item hidden-xs\">\\n <h1 ng-if=\"id\" ng-bind-html=\"formData.title\"></h1>\\n <h1 ng-if=\"!id\" translate>GROUP.EDIT.TITLE_NEW</h1>\\n <h2 class=\"balanced\" ng-if=\"!id\">\\n <i class=\"icon ion-android-people\"></i>\\n <i class=\"icon ion-android-lock\" ng-if=\"formData.type==\\'managed\\'\"></i>\\n {{\\'GROUP.TYPE.ENUM.\\'+formData.type|upper|translate}}\\n </h2>\\n </div>\\n <div class=\"item\" ng-if=\"id\">\\n <h4 class=\"gray\">\\n <i class=\"icon ion-calendar\"></i>\\n {{\\'COMMON.LAST_MODIFICATION_DATE\\'|translate}} {{formData.time | formatDate}}\\n </h4>\\n <div class=\"badge badge-balanced badge-editable\" ng-click=\"showRecordTypeModal()\">\\n {{\\'GROUP.TYPE.ENUM.\\'+formData.type|upper|translate}}\\n </div>\\n </div>\\n\\n <!-- pictures -->\\n <ng-include src=\"::\\'plugins/es/templates/common/edit_pictures.html\\'\"></ng-include>\\n\\n <div class=\"item item-divider\" translate>GROUP.GENERAL_DIVIDER</div>\\n\\n <!-- title -->\\n <div class=\"item item-input item-floating-label\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.title.$invalid}\">\\n <span class=\"input-label\" translate>GROUP.EDIT.RECORD_TITLE</span>\\n <input type=\"text\" placeholder=\"{{\\'GROUP.EDIT.RECORD_TITLE_HELP\\'|translate}}\" name=\"title\" id=\"group-record-title\" ng-model=\"formData.title\" ng-minlength=\"3\" ng-required=\"true\">\\n </div>\\n <div class=\"form-errors\" ng-if=\"form.$submitted && form.title.$error\" ng-messages=\"form.title.$error\">\\n <div class=\"form-error\" ng-message=\"required\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n <div class=\"form-error\" ng-message=\"minlength\">\\n <span translate=\"ERROR.FIELD_TOO_SHORT\"></span>\\n </div>\\n </div>\\n\\n <!-- description -->\\n <div class=\"item item-input item-floating-label\">\\n <span class=\"input-label\" translate>GROUP.EDIT.RECORD_DESCRIPTION</span>\\n <textarea placeholder=\"{{\\'GROUP.EDIT.RECORD_DESCRIPTION_HELP\\'|translate}}\" ng-model=\"formData.description\" rows=\"8\" cols=\"10\">\\n </textarea>\\n </div>\\n\\n <!-- social networks -->\\n <ng-include src=\"::\\'plugins/es/templates/common/edit_socials.html\\'\" ng-controller=\"ESSocialsEditCtrl\"></ng-include>\\n\\n </div>\\n\\n <div class=\"padding hidden-xs hidden-sm text-right\">\\n <button class=\"button button-clear button-dark ink\" ng-click=\"cancel()\" type=\"button\" translate>\\n COMMON.BTN_CANCEL\\n </button>\\n <button class=\"button button-positive button-raised ink\" type=\"submit\" ng-if=\"!id\" translate>\\n COMMON.BTN_PUBLISH\\n </button>\\n <button class=\"button button-assertive button-raised ink\" type=\"submit\" ng-if=\"id\" translate>\\n COMMON.BTN_SAVE\\n </button>\\n </div>\\n </form>\\n </div>\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\"> </div>\\n\\n </div>\\n \\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/group/item_group.html','<a name=\"group-{{:rebind:group.hash}}\"></a>\\n<div id=\"group-{{:rebind:group.hash}}\" class=\"item item-icon-right item-avatar {{::ionItemClass}} ink\" ng-click=\"select(group)\">\\n\\n <i class=\"item-image avatar\" style=\"background-image: url({{::group.avatar.src}})\" ng-if=\"group.avatar\"></i>\\n <i class=\"item-image icon ion-android-people\" ng-if=\"!group.avatar\"></i>\\n <i class=\"item-image icon-secondary ion-android-lock\" ng-if=\"!group.avatar\" style=\"left: 20px; top: 17px; font-size: 19px; color: #d9d9d9;\"></i>\\n\\n <h2 ng-bind-html=\":rebind:group.title\"></h2>\\n\\n <!-- creation time-->\\n <h4 class=\"gray pull-right\">\\n <i class=\"ion-clock\"></i>\\n {{:rebind:\\'GROUP.CREATED_TIME\\'|translate: group }}\\n </h4>\\n\\n <!-- membersCount -->\\n <h4 class=\"dark pull-left\" ng-if=\":rebind:group.membersCount\">\\n <i class=\"dark ion-person\"></i>\\n <span class=\"dark\">+{{:rebind:group.membersCount}}</span>\\n </h4>\\n\\n <i class=\"icon ion-ios-arrow-right\"></i>\\n</div>\\n');\n$templateCache.put('plugins/es/templates/group/items_groups.html','\\n\\n<div class=\"item row row-header hidden-xs hidden-sm\" ng-if=\"expertMode\">\\n\\n <a class=\"no-padding dark col col-header\" ng-click=\"toggleSort(\\'medianTime\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'medianTime\\'\"></cs-sort-icon>\\n {{\\'GROUP.LOOKUP.HEADER_CREATION_TIME\\' | translate}}\\n </a>\\n <a class=\"no-padding dark col col-header\" ng-click=\"toggleSort(\\'issuer\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'issuer\\'\"></cs-sort-icon>\\n {{\\'GROUP.LOOKUP.HEADER_ISSUER\\' | translate}}\\n </a>\\n <div class=\"col col-20\"> \\n </div>\\n <a class=\"no-padding dark col col-20 col-header\" ng-click=\"toggleSort(\\'number\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'number\\'\"></cs-sort-icon>\\n {{\\'GROUP.LOOKUP.HEADER_NAME\\' | translate}}\\n </a>\\n</div>\\n\\n<div class=\"padding gray\" ng-if=\":rebind:!search.loading && !search.results.length\" translate>\\n COMMON.SEARCH_NO_RESULT\\n</div>\\n\\n<ng-repeat ng-repeat=\"group in :rebind:search.results\" ng-include=\"::\\'plugins/es/templates/group/item_group.html\\'\">\\n</ng-repeat>\\n');\n$templateCache.put('plugins/es/templates/group/list.html','<ion-list class=\"{{::motion.ionListClass}}\">\\n\\n <ion-item ng-repeat=\"notification in search.results\" class=\"item-border-large item-text-wrap ink item-avatar\" ng-class=\"{\\'unread\\': !notification.read}\" ng-click=\"select(notification)\">\\n\\n <i ng-if=\"!notification.avatar\" class=\"item-image icon {{::notification.avatarIcon}}\"></i>\\n <i ng-if=\"notification.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::notification.avatar.src}})\"></i>\\n\\n <h3 trust-as-html=\"notification.message | translate:notification\"></h3>\\n <h4>\\n <i class=\"icon {{notification.icon}}\"></i> <span class=\"dark\">{{notification.time|formatFromNow}}</span>\\n <span class=\"gray\">| {{notification.time|formatDate}}</span>\\n </h4>\\n </ion-item>\\n</ion-list>\\n\\n<ion-infinite-scroll ng-if=\"!search.loading && search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"1%\">\\n</ion-infinite-scroll>\\n');\n$templateCache.put('plugins/es/templates/group/lookup_form.html','<div class=\"lookupForm\">\\n\\n <button class=\"button button-small button-positive button-clear ink pull-right padding-right hidden-sm hidden-xs\" ng-click=\"showNewRecordModal()\">\\n <i class=\"icon ion-plus\"></i>\\n {{\\'GROUP.LOOKUP.BTN_NEW\\' | translate}}\\n </button>\\n\\n <!-- search text-->\\n <label class=\"item item-input\">\\n <i class=\"icon ion-search placeholder-icon\"></i>\\n <input type=\"text\" class=\"visible-xs visible-sm\" placeholder=\"{{\\'GROUP.LOOKUP.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"doSearchText()\">\\n <input type=\"text\" class=\"hidden-xs hidden-sm\" id=\"{{searchTextId}}\" placeholder=\"{{\\'GROUP.LOOKUP.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" on-return=\"doSearchText()\">\\n <div class=\"helptip-anchor-center\">\\n <a id=\"helptip-group-search-text\"></a>\\n </div>\\n\\n </label>\\n\\n <div class=\"padding-top padding-xs\" style=\"display: block; height: 60px;\">\\n <div class=\"pull-left\">\\n <h4 ng-if=\"search.type==\\'open\\'\" translate>\\n GROUP.LOOKUP.OPEN_RESULTS_LIST\\n </h4>\\n <h4 ng-if=\"search.type==\\'last\\'\" translate>\\n GROUP.LOOKUP.LAST_RESULTS_LIST\\n </h4>\\n <h4 ng-if=\"search.type==\\'managed\\'\" translate>\\n GROUP.LOOKUP.MANAGED_RESULTS_LIST\\n </h4>\\n <h4 ng-if=\"search.type==\\'text\\'\">\\n {{\\'COMMON.RESULTS_LIST\\'|translate}}\\n </h4>\\n <h5 class=\"dark\" ng-if=\"!search.loading && search.total\">\\n <span translate=\"COMMON.RESULTS_COUNT\" translate-values=\"{count: search.total}\"></span>\\n <small class=\"gray\" ng-if=\":rebind:search.took && expertMode\">\\n - {{:rebind:\\'COMMON.EXECUTION_TIME\\'|translate: {duration: search.took} }}\\n </small>\\n </h5>\\n <h5 class=\"gray\" ng-if=\"search.loading\">\\n <ion-spinner class=\"icon ion-spinner-small\" icon=\"android\"></ion-spinner>\\n <span translate>COMMON.SEARCHING</span>\\n <br>\\n </h5>\\n </div>\\n\\n <div class=\"pull-right hidden-xs hidden-sm\">\\n <a ng-if=\"enableFilter\" class=\"button button-text button-small ink icon ion-clock\" ng-class=\"{\\'button-text-positive\\': search.type==\\'last\\'}\" ng-click=\"doSearchLast()\">\\n {{\\'GROUP.LOOKUP.BTN_LAST\\' | translate}}\\n </a>\\n \\n <button class=\"button button-small button-stable ink\" ng-click=\"doSearchText()\">\\n {{\\'COMMON.BTN_SEARCH\\' | translate:search}}\\n </button>\\n </div>\\n </div>\\n\\n <div class=\"list {{::motion.ionListClass}}\" ng-if=\"!$scope.search.loading\">\\n\\n <ng-include src=\"::\\'plugins/es/templates/group/items_groups.html\\'\"></ng-include>\\n\\n </div>\\n\\n <ion-infinite-scroll ng-if=\"search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"1%\">\\n </ion-infinite-scroll>\\n\\n</div>');\n$templateCache.put('plugins/es/templates/group/lookup_item.html','\\n <i class=\"item-image avatar\" style=\"background-image: url({{::item.avatar.src}})\" ng-if=\"item.avatar\"></i>\\n <i class=\"item-image icon ion-android-people\" ng-if=\"!item.avatar\"></i>\\n <i class=\"item-image icon-secondary ion-android-lock\" ng-if=\"!item.avatar\" style=\"left: 20px; top: 17px; font-size: 19px; color: #d9d9d9;\"></i>\\n\\n <h2 ng-bind-html=\":rebind:item.title\"></h2>\\n\\n <!-- creation time-->\\n <h4 class=\"gray pull-right\">\\n <i class=\"ion-clock\"></i>\\n {{:rebind:\\'GROUP.CREATED_TIME\\'|translate: item }}\\n </h4>\\n\\n <!-- membersCount -->\\n <h4 class=\"dark pull-left\" ng-if=\":rebind:item.membersCount\">\\n <i class=\"dark ion-person\"></i>\\n <span class=\"dark\">+{{:rebind:item.membersCount}}</span>\\n </h4>\\n');\n$templateCache.put('plugins/es/templates/group/lookup.html','<ion-view class=\"view-group\">\\n <ion-nav-title>\\n <span translate>GROUP.LOOKUP.TITLE</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n\\n <button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n\\n </ion-nav-buttons>\\n\\n <ion-content class=\"padding no-padding-xs no-padding-sm\" scroll=\"true\">\\n <ng-include src=\"::\\'plugins/es/templates/group/lookup_form.html\\'\"></ng-include>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/group/modal_record_type.html','<ion-modal-view>\\n <ion-header-bar class=\"bar-positive\">\\n <button class=\"button button-clear\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button>\\n <h1 class=\"title\" translate>GROUP.TYPE.TITLE</h1>\\n </ion-header-bar>\\n\\n <ion-content class=\"lookupForm padding\">\\n <h3 translate>GROUP.TYPE.SELECT_TYPE</h3>\\n\\n \\t<div class=\"list\">\\n\\n <!-- open group -->\\n <div class=\"item item-complex card stable-bg item-icon-left ink\" ng-click=\"closeModal(\\'open\\')\">\\n <div class=\"item-content item-text-wrap\">\\n <i class=\"item-image icon ion-android-people dark\"></i>\\n <h2 translate>GROUP.TYPE.OPEN_GROUP</h2>\\n <h4 class=\"gray\" translate>GROUP.TYPE.OPEN_GROUP_HELP</h4>\\n </div>\\n </div>\\n\\n <!-- managed group -->\\n <div class=\"item item-complex card stable-bg item-icon-left ink\" ng-click=\"closeModal(\\'managed\\')\">\\n <div class=\"item-content item-text-wrap\">\\n <i class=\"item-image icon ion-android-people dark\"></i>\\n <i class=\"icon-secondary ion-android-lock dark\" style=\"left: 10px; top: -8px;\"></i>\\n <h2 translate>GROUP.TYPE.MANAGED_GROUP</h2>\\n <h4 class=\"gray\" translate>GROUP.TYPE.MANAGED_GROUP_HELP</h4>\\n </div>\\n </div>\\n\\n </div>\\n</ion-content>\\n</ion-modal-view>\\n');\n$templateCache.put('plugins/es/templates/group/view_popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>GROUP.VIEW.MENU_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <a class=\"item item-icon-left ink\" ng-click=\"showSharePopover($event)\">\\n <i class=\"icon ion-android-share-alt\"></i>\\n {{\\'COMMON.BTN_SHARE\\' | translate}}\\n </a>\\n\\n <!--<a class=\"item item-icon-left assertive ink\"\\n ng-if=\"canEdit\"\\n ng-click=\"delete()\">\\n <i class=\"icon ion-trash-a\"></i>\\n {{\\'COMMON.BTN_DELETE\\' | translate}}\\n </a>-->\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/group/view_record.html','<ion-view left-buttons=\"leftButtons\">\\n <ion-nav-title>\\n\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <button class=\"button button-bar button-icon button-clear visible-xs visible-sm\" ng-click=\"edit()\" ng-if=\"canEdit\">\\n <i class=\"icon ion-android-create\"></i>\\n </button>\\n <button class=\"button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content scroll=\"true\">\\n <div class=\"positive-900-bg hero\">\\n <div class=\"content\" ng-if=\"!loading\">\\n <i class=\"avatar cion-registry-{{formData.type}}\" ng-if=\"!formData.avatar\"></i>\\n <i class=\"avatar\" style=\"background-image: url({{::formData.avatar.src}})\" ng-if=\"formData.avatar\"></i>\\n <h3 ng-bind-html=\"formData.title\"></h3>\\n <h4> </h4>\\n </div>\\n <h4 class=\"content light\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </h4>\\n </div>\\n\\n <div class=\"row no-padding-xs no-padding-sm\">\\n <div class=\"col col-20 hidden-xs hidden-sm\"> \\n </div>\\n\\n <div class=\"col list item-text-wrap no-padding-xs no-padding-sm\" ng-class=\"::motion.ionListClass\">\\n\\n <div class=\"item\">\\n <h2 class=\"gray\">\\n <a ng-if=\"formData.city\" ui-sref=\"app.groups({location:formData.city})\">\\n <i class=\"icon ion-location\"></i>\\n <span ng-bind-html=\"formData.city\"></span>\\n </a>\\n <span ng-if=\"formData.city && formData.type\"> | </span>\\n <a ng-if=\"formData.type\" ui-sref=\"app.groups({type:formData.type})\">\\n <i class=\"icon ion-flag\"></i>\\n {{\\'GROUP.TYPE.ENUM.\\'+formData.type|upper|translate}}\\n </a>\\n </h2>\\n <h4>\\n <i class=\"icon ion-clock\" ng-if=\"formData.time\"></i>\\n <span translate>COMMON.SUBMIT_BY</span>\\n <a ng-class=\"{\\'positive\\': issuer.uid, \\'gray\\': !issuer.uid}\" ui-sref=\"app.wot_identity({pubkey:issuer.pubkey, uid: issuer.name||issuer.uid})\">\\n <ng-if ng-if=\"issuer.uid\">\\n <i class=\"icon ion-person\"></i>\\n {{::issuer.name||issuer.uid}}\\n </ng-if>\\n <span ng-if=\"!issuer.uid\">\\n <i class=\"icon ion-key\"></i>\\n {{issuer.pubkey|formatPubkey}}\\n </span>\\n </a>\\n <span>\\n {{formData.time|formatFromNow}}\\n <h4 class=\"gray hidden-xs\">|\\n {{formData.time | formatDate}}\\n </h4>\\n </span>\\n </h4>\\n </div>\\n\\n <!-- Buttons bar-->\\n <a id=\"group-share-anchor-{{id}}\"></a>\\n <div class=\"item large-button-bar hidden-xs hidden-sm\">\\n <button class=\"button button-stable button-small-padding icon ion-android-share-alt\" ng-click=\"showSharePopover($event)\">\\n </button>\\n <button class=\"button button-calm ink-dark\" ng-if=\"formData.pubkey && !isUserPubkey(formData.pubkey)\" ng-click=\"showTransferModal({pubkey:formData.pubkey, uid: formData.title})\">\\n {{\\'COMMON.BTN_SEND_MONEY\\' | translate}}\\n </button>\\n <button class=\"button button-stable icon-left ink-dark\" ng-if=\"canEdit\" ng-click=\"delete()\">\\n <i class=\"icon ion-trash-a assertive\"></i>\\n <span class=\"assertive\"> {{\\'COMMON.BTN_DELETE\\' | translate}}</span>\\n </button>\\n <button class=\"button button-calm icon-left ion-android-create ink\" ng-if=\"canEdit\" ng-click=\"edit()\">\\n {{\\'COMMON.BTN_EDIT\\' | translate}}\\n </button>\\n </div>\\n\\n <ion-item>\\n <h2>\\n <span trust-as-html=\"formData.description\"></span>\\n </h2>\\n </ion-item>\\n\\n <ion-item>\\n <h4 ng-if=\"formData.address\">\\n <span class=\"gray\" translate>REGISTRY.VIEW.LOCATION</span>\\n <a class=\"positive\" target=\"_blank\" href=\"https://www.google.fr/maps/?q={{formData.address}},%20{{formData.city}}\">\\n <span ng-bind-html=\"formData.address\"></span>\\n <span ng-if=\"formData.city\"> - </span>\\n <span ng-bind-html=\"formData.city\"></span>\\n </a>\\n </h4>\\n </ion-item>\\n\\n <!-- Socials networks -->\\n <ng-if ng-if=\"formData.socials && formData.socials.length>0\">\\n <ion-item class=\"item-icon-left\" type=\"no-padding item-text-wrap\" ng-repeat=\"social in formData.socials track by social.url\" id=\"social-{{social.url|formatSlug}}\">\\n <i class=\"icon ion-social-{{social.type}}\" ng-class=\"{\\'ion-bookmark\\': social.type == \\'other\\', \\'ion-link\\': social.type == \\'web\\', \\'ion-email\\': social.type == \\'email\\'}\"></i>\\n <p ng-if=\"social.type && social.type != \\'web\\'\">{{social.type}}</p>\\n <h2>\\n <a href=\"{{social.url}}\" ng-if=\"social.type != \\'email\\'\" target=\"_blank\">{{social.url}}</a>\\n <a href=\"mailto:{{social.url}}\" ng-if=\"social.type == \\'email\\'\">{{social.url}}</a>\\n </h2>\\n </ion-item>\\n </ng-if>\\n\\n <div class=\"lazy-load\">\\n\\n <!-- pictures -->\\n <ng-include src=\"::\\'plugins/es/templates/common/view_pictures.html\\'\"></ng-include>\\n\\n\\n <span class=\"item item-divider\" ng-if=\"formData.pubkey\">\\n <span translate>REGISTRY.TECHNICAL_DIVIDER</span>\\n </span>\\n\\n <!-- pubkey -->\\n <div class=\"item item-icon-left item-text-wrap ink\" ng-if=\"formData.pubkey\" copy-on-click=\"{{::formData.pubkey}}\">\\n <i class=\"icon ion-key\"></i>\\n <span translate>REGISTRY.EDIT.RECORD_PUBKEY</span>\\n <h4 class=\"dark\">{{::formData.pubkey}}</h4>\\n </div>\\n\\n <!-- comments -->\\n <ng-include src=\"::\\'plugins/es/templates/common/view_comments.html\\'\"></ng-include>\\n </div>\\n </div>\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\"> \\n </div>\\n </div>\\n </ion-content>\\n\\n <button class=\"button button-fab button-fab-bottom-right button-assertive icon ion-android-send visible-xs visible-sm\" ng-if=\"formData.pubkey && !isUserPubkey(formData.pubkey)\" ng-click=\"showTransferModal({pubkey: formData.pubkey, uid: formData.title})\">\\n </button>\\n\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/invitation/list_invitation.html','<ion-list class=\"{{::motion.ionListClass}}\">\\n\\n <ion-item ng-repeat=\"invitation in search.results\" class=\"item-border-large item-text-wrap item-avatar\">\\n\\n <i ng-if=\"::!invitation.avatar\" class=\"item-image icon {{::invitation.avatarIcon}}\"></i>\\n <i ng-if=\"::invitation.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::invitation.avatar.src}})\"></i>\\n <h3 trust-as-html=\"invitation.message | translate:invitation\"></h3>\\n <h3 class=\"dark text-italic\" ng-if=\"invitation.comment\">\\n <i class=\"icon ion-quote\"></i>\\n <span ng-bind-html=\"invitation.comment\"></span>\\n </h3>\\n <h4>\\n <i class=\"icon {{::invitation.icon}}\"></i>\\n <span class=\"dark\" ng-if=\"::invitation.issuer\" trust-as-html=\"\\'INVITATION.SUGGESTED_BY\\' | translate:invitation\"></span>\\n <span class=\"dark\">{{::invitation.time|formatFromNow}}</span>\\n <span class=\"gray\">| {{::invitation.time|formatDate}}</span>\\n </h4>\\n <div class=\"block text-right\">\\n <button class=\"button button-positive button-small button-small-padding\" ng-click=\"accept(invitation)\" ng-if=\"::invitation.state\" translate>{{::(invitation.okText||\\'COMMON.BTN_SHOW\\') |translate}}</button>\\n <button class=\"button button-stable button-small button-small-padding\" ng-click=\"delete($index)\" translate>INVITATION.BTN_DELETE</button>\\n </div>\\n </ion-item>\\n\\n</ion-list>\\n\\n<ion-infinite-scroll ng-if=\"!search.loading && search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"1%\">\\n</ion-infinite-scroll>\\n');\n$templateCache.put('plugins/es/templates/invitation/modal_new_invitation.html','<ion-modal-view id=\"transfer\" class=\"modal-invitation modal-full-height\">\\n <ion-header-bar class=\"bar-positive\">\\n <button class=\"button button-clear visible-xs\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button>\\n <h1 class=\"title\" translate>INVITATION.NEW.TITLE</h1>\\n\\n <button class=\"button button-icon button-clear icon ion-android-send visible-xs\" ng-click=\"doSend()\">\\n </button>\\n </ion-header-bar>\\n\\n <ion-content scroll=\"true\">\\n <ng-include src=\"::\\'plugins/es/templates/invitation/new_invitation_form.html\\'\"></ng-include>\\n </ion-content>\\n</ion-modal-view>\\n');\n$templateCache.put('plugins/es/templates/invitation/new_invitation_form.html',' <form name=\"invitationForm\" novalidate=\"\" ng-submit=\"doSend()\">\\n\\n <div class=\"list\" ng-init=\"setForm(invitationForm)\">\\n\\n <a class=\"item item-icon-right gray ink\" ng-class=\"{\\'disable-pointer-events\\': recipients.length, \\'item-input-error\\': form.$submitted && !recipients.length}\" ng-click=\"showSelectRecipientModal($event)\">\\n <span class=\"gray\" translate>INVITATION.NEW.RECIPIENTS</span>\\n <span class=\"item-note\">\\n <span class=\"hidden-xs\" ng-if=\"!recipients.length\" translate>INVITATION.NEW.RECIPIENTS_HELP</span>\\n <ng-repeat ng-repeat=\"identity in recipients track by identity.id\" class=\"button button-small button-text button-stable button-icon-event ink\" ng-class=\"{\\'button-text-positive\\': identity.selected}\">\\n <ng-bind-html ng-bind-html=\"identity.name||identity.uid||(identity.pubkey|formatPubkey)\"></ng-bind-html>\\n <b class=\"enable-pointer-events ion-close\" ng-click=\"removeRecipient($index, $event)\"> </b>\\n </ng-repeat>\\n </span>\\n\\n <i class=\"gray icon enable-pointer-events ion-ios-arrow-right\"></i>\\n </a>\\n <div class=\"form-errors\" ng-if=\"form.$submitted && !recipients.length\">\\n <div class=\"form-error\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n </div>\\n\\n <a class=\"item item-icon-right gray ink\" ng-class=\"{\\'disable-pointer-events\\': suggestions.length, \\'item-input-error\\': form.$submitted && !suggestions.length}\" ng-click=\"showSelectSuggestionModal($event)\">\\n <span class=\"gray enable-pointer-events\" translate>INVITATION.NEW.SUGGESTION_IDENTITIES</span>\\n\\n <span class=\"item-note\">\\n <span class=\"hidden-xs\" ng-if=\"!suggestions.length\" translate>INVITATION.NEW.SUGGESTION_IDENTITIES_HELP</span>\\n <ng-repeat ng-repeat=\"identity in suggestions track by identity.id\" class=\"button button-small button-text button-stable button-icon-event ink\" ng-class=\"{\\'button-text-positive\\': identity.selected}\">\\n <ng-bind-html ng-bind-html=\"identity.name||identity.uid||(identity.pubkey|formatPubkey)\"></ng-bind-html>\\n <b class=\"enable-pointer-events ion-close\" ng-click=\"removeSuggestion($index, $event)\"> </b>\\n </ng-repeat>\\n </span>\\n <i class=\"gray icon enable-pointer-events ion-ios-arrow-right\"></i>\\n </a>\\n <div class=\"form-errors\" ng-if=\"form.$submitted && !suggestions.length\">\\n <div class=\"form-error\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n </div>\\n\\n <!-- Enable comment ? -->\\n <div class=\"item item-content item-toggle dark visible-xs visible-sm\">\\n <span class=\"input-label gray\">{{\\'TRANSFER.BTN_ADD_COMMENT\\' | translate}}</span>\\n <label class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"formData.useComment\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </label>\\n </div>\\n\\n <!-- Comment -->\\n <label class=\"item item-input item-floating-label hidden-xs hidden-sm\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.comment.$invalid}\">\\n <span class=\"input-label\">{{\\'TRANSFER.COMMENT\\' | translate}}</span>\\n <textarea placeholder=\"{{\\'TRANSFER.COMMENT_HELP\\' | translate}}\" name=\"comment\" ng-model=\"formData.comment\" ng-maxlength=\"255\">\\n </textarea>\\n </label>\\n <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}\">\\n <span class=\"input-label\">{{\\'TRANSFER.COMMENT\\' | translate}}</span>\\n <textarea placeholder=\"{{\\'TRANSFER.COMMENT_HELP\\' | translate}}\" name=\"comment\" ng-model=\"formData.comment\" ng-maxlength=\"255\">\\n </textarea>\\n </label>\\n <div class=\"form-errors\" ng-show=\"form.$submitted && form.comment.$error\" ng-messages=\"form.comment.$error\">\\n <div class=\"form-error\" ng-message=\"maxlength\">\\n <span translate=\"ERROR.FIELD_TOO_LONG\"></span>\\n </div>\\n <div class=\"form-error\" ng-message=\"pattern\">\\n <span translate=\"ERROR.FIELD_ACCENT\"></span>\\n </div>\\n </div>\\n\\n </div>\\n\\n <div class=\"padding hidden-xs text-right\">\\n <button class=\"button button-clear button-dark ink\" tabindex=\"-1\" ng-click=\"cancel()\" type=\"button\" translate>COMMON.BTN_CANCEL\\n </button>\\n <button class=\"button button-positive ink\" tabindex=\"8\" type=\"submit\" translate>\\n TRANSFER.BTN_SEND\\n </button>\\n </div>\\n </form>\\n\\n');\n$templateCache.put('plugins/es/templates/invitation/popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <a class=\"item item-icon-left ink\" ng-class=\"{\\'gray\\': !search.results.length, \\'assertive\\': search.results.length}\" ng-click=\"deleteAll()\">\\n <i class=\"icon ion-trash-a\"></i>\\n <span translate>INVITATION.BTN_DELETE_ALL</span>\\n </a>\\n\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/invitation/popover_invitation.html','<ion-popover-view class=\"fit hidden-xs hidden-sm popover-notification popover-invitation\" ng-controller=\"PopoverInvitationCtrl\">\\n <ion-header-bar class=\"stable-bg block\">\\n <div class=\"title\" translate>INVITATION.NOTIFICATIONS.TITLE</div>\\n\\n <div class=\"pull-right\">\\n <a class=\"positive\" ng-click=\"showNewInvitationModal()\" translate>INVITATION.BTN_NEW_INVITATION</a>\\n </div>\\n </ion-header-bar>\\n <ion-content scroll=\"true\">\\n <div class=\"center padding\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n <div class=\"padding gray\" ng-if=\"!search.loading && !search.results.length\" translate>\\n INVITATION.NO_RESULT\\n </div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/invitation/list_invitation.html\\'\"></ng-include>\\n\\n </ion-content>\\n\\n <ion-footer-bar class=\"stable-bg block\">\\n <!-- settings -->\\n <div class=\"pull-left\">\\n <a class=\"positive\" ui-sref=\"app.es_settings\" ng-click=\"closePopover()\" translate>MENU.SETTINGS</a>\\n </div>\\n\\n <!-- show all -->\\n <div class=\"pull-right\">\\n <a class=\"positive\" ui-sref=\"app.view_invitations\" ng-click=\"closePopover()\" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a>\\n </div>\\n </ion-footer-bar>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/invitation/view_invitations.html','<ion-view left-buttons=\"leftButtons\" class=\"view-invitation\">\\n <ion-nav-title>\\n {{\\'INVITATION.LIST.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-content class=\"padding no-padding-xs no-padding-sm\" scroll=\"true\">\\n\\n <!-- Buttons bar-->\\n <div class=\"hidden-xs hidden-sm padding text-center\" ng-if=\"!loading\">\\n\\n <button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"load()\">\\n </button>\\n\\n <button class=\"button button-raised button-calm ink\" ng-click=\"showNewInvitationModal()\">\\n {{\\'INVITATION.BTN_NEW_INVITATION\\' | translate}}\\n </button>\\n\\n <button class=\"button button-stable icon-right ink\" ng-click=\"showActionsPopover($event)\">\\n <i class=\"icon ion-android-more-vertical\"></i> \\n {{\\'COMMON.BTN_OPTIONS\\' | translate}}\\n </button>\\n </div>\\n\\n <div class=\"row no-padding\">\\n <div class=\"col col-20 hidden-xs hidden-sm\"> </div>\\n\\n <div class=\"col no-padding-xs no-padding-sm\">\\n\\n <div class=\"center padding\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"padding gray\" ng-if=\"!search.loading && !search.results.length\" translate>\\n INVITATION.NO_RESULT\\n </div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/invitation/list_invitation.html\\'\"></ng-include>\\n\\n </div>\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\"> </div>\\n\\n </div>\\n\\n </ion-content>\\n\\n <button id=\"fab-new-invitation\" class=\"button button-fab button-fab-bottom-right button-assertive icon ion-android-send visible-xs visible-sm spin\" ng-click=\"showNewInvitationModal()\">\\n </button>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/join/modal_join_extend.html','<ng-if ng-if=\":state:enable && extensionPoint === \\'select-account-type\\'\">\\n\\n <!-- organization wallet -->\\n <div class=\"item item-complex card stable-bg item-icon-left item-icon-right ink\" ng-class=\"{ activated: accountTypeMember != null && !accountTypeMember }\" ng-click=\"selectAccountType(\\'organization\\')\">\\n <div class=\"item-content item-text-wrap\">\\n <i class=\"item-image icon dark cion-registry-association\"></i>\\n <h2 translate>ACCOUNT.NEW.ORGANIZATION_ACCOUNT</h2>\\n <h4 class=\"gray\" translate>ACCOUNT.NEW.ORGANIZATION_ACCOUNT_HELP</h4>\\n <i class=\"icon dark ion-ios-arrow-right\"></i>\\n </div>\\n </div>\\n\\n</ng-if>\\n\\n<!-- Add a slide -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'last-slide\\'\">\\n\\n <!-- STEP 6: organization type -->\\n <ion-slide-page>\\n <ion-content class=\"has-header\" scroll=\"false\">\\n\\n <p>TOTO</p>\\n\\n </ion-content>\\n </ion-slide-page>\\n\\n</ng-if>\\n');\n$templateCache.put('plugins/es/templates/menu_extend.html','\\n<!-- Top header: Main section -->\\n<div ng-if=\":state:enable && extensionPoint === \\'nav-buttons-right\\'\" class=\"hidden-xs hidden-sm\">\\n\\n\\n <!-- invitation event -->\\n <button class=\"button button-clear icon ion-person-stalker\" ng-if=\"login\" active-link=\"gray\" active-link-path-prefix=\"#/app/invitations\" ng-click=\"showInvitationsPopover($event)\">\\n <span ng-if=\"walletData.invitations.unreadCount\" class=\"badge badge-button badge-positive\">{{walletData.invitations.unreadCount}}</span>\\n </button>\\n\\n <!-- messages -->\\n <button class=\"button button-clear icon ion-email\" ng-if=\"login\" active-link=\"gray\" active-link-path-prefix=\"#/app/user/message\" ng-click=\"showMessagesPopover($event)\">\\n <span ng-if=\"walletData.messages.unreadCount\" class=\"badge badge-button badge-positive\">{{walletData.messages.unreadCount}}</span>\\n </button>\\n\\n <!-- notifications -->\\n <button class=\"button button-clear icon ion-android-notifications\" ng-if=\"login\" active-link=\"gray\" active-link-path-prefix=\"#/app/notifications\" ng-click=\"showNotificationsPopover($event)\">\\n <span ng-class=\"{\\'badge-positive\\': !walletData.notifications.warnCount, \\'badge-assertive\\': walletData.notifications.warnCount}\" ng-if=\"walletData.notifications.unreadCount || walletData.notifications.warnCount\" class=\"badge badge-button\">{{walletData.notifications.unreadCount+walletData.notifications.warnCount}}</span>\\n </button>\\n</div>\\n\\n<!-- Left menu: User section -->\\n<div ng-if=\":state:enable && extensionPoint === \\'menu-user\\' && !$root.config.readonly\" class=\"visible-xs visible-sm\">\\n\\n <a menu-close class=\"item item-icon-left\" active-link=\"active\" ng-if=\"login && walletData.isMember\" active-link-path-prefix=\"#/app/invitations\" ui-sref=\"app.view_invitations\">\\n <i class=\"icon ion-person-stalker\"></i>\\n <span translate>MENU.INVITATIONS</span>\\n <span class=\"badge badge-positive\" ng-if=\"walletData.invitations.unreadCount\">{{walletData.invitations.unreadCount}}</span>\\n </a>\\n\\n <a menu-close class=\"item item-icon-left\" active-link=\"active\" active-link-path-prefix=\"#/app/user/message\" ng-class=\"{\\'item-menu-disable\\': !login}\" ui-sref=\"app.user_message.tab_inbox\">\\n <i class=\"icon ion-email\"></i>\\n <span translate>MENU.MESSAGES</span>\\n <span class=\"badge badge-positive\" ng-if=\"walletData.messages.unreadCount\">{{walletData.messages.unreadCount}}</span>\\n </a>\\n\\n <a menu-close class=\"item item-icon-left\" active-link=\"active\" active-link-path-prefix=\"#/app/notifications\" ng-class=\"{\\'item-menu-disable\\': !login}\" ui-sref=\"app.view_notifications\">\\n <i class=\"icon ion-android-notifications\"></i>\\n <span translate>MENU.NOTIFICATIONS</span>\\n <span class=\"badge badge-positive\" ng-if=\"walletData.notifications.unreadCount\">{{walletData.notifications.unreadCount}}</span>\\n </a>\\n\\n</div>\\n');\n$templateCache.put('plugins/es/templates/message/compose_form.html',' <form name=\"messageForm\" novalidate=\"\" ng-submit=\"doSend()\">\\n\\n <div class=\"list no-margin\" ng-init=\"setForm(messageForm)\">\\n\\n <!-- TODO: allow multi dest ?\\n Do IT with a ion-scroll - see https://stackoverflow.com/a/38308803 -->\\n <a class=\"item item-icon-right gray ink\" ng-class=\"{\\'item-input-error\\': form.$submitted && !formData.destPub}\" ng-click=\"showWotLookupModal()\">\\n <span class=\"gray\" translate>MESSAGE.COMPOSE.TO</span>\\n <span class=\"badge badge-royal\" ng-if=\"destUid\"><i class=\"ion-person\"></i> {{destName||destUid}}</span> \\n <span class=\"badge badge-stable\" ng-if=\"!destUid && destPub\">{{destName}}\\n <span ng-if=\"!destName\"><i class=\"ion-key\"></i>{{destPub | formatPubkey}}</span>\\n </span> \\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </a>\\n <div class=\"form-errors\" ng-if=\"form.$submitted && !formData.destPub\">\\n <div class=\"form-error\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n </div>\\n\\n <ion-item class=\"item-text-wrap ink\" ng-class=\"{\\'item-icon-right\\': enableSelectWallet}\" ng-click=\"showSelectWalletModal()\">\\n <span class=\"gray\" translate>TRANSFER.FROM</span>\\n <span class=\"badge badge-balanced animate-fade-in animate-show-hide\" ng-show=\"!loading\">\\n <ion-spinner icon=\"android\" ng-if=\"!walletData.pubkey\"></ion-spinner>\\n <span ng-if=\"walletData.pubkey && !walletData.isMember\">\\n <i class=\"ion-key\"></i> {{walletData.pubkey| formatPubkey}} \\n </span>\\n <span ng-if=\"walletData.isMember\">\\n <i class=\"ion-person\"></i> {{walletData.name||walletData.uid}}\\n </span>\\n </span>\\n <i class=\"gray icon ion-ios-arrow-right\" ng-if=\"enableSelectWallet\"></i>\\n </ion-item>\\n\\n <!-- Object -->\\n <div class=\"item item-input\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.title.$invalid}\">\\n <input type=\"text\" autocomplete=\"off\" placeholder=\"{{\\'MESSAGE.COMPOSE.OBJECT_HELP\\' | translate}}\" name=\"title\" ng-model=\"formData.title\" ng-maxlength=\"256\" required>\\n <span class=\"badge item-note\" ng-if=\"isReply\">({{\\'MESSAGE.COMPOSE.OBJECT\\' | translate}})</span>\\n </div>\\n <div class=\"form-errors\" ng-show=\"form.$submitted && form.title.$error\" ng-messages=\"form.title.$error\">\\n <div class=\"form-error\" ng-message=\"maxlength\">\\n <span translate=\"MESSAGE.ERROR.MESSAGE_CONTENT_TOO_LONG\" translate-values=\"{maxLength: 256}\"></span>\\n </div>\\n <div class=\"form-error\" ng-message=\"required\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n </div>\\n\\n <!-- Content -->\\n <div class=\"item item-input item-floating-label\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.content.$invalid}\">\\n <span class=\"input-label\">{{\\'MESSAGE.COMPOSE.MESSAGE\\' | translate}}</span>\\n <textarea placeholder=\"{{\\'MESSAGE.COMPOSE.MESSAGE_HELP\\' | translate}}\" autocomplete=\"off\" name=\"content\" ng-model=\"formData.content\" rows=\"8\" ng-maxlength=\"5000\">\\n </textarea>\\n </div>\\n <div class=\"form-errors\" ng-show=\"form.$submitted && form.content.$error\" ng-messages=\"form.content.$error\">\\n <div class=\"form-error\" ng-message=\"maxlength\">\\n <span translate=\"MESSAGE.ERROR.MESSAGE_CONTENT_TOO_LONG\" translate-values=\"{maxLength: 5000}\"></span>\\n </div>\\n </div>\\n\\n </div>\\n\\n <div class=\"padding hidden-xs text-right\">\\n <button class=\"button button-clear button-dark ink\" ng-click=\"cancel()\" type=\"button\" translate>COMMON.BTN_CANCEL</button>\\n <button class=\"button button-positive ink\" type=\"submit\" ng-disabled=\"sending\" translate>TRANSFER.BTN_SEND</button>\\n </div>\\n\\n <!-- Encryption info -->\\n <div class=\"list no-margin\">\\n <div class=\"item item-icon-left item-text-wrap\">\\n <i class=\"icon ion-ios-information-outline positive\"></i>\\n <h4 class=\"positive\" translate>MESSAGE.COMPOSE.ENCRYPTED_HELP</h4>\\n </div>\\n </div>\\n </form>\\n\\n');\n$templateCache.put('plugins/es/templates/message/compose.html','<ion-view left-buttons=\"leftButtons\" id=\"composeMessage\">\\n <ion-nav-title>\\n <span class=\"visible-xs visible-sm\" nf-if=\"!isReply\" translate>MESSAGE.COMPOSE.TITLE</span>\\n <span class=\"visible-xs visible-sm\" nf-if=\"isReply\" translate>MESSAGE.COMPOSE.TITLE_REPLY</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <button class=\"button button-icon button-clear icon ion-android-send visible-xs\" ng-click=\"doSend()\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content scroll=\"true\">\\n <div class=\"row\">\\n <div class=\"col col-20 hidden-xs hidden-sm\"> </div>\\n <div class=\"col\">\\n <h2 class=\"hidden-xs hidden-sm\">\\n {{\\'MESSAGE.COMPOSE.SUB_TITLE\\'|translate}}\\n </h2>\\n <h4 class=\"hidden-xs hidden-sm\"> </h4>\\n <ng-include src=\"::\\'plugins/es/templates/message/compose_form.html\\'\"></ng-include>\\n </div>\\n <div class=\"col col-20 hidden-xs hidden-sm\"> </div>\\n </div>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/message/list.html','<div class=\"padding gray\" ng-if=\"!search.loading && !search.results.length\">\\n <span ng-if=\"search.type==\\'last\\'\">{{ (\\'MESSAGE.NO_MESSAGE_\\' + type) | upper | translate }}</span>\\n <span ng-if=\"search.type==\\'text\\'\" translate>COMMON.SEARCH_NO_RESULT</span>\\n</div>\\n\\n<ion-list class=\"{{::motion.ionListClass}}\" can-swipe=\"$root.device.enable\">\\n\\n <ion-item class=\"item item-border-large item-avatar item-icon-right ink\" ng-repeat=\"msg in :rebind:search.results track by msg.id\" ng-click=\"select(msg, $event)\">\\n\\n <i ng-if=\"::!msg.avatar\" class=\"item-image icon\" ng-class=\"{\\'ion-person\\': msg.uid, \\'ion-email\\': !msg.uid}\"></i>\\n <i ng-if=\"::msg.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::msg.avatar.src}})\"></i>\\n\\n <h4 class=\"pull-right hidden-xs hidden-sm\">\\n <span class=\"dark\"><i class=\"ion-clock\"></i> {{::msg.time|formatFromNow}}</span>\\n <span class=\"gray\">| {{::msg.time|formatDate}}</span>\\n </h4>\\n <h4 class=\"pull-right visible-xs visible-sm dark\"><i class=\"ion-clock\"></i> {{::msg.time|formatFromNow}}</h4>\\n <h3>\\n <a class=\"positive\" ng-if=\"::msg.name||msg.uid\" ui-sref=\"app.wot_identity({pubkey:msg.issuer, uid:msg.name||msg.uid})\">\\n <i class=\"ion-person\"></i>\\n {{::msg.name||msg.uid}}\\n </a>\\n <a class=\"gray\" ng-if=\"::!msg.name && !msg.uid\" ui-sref=\"app.wot_identity({pubkey:msg.issuer})\">\\n <i class=\"ion-key\"></i>\\n {{::msg.issuer|formatPubkey}}\\n </a>\\n </h3>\\n <h2 ng-class=\"{\\'unread\\': !msg.read}\" ng-bind-html=\"::msg.title\"></h2>\\n <p ng-bind-html=\"::msg.summary||msg.content\"></p>\\n <i class=\"icon ion-ios-arrow-right\"></i>\\n <ion-option-button class=\"button-stable\" ng-click=\"showReplyModal($index)\" translate>MESSAGE.BTN_REPLY</ion-option-button>\\n <ion-option-button class=\"button-assertive\" ng-click=\"delete($index)\" translate>COMMON.BTN_DELETE</ion-option-button>\\n\\n </ion-item>\\n</ion-list>\\n\\n<ion-infinite-scroll ng-if=\"!search.loading && search.hasMore\" icon=\"ion-loading-c\" on-infinite=\"showMore()\" distance=\"10%\">\\n</ion-infinite-scroll>\\n');\n$templateCache.put('plugins/es/templates/message/lookup_by_id.html','<ion-view left-buttons=\"leftButtons\" class=\"view-messages\">\\n\\n <ion-tabs class=\"tabs-positive tabs-icon-top\">\\n\\n <ion-tab title=\"{{\\'MESSAGE.LIST.INBOX\\'|translate}}\" icon=\"ion-archive\" ui-sref=\"app.user_messages_by_id.tab_inbox\">\\n <ion-nav-view name=\"tab_inbox\"></ion-nav-view>\\n </ion-tab>\\n\\n <ion-tab title=\"{{\\'MESSAGE.LIST.OUTBOX\\'|translate}}\" icon=\"ion-paper-airplane\" ui-sref=\"app.user_messages_by_id.tab_outbox\">\\n <ion-nav-view name=\"tab_outbox\"></ion-nav-view>\\n </ion-tab>\\n\\n </ion-tabs>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/message/lookup_lg.html','<ion-view left-buttons=\"leftButtons\" class=\"view-messages\">\\n <ion-nav-title>\\n <span translate>MESSAGE.LIST.TITLE</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <button class=\"button button-icon button-clear visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\">\\n <i class=\"icon ion-android-more-vertical\"></i>\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content class=\"padding no-padding-xs no-padding-sm\">\\n <ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"refresh(true, $event)\">\\n </ion-refresher>\\n\\n <!-- Buttons bar-->\\n <div class=\"hidden-xs hidden-sm padding text-center\">\\n\\n <button class=\"button button-stable button-small-padding icon ion-loop\" ng-click=\"load()\">\\n </button>\\n\\n <button class=\"button button-calm\" ng-click=\"showNewMessageModal()\" translate>\\n MESSAGE.BTN_COMPOSE\\n </button>\\n\\n <button class=\"button button-stable button-small-padding icon ion-android-more-vertical\" ng-click=\"showActionsPopover($event)\" title=\"{{\\'COMMON.POPOVER_ACTIONS_TITLE\\' | translate}}\">\\n </button>\\n\\n\\n </div>\\n\\n <!-- button tabs -->\\n <div class=\"buttons-tabs border-bottom hidden-sm hidden-xs\">\\n <div class=\"pull-right\">\\n\\n <!-- inbox tab -->\\n <a ng-hide=\"!isDefaultWallet\" class=\"button button-tab ink dark\" title=\"{{\\'MESSAGE.LIST.INBOX\\' | translate}}\" nav-transition=\"none\" ng-class=\"{\\'active\\': type==\\'inbox\\'}\" ui-sref=\"app.user_messages_lg_inbox\">\\n <i class=\"icon ion-archive\"></i>\\n {{\\'MESSAGE.LIST.INBOX\\' | translate}}\\n </a>\\n <a ng-hide=\"isDefaultWallet\" class=\"button button-tab ink dark\" title=\"{{\\'MESSAGE.LIST.INBOX\\' | translate}}\" nav-transition=\"none\" ng-class=\"{\\'active\\': type==\\'inbox\\'}\" ui-sref=\"app.user_messages_lg_inbox_by_id({id: walletId})\">\\n <i class=\"icon ion-archive\"></i>\\n {{\\'MESSAGE.LIST.INBOX\\' | translate}}\\n </a>\\n\\n <!-- outbox tab -->\\n <a ng-hide=\"!isDefaultWallet\" class=\"button button-tab ink dark\" title=\"{{\\'MESSAGE.LIST.OUTBOX\\' | translate}}\" nav-transition=\"none\" ng-class=\"{\\'active\\': type==\\'outbox\\'}\" ui-sref=\"app.user_messages_lg_outbox\">\\n <i class=\"icon ion-paper-airplane\"></i>\\n {{\\'MESSAGE.LIST.OUTBOX\\' | translate}}\\n </a>\\n <a ng-hide=\"isDefaultWallet\" class=\"button button-tab ink dark\" title=\"{{\\'MESSAGE.LIST.OUTBOX\\' | translate}}\" nav-transition=\"none\" ng-class=\"{\\'active\\': type==\\'outbox\\'}\" ui-sref=\"app.user_messages_lg_outbox_by_id({id: walletId})\">\\n <i class=\"icon ion-paper-airplane\"></i>\\n {{\\'MESSAGE.LIST.OUTBOX\\' | translate}}\\n </a>\\n </div>\\n </div>\\n\\n <div class=\"item no-padding\">\\n <div class=\"item-input\">\\n <i class=\"icon ion-search placeholder-icon\"></i>\\n\\n <input type=\"text\" class=\"visible-xs visible-sm\" placeholder=\"{{\\'MESSAGE.LIST.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"doSearch()\" on-return=\"doSearch()\" select-on-click>\\n <input type=\"text\" class=\"hidden-xs hidden-sm\" placeholder=\"{{\\'MESSAGE.LIST.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" on-return=\"doSearch()\">\\n <div class=\"helptip-anchor-center\">\\n <a id=\"helptip-message-search-text\"></a>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\"padding-top hidden-xs\" style=\"display: block; height: 60px;\">\\n\\n <div class=\"pull-left\" ng-if=\"!search.loading\">\\n <ng-if ng-if=\"search.type==\\'last\\'\">\\n <h4>{{ (\\'MESSAGE.LIST.LAST_\\' + type) | upper | translate}}</h4>\\n </ng-if>\\n <ng-if ng-if=\"search.type==\\'text\\'\">\\n <h4 translate>COMMON.RESULTS_LIST</h4>\\n </ng-if>\\n </div>\\n\\n <div class=\"pull-right hidden-xs hidden-sm\">\\n <a class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-positive\\': search.type==\\'last\\'}\" ng-click=\"doSearchLast()\">\\n <i class=\"icon ion-clock\"></i>\\n {{\\'MESSAGE.LIST.BTN_LAST_MESSAGES\\' | translate}}\\n </a>\\n\\n <!-- Allow extension here -->\\n <cs-extension-point name=\"filter-buttons\"></cs-extension-point>\\n \\n <button class=\"button button-small button-stable ink\" ng-click=\"doSearch()\">\\n {{\\'COMMON.BTN_SEARCH\\' | translate}}\\n </button>\\n\\n </div>\\n </div>\\n\\n <div class=\"center padding\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <!-- list -->\\n <ng-include src=\"::\\'plugins/es/templates/message/list.html\\'\"></ng-include>\\n\\n </ion-content>\\n\\n <button id=\"fab-add-message-record\" class=\"button button-fab button-fab-bottom-right button-assertive icon ion-compose visible-xs visible-sm spin\" ng-click=\"showNewMessageModal()\">\\n </button>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/message/lookup_popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>MESSAGE.LIST.POPOVER_ACTIONS.TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n <a class=\"item item-icon-left ink\" ng-class=\"{\\'gray\\': (type != \\'inbox\\' && !messages.length)}\" ng-click=\"markAllAsRead()\">\\n <i class=\"icon ion-android-checkmark-circle\"></i>\\n {{\\'COMMON.NOTIFICATIONS.MARK_ALL_AS_READ\\' | translate}}\\n </a>\\n\\n <a class=\"item item-icon-left assertive ink\" ng-class=\"{\\'gray\\': !messages.length}\" ng-click=\"deleteAll()\">\\n <i class=\"icon ion-trash-a\"></i>\\n {{\\'MESSAGE.LIST.POPOVER_ACTIONS.DELETE_ALL\\' | translate}}\\n </a>\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/message/lookup.html','<ion-view left-buttons=\"leftButtons\" class=\"view-messages\">\\n\\n <ion-tabs class=\"tabs-positive tabs-icon-top\">\\n\\n <ion-tab title=\"{{\\'MESSAGE.LIST.INBOX\\'|translate}}\" icon=\"ion-archive\" ui-sref=\"app.user_message.tab_inbox\">\\n <ion-nav-view name=\"tab_inbox\"></ion-nav-view>\\n </ion-tab>\\n\\n <ion-tab title=\"{{\\'MESSAGE.LIST.OUTBOX\\'|translate}}\" icon=\"ion-paper-airplane\" ui-sref=\"app.user_message.tab_outbox\">\\n <ion-nav-view name=\"tab_outbox\"></ion-nav-view>\\n </ion-tab>\\n\\n </ion-tabs>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/message/modal_compose.html','<ion-modal-view id=\"composeMessage\" class=\"modal-full-height\">\\n <ion-header-bar class=\"bar-positive\">\\n <button class=\"button button-clear visible-xs\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button>\\n <h1 class=\"title\" ng-if=\"!isReply\" translate>MESSAGE.COMPOSE.TITLE</h1>\\n <h1 class=\"title\" ng-if=\"isReply\" translate>MESSAGE.COMPOSE.TITLE_REPLY</h1>\\n\\n <button class=\"button button-icon button-clear icon ion-android-send visible-xs\" ng-click=\"doSend()\">\\n </button>\\n </ion-header-bar>\\n\\n <ion-content scroll=\"true\">\\n <ng-include src=\"::\\'plugins/es/templates/message/compose_form.html\\'\"></ng-include>\\n </ion-content>\\n</ion-modal-view>\\n');\n$templateCache.put('plugins/es/templates/message/popover_message.html','<ion-popover-view class=\"fit hidden-xs hidden-sm popover-light\" ng-controller=\"PopoverMessageCtrl\">\\n <ion-header-bar class=\"stable-bg block\">\\n <div class=\"title\" translate>MESSAGE.NOTIFICATIONS.TITLE</div>\\n\\n <div class=\"pull-right\">\\n <a class=\"positive\" ng-click=\"showNewMessageModal()\" translate>MESSAGE.BTN_COMPOSE</a>\\n </div>\\n </ion-header-bar>\\n <ion-content scroll=\"true\">\\n <div class=\"center padding\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n <div class=\"padding gray\" ng-if=\"!search.loading && !search.results.length\" translate>\\n MESSAGE.NO_MESSAGE_INBOX\\n </div>\\n\\n <ion-list>\\n\\n <ion-item ng-repeat=\"notification in search.results\" class=\"item-border-large item-text-wrap ink item-avatar\" ng-class=\"{\\'unread\\': !notification.read}\" ng-click=\"select(notification)\">\\n\\n <i ng-if=\"!notification.avatar\" class=\"item-image icon\" ng-class=\"{\\'ion-person\\': notification.uid, \\'ion-email\\': !notification.uid}\"></i>\\n <i ng-if=\"notification.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::notification.avatar.src}})\"></i>\\n\\n <h3>\\n <span translate>MESSAGE.NOTIFICATIONS.MESSAGE_RECEIVED</span>\\n <span class=\"positive\" ng-if=\"notification.uid\"><i class=\"ion-person\"></i> {{notification.name||notification.uid}}</span>\\n <span class=\"gray\" ng-if=\"!notification.uid\"><i class=\"ion-key\"></i> {{notification.issuer|formatPubkey}}</span>\\n </h3>\\n <h4>\\n <i class=\"icon ion-archive balanced\"></i> <span class=\"dark\">{{notification.time|formatFromNow}}</span>\\n <span class=\"gray\">| {{notification.time|formatDate}}</span>\\n </h4>\\n </ion-item>\\n </ion-list>\\n\\n <ion-infinite-scroll ng-if=\"!search.loading && search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"1%\">\\n </ion-infinite-scroll>\\n </ion-content>\\n\\n <ion-footer-bar class=\"stable-bg block\">\\n\\n <!-- show all -->\\n <div class=\"pull-right\">\\n <a class=\"positive\" ui-sref=\"app.user_message.tab_inbox\" ng-click=\"closePopover()\" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a>\\n </div>\\n </ion-footer-bar>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/message/tabs/tab_list.html','<ion-view>\\n <ion-nav-buttons side=\"secondary\">\\n\\n <!-- Allow extension here -->\\n <cs-extension-point name=\"nav-buttons\"></cs-extension-point>\\n\\n <button class=\"button button-icon button-clear icon ion-android-more-vertical\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content>\\n\\n <ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"refresh()\">\\n </ion-refresher>\\n\\n <cs-extension-point name=\"buttons\"></cs-extension-point>\\n\\n <!-- list -->\\n <ng-include src=\"::\\'plugins/es/templates/message/list.html\\'\"></ng-include>\\n\\n </ion-content>\\n\\n <!-- fab button -->\\n <div class=\"visible-xs visible-sm\">\\n <button ng-if=\"fabButtonNewMessageId\" id=\"{{::fabButtonNewMessageId}}\" class=\"button button-fab button-fab-bottom-right button-assertive spin has-footer\" ng-click=\"showNewMessageModal()\">\\n <i class=\"icon ion-compose\"></i>\\n </button>\\n </div>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/message/view_message.html','<ion-view left-buttons=\"leftButtons\" class=\"view-message\">\\n <ion-nav-title>\\n <span translate>MESSAGE.VIEW.TITLE</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n\\n <button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content scroll=\"true\">\\n\\n <div class=\"row no-padding\">\\n <div class=\"col col-20 hidden-xs hidden-sm\"> </div>\\n\\n <div class=\"col no-padding\">\\n\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"list animate-fade-slide-in item-text-wrap\">\\n\\n <!-- Buttons bar-->\\n <div class=\"item large-button-bar hidden-xs hidden-sm\">\\n <button class=\"button button-stable icon-left ink-dark\" ng-click=\"delete()\">\\n <i class=\"icon ion-trash-a assertive\"></i>\\n <span class=\"assertive\"> {{\\'COMMON.BTN_DELETE\\' | translate}}</span>\\n </button>\\n <button class=\"button button-stable icon ion-reply\" ng-click=\"showReplyModal()\">\\n {{\\'MESSAGE.BTN_REPLY\\' | translate}}\\n </button>\\n <!--<button class=\"button button-small button-stable icon ion-reply\"\\n ng-click=\"showForwardModal()\">\\n {{\\'MESSAGE.BTN_FORWARD\\' | translate}}\\n </button>-->\\n </div>\\n\\n <div class=\"item item-avatar\" ng-class=\"{\\'item-avatar\\': formData.avatar}\">\\n\\n <i ng-if=\"!formData.avatar\" class=\"item-image\" ng-class=\"{\\'ion-person\\': formData.uid, \\'ion-email\\': !formData.uid}\"></i>\\n <i ng-if=\"formData.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::formData.avatar.src}})\"></i>\\n\\n <h1 class=\"title hidden-xs hidden-sm\" ng-bind-html=\"formData.title\"></h1>\\n <h4>\\n {{type == \\'inbox\\' ? \\'MESSAGE.VIEW.SENDER\\': \\'MESSAGE.VIEW.RECIPIENT\\'|translate}}\\n <a class=\"positive\" ui-sref=\"app.wot_identity({pubkey: (type == \\'inbox\\') ? formData.issuer : formData.recipient, uid: formData.name||formData.uid})\">\\n <span ng-if=\"formData.uid\">\\n <i class=\"ion-person\"></i>\\n {{formData.name||formData.uid}}\\n </span>\\n <span ng-if=\"!formData.uid\" class=\"gray\">\\n <i class=\"ion-key gray\"></i>\\n {{formData.name||(formData.issuer|formatPubkey)}}\\n </span>\\n </a>\\n <span class=\"hidden-xs hidden-sm\">\\n <i class=\"ion-clock\"></i>\\n {{formData.time|formatFromNow}}\\n <span class=\"gray\">|\\n {{formData.time | formatDate}}\\n </span>\\n </span>\\n </h4>\\n <h5 class=\"gray visible-xs visible-sm\">\\n <i class=\"ion-clock\"></i> {{formData.time | formatDate}}\\n </h5>\\n </div>\\n\\n <!-- content -->\\n <ion-item class=\"visible-xs visible-sm\">\\n <h1 class=\"title\" ng-bind-html=\"formData.title\"></h1>\\n </ion-item>\\n\\n <!-- content -->\\n <ion-item>\\n <p ng-bind-html=\"formData.html\">\\n </p>\\n\\n <div class=\"padding gray\" ng-if=\"!formData.content\" translate>\\n MESSAGE.VIEW.NO_CONTENT\\n </div>\\n </ion-item>\\n\\n\\n </div>\\n </div>\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\"> </div>\\n </div>\\n </ion-content>\\n\\n <button id=\"fab-view-message-reply\" class=\"button button-fab button-fab-bottom-right button-calm icon ion-reply visible-xs visible-sm spin\" ng-click=\"showReplyModal()\">\\n </button>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/message/view_popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <a class=\"item item-icon-left assertive ink\" ng-click=\"delete()\">\\n <i class=\"icon ion-trash-a\"></i>\\n {{\\'MESSAGE.VIEW.DELETE\\' | translate}}\\n </a>\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/network/item_content_peer.html','\\n <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>\\n <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>\\n <i class=\"avatar\" ng-if=\":rebind:peer.avatar\" style=\"background-image: url(\\'{{:rebind:peer.avatar.src}}\\')\"></i>\\n <b class=\"icon-secondary assertive ion-close-circled\" ng-if=\":rebind:!peer.online\" style=\"left: 37px; top: -10px;\"></b>\\n\\n <div class=\"row no-padding\">\\n <div class=\"col no-padding\">\\n <h3 class=\"dark\">{{:rebind:peer.dns || peer.server}}</h3>\\n <h4>\\n <span class=\"gray\" ng-if=\":rebind:!peer.name\">\\n <i class=\"ion-key\"></i> {{:rebind:peer.pubkey|formatPubkey}}\\n </span>\\n <span class=\"positive\" ng-if=\":rebind:peer.name\">\\n <i class=\"ion-person\"></i> {{:rebind:peer.name}}\\n </span>\\n <span class=\"gray\">{{:rebind:peer.dns && (\\' | \\' + peer.server) + (peer.ep.path||\\'\\') }}</span>\\n </h4>\\n </div>\\n <div class=\"col col-15 no-padding text-center hidden-xs hidden-sm\" ng-if=\"::expertMode\">\\n <div style=\"min-width: 50px; padding-top: 5px;\">\\n <span ng-if=\":rebind:peer.isSsl()\" title=\"SSL\">\\n <i class=\"ion-locked\"></i><small class=\"hidden-md\"> SSL</small>\\n </span>\\n <span ng-if=\":rebind:peer.hasEndpoint(\\'ES_SUBSCRIPTION_API\\')\" title=\"{{\\'ES_PEER.EMAIL_SUBSCRIPTION_COUNT\\'|translate: peer.docCount }}\">\\n <i class=\"ion-email\"></i> {{:rebind:peer.docCount.emailSubscription}}\\n </span>\\n </div>\\n <div ng-if=\":rebind:peer.isTor()\">\\n <i class=\"ion-bma-tor-api\"></i>\\n </div>\\n <div ng-if=\":rebind:peer.isWs2p()&&peer.isTor()\" ng-click=\"showWs2pPopover($event, peer)\">\\n <i class=\"ion-bma-tor-api\"></i>\\n </div>\\n </div>\\n <div class=\"col col-20 no-padding text-center\" ng-if=\"::!expertMode && search.type != \\'offline\\'\">\\n <div style=\"min-width: 50px; padding-top: 5px;\" ng-if=\":rebind:peer.docCount.emailSubscription!==undefined\">\\n <span ng-if=\":rebind:peer.hasEndpoint(\\'ES_SUBSCRIPTION_API\\')\" title=\"{{\\'ES_PEER.EMAIL_SUBSCRIPTION_COUNT\\'|translate: peer.docCount }}\">\\n <i class=\"ion-email\"></i> {{:rebind:peer.docCount.emailSubscription || \\'?\\'}}\\n </span>\\n </div>\\n </div>\\n <div class=\"col col-20 no-padding text-center\" ng-if=\"::expertMode && search.type != \\'offline\\'\">\\n <h4 class=\"hidden-sm hidden-xs gray\">\\n {{:rebind:peer.software||\\'?\\'}}\\n </h4>\\n <h4 class=\"hidden-sm hidden-xs gray\">{{:rebind: peer.version ? (\\'v\\'+peer.version) : \\'\\'}}</h4>\\n </div>\\n <div class=\"col col-20 no-padding text-center\" id=\"{{$index === 0 ? helptipPrefix + \\'-peer-0-block\\' : \\'\\'}}\">\\n <span class=\"badge badge-stable\">\\n {{:rebind:peer.docCount.record !== undefined ? (peer.docCount.record|formatInteger) : \\'?\\'}}\\n <span ng-if=\":rebind:!expertMode && peer.docCount.record!==undefined\">\\n {{::\\'ES_PEER.DOCUMENTS\\'|translate|lowercase }}\\n </span>\\n </span>\\n <span class=\"badge badge-secondary\" ng-class=\":rebind:{\\'balanced\\': peer.hasMainConsensusBlock, \\'energized\\': peer.hasConsensusBlock, \\'ng-hide\\': !peer.currentNumber }\" ng-if=\"::expertMode\">\\n {{:rebind:\\'BLOCKCHAIN.VIEW.TITLE\\'|translate: {number:peer.currentNumber} }}\\n </span>\\n\\n </div>\\n </div>\\n');\n$templateCache.put('plugins/es/templates/network/items_peers.html','<div ng-class=\"::motion.ionListClass\" class=\"no-padding\">\\n\\n <div class=\"item item-text-wrap no-border done in gray no-padding-top no-padding-bottom inline text-italic\" ng-if=\"::isHttps && expertMode\">\\n <small><i class=\"icon ion-alert-circled\"></i> {{::\\'NETWORK.INFO.ONLY_SSL_PEERS\\'|translate}}</small>\\n </div>\\n\\n <div class=\"item row row-header hidden-xs hidden-sm done in\" ng-if=\"::expertMode\">\\n <a class=\"col col-header no-padding dark\" ng-click=\"toggleSort(\\'name\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'name\\'\"></cs-sort-icon>\\n {{::\\'ES_PEER.NAME\\' | translate}} / {{::\\'COMMON.PUBKEY\\' | translate}}\\n </a>\\n <a class=\"no-padding dark hidden-md col col-15 col-header\" ng-click=\"toggleSort(\\'api\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'api\\'\"></cs-sort-icon>\\n {{::\\'PEER.API\\' | translate}}\\n </a>\\n <a class=\"no-padding dark col col-20 col-header\" ng-click=\"toggleSort(\\'difficulty\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'software\\'\"></cs-sort-icon>\\n {{::\\'ES_PEER.SOFTWARE\\' | translate}}\\n </a>\\n <a class=\"col col-20 col-header no-padding dark\" ng-click=\"toggleSort(\\'doc_count\\')\">\\n <cs-sort-icon asc=\"search.asc\" sort=\"search.sort\" toggle=\"\\'doc_count\\'\"></cs-sort-icon>\\n {{::\\'ES_PEER.DOCUMENTS\\' | translate}}\\n </a>\\n </div>\\n\\n <div ng-repeat=\"peer in :rebind:search.results track by peer.id\" class=\"item item-peer item-icon-left ink\" ng-class=\"::ionItemClass\" id=\"{{helptipPrefix}}-peer-{{$index}}\" ng-click=\"selectPeer(peer)\" ng-include=\"::\\'plugins/es/templates/network/item_content_peer.html\\'\">\\n </div>\\n\\n</div>\\n');\n$templateCache.put('plugins/es/templates/network/lookup_popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>PEER.POPOVER_FILTER_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <a class=\"item item-icon-left item-icon-right ink\" ng-click=\"toggleSearchType(\\'member\\')\">\\n <i class=\"icon ion-person\"></i>\\n {{\\'PEER.MEMBERS\\' | translate}}\\n <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"search.type==\\'member\\'\"></i>\\n </a>\\n\\n <a class=\"item item-icon-left item-icon-right ink\" ng-click=\"toggleSearchType(\\'mirror\\')\">\\n <i class=\"icon ion-radio-waves\"></i>\\n {{\\'PEER.MIRRORS\\' | translate}}\\n <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"search.type==\\'mirror\\'\"></i>\\n </a>\\n\\n <a class=\"item item-icon-left item-icon-right ink\" ng-click=\"toggleSearchType(\\'offline\\')\">\\n <i class=\"icon ion-eye-disabled\"></i>\\n {{\\'PEER.OFFLINE\\' | translate}}\\n <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"search.type==\\'offline\\'\"></i>\\n </a>\\n\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/network/modal_network.html','<ion-modal-view id=\"nodes\" class=\"modal-full-height\" cache-view=\"false\">\\n <ion-header-bar class=\"bar-positive\">\\n <button class=\"button button-clear\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button>\\n <h1 class=\"title\" translate>PEER.PEER_LIST</h1>\\n <div class=\"buttons buttons-right header-item\">\\n <span class=\"secondary\">\\n <button class=\"button button-clear icon ion-loop button-clear\" ng-click=\"refresh()\">\\n\\n </button>\\n <button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n </span>\\n </div>\\n </ion-header-bar>\\n\\n <ion-content>\\n <div class=\"list\">\\n <div class=\"padding padding-xs\" style=\"display: block; height: 60px;\">\\n\\n <div class=\"pull-left\">\\n <h4 ng-if=\"!enableFilter || !search.type\">\\n {{\\'PEER.ALL_PEERS\\' | translate}} <span ng-if=\"!search.loading\">({{search.results.length}})</span>\\n </h4>\\n </div>\\n\\n <div class=\"pull-right\">\\n <ion-spinner class=\"icon\" icon=\"android\" ng-if=\"search.loading\"></ion-spinner> \\n </div>\\n </div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/network/items_peers.html\\'\"></ng-include>\\n\\n\\t </div>\\n </ion-content>\\n</ion-modal-view>\\n');\n$templateCache.put('plugins/es/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\">\\n <ion-header-bar class=\"bar bar-header stable-bg\" ng-if=\"titleKey\">\\n <div class=\"title\">\\n {{titleKey | translate:titleValues }}\\n </div>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list\" ng-class=\"{\\'has-header\\': titleKey}\">\\n <div class=\"item item-text-wrap\" ng-repeat=\"item in items\">\\n <div class=\"item-label\" ng-if=\"item.label\">{{item.label | translate}}</div>\\n <div id=\"endpoint_{{$index}}\" class=\"badge item-note dark\">{{item.value}}\\n </div>\\n </div>\\n </div></ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/network/popover_network.html','<ion-popover-view class=\"fit hidden-xs hidden-sm popover-notification popover-network\" ng-controller=\"NetworkLookupPopoverCtrl\">\\n <ion-header-bar class=\"stable-bg block\">\\n <div class=\"title\">\\n {{\\'MENU.NETWORK\\'|translate}}\\n <ion-spinner class=\"ion-spinner-small\" icon=\"android\" ng-if=\"search.loading\"></ion-spinner>\\n </div>\\n\\n <div class=\"pull-right\">\\n <a ng-class=\"{\\'positive\\': search.type==\\'member\\', \\'dark\\': search.type!==\\'member\\'}\" ng-click=\"toggleSearchType(\\'member\\')\" translate>PEER.MEMBERS</a>\\n </div>\\n </ion-header-bar>\\n <ion-content scroll=\"true\">\\n <div class=\"list no-padding\">\\n <ng-include src=\"::\\'plugins/es/templates/network/items_peers.html\\'\"></ng-include>\\n </div>\\n </ion-content>\\n\\n <ion-footer-bar class=\"stable-bg block\">\\n <!-- settings -->\\n <div class=\"pull-left\">\\n <a class=\"positive\" ui-sref=\"app.settings\" ng-click=\"closePopover()\" translate>COMMON.NOTIFICATIONS.SETTINGS</a>\\n </div>\\n\\n <!-- show all -->\\n <div class=\"pull-right\">\\n <a class=\"positive\" ui-sref=\"app.es_network\" ng-click=\"closePopover()\" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a>\\n </div>\\n </ion-footer-bar>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/network/popover_peer_info.html','<ion-popover-view class=\"fit hidden-xs hidden-sm popover-notification popover-peer-info\" ng-controller=\"PeerInfoPopoverCtrl\">\\n <ion-header-bar class=\"stable-bg block\">\\n <div class=\"title\">\\n {{\\'PEER.VIEW.TITLE\\'|translate}}\\n </div>\\n </ion-header-bar>\\n <ion-content scroll=\"true\">\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"list no-padding\" ng-if=\"!loading\">\\n\\n <div class=\"item\" ng-if=\":rebind:formData.software\">\\n <i class=\"ion-outlet\"></i>\\n {{\\'NETWORK.VIEW.SOFTWARE\\'|translate}}\\n <div class=\"badge\" ng-class=\":rebind:{\\'badge-energized\\': formData.isPreRelease, \\'badge-assertive\\': formData.hasNewRelease }\">\\n {{formData.software}} v{{:rebind:formData.version}}\\n </div>\\n <div class=\"gray badge badge-secondary\" ng-if=\"formData.isPreRelease\">\\n <i class=\"ion-alert-circled\"></i>\\n <span ng-bind-html=\"\\'NETWORK.VIEW.WARN_PRE_RELEASE\\'|translate: formData.latestRelease\"></span>\\n </div>\\n <div class=\"gray badge badge-secondary\" ng-if=\"formData.hasNewRelease\">\\n <i class=\"ion-alert-circled\"></i>\\n <span ng-bind-html=\"\\'NETWORK.VIEW.WARN_NEW_RELEASE\\'|translate: formData.latestRelease\"></span>\\n </div>\\n </div>\\n\\n <div class=\"item\">\\n <i class=\"ion-locked\"></i>\\n {{\\'NETWORK.VIEW.ENDPOINTS.BMAS\\'|translate}}\\n <div class=\"badge badge-balanced\" ng-if=\":rebind:formData.useSsl\" translate>COMMON.BTN_YES</div>\\n <div class=\"badge badge-assertive\" ng-if=\":rebind:!formData.useSsl\" translate>COMMON.BTN_NO</div>\\n </div>\\n\\n <div class=\"item\">\\n <i class=\"ion-cube\"></i>\\n {{\\'BLOCKCHAIN.VIEW.TITLE_CURRENT\\'|translate}}\\n <div class=\"badge badge-balanced\">\\n {{:rebind:formData.number | formatInteger}}\\n </div>\\n </div>\\n\\n <div class=\"item\">\\n <i class=\"ion-clock\"></i>\\n {{\\'CURRENCY.VIEW.MEDIAN_TIME\\'|translate}}\\n <div class=\"badge dark\">\\n {{:rebind:formData.medianTime | medianDate}}\\n </div>\\n </div>\\n\\n <div class=\"item\">\\n <i class=\"ion-lock-combination\"></i>\\n {{\\'CURRENCY.VIEW.POW_MIN\\'|translate}}\\n <div class=\"badge dark\">\\n {{:rebind:formData.powMin | formatInteger}}\\n </div>\\n </div>\\n\\n <!-- Allow extension here -->\\n <cs-extension-point name=\"default\"></cs-extension-point>\\n\\n </div>\\n </ion-content>\\n\\n <ion-footer-bar class=\"stable-bg block\">\\n <!-- settings -->\\n <div class=\"pull-left\">\\n <a class=\"positive\" ui-sref=\"app.settings\" ng-click=\"closePopover()\" translate>MENU.SETTINGS</a>\\n </div>\\n\\n <!-- show all -->\\n <div class=\"pull-right\">\\n <a class=\"positive\" ui-sref=\"app.view_es_peer\" ng-click=\"closePopover()\" translate>PEER.BTN_SHOW_PEER</a>\\n </div>\\n </ion-footer-bar>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/network/view_es_network.html','<ion-view>\\n <ion-nav-title>\\n <span translate>MENU.NETWORK</span> \\n <span translate>ES_SETTINGS.PLUGIN_NAME</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <button class=\"button button-icon button-clear icon ion-loop visible-xs visible-sm\" ng-click=\"refresh()\">\\n </button>\\n </ion-nav-buttons>\\n\\n\\n <ion-content scroll=\"true\" ng-init=\"enableFilter=true; ionItemClass=\\'item-border-large\\';\">\\n\\n <div class=\"row responsive-sm responsive-md responsive-lg\">\\n <div class=\"col list col-border-right\">\\n <div class=\"padding padding-xs\" style=\"display: block; height: 60px;\">\\n <div class=\"pull-left\">\\n <h4>\\n <span ng-if=\"enableFilter && !search.online\" translate>PEER.OFFLINE_PEERS</span>\\n <span ng-if=\"!enableFilter || search.online\" translate>PEER.ALL_PEERS</span>\\n <span ng-if=\"search.results.length\">({{search.results.length}})</span>\\n <ion-spinner ng-if=\"search.loading\" class=\"icon ion-spinner-small\" icon=\"android\"></ion-spinner>\\n </h4>\\n </div>\\n\\n <div class=\"pull-right\">\\n\\n <div class=\"pull-right\" ng-if=\"enableFilter\">\\n\\n <a class=\"button button-text button-small hidden-xs hidden-sm ink\" ng-class=\"{\\'button-text-positive\\': !search.online, \\'button-text-stable\\': search.online}\" ng-click=\"toggleOnline(!search.online)\">\\n <i class=\"icon ion-close-circled light-gray\"></i>\\n <span>{{\\'PEER.OFFLINE\\'|translate}}</span>\\n </a>\\n\\n <!-- Allow extension here -->\\n <cs-extension-point name=\"filter-buttons\"></cs-extension-point>\\n </div>\\n </div>\\n </div>\\n\\n <div id=\"helptip-network-peers\" style=\"display: block\"></div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/network/items_peers.html\\'\"></ng-include>\\n </div>\\n\\n <div class=\"col col-33\" ng-controller=\"ESLastDocumentsCtrl\">\\n <div class=\"padding padding-xs\" style=\"display: block;\">\\n <h4 translate>DOCUMENT.LOOKUP.LAST_DOCUMENTS_DOTS</h4>\\n\\n <div class=\"pull-right hidden-xs hidden-sm\">\\n <a class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-positive\\': compactMode, \\'button-text-stable\\': !compactMode}\" ng-click=\"toggleCompactMode()\">\\n <i class=\"icon ion-navicon\"></i>\\n <b class=\"icon-secondary ion-arrow-down-b\" style=\"top: -8px; left: 5px; font-size: 8px;\"></b>\\n <b class=\"icon-secondary ion-arrow-up-b\" style=\"top: 4px; left: 5px; font-size: 8px;\"></b>\\n <span>{{\\'DOCUMENT.LOOKUP.BTN_COMPACT\\'|translate}}</span>\\n </a>\\n\\n <!-- Allow extension here -->\\n <cs-extension-point name=\"documents-buttons\"></cs-extension-point>\\n\\n <a class=\"button button-text button-small ink\" ui-sref=\"app.document_search({index: search.index, type: search.type})\">\\n <i class=\"icon ion-android-search\"></i>\\n <span>{{\\'COMMON.BTN_SEARCH\\'|translate}}</span>\\n </a>\\n\\n </div>\\n </div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/document/list_documents.html\\'\"></ng-include>\\n\\n </div>\\n </div>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/network/view_es_peer.html','<ion-view>\\n <ion-nav-title>\\n <span translate>PEER.VIEW.TITLE</span> \\n <span translate>ES_SETTINGS.PLUGIN_NAME</span>\\n </ion-nav-title>\\n\\n <ion-content>\\n\\n <div class=\"row no-padding\">\\n <div class=\"col col-20 hidden-xs hidden-sm\"> \\n </div>\\n\\n <div class=\"col list\">\\n\\n <ion-item>\\n <h1>\\n <span translate>PEER.VIEW.TITLE</span>\\n <span class=\"gray\">\\n {{node.host}}\\n </span>\\n </h1>\\n <h2 class=\"gray\">\\n <i class=\"gray icon ion-android-globe\"></i>\\n {{node.ep.dns || node.server}}\\n <span class=\"gray\" ng-if=\"!loading && node.useSsl\">\\n <i class=\"gray ion-locked\"></i> <small>SSL</small>\\n </span>\\n <span class=\"gray\" ng-if=\"!loading && node.useTor\">\\n <i class=\"gray ion-bma-tor-api\"></i>\\n </span>\\n </h2>\\n\\n <!-- node owner -->\\n <h3>\\n <span class=\"dark\">\\n <i class=\"icon ion-android-desktop\"></i>\\n {{\\'PEER.VIEW.OWNER\\'|translate}}\\n </span>\\n <a class=\"positive\" ng-if=\"node.name\" ui-sref=\"app.wot_identity({pubkey: node.pubkey, uid: node.name})\">\\n <i class=\"ion-person\"></i> {{node.name}}\\n </a>\\n <span ng-if=\"!loading && !node.name\">\\n <a class=\"gray\" ui-sref=\"app.wot_identity({pubkey: node.pubkey})\">\\n <i class=\"ion-key\"></i>\\n {{node.pubkey|formatPubkey}}\\n </a>\\n </span>\\n </h3>\\n\\n <h3>\\n <a ng-click=\"openRawPeering($event)\">\\n <i class=\"icon ion-share\"></i> {{\\'PEER.VIEW.SHOW_RAW_PEERING\\'|translate}}\\n </a>\\n\\n <span class=\"gray\" ng-if=\"!isReachable\"> | </span>\\n <a ng-if=\"!isReachable\" ng-click=\"openRawCurrentBlock($event)\">\\n <i class=\"icon ion-share\"></i> <span translate>PEER.VIEW.SHOW_RAW_CURRENT_BLOCK</span>\\n </a>\\n </h3>\\n </ion-item>\\n\\n\\n <div class=\"item item-divider\" translate>\\n PEER.VIEW.GENERAL_DIVIDER\\n </div>\\n\\n <ion-item class=\"item-icon-left item-text-wrap ink\" copy-on-click=\"{{node.pubkey}}\">\\n <i class=\"icon ion-key\"></i>\\n <span translate>COMMON.PUBKEY</span>\\n <h4 class=\"dark text-left\">{{node.pubkey}}</h4>\\n </ion-item>\\n\\n\\n <ion-item class=\"item item-icon-left item-text-wrap ink\" ng-if=\"isReachable\">\\n <i class=\"icon ion-cube\"></i>\\n <span translate>BLOCKCHAIN.VIEW.TITLE_CURRENT</span>\\n <div class=\"badge badge-calm\" ng-if=\"!loading\">\\n {{current.number|formatInteger}}\\n </div>\\n </ion-item>\\n\\n <ion-item class=\"item item-icon-left item-text-wrap\" ng-if=\"isReachable\">\\n <i class=\"icon ion-document\"></i>\\n <span translate>ES_PEER.DOCUMENT_COUNT</span>\\n <div class=\"badge badge-stable\" ng-if=\"!loading\">\\n {{node.docCount|formatInteger}}\\n </div>\\n </ion-item>\\n\\n <a class=\"item item-icon-left item-icon-right item-text-wrap ink\" ng-if=\"isReachable\" ui-sref=\"app.document_search(options.document)\">\\n <i class=\"icon ion-document\" style=\"font-size: 25px;\"></i>\\n <i class=\"icon-secondary ion-clock\" style=\"font-size: 18px; left: 33px; top: -12px;\"></i>\\n <span translate>DOCUMENT.LOOKUP.LAST_DOCUMENTS</span>\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </a>\\n\\n <!-- Allow extension here -->\\n <cs-extension-point name=\"general\"></cs-extension-point>\\n\\n <div class=\"item item-divider\" ng-hide=\"loading || !isReachable\" translate>\\n PEER.VIEW.KNOWN_PEERS\\n </div>\\n\\n <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\">\\n <small><i class=\"icon ion-alert-circled\"></i> {{\\'NETWORK.INFO.ONLY_SSL_PEERS\\'|translate}}</small>\\n </ion-item>\\n\\n <div class=\"item center\" ng-if=\"loading\">\\n <ion-spinner class=\"icon\" icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"list no-padding {{::motion.ionListClass}}\" ng-if=\"isReachable\">\\n\\n <div ng-repeat=\"peer in :rebind:peers track by peer.id\" class=\"item item-peer item-icon-left ink\" ng-class=\"::ionItemClass\" ng-click=\"selectPeer(peer)\" ng-include=\"::\\'plugins/es/templates/network/item_content_peer.html\\'\">\\n </div>\\n\\n </div>\\n </div>\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\"> \\n </div>\\n </div>\\n\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/network/view_network_extend.html','<!-- Network: buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'network-buttons\\'\">\\n <a class=\"button button-text button-small hidden-xs hidden-sm ink\" ng-if=\"::expertMode\" title=\"{{\\'NETWORK.VIEW.ENDPOINTS.ES_USER_API\\'|translate}}\" ui-sref=\"app.es_network\">\\n <i class=\"icon ion-image\"></i>\\n <span>{{\\'ES_SETTINGS.PLUGIN_NAME\\'|translate}}</span>\\n </a>\\n</ng-if>\\n\\n<!-- Blockchain: buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'blockchain-buttons\\'\">\\n <a class=\"button button-text button-small ink\" ui-sref=\"app.blockchain_search\">\\n <i class=\"icon ion-android-search\"></i>\\n <span>{{\\'COMMON.BTN_SEARCH\\'|translate}}</span>\\n </a>\\n</ng-if>\\n\\n');\n$templateCache.put('plugins/es/templates/notification/list_notification.html','<ion-list class=\"{{::motion.ionListClass}}\">\\n\\n <ion-item ng-repeat=\"notification in search.results track by notification.id\" class=\"item-border-large item-text-wrap ink item-avatar\" ng-class=\"{\\'unread\\': !notification.read}\" ng-click=\"select($event, notification)\">\\n\\n <i ng-if=\"!notification.avatar\" class=\"item-image icon {{::notification.avatarIcon}}\"></i>\\n <i ng-if=\"notification.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::notification.avatar.src}})\"></i>\\n\\n <h3 trust-as-html=\"notification.message | translate:(notification.messageParams||notification)\"></h3>\\n <h4 ng-if=\"!notification.medianTime\">\\n <i class=\"icon {{notification.icon}}\"></i> <span class=\"dark\">{{notification.time|formatFromNow}}</span>\\n <span class=\"gray\">| {{notification.time|formatDate}}</span>\\n </h4>\\n <h4 ng-if=\"notification.medianTime\">\\n <i class=\"icon {{notification.icon}}\"></i> <span class=\"dark\">{{notification.medianTime|medianFromNow}}</span>\\n <span class=\"gray\">| {{notification.medianTime|medianDate}}</span>\\n </h4>\\n </ion-item>\\n</ion-list>\\n\\n<ion-infinite-scroll ng-if=\"!search.loading && search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"1%\">\\n</ion-infinite-scroll>\\n');\n$templateCache.put('plugins/es/templates/notification/popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <a class=\"item item-icon-left ink\" ng-disabled=\"!search.results.length\" ng-click=\"markAllAsRead()\">\\n <i class=\"icon ion-android-checkmark-circle\"></i>\\n {{\\'COMMON.NOTIFICATIONS.MARK_ALL_AS_READ\\' | translate}}\\n </a>\\n\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/notification/popover_notification.html','<ion-popover-view class=\"fit hidden-xs hidden-sm popover-notification\" ng-controller=\"PopoverNotificationsCtrl\">\\n <ion-header-bar class=\"stable-bg block\">\\n <div class=\"title\" translate>COMMON.NOTIFICATIONS.TITLE</div>\\n\\n <div class=\"pull-right\">\\n <a class=\"positive\" ng-click=\"markAllAsRead()\" translate>COMMON.NOTIFICATIONS.MARK_ALL_AS_READ</a>\\n </div>\\n </ion-header-bar>\\n <ion-content scroll=\"true\">\\n <div class=\"center padding\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n <div class=\"padding gray\" ng-if=\"!search.loading && !search.results.length\" translate>\\n COMMON.NOTIFICATIONS.NO_RESULT\\n </div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/notification/list_notification.html\\'\"></ng-include>\\n\\n </ion-content>\\n\\n <ion-footer-bar class=\"stable-bg block\">\\n <!-- settings -->\\n <div class=\"pull-left\">\\n <a class=\"positive\" ui-sref=\"app.es_settings\" ng-click=\"closePopover()\" translate>MENU.SETTINGS</a>\\n </div>\\n\\n <!-- show all -->\\n <div class=\"pull-right\">\\n <a class=\"positive\" ui-sref=\"app.view_notifications\" ng-click=\"closePopover()\" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a>\\n </div>\\n </ion-footer-bar>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/notification/view_notifications.html','<ion-view left-buttons=\"leftButtons\" class=\"view-notification\">\\n <ion-nav-title>\\n {{\\'COMMON.NOTIFICATIONS.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content scroll=\"true\">\\n <ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"refresh(true)\">\\n </ion-refresher>\\n\\n <!-- Buttons bar-->\\n <div class=\"hidden-xs hidden-sm padding text-center\">\\n\\n <button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"refresh()\">\\n </button>\\n\\n <button class=\"button button-raised icon-left ion-checkmark ink\" ng-click=\"markAllAsRead()\">\\n {{\\'COMMON.NOTIFICATIONS.MARK_ALL_AS_READ\\' | translate}}\\n </button>\\n </div>\\n\\n <div class=\"row no-padding\">\\n <div class=\"col col-20 hidden-xs hidden-sm\"> </div>\\n\\n <div class=\"col no-padding-xs no-padding-sm\">\\n\\n <div class=\"center padding\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"padding gray\" ng-if=\"!search.loading && !search.results.length\" translate>\\n COMMON.NOTIFICATIONS.NO_RESULT\\n </div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/notification/list_notification.html\\'\"></ng-include>\\n\\n\\n </div>\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\"> </div>\\n\\n </div>\\n\\n </ion-content>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/registry/edit_record.html','<ion-view left-buttons=\"leftButtons\" class=\"view-page\">\\n <ion-nav-title>\\n <span class=\"visible-xs\" ng-if=\"id\" ng-bind-html=\"formData.title\"></span>\\n <span class=\"visible-xs\" ng-if=\"!loading && !id\" translate>REGISTRY.EDIT.TITLE_NEW</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <button class=\"button button-icon button-clear visible-xs visible-sm\" ng-class=\"{\\'ion-android-send\\':!id, \\'ion-android-done\\': id}\" ng-click=\"save()\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content scroll=\"true\">\\n\\n <div class=\"hero\">\\n <div class=\"content\">\\n <i class=\"avatar\" ng-class=\"avatarClass\" ng-style=\"avatarStyle\">\\n <button class=\"button button-positive button-large button-clear flat icon ion-camera visible-xs visible-sm\" style=\"display: inline-block;\" ng-click=\"showAvatarModal()\"></button>\\n <button ng-if=\"avatar.src\" class=\"button button-positive button-large button-clear flat visible-xs visible-sm\" style=\"display: inline-block; left: 85px; bottom:15px;\" ng-click=\"rotateAvatar()\">\\n <i class=\"icon-secondary ion-image\" style=\"left: 24px; top: 3px; font-size: 24px;\"></i>\\n <i class=\"icon-secondary ion-forward\" style=\"left: 26px; top: -13px;\"></i>\\n </button>\\n <button class=\"button button-positive button-large button-clear icon ion-camera hidden-xs hidden-sm\" ng-click=\"showAvatarModal()\"></button>\\n </i>\\n <h3 class=\"dark\">\\n <span ng-if=\"!loading && formData.title\">{{formData.title}}</span>\\n <span ng-if=\"!loading && !id && !formData.title\" translate>REGISTRY.EDIT.TITLE_NEW</span>\\n </h3>\\n <h4 class=\"dark\">\\n <ion-spinner ng-if=\"loading\" icon=\"android\"></ion-spinner>\\n </h4>\\n </div>\\n </div>\\n\\n <div class=\"row no-padding\">\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\"> </div>\\n\\n <div class=\"col no-padding-xs no-padding-sm\">\\n\\n <form name=\"recordForm\" novalidate=\"\" ng-submit=\"save()\">\\n <div class=\"list {{::motion.ionListClass}}\" ng-init=\"setForm(recordForm)\">\\n <div class=\"item\" ng-if=\"id\">\\n <h4 class=\"gray\">\\n <i class=\"icon ion-calendar\"></i>\\n {{\\'COMMON.LAST_MODIFICATION_DATE\\'|translate}} {{formData.time | formatDate}}\\n </h4>\\n <div class=\"badge badge-balanced badge-editable\" ng-click=\"showRecordTypeModal()\">\\n {{\\'REGISTRY.TYPE.ENUM.\\'+formData.type|upper|translate}}\\n </div>\\n </div>\\n\\n <!-- pictures -->\\n <ng-include src=\"::\\'plugins/es/templates/common/edit_pictures.html\\'\"></ng-include>\\n\\n <div class=\"item item-divider\" translate>REGISTRY.GENERAL_DIVIDER</div>\\n\\n <!-- title -->\\n <div class=\"item item-input item-floating-label\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.title.$invalid}\">\\n <span class=\"input-label\" translate>REGISTRY.EDIT.RECORD_TITLE</span>\\n <input type=\"text\" placeholder=\"{{\\'REGISTRY.EDIT.RECORD_TITLE_HELP\\'|translate}}\" name=\"title\" id=\"registry-record-title\" ng-model=\"formData.title\" ng-minlength=\"3\" ng-required=\"true\">\\n </div>\\n <div class=\"form-errors\" ng-if=\"form.$submitted && form.title.$error\" ng-messages=\"form.title.$error\">\\n <div class=\"form-error\" ng-message=\"required\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n <div class=\"form-error\" ng-message=\"minlength\">\\n <span translate=\"ERROR.FIELD_TOO_SHORT\"></span>\\n </div>\\n </div>\\n\\n <!-- description -->\\n <div class=\"item item-input item-floating-label\">\\n <span class=\"input-label\" translate>REGISTRY.EDIT.RECORD_DESCRIPTION</span>\\n <textarea placeholder=\"{{\\'REGISTRY.EDIT.RECORD_DESCRIPTION_HELP\\'|translate}}\" ng-model=\"formData.description\" rows=\"8\" cols=\"10\">\\n </textarea>\\n </div>\\n\\n <!-- category -->\\n <div class=\"item item-icon-right ink\" ng-if=\"loading || formData.type===\\'company\\' || formData.type===\\'shop\\'\" ng-class=\"{\\'item-input-error\\': form.$submitted && !formData.category.id, \\'done in\\': !loading}\" ng-click=\"showCategoryModal()\">\\n <span translate>REGISTRY.CATEGORY</span>\\n <span class=\"badge badge-royal\">{{formData.category.name | formatCategory}}</span> \\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </div>\\n <input type=\"hidden\" name=\"category\" ng-model=\"formData.category.id\" required-if=\"formData.type==\\'company\\' || formData.type==\\'shop\\'\">\\n <div class=\"form-errors\" ng-if=\"form.$submitted && form.category.$error\" ng-messages=\"form.category.$error\">\\n <div class=\"form-error\" ng-message=\"required\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n </div>\\n\\n <!-- position -->\\n <ng-include src=\"::\\'plugins/es/templates/common/edit_position.html\\'\" ng-controller=\"ESPositionEditCtrl as ctrl\"></ng-include>\\n\\n <!-- social networks -->\\n <ng-include src=\"::\\'plugins/es/templates/common/edit_socials.html\\'\" ng-controller=\"ESSocialsEditCtrl\"></ng-include>\\n\\n <div class=\"item item-divider\" translate>REGISTRY.TECHNICAL_DIVIDER</div>\\n\\n <!-- pubkey -->\\n <div class=\"item item-input item-floating-label\">\\n <span class=\"input-label\" translate>REGISTRY.EDIT.RECORD_PUBKEY</span>\\n <input type=\"text\" placeholder=\"{{\\'REGISTRY.EDIT.RECORD_PUBKEY_HELP\\'|translate}}\" ng-model=\"formData.pubkey\">\\n </div>\\n\\n </div>\\n\\n <div class=\"padding hidden-xs hidden-sm text-right\">\\n <button class=\"button button-clear button-dark ink\" ng-click=\"cancel()\" type=\"button\" translate>\\n COMMON.BTN_CANCEL\\n </button>\\n <button class=\"button button-positive button-raised ink\" type=\"submit\" ng-if=\"!id\" translate>\\n COMMON.BTN_PUBLISH\\n </button>\\n <button class=\"button button-assertive button-raised ink\" type=\"submit\" ng-if=\"id\" translate>\\n COMMON.BTN_SAVE\\n </button>\\n </div>\\n </form>\\n </div>\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\"> </div>\\n\\n </div>\\n \\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/registry/lookup_form_options.html','\\n <!-- removeIf(device) -->\\n <div class=\"item item-icon-left item-icon-right item-input stable-bg\" remove-if=\"device\" ng-click=\"showRecordTypeModal($event)\" ng-if=\"!smallscreen && search.advanced && !search.type\">\\n <b class=\"icon-secondary ion-help gray\" style=\"left:10px; top: -8px;\"></b>\\n <b class=\"icon-secondary cion-page-association gray\" style=\"left:14px; top: 2px;\"></b>\\n <b class=\"icon-secondary cion-page-company gray\" style=\"left:28px; top: -6px;\"></b>\\n\\n <span class=\"input-label item-icon-left-padding\" translate>REGISTRY.SEARCH.TYPE</span>\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </div>\\n\\n <div class=\"item item-icon-left item-icon-right item-input stable-bg\" remove-if=\"device\" ng-click=\"showCategoryModal($event)\" ng-if=\"!smallscreen && search.advanced && !search.category\">\\n <i class=\"icon ion-flag gray\"></i>\\n <span class=\"input-label item-icon-left-padding\" translate>REGISTRY.CATEGORY</span>\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </div>\\n\\n <div class=\"item item-icon-left item-input item-select stable-bg\" ng-if=\"search.advanced && options.location.show\">\\n <i class=\"icon ion-arrow-resize gray\"></i>\\n <span class=\"input-label item-icon-left-padding\" translate>LOCATION.DISTANCE</span>\\n <label>\\n <select ng-model=\"search.geoDistance\" class=\"col-border-left\" ng-options=\"i as (geoDistanceLabels[i].labelKey | translate:geoDistanceLabels[i].labelParams ) for i in geoDistances track by i\">\\n </select>\\n </label>\\n </div>\\n');\n$templateCache.put('plugins/es/templates/registry/lookup_form.html','\\n<!-- selected location\\n<a\\n class=\"button button-small button-text button-stable button-icon-event stable-900-bg\"\\n style=\"margin-right: 10px;\">\\n <i class=\"icon ion-location\"></i>\\n {{search.location}}\\n <i class=\"icon ion-close\" ng-click=\"removeLocation2()\"> </i>\\n</a>-->\\n<form ng-submit=\"doSearch()\">\\n <div class=\"item no-padding\">\\n\\n <div class=\"item-input\">\\n <i class=\"icon ion-search placeholder-icon\"></i>\\n <input type=\"text\" class=\"visible-xs visible-sm\" placeholder=\"{{\\'REGISTRY.SEARCH.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"doSearch()\" on-return=\"doSearchText()\" select-on-click>\\n <input type=\"text\" class=\"hidden-xs hidden-sm\" placeholder=\"{{\\'REGISTRY.SEARCH.SEARCH_HELP\\'|translate}}\" id=\"registrySearchText\" ng-model=\"search.text\" on-return=\"doSearchText()\">\\n </div>\\n\\n <div class=\"row double-padding-x item-text-wrap animate-show-hide ng-hide hidden-xs hidden-sm\" ng-show=\"entered\" ng-if=\"search.geoPoint || search.type || search.category\">\\n\\n <!-- selected location -->\\n <div ng-show=\"search.geoPoint\" class=\"button button-small button-text button-stable button-icon-event stable-900-bg\" style=\"margin-right: 10px;\">\\n <i class=\"icon ion-location\"></i>\\n <span ng-bind-html=\"search.location\"></span>\\n <i class=\"icon ion-close\" ng-click=\"removeLocation()\"> </i>\\n </div>\\n\\n <!-- selected type -->\\n <div ng-show=\"search.type\" class=\"button button-small button-text button-stable button-icon-event stable-900-bg\" style=\"margin-right: 10px;\">\\n <i class=\"icon cion-page-{{search.type}}\"></i>\\n <span>{{\\'REGISTRY.TYPE.ENUM.\\'+search.type|uppercase|translate}}</span>\\n <i class=\"icon ion-close\" ng-click=\"removeType()\"> </i>\\n </div>\\n\\n <!-- selected category -->\\n <div ng-show=\"search.category.name\" class=\"button button-small button-text button-stable button-icon-event stable-900-bg\" style=\"margin-right: 10px;\">\\n <i class=\"icon ion-flag\"></i>\\n <span>{{search.category.name|truncText:40}}</span>\\n <i class=\"icon ion-close\" ng-click=\"removeCategory()\"> </i>\\n </div>\\n </div>\\n </div>\\n\\n <!-- location -->\\n <ng-include src=\"::\\'plugins/es/templates/common/item_location_search.html\\'\" ng-if=\"entered && options.location.show && (!search.geoPoint || smallscreen)\" ng-controller=\"ESSearchPositionItemCtrl\"></ng-include>\\n\\n <!-- options -->\\n <ng-include src=\"::\\'plugins/es/templates/registry/lookup_form_options.html\\'\"></ng-include>\\n\\n\\n\\n<div class=\"padding-top hidden-xs hidden-sm\" style=\"display: block; height: 60px;\">\\n <div class=\"pull-left\">\\n\\n <a class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-stable\\': !search.advanced, \\'button-text-positive\\': search.advanced}\" ng-click=\"search.advanced=!search.advanced\">\\n {{\\'REGISTRY.SEARCH.BTN_ADVANCED_SEARCH\\' | translate}}\\n <i class=\"icon\" ng-class=\"{\\'ion-arrow-down-b\\': !search.advanced, \\'ion-arrow-up-b\\': search.advanced}\"></i>\\n </a>\\n\\n \\n\\n </div>\\n\\n <div class=\"pull-right\">\\n\\n <a ng-if=\"enableFilter\" class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-positive\\': search.lastRecords}\" ng-click=\"doGetLastRecords()\">\\n <i class=\"icon ion-clock\"></i>\\n {{\\'REGISTRY.SEARCH.BTN_LAST_RECORDS\\' | translate}}\\n </a>\\n \\n\\n <!-- Allow extension here -->\\n <cs-extension-point name=\"filter-buttons\"></cs-extension-point>\\n\\n \\n\\n <button class=\"button button-small button-stable ink\" ng-click=\"doSearchText()\">\\n {{\\'COMMON.BTN_SEARCH\\' | translate}}\\n </button>\\n </div>\\n</div>\\n\\n<div class=\"padding-top padding-xs padding-sm\" style=\"display: block; height: 60px;\">\\n <div class=\"pull-left ng-hide\" ng-show=\"!search.loading && search.results\">\\n <ng-if ng-if=\"search.lastRecords\">\\n <h4 translate>REGISTRY.SEARCH.LAST_RECORDS</h4>\\n <small class=\"gray no-padding\" ng-if=\"search.total\">\\n <span ng-if=\"search.geoPoint && search.total\">{{\\'REGISTRY.SEARCH.LAST_RECORD_COUNT_LOCATION\\'|translate:{count: search.total, location: search.location} }}</span>\\n <span ng-if=\"!search.geoPoint && search.total\">{{\\'REGISTRY.SEARCH.LAST_RECORD_COUNT\\'|translate:{count: search.total} }}</span>\\n </small>\\n </ng-if>\\n\\n <ng-if ng-if=\"!search.lastRecords\">\\n <h4 translate>COMMON.RESULTS_LIST</h4>\\n <small class=\"gray no-padding\" ng-if=\"search.total\">\\n <span ng-if=\"search.geoPoint && search.total\">{{\\'REGISTRY.SEARCH.RESULT_COUNT_LOCATION\\'|translate:{count: search.total, location: search.location} }}</span>\\n <span ng-if=\"!search.geoPoint && search.total\">{{\\'REGISTRY.SEARCH.RESULT_COUNT\\'|translate:{count: search.total} }}</span>\\n </small>\\n </ng-if>\\n\\n </div>\\n</div>\\n\\n<div class=\"center\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n</div>\\n\\n<div class=\"padding assertive\" ng-if=\"!search.loading && search.results.length===0\" translate>\\n COMMON.SEARCH_NO_RESULT\\n</div>\\n');\n$templateCache.put('plugins/es/templates/registry/lookup_lg.html','<ion-view left-buttons=\"leftButtons\">\\n <ion-nav-title>\\n {{\\'REGISTRY.SEARCH.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-content class=\"lookupForm padding no-padding-xs no-padding-sm\">\\n\\n <ng-include src=\"::\\'plugins/es/templates/wot/lookup_lg_extend.html\\'\" ng-init=\"enable= true; showNewPageButton=true;\"></ng-include>\\n\\n <ng-include src=\"::\\'plugins/es/templates/registry/lookup_form.html\\'\"></ng-include>\\n\\n <ng-include src=\"::\\'plugins/es/templates/registry/lookup_list_lg.html\\'\"></ng-include>\\n </ion-content>\\n\\n <button id=\"fab-add-registry-record\" class=\"button button-fab button-fab-bottom-right button-assertive icon ion-plus hidden-md hidden-lg spin\" ng-click=\"showNewPageModal()\">\\n </button>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/registry/lookup_list_lg.html','\\n\\n<div class=\"list {{::motion.ionListClass}}\" ng-if=\"!search.loading && search.results && search.results.length > 0\">\\n\\n <a ng-repeat=\"item in search.results\" class=\"item item-record item-border-large ink padding-xs\" ui-sref=\"app.view_page({id: item.id, title: item.urlTitle})\">\\n\\n <div class=\"row row-record\">\\n <div class=\"col item-text-wrap item-avatar-left-padding\" ng-class=\"::{\\'item-avatar\\': item.avatar || item.type}\">\\n <i class=\"item-image icon cion-page-{{::item.type}}\" ng-if=\"::!item.avatar\"></i>\\n <i class=\"item-image avatar\" style=\"background-image: url({{::item.avatar.src}})\" ng-if=\"::item.avatar\"></i>\\n <h2 ng-bind-html=\"::item.title\"></h2>\\n <h4>\\n <span class=\"dark\" ng-if=\"::item.city\">\\n <b class=\"ion-location\"></b>\\n <span ng-bind-html=\"::item.city\"></span>\\n </span>\\n <span class=\"gray\" ng-if=\"::item.distance\">\\n ({{::item.distance|formatDecimal}} {{::geoUnit}})\\n </span>\\n </h4>\\n <h4>\\n <span class=\"gray\" ng-if=\"::item.time && search.lastRecords\">\\n <b class=\"ion-clock\"></b>\\n {{::item.time | formatFromNow}}\\n </span>\\n <span ng-if=\"::item.tags\" class=\"dark\">\\n <ng-repeat ng-repeat=\"tag in ::item.tags\">\\n #<ng-bind-html ng-bind-html=\"::tag\"></ng-bind-html>\\n </ng-repeat>\\n </span>\\n </h4>\\n <span ng-if=\"::item.picturesCount > 1\" class=\"badge badge-balanced badge-picture-count\">{{::item.picturesCount}} <i class=\"icon ion-camera\"></i></span>\\n </div>\\n <div class=\"col col-20 hidden-xs hidden-sm\">\\n <h3 class=\"gray\">\\n <ng-if ng-if=\"::item.category\">{{::item.category.name}}</ng-if>\\n <ng-if ng-if=\"::!item.category\">{{::\\'REGISTRY.TYPE.ENUM.\\'+item.type|uppercase|translate}}</ng-if>\\n </h3>\\n </div>\\n <div class=\"col hidden-xs\">\\n <h4 class=\"text-wrap\">\\n <span class=\"visible-sm\">\\n <b class=\"ion-flag\"></b>\\n <ng-if ng-if=\"::item.category\">{{::item.category.name|truncText:50}}</ng-if>\\n <ng-if ng-if=\"::!item.category\">{{::\\'REGISTRY.TYPE.ENUM.\\'+item.type|uppercase|translate}}</ng-if>\\n </span>\\n <span class=\"gray text-italic\" ng-if=\"::item.description\">\\n <b class=\"ion-quote\"></b>\\n <span ng-bind-html=\"::item.description|truncText:500\" ng-if=\"::item.description\"></span>\\n </span>\\n </h4>\\n </div>\\n </div>\\n\\n </a>\\n</div>\\n\\n<ion-infinite-scroll ng-if=\"!search.loading && search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"10%\">\\n</ion-infinite-scroll>\\n');\n$templateCache.put('plugins/es/templates/registry/lookup_list.html','\\n<ion-list class=\"{{::motion.ionListClass}}\" ng-if=\"!search.loading && search.results\">\\n\\n <div class=\"item item-avatar item-icon-right item-border-large ink\" ng-repeat=\"item in search.results\" ui-sref=\"app.view_page({id: item.id, title: item.urlTitle})\">\\n\\n <i ng-if=\"::!item.avatar\" class=\"item-image icon cion-page-{{::item.type}}\"></i>\\n <i ng-if=\"::item.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::item.avatar.src}})\"></i>\\n\\n <h2 ng-bind-html=\"::item.title\"></h2>\\n <h4>\\n <span class=\"dark\" ng-if=\"::item.city\">\\n <b class=\"ion-location\"></b>\\n <span ng-bind-html=\"::item.city\"></span>\\n </span>\\n <span class=\"gray\" ng-if=\"::item.distance\">\\n ({{::item.distance|formatDecimal}} {{::geoUnit}})\\n </span>\\n </h4>\\n <h4 class=\"gray\" ng-if=\"::item.time && search.lastRecords\">\\n <i class=\"ion-clock\"></i>\\n {{::item.time | formatFromNow}}\\n </h4>\\n <h4 class=\"gray\" ng-if=\"!search.lastRecords\">\\n <i class=\"cion-page-{{::item.type}}\"></i>\\n <span ng-if=\"item.category\">{{::item.category.name}}</span>\\n <span ng-if=\"!item.category\">{{::\\'REGISTRY.TYPE.ENUM.\\'+item.type|uppercase|translate}}</span>\\n </h4>\\n <i class=\"icon ion-ios-arrow-right\"></i>\\n </div>\\n</ion-list>\\n');\n$templateCache.put('plugins/es/templates/registry/lookup_popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <!-- new page -->\\n <a class=\"item item-icon-left ink\" ng-click=\"showNewPageModal();\">\\n <i class=\"icon ion-plus\"></i>\\n <span translate>REGISTRY.BTN_NEW</span>\\n </a>\\n\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/registry/lookup_popover_filters.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>COMMON.POPOVER_FILTER_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <!-- last record -->\\n <a class=\"item item-icon-left ink\" ng-click=\"doGetLastRecords()\">\\n <i class=\"icon ion-clock\"></i>\\n {{\\'REGISTRY.SEARCH.BTN_LAST_RECORDS\\' | translate}}\\n </a>\\n\\n <!-- advanced options -->\\n <a class=\"item item-icon-left ink\" ng-click=\"toggleAdvanced();\">\\n <i class=\"icon ion-android-checkbox-outline-blank\" ng-show=\"!search.advanced\"></i>\\n <i class=\"icon ion-android-checkbox-outline\" ng-show=\"search.advanced\"></i>\\n <span translate>REGISTRY.SEARCH.POPOVER_FILTERS.BTN_ADVANCED_SEARCH</span>\\n </a>\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/registry/modal_record_type.html','<ion-modal-view>\\n <ion-header-bar class=\"bar-positive\">\\n <button class=\"button button-clear\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button>\\n <h1 class=\"title\" translate>{{getParameters().title||\\'REGISTRY.TYPE.TITLE\\'|translate}}</h1>\\n </ion-header-bar>\\n\\n <ion-content class=\"lookupForm\">\\n <div class=\"list padding\">\\n <h3 translate>REGISTRY.TYPE.SELECT_TYPE</h3>\\n <button class=\"button button-block button-stable icon-left cion-page-shop\" ng-click=\"closeModal(\\'shop\\')\" translate>REGISTRY.TYPE.ENUM.SHOP</button>\\n\\n <button class=\"button button-block button-stable icon-left cion-page-association\" ng-click=\"closeModal(\\'association\\')\" translate>REGISTRY.TYPE.ENUM.ASSOCIATION</button>\\n\\n <button class=\"button button-block button-stable icon-left cion-page-company\" ng-click=\"closeModal(\\'company\\')\" translate>REGISTRY.TYPE.ENUM.COMPANY</button>\\n\\n <button class=\"button button-block button-stable icon-left cion-page-institution\" ng-click=\"closeModal(\\'institution\\')\" translate>REGISTRY.TYPE.ENUM.INSTITUTION</button>\\n </div>\\n </ion-content>\\n</ion-modal-view>\\n');\n$templateCache.put('plugins/es/templates/registry/tabs/tab_registry.html','<ion-view>\\n <ion-nav-buttons side=\"secondary\">\\n\\n <!-- Allow extension here -->\\n <cs-extension-point name=\"nav-buttons\"></cs-extension-point>\\n\\n <button class=\"button button-icon button-clear\" ng-click=\"showFiltersPopover($event)\">\\n <i class=\"icon ion-android-funnel\"></i>\\n </button>\\n\\n <button class=\"button button-icon button-clear icon ion-android-more-vertical\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content>\\n\\n <ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"doSearch()\">\\n </ion-refresher>\\n\\n <cs-extension-point name=\"buttons\"></cs-extension-point>\\n\\n <ng-include src=\"::\\'plugins/es/templates/registry/lookup_form.html\\'\"></ng-include>\\n\\n <ng-include src=\"::\\'plugins/es/templates/registry/lookup_list.html\\'\"></ng-include>\\n </ion-content>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/registry/view_popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>REGISTRY.VIEW.MENU_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <a class=\"item item-icon-left ink visible-xs visible-sm\" ng-click=\"showSharePopover($event)\">\\n <i class=\"icon ion-android-share-alt\"></i>\\n {{\\'COMMON.BTN_SHARE\\' | translate}}\\n </a>\\n\\n <a class=\"item item-icon-left assertive ink visible-xs visible-sm\" ng-if=\"canEdit\" ng-click=\"delete()\">\\n <i class=\"icon ion-trash-a\"></i>\\n {{\\'COMMON.BTN_DELETE\\' | translate}}\\n </a>\\n\\n <!-- report abuse -->\\n <ng-if ng-if=\"!canEdit && likeData.abuses\">\\n <button class=\"item item-icon-left ink\" ng-disabled=\"!!likeData.abuses.wasHitCount\" ng-class=\"{\\'gray\\': !!likeData.abuses.wasHitCount}\" ng-click=\"hideActionsPopover() && reportAbuse($event)\">\\n <i class=\"icon ion-android-warning\"></i>\\n {{\\'COMMON.BTN_REPORT_ABUSE_DOTS\\' | translate}}\\n </button>\\n </ng-if>\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/registry/view_record.html','<ion-view left-buttons=\"leftButtons\" class=\"view-page\">\\n <ion-nav-title>\\n\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <button class=\"button button-bar button-icon button-clear visible-xs visible-sm\" ng-click=\"edit()\" ng-if=\"canEdit\">\\n <i class=\"icon ion-android-create\"></i>\\n </button>\\n <button class=\"button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content scroll=\"true\" class=\"refresher-top-bg\">\\n\\n <ion-refresher pulling-text=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"load()\">\\n </ion-refresher>\\n\\n <div class=\"hero\">\\n <div class=\"content\" ng-if=\"!loading\">\\n <i class=\"avatar cion-page-{{formData.type}}\" ng-if=\"!formData.avatar\"></i>\\n <i class=\"avatar\" ng-style=\"{{avatarStyle}}\" ng-if=\"formData.avatar\"></i>\\n <h3><span class=\"dark\" ng-bind-html=\"formData.title\"></span></h3>\\n <h4 class=\"gray\">\\n <span ng-if=\"formData.city\" class=\"gray hidden-xs hidden-sm\">\\n <i class=\"icon ion-location\"></i> <span ng-bind-html=\"formData.city\"></span>\\n </span>\\n <!-- likes -->\\n <small ng-include=\"::\\'plugins/es/templates/common/view_likes.html\\'\"></small>\\n </h4>\\n\\n </div>\\n\\n <h4 class=\"content dark\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </h4>\\n </div>\\n\\n <!-- Top fab button -->\\n <div class=\"visible-xs visible-sm\">\\n <!-- like -->\\n <button class=\"button button-fab button-fab-top-right button-stable\" ng-click=\"toggleLike($event)\">\\n <i class=\"icon ion-heart\" ng-class=\"{\\'gray\\': !likeData.likes.wasHitCount, \\'calm\\': likeData.likes.wasHitCount}\"></i>\\n </button>\\n </div>\\n\\n <div class=\"row no-padding-xs no-padding-sm\">\\n <div class=\"col col-20 hidden-xs hidden-sm\"> \\n </div>\\n\\n <div class=\"col list animate-fade-slide-in item-text-wrap no-padding-xs no-padding-sm\">\\n\\n <div class=\"item\">\\n <h2 class=\"gray\">\\n <a ng-if=\"formData.city\" ui-sref=\"app.wot_lookup.tab_registry({location:formData.city})\">\\n <i class=\"icon ion-location\"></i>\\n <span ng-bind-html=\"formData.city\"></span>\\n </a>\\n <span ng-if=\"formData.city && formData.type\"> | </span>\\n <a ng-if=\"formData.type\" ui-sref=\"app.wot_lookup.tab_registry({type:formData.type})\">\\n <i class=\"cion-page-{{formData.type}}\"></i>\\n {{\\'REGISTRY.TYPE.ENUM.\\'+formData.type|upper|translate}}\\n </a>\\n </h2>\\n <h4>\\n <i class=\"icon ion-clock\" ng-if=\"formData.time\"></i>\\n <span translate>COMMON.SUBMIT_BY</span>\\n <a ng-class=\"{\\'positive\\': issuer.uid, \\'gray\\': !issuer.uid}\" ui-sref=\"app.wot_identity({pubkey:issuer.pubkey, uid: issuer.name||issuer.uid})\">\\n <ng-if ng-if=\"issuer.uid\">\\n <i class=\"icon ion-person\"></i>\\n {{::issuer.name||issuer.uid}}\\n </ng-if>\\n <span ng-if=\"!issuer.uid\">\\n <i class=\"icon ion-key\"></i>\\n {{issuer.pubkey|formatPubkey}}\\n </span>\\n </a>\\n <span>\\n {{formData.time|formatFromNow}}\\n <h4 class=\"gray hidden-xs\">|\\n {{formData.time | formatDate}}\\n </h4>\\n </span>\\n </h4>\\n </div>\\n\\n <!-- Buttons bar-->\\n <a id=\"registry-share-anchor-{{id}}\"></a>\\n <div class=\"item large-button-bar hidden-xs hidden-sm\">\\n <button class=\"button button-stable button-small-padding icon ion-android-share-alt\" ng-click=\"showSharePopover($event)\">\\n </button>\\n <!-- Like button -->\\n <button class=\"button button-stable button-small-padding ink-dark\" ng-if=\"!canEdit\" title=\"{{\\'COMMON.BTN_LIKE\\' | translate }}\" ng-click=\"toggleLike($event)\">\\n <i class=\"icon ion-heart\" ng-class=\"{\\'gray\\': !likeData.likes.wasHitCount, \\'calm\\': likeData.likes.wasHitCount}\"></i>\\n </button>\\n\\n <button class=\"button button-calm ink-dark\" ng-if=\"showTransfer\" ng-click=\"showTransferModal({pubkey:formData.pubkey, uid: formData.title})\">\\n {{\\'COMMON.BTN_SEND_MONEY\\' | translate}}\\n </button>\\n <button class=\"button button-stable icon-left ink-dark\" ng-if=\"canEdit\" ng-click=\"delete()\">\\n <i class=\"icon ion-trash-a assertive\"></i>\\n <span class=\"assertive\"> {{\\'COMMON.BTN_DELETE\\' | translate}}</span>\\n </button>\\n <button class=\"button button-calm icon-left ion-android-create ink\" ng-if=\"canEdit\" ng-click=\"edit()\">\\n {{\\'COMMON.BTN_EDIT\\' | translate}}\\n </button>\\n\\n <!-- options -->\\n <button class=\"button button-stable button-small-padding icon ion-android-more-vertical\" ng-if=\"!canEdit\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n </div>\\n\\n <div class=\"item\">\\n <h2 trust-as-html=\"formData.description\"></h2>\\n </div>\\n\\n <div class=\"item\" ng-if=\"formData.category || formData.address\">\\n <h4 ng-if=\"formData.category\">\\n <span class=\"gray\" translate>REGISTRY.VIEW.CATEGORY</span>\\n <a class=\"positive\" ng-if=\"formData.category\" ui-sref=\"app.wot_lookup.tab_registry({category:formData.category.id})\">\\n <span ng-bind-html=\"formData.category.name\"></span>\\n </a>\\n </h4>\\n <h4 ng-if=\"formData.address\">\\n <span class=\"gray\" translate>REGISTRY.VIEW.LOCATION</span>\\n <a class=\"positive\" target=\"_system\" href=\"https://www.openstreetmap.org/search?query={{formData.address}},%20{{formData.city}}\">\\n <span ng-bind-html=\"formData.address\"></span>\\n <span ng-if=\"formData.city\"> - </span>\\n <span ng-bind-html=\"formData.city\"></span>\\n </a>\\n </h4>\\n </div>\\n\\n <!-- Socials networks -->\\n <ng-if ng-if=\"formData.socials && formData.socials.length>0\">\\n <div class=\"item item-icon-left\" type=\"no-padding item-text-wrap\" ng-repeat=\"social in formData.socials track by social.url\" id=\"social-{{social.url|formatSlug}}\">\\n <i class=\"icon ion-social-{{social.type}}\" ng-class=\"{\\'ion-bookmark\\': social.type == \\'other\\', \\'ion-link\\': social.type == \\'web\\', \\'ion-email\\': social.type == \\'email\\'}\"></i>\\n <p ng-if=\"social.type && social.type != \\'web\\'\">{{social.type}}</p>\\n <h2>\\n <a ng-click=\"openLink($event, social.url, social.type)\">{{social.url}}</a>\\n </h2>\\n </div>\\n </ng-if>\\n\\n <!-- pubkey -->\\n <div class=\"item item-icon-left item-text-wrap ink\" ng-if=\"formData.pubkey\" copy-on-click=\"{{::formData.pubkey}}\">\\n <i class=\"icon ion-key\"></i>\\n <span translate>REGISTRY.EDIT.RECORD_PUBKEY</span>\\n <h4 class=\"dark\">{{::formData.pubkey}}</h4>\\n </div>\\n\\n <div class=\"lazy-load\">\\n\\n <!-- pictures -->\\n <ng-include src=\"::\\'plugins/es/templates/common/view_pictures.html\\'\"></ng-include>\\n\\n <!-- comments -->\\n <ng-include src=\"::\\'plugins/es/templates/common/view_comments.html\\'\"></ng-include>\\n </div>\\n </div>\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\"> \\n </div>\\n </div>\\n </ion-content>\\n\\n <button class=\"button button-fab button-fab-bottom-right button-assertive icon ion-android-send visible-xs visible-sm\" ng-if=\"formData.pubkey && !isUserPubkey(formData.pubkey)\" ng-click=\"showTransferModal({pubkey: formData.pubkey, uid: formData.title})\">\\n </button>\\n\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/registry/view_wallet_pages.html','<ion-view left-buttons=\"leftButtons\" class=\"view-notification\">\\n <ion-nav-title>\\n {{\\'REGISTRY.MY_PAGES\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-content class=\"padding no-padding-xs no-padding-sm\" scroll=\"true\">\\n\\n <ion-refresher pulling-text=\"{{:locale:\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"doUpdate()\">\\n </ion-refresher>\\n\\n <!-- Buttons bar -->\\n <div class=\"hidden-xs hidden-sm padding text-center\">\\n\\n <button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"doUpdate()\" title=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\">\\n </button>\\n\\n <button class=\"button button-calm icon-left ink\" ng-click=\"showNewPageModal()\">\\n {{\\'REGISTRY.BTN_NEW\\' | translate}}\\n </button>\\n </div>\\n\\n <div class=\"center padding\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"center padding gray\" ng-if=\"!search.loading && !search.results.length\" translate>\\n REGISTRY.NO_PAGE\\n </div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/registry/lookup_list.html\\'\"></ng-include>\\n\\n </ion-content>\\n\\n <button id=\"fab-wallet-add-registry-record\" class=\"button button-fab button-fab-bottom-right button-assertive hidden-md hidden-lg spin\" ng-click=\"showNewPageModal()\">\\n <i class=\"icon ion-plus\"></i>\\n </button>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/settings/plugin_settings.html','<ion-view left-buttons=\"leftButtons\" class=\"settings\">\\n <ion-nav-title translate>ES_SETTINGS.PLUGIN_NAME</ion-nav-title>\\n\\n <ion-content scroll=\"true\">\\n\\n <div class=\"item item-toggle dark\">\\n <div class=\"input-label\" translate>ES_SETTINGS.ENABLE_TOGGLE</div>\\n <label class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"formData.enable\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </label>\\n </div>\\n\\n <span class=\"item item-divider hidden-readonly hidden-demo\" translate>SETTINGS.STORAGE_DIVIDER</span>\\n\\n <div class=\"item item-toggle item-text-wrap dark hidden-demo hidden-readonly\">\\n <div class=\"input-label\" ng-class=\"{\\'gray\\': !formData.enable}\" class=\"input-label\" translate>ES_SETTINGS.ENABLE_REMOTE_STORAGE</div>\\n <h4 class=\"gray text-wrap\" ng-bind-html=\"\\'ES_SETTINGS.ENABLE_REMOTE_STORAGE_HELP\\' | translate\"></h4>\\n <label class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"formData.useRemoteStorage\" ng-disabled=\"!formData.enable\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </label>\\n </div>\\n\\n <span class=\"item item-divider\" translate>SETTINGS.NETWORK_SETTINGS</span>\\n\\n <div class=\"item ink hidden-xs hidden-sm\" ng-click=\"formData.enable && changeEsNode()\" ng-disabled=\"!formData.enable\">\\n <div class=\"input-label\" ng-class=\"{\\'gray\\': !formData.enable}\" translate>ES_SETTINGS.PEER</div>\\n\\n <!-- node fallback node -->\\n <ng-if ng-if=\"isFallbackNode\">\\n <h4 class=\"gray text-wrap assertive\">\\n <i class=\"icon ion-alert-circled\"></i>\\n <span ng-bind-html=\"\\'SETTINGS.PEER_CHANGED_TEMPORARY\\' | translate \"></span>\\n </h4>\\n <div class=\"item-note assertive text-italic\">{{server}}</div>\\n </ng-if>\\n\\n <span ng-if=\"!isFallbackNode\" class=\"item-note\" ng-class=\"{\\'dark\\': formData.enable}\">{{server}}</span>\\n </div>\\n <ion-item class=\"ink item-icon-right item-text-wrap visible-xs visible-sm\" ng-click=\"formData.enable && changeEsNode()\" ng-disabled=\"!formData.enable\">\\n <div class=\"input-label\" ng-class=\"{\\'gray\\': !formData.enable}\" translate>ES_SETTINGS.PEER</div>\\n\\n <!-- node temporary changed -->\\n <ng-if ng-if=\"isFallbackNode\">\\n <h4 class=\"gray text-wrap assertive\">\\n <b class=\"ion-alert-circled\"></b>\\n <span ng-bind-html=\"\\'SETTINGS.PEER_CHANGED_TEMPORARY\\' | translate \"></span>\\n </h4>\\n <div class=\"badge badge-assertive\">{{server}}</div>\\n </ng-if>\\n <div class=\"badge\" ng-class=\"{\\'badge-balanced\\': formData.enable, \\'badge-stable\\': !formData.enable}\" ng-if=\"!isFallbackNode\">{{server}}</div>\\n <i class=\"icon ion-ios-arrow-right\"></i>\\n </ion-item>\\n\\n <span class=\"item item-divider hidden-readonly\" translate>ES_SETTINGS.NOTIFICATIONS.DIVIDER</span>\\n\\n <!-- Enable HTML notifications -->\\n <div class=\"item item-toggle dark hidden-xs hidden-sm hidden-readonly\">\\n <div ng-class=\"{\\'gray\\': !formData.enable}\" class=\"input-label\" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_HTML5_NOTIFICATION</div>\\n <h4 class=\"gray\" ng-bind-html=\"\\'ES_SETTINGS.NOTIFICATIONS.ENABLE_HTML5_NOTIFICATION_HELP\\' | translate\"></h4>\\n <label class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"formData.notifications.emitHtml5\" ng-disabled=\"!formData.enable\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </label>\\n </div>\\n\\n <span class=\"item gray item-text-wrap hidden-readonly\" translate>ES_SETTINGS.NOTIFICATIONS.HELP_TEXT</span>\\n\\n <label class=\"item item-toggle dark item-text-wrap hidden-readonly\">\\n <span ng-class=\"{\\'gray\\': !formData.enable}\" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_TX_SENT</span>\\n <div class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"formData.notifications.txSent\" ng-disabled=\"!formData.enable\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </div>\\n </label>\\n <label class=\"item item-toggle dark item-text-wrap hidden-readonly\">\\n <span ng-class=\"{\\'gray\\': !formData.enable}\" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_TX_RECEIVED</span>\\n <label class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"formData.notifications.txReceived\" ng-disabled=\"!formData.enable\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </label>\\n </label>\\n <label class=\"item item-toggle dark item-text-wrap hidden-readonly\">\\n <span ng-class=\"{\\'gray\\': !formData.enable}\" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_CERT_SENT</span>\\n <div class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"formData.notifications.certSent\" ng-disabled=\"!formData.enable\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </div>\\n </label>\\n <label class=\"item item-toggle dark item-text-wrap hidden-readonly\">\\n <span ng-class=\"{\\'gray\\': !formData.enable}\" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_CERT_RECEIVED</span>\\n <div class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"formData.notifications.certReceived\" ng-disabled=\"!formData.enable\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </div>\\n </label>\\n\\n\\n <!-- Allow extension here -->\\n <cs-extension-point name=\"common\"></cs-extension-point>\\n\\n\\n\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/settings/settings_extend.html','\\n<div class=\"item item-text-wrap item-icon-right ink\" ui-sref=\"app.es_settings\">\\n <div class=\"input-label ng-binding\" translate>ES_SETTINGS.PLUGIN_NAME</div>\\n\\n <h4 class=\"gray\" translate>ES_SETTINGS.PLUGIN_NAME_HELP</h4>\\n\\n <i class=\"icon ion-ios-arrow-right\"></i>\\n</div>\\n');\n$templateCache.put('plugins/es/templates/subscription/edit_subscriptions.html','<ion-view left-buttons=\"leftButtons\" class=\"view-notification\">\\n <ion-nav-title>\\n {{\\'SUBSCRIPTION.EDIT.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n\\n </ion-nav-buttons>\\n\\n <ion-content class=\"padding no-padding-xs no-padding-sm\" scroll=\"true\">\\n\\n <ion-refresher pulling-text=\"{{:locale:\\'COMMON.BTN_REFRESH\\' | translate}}\" on-refresh=\"load()\">\\n </ion-refresher>\\n\\n <!-- Buttons bar -->\\n <div class=\"hidden-xs hidden-sm padding text-center\">\\n\\n <button class=\"button button-stable button-small-padding icon ion-loop ink\" ng-click=\"load()\" title=\"{{\\'COMMON.BTN_REFRESH\\' | translate}}\">\\n </button>\\n\\n <button class=\"button button-calm ink\" ng-click=\"addSubscription()\">\\n {{\\'SUBSCRIPTION.BTN_ADD\\' | translate}}\\n </button>\\n </div>\\n\\n <div class=\"center padding\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"center padding gray\" ng-if=\"!search.loading && !search.results.length\" translate>\\n SUBSCRIPTION.NO_SUBSCRIPTION\\n </div>\\n\\n <div class=\"row no-padding\">\\n <div class=\"col col-20 hidden-xs hidden-sm\"> </div>\\n\\n <div class=\"col list {{::motion.ionListClass}} item-border-large\">\\n\\n <!-- emails -->\\n <ng-repeat ng-repeat=\"subscriptions in search.results | filter: { type: \\'email\\' }\" ng-include=\"\\'plugins/es/templates/subscription/item_\\' + subscriptions.type.toLowerCase() + \\'_subscription.html\\'\">>\\n </ng-repeat>\\n\\n </div>\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\"> </div>\\n\\n </div>\\n\\n </ion-content>\\n\\n <button id=\"fab-add-subscription-record\" class=\"button button-fab button-fab-bottom-right button-assertive icon ion-plus hidden-md hidden-lg spin\" ng-click=\"addSubscription()\">\\n </button>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/subscription/item_email_subscription.html','<div class=\"item item-avatar\">\\n <i class=\"item-image icon ion-email\"></i>\\n <h3>\\n {{\\'SUBSCRIPTION.TYPE.ENUM.\\' + subscriptions.type.toUpperCase() | translate}}\\n </h3>\\n <h4 class=\"gray\">\\n {{\\'SUBSCRIPTION.EDIT.PROVIDER\\'|translate}}\\n <a ui-sref=\"app.wot_identity({pubkey: subscriptions.recipient, uid: subscriptions.uid})\">\\n <span ng-class=\"{\\'positive\\': subscriptions.uid, \\'dark\\': !subscriptions.uid}\" ng-if=\"subscriptions.name||subscriptions.uid\">\\n <i class=\"ion-person\" ng-if=\"subscriptions.uid\"></i>\\n {{subscriptions.name||subscriptions.uid}}\\n </span>\\n <span class=\"gray\" ng-if=\"!subscriptions.uid\">\\n <i class=\"ion-key\"></i>\\n {{subscriptions.recipient | formatPubkey}}\\n </span>\\n </a>\\n </h4>\\n <div class=\"item-note text-right\">\\n <span ng-repeat=\"item in subscriptions.items\">\\n {{item.content.email}}\\n <a class=\"ion-trash-a gray padding-left\" ng-click=\"deleteSubscription(item)\"></a>\\n <a class=\"ion-edit gray padding-left\" ng-click=\"editSubscription(item)\"></a>\\n <br>\\n </span>\\n </div>\\n</div>\\n');\n$templateCache.put('plugins/es/templates/subscription/modal_email.html','\\n<ion-modal-view id=\"composeMessage\" class=\"modal-full-height\">\\n <ion-header-bar class=\"bar-positive\">\\n <button class=\"button button-clear visible-xs\" ng-click=\"closeModal()\" translate>COMMON.BTN_CANCEL</button>\\n <h1 class=\"title\" translate>SUBSCRIPTION.MODAL_EMAIL.TITLE</h1>\\n\\n <button class=\"button button-icon button-clear icon ion-android-send visible-xs\" ng-click=\"doSubmit()\">\\n </button>\\n </ion-header-bar>\\n\\n <ion-content scroll=\"true\">\\n\\n <!-- Encryption info -->\\n <div class=\"item item-icon-left item-text-wrap\">\\n <i class=\"icon ion-ios-information-outline positive\"></i>\\n <h4 class=\"positive\" translate>SUBSCRIPTION.MODAL_EMAIL.HELP</h4>\\n </div>\\n\\n <form name=\"subscriptionForm\" novalidate=\"\" ng-submit=\"doSubmit()\">\\n\\n <div class=\"list\" ng-init=\"setForm(subscriptionForm)\">\\n\\n <!-- email -->\\n <label class=\"item item-input\" ng-class=\"{\\'item-input-error\\': form.$submitted && (form.email.$invalid || form.email.$error)}\">\\n <span class=\"input-label\" translate>SUBSCRIPTION.MODAL_EMAIL.EMAIL_LABEL</span>\\n <input name=\"email\" type=\"text\" placeholder=\"{{\\'SUBSCRIPTION.MODAL_EMAIL.EMAIL_HELP\\' | translate}}\" ng-model=\"formData.content.email\" ng-minlength=\"3\" required email>\\n </label>\\n <div class=\"form-errors\" ng-if=\"form.$submitted && (form.email.$invalid || form.email.$error)\" ng-messages=\"form.email.$error\">\\n <div class=\"form-error\" ng-message=\"minlength\">\\n <span translate=\"ERROR.FIELD_TOO_SHORT\"></span>\\n </div>\\n <div class=\"form-error\" ng-message=\"email\">\\n <span translate=\"ERROR.FIELD_NOT_EMAIL\"></span>\\n </div>\\n </div>\\n\\n <!-- Frequency -->\\n <label class=\"item item-input item-select\" ng-class=\"{\\'item-input-error\\': form.$submitted && !formData.content.frequency}\">\\n <span class=\"input-label\" translate>SUBSCRIPTION.MODAL_EMAIL.FREQUENCY_LABEL</span>\\n <select name=\"frequency\" ng-model=\"formData.content.frequency\" style=\"height: 46px;margin-top: 1px;\">\\n <option value=\"weekly\" translate>SUBSCRIPTION.MODAL_EMAIL.FREQUENCY_WEEKLY</option>\\n <option value=\"daily\" translate>SUBSCRIPTION.MODAL_EMAIL.FREQUENCY_DAILY</option>\\n </select>\\n </label>\\n <div class=\"form-errors\" ng-if=\"form.$submitted && !formData.content.frequency\">\\n <div class=\"form-error\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n </div>\\n\\n <!-- Recipient (service provider) -->\\n <a class=\"item item-input item-icon-right gray ink\" ng-class=\"{\\'item-input-error\\': form.$submitted && !formData.recipient}\" ng-click=\"showNetworkLookup()\" style=\"height: 67px;\">\\n <span class=\"input-label\" translate>SUBSCRIPTION.MODAL_EMAIL.PROVIDER</span>\\n <span class=\"badge animate-fade-in animate-show-hide ng-hide\" ng-class=\"{\\'badge-royal\\': recipient.uid, \\'badge-stable\\': !recipient.uid}\" ng-show=\"recipient && (recipient.name||recipient.uid)\">\\n <i class=\"ion-person\" ng-if=\"recipient.uid\"></i> {{recipient.name||recipient.uid}}\\n </span>\\n <span class=\"badge badge-secondary animate-fade-in animate-show-hide ng-hide\" ng-show=\"formData.recipient\">\\n <i class=\"ion-key\"></i> {{formData.recipient | formatPubkey}}\\n </span>\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </a>\\n <div class=\"form-errors\" ng-if=\"form.$submitted && !formData.recipient\">\\n <div class=\"form-error\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n </div>\\n\\n </div>\\n\\n <div class=\"padding hidden-xs text-right\">\\n <button class=\"button button-clear button-dark ink\" ng-click=\"cancel()\" type=\"button\" translate>COMMON.BTN_CANCEL\\n </button>\\n <button class=\"button button-positive ink\" type=\"submit\">\\n {{\\'COMMON.BTN_ADD\\' | translate}}\\n </button>\\n </div>\\n\\n </form>\\n </ion-content>\\n</ion-modal-view>\\n\\n\\n\\n\\n');\n$templateCache.put('plugins/es/templates/user/edit_popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <!-- delete profile -->\\n <a class=\"item item-icon-left assertive ink\" ng-click=\"removeProfile()\">\\n <i class=\"icon ion-trash-a\"></i>\\n {{\\'PROFILE.BTN_DELETE\\' | translate}}\\n </a>\\n\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/user/edit_profile.html','<ion-view left-buttons=\"leftButtons\">\\n <ion-nav-title>\\n <!-- no title-->\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <!-- remove button -->\\n <button class=\"button button-icon button-clear button-assertive ion-trash-a visible-xs visible-sm\" ng-click=\"removeProfile()\" ng-if=\"existing\">\\n </button>\\n <!-- save button -->\\n <button class=\"button button-icon button-clear ion-android-done visible-xs visible-sm\" ng-click=\"submitAndSaveAndClose()\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content scroll=\"true\">\\n\\n <div class=\"positive-900-bg hero\">\\n <div class=\"content\">\\n <i class=\"avatar\" ng-style=\"avatarStyle\" ng-class=\"{\\'avatar-wallet\\': !loading && !avatar && walletData && !walletData.isMember, \\'avatar-member\\': !loading && !avatar && walletData.isMember}\">\\n <button class=\"button button-positive button-large button-clear flat icon ion-camera visible-xs visible-sm\" style=\"display: inline-block;\" ng-click=\"showAvatarModal()\"></button>\\n <button ng-if=\"avatar.src\" class=\"button button-positive button-large button-clear flat visible-xs visible-sm\" style=\"display: inline-block; left: 85px; bottom:15px;\" ng-click=\"rotateAvatar()\">\\n <i class=\"icon-secondary ion-image\" style=\"left: 24px; top: 3px; font-size: 24px;\"></i>\\n <i class=\"icon-secondary ion-forward\" style=\"left: 26px; top: -13px;\"></i>\\n </button>\\n <button class=\"button button-positive button-large button-clear icon ion-camera hidden-xs hidden-sm\" ng-click=\"showAvatarModal()\"></button>\\n </i>\\n <h3 class=\"light\">\\n <ng-if ng-if=\"!loading && !formData.title && walletData && walletData.isMember\">{{walletData.uid}}</ng-if>\\n <ng-if ng-if=\"!loading && !formData.title && walletData && !walletData.isMember\">{{::walletData.pubkey | formatPubkey}}</ng-if>\\n <ng-if ng-if=\"!loading && formData.title\">{{formData.title}}</ng-if>\\n </h3>\\n <h4 class=\"light\">\\n <ion-spinner ng-if=\"loading\" icon=\"android\"></ion-spinner>\\n </h4>\\n </div>\\n </div>\\n\\n\\n <div class=\"row no-padding\">\\n <div class=\"col col-20 hidden-xs hidden-sm\"> \\n </div>\\n\\n <div class=\"col\">\\n\\n <!-- Buttons bar-->\\n <div class=\"hidden-xs hidden-sm padding text-center animate-show-hide ng-hide\" ng-show=\"existing\">\\n\\n <button class=\"button button-stable icon-right ink\" ng-disabled=\"saving\" ng-click=\"showActionsPopover($event)\">\\n <i class=\"icon ion-android-more-vertical\"></i> \\n {{\\'COMMON.BTN_OPTIONS\\' | translate}}\\n </button>\\n </div>\\n\\n <form name=\"profileForm\" novalidate=\"\" ng-submit=\"saveAndClose()\">\\n\\n <div class=\"list item-text-wrap {{::motion.ionListClass}}\" ng-init=\"setForm(profileForm)\">\\n\\n <!-- Public info -->\\n <div class=\"item item-icon-left item-text-wrap\">\\n <i class=\"icon ion-ios-information-outline positive\"></i>\\n <h4 class=\"positive\" translate>PROFILE.HELP.WARNING_PUBLIC_DATA</h4>\\n </div>\\n\\n <div class=\"item item-divider\" translate>PROFILE.GENERAL_DIVIDER</div>\\n\\n <!-- title -->\\n <ion-item class=\"item-input item-floating-label item-button-right\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.title.$invalid}\">\\n <span class=\"input-label\">{{\\'PROFILE.TITLE\\' | translate}}</span>\\n <input type=\"text\" name=\"title\" placeholder=\"{{\\'PROFILE.TITLE_HELP\\' | translate}}\" id=\"profile-name\" ng-model=\"formData.title\" ng-model-options=\"{ debounce: 350 }\" ng-maxlength=\"50\" required>\\n </ion-item>\\n <div class=\"form-errors\" ng-show=\"form.$submitted && form.title.$error\" ng-messages=\"form.title.$error\">\\n <div class=\"form-error\" ng-message=\"required\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n <div class=\"form-error\" ng-message=\"maxlength\">\\n <span translate=\"ERROR.FIELD_TOO_LONG_WITH_LENGTH\" translate-values=\"{maxLength: 50}\"></span>\\n </div>\\n </div>\\n\\n <!-- description -->\\n <ion-item class=\"item-input item-floating-label item-button-right\">\\n <span class=\"input-label\" style=\"width: 100%\">{{\\'PROFILE.DESCRIPTION\\' | translate}}</span>\\n <textarea placeholder=\"{{\\'PROFILE.DESCRIPTION_HELP\\' | translate}}\" ng-model=\"formData.description\" ng-model-options=\"{ debounce: 350 }\" rows=\"4\" cols=\"10\">\\n </textarea>\\n </ion-item>\\n\\n <!-- position -->\\n <ng-include src=\"::\\'plugins/es/templates/common/edit_position.html\\'\" ng-controller=\"ESPositionEditCtrl as ctrl\"></ng-include>\\n\\n </div>\\n\\n <!-- social networks -->\\n <ng-include src=\"::\\'plugins/es/templates/common/edit_socials.html\\'\" ng-controller=\"ESSocialsEditCtrl\"></ng-include>\\n\\n <div class=\"list item-text-wrap {{::motion.ionListClass}}\">\\n\\n <div class=\"item item-divider\" translate>PROFILE.TECHNICAL_DIVIDER</div>\\n\\n <!-- uid -->\\n <ion-item class=\"item-icon-left\" ng-if=\"walletData && walletData.uid\">\\n <span translate>COMMON.UID</span>\\n <span class=\"badge badge-stable\">{{::walletData.uid}}</span>\\n </ion-item>\\n\\n <!-- pubkey-->\\n <ion-item class=\"item-icon-left item-icon-right item-text-wrap ink\" on-hold=\"copy(formData.pubkey)\" copy-on-click>\\n <i class=\"icon ion-key\"></i>\\n <span translate>COMMON.PUBKEY</span>\\n <p class=\"gray\">{{walletData.pubkey}}</p>\\n </ion-item>\\n\\n <div class=\"item padding hidden-xs hidden-sm text-right\">\\n <button class=\"button button-clear button-dark ink\" ng-click=\"cancel()\" type=\"button\" translate>COMMON.BTN_CANCEL\\n </button>\\n <button class=\"button button-calm ink\" ng-class=\"{\\'button-assertive\\': dirty}\" type=\"submit\">\\n {{\\'COMMON.BTN_SAVE\\' | translate}}\\n </button>\\n </div>\\n </div>\\n </form>\\n </div>\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\"> \\n </div>\\n </div>\\n\\n </ion-content>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/user/items_profile.html','<div ng-if=\"!formData.profile\" class=\"item gray\" translate>PROFILE.NO_PROFILE_DEFINED</div>\\n\\n<!-- name -->\\n<div class=\"item\" ng-if=\"formData.profile && formData.name && showName\">\\n <span class=\"gray\" translate>PROFILE.TITLE</span>\\n <h3>{{formData.name}}</h3>\\n</div>\\n\\n<!-- About me -->\\n<div class=\"item item-text-wrap\" ng-if=\"formData.profile.descriptionHtml\">\\n <span class=\"gray\" translate>PROFILE.DESCRIPTION</span>\\n <h3 trust-as-html=\"formData.profile.descriptionHtml\"></h3>\\n</div>\\n\\n<!-- Localisation -->\\n<div class=\"item\" ng-if=\"formData.profile && (formData.profile.address || formData.profile.city)\" copy-on-click=\"{{formData.profile.address ? formData.profile.address + \\' \\' : \\'\\'}}{{formData.profile.city}}\">\\n <span class=\"gray\" translate>LOCATION.LOCATION_DIVIDER</span>\\n <h3>\\n <span class=\"text-keep-lines\" ng-if=\"formData.profile.address\">{{formData.profile.address}}<br></span>\\n {{formData.profile.city}}\\n </h3>\\n</div>\\n\\n<!-- Socials networks -->\\n<div class=\"item\" ng-if=\"formData.profile && formData.profile.socials && formData.profile.socials.length\" ng-controller=\"ESSocialsViewCtrl\">\\n <span class=\"gray\" translate>PROFILE.SOCIAL_NETWORKS_DIVIDER</span>\\n <div class=\"list no-padding\">\\n <ion-item ng-repeat=\"social in formData.profile.socials | filter:filterFn track by social.url \" id=\"social-{{::social.url|formatSlug}}\" class=\"item-icon-left item-text-wrap no-padding-bottom ink\" on-tap=\"openSocial($event, social)\">\\n <i class=\"icon ion-social-{{social.type}}\" ng-class=\"{\\'ion-bookmark\\': social.type == \\'other\\', \\'ion-link\\': social.type == \\'web\\', \\'ion-email\\': social.type == \\'email\\', \\'ion-iphone\\': social.type == \\'phone\\'}\"></i>\\n <p ng-if=\"social.type && social.type != \\'web\\'\">\\n {{social.type}}\\n <i class=\"ion-locked\" ng-if=\"social.recipient\"></i>\\n </p>\\n <h4>\\n <a on-tap=\"openSocial($event, social)\" href=\"{{::social.url}}\" target=\"_blank\">{{::social.url}}</a>\\n </h4>\\n </ion-item>\\n </div>\\n</div>\\n\\n\\n');\n$templateCache.put('plugins/es/templates/wallet/item_wallet_extend.html','<h4 class=\"dark\" ng-if=\":state:enable && wallet.id!=\\'default\\'\">\\n <a ng-if=\"walletData.invitations.unreadCount\">\\n <i class=\"dark ion-person-stalker\"></i>\\n {{walletData.invitations.unreadCount}}\\n </a>\\n <a ng-if=\"walletData.messages.unreadCount\" ui-sref=\"app.user_messages_by_id.tab_inbox({id: wallet.id})\">\\n <i class=\"dark ion-email\"></i>\\n {{walletData.messages.unreadCount}}\\n </a>\\n <a ng-if=\"walletData.notifications.unreadCount\" ui-sref=\"app.view_notifications_by_id({id: wallet.id})\">\\n <i class=\"dark ion-android-notifications\"></i>\\n {{walletData.notifications.unreadCount}}\\n </a>\\n</h4>\\n');\n$templateCache.put('plugins/es/templates/wallet/view_wallet_extend.html','<ng-if ng-if=\":state:enable && extensionPoint === \\'hero\\'\">\\n <!-- likes -->\\n <small class=\"light\" style=\"display: inline-block;\" ng-include=\"::\\'plugins/es/templates/common/view_likes.html\\'\" ng-init=\"canEdit=true\"></small>\\n</ng-if>\\n\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'after-general\\'\">\\n\\n <!-- profile -->\\n <div class=\"item item-divider item-divider-top-border\">\\n <span>\\n {{\\'PROFILE.PROFILE_DIVIDER\\' | translate}}\\n <i style=\"font-size: 12pt; cursor: pointer;\" ng-click=\"showProfileHelp=!showProfileHelp\" class=\"icon positive ion-ios-help-outline\" title=\"{{\\'PROFILE.PROFILE_DIVIDER_HELP\\' | translate}}\"></i>\\n </span>\\n <a class=\"badge button button-text button-small button-small-padding\" ng-if=\"isDefaultWallet\" ui-sref=\"app.edit_profile\">\\n <i class=\"icon ion-edit\"></i>\\n <span ng-if=\"!formData.profile\" translate>PROFILE.BTN_ADD</span>\\n <span ng-if=\"formData.profile\" translate>PROFILE.BTN_EDIT</span>\\n </a>\\n <a class=\"badge button button-text button-small button-small-padding\" ng-if=\"!isDefaultWallet\" ui-sref=\"app.edit_profile_by_id({id: walletId})\">\\n <i class=\"icon ion-edit\"></i>\\n <span ng-if=\"!formData.profile\" translate>PROFILE.BTN_ADD</span>\\n <span ng-if=\"formData.profile\" translate>PROFILE.BTN_EDIT</span>\\n </a>\\n </div>\\n\\n\\n <div class=\"item item-text-wrap positive item-small-height item-wallet-help\" ng-show=\"showProfileHelp\">\\n <small trust-as-html=\"\\'PROFILE.PROFILE_DIVIDER_HELP\\'|translate\"></small>\\n </div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/user/items_profile.html\\'\" ng-init=\"showName=true\"></ng-include>\\n\\n <!-- subscriptions -->\\n <div class=\"item item-divider item-divider-top-border\">\\n <span>\\n {{\\'SUBSCRIPTION.SUBSCRIPTION_DIVIDER\\' | translate}}\\n <i style=\"font-size: 12pt; cursor: pointer;\" ng-click=\"showSubscriptionHelp=!showSubscriptionHelp\" class=\"icon positive ion-ios-help-outline\" title=\"{{\\'SUBSCRIPTION.SUBSCRIPTION_DIVIDER_HELP\\' | translate}}\"></i>\\n <span>\\n\\n <a class=\"badge button button-text button-small button-small-padding\" ng-if=\"!formData.subscriptions.count && isDefaultWallet\" ui-sref=\"app.edit_subscriptions\">\\n <i class=\"icon ion-edit\"></i>\\n <span translate>SUBSCRIPTION.BTN_ADD</span>\\n </a>\\n <a class=\"badge button button-text button-small button-small-padding\" ng-if=\"!formData.subscriptions.count && !isDefaultWallet\" ui-sref=\"app.edit_subscriptions_by_id({id: walletId})\">\\n <i class=\"icon ion-edit\"></i>\\n <span translate>SUBSCRIPTION.BTN_ADD</span>\\n </a>\\n </span></span></div>\\n\\n <div class=\"item item-text-wrap positive item-small-height\" ng-show=\"showSubscriptionHelp\">\\n <small translate>SUBSCRIPTION.SUBSCRIPTION_DIVIDER_HELP</small>\\n </div>\\n\\n <div ng-if=\"!formData.subscriptions.count\" class=\"item gray\" translate>SUBSCRIPTION.NO_SUBSCRIPTION</div>\\n\\n <a class=\"item item-icon-left item-text-wrap item-icon-right ink\" ng-if=\"formData.subscriptions.count && isDefaultWallet\" ui-sref=\"app.edit_subscriptions\">\\n <i class=\"icon ion-gear-a\"></i>\\n <span translate>SUBSCRIPTION.SUBSCRIPTION_COUNT</span>\\n <span class=\"badge badge-calm\">{{formData.subscriptions.count}}</span>\\n\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </a>\\n <a class=\"item item-icon-left item-text-wrap item-icon-right ink\" ng-if=\"formData.subscriptions.count && !isDefaultWallet\" ui-sref=\"app.edit_subscriptions_by_id({id: walletId})\">\\n <i class=\"icon ion-gear-a\"></i>\\n <span translate>SUBSCRIPTION.SUBSCRIPTION_COUNT</span>\\n <span class=\"badge badge-calm\">{{formData.subscriptions.count}}</span>\\n\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </a>\\n\\n <!-- page -->\\n <div class=\"item item-divider item-divider-top-border\">\\n <span>\\n {{\\'REGISTRY.WALLET.PAGE_DIVIDER\\' | translate}}\\n <i style=\"font-size: 12pt; cursor: pointer;\" ng-click=\"showPagesHelp=!showPagesHelp\" class=\"icon positive ion-ios-help-outline\" title=\"{{\\'REGISTRY.WALLET.PAGE_DIVIDER_HELP\\' | translate}}\"></i>\\n <span>\\n\\n <a class=\"badge button button-text button-small button-small-padding\" ng-if=\"!formData.pages.count\" ng-click=\"showNewPageModal($event)\">\\n <i class=\"icon ion-edit\"></i>\\n <span translate>REGISTRY.BTN_NEW</span>\\n </a>\\n </span></span></div>\\n\\n <div class=\"item item-text-wrap positive item-small-height item-wallet-help\" ng-show=\"showPagesHelp\">\\n <small trust-as-html=\"\\'REGISTRY.WALLET.PAGE_DIVIDER_HELP\\'|translate\"></small>\\n </div>\\n\\n <div ng-if=\"!formData.pages.count\" class=\"item gray\" translate>REGISTRY.NO_PAGE</div>\\n\\n <a class=\"item item-icon-left item-text-wrap item-icon-right ink\" ng-if=\"formData.pages.count && isDefaultWallet\" ui-sref=\"app.wallet_pages\">\\n <i class=\"icon ion-social-buffer\"></i>\\n <span translate>REGISTRY.MY_PAGES</span>\\n <span class=\"badge badge-calm\">{{formData.pages.count}}</span>\\n\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </a>\\n <a class=\"item item-icon-left item-text-wrap item-icon-right ink\" ng-if=\"formData.pages.count && !isDefaultWallet\" ui-sref=\"app.wallet_pages_by_id({id: walletId})\">\\n <i class=\"icon ion-social-buffer\"></i>\\n <span translate>REGISTRY.MY_PAGES</span>\\n <span class=\"badge badge-calm\">{{formData.pages.count}}</span>\\n\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </a>\\n</ng-if>\\n');\n$templateCache.put('plugins/es/templates/wot/lookup_extend.html','<ion-tab ng-if=\":state:enable\" title=\"{{\\'MENU.REGISTRY\\'|translate}}\" icon=\"ion-social-buffer\" ui-sref=\"app.wot_lookup.tab_registry\">\\n <ion-nav-view name=\"tab_registry\"></ion-nav-view>\\n</ion-tab>\\n');\n$templateCache.put('plugins/es/templates/wot/lookup_item_group.html','\\n<i ng-if=\"::!item.avatar\" class=\"item-image icon ion-android-people\"></i>\\n<i ng-if=\"::!item.avatar\" class=\"item-image icon-secondary ion-android-lock\" style=\"left: 20px; top: 17px; font-size: 19px; color: #d9d9d9;\"></i>\\n<i ng-if=\"::item.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::item.avatar.src}})\"></i>\\n\\n<h2 ng-bind-html=\":rebind:item.name\"></h2>\\n\\n<!-- creation time-->\\n<h4 class=\"gray\">\\n <i class=\"ion-clock\"></i>\\n {{:rebind:\\'GROUP.CREATED_TIME\\'|translate: item }}\\n</h4>\\n\\n<!-- membersCount -->\\n<h4 class=\"dark pull-left\" ng-if=\":rebind:item.membersCount\">\\n <i class=\"dark ion-person\"></i>\\n <span class=\"dark\">+{{:rebind:item.membersCount}}</span>\\n</h4>\\n\\n<h4 class=\"dark\">\\n <span class=\"dark\" ng-if=\"::item.description\">\\n <i class=\"ion-quote\"></i>\\n {{::item.description|truncText}}\\n </span>\\n</h4>\\n<h4 ng-if=\"::item.tags\">\\n <span ng-if=\"::item.tags\" class=\"dark\">\\n <ng-repeat ng-repeat=\"tag in ::item.tags\">\\n #<ng-bind-html ng-bind-html=\"::tag\"></ng-bind-html>\\n </ng-repeat>\\n </span>\\n</h4>\\n');\n$templateCache.put('plugins/es/templates/wot/lookup_item_page.html','<i ng-if=\"::!item.avatar\" class=\"item-image icon cion-page-{{item.type}}\"></i>\\n<i ng-if=\"::item.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::item.avatar.src}})\"></i>\\n\\n<h2 ng-bind-html=\":rebind:item.name\"></h2>\\n\\n<h4 class=\"gray\">\\n <span class=\"gray\" ng-if=\"::item.city\">\\n <i class=\"ion-location\"></i>\\n {{::item.city|truncText}}\\n </span>\\n <span ng-if=\"::item.city && item.type\">|</span>\\n <span ng-if=\"item.type\">\\n <i class=\"cion-page-{{item.type}}\"></i>\\n {{::\\'REGISTRY.TYPE.ENUM.\\'+item.type|uppercase|translate}}\\n </span>\\n</h4>\\n<h4 class=\"dark\">\\n <span class=\"dark\" ng-if=\"::item.description\">\\n <i class=\"ion-quote\"></i>\\n {{::item.description|truncText}}\\n </span>\\n</h4>\\n<h4 ng-if=\"::item.tags\">\\n <span ng-if=\"::item.tags\" class=\"dark\">\\n <ng-repeat ng-repeat=\"tag in ::item.tags\">\\n #<ng-bind-html ng-bind-html=\"::tag\"></ng-bind-html>\\n </ng-repeat>\\n </span>\\n</h4>\\n');\n$templateCache.put('plugins/es/templates/wot/lookup_lg_extend.html','<div class=\"buttons-tabs\" ng-if=\":state:enable\">\\n <div class=\"pull-right\">\\n <div class=\"button button-tab dark\" title=\"{{\\'REGISTRY.BTN_SHOW_WOT_HELP\\' | translate}}\" nav-transition=\"none\" active-link=\"active\" active-link-path-prefix=\"#/app/wot/lg\" ui-sref=\"app.wot_lookup_lg\">\\n <i class=\"icon ion-person-stalker\"></i>\\n {{\\'REGISTRY.BTN_SHOW_WOT\\' | translate}}\\n </div>\\n <a class=\"button button-tab ink dark\" title=\"{{\\'REGISTRY.BTN_SHOW_PAGES_HELP\\' | translate}}\" nav-transition=\"none\" active-link=\"active\" active-link-path-prefix=\"#/app/wot/page\" ui-sref=\"app.registry_lookup_lg\">\\n <i class=\"icon ion-social-buffer\"></i>\\n {{\\'REGISTRY.BTN_SHOW_PAGES\\' | translate}}\\n </a>\\n </div>\\n\\n <div class=\"pull-right\" ng-if=\"showNewPageButton\">\\n <button class=\"button button-small button-positive button-small-padding button-clear ink hidden-sm hidden-xs\" ng-click=\"showNewPageModal()\">\\n <i class=\"icon ion-plus\"></i>\\n {{\\'REGISTRY.BTN_NEW\\' | translate}}\\n </button>\\n \\n </div>\\n</div>\\n');\n$templateCache.put('plugins/es/templates/wot/popover_certification_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <!-- certify -->\\n <a class=\"item item-icon-left ink\" ng-if=\"canCertify\" ng-click=\"certify()\">\\n <i class=\"icon ion-ribbon-b\"></i>\\n {{\\'WOT.BTN_CERTIFY\\' | translate}}\\n </a>\\n\\n <!-- ask certification to current identities -->\\n <a class=\"item item-icon-left ink\" ng-if=\"!isUserPubkey(formData.pubkey) && formData.isMember\" ng-click=\"askCertification()\">\\n <i class=\"icon-secondary ion-ribbon-b\" style=\"left: 16px; top: 0px; font-size: 25px;\"></i>\\n <b class=\"icon-secondary ion-help\" style=\"left: 35px; top: 0px;\"></b>\\n {{\\'WOT.BTN_ASK_CERTIFICATION\\' | translate}}\\n </a>\\n\\n <!-- ask certifications to many identities -->\\n <a class=\"item item-icon-left ink\" ng-if=\"isUserPubkey(formData.pubkey)\" ng-click=\"showAskCertificationModal()\">\\n <i class=\"icon-secondary ion-ribbon-b\" style=\"left: 16px; top: 0px; font-size: 25px;\"></i>\\n <b class=\"icon-secondary ion-help\" style=\"left: 35px; top: 0px;\"></b>\\n {{\\'WOT.BTN_ASK_CERTIFICATIONS_DOTS\\' | translate}}\\n </a>\\n\\n <!-- suggest certifications to current identity -->\\n <a class=\"item item-icon-left ink\" ng-if=\"!isUserPubkey(formData.pubkey)\" ng-click=\"showSuggestCertificationModal()\">\\n <i class=\"icon-secondary ion-person-stalker\" style=\"left: 16px; top: 0px; font-size: 25px;\"></i>\\n <b class=\"icon-secondary ion-help\" style=\"left: 37px; top: -4px;\"></b>\\n {{\\'WOT.BTN_SUGGEST_CERTIFICATIONS_DOTS\\' | translate}}\\n </a>\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/es/templates/wot/view_certifications_extend.html','<!-- nav buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'nav-buttons\\' && !$root.config.readonly\">\\n\\n <button class=\"button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm\" ng-click=\"showCertificationActionsPopover($event)\">\\n </button>\\n\\n</ng-if>\\n\\n<!-- Buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'buttons\\' && !$root.config.readonly\">\\n\\n <button class=\"button button-stable button-small-padding icon ion-android-more-vertical\" ng-click=\"showCertificationActionsPopover($event)\" title=\"{{\\'COMMON.POPOVER_ACTIONS_TITLE\\' | translate}}\">\\n </button>\\n\\n</ng-if>\\n');\n$templateCache.put('plugins/es/templates/wot/view_identity_extend.html','<!-- Hero -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'hero\\'\">\\n <!-- likes -->\\n <small class=\"light\" style=\"display: inline-block;\" ng-include=\"::\\'plugins/es/templates/common/view_likes.html\\'\"></small>\\n</ng-if>\\n\\n<!-- Top fab buttons -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'buttons-top-fab\\' && !$root.config.readonly\">\\n <button id=\"fab-compose-{{:rebind:formData.pubkey}}\" class=\"button button-fab button-fab-top-left button-fab-hero mini button-stable spin\" style=\"left: 88px;\" ng-click=\"showNewMessageModal()\">\\n <i class=\"icon ion-email\"></i>\\n </button>\\n</ng-if>\\n\\n<!-- Buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'buttons\\' && !$root.config.readonly\">\\n <button class=\"button button-stable button-small-padding icon ion-email\" ng-disabled=\"loading\" ng-click=\"showNewMessageModal()\" title=\"{{\\'MESSAGE.BTN_WRITE\\' | translate}}\">\\n </button>\\n</ng-if>\\n\\n<!-- End of buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'after-buttons\\' && !$root.config.readonly\">\\n <!-- options -->\\n <button class=\"button button-stable button-small-padding icon ion-android-more-vertical\" ng-click=\"showActionsPopover($event)\">\\n </button>\\n</ng-if>\\n\\n<!-- General section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'after-general\\'\">\\n\\n <span class=\"item item-divider item-divider-top-border\">\\n <span>\\n {{\\'PROFILE.PROFILE_DIVIDER\\' | translate}}\\n <a style=\"font-size: 12pt; cursor: pointer;\" ng-click=\"showProfileHelp=!showProfileHelp\" class=\"icon positive ion-ios-help-outline ink\" title=\"{{\\'PROFILE.PROFILE_DIVIDER_HELP\\' | translate}}\"></a>\\n </span>\\n </span>\\n\\n <div class=\"item item-text-wrap positive item-small-height\" ng-show=\"showProfileHelp\">\\n <small translate>PROFILE.PROFILE_DIVIDER_HELP</small>\\n </div>\\n\\n <ng-include src=\"::\\'plugins/es/templates/user/items_profile.html\\'\" ng-init=\"showName=false;\"></ng-include>\\n\\n</ng-if>\\n');\n$templateCache.put('plugins/es/templates/wot/view_popover_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <a class=\"item item-icon-left ink visible-xs visible-sm\" ng-click=\"showSharePopover($event)\">\\n <i class=\"icon ion-android-share-alt\"></i>\\n {{\\'COMMON.BTN_SHARE\\' | translate}}\\n </a>\\n\\n <a class=\"item item-icon-left assertive ink\" ng-if=\"canDelete\" ng-click=\"delete()\">\\n <i class=\"icon ion-trash-a\"></i>\\n {{\\'COMMON.BTN_DELETE\\' | translate}}\\n </a>\\n\\n <!-- Like -->\\n <a class=\"item item-icon-left ink\" ng-if=\"!canEdit && likeData.likes\" ng-click=\"hideActionsPopover() && toggleLike($event)\">\\n <i class=\"icon\" ng-class=\"{\\'ion-heart-broken\\': likeData.likes.wasHit, \\'ion-heart\\': !likeData.likes.wasHit}\"></i>\\n {{(likeData.likes.wasHit ? \\'COMMON.BTN_LIKE_REMOVE\\' : \\'COMMON.BTN_LIKE\\' )| translate}}\\n </a>\\n\\n <!-- report abuse -->\\n <a class=\"item item-icon-left ink\" ng-if=\"!canEdit && likeData.abuses\" ng-disabled=\"!!likeData.abuses.wasHitCount\" ng-class=\"{\\'gray\\': !!likeData.abuses.wasHitCount}\" ng-click=\"hideActionsPopover() && reportAbuse($event)\">\\n <i class=\"icon ion-android-warning\"></i>\\n {{\\'COMMON.BTN_REPORT_ABUSE_DOTS\\' | translate}}\\n </a>\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/graph/templates/account/graph_balance.html','\\n <!-- button bar -->\\n <div class=\"button-bar-inline\" style=\"top: 33px; margin-top:-33px; position: relative;\">\\n <button class=\"button button-stable button-clear no-padding-xs pull-right\" ng-click=\"showActionsPopover($event)\">\\n <i class=\"icon ion-navicon-round\"></i>\\n </button>\\n </div>\\n\\n <div class=\"padding-left padding-right\">\\n <canvas id=\"account-balance\" class=\"chart-bar\" height=\"{{height}}\" width=\"{{width}}\" chart-data=\"data\" chart-dataset-override=\"datasetOverride\" chart-colors=\"colors\" chart-options=\"options\" chart-labels=\"labels\" chart-click=\"onChartClick\">\\n </canvas>\\n </div>\\n\\n <ng-include src=\"::\\'plugins/graph/templates/common/graph_range_bar.html\\'\"></ng-include>\\n');\n$templateCache.put('plugins/graph/templates/account/graph_certifications.html','\\n <div class=\"padding-left padding-right\">\\n <canvas id=\"account-certifications\" class=\"chart-bar\" height=\"{{height}}\" width=\"{{width}}\" chart-data=\"data\" chart-dataset-override=\"datasetOverride\" chart-colors=\"colors\" chart-options=\"options\" chart-labels=\"labels\" chart-click=\"onChartClick\">\\n </canvas>\\n </div>\\n');\n$templateCache.put('plugins/graph/templates/account/graph_sum_tx.html','<div class=\"row responsive-sm\" ng-if=\"!loading\">\\n\\n <div class=\"col col-10 hidden-xs hidden-sm\"> </div>\\n\\n <div class=\"col text-center\">\\n\\n <!-- TX input chart -->\\n <p class=\"gray padding text-wrap\" ng-if=\"inputChart.data.length\" translate>GRAPH.ACCOUNT.INPUT_CHART_TITLE</p>\\n <canvas id=\"chart-received-pie\" class=\"chart-pie\" chart-data=\"inputChart.data\" chart-labels=\"inputChart.labels\" chart-colors=\"inputChart.colors\" chart-click=\"onInputChartClick\">\\n </canvas>\\n\\n </div>\\n\\n <div class=\"col col-10 hidden-xs hidden-sm\"> </div>\\n\\n <div class=\"col text-center\">\\n\\n <!-- TX output chart -->\\n <p class=\"gray padding text-wrap\" ng-if=\"outputChart.data.length\" translate>GRAPH.ACCOUNT.OUTPUT_CHART_TITLE</p>\\n <canvas id=\"chart-sent-pie\" class=\"chart-pie\" chart-data=\"outputChart.data\" chart-labels=\"outputChart.labels\" chart-colors=\"outputChart.colors\" chart-click=\"onOutputChartClick\">\\n </canvas>\\n\\n </div>\\n\\n <div class=\"col col-10 hidden-xs hidden-sm\"> </div>\\n\\n</div>\\n');\n$templateCache.put('plugins/graph/templates/account/view_identity_tx_extend.html','<!-- Buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'buttons\\'\">\\n\\n <button class=\"button button-stable button-small-padding icon ion-stats-bars\" ui-sref=\"app.wot_identity_stats({pubkey: formData.pubkey})\" title=\"{{\\'GRAPH.ACCOUNT.BTN_SHOW_STATS\\' | translate}}\">\\n </button>\\n\\n</ng-if>\\n');\n$templateCache.put('plugins/graph/templates/account/view_stats.html','<ion-view left-buttons=\"leftButtons\" cache-view=\"false\">\\n <ion-nav-title>\\n {{\\'GRAPH.ACCOUNT.TITLE\\' | translate}}{{id}}\\n </ion-nav-title>\\n\\n <ion-content scroll=\"true\" class=\"no-padding\">\\n\\n\\n\\n <div class=\"list\">\\n\\n <!-- - - - - Balance - - - - -->\\n <ng-controller ng-controller=\"GpAccountBalanceCtrl\">\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"item item-divider\" ng-if=\"!loading\">\\n {{\\'GRAPH.ACCOUNT.BALANCE_DIVIDER\\'|translate}}\\n <ion-spinner ng-if=\"loadingRange\" class=\"ion-spinner-small\" icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"item no-padding-xs\" ng-if=\"!loading\" ng-include=\"::\\'plugins/graph/templates/account/graph_balance.html\\'\" ng-init=\"setSize(350, 1000)\">\\n </div>\\n </ng-controller>\\n\\n </div>\\n\\n <div class=\"item no-padding-xs\" ng-include=\"::\\'plugins/graph/templates/account/graph_sum_tx.html\\'\" ng-controller=\"GpAccountSumTxCtrl\">\\n </div>\\n\\n <!-- - - - - WOT - - - -\\n <div class=\"item item-divider\" translate>\\n GRAPH.ACCOUNT.WOT_DIVIDER\\n </div>\\n\\n <div class=\"item no-padding-xs\"\\n ng-include=\"::\\'plugins/graph/templates/account/graph_certifications.html\\'\"\\n ng-controller=\"GpAccountCertificationCtrl\"\\n ng-init=\"setSize(350, 1000)\">\\n </div>-->\\n\\n </ion-content>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/graph/templates/account/view_wallet_tx_extend.html','<!-- Buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'buttons\\'\">\\n\\n <button class=\"button button-stable button-small-padding icon ion-stats-bars\" ui-sref=\"app.wot_identity_stats({pubkey: formData.pubkey})\" title=\"{{\\'GRAPH.ACCOUNT.BTN_SHOW_STATS\\' | translate}}\">\\n </button>\\n\\n</ng-if>\\n');\n$templateCache.put('plugins/graph/templates/blockchain/graph_block_issuers.html','\\n <div class=\"row responsive-lg\">\\n\\n <!-- bar -->\\n <div class=\"col col-75\">\\n <canvas id=\"bar\" class=\"chart-bar\" height=\"{{height}}\" width=\"{{width}}\" chart-data=\"data\" chart-labels=\"labels\" chart-colors=\"colors\" chart-options=\"barOptions\" chart-click=\"onChartClick\">\\n </canvas>\\n </div>\\n\\n <!-- pie -->\\n <div class=\"col col-25 padding-top\">\\n <canvas id=\"blocksByIssuer-pie\" class=\"chart-pie\" chart-data=\"data\" chart-labels=\"labels\" chart-colors=\"colors\" chart-click=\"onChartClick\">\\n </canvas>\\n\\n <div class=\"gray padding-top text-center\">\\n <small ng-bind-html=\"\\'GRAPH.BLOCKCHAIN.BLOCKS_ISSUERS_HELP\\'| translate:{issuerCount: data.length, blockCount: blockCount }\"></small>\\n </div>\\n </div>\\n </div>\\n');\n$templateCache.put('plugins/graph/templates/blockchain/graph_tx_count.html','\\n <!-- button bar -->\\n <div class=\"button-bar-inline\" style=\"top: 33px; margin-top:-33px; position: relative;\">\\n <button class=\"button button-stable button-clear no-padding-xs pull-right\" ng-click=\"showActionsPopover($event)\">\\n <i class=\"icon ion-navicon-round\"></i>\\n </button>\\n </div>\\n\\n <div class=\"padding-left padding-right\">\\n <canvas id=\"tx-line\" class=\"chart-bar\" height=\"{{height}}\" width=\"{{width}}\" chart-data=\"data\" chart-dataset-override=\"datasetOverride\" chart-colors=\"colors\" chart-options=\"options\" chart-labels=\"labels\" chart-click=\"onChartClick\">\\n </canvas>\\n </div>\\n\\n <ng-include src=\"::\\'plugins/graph/templates/common/graph_range_bar.html\\'\"></ng-include>\\n');\n$templateCache.put('plugins/graph/templates/blockchain/view_stats.html','<ion-view left-buttons=\"leftButtons\" cache-view=\"false\">\\n <ion-nav-title>\\n {{\\'GRAPH.BLOCKCHAIN.TITLE\\' | translate}}{{id}}\\n </ion-nav-title>\\n\\n <ion-content scroll=\"true\" class=\"no-padding\">\\n\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"list\" ng-if=\"!loading\">\\n\\n\\n <!-- TX count -->\\n <ng-controller ng-controller=\"GpBlockchainTxCountCtrl\">\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"item item-divider\" ng-if=\"!loading\">\\n {{\\'GRAPH.BLOCKCHAIN.TX_DIVIDER\\'|translate}}\\n <ion-spinner ng-if=\"loadingRange\" class=\"ion-spinner-small\" icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"item no-padding-xs no-padding-sm\" ng-if=\"!loading\" ng-include=\"::\\'plugins/graph/templates/blockchain/graph_tx_count.html\\'\" ng-init=\"setSize(350, 1000)\">\\n </div>\\n </ng-controller>\\n\\n\\n <!-- Blocks issuer -->\\n <ng-controller ng-controller=\"GpBlockchainIssuersCtrl\">\\n\\n <div class=\"item item-divider\" ng-if=\"!loading\" translate>GRAPH.BLOCKCHAIN.BLOCKS_ISSUERS_DIVIDER</div>\\n\\n <div class=\"item no-padding-xs no-padding-sm\" ng-if=\"!loading\" ng-include=\"::\\'plugins/graph/templates/blockchain/graph_block_issuers.html\\'\" ng-init=\"setSize(300, 750)\">\\n </div>\\n\\n </ng-controller>\\n\\n </div></ion-content>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/graph/templates/common/graph_range_bar.html','\\n <div class=\"range range-positive no-padding-left no-padding-right\">\\n <a class=\"button button-stable button-clear no-padding pull-left\" ng-click=\"goPreviousRange($event)\">\\n <i class=\"icon ion-chevron-left\"></i>\\n </a>\\n <input type=\"range\" ng-model=\"formData.timePct\" name=\"timePct\" min=\"0\" max=\"100\" value=\"{{formData.timePct}}\" ng-change=\"onRangeChanged();\" ng-model-options=\"{ debounce: 250 }\">\\n <a class=\"button button-stable button-clear no-padding pull-right\" ng-click=\"goNextRange($event)\">\\n <i class=\"icon ion-chevron-right\"></i>\\n </a>\\n </div>\\n');\n$templateCache.put('plugins/graph/templates/common/popover_range_actions.html','<ion-popover-view class=\"has-header popover-graph-currency\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <!-- scale -->\\n <a class=\"item item-icon-left ink\" ng-click=\"toggleScale()\">\\n <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"formData.scale==\\'logarithmic\\'\"></i>\\n <span ng-bind-html=\"\\'GRAPH.COMMON.LOGARITHMIC_SCALE\\' | translate\"></span>\\n </a>\\n\\n <!-- duration divider -->\\n <div class=\"item item-divider\">\\n {{\\'GRAPH.COMMON.RANGE_DURATION_DIVIDER\\'|translate}}\\n </div>\\n\\n <!-- duration: hour -->\\n <a class=\"item item-icon-left ink\" ng-click=\"setRangeDuration(\\'hour\\')\">\\n <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"formData.rangeDuration==\\'hour\\'\"></i>\\n <span ng-bind-html=\"\\'GRAPH.COMMON.RANGE_DURATION.HOUR\\' | translate\"></span>\\n </a>\\n\\n <!-- duration: day -->\\n <a class=\"item item-icon-left ink\" ng-click=\"setRangeDuration(\\'day\\')\">\\n <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"formData.rangeDuration==\\'day\\'\"></i>\\n <span ng-bind-html=\"\\'GRAPH.COMMON.RANGE_DURATION.DAY\\' | translate\"></span>\\n </a>\\n\\n <!-- duration: month -->\\n <a class=\"item item-icon-left ink\" ng-click=\"setRangeDuration(\\'month\\')\">\\n <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"formData.rangeDuration==\\'month\\'\"></i>\\n <span ng-bind-html=\"\\'GRAPH.COMMON.RANGE_DURATION.MONTH\\' | translate\"></span>\\n </a>\\n\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/graph/templates/currency/graph_du.html','\\n <!-- graphs button bar -->\\n <div class=\"button-bar-inline\" style=\"top: 33px; margin-top:-33px; position: relative;\">\\n <button class=\"button button-stable button-clear no-padding-xs no-padding-sm pull-right\" ng-click=\"showActionsPopover($event)\">\\n <i class=\"icon ion-navicon-round\"></i>\\n </button>\\n </div>\\n\\n <canvas id=\"monetaryMass-bar\" class=\"chart-bar\" height=\"{{height}}\" width=\"{{width}}\" chart-data=\"data\" chart-labels=\"labels\" chart-colors=\"colors\" chart-dataset-override=\"datasetOverride\" chart-options=\"options\" chart-click=\"showBlock\">\\n </canvas>\\n');\n$templateCache.put('plugins/graph/templates/currency/graph_members_count.html',' <canvas id=\"membersCount-bar\" class=\"chart-line\" height=\"{{height}}\" width=\"{{width}}\" chart-data=\"data\" chart-labels=\"labels\" chart-colors=\"colors\" chart-options=\"options\" chart-dataset-override=\"datasetOverride\" chart-click=\"onChartClick\">\\n </canvas>\\n');\n$templateCache.put('plugins/graph/templates/currency/graph_monetary_mass.html','\\n <!-- graphs button bar -->\\n <div class=\"button-bar-inline\" style=\"top: 33px; margin-top:-33px; position: relative;\">\\n <button class=\"button button-stable button-clear no-padding-xs pull-right\" ng-click=\"showActionsPopover($event)\">\\n <i class=\"icon ion-navicon-round\"></i>\\n </button>\\n </div>\\n\\n <canvas id=\"monetaryMass-bar\" class=\"chart-bar\" height=\"{{height}}\" width=\"{{width}}\" chart-data=\"data\" chart-labels=\"labels\" chart-colors=\"colors\" chart-dataset-override=\"datasetOverride\" chart-options=\"options\" chart-click=\"onChartClick\">\\n </canvas>\\n');\n$templateCache.put('plugins/graph/templates/currency/popover_monetary_mass_actions.html','<ion-popover-view class=\"fit has-header\">\\n <ion-header-bar>\\n <h1 class=\"title\" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\\n </ion-header-bar>\\n <ion-content scroll=\"false\">\\n <div class=\"list item-text-wrap\">\\n\\n <a class=\"item item-icon-left ink\" ng-click=\"toggleScale()\">\\n <i class=\"icon ion-ios-checkmark-empty\" ng-show=\"formData.scale==\\'logarithmic\\'\"></i>\\n <span ng-bind-html=\"\\'GRAPH.COMMON.LOGARITHMIC_SCALE\\' | translate\"></span>\\n </a>\\n\\n </div>\\n </ion-content>\\n</ion-popover-view>\\n');\n$templateCache.put('plugins/graph/templates/currency/tab_blocks_extend.html','<!-- buttons -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'buttons\\'\">\\n <div class=\"item item-divider\">\\n <a class=\"badge button button-text button-small button-small-padding ink\" ui-sref=\"app.currency.tab_blocks_stats\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span translate>GRAPH.COMMON.BTN_SHOW_STATS</span>\\n </a>\\n </div>\\n</ng-if>\\n');\n$templateCache.put('plugins/graph/templates/currency/tabs/tab_blocks_stats.html','<ion-view>\\n <ion-content>\\n <div ng-include=\"::\\'plugins/graph/templates/blockchain/graph_tx_count.html\\'\" ng-controller=\"GpBlockchainTxCountCtrl\" ng-init=\"setSize(500,700,false)\">\\n </div>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/graph/templates/currency/tabs/tab_network_stats.html','<ion-view>\\n <ion-content>\\n\\n <div class=\"list\">\\n <div class=\"item\" ng-include=\"::\\'plugins/graph/templates/blockchain/graph_block_issuers.html\\'\" ng-controller=\"GpBlockchainIssuersCtrl\" ng-init=\"setSize(500,700,true)\">\\n </div>\\n </div>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/graph/templates/currency/tabs/tab_parameters_stats.html','<ion-view>\\n <ion-content>\\n <div class=\"list no-padding-xs no-padding-sm\">\\n\\n <ng-container ng-controller=\"GpCurrencyMonetaryMassCtrl\">\\n\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <!-- Monetary mass -->\\n <div class=\"item\" ng-include=\"::\\'plugins/graph/templates/currency/graph_monetary_mass.html\\'\" ng-init=\"setSize(500,700,true)\">\\n </div>\\n </ng-container>\\n\\n <!-- DU -->\\n <ng-container ng-controller=\"GpCurrencyDUCtrl\">\\n <div class=\"item\" ng-include=\"::\\'plugins/graph/templates/currency/graph_du.html\\'\" ng-init=\"setSize(500,700,true)\">\\n </div>\\n </ng-container>\\n </div>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/graph/templates/currency/tabs/tab_wot_stats.html','<ion-view>\\n <ion-content>\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"list no-padding\">\\n <div class=\"item no-padding-top\" ng-include=\"::\\'plugins/graph/templates/currency/graph_members_count.html\\'\" ng-init=\"setSize(600,700,false)\">\\n </div>\\n </div>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/graph/templates/currency/view_currency_extend.html','\\n<!-- section actual parameters -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'parameters-actual\\'\">\\n\\n <ng-if ng-if=\"!smallscreen\">\\n <div class=\"item padding-left padding-right no-padding-xs no-padding-sm\" ng-include=\"::\\'plugins/graph/templates/currency/graph_monetary_mass.html\\'\" ng-controller=\"GpCurrencyMonetaryMassCtrl\" ng-init=\"displayShareAxis=false;\">\\n </div>\\n <div class=\"item buttons no-padding-top\">\\n <a class=\"pull-right button button-text button-small button-small-padding ink\" ui-sref=\"app.currency_stats_lg\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span translate>GRAPH.COMMON.BTN_SHOW_DETAILED_STATS</span>\\n </a>\\n </div>\\n </ng-if>\\n\\n <div class=\"item item-divider\" ng-if=\"smallscreen\">\\n <a class=\"badge button button-text button-small button-small-padding ink\" ui-sref=\"app.currency.tab_parameters_stats\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span translate>GRAPH.COMMON.BTN_SHOW_STATS</span>\\n </a>\\n </div>\\n</ng-if>\\n\\n<!-- section Wot -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'wot-actual\\'\">\\n\\n <ng-if ng-if=\"!smallscreen\">\\n <div class=\"item padding-left padding-right no-padding-xs no-padding-sm\" ng-include=\"::\\'plugins/graph/templates/currency/graph_members_count.html\\'\" ng-controller=\"GpCurrencyMembersCountCtrl\">\\n </div>\\n <div class=\"item buttons no-padding-top\">\\n <a class=\"pull-right button button-text button-small button-small-padding ink\" ui-sref=\"app.currency_stats_lg\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span translate>GRAPH.COMMON.BTN_SHOW_DETAILED_STATS</span>\\n </a>\\n </div>\\n </ng-if>\\n\\n <div class=\"item item-divider\" ng-if=\"smallscreen\">\\n <a class=\"badge button button-text button-small button-small-padding ink\" ui-sref=\"app.currency.tab_wot_stats\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span translate>GRAPH.COMMON.BTN_SHOW_STATS</span>\\n </a>\\n </div>\\n</ng-if>\\n\\n<!-- section Wot -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'network-actual\\'\">\\n\\n <div class=\"item padding-left padding-right no-padding-xs no-padding-sm\" ng-if=\"!smallscreen\" ng-include=\"::\\'plugins/graph/templates/blockchain/graph_block_issuers.html\\'\" ng-controller=\"GpBlockchainIssuersCtrl\">\\n </div>\\n\\n <div class=\"item item-divider\" ng-if=\"smallscreen\">\\n <a class=\"badge button button-text button-small button-small-padding ink\" ui-sref=\"app.currency.tab_network_stats\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span translate>GRAPH.COMMON.BTN_SHOW_STATS</span>\\n </a>\\n </div>\\n</ng-if>\\n\\n');\n$templateCache.put('plugins/graph/templates/currency/view_stats_lg.html','<ion-view left-buttons=\"leftButtons\" cache-view=\"false\">\\n <ion-nav-title>\\n {{\\'GRAPH.BLOCKCHAIN.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-content scroll=\"true\" class=\"padding\">\\n\\n\\n\\n <div class=\"list\">\\n\\n <!-- Monetary mass -->\\n <ng-controller ng-controller=\"GpCurrencyMonetaryMassCtrl\">\\n\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"item no-padding-xs\" ng-if=\"!loading\" ng-include=\"::\\'plugins/graph/templates/currency/graph_monetary_mass.html\\'\" ng-init=\"setSize(250, 1000)\">\\n </div>\\n\\n <div ng-if=\"!loading\" class=\"item item-toggle dark no-border text-right\">\\n <span class=\"\" translate>COMMON.BTN_RELATIVE_UNIT</span>\\n <label class=\"toggle toggle-royal\" id=\"helptip-currency-change-unit\">\\n <input type=\"checkbox\" ng-model=\"formData.useRelative\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </label>\\n </div>\\n </ng-controller>\\n\\n <!-- DU -->\\n <ng-controller ng-controller=\"GpCurrencyDUCtrl\">\\n <div class=\"item no-padding-xs\" ng-if=\"!loading\" ng-include=\"::\\'plugins/graph/templates/currency/graph_du.html\\'\" ng-init=\"setSize(250, 1000)\">\\n </div>\\n </ng-controller>\\n\\n <!-- Member count -->\\n <ng-controller ng-controller=\"GpCurrencyMembersCountCtrl\">\\n <div class=\"item no-padding-xs\" ng-if=\"!loading\" ng-include=\"::\\'plugins/graph/templates/currency/graph_members_count.html\\'\" ng-init=\"setSize(250, 1000)\">\\n </div>\\n\\n\\n </ng-controller></div>\\n\\n </ion-content>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/graph/templates/currency/view_wot_stats.html','<ion-view left-buttons=\"leftButtons\" cache-view=\"false\">\\n\\n <ion-content scroll=\"true\">\\n\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <ng-include ng-if=\"!loading\" src=\"\\'plugins/graph/templates/currency/graph_members_count.html\\'\"></ng-include>\\n </ion-content>\\n </ion-view>\\n');\n$templateCache.put('plugins/graph/templates/docstats/graph.html','\\n <!-- graphs button bar -->\\n <div class=\"button-bar-inline\" style=\"top: 33px; margin-top:-33px; position: relative;\">\\n <button class=\"button button-stable button-clear no-padding-xs no-padding-sm pull-right\" ng-click=\"showActionsPopover($event)\">\\n <i class=\"icon ion-navicon-round\"></i>\\n </button>\\n </div>\\n\\n <canvas id=\"{{::chartIdPrefix}}{{chart.id}}\" class=\"chart-line\" height=\"{{height}}\" width=\"{{width}}\" chart-data=\"chart.data\" chart-labels=\"labels\" chart-dataset-override=\"chart.datasetOverride\" chart-options=\"chart.options\" chart-click=\"onChartClick\">\\n </canvas>\\n\\n <ng-include src=\"::\\'plugins/graph/templates/common/graph_range_bar.html\\'\"></ng-include>\\n');\n$templateCache.put('plugins/graph/templates/docstats/view_stats.html','<ion-view left-buttons=\"leftButtons\" cache-view=\"false\">\\n <ion-nav-title>\\n {{\\'GRAPH.DOC_STATS.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-content scroll=\"true\" class=\"padding\">\\n\\n <div class=\"list\">\\n\\n <!-- Doc stat -->\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"item no-padding-xs no-padding-sm\" ng-if=\"!loading\" ng-repeat=\"chart in charts\" ng-include=\"::\\'plugins/graph/templates/docstats/graph.html\\'\" ng-init=\"setSize(250, 1000)\">\\n </div>\\n\\n </div>\\n\\n </ion-content>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/graph/templates/network/view_es_network_extend.html','<!-- Buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'documents-buttons\\'\">\\n <a class=\"button button-text button-small ink\" ui-sref=\"app.doc_stats_lg\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span>{{\\'NETWORK.VIEW.BTN_GRAPH\\'|translate}}</span>\\n </a>\\n</ng-if>\\n');\n$templateCache.put('plugins/graph/templates/network/view_es_peer_extend.html','<!-- Buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'general\\'\">\\n\\n <a class=\"item item-icon-left item-icon-right item-text-wrap ink\" ng-if=\"isReachable\" ui-sref=\"app.doc_stats_lg(node)\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span translate>GRAPH.DOC_STATS.TITLE</span>\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </a>\\n\\n <a class=\"item item-icon-left item-icon-right item-text-wrap ink\" ng-if=\"isReachable\" ui-sref=\"app.doc_synchro_lg(node)\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span translate>GRAPH.SYNCHRO.TITLE</span>\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </a>\\n</ng-if>\\n\\n');\n$templateCache.put('plugins/graph/templates/network/view_network_extend.html','<!-- Buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'blockchain-buttons\\'\">\\n <a class=\"button button-text button-small ink\" ui-sref=\"app.blockchain_stats\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span>{{\\'NETWORK.VIEW.BTN_GRAPH\\'|translate}}</span>\\n </a>\\n</ng-if>\\n');\n$templateCache.put('plugins/graph/templates/network/view_peer_extend.html','<!-- Buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'general\\'\">\\n\\n <a class=\"item item-icon-left item-icon-right item-text-wrap ink\" ui-sref=\"app.view_peer_stats({pubkey: node.pubkey})\">\\n <i class=\"icon ion-stats-bars\"></i>\\n <span translate>GRAPH.PEER.VIEW.BLOCK_COUNT_LABEL</span>\\n <span class=\"badge\" ng-if=\"!loading\" ng-class=\"{\\'badge-stable\\': blockCount > 0, \\'badge-assertive\\': !blockCount}\">\\n {{!blockCount ? \\'GRAPH.PEER.VIEW.NO_BLOCK\\' : \\'GRAPH.PEER.VIEW.BLOCK_COUNT\\' | translate:{count: blockCount} }}\\n </span>\\n <ion-spinner class=\"badge\" icon=\"android\" ng-if=\"loading\"></ion-spinner>\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </a>\\n</ng-if>\\n\\n');\n$templateCache.put('plugins/graph/templates/network/view_peer_stats.html','<ion-view left-buttons=\"leftButtons\" cache-view=\"false\">\\n <ion-nav-title>\\n {{\\'GRAPH.BLOCKCHAIN.TITLE\\' | translate}}{{id}}\\n </ion-nav-title>\\n\\n <ion-content scroll=\"true\" class=\"no-padding\">\\n\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"list\" ng-if=\"!loading\">\\n\\n <!-- - - - - TX divider - - - - -->\\n <div class=\"item item-divider hidden-xs hidden-sm\" translate>\\n GRAPH.BLOCKCHAIN.TX_DIVIDER\\n </div>\\n\\n <div class=\"item no-padding-xs\" ng-include=\"::\\'plugins/graph/templates/blockchain/graph_tx_count.html\\'\" ng-init=\"setSize(350, 1000)\">\\n </div>\\n\\n </div></ion-content>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/graph/templates/synchro/graph.html','\\n <!-- graphs button bar -->\\n <div class=\"button-bar-inline\" style=\"top: 33px; margin-top:-33px; position: relative;\">\\n <button class=\"button button-stable button-clear no-padding-xs pull-right\" ng-click=\"showActionsPopover($event)\">\\n <i class=\"icon ion-navicon-round\"></i>\\n </button>\\n </div>\\n\\n <canvas id=\"synchro-chart-{{chart.id}}\" class=\"chart-bar\" height=\"{{height}}\" width=\"{{width}}\" chart-data=\"chart.data\" chart-labels=\"labels\" chart-dataset-override=\"chart.datasetOverride\" chart-options=\"chart.options\">\\n </canvas>\\n\\n <ng-include src=\"::\\'plugins/graph/templates/common/graph_range_bar.html\\'\"></ng-include>\\n');\n$templateCache.put('plugins/graph/templates/synchro/view_stats.html','<ion-view left-buttons=\"leftButtons\" cache-view=\"false\">\\n <ion-nav-title>\\n {{\\'GRAPH.SYNCHRO.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-content scroll=\"true\" class=\"padding\">\\n\\n <div class=\"list\">\\n\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"item no-padding-xs\" ng-if=\"!loading\" ng-repeat=\"chart in charts\" ng-include=\"::\\'plugins/graph/templates/synchro/graph.html\\'\" ng-init=\"setSize(250, 1000)\">\\n </div>\\n\\n </div>\\n\\n </ion-content>\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/map/templates/common/edit_position_extend.html','<div class=\"item no-padding hidden-xs hidden-sm {{ionItemClass}}\" ng-if=\"formData.geoPoint && formData.geoPoint.lat && formData.geoPoint.lon\">\\n <leaflet id=\"{{::mapId}}\" height=\"250px\" center=\"map.center\" markers=\"map.markers\" defaults=\"map.defaults\">\\n </leaflet>\\n</div>\\n');\n$templateCache.put('plugins/map/templates/network/item_search_tooltip.html','<a href=\"#\">\\n {{peer.dns || peer.server}}\\n <span class=\"{{peer.uid ? \\'positive\\' : \\'gray\\'}}\">\\n <i class=\"icon {{peer.uid ? \\'ion-person\\' : \\'ion-key\\'}}\"></i>\\n {{peer.uid ? (peer.name||peer.uid) : (peer.pubkey|formatPubkey) }}\\n </span>\\n <span class=\"gray\">{{peer.ipv4 ? (peer.ipv4 + \\':\\' + peer.port) : \\'\\'}}</span>\\n <span class=\"{{peer.bma.useSsl ? \\'\\' : \\'ng-hide\\'}}\"><i class=\"ion-locked\"></i> <small>SSL</small></span>\\n</a>\\n');\n$templateCache.put('plugins/map/templates/network/lookup_extend.html','<!-- FIXME issue #755 - https://git.duniter.org/clients/cesium-grp/cesium/issues/755\\n<a ng-if=\"enable\"\\n class=\"button button-text button-small ink hidden-sm hidden-xs\"\\n title=\"{{\\'MAP.NETWORK.LOOKUP.BTN_MAP_HELP\\' | translate}}\"\\n ui-sref=\"app.view_network_map\">\\n <i class=\"icon ion-ios-location\"></i>\\n {{\\'MAP.NETWORK.LOOKUP.BTN_MAP\\' | translate}}\\n</a>\\n -->\\n');\n$templateCache.put('plugins/map/templates/network/view_map.html','<ion-view left-buttons=\"leftButtons\" class=\"view-map-network\">\\n <ion-nav-title>\\n <span class=\"hidden-xs\" translate>MAP.NETWORK.VIEW.TITLE</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n </ion-nav-buttons>\\n\\n <ion-content data-tap-disabled=\"true\">\\n <leaflet id=\"{{::mapId}}\" height=\"100%\" center=\"map.center\" markers=\"map.markers\" layers=\"map.layers\">\\n </leaflet>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/map/templates/registry/item_search_tooltip.html','<a href=\"#\" class=\"{{type}}\">\\n <i class=\"{{\\'cion-page-\\' + type}}\"></i>\\n {{name != uid ? name +\\' \\' : \\'\\'}}\\n <span class=\"gray\">\\n {{pubkey ? (pubkey|formatPubkey) : \\'\\'}}\\n </span>\\n</a>\\n');\n$templateCache.put('plugins/map/templates/registry/lookup_lg_extend.html','<a class=\"button button-text button-small ink hidden-sm hidden-xs\" title=\"{{\\'MAP.REGISTRY.LOOKUP.BTN_MAP_HELP\\' | translate}}\" ui-sref=\"app.view_registry_map\">\\n <i class=\"icon ion-ios-location\"></i>\\n {{\\'MAP.REGISTRY.LOOKUP.BTN_MAP\\' | translate}}\\n</a>\\n');\n$templateCache.put('plugins/map/templates/registry/popup_marker.html','<div class=\"item no-border no-padding item-avatar\" ng-if=\"loadingMarker\">\\n\\n <i class=\"item-image icon ion-person\"></i>\\n\\n <div class=\"item-content item-avatar-left-padding padding-top\">\\n <h2 class=\"stable-bg\">\\n \\n </h2>\\n <h4 class=\"stable-bg col-75\">\\n \\n </h4>\\n <h4 class=\"stable-bg col-50\">\\n \\n </h4>\\n </div>\\n</div>\\n\\n<a class=\"item no-border no-padding item-avatar ink animate-fade-in animate-show-hide ng-hide\" ng-show=\"!loadingMarker\" ui-sref=\"app.view_page({id: formData.id, title: formData.name})\">\\n <i ng-if=\"formData.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::formData.avatar.src}}\"></i>\\n <i ng-if=\"!formData.avatar\" class=\"item-image icon cion-page-{{::formData.type}}\"></i>\\n <div class=\"item-content item-avatar-left-padding padding-top\">\\n <h2 class=\"dark\">\\n {{::formData.name}}\\n </h2>\\n <h4 ng-if=\"::formData.category\" class=\"gray\" title=\"{{::formData.category.name}}\">\\n <b class=\"ion-flag\"></b> {{::formData.category.name}}\\n </h4>\\n <h4 ng-if=\"::formData.city\" class=\"gray\" title=\"{{::formData.city}}\">\\n <b class=\"ion-location\"></b> {{::formData.city}}\\n </h4>\\n </div>\\n</a>\\n<!-- buttons -->\\n<div class=\"item no-border no-padding\">\\n <div class=\"pull-left gray\">\\n <!-- show description -->\\n <a class=\"animate-fade-in animate-show-hide gray ng-hide\" ng-class=\"{\\'ion-arrow-down-b\\': !showDescription, \\'ion-arrow-up-b\\': showDescription}\" ng-click=\"showDescription=!showDescription;\" title=\"{{\\'PROFILE.DESCRIPTION\\'|translate}}\" ng-show=\"!loadingMarker && formData.description\">\\n \\n </a>\\n </div>\\n</div>\\n<div class=\"item no-border no-padding item-text-wrap hidden-xs ng-hide\" ng-show=\"showDescription\">\\n <small trust-as-html=\"::formData.description|truncText:500\"></small>\\n</div>\\n');\n$templateCache.put('plugins/map/templates/registry/view_map.html','<ion-view left-buttons=\"leftButtons\" class=\"view-map-registry\">\\n <ion-nav-title>\\n <span class=\"hidden-xs\" translate>MAP.REGISTRY.VIEW.TITLE</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <button class=\"button button-icon button-clear icon ion-loop visible-xs visible-sm\" ng-click=\"load()\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content data-tap-disabled=\"true\">\\n <a id=\"helptip-map-registry\" style=\"left: 150px; top: 50px; position: relative;\"></a>\\n <leaflet id=\"{{::mapId}}\" height=\"100%\" layers=\"map.layers\" markers=\"map.markers\" lf-center=\"map.center\" bounds=\"map.bounds\">\\n </leaflet>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/map/templates/settings/es_settings_extend.html','\\n<!--<span class=\"item item-divider\" translate>MAP.SETTINGS.MAP_DIVIDER</span>\\n\\n<label class=\"item item-toggle dark item-text-wrap\">\\n <span translate>MAP.SETTINGS.ENABLE_GOOGLE_API</span>\\n <h4 class=\"gray\" translate>MAP.SETTINGS.ENABLE_GOOGLE_API_HELP</h4>\\n <div class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"formData.enableGoogleApi\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </div>\\n</label>\\n\\n<ion-item class=\"item-input\"\\n ng-if=\"!$root.config.plugins.es.googleApiKey\"\\n ng-class=\"{\\'item-input-error\\': formData.enableGoogleApi && !formData.googleApiKey}\">\\n <div class=\"input-label col-33\">\\n <span class=\"\" ng-class=\"{\\'gray\\': !formData.enableGoogleApi}\"translate>MAP.SETTINGS.GOOGLE_API_KEY</span>\\n <h4>\\n <a ng-click=\"openLink($event, \\'https://console.developers.google.com/apis/credentials/key\\')\" translate>MAP.SETTINGS.BTN_GOOGLE_API</a>\\n <span class=\"gray\"> ({{\\'MAP.SETTINGS.BTN_GOOGLE_API_WARNING\\'|translate}})</span>\\n </h4>\\n </div>\\n <input type=\"text\"\\n placeholder=\"{{\\'MAP.SETTINGS.GOOGLE_API_KEY_PLACEHOLDER\\' | translate}}\"\\n ng-model=\"formData.googleApiKey\"\\n ng-if=\"formData.enableGoogleApi\">\\n</ion-item>\\n<div class=\"form-errors\"\\n ng-show=\"formData.enableGoogleApi && !formData.googleApiKey\">\\n <div class=\"form-error\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n</div>-->\\n');\n$templateCache.put('plugins/map/templates/wot/item_search_tooltip.html','<a href=\"#\" class=\"{{type}}\">\\n <i class=\"{{pending ? \\'ion-clock\\': (type ? \\'cion-page-\\' + type : \\'\\')}}\"></i>\\n {{name != uid ? name +\\' \\' : \\'\\'}}\\n <span class=\"{{uid ? \\'positive\\' : \\'gray\\'}}\">\\n <i class=\"{{uid ? \\'ion-person\\' : \\'ion-key\\'}}\"></i>\\n {{uid ? uid : (pubkey|formatPubkey) }}\\n </span>\\n</a>\\n');\n$templateCache.put('plugins/map/templates/wot/lookup_lg_extend.html','<a ng-if=\"enable\" class=\"button button-text button-small ink hidden-sm hidden-xs\" title=\"{{\\'MAP.WOT.LOOKUP.BTN_MAP_HELP\\' | translate}}\" ui-sref=\"app.view_wot_map\">\\n <i class=\"icon ion-ios-location\"></i>\\n {{\\'MAP.WOT.LOOKUP.BTN_MAP\\' | translate}}\\n</a>\\n');\n$templateCache.put('plugins/map/templates/wot/popup_marker.html','\\n<div class=\"item no-border no-padding item-avatar\" ng-if=\"loadingMarker\">\\n\\n <i class=\"item-image icon ion-person\"></i>\\n\\n <div class=\"item-content item-avatar-left-padding padding-top\">\\n <h2 class=\"stable-bg\">\\n \\n </h2>\\n <h4 class=\"stable-bg col-75\">\\n \\n </h4>\\n <h4 class=\"stable-bg col-50\">\\n \\n </h4>\\n </div>\\n</div>\\n\\n<a class=\"item no-border no-padding item-avatar ink animate-fade-in animate-show-hide ng-hide\" ng-show=\"!loadingMarker\" ui-sref=\"app.wot_identity({pubkey: formData.pubkey, uid: formData.uid})\">\\n\\n <i ng-if=\"formData.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::formData.avatar.src}})\"></i>\\n <i ng-if=\"!formData.avatar && formData.uid\" class=\"item-image icon ion-person\"></i>\\n <i ng-if=\"!formData.avatar && !formData.uid\" class=\"item-image icon ion-card\"></i>\\n\\n <div class=\"item-content item-avatar-left-padding padding-top\">\\n <h2 class=\"dark\">\\n {{formData.name}}\\n </h2>\\n <h4>\\n <span ng-if=\"formData.uid\" class=\"positive\">\\n <b class=\"ion-person\"></b>\\n {{formData.uid}}\\n </span>\\n <span class=\"gray\" title=\"{{formData.pubkey}}\"><b class=\"ion-key\"></b> {{formData.pubkey|formatPubkey}}</span>\\n <span class=\"assertive\" ng-if=\"!formData.isMember\">\\n {{::\\'WOT.NOT_MEMBER_PARENTHESIS\\'|translate}}\\n </span>\\n </h4>\\n <h4 ng-if=\"formData.profile.city\" class=\"gray\" title=\"{{formData.profile.city}}\">\\n <b class=\"ion-location\"></b> {{formData.profile.city}}\\n </h4>\\n </div>\\n</a>\\n<!-- buttons -->\\n<div class=\"item no-border no-padding\">\\n <div class=\"pull-left gray\">\\n <!-- show description -->\\n <a class=\"animate-fade-in animate-show-hide gray ng-hide\" ng-class=\"{\\'ion-arrow-down-b\\': !showDescription, \\'ion-arrow-up-b\\': showDescription}\" ng-click=\"showDescription=!showDescription;\" title=\"{{\\'PROFILE.DESCRIPTION\\'|translate}}\" ng-show=\"!loadingMarker && formData.profile.description\">\\n \\n </a>\\n </div>\\n <div style=\"font-size: 18px;\" class=\"pull-right gray\">\\n <!-- share -->\\n <a class=\"icon ion-android-share-alt\" ng-click=\"showSharePopover($event)\" title=\"{{\\'COMMON.BTN_SHARE\\' | translate}}\"> </a>\\n <!-- certify -->\\n <a class=\"icon ion-ribbon-b\" ng-click=\"certify()\" title=\"{{\\'WOT.BTN_CERTIFY\\' | translate}}\" ng-hide=\"!canCertify\"> </a>\\n <!-- compose message -->\\n <a class=\"icon ion-compose\" ng-click=\"showNewMessageModal()\" title=\"{{\\'MESSAGE.BTN_WRITE\\' | translate}}\"> </a>\\n <!-- transfer -->\\n <a class=\"icon ion-card\" ng-click=\"showTransferModal({pubkey:formData.pubkey, uid: formData.name||formData.uid})\" title=\"{{\\'COMMON.BTN_SEND_MONEY\\' | translate}}\"> </a>\\n\\n </div>\\n</div>\\n<div class=\"item no-border no-padding item-text-wrap hidden-xs ng-hide\" ng-show=\"showDescription\">\\n <small trust-as-html=\"formData.profile.description|truncText:500\"></small>\\n</div>\\n');\n$templateCache.put('plugins/map/templates/wot/view_map.html','<ion-view left-buttons=\"leftButtons\" class=\"view-map-wot\">\\n <ion-nav-title>\\n <span class=\"hidden-xs\" translate>MAP.WOT.VIEW.TITLE</span>\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <button class=\"button button-icon button-clear icon ion-loop visible-xs visible-sm\" ng-click=\"load()\">\\n </button>\\n </ion-nav-buttons>\\n\\n <ion-content data-tap-disabled=\"true\">\\n <a id=\"helptip-map-wot\" style=\"left: 150px; top: 50px; position: relative;\"></a>\\n <leaflet id=\"{{::mapId}}\" height=\"100%\" layers=\"map.layers\" markers=\"map.markers\" lf-center=\"map.center\" bounds=\"map.bounds\">\\n </leaflet>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/rml9/templates/01-button.html','<!-- Button that call a function of the controller -->\\n<button class=\"button button-balanced button-small-padding icon ion-android-archive\" ng-click=\"onButtonClick()\" title=\"{{\\'RML9.BTN_OPEN\\' | translate}}\">\\n</button>\\n\\n<!-- Button: Open a view, using `ui-sref` attribute\\n<button class=\"button button-balanced button-small-padding icon ion-plus-circled\"\\n ui-sref=\"app.rml9({pubkey: formData.pubkey})\"\\n title=\"{{\\'RML9.BTN_OPEN\\' | translate}}\">\\n</button> -->\\n\\n');\n$templateCache.put('plugins/rml9/templates/02-view.html','<ion-view left-buttons=\"leftButtons\">\\n <ion-nav-title>\\n {{\\'RML9.VIEW.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-content>\\n <div class=\"list\">\\n\\n <!-- the pubkey -->\\n <div class=\"item\">\\n {{\\'COMMON.PUBKEY\\'|translate}}\\n <div class=\"badge\">{{pubkey|formatPubkey}}</div>\\n </div>\\n\\n <!-- a text divider-->\\n <div class=\"item item-divider\">{{\\'RML9.VIEW.DIVIDER\\'|translate:{pubkey: pubkey} }}</div>\\n\\n <!-- iterate on each TX -->\\n <div class=\"item\" ng-repeat=\"item in items\">\\n <h3>{{item.time|formatDate}}</h3>\\n <h4>{{item.pubkey|formatPubkey}}</h4>\\n <div class=\"badge\">{{item.amount|formatAmount}}</div>\\n </div>\\n </div>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/rml9/templates/03-button.html','<!-- Button: Open a view, using `ui-sref` attribute -->\\n<button class=\"button button-balanced button-small-padding icon ion-android-archive\" ui-sref=\"app.rml9({pubkey: formData.pubkey})\" title=\"{{\\'RML9.BTN_SWOW_TX\\' | translate}}\">\\n</button>\\n\\n');\n$templateCache.put('plugins/rml9/templates/03-view_with_button.html','<ion-view left-buttons=\"leftButtons\">\\n <ion-nav-title>\\n {{\\'RML9.VIEW.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-content>\\n <div class=\"list\">\\n\\n <!-- buttons bar -->\\n <div class=\"center padding\">\\n <div class=\"buttons\">\\n <button class=\"button button-balanced icon-left icon ion-archive\" ng-click=\"onExportButtonClick()\">{{\\'RML9.BTN_EXPORT\\' | translate}}\\n </button>\\n </div>\\n </div>\\n\\n <!-- the pubkey -->\\n <div class=\"item\">\\n {{\\'COMMON.PUBKEY\\'|translate}}\\n <div class=\"badge\">{{pubkey|formatPubkey}}</div>\\n </div>\\n\\n <!-- the balance -->\\n <div class=\"item\">\\n {{\\'RML9.VIEW.BALANCE\\'|translate}}\\n <div class=\"badge badge-calm\">\\n {{balance|formatAmount}} <span ng-bind-html=\"$root.currency.name|currencySymbol\"></span>\\n </div>\\n </div>\\n\\n <!-- a text divider-->\\n <div class=\"item item-divider\">{{\\'RML9.VIEW.DIVIDER\\'|translate:{pubkey: pubkey} }}</div>\\n\\n <!-- iterate on each TX -->\\n <div class=\"item item-text-wrap\" ng-repeat=\"item in items\">\\n\\n <h3>\\n {{item.time|formatDate}}\\n <span ng-if=\"item.comment\" class=\"gray\"> | {{item.comment}}</span>\\n </h3>\\n\\n <h4 ng-if=\"item.uid\" class=\"positive\"><i class=\"icon ion-person\"></i> {{item.name||item.uid}}</h4>\\n <h4 ng-if=\"!item.uid\" class=\"gray\"><i class=\"icon ion-key\"></i> {{item.pubkey|formatPubkey}}</h4>\\n\\n <div class=\"badge\" ng-class=\"{\\'badge-balanced\\': item.amount > 0}\">\\n {{item.amount|formatAmount}} <span ng-bind-html=\"$root.currency.name|currencySymbol\"></span>\\n </div>\\n </div>\\n </div>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/rml9/templates/04-view_chart.html','<ion-view left-buttons=\"leftButtons\">\\n <ion-nav-title>\\n {{\\'RML9.VIEW.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-content>\\n <div class=\"list\">\\n\\n <!-- buttons bar -->\\n <div class=\"center padding\">\\n <div class=\"buttons\">\\n <button class=\"button button-balanced icon-left icon ion-archive\" ng-click=\"onExportButtonClick()\">{{\\'RML9.BTN_EXPORT\\' | translate}}\\n </button>\\n </div>\\n </div>\\n\\n <!-- the pubkey -->\\n <div class=\"item\">\\n {{\\'COMMON.PUBKEY\\'|translate}}\\n <div class=\"badge\">{{pubkey|formatPubkey}}</div>\\n </div>\\n\\n <!-- the balance -->\\n <div class=\"item\">\\n {{\\'RML9.VIEW.BALANCE\\'|translate}}\\n <div class=\"badge badge-calm\">\\n {{balance|formatAmount}} <span ng-bind-html=\"$root.currency.name|currencySymbol\"></span>\\n </div>\\n </div>\\n\\n <!-- a text divider-->\\n <div class=\"item item-divider\">{{\\'RML9.VIEW.DIVIDER\\'|translate:{pubkey: pubkey} }}</div>\\n\\n\\n <div class=\"row\">\\n <div class=\"col col-75\">\\n <!-- iterate on each TX -->\\n <div class=\"item item-text-wrap\" ng-repeat=\"item in items\">\\n\\n <h3>\\n {{item.time|formatDate}}\\n <span ng-if=\"item.comment\" class=\"gray\"> | {{item.comment}}</span>\\n </h3>\\n\\n <h4 ng-if=\"item.uid\" class=\"positive\"><i class=\"icon ion-person\"></i> {{item.name||item.uid}}</h4>\\n <h4 ng-if=\"!item.uid\" class=\"gray\"><i class=\"icon ion-key\"></i> {{item.pubkey|formatPubkey}}</h4>\\n\\n <div class=\"badge\" ng-class=\"{\\'badge-balanced\\': item.amount > 0}\">\\n {{item.amount|formatAmount}} <span ng-bind-html=\"$root.currency.name|currencySymbol\"></span>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\"col col-25\">\\n\\n <!-- [NEW] TX input chart -->\\n <p class=\"gray\" translate>RML9.CHART.INPUT_CHART_TITLE</p>\\n <canvas id=\"chart-received-pie\" class=\"chart-pie\" chart-data=\"inputChart.data\" chart-labels=\"inputChart.labels\" chart-colors=\"inputChart.colors\">\\n </canvas>\\n\\n <!-- [NEW] TX input chart -->\\n <p class=\"gray\" translate>RML9.CHART.OUTPUT_CHART_TITLE</p>\\n <canvas id=\"chart-sent-pie\" class=\"chart-pie\" chart-data=\"outputChart.data\" chart-labels=\"outputChart.labels\" chart-colors=\"outputChart.colors\">\\n </canvas>\\n </div>\\n </div>\\n </div>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/rml9/templates/06-button.html','<!-- [NEW] Display only if plugin is enable -->\\n\\n <!-- Button: call a method from the state controller -->\\n <button ng-if=\"enable\" class=\"button button-balanced button-small-padding icon ion-android-archive\" ng-click=\"onButtonClick()\" title=\"{{\\'RML9.BTN_SWOW_TX\\' | translate}}\">\\n </button>\\n\\n\\n');\n$templateCache.put('plugins/rml9/templates/06-settings_item.html','\\n<div class=\"item item-toggle dark\">\\n <div class=\"input-label\" translate>RML9.SETTINGS.ENABLE_TOGGLE</div>\\n <label class=\"toggle toggle-royal\">\\n <input type=\"checkbox\" ng-model=\"formData.plugins.rml9.enable\">\\n <div class=\"track\">\\n <div class=\"handle\"></div>\\n </div>\\n </label>\\n</div>\\n');\n$templateCache.put('plugins/rml9/templates/07-button.html','<!-- Button: Open a view, using `ui-sref` attribute -->\\n<button class=\"button button-balanced button-small-padding icon ion-android-archive\" ui-sref=\"app.rml9({pubkey: formData.pubkey})\" title=\"{{\\'RML9.BTN_SWOW_TX\\' | translate}}\">\\n</button>\\n\\n');\n$templateCache.put('plugins/rml9/templates/07-view.html','<leaflet id=\"map-geojson\" center=\"map.center\" geojson=\"map.geojson\"></leaflet>\\n');\n$templateCache.put('plugins/rml9/templates/final-button.html','<!-- Button: Open a view, using `ui-sref` attribute -->\\n<button ng-if class=\"button button-balanced button-small-padding icon ion-android-archive\" ui-sref=\"app.rml9({pubkey: formData.pubkey})\" title=\"{{\\'RML9.BTN_SWOW_TX\\' | translate}}\">\\n</button>\\n\\n');\n$templateCache.put('plugins/rml9/templates/final-view.html','<ion-view left-buttons=\"leftButtons\">\\n <ion-nav-title>\\n {{\\'RML9.VIEW.TITLE\\' | translate}}\\n </ion-nav-title>\\n\\n <ion-content>\\n <div class=\"list\">\\n\\n <!-- buttons bar -->\\n <div class=\"center padding\">\\n <div class=\"buttons\">\\n <button class=\"button button-balanced icon-left icon ion-archive\" ng-click=\"onExportButtonClick()\">{{\\'RML9.BTN_EXPORT\\' | translate}}\\n </button>\\n </div>\\n </div>\\n\\n <!-- the pubkey -->\\n <div class=\"item\">\\n {{\\'COMMON.PUBKEY\\'|translate}}\\n <div class=\"badge\">{{pubkey|formatPubkey}}</div>\\n </div>\\n\\n <!-- the balance -->\\n <div class=\"item\">\\n {{\\'RML9.VIEW.BALANCE\\'|translate}}\\n <div class=\"badge badge-calm\">\\n {{balance|formatAmount}} <span ng-bind-html=\"$root.currency.name|currencySymbol\"></span>\\n </div>\\n </div>\\n\\n <!-- a text divider-->\\n <div class=\"item item-divider\">{{\\'RML9.VIEW.DIVIDER\\'|translate:{pubkey: pubkey} }}</div>\\n\\n <!-- iterate on each TX -->\\n <div class=\"row\">\\n <div class=\"col col-75\">\\n <div class=\"item item-text-wrap\" ng-repeat=\"item in items\">\\n\\n <h3>\\n {{item.time|formatDate}}\\n <span ng-if=\"item.comment\" class=\"gray\"> | {{item.comment}}</span>\\n </h3>\\n\\n <h4 ng-if=\"item.uid\" class=\"positive\"><i class=\"icon ion-person\"></i> {{item.name||item.uid}}</h4>\\n <h4 ng-if=\"!item.uid\" class=\"gray\"><i class=\"icon ion-key\"></i> {{item.pubkey|formatPubkey}}</h4>\\n\\n <div class=\"badge\" ng-class=\"{\\'badge-balanced\\': item.amount > 0}\">\\n {{item.amount|formatAmount}} <span ng-bind-html=\"$root.currency.name|currencySymbol\"></span>\\n </div>\\n </div>\\n\\n </div>\\n\\n <div class=\"col col-25\">\\n\\n <!-- [NEW] TX input chart -->\\n <p class=\"gray\" translate>RML9.CHART.INPUT_CHART_TITLE</p>\\n <canvas id=\"chart-received-pie\" class=\"chart-pie\" chart-data=\"inputChart.data\" chart-labels=\"inputChart.labels\">\\n </canvas>\\n\\n <!-- [NEW] TX input chart -->\\n <p class=\"gray\" translate>RML9.CHART.OUTPUT_CHART_TITLE</p>\\n <canvas id=\"chart-sent-pie\" class=\"chart-pie\" chart-data=\"outputChart.data\" chart-labels=\"outputChart.labels\">\\n </canvas>\\n </div>\\n </div>\\n </div>\\n </ion-content>\\n</ion-view>\\n');}]);","\nangular.module('cesium.es.plugin', [\n // Services\n 'cesium.es.services',\n // Controllers\n 'cesium.es.app.controllers',\n 'cesium.es.common.controllers',\n 'cesium.es.settings.controllers',\n 'cesium.es.currency.controllers',\n 'cesium.es.wot.controllers',\n 'cesium.es.wallet.controllers',\n 'cesium.es.profile.controllers',\n 'cesium.es.message.controllers',\n 'cesium.es.notification.controllers',\n 'cesium.es.blockchain.controllers',\n 'cesium.es.network.controllers',\n 'cesium.es.registry.controllers',\n 'cesium.es.group.controllers',\n 'cesium.es.invitation.controllers',\n 'cesium.es.subscription.controllers',\n 'cesium.es.document.controllers',\n 'cesium.es.like.controllers'\n ])\n;\n","\nangular.module('cesium.es.services', [\n // Services\n 'cesium.es.http.services',\n 'cesium.es.comment.services',\n 'cesium.es.social.services',\n 'cesium.es.settings.services',\n 'cesium.es.crypto.services',\n 'cesium.es.profile.services',\n 'cesium.es.notification.services',\n 'cesium.es.message.services',\n 'cesium.es.modal.services',\n 'cesium.es.blockchain.services',\n 'cesium.es.registry.services',\n 'cesium.es.group.services',\n 'cesium.es.wallet.services',\n 'cesium.es.invitation.services',\n 'cesium.es.subscription.services',\n 'cesium.es.wot.services',\n 'cesium.es.tx.services',\n 'cesium.es.geo.services',\n 'cesium.es.document.services',\n 'cesium.es.network.services',\n 'cesium.es.like.services'\n ])\n;\n","angular.module('cesium.es.comment.services', ['ngResource', 'cesium.services',\n 'cesium.es.http.services', 'cesium.es.profile.services'])\n\n .factory('esComment', ['$rootScope', '$q', 'esHttp', 'csWallet', 'csWot', function($rootScope, $q, esHttp, csWallet, csWot) {\n 'ngInject';\n\n function EsComment(index) {\n\n var\n DEFAULT_SIZE = 20,\n fields = {\n commons: [\"issuer\", \"creationTime\", \"time\", \"message\", \"reply_to\"]\n },\n exports = {\n index: index,\n fields: {\n commons: fields.commons\n },\n raw: {\n search: esHttp.post('/'+index+'/comment/_search'),\n remove: esHttp.record.remove(index, 'comment'),\n wsChanges: esHttp.ws('/ws/_changes'),\n add: new esHttp.record.post('/'+index+'/comment', {creationTime: true}),\n update: new esHttp.record.post('/'+index+'/comment/:id/_update', {creationTime: true})\n }\n };\n\n exports.raw.refreshTreeLinks = function(data) {\n return exports.raw.addTreeLinks(data, true);\n };\n\n exports.raw.addTreeLinks = function(data, refresh) {\n data = data || {};\n data.result = data.result || [];\n data.mapById = data.mapById || {};\n\n var incompleteCommentIdByParentIds = {};\n _.forEach(_.values(data.mapById), function(comment) {\n if (comment.reply_to && !comment.parent) {\n var parent = data.mapById[comment.reply_to];\n if (!parent) {\n parent = new Comment(comment.reply_to);\n incompleteCommentIdByParentIds[parent.id] = comment.id;\n data.mapById[parent.id] = parent;\n }\n if (!refresh || !parent.containsReply(comment)) {\n parent.addReply(comment);\n }\n }\n });\n\n if (!_.size(incompleteCommentIdByParentIds)) {\n var deferred = $q.defer();\n deferred.resolve(data);\n return deferred.promise;\n }\n\n var request = {\n query : {\n terms: {\n _id: _.keys(incompleteCommentIdByParentIds)\n }\n },\n sort : [\n // Need desc, because of size+offset (will be sort in 'asc' order later)\n { \"creationTime\" : {\"order\" : \"desc\"}},\n { \"time\" : {\"order\" : \"desc\"}} // for backward compatibility\n ],\n from: 0,\n size: 1000,\n _source: fields.commons\n };\n\n console.debug(\"[ES] [comment] Getting missing comments in tree\");\n return exports.raw.search(request)\n .then(function(res){\n if (!res.hits.total) {\n console.error(\"[ES] [comment] Comments has invalid [reply_to]: \" + _.values(incompleteCommentIdByParentIds).join(','));\n return data;\n }\n\n _.forEach(res.hits.hits, function(hit) {\n var comment = data.mapById[hit._id];\n comment.copyFromJson(hit._source);\n // Parse URL and hashtags\n comment.html = esHttp.util.parseAsHtml(comment.message);\n delete incompleteCommentIdByParentIds[comment.id];\n });\n\n if (_.size(incompleteCommentIdByParentIds)) {\n console.error(\"Comments has invalid [reply_to]: \" + _.values(incompleteCommentIdByParentIds).join(','));\n }\n\n return exports.raw.addTreeLinks(data); // recursive call\n });\n };\n\n exports.raw.loadDataByRecordId = function(recordId, options) {\n options = options || {};\n options.from = options.from || 0;\n options.size = options.size || DEFAULT_SIZE;\n options.loadAvatar = angular.isDefined(options.loadAvatar) ? options.loadAvatar : true;\n options.loadAvatarAllParent = angular.isDefined(options.loadAvatarAllParent) ? (options.loadAvatar && options.loadAvatarAllParent) : false;\n if (options.size < 0) options.size = 1000; // all comments\n\n var request = {\n query : {\n term: { record : recordId}\n },\n sort : [\n // Need desc, because of size+offset (will be sort in 'asc' order later)\n { \"creationTime\" : {\"order\" : \"desc\"}},\n { \"time\" : {\"order\" : \"desc\"}} // for backward compatibility\n ],\n from: options.from,\n size: options.size,\n _source: fields.commons\n };\n\n var data = {\n total: 0,\n mapById: {},\n result: [],\n pendings: {}\n };\n\n // Search comments\n return exports.raw.search(request)\n .then(function(res){\n if (!res.hits.total) return data;\n data.total = res.hits.total;\n data.result = res.hits.hits.reduce(function (result, hit) {\n var comment = new Comment(hit._id, hit._source);\n // Parse URL and hashtags\n comment.html = esHttp.util.parseAsHtml(comment.message);\n // fill map by id\n data.mapById[comment.id] = comment;\n return result.concat(comment);\n }, data.result);\n\n // Add tree (parent/child) link\n return exports.raw.addTreeLinks(data);\n })\n\n // Fill avatars (and uid)\n .then(function() {\n if (!options.loadAvatar) return;\n if (options.loadAvatarAllParent) {\n return csWot.extendAll(_.values(data.mapById), 'issuer');\n }\n return csWot.extendAll(data.result, 'issuer');\n })\n\n // Sort (creationTime asc)\n .then(function() {\n data.result = data.result.sort(function(cm1, cm2) {\n return (cm1.creationTime - cm2.creationTime);\n });\n return data;\n });\n };\n\n // Add listener to send deletion\n exports.raw.createOnDeleteListener = function(data) {\n return function(comment) {\n var index = _.findIndex(data.result, {id: comment.id});\n if (index === -1) return;\n data.result.splice(index, 1);\n delete data.mapById[comment.id];\n\n var wallet = !csWallet.isUserPubkey(comment.issuer) ? csWallet.children.getByPubkey(comment.issuer) : csWallet;\n\n // Send deletion request\n if (wallet) {\n return exports.raw.remove(comment.id)\n .catch(function(err){\n console.error(err);\n throw new Error('COMMENTS.ERROR.FAILED_REMOVE_COMMENT');\n });\n }\n else {\n return $q.reject(\"No wallet found corresponding to the comment issuer\");\n }\n };\n };\n\n exports.raw.startListenChanges = function(recordId, data, scope) {\n data = data || {};\n data.result = data.result || [];\n data.mapById = data.mapById || {};\n data.pendings = data.pendings || {};\n\n scope = scope||$rootScope;\n\n // Add listener to send deletion\n var onRemoveListener = exports.raw.createOnDeleteListener(data);\n _.forEach(data.result, function(comment) {\n comment.addOnRemoveListener(onRemoveListener);\n });\n\n // Open websocket\n var now = Date.now();\n console.info(\"[ES] [comment] Starting websocket to listen comments on [{0}/record/{1}]\".format(index, recordId.substr(0,8)));\n var wsChanges = esHttp.websocket.changes(index + '/comment');\n return wsChanges.open()\n\n // Listen changes\n .then(function(){\n console.debug(\"[ES] [comment] Websocket opened in {0} ms\".format(Date.now() - now));\n wsChanges.on(function(change) {\n if (!change) return;\n scope.$applyAsync(function() {\n var comment = data.mapById[change._id];\n if (change._operation === 'DELETE') {\n if (comment) comment.remove();\n }\n else if (change._source && change._source.record === recordId) {\n // update\n if (comment) {\n comment.copyFromJson(change._source);\n // Parse URL and hashtags\n comment.html = esHttp.util.parseAsHtml(comment.message);\n exports.raw.refreshTreeLinks(data);\n }\n // create (if not in pending comment)\n else if ((!data.pendings || !data.pendings[change._source.creationTime]) && change._source.issuer != csWallet.data.pubkey) {\n comment = new Comment(change._id, change._source);\n comment.addOnRemoveListener(onRemoveListener);\n comment.isnew = true;\n // Parse URL and hashtags\n comment.html = esHttp.util.parseAsHtml(comment.message);\n // fill map by id\n data.mapById[change._id] = comment;\n exports.raw.refreshTreeLinks(data)\n // fill avatars (and uid)\n .then(function() {\n return csWot.extend(comment, 'issuer');\n })\n .then(function() {\n data.result.push(comment);\n });\n }\n else {\n console.debug(\"Skip comment received by WS (already in pending)\");\n }\n }\n });\n });\n });\n };\n\n /**\n * Save a comment (add or update)\n * @param recordId\n * @param data\n * @param comment\n * @returns {*}\n */\n exports.raw.save = function(recordId, data, comment) {\n data = data || {};\n data.result = data.result || [];\n data.mapById = data.mapById || {};\n data.pendings = data.pendings || {};\n\n // Preparing JSON to sent\n var id = comment.id;\n var json = {\n creationTime: id ? comment.creationTime || comment.time/*for compat*/ : moment().utc().unix(),\n message: comment.message,\n record: recordId,\n issuer: csWallet.data.pubkey\n };\n if (comment.reply_to || comment.parent) {\n json.reply_to = comment.reply_to || comment.parent.id;\n }\n else {\n json.reply_to = null; // force to null because ES ignore missing field, when updating\n }\n\n // Create or update the entity\n var entity;\n if (!id) {\n entity = new Comment(null, json);\n entity.addOnRemoveListener(exports.raw.createOnDeleteListener(data));\n // copy additional wallet data\n entity.uid = csWallet.data.uid;\n entity.name = csWallet.data.name;\n entity.avatar = csWallet.data.avatar;\n\n entity.isnew = true;\n if (comment.parent) {\n comment.parent.addReply(entity);\n }\n data.result.push(entity);\n }\n else {\n entity = data.mapById[id];\n entity.copy(comment);\n }\n\n // Parse URL and hashtags\n entity.html = esHttp.util.parseAsHtml(entity.message);\n\n // Send add request\n if (!id) {\n data.pendings = data.pendings || {};\n data.pendings[json.creationTime] = json;\n\n return exports.raw.add(json)\n .then(function (id) {\n entity.id = id;\n data.mapById[id] = entity;\n delete data.pendings[json.creationTime];\n return entity;\n });\n }\n // Send update request\n else {\n return exports.raw.update(json, {id: id})\n .then(function () {\n return entity;\n });\n }\n };\n\n exports.raw.stopListenChanges = function(data) {\n console.debug(\"[ES] [comment] Stopping websocket on comments\");\n _.forEach(data.result, function(comment) {\n comment.cleanAllListeners();\n });\n // Close previous\n exports.raw.wsChanges().close();\n };\n\n // Expose functions\n exports.load = exports.raw.loadDataByRecordId;\n exports.save = exports.raw.save;\n exports.changes = {\n start: exports.raw.startListenChanges,\n stop: exports.raw.stopListenChanges\n };\n return exports;\n }\n\n return {\n instance: EsComment\n };\n }])\n;\n","angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.services', 'cesium.config'])\n\n/**\n * Elastic Search Http\n */\n.factory('esHttp', ['$q', '$timeout', '$rootScope', '$state', '$sce', '$translate', '$window', '$filter', 'CryptoUtils', 'UIUtils', 'csHttp', 'csConfig', 'csSettings', 'csCache', 'BMA', 'csWallet', 'csPlatform', 'Api', function($q, $timeout, $rootScope, $state, $sce, $translate, $window, $filter,\n CryptoUtils, UIUtils, csHttp, csConfig, csSettings, csCache, BMA, csWallet, csPlatform, Api) {\n 'ngInject';\n\n // Allow to force SSL connection with port different from 443\n var forceUseSsl = (csConfig.httpsMode === 'true' || csConfig.httpsMode === true || csConfig.httpsMode === 'force') ||\n ($window.location && $window.location.protocol === 'https:') ? true : false;\n if (forceUseSsl) {\n console.debug('[ES] [https] Enable SSL (forced by config or detected in URL)');\n }\n\n function EsHttp(host, port, useSsl, enableCache) {\n\n var\n that = this,\n cachePrefix = 'esHttp-',\n constants = {\n ES_USER_API: 'ES_USER_API',\n ES_SUBSCRIPTION_API: 'ES_SUBSCRIPTION_API',\n ES_USER_API_ENDPOINT: 'ES_USER_API( ([a-z_][a-z0-9-_.]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))',\n ANY_API_ENDPOINT: '([A-Z_]+)(?:[ ]+([a-z_][a-z0-9-_.ğĞ]*))?(?:[ ]+([0-9.]+))?(?:[ ]+([0-9a-f:]+))?(?:[ ]+([0-9]+))(?:\\\\/[^\\\\/]+)?',\n MAX_UPLOAD_BODY_SIZE: csConfig.plugins && csConfig.plugins.es && csConfig.plugins.es.maxUploadBodySize || 2097152 /*=2M*/\n },\n regexp = {\n IMAGE_SRC: exact('data:([A-Za-z//]+);base64,(.+)'),\n URL: match('(www\\\\.|https?:\\/\\/(www\\\\.)?)[-a-zA-Z0-9@:%._\\\\+~#=]{2,256}\\\\.[a-z]{2,6}\\\\b([-a-zA-Z0-9@:%_\\\\+.~#?&//=]*)'),\n HASH_TAG: match('(?:^|[\\t\\n\\r\\s ])#([0-9_-\\\\wḡĞǦğàáâãäåçèéêëìíîïðòóôõöùúûüýÿ]+)'),\n USER_TAG: match('(?:^|[\\t\\n\\r\\s ])@('+BMA.constants.regexp.USER_ID+')'),\n ES_USER_API_ENDPOINT: exact(constants.ES_USER_API_ENDPOINT),\n API_ENDPOINT: exact(constants.ANY_API_ENDPOINT),\n },\n fallbackNodeIndex = 0,\n listeners,\n defaultSettingsNode,\n truncUrlFilter = $filter('truncUrl');\n\n that.data = {\n isFallback: false\n };\n that.useCache = angular.isDefined(enableCache) ? enableCache : false; // need here because used in get() function\n that.raw = {\n getByPath: {},\n postByPath: {},\n wsByPath: {}\n };\n that.api = new Api(this, \"esHttp\");\n that.started = false;\n that.init = init;\n\n init(host, port, useSsl);\n\n function init(host, port, useSsl) {\n // Use settings as default\n if (!host && csSettings.data) {\n host = host || (csSettings.data.plugins && csSettings.data.plugins.es ? csSettings.data.plugins.es.host : null);\n port = port || (host ? csSettings.data.plugins.es.port : null);\n useSsl = angular.isDefined(useSsl) ? useSsl : (port == 443 || csSettings.data.plugins.es.useSsl || forceUseSsl);\n }\n\n that.alive = false;\n that.host = host;\n that.port = port || ((useSsl || forceUseSsl) ? 443 : 80);\n that.useSsl = angular.isDefined(useSsl) ? useSsl : (that.port == 443 || forceUseSsl);\n\n that.server = csHttp.getServer(host, port);\n }\n\n function isSameNodeAsSettings(data) {\n data = data || csSettings.data;\n if (!data.plugins || !data.plugins.es) return false;\n\n var host = data.plugins.es.host;\n var useSsl = data.plugins.es.port == 443 || data.plugins.es.useSsl || forceUseSsl;\n var port = data.plugins.es.port || (useSsl ? 443 : 80);\n\n return isSameNode(host, port, useSsl);\n }\n\n function isSameNode(host, port, useSsl) {\n return (that.host === host) &&\n (that.port === port) &&\n (angular.isUndefined(useSsl) || useSsl == that.useSsl);\n }\n\n // Say if the ES node is a fallback node or the configured node\n function isFallbackNode() {\n return that.data.isFallback;\n }\n\n // Set fallback flag (e.g. called by ES settings, when resetting settings)\n function setIsFallbackNode(isFallback) {\n that.data.isFallback = isFallback;\n }\n\n function exact(regexpContent) {\n return new RegExp('^' + regexpContent + '$');\n }\n function match(regexpContent) {\n return new RegExp(regexpContent);\n }\n\n function onSettingsReset(data, deferred) {\n deferred = deferred || $q.defer();\n\n if (that.data.isFallback) {\n // Force a restart\n if (that.started) {\n that.stop();\n }\n }\n\n // Reset to default values\n that.data.isFallback = false;\n defaultSettingsNode = null;\n\n deferred.resolve(data);\n return deferred.promise;\n }\n\n that.closeWs = function() {\n\n if (!that.raw) return;\n\n console.warn('[ES] [http] 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 that.cleanCache = function() {\n console.debug(\"[ES] [http] Cleaning cache {prefix: '{0}'}...\".format(cachePrefix));\n csCache.clear(cachePrefix);\n\n that.raw.getByPath = {};\n that.raw.postByPath = {};\n that.raw.wsByPath = {};\n };\n\n that.copy = function(otherNode) {\n if (that.started) that.stop();\n that.init(otherNode.host, otherNode.port, otherNode.useSsl || otherNode.port == 443);\n that.data.isTemporary = false; // reset temporary flag\n return that.start(true /*skipInit*/);\n };\n\n // Get node time (UTC) FIXME: get it from the node\n that.date = { now : csHttp.date.now };\n\n that.byteCount = function (s) {\n s = (typeof s == 'string') ? s : JSON.stringify(s);\n return encodeURI(s).split(/%(?:u[0-9A-F]{2})?[0-9A-F]{2}|./).length - 1;\n };\n\n that.getUrl = function(path) {\n return csHttp.getUrl(that.host, that.port, path, that.useSsl);\n };\n\n that.get = function (path, cacheTime) {\n\n cacheTime = that.useCache && cacheTime;\n var requestKey = path + (cacheTime ? ('#'+cacheTime) : '');\n\n var getRequestFn = function(params) {\n if (!that.started) {\n if (!that._startPromise) {\n console.warn('[ES] [http] Trying to get [{0}] before start(). Waiting...'.format(path));\n }\n return that.ready().then(function(start) {\n if (!start) return $q.reject('ERROR.ES_CONNECTION_ERROR');\n return getRequestFn(params); // loop\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 return request(params);\n };\n\n return getRequestFn;\n };\n\n that.post = function(path) {\n var postRequest = function(obj, params) {\n if (!that.started) {\n if (!that._startPromise) {\n console.error('[ES] [http] Trying to post [{0}] before start()...'.format(path));\n }\n return that.ready().then(function(start) {\n if (!start) return $q.reject('ERROR.ES_CONNECTION_ERROR');\n return postRequest(obj, params); // loop\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 return postRequest;\n };\n\n that.ws = function(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.wsChanges = function(source) {\n var wsChanges = that.ws('/ws/_changes')();\n if (!source) return wsChanges;\n\n // If a source is given, send it just after connection open\n var _inheritedOpen = wsChanges.open;\n wsChanges.open = function() {\n return _inheritedOpen.call(wsChanges).then(function(sock) {\n if(sock) {\n sock.send(source);\n }\n else {\n console.warn('Trying to access ws changes, but no sock anymore... already open ?');\n }\n });\n };\n return wsChanges;\n };\n\n that.isAlive = function() {\n return csHttp.get(that.host, that.port, '/node/summary', that.useSsl)()\n .then(function(json) {\n var software = json && json.duniter && json.duniter.software || 'unknown';\n if (software === \"cesium-plus-pod\" || software === \"duniter4j-elasticsearch\") return true;\n console.error(\"[ES] [http] Not a Cesium+ Pod, but a {0} node. Please check '/node/summary'\".format(software));\n return false;\n })\n .catch(function() {\n return false;\n });\n };\n\n // Alert user if node not reached - fix issue #\n that.checkNodeAlive = function(alive) {\n if (alive) {\n setIsFallbackNode(!isSameNodeAsSettings());\n return true;\n }\n if (angular.isUndefined(alive)) {\n return that.isAlive().then(that.checkNodeAlive);\n }\n\n var settings = csSettings.data.plugins && csSettings.data.plugins.es || {};\n\n // Remember the default node\n defaultSettingsNode = defaultSettingsNode || {\n host: settings.host,\n port: settings.port\n };\n\n var fallbackNode = settings.fallbackNodes && fallbackNodeIndex < settings.fallbackNodes.length && settings.fallbackNodes[fallbackNodeIndex++];\n if (!fallbackNode) {\n $translate('ERROR.ES_CONNECTION_ERROR', {server: that.server})\n .then(UIUtils.alert.info);\n return false; // stop the loop\n }\n var newServer = csHttp.getServer(fallbackNode.host, fallbackNode.port);\n UIUtils.loading.hide();\n return $translate('CONFIRM.ES_USE_FALLBACK_NODE', {old: that.server, new: newServer})\n .then(UIUtils.alert.confirm)\n .then(function (confirm) {\n if (!confirm) return false; // stop the loop\n\n that.cleanCache();\n\n that.init(fallbackNode.host, fallbackNode.port, fallbackNode.useSsl || fallbackNode.port == 443);\n\n // check is alive then loop\n return that.isAlive().then(that.checkNodeAlive);\n });\n };\n\n that.isStarted = function() {\n return that.started;\n };\n\n that.ready = function() {\n if (that.started) return $q.when(true);\n return that._startPromise || that.start();\n };\n\n that.start = function(skipInit) {\n if (that._startPromise) return that._startPromise;\n if (that.started) return $q.when(that.alive);\n\n that._startPromise = csPlatform.ready()\n .then(function() {\n\n if (!skipInit) {\n // Init with defaults settings\n that.init();\n }\n })\n .then(function() {\n console.debug('[ES] [http] Starting on [{0}]{1}...'.format(\n that.server,\n (that.useSsl ? ' (SSL on)' : '')\n ));\n var now = Date.now();\n\n return that.checkNodeAlive()\n .then(function(alive) {\n that.alive = alive;\n if (!alive) {\n console.error('[ES] [http] Could not start [{0}]: node unreachable'.format(that.server));\n that.started = true;\n delete that._startPromise;\n fallbackNodeIndex = 0; // reset the fallback node counter\n return false;\n }\n\n // Add listeners\n addListeners();\n\n console.debug('[ES] [http] Started in '+(Date.now()-now)+'ms');\n that.api.node.raise.start();\n\n that.started = true;\n delete that._startPromise;\n fallbackNodeIndex = 0; // reset the fallback node counter\n\n\n return true;\n });\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('[ES] [http] Stopping...');\n\n removeListeners();\n\n setIsFallbackNode(false); // will be re-computed during start phase\n delete that._startPromise;\n if (that.alive) {\n that.closeWs();\n that.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 };\n\n function parseTagsFromText(value, prefix) {\n prefix = prefix || '#';\n var reg = prefix === '@' ? regexp.USER_TAG : regexp.HASH_TAG;\n var matches = value && reg.exec(value);\n var tags = matches && [];\n while(matches) {\n var tag = matches[1];\n if (!_.contains(tags, tag)) {\n tags.push(tag);\n }\n value = value.substr(matches.index + matches[1].length + 1);\n matches = value.length > 0 && reg.exec(value);\n }\n return tags;\n }\n\n function parseUrlsFromText(value) {\n var matches = value && regexp.URL.exec(value);\n var urls = matches && [];\n while(matches) {\n var url = matches[0];\n if (!_.contains(urls, url)) {\n urls.push(url);\n }\n value = value.substr(matches.index + matches[0].length + 1);\n matches = value && regexp.URL.exec(value);\n }\n return urls;\n }\n\n function parseMarkdownTitlesFromText(value, prefix, suffix) {\n prefix = prefix || '##';\n var reg = match('(?:^|[\\\\r\\\\s])('+prefix+'([^#></]+)' + (suffix||'') + ')');\n var matches = value && reg.exec(value);\n var lines = matches && [];\n var res = matches && [];\n while(matches) {\n var line = matches[1];\n if (!_.contains(lines, line)) {\n lines.push(line);\n res.push({\n line: line,\n title: matches[2]\n });\n }\n value = value.substr(matches.index + matches[1].length + 1);\n matches = value.length > 0 && reg.exec(value);\n }\n return res;\n }\n\n\n function escape(text) {\n if (!text) return text;\n return text.replace(/</g, '<').replace(/>/g, '>');\n }\n\n function parseAsHtml(text, options) {\n\n var content = text ? escape(text.trim()) : undefined;\n if (content) {\n options = options || {};\n options.tagState = options.tagState || 'app.wot_lookup.tab_search';\n options.uidState = options.uidState || 'app.wot_identity_uid';\n if (options.newLine || !angular.isDefined(options.newLine)) {\n content = content.replace(/\\n/g, '<br>\\n');\n }\n\n // Replace URL in description\n var urls = parseUrlsFromText(content);\n _.forEach(urls, function(url){\n // Make sure protocol is defined\n var href = (url.startsWith('http://') || url.startsWith('https://')) ? url : ('http://' + url);\n // Redirect URL to the function 'openLink', to open a new window if need (e.g. desktop app)\n var link = '<a on-tap=\\\"openLink($event, \\'{0}\\')\\\" href=\\\"{1}\\\" target=\"_blank\">{2}</a>'.format(href, href, truncUrlFilter(url));\n content = content.replace(url, link);\n });\n\n // Replace hashtags\n var hashTags = parseTagsFromText(content);\n _.forEach(hashTags, function(tag){\n var link = '<a ui-sref=\\\"{0}({hash: \\'{1}\\'})\\\">#{2}</a>'.format(options.tagState, tag, tag);\n content = content.replace('#'+tag, link);\n });\n\n // Replace user tags\n var userTags = parseTagsFromText(content, '@');\n _.forEach(userTags, function(tag){\n var link = '<a ui-sref=\\\"{0}({uid: \\'{1}\\'})\\\">@{2}</a>'.format(options.uidState, tag, tag);\n content = content.replace('@'+tag, link);\n });\n\n // Replace markdown titles\n var titles = parseMarkdownTitlesFromText(content, '#+[ ]*', '<br>');\n _.forEach(titles, function(matches){\n var size = matches.line.lastIndexOf('#', 5)+1;\n content = content.replace(matches.line, '<h{0}>{1}</h{2}>'.format(size, matches.title, size));\n });\n }\n return content;\n }\n\n function fillRecordTags(record, fieldNames) {\n fieldNames = fieldNames || ['title', 'description'];\n\n record.tags = fieldNames.reduce(function(res, fieldName) {\n var value = record[fieldName];\n var tags = value && parseTagsFromText(value);\n return tags ? res.concat(tags) : res;\n }, []);\n }\n\n function findObjectInTree(obj, attrName) {\n if (!obj) return;\n if (obj[attrName]) return obj[attrName];\n if (Array.isArray(obj)) {\n return obj.reduce(function(res, item) {\n return res ? res : findObjectInTree(item, attrName);\n }, false);\n }\n else if (typeof obj == \"object\") {\n return _.reduce(_.keys(obj), function (res, key) {\n return res ? res : findObjectInTree(obj[key], attrName);\n }, false);\n }\n }\n\n function postRecord(path, options) {\n options = options || {};\n var postRequest = that.post(path);\n return function(record, params) {\n params = params || {};\n var wallet = params.wallet || (params.walletId && csWallet.children.get(params.walletId)) ||\n ((!params.pubkey || csWallet.isUserPubkey(params.pubkey)) && csWallet) ||\n (params.pubkey && csWallet.children.getByPubkey(params.pubkey));\n\n var keypair = params.keypair || wallet && wallet.data && wallet.data.keypair;\n\n if (!keypair && !wallet) {\n throw new Error('Missing wallet or keypair, to sign record');\n }\n\n // Create the POSt request params,\n // but BEFORE, remove protected options\n delete params.wallet;\n delete params.walletId;\n delete params.keypair;\n var postParams = angular.copy(params);\n postParams.pubkey = postParams.pubkey || wallet.data.pubkey;\n\n return (wallet.isAuth() ? $q.when(wallet.data) : wallet.auth({silent: true, minData: true}))\n .then(function() {\n if (params.creationTime && !record.creationTime) {\n record.creationTime = moment().utc().unix();\n }\n // Always update the time - fix #572\n // Make sure time is always > previous (required by ES node)\n var now = moment().utc().unix();\n record.time = (!record.time || record.time < now) ? now : (record.time+1);\n\n var obj = angular.copy(record);\n delete obj.signature;\n delete obj.hash;\n obj.issuer = postParams.pubkey; // force keypair pubkey\n if (!obj.version) {\n obj.version = 2;\n }\n\n // Fill tags\n if (options.tagFields) {\n fillRecordTags(obj, options.tagFields);\n }\n\n // Remove unused fields\n if (options.ignoreFields) {\n _.forEach(options.ignoreFields, function(key) {\n if (angular.isDefined(obj[key])) {\n delete obj[key];\n }\n });\n }\n\n var str = JSON.stringify(obj);\n\n return CryptoUtils.util.hash(str)\n .then(function(hash) {\n return CryptoUtils.sign(hash, keypair)\n .then(function(signature) {\n // Prepend hash+signature\n str = '{\"hash\":\"{0}\",\"signature\":\"{1}\",'.format(hash, signature) + str.substring(1);\n // Send data\n return postRequest(str, postParams)\n .then(function (id){\n\n // Clear cache\n csCache.clear(cachePrefix);\n\n return id;\n })\n .catch(function(err) {\n var bodyLength = that.byteCount(obj);\n if (bodyLength > constants.MAX_UPLOAD_BODY_SIZE) {\n throw {message: 'ERROR.ES_MAX_UPLOAD_BODY_SIZE', length: bodyLength};\n }\n throw err;\n });\n });\n });\n });\n };\n }\n\n function countRecords(index, type, cacheTime) {\n var getRequest = that.get(\"/{0}/{1}/_search?size=0\".format(index, type), cacheTime);\n return function(params) {\n return getRequest(params)\n .then(function(res) {\n return res && res.hits && res.hits.total;\n });\n };\n }\n\n function removeRecord(index, type) {\n return function(id, options) {\n options = options || {};\n var wallet = options.wallet || options.walletId && csWallet.children.get(options.walletId) || csWallet;\n return (wallet.isAuth() ? $q.when(wallet.data) : wallet.auth({silent: true, minData: true}))\n .then(function(walletData) {\n\n var obj = {\n version: 2,\n index: index,\n type: type,\n id: id,\n issuer: walletData.pubkey,\n time: moment().utc().unix()\n };\n var str = JSON.stringify(obj);\n return CryptoUtils.util.hash(str)\n .then(function (hash) {\n return CryptoUtils.sign(hash, walletData.keypair)\n .then(function (signature) {\n // Prepend hash+signature\n str = '{\"hash\":\"{0}\",\"signature\":\"{1}\",'.format(hash, signature) + str.substring(1);\n // Send data\n return that.post('/history/delete')(str)\n .then(function (id) {\n return id;\n });\n });\n });\n });\n };\n }\n\n that.image = {};\n\n function imageFromAttachment(attachment) {\n if (!attachment || !attachment._content_type || !attachment._content || attachment._content.length === 0) {\n return null;\n }\n var image = {\n src: \"data:\" + attachment._content_type + \";base64,\" + attachment._content\n };\n if (attachment._title) {\n image.title = attachment._title;\n }\n if (attachment._name) {\n image.name = attachment._name;\n }\n return image;\n }\n\n function imageToAttachment(image) {\n if (!image || !image.src) return null;\n var match = regexp.IMAGE_SRC.exec(image.src);\n if (!match) return null;\n var attachment = {\n _content_type: match[1],\n _content: match[2]\n };\n if (image.title) {\n attachment._title = image.title;\n }\n if (image.name) {\n attachment._name = image.name;\n }\n return attachment;\n }\n\n /**\n * This will create a image (src, title, name) using the _content is present, or computing a image URL to the ES node\n * @param host\n * @param port\n * @param hit\n * @param imageField\n * @returns {{}}\n */\n that.image.fromHit = function(hit, imageField) {\n if (!hit || !hit._source) return;\n var attachment = hit._source[imageField];\n if (!attachment || !attachment._content_type || !attachment._content_type.startsWith(\"image/\")) return;\n var image = {};\n // If full content: then use it directly\n if (attachment._content) {\n image.src = \"data:\" + attachment._content_type + \";base64,\" + attachment._content;\n }\n // Compute an url\n else {\n var extension = attachment._content_type.substr(6);\n var path = [hit._index, hit._type, hit._id, '_image', imageField].join('/');\n path = '/' + path + '.' + extension;\n image.src = that.getUrl(path);\n }\n if (attachment._title) {\n image.title = attachment._title;\n }\n if (attachment._name) {\n image.name = attachment._name;\n }\n return image;\n };\n\n function parseEndPoint(endpoint) {\n var matches = regexp.API_ENDPOINT.exec(endpoint);\n if (!matches) return;\n return {\n \"api\": matches[1] || '',\n \"dns\": matches[2] || '',\n \"ipv4\": matches[3] || '',\n \"ipv6\": matches[4] || '',\n \"port\": matches[5] || 80,\n \"path\": matches[6] || '',\n \"useSsl\": matches[5] == 443\n };\n }\n\n function emptyHit() {\n return {\n _id: null,\n _index: null,\n _type: null,\n _version: null,\n _source: {}\n };\n }\n\n // Get latest release, of Cesium+ pod\n function getLatestVersion() {\n var getRequest = that.raw.getLatestRelease;\n if (!getRequest) {\n var url = csHttp.uri.parse(csSettings.data.plugins.es.latestReleaseUrl);\n var useSsl = (url.port == 443 || url.protocol === 'https:' || forceUseSsl);\n getRequest = csHttp.getWithCache(url.host, url.port, \"/\" + url.pathname, useSsl, csCache.constants.LONG);\n that.raw.getLatestRelease = getRequest;\n }\n\n return getRequest()\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 function addListeners() {\n // Watch some service events\n listeners = [\n csSettings.api.data.on.reset($rootScope, onSettingsReset, that)\n ];\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n // Define events\n that.api.registerEvent('node', 'start');\n that.api.registerEvent('node', 'stop');\n\n\n var exports = {\n getServer: csHttp.getServer,\n node: {\n summary: that.get('/node/summary'),\n moderators: that.get('/node/moderators'),\n parseEndPoint: parseEndPoint,\n same: isSameNode,\n sameAsSettings: isSameNodeAsSettings,\n isFallback: isFallbackNode\n },\n version: {\n latest: getLatestVersion\n },\n websocket: {\n changes: that.wsChanges,\n block: that.ws('/ws/block'),\n peer: that.ws('/ws/peer')\n },\n wot: {\n member: {\n uids : that.get('/wot/members')\n }\n },\n network: {\n peering: {\n self: that.get('/network/peering')\n },\n peers: that.get('/network/peers')\n },\n blockchain: {\n current: that.get('/blockchain/current?_source=number,hash,medianTime')\n },\n record: {\n post: postRecord,\n remove: removeRecord,\n count : countRecords\n },\n image: {\n fromAttachment: imageFromAttachment,\n toAttachment: imageToAttachment\n },\n hit: {\n empty: emptyHit\n },\n util: {\n parseTags: parseTagsFromText,\n parseAsHtml: parseAsHtml,\n findObjectInTree: findObjectInTree\n },\n constants: constants\n };\n exports.constants.regexp = regexp;\n angular.merge(that, exports);\n }\n\n\n var service = new EsHttp(undefined, undefined, undefined, true);\n\n service.instance = function(host, port, useSsl, enableCache) {\n return new EsHttp(host, port, useSsl, enableCache);\n };\n\n service.lightInstance = function(host, port, useSsl, timeout) {\n port = port || 80;\n useSsl = angular.isDefined(useSsl) ? useSsl : (+port === 443);\n\n function countHits(path, params) {\n return csHttp.get(host, port, path)(params)\n .then(function(res) {\n return res && res.hits && res.hits.total;\n });\n }\n\n function countRecords(index, type) {\n return countHits(\"/{0}/{1}/_search?size=0\".format(index, type));\n }\n\n function countSubscriptions(params) {\n var queryString = _.keys(params||{}).reduce(function(res, key) {\n return (res && (res + \" AND \") || \"\") + key + \":\" + params[key];\n }, '');\n return countHits(\"/subscription/record/_search?size=0&q=\" + queryString);\n }\n\n return {\n host: host,\n port: port,\n useSsl: useSsl,\n node: {\n summary: csHttp.getWithCache(host, port, '/node/summary', useSsl, csHttp.cache.LONG, false, 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?_source=number,hash,medianTime', useSsl, timeout)\n },\n record: {\n count: countRecords\n },\n subscription: {\n count: countSubscriptions\n }\n };\n };\n\n return service;\n}])\n;\n","angular.module('cesium.es.settings.services', ['cesium.services', 'cesium.es.http.services'])\n.config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esSettings');\n }\n\n }])\n\n.factory('esSettings', ['$rootScope', '$q', '$timeout', 'Api', 'esHttp', 'csConfig', 'csSettings', 'CryptoUtils', 'Device', 'UIUtils', 'csWallet', function($rootScope, $q, $timeout, Api, esHttp,\n csConfig, csSettings, CryptoUtils, Device, UIUtils, csWallet) {\n 'ngInject';\n\n var\n SETTINGS_SAVE_SPEC = {\n includes: ['locale', 'showUDHistory', 'useRelative', 'useLocalStorage', 'useLocalStorageEncryption', 'expertMode', 'logoutIdle', 'blockValidityWindow'],\n excludes: ['timeout', 'cacheTimeMs', 'version', 'build', 'minVersion', 'fallbackLanguage'],\n plugins: {\n es: {\n excludes: ['enable', 'host', 'port', 'useSsl', 'fallbackNodes', 'enableGoogleApi', 'googleApiKey', 'document', 'maxUploadBodySize', 'defaultCountry'],\n notifications: {\n }\n }\n },\n wallet: {\n includes: ['alertIfUnusedWallet'],\n excludes: ['notificationReadTime'] // deprecated - should be removed later\n },\n helptip: {\n excludes: ['installDocUrl']\n },\n notifications: {\n excludes: ['time', 'warnCount', 'unreadCount']\n }\n },\n defaultSettings = angular.merge({\n plugins: {\n es: {\n askEnable: false,\n useRemoteStorage: true,\n latestReleaseUrl: \"https://api.github.com/repos/duniter/cesium-plus-pod/releases/latest\",\n notifications: {\n txSent: true,\n txReceived: true,\n certSent: true,\n certReceived: true,\n emitHtml5: false\n },\n invitations: {\n readTime: true\n },\n defaultCountry: undefined,\n enableGoogleApi: false,\n googleApiKey: undefined,\n wot: {\n enableMixedSearch: true\n },\n document: {\n index: 'user,page,group',\n type: 'profile,record,comment'\n },\n registry: {\n defaultSearch: {\n location: null,\n geoPoint: null\n }\n },\n geoDistance: '20km'\n }\n }\n }, {plugins: {es: csConfig.plugins && csConfig.plugins.es || {}}}),\n that = this,\n api = new Api('esSettings'),\n previousRemoteData,\n listeners,\n ignoreSettingsChanged = false,\n failEnable = false\n ;\n\n that.api = api;\n that.get = esHttp.get('/user/settings/:id');\n that.add = esHttp.record.post('/user/settings');\n that.update = esHttp.record.post('/user/settings/:id/_update');\n\n that.isEnable = function() {\n return csSettings.data.plugins &&\n csSettings.data.plugins.es &&\n csSettings.data.plugins.es.enable &&\n !!csSettings.data.plugins.es.host;\n };\n\n that.notifications = {};\n that.notifications.isEmitHtml5Enable = function() {\n return that.isEnable() &&\n csSettings.data.plugins.es.notifications &&\n angular.isDefined(csSettings.data.plugins.es.notifications.emitHtml5) ? csSettings.data.plugins.es.notifications.emitHtml5 : false;\n };\n\n that.wot = {};\n that.wot.isMixedSearchEnable = function() {\n return that.isEnable() &&\n (angular.isDefined(csSettings.data.plugins.es.wot && csSettings.data.plugins.es.wot.enableMixedSearch) ?\n csSettings.data.plugins.es.wot.enableMixedSearch : true);\n };\n\n function copyUsingSpec(data, copySpec) {\n var result = {};\n\n // Add implicit includes\n if (copySpec.includes) {\n _.forEach(_.keys(copySpec), function(key) {\n if (key != \"includes\" && key != \"excludes\") {\n copySpec.includes.push(key);\n }\n });\n }\n\n _.forEach(_.keys(data), function(key) {\n if ((!copySpec.includes || _.contains(copySpec.includes, key)) &&\n (!copySpec.excludes || !_.contains(copySpec.excludes, key))) {\n if (data[key] && (typeof data[key] == 'object') &&\n copySpec[key] && (typeof copySpec[key] == 'object')) {\n result[key] = copyUsingSpec(data[key], copySpec[key]);\n }\n else {\n result[key] = data[key];\n }\n }\n });\n return result;\n }\n\n // Load settings\n function loadSettings(pubkey, boxKeypair) {\n var now = Date.now();\n return that.get({id: pubkey})\n .catch(function(err){\n if (err && err.ucode && err.ucode == 404) {\n return null; // not found\n }\n else {\n throw err;\n }\n })\n .then(function(res) {\n if (!res || !res._source) {\n return;\n }\n var record = res._source;\n // Do not apply if same version\n if (record.time === csSettings.data.time) {\n console.debug('[ES] [settings] Loaded in '+ (Date.now()-now) +'ms, but already up to date');\n return;\n }\n var nonce = CryptoUtils.util.decode_base58(record.nonce);\n // Decrypt settings content\n return CryptoUtils.box.open(record.content, nonce, boxKeypair.boxPk, boxKeypair.boxSk)\n .then(function(json) {\n var settings = JSON.parse(json || '{}');\n settings.time = record.time;\n console.debug('[ES] [settings] Loaded and decrypted in '+ (Date.now()-now) +'ms');\n return settings;\n })\n // if error: skip stored content\n .catch(function(err){\n console.error('[ES] [settings] Could not load remote settings: ' + (err && err.message || 'decryption error'));\n // make sure to remove time, to be able to save it again\n delete csSettings.data.time;\n return null;\n });\n });\n }\n\n function onSettingsReset(data, deferred) {\n deferred = deferred || $q.defer();\n angular.merge(data, defaultSettings);\n\n failEnable = false;\n deferred.resolve(data);\n return deferred.promise;\n }\n\n function onWalletAuth(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey || !data.keypair || !data.keypair.signSk || !data.keypair.boxSk) {\n deferred.resolve();\n return deferred.promise;\n }\n\n console.debug('[ES] [settings] Loading user settings...');\n\n // Load settings\n loadSettings(data.pubkey, data.keypair)\n .then(function(settings) {\n if (!settings) return; // not found or up to date\n angular.merge(csSettings.data, settings);\n\n // Remember for comparison\n previousRemoteData = settings;\n\n console.debug('[ES] [settings] Applied');\n return storeSettingsLocally();\n })\n .then(function() {\n deferred.resolve(data);\n })\n .catch(function(err){\n deferred.reject(err);\n });\n\n return deferred.promise;\n }\n\n // Listen for settings changed\n function onSettingsChanged(data) {\n // avoid recursive call, because storeSettingsLocally() could emit event again\n if (ignoreSettingsChanged) return;\n\n var wasEnable = listeners && listeners.length > 0;\n\n // Force to stop & restart, if ES node has changed\n if (esHttp.isStarted() && !esHttp.node.isFallback() && !esHttp.node.sameAsSettings(data)) {\n stop();\n }\n\n refreshState();\n\n var isEnable = that.isEnable();\n if (isEnable && csWallet.isAuth()) {\n if (!wasEnable) {\n onWalletAuth(csWallet.data);\n }\n else {\n storeSettingsRemotely(data);\n }\n }\n }\n\n function storeSettingsLocally() {\n if (ignoreSettingsChanged) return $q.when();\n ignoreSettingsChanged = true;\n return csSettings.store()\n .then(function(){\n ignoreSettingsChanged = false;\n })\n .catch(function(err) {\n ignoreSettingsChanged = false;\n throw err;\n });\n }\n\n function storeSettingsRemotely(data) {\n var filteredData = copyUsingSpec(data, SETTINGS_SAVE_SPEC);\n if (previousRemoteData && angular.equals(filteredData, previousRemoteData)) {\n return $q.when();\n }\n\n // Skip remote saving, if remote storage disable\n if (!csSettings.data.plugins.es.useRemoteStorage) {\n return storeSettingsLocally();\n }\n\n var time = moment().utc().unix(); // always update time\n console.debug('[ES] [settings] Saving user settings remotely...');\n\n return $q.all([\n csWallet.getKeypair(), // same result as esWallet.box.getKeypair(), because box keypair computed on auth\n CryptoUtils.util.random_nonce()\n ])\n .then(function(res) {\n var boxKeypair = res[0];\n var nonce = res[1];\n\n // Make sure user has not disconnect\n // This can occur, when auth + disabling ES plugin in settings\n if (!boxKeypair.boxPk || !boxKeypair.boxSk) return;\n\n var record = {\n issuer: csWallet.data.pubkey,\n nonce: CryptoUtils.util.encode_base58(nonce),\n time: time\n };\n\n //console.debug(\"Will store settings remotely: \", filteredData);\n var json = JSON.stringify(filteredData);\n\n return CryptoUtils.box.pack(json, nonce, boxKeypair.boxPk, boxKeypair.boxSk)\n .then(function(cypherText) {\n record.content = cypherText;\n // create or update\n return angular.isUndefined(data.time) ?\n that.add(record) :\n that.update(record, {id: record.issuer})\n .catch(function(err) {\n // Workaround if update failed: try to add() instead\n // Can occur when changing the cesium+ pod\n if (err && err.ucode == 404) return that.add(record);\n throw err;\n });\n })\n .then(function() {\n return true;\n });\n })\n .then(function(saved) {\n if (!saved) return;\n // Update settings version, then store (on local store only)\n data.time = time;\n previousRemoteData = filteredData;\n console.debug('[ES] [settings] Saved user settings remotely in ' + (moment().utc().unix() - time) + 'ms');\n return storeSettingsLocally();\n })\n .catch(function(err) {\n console.error(err);\n throw err;\n })\n ;\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Extend csWallet.login()\n listeners = [\n csSettings.api.data.on.reset($rootScope, onSettingsReset, this),\n csWallet.api.data.on.auth($rootScope, onWalletAuth, this)\n ];\n }\n\n function stop() {\n removeListeners();\n esHttp.stop();\n }\n\n function refreshState() {\n var enable = that.isEnable();\n\n // Disable\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [settings] Disable\");\n removeListeners();\n\n // Force ES node to stop\n return esHttp.stop()\n .then(function() {\n // Emit event\n api.state.raise.changed(enable);\n });\n }\n\n // Enable\n else if (enable && (!listeners || listeners.length === 0 || !esHttp.isStarted()) ) {\n return esHttp.start()\n .then(function(alive) {\n if (!alive) {\n csSettings.data.plugins.es.enable = false;\n // Will ask user to enable ES plugins (WARN: if config.js allow it)\n csSettings.data.plugins.es.askEnable = true;\n failEnable = true;\n\n api.state.raise.changed(false);\n console.error('[ES] [settings] Disable, has ES node could not be started');\n return;\n }\n console.debug(\"[ES] [settings] Enable\");\n addListeners();\n\n if (csWallet.isAuth()) {\n return onWalletAuth(csWallet.data)\n .then(function() {\n // Emit event\n api.state.raise.changed(enable);\n });\n }\n else {\n // Emit event\n api.state.raise.changed(enable);\n }\n });\n }\n }\n\n api.registerEvent('state', 'changed');\n\n csSettings.ready().then(function() {\n\n csSettings.api.data.on.changed($rootScope, onSettingsChanged, this);\n esHttp.api.node.on.stop($rootScope, function() {\n previousRemoteData = null;\n }, this);\n return refreshState();\n })\n\n .then(function() {\n // Ask (once) user to enable ES plugin\n if (!failEnable && // If NOT trying to start just before\n csConfig.plugins && csConfig.plugins.es && csConfig.plugins.es.askEnable && // AND if config ask enable\n !that.isEnable() && // AND user settings has disable plugin\n csSettings.data.plugins.es.askEnable // AND user has not yet answer 'NO'\n ) {\n\n return UIUtils.alert.confirm('ES_SETTINGS.CONFIRM.ASK_ENABLE', 'ES_SETTINGS.CONFIRM.ASK_ENABLE_TITLE',\n {\n cancelText: 'COMMON.BTN_NO',\n okText: 'COMMON.BTN_YES'\n })\n .then(function (confirm) {\n if (confirm) {\n csSettings.data.plugins.es.enable = true;\n }\n csSettings.data.plugins.es.askEnable = false;\n return csSettings.store();\n });\n }\n });\n\n return that;\n}]);\n","angular.module('cesium.es.registry.services', ['ngResource', 'cesium.services', 'cesium.es.http.services', 'cesium.es.like.services'])\n.config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esRegistry');\n }\n\n}])\n\n.factory('esRegistry', ['$rootScope', '$q', 'csPlatform', 'csSettings', 'csWallet', 'csWot', 'esHttp', 'esComment', 'esLike', 'esGeo', function($rootScope, $q, csPlatform, csSettings, csWallet, csWot, esHttp, esComment, esLike, esGeo) {\n 'ngInject';\n\n var\n fields = {\n commons: [\"title\", \"description\", \"issuer\", \"time\", \"address\", \"city\", \"creationTime\", \"avatar._content_type\",\n \"picturesCount\", \"type\", \"category\", \"socials\", \"pubkey\",\n \"geoPoint\"\n ]\n },\n that = this,\n listeners;\n\n that.raw = {\n count: esHttp.get('/page/record/_search?size=0&q=issuer::pubkey'),\n searchText: esHttp.get('/page/record/_search?q=:search'),\n search: esHttp.post('/page/record/_search'),\n get: esHttp.get('/page/record/:id'),\n getCommons: esHttp.get('/page/record/:id?_source=' + fields.commons.join(',')),\n category: {\n get: esHttp.get('/page/category/:id'),\n all: esHttp.get('/page/category/_search?sort=order&from=0&size=1000&_source=name,parent')\n }\n };\n\n function onWalletReset(data) {\n data.pages = null;\n }\n\n function onWalletLoad(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey || !data.keypair) {\n deferred.resolve();\n return deferred.promise;\n }\n\n console.debug('[ES] [registry] Loading pages count...');\n\n // Load subscriptions count\n that.raw.count({pubkey: data.pubkey})\n .then(function(res) {\n data.pages = data.pages || {};\n data.pages.count = res && res.hits && res.hits.total;\n console.debug('[ES] [registry] Loaded pages count (' + data.pages.count + ')');\n deferred.resolve(data);\n })\n .catch(function(err) {\n console.error('[ES] [registry] Error while counting page: ' + (err.message ? err.message : err));\n deferred.resolve(data);\n });\n\n return deferred.promise;\n }\n\n function getCategories() {\n if (that.raw.categories && that.raw.categories.length) {\n var deferred = $q.defer();\n deferred.resolve(that.raw.categories);\n return deferred.promise;\n }\n return that.raw.category.all()\n .then(function(res) {\n if (res.hits.total === 0) {\n that.raw.categories = [];\n }\n else {\n var categories = res.hits.hits.reduce(function(result, hit) {\n var cat = hit._source;\n cat.id = hit._id;\n return result.concat(cat);\n }, []);\n // add as map also\n _.forEach(categories, function(cat) {\n categories[cat.id] = cat;\n });\n that.raw.categories = categories;\n }\n return that.raw.categories;\n });\n }\n\n function getCategory(params) {\n return that.raw.category.get(params)\n .then(function(hit) {\n var res = hit._source;\n res.id = hit._id;\n return res;\n });\n }\n\n function readRecordFromHit(hit, categories) {\n if (!hit) return;\n var record = hit._source;\n if (record.category && record.category.id) {\n record.category = categories[record.category.id];\n }\n if (hit.highlight) {\n if (hit.highlight.title) {\n record.title = hit.highlight.title[0];\n }\n if (hit.highlight.description) {\n record.description = hit.highlight.description[0];\n }\n if (hit.highlight.location) {\n record.location = hit.highlight.location[0];\n }\n if (hit.highlight.tags) {\n record.tags = hit.highlight.tags.reduce(function(res, tag){\n return res.concat(tag.replace('<em>', '').replace('</em>', ''));\n },[]);\n }\n }\n\n // avatar\n record.avatar = esHttp.image.fromHit(hit, 'avatar');\n\n // pictures\n if (hit._source.pictures && hit._source.pictures.reduce) {\n record.pictures = hit._source.pictures.reduce(function(res, pic) {\n return res.concat(esHttp.image.fromAttachment(pic.file));\n }, []);\n }\n\n return record;\n }\n\n\n function search(request) {\n request = request || {};\n request.from = request.from || 0;\n request.size = request.size || 20;\n request._source = request._source || fields.commons;\n request.highlight = request.highlight || {\n fields : {\n title : {},\n description : {}\n }\n };\n\n return $q.all([\n // load categories\n getCategories(),\n // Do search\n that.raw.search(request)\n ])\n .then(function(res) {\n var categories = res[0];\n res = res[1];\n\n if (!res || !res.hits || !res.hits.total) {\n return {\n total: 0,\n hits: []\n };\n }\n\n // Get geo_distance filter\n var geoDistanceObj = esHttp.util.findObjectInTree(request.query, 'geo_distance');\n var geoPoint = geoDistanceObj && geoDistanceObj.geoPoint;\n var geoDistanceUnit = geoDistanceObj && geoDistanceObj.distance && geoDistanceObj.distance.replace(new RegExp(\"[0-9 ]+\", \"gm\"), '');\n\n var hits = res.hits.hits.reduce(function(result, hit) {\n var record = readRecordFromHit(hit, categories);\n record.id = hit._id;\n\n // Add distance to point\n if (geoPoint && record.geoPoint && geoDistanceUnit) {\n record.distance = esGeo.point.distance(\n geoPoint.lat, geoPoint.lon,\n record.geoPoint.lat, record.geoPoint.lon,\n geoDistanceUnit\n );\n }\n return result.concat(record);\n }, []);\n\n return {\n total: res.hits.total,\n hits: hits\n };\n });\n }\n\n function loadData(id, options) {\n options = options || {};\n options.raw = angular.isDefined(options.raw) ? options.raw : false;\n options.fecthPictures = angular.isDefined(options.fetchPictures) ? options.fetchPictures : options.raw;\n\n return $q.all([\n\n // load categories\n getCategories(),\n\n // Do get source\n options.fecthPictures ?\n that.raw.get({id: id}) :\n that.raw.getCommons({id: id})\n ])\n .then(function(res) {\n var categories = res[0];\n var hit = res[1];\n var record = readRecordFromHit(hit, categories);\n\n // parse description as Html\n if (!options.raw) {\n record.description = esHttp.util.parseAsHtml(record.description, {\n tagState: 'app.wot_lookup.tab_registry'\n });\n }\n\n // Load issuer (avatar, name, uid, etc.)\n return csWot.extend({pubkey: record.issuer})\n .then(function(issuer) {\n return {\n id: hit._id,\n issuer: issuer,\n record: record\n };\n });\n });\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Extend\n listeners = [\n csWallet.api.data.on.load($rootScope, onWalletLoad, this),\n csWallet.api.data.on.init($rootScope, onWalletReset, this),\n csWallet.api.data.on.reset($rootScope, onWalletReset, this)\n ];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [subscription] Disable\");\n removeListeners();\n if (csWallet.isLogin()) {\n return onWalletReset(csWallet.data);\n }\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [subscription] Enable\");\n addListeners();\n if (csWallet.isLogin()) {\n return onWalletLoad(csWallet.data);\n }\n }\n }\n\n // Default actions\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n that.category = {\n all: getCategories,\n get: getCategory\n };\n that.record = {\n search: search,\n load: loadData,\n add: esHttp.record.post('/page/record', {tagFields: ['title', 'description'], creationTime: true}),\n update: esHttp.record.post('/page/record/:id/_update', {tagFields: ['title', 'description']}),\n remove: esHttp.record.remove('page', 'record'),\n fields: {\n commons: fields.commons\n },\n picture: {\n all: esHttp.get('/page/record/:id?_source=pictures')\n },\n like: esLike.instance('page', 'record'),\n comment: esComment.instance('page')\n };\n that.currency = {\n all: esHttp.get('/currency/record/_search?_source=currencyName,peers.host,peers.port'),\n get: esHttp.get('/currency/record/:id/_source')\n };\n return that;\n}])\n;\n","angular.module('cesium.es.social.services', ['cesium.es.crypto.services'])\n\n .factory('SocialUtils', ['$filter', '$q', 'CryptoUtils', 'BMA', 'csWallet', 'esCrypto', '$timeout', function($filter, $q, CryptoUtils, BMA, csWallet, esCrypto, $timeout) {\n 'ngInject';\n\n function SocialUtils() {\n\n var\n regexp = {\n URI: \"([a-zA−Z0-9]+)://[ a-zA-Z0-9-_:/;*?!^\\\\+=@&~#|<>%.]+\",\n EMAIL: \"[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 PHONE: \"[+]?[0-9. ]{9,15}\",\n socials: {\n facebook: \"https?://((fb.me)|((www.)?facebook.com))\",\n twitter: \"https?://(www.)?twitter.com\",\n googleplus: \"https?://plus.google.com(/u)?\",\n youtube: \"https?://(www.)?youtube.com\",\n github: \"https?://(www.)?github.com\",\n tumblr: \"https?://(www.)?tumblr.com\",\n snapchat: \"https?://(www.)?snapchat.com\",\n linkedin: \"https?://(www.)?linkedin.com\",\n vimeo: \"https?://(www.)?vimeo.com\",\n instagram: \"https?://(www.)?instagram.com\",\n wordpress: \"https?://([a-z]+)?wordpress.com\",\n diaspora: \"https?://(www.)?((diaspora[-a-z]+)|(framasphere)).org\",\n duniter: \"duniter://[a-zA-Z0-9-_:/;*?!^\\\\+=@&~#|<>%.]+\",\n bitcoin: \"bitcoin://[a-zA-Z0-9-_:/;*?!^\\\\+=@&~#|<>%.]+\",\n curve25519: \"curve25519://(\" + BMA.constants.regexp.PUBKEY + \"):([a-zA-Z0-9]+)@([a-zA-Z0-9-_:/;*?!^\\\\+=@&~#|<>%.]+)\"\n }\n }\n ;\n\n function exact(regexpContent) {\n return new RegExp(\"^\" + regexpContent + \"$\");\n }\n\n regexp.URI = exact(regexp.URI);\n regexp.EMAIL = exact(regexp.EMAIL);\n regexp.PHONE = exact(regexp.PHONE);\n _.keys(regexp.socials).forEach(function(key){\n regexp.socials[key] = exact(regexp.socials[key]);\n });\n\n function getTypeFromUrl(url){\n var type;\n if (regexp.URI.test(url)) {\n var protocol = regexp.URI.exec(url)[1];\n var urlToMatch = url;\n if (protocol == 'http' || protocol == 'https') {\n var slashPathIndex = url.indexOf('/', protocol.length + 3);\n if (slashPathIndex > 0) {\n urlToMatch = url.substring(0, slashPathIndex);\n }\n }\n //console.debug(\"match URI, try to match: \" + urlToMatch);\n _.keys(regexp.socials).forEach(function(key){\n if (regexp.socials[key].test(urlToMatch)) {\n type = key;\n return false; // stop\n }\n });\n if (!type) {\n type = 'web';\n }\n }\n else if (regexp.EMAIL.test(url)) {\n type = 'email';\n }\n else if (regexp.PHONE.test(url)) {\n type = 'phone';\n }\n if (!type) {\n console.warn(\"[ES] [social] Unable to detect type of social URL: \" + url);\n }\n return type;\n }\n\n function getFromUrl(url) {\n url = url ? url.trim() : url;\n if (url && url.length > 0) {\n if (url.startsWith('www.')) {\n url = 'http://' + url;\n }\n return {\n type: getTypeFromUrl(url),\n url: url\n };\n }\n return;\n }\n\n function reduceArray(socials) {\n if (!socials || !socials.length) return [];\n var map = {};\n socials.forEach(function(social) {\n if (social.type == 'curve25519') {\n delete social.issuer;\n if (social.valid) {\n angular.merge(social, getFromUrl(social.url));\n }\n }\n else {\n // Retrieve object from URL, to get the right type (e.g. if new regexp)\n social = getFromUrl(social.url);\n }\n if (social) {\n var id = $filter('formatSlug')(social.url);\n map[id] = social;\n }\n });\n return _.values(map);\n }\n\n function createSocialForEncryption(recipient, dataToEncrypt) {\n return {\n recipient: recipient,\n type: 'curve25519',\n url: dataToEncrypt\n };\n }\n\n function openArray(socials, issuer, recipient) {\n\n recipient = recipient || csWallet.data.pubkey;\n\n // Waiting to load crypto libs\n if (!CryptoUtils.isLoaded()) {\n console.debug('[socials] Waiting crypto lib loading...');\n return $timeout(function() {\n return openArray(socials, issuer, recipient);\n }, 100);\n }\n\n var socialsToDecrypt = _.filter(socials||[], function(social){\n var matches = social.url && social.type == 'curve25519' && regexp.socials.curve25519.exec(social.url);\n if (!matches) return false;\n social.recipient = matches[1];\n social.nonce = matches[2];\n social.url = matches[3];\n social.issuer = issuer;\n social.valid = (social.recipient === recipient);\n return social.valid;\n });\n if (!socialsToDecrypt.length) return $q.when(reduceArray(socials));\n\n return esCrypto.box.open(socialsToDecrypt, undefined/*=wallet keypair*/, 'issuer', 'url')\n .then(function() {\n // return all socials (encrypted or not)\n return reduceArray(socials);\n });\n }\n\n function packArray(socials) {\n // Waiting to load crypto libs\n if (!CryptoUtils.isLoaded()) {\n console.debug('[socials] Waiting crypto lib loading...');\n return $timeout(function() {\n return packArray(socials);\n }, 100);\n }\n\n var socialsToEncrypt = _.filter(socials||[], function(social){\n return social.type == 'curve25519' && social.url && social.recipient;\n });\n if (!socialsToEncrypt.length) return $q.when(socials);\n\n return CryptoUtils.util.random_nonce()\n .then(function(nonce) {\n return $q.all(socialsToEncrypt.reduce(function(res, social) {\n return res.concat(esCrypto.box.pack(social, undefined/*=wallet keypair*/, 'recipient', 'url', nonce));\n }, []));\n })\n .then(function(res){\n return res.reduce(function(res, social) {\n return res.concat({\n type: 'curve25519',\n url: 'curve25519://{0}:{1}@{2}'.format(social.recipient, social.nonce, social.url)\n });\n }, []);\n });\n }\n\n return {\n get: getFromUrl,\n reduce: reduceArray,\n // Encryption\n createForEncryption: createSocialForEncryption,\n open: openArray,\n pack: packArray\n };\n }\n\n var service = SocialUtils();\n service.instance = SocialUtils;\n\n return service;\n }])\n;\n","angular.module('cesium.es.crypto.services', ['ngResource', 'cesium.services'])\n\n.factory('esCrypto', ['$q', '$rootScope', 'CryptoUtils', function($q, $rootScope, CryptoUtils) {\n 'ngInject';\n\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 // exports\n return {\n box: {\n getKeypair: getBoxKeypair,\n pack: packRecordFields,\n open: openRecordFields\n }\n };\n}])\n;\n","angular.module('cesium.es.profile.services', ['cesium.services', 'cesium.es.http.services', 'cesium.es.like.services'])\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esProfile');\n }\n\n }])\n\n .factory('esProfile', ['$rootScope', '$q', 'esHttp', 'SocialUtils', 'csWot', 'csWallet', 'csCache', 'csPlatform', 'esSettings', 'esLike', function($rootScope, $q, esHttp, SocialUtils, csWot, csWallet, csCache, csPlatform, esSettings, esLike) {\n 'ngInject';\n\n var\n that = this,\n listeners;\n\n that.raw = {\n getFields: esHttp.get('/user/profile/:id?&_source_exclude=avatar._content&_source=:fields'),\n get: esHttp.get('/user/profile/:id?&_source_exclude=avatar._content', csCache.constants.MEDIUM),\n getAll: esHttp.get('/user/profile/:id', csCache.constants.MEDIUM),\n search: esHttp.post('/user/profile/_search', csCache.constants.MEDIUM),\n mixedSearch: esHttp.post('/user,page,group/profile,record/_search', csCache.constants.MEDIUM),\n remove: esHttp.record.remove(\"user\",\"profile\")\n };\n\n function getAvatarAndName(pubkey) {\n return that.raw.getFields({id: pubkey, fields: 'title,avatar._content_type'})\n .then(function(res) {\n var profile;\n if (res && res._source) {\n // name\n profile = {name: res._source.title};\n // avatar\n profile.avatar = esHttp.image.fromHit(res, 'avatar');\n }\n return profile;\n })\n .catch(function(err){\n // no profile defined\n if (err && err.ucode && err.ucode == 404) {\n return null;\n }\n else {\n throw err;\n }\n });\n }\n\n function getProfile(pubkey, options) {\n options = options || {};\n\n var get = options.raw ? that.raw.getAll : that.raw.get;\n return get({id: pubkey})\n .then(function(res) {\n if (!res || !res.found || !res._source) return undefined;\n\n var profile = {\n name: res._source.title,\n source: res._source\n };\n\n // Avoid too long name (workaround for #308)\n if (profile.name && profile.name.length > 30) {\n profile.name = profile.name.substr(0, 27) + '...';\n }\n\n // avatar\n profile.avatar = esHttp.image.fromHit(res, 'avatar');\n\n // convert description into html\n if (!options.raw && profile.source.description) {\n profile.descriptionHtml = esHttp.util.parseAsHtml(profile.source.description);\n }\n\n // Social url must be unique in socials links - Workaround for issue #306:\n if (profile.source.socials && profile.source.socials.length) {\n profile.source.socials = _.uniq(profile.source.socials, false, function (social) {\n return social.url;\n });\n }\n\n if (!csWallet.isLogin()) {\n // Exclude encrypted socials items\n profile.source.socials = _.filter(profile.source.socials, function(social) {\n return social.type !== 'curve25519';\n });\n }\n else {\n // decrypt socials (if login)\n return SocialUtils.open(profile.source.socials, pubkey)\n .then(function(){\n // Exclude invalid decrypted socials\n //console.debug(profile.source.socials);\n //profile.source.socials = _.where(profile.source.socials, {valid: true});\n\n return profile;\n });\n }\n\n return profile;\n })\n .catch(function(err){\n // no profile defined\n if (err && err.ucode && err.ucode == 404) {\n return null;\n }\n else {\n throw err;\n }\n });\n }\n\n function fillAvatars(datas, pubkeyAtributeName) {\n return onWotSearch(null, datas, pubkeyAtributeName);\n }\n\n function _fillSearchResultFromHit(data, hit, avatarFieldName) {\n data.avatar = data.avatar || esHttp.image.fromHit(hit, avatarFieldName||'avatar');\n // name (basic or highlighted)\n data.name = hit._source.title;\n // Avoid too long name (workaround for #308)\n if (data.name && data.name.length > 30) {\n data.name = data.name.substr(0, 27) + '...';\n }\n data.description = hit._source.description || data.description;\n data.city = hit._source.city || data.city;\n\n if (hit.highlight) {\n if (hit.highlight.title) {\n data.name = hit.highlight.title[0];\n }\n if (hit.highlight.tags) {\n data.tags = hit.highlight.tags.reduce(function(res, tag){\n return res.concat(tag.replace('<em>', '').replace('</em>', ''));\n },[]);\n }\n }\n }\n\n function onWotSearch(text, datas, pubkeyAtributeName, deferred) {\n deferred = deferred || $q.defer();\n if (!text && (!datas || !datas.length)) {\n deferred.resolve(datas);\n return deferred.promise;\n }\n\n pubkeyAtributeName = pubkeyAtributeName || 'pubkey';\n text = text ? text.toLowerCase().trim() : text;\n var dataByPubkey;\n var tags = text ? esHttp.util.parseTags(text) : undefined;\n var request = {\n query: {},\n highlight: {fields : {title : {}, tags: {}}},\n from: 0,\n size: 100,\n _source: [\"title\", \"avatar._content_type\"]\n };\n\n var mixedSearch = text && esSettings.wot.isMixedSearchEnable();\n if (mixedSearch) {\n request._source = request._source.concat([\"description\", \"city\", \"creationTime\", \"membersCount\", \"type\"]);\n console.debug(\"[ES] [profile] Mixed search: enable\");\n }\n\n if (datas.length > 0) {\n // collect pubkeys and fill values map\n dataByPubkey = {};\n _.forEach(datas, function(data) {\n var pubkey = data[pubkeyAtributeName];\n if (pubkey) {\n var values = dataByPubkey[pubkey];\n if (!values) {\n values = [data];\n dataByPubkey[pubkey] = values;\n }\n else {\n values.push(data);\n }\n }\n });\n var pubkeys = _.keys(dataByPubkey);\n // Make sure all results will be return\n request.size = (pubkeys.length <= request.size) ? request.size : pubkeys.length;\n if (!text) {\n delete request.highlight; // highlight not need\n request.query.constant_score = {\n filter: {\n terms : {_id : pubkeys}\n }\n };\n }\n else {\n request.query.bool = {\n should: [\n {terms : {\"_id^4\" : pubkeys}},\n {match: {title: {query: text, boost: 2}}},\n {prefix: {title: text}}\n ]\n };\n\n if (tags) {\n request.query.bool.should.push({terms: {tags: tags}});\n }\n }\n }\n else if (text){\n request.query.bool = {\n should: [\n {match: {title: {\n query: text,\n boost: 2\n }}},\n {prefix: {title: text}}\n ]\n };\n if (tags) {\n request.query.bool.should.push({terms: {tags: tags}});\n }\n }\n else {\n // nothing to search: stop here\n deferred.resolve(datas);\n return deferred.promise;\n }\n\n if (text && mixedSearch) {\n request.indices_boost = {\n \"user\" : 100,\n \"page\" : 1,\n \"group\" : 0.01\n };\n }\n\n var hits;\n\n var search = mixedSearch ? that.raw.mixedSearch : that.raw.search;\n search(request)\n .then(function(res) {\n hits = res.hits;\n if (hits.total > 0) {\n var indices = {};\n var values;\n _.forEach(hits.hits, function(hit) {\n\n var avatarFieldName = 'avatar';\n // User profile\n if (hit._index == \"user\") {\n values = dataByPubkey && dataByPubkey[hit._id];\n if (!values) {\n var value = {};\n value[pubkeyAtributeName] = hit._id;\n values=[value];\n datas.push(value);\n }\n }\n\n // Page or group\n else if (hit._index != \"user\") {\n if (!indices[hit._index]) {\n indices[hit._index] = true;\n // add a separator\n datas.push({\n id: 'divider-' + hit._index,\n divider: true,\n index: hit._index\n });\n }\n var item = {\n id: hit._index + '-' + hit._id, // unique id in list\n index: hit._index,\n templateUrl: 'plugins/es/templates/wot/lookup_item_{0}.html'.format(hit._index),\n state: 'app.view_{0}'.format(hit._index),\n stateParams: {id: hit._id, title: hit._source.title},\n creationTime: hit._source.creationTime,\n memberCount: hit._source.memberCount,\n type: hit._source.type\n };\n values=[item];\n datas.push(item);\n avatarFieldName = 'avatar';\n }\n\n var avatar = esHttp.image.fromHit(hit, avatarFieldName);\n _.forEach(values, function(data) {\n data.avatar= avatar;\n _fillSearchResultFromHit(data, hit);\n });\n });\n\n // Add divider on top\n if (_.keys(indices).length) {\n datas.splice(0,0, {\n id: 'divider-identities',\n divider: true,\n index: 'profile'\n });\n }\n }\n deferred.resolve(datas);\n })\n .catch(function(err){\n if (err && err.ucode && err.ucode == 404) {\n deferred.resolve(datas);\n }\n else {\n deferred.reject(err);\n }\n });\n\n return deferred.promise;\n }\n\n function onWotLoad(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey) {\n deferred.resolve();\n return deferred.promise;\n }\n\n console.debug(\"[ES] [profile] Extending identity {{0}} ...\".format(data.pubkey.substr(0,8)));\n\n $q.all([\n // Load full profile\n getProfile(data.pubkey)\n .then(function(profile) {\n if (profile) {\n data.name = profile.name;\n data.avatar = profile.avatar;\n data.profile = data.profile || {};\n angular.merge(data.profile, profile.source, {descriptionHtml: profile.descriptionHtml});\n }\n else {\n data.name = null;\n data.avatar = null;\n data.profile = null;\n }\n deferred.resolve(data);\n }),\n\n // Load avatar on certifications\n fillAvatars(\n (data.received_cert||[])\n .concat(data.received_cert_pending||[])\n .concat(data.given_cert||[])\n .concat(data.given_cert_pending||[])\n )\n ])\n .catch(function(err){\n deferred.reject(err);\n });\n return deferred.promise;\n }\n\n function removeProfile(pubkey, options) {\n return that.raw.remove(pubkey, options)\n .then(function(res) {\n csCache.clear('csWot-');\n csCache.clear('csWot-');\n return res;\n });\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Extend csWot events\n listeners = [\n csWot.api.data.on.load($rootScope, onWotLoad, this),\n csWot.api.data.on.search($rootScope, onWotSearch, this)\n ];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [profile] Disable\");\n removeListeners();\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [profile] Enable\");\n addListeners();\n }\n }\n\n // Default actions\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n return {\n getAvatarAndName: getAvatarAndName,\n get: getProfile,\n add: esHttp.record.post('/user/profile', {tagFields: ['title', 'description'], ignoreFields: ['enableGeoPoint', 'descriptionHtml', 'moderator']}),\n update: esHttp.record.post('/user/profile/:id/_update', {tagFields: ['title', 'description'], ignoreFields: ['enableGeoPoint', 'descriptionHtml', 'moderator']}),\n remove: removeProfile,\n avatar: esHttp.get('/user/profile/:id?_source=avatar'),\n fillAvatars: fillAvatars,\n like: esLike.instance('user', 'profile')\n };\n }])\n;\n","angular.module('cesium.es.notification.services', ['cesium.platform', 'cesium.es.http.services'])\n.config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esNotification');\n }\n\n }])\n\n.factory('esNotification', ['$rootScope', '$q', '$timeout', '$translate', '$state', 'csHttp', 'csConfig', 'csSettings', 'esHttp', 'esSettings', 'csWallet', 'csWot', 'UIUtils', 'filterTranslations', 'BMA', 'CryptoUtils', 'csPlatform', 'Api', function($rootScope, $q, $timeout, $translate, $state, csHttp,\n csConfig, csSettings, esHttp, esSettings, csWallet, csWot, UIUtils, filterTranslations,\n BMA, CryptoUtils, csPlatform, Api) {\n 'ngInject';\n\n var\n constants = {\n MESSAGE_CODES: ['MESSAGE_RECEIVED'],\n INVITATION_CODES: ['INVITATION_TO_CERTIFY'],\n DEFAULT_LOAD_SIZE: 20\n },\n\n fields = {\n commons: [\"type\", \"code\", \"params\", \"reference\", \"recipient\", \"time\", \"hash\", \"read_signature\"]\n },\n that = this,\n listeners,\n wsUserEventCloseFn,\n api = new Api(this, 'esNotification')\n ;\n\n constants.EXCLUDED_CODES = constants.MESSAGE_CODES.concat(constants.INVITATION_CODES);\n\n that.raw = {\n postCount: esHttp.post('/user/event/_count'),\n postSearch: esHttp.post('/user/event/_search'),\n postReadById: esHttp.post('/user/event/:id/_read'),\n ws: {\n getUserEvent: esHttp.ws('/ws/event/user/:pubkey/:locale'),\n getChanges: esHttp.ws('/ws/_changes')\n }\n };\n\n // Create the filter query\n function createFilterQuery(pubkey, options) {\n options = options || {};\n options.codes = options.codes || {};\n options.codes.excludes = options.codes.excludes || constants.EXCLUDED_CODES;\n var query = {\n bool: {\n must: [\n {term: {recipient: pubkey}}\n ]\n }\n };\n\n // Includes codes\n if (options.codes && options.codes.includes) {\n query.bool.must.push({terms: { code: options.codes.includes}});\n }\n else {\n // Excludes codes\n var excludesCodes = [];\n if (!csSettings.getByPath('plugins.es.notifications.txSent', false)) {\n excludesCodes.push('TX_SENT');\n }\n if (!csSettings.getByPath('plugins.es.notifications.txReceived', true)) {\n excludesCodes.push('TX_RECEIVED');\n }\n if (!csSettings.getByPath('plugins.es.notifications.certSent', false)) {\n excludesCodes.push('CERT_SENT');\n }\n if (!csSettings.getByPath('plugins.es.notifications.certReceived', true)) {\n excludesCodes.push('CERT_RECEIVED');\n }\n if (options.codes.excludes) {\n _.forEach(options.codes.excludes, function(code) {\n excludesCodes.push(code);\n });\n }\n if (excludesCodes.length) {\n query.bool.must_not = {terms: { code: excludesCodes}};\n }\n }\n\n // Filter on time\n if (options.readTime) {\n query.bool.must.push({range: {time: {gt: options.readTime}}});\n }\n return query;\n }\n\n // Load unread notifications count\n function loadUnreadNotificationsCount(pubkey, options) {\n if (!pubkey) {\n return $q.reject('[ES] [notification] Unable to load - missing pubkey');\n }\n var request = {\n query: createFilterQuery(pubkey, options)\n };\n // Filter unread only\n request.query.bool.must.push({missing: { field : \"read_signature\" }});\n return that.raw.postCount(request)\n .then(function(res) {\n return res.count;\n });\n }\n\n function getWalletNotifications(options) {\n options = options || {};\n var wallet = options.wallet || csWallet;\n\n return new Promise(function(resolve) {\n if (!wallet.data || !wallet.data.events ||!wallet.data.events.length) return resolve([]);\n\n // Add some wallet events as notifications\n var time = csHttp.date.now() - filterTranslations.MEDIAN_TIME_OFFSET;\n var result = (wallet.data.events || []).reduce(function(res, event) {\n if (event.type !== \"warn\" && event.type !== \"error\") return res; // Keep only warn and error events\n var notification = new EsNotification({}, function(self) {\n if (!self.read) {\n self.read = true;\n if (wallet.data.notifications && wallet.data.notifications.warnCount > 0) {\n wallet.data.notifications.warnCount--;\n }\n }\n });\n notification.id= event.code;\n notification.time= time;\n notification.read = false;\n notification.state = 'app.view_wallet';\n notification.avatarIcon = 'ion-alert-circled';\n notification.icon = 'ion-alert-circled assertive';\n notification.message = event.message;\n notification.messageParams = event.messageParams;\n return res.concat(notification);\n }, []);\n\n resolve(result);\n });\n\n }\n\n // Load user notifications\n function loadNotifications(options) {\n options = options || {};\n if (!options.pubkey) {\n return $q.reject('[ES] [notification] Unable to load - missing options.pubkey');\n }\n options.from = options.from || 0;\n options.size = options.size || constants.DEFAULT_LOAD_SIZE;\n var request = {\n query: createFilterQuery(options.pubkey, options),\n sort : [\n { \"time\" : {\"order\" : \"desc\"}}\n ],\n from: options.from,\n size: options.size,\n _source: fields.commons\n };\n\n return $q.all([\n // Get wallet events (as notifications)\n getWalletNotifications(options),\n\n // Load notification from ES node\n that.raw.postSearch(request)\n ]).then(function(res) {\n\n var walletNotifs = res[0] || [];\n res = res[1];\n\n if (!res.hits || !res.hits.total) return walletNotifs;\n\n var notifications = res.hits.hits.reduce(function(res, hit) {\n var item = new EsNotification(hit._source, markNotificationAsRead);\n item.id = hit._id;\n return res.concat(item);\n }, walletNotifs);\n\n return csWot.extendAll(notifications);\n });\n }\n\n function onNewUserEvent(event) {\n if (!event || !csWallet.isLogin()) return;\n\n // If notification is an invitation\n if (_.contains(constants.INVITATION_CODES, event.code)) {\n api.event.raise.newInvitation(event);\n return;\n }\n\n // If notification is a message\n if (_.contains(constants.MESSAGE_CODES, event.code)) {\n api.event.raise.newMessage(event);\n return;\n }\n\n var notification = new EsNotification(event, markNotificationAsRead);\n notification.id = event.id || notification.id;\n\n // Extend the notification entity\n return csWot.extendAll([notification])\n .then(function() {\n if (!$rootScope.$$phase) {\n $rootScope.$applyAsync(function() {\n addNewNotification(notification);\n });\n }\n else {\n addNewNotification(notification);\n }\n })\n .then(function() {\n if (esSettings.notifications.isEmitHtml5Enable()) return emitEsNotification(notification);\n });\n }\n\n function addNewNotification(notification) {\n csWallet.data.notifications = csWallet.data.notifications || {};\n csWallet.data.notifications.unreadCount++;\n api.data.raise.new(notification);\n\n return notification;\n }\n\n function htmlToPlaintext(text) {\n return text ? String(text).replace(/<[^>]*>/gm, '').replace(/&[^;]+;/gm, '') : '';\n }\n\n function emitEsNotification(notification, title) {\n\n // If it's okay let's create a notification\n $q.all([\n $translate(title||'COMMON.NOTIFICATION.TITLE'),\n $translate(notification.message, notification)\n ])\n .then(function(res) {\n var title = htmlToPlaintext(res[0]);\n var body = htmlToPlaintext(res[1]);\n var icon = notification.avatar && notification.avatar.src || './img/logo.png';\n emitHtml5Notification(title, {\n body: body,\n icon: icon,\n lang: $translate.use(),\n tag: notification.id,\n onclick: function() {\n $rootScope.$applyAsync(function() {\n if (typeof notification.markAsRead === \"function\") {\n notification.markAsRead();\n }\n if (notification.state) {\n $state.go(notification.state, notification.stateParams);\n }\n });\n }\n });\n });\n }\n\n function emitHtml5Notification(title, options) {\n\n // Let's check if the browser supports notifications\n if (!(\"Notification\" in window)) return;\n\n // Let's check whether notification permissions have already been granted\n if (Notification.permission === \"granted\") {\n\n // If it's okay let's create a notification\n var browserNotification = new Notification(title, options);\n browserNotification.onclick = options.onclick || browserNotification.onclick;\n }\n\n // Otherwise, we need to ask the user for permission\n else if (Notification.permission !== \"denied\") {\n Notification.requestPermission(function (permission) {\n // If the user accepts, let's create a notification\n if (permission === \"granted\") {\n emitHtml5Notification(title, options); // recursive call\n }\n });\n }\n }\n\n // Mark a notification as read\n function markNotificationAsRead(notification) {\n if (notification.read || !notification.id) return; // avoid multi call\n // Should never append (fix in Duniter4j issue #12)\n if (!notification.id) {\n console.error('[ES] [notification] Could not mark as read: no \\'id\\' found!', notification);\n return;\n }\n\n // user not auth: could not mark as read\n if (!csWallet.isAuth()) return;\n\n notification.read = true;\n return csWallet.getKeypair()\n .then(function(keypair) {\n return CryptoUtils.sign(notification.hash, keypair)\n .then(function(signature){\n return that.raw.postReadById(signature, {id:notification.id});\n })\n .catch(function(err) {\n console.error('[ES] [notification] Error while trying to mark event as read.', err);\n });\n\n });\n }\n\n function onWalletReset(data) {\n data.notifications = data.notifications || {};\n data.notifications.unreadCount = null;\n data.notifications.warnCount = null;\n data.notifications.time = null;\n // Stop listening notification\n if (wsUserEventCloseFn) {\n console.debug(\"[ES] [notification] Closing websocket...\");\n wsUserEventCloseFn();\n wsUserEventCloseFn = null;\n }\n }\n\n function onWalletLoad(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey || !data.keypair) {\n $timeout(function() {\n deferred.resolve(data);\n });\n return deferred.promise;\n }\n\n var now = Date.now();\n var time = Math.trunc(now / 1000);\n\n // Skip if loaded less than 1 min ago\n // (This is need to avoid reload on login AND load phases)\n if (data.notifications && data.notifications.time && (time - data.notifications.time < 30 /*=30s*/)) {\n // update warn count\n data.notifications.warnCount = countWarnEvents(data);\n\n console.debug('[ES] [notification] Skipping load (loaded '+(time - data.notifications.time)+'s ago)');\n $timeout(function() {\n deferred.resolve(data);\n });\n return deferred.promise;\n }\n\n var isDefaultWallet = csWallet.isUserPubkey(data.pubkey);\n console.debug('[ES] [notification] Loading count...' + data.pubkey.substr(0,8));\n\n // Load unread notifications count\n loadUnreadNotificationsCount(\n data.pubkey, {\n readTime: data.notifications && data.notifications.time || 0,\n excludeCodes: constants.EXCLUDED_CODES\n })\n .then(function(unreadCount) {\n data.notifications = data.notifications || {};\n data.notifications.unreadCount = unreadCount;\n data.notifications.warnCount = countWarnEvents(data);\n\n // Emit HTML5 notification (only on main wallet)\n if (unreadCount > 0 && esSettings.notifications.isEmitHtml5Enable() && isDefaultWallet) {\n $timeout(function() {\n emitEsNotification({\n message: 'COMMON.NOTIFICATION.HAS_UNREAD',\n count: unreadCount,\n state: 'app.view_notifications'\n }, data.ui || data.name || data.pubkey && data.pubkey.substr(0,8));\n }, 500);\n }\n\n console.debug('[ES] [notification] Loaded count (' + unreadCount + ') in '+(Date.now()-now)+'ms');\n deferred.resolve(data);\n })\n .catch(function(err){\n console.error('Error while counting notification: ' + (err.message ? err.message : err));\n deferred.resolve(data);\n });\n\n return deferred.promise;\n }\n\n function onWalletLogin(data, deferred) {\n // Call load\n return onWalletLoad(data, deferred)\n\n // then start listening new events\n .then(function(){\n console.debug('[ES] [notification] Starting listen user event...');\n var wsUserEvent = that.raw.ws.getUserEvent();\n wsUserEvent.on(\n onNewUserEvent,\n {pubkey: data.pubkey, locale: csSettings.data.locale.id}\n )\n .catch(function(err) {\n console.error('[ES] [notification] Unable to listen user event', err);\n\n // TODO : send a event to csHttp instead ?\n // And display such connectivity errors in UI\n UIUtils.alert.error('ACCOUNT.ERROR.WS_CONNECTION_FAILED');\n });\n wsUserEventCloseFn = function() {wsUserEvent.close();};\n });\n }\n\n function countWarnEvents(data){\n if (!data.events) return 0;\n return data.events.reduce(function(counter, event) {\n return (event.type == \"warn\") ? counter+1 : counter;\n }, 0);\n }\n\n function addListeners() {\n // Listen some events\n listeners = [\n csWallet.api.data.on.login($rootScope, onWalletLogin, this),\n csWallet.api.data.on.load($rootScope, onWalletLoad, this),\n csWallet.api.data.on.init($rootScope, onWalletReset, this),\n csWallet.api.data.on.reset($rootScope, onWalletReset, this)\n ];\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [notification] Disable\");\n removeListeners();\n if (csWallet.isLogin()) {\n onWalletReset(csWallet.data);\n }\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [notification] Enable\");\n addListeners();\n if (csWallet.isLogin()) {\n return onWalletLogin(csWallet.data);\n }\n }\n }\n\n // Register extension points\n api.registerEvent('data', 'new');\n api.registerEvent('event', 'newInvitation');\n api.registerEvent('event', 'newMessage');\n\n // Default actions\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n // Exports\n that.load = loadNotifications;\n that.unreadCount = loadUnreadNotificationsCount;\n that.html5 = {\n emit: emitHtml5Notification\n };\n that.api = api;\n that.websocket = {\n event: that.raw.ws.getUserEvent,\n change: that.raw.ws.getChanges\n };\n that.constants = constants;\n\n return that;\n}])\n;\n","angular.module('cesium.es.message.services', ['ngResource', 'cesium.platform',\n 'cesium.es.http.services', 'cesium.es.wallet.services', 'cesium.es.notification.services'])\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esMessage');\n }\n\n }])\n\n .factory('esMessage', ['$q', '$rootScope', '$timeout', 'UIUtils', 'Api', 'CryptoUtils', 'csPlatform', 'csConfig', 'csSettings', 'esHttp', 'csWallet', 'esWallet', 'csWot', 'esNotification', function($q, $rootScope, $timeout, UIUtils, Api, CryptoUtils,\n csPlatform, csConfig, csSettings, esHttp, csWallet, esWallet, csWot, esNotification) {\n 'ngInject';\n\n var\n constants = {\n DEFAULT_LOAD_SIZE: 10\n },\n fields = {\n commons: [\"issuer\", \"recipient\", \"title\", \"content\", \"time\", \"nonce\", \"read_signature\"],\n notifications: [\"issuer\", \"time\", \"hash\", \"read_signature\"]\n },\n raw = {\n postSearch: esHttp.post('/message/inbox/_search'),\n postSearchByType: esHttp.post('/message/:type/_search'),\n getByTypeAndId : esHttp.get('/message/:type/:id'),\n postReadById: esHttp.post('/message/inbox/:id/_read')\n },\n listeners,\n api = new Api(this, 'esMessage');\n\n function onWalletInit(data) {\n data.messages = data.messages || {};\n data.messages.unreadCount = null;\n data.messages.time = null;\n }\n\n function onWalletReset(data) {\n if (data.messages) {\n delete data.messages;\n }\n }\n\n function onWalletLoad(data, deferred) {\n deferred = deferred || $q.defer();\n\n if (!data || !data.pubkey) {\n $timeout(function() {\n deferred.resolve(data);\n });\n return deferred.promise;\n }\n\n var now = Date.now();\n var time = Math.trunc(now / 1000);\n\n // Skip if loaded less than 1 min ago\n // (This is need to avoid reload on login AND load phases)\n if (data.messages && data.messages.time && (time - data.messages.time < 30 /*=30s*/)) {\n console.debug('[ES] [message] Skipping load (loaded '+(time - data.messages.time)+'s ago)');\n $timeout(function() {\n deferred.resolve(data);\n });\n return deferred.promise;\n }\n\n console.debug('[ES] [message] Loading count...');\n\n // Count unread messages\n countUnreadMessages({pubkey: data.pubkey})\n .then(function(unreadCount) {\n data.messages = data.messages || {};\n data.messages.unreadCount = unreadCount;\n data.messages.time = time;\n console.debug('[ES] [message] Loaded count (' + unreadCount + ') in '+(Date.now()-now)+'ms');\n deferred.resolve(data);\n })\n .catch(function(err){\n console.error('Error while counting messages: ' + (err.message ? err.message : err));\n deferred.resolve(data);\n });\n return deferred.promise;\n }\n\n function countUnreadMessages(options) {\n options = options || {};\n var wallet = options.wallet ||\n (options.walletId && csWallet.children.get(options.walletId)) || csWallet;\n var pubkey = options.pubkey || (wallet && wallet.data && wallet.data.pubkey);\n if (!pubkey) {\n throw new Error('no pubkey or wallet found in options, and user not connected.');\n }\n\n var request = {\n query: {\n bool: {\n must: [\n {term: {recipient: pubkey}},\n {missing: { field : \"read_signature\" }}\n ]\n }\n }\n };\n\n return esHttp.post('/message/inbox/_count')(request)\n .then(function(res) {\n return res.count;\n });\n }\n\n // Listen message changes\n function onNewMessageEvent(event, wallet) {\n console.debug(\"[ES] [message] detected new message (from notification service)\");\n\n var notification = new EsNotification(event);\n notification.issuer = notification.pubkey;\n delete notification.pubkey;\n\n if (!notification.issuer) return; // Skip if invalid\n\n // Get the wallet\n wallet = wallet || (notification.issuer && csWallet.isUserPubkey(notification.issuer) && csWallet) ||\n (notification.issuer && csWallet.children.getByPubkey(notification.issuer));\n\n if (!wallet) {\n throw new Error(\"No wallet for pubkey: {0}\".format(notification.issuer.substring(0, 6)));\n }\n\n csWot.extend(notification, 'issuer')\n .then(function() {\n\n wallet.data.messages = wallet.data.messages || {};\n wallet.data.messages.unreadCount++;\n\n // Raise event\n api.data.raise.new(notification);\n });\n }\n\n function sendMessage(message, options) {\n options = options || {};\n var wallet = options.wallet || options.walletId && csWallet.children.get(options.walletId) || csWallet;\n delete options.wallet;\n message.issuer = message.issuer || wallet.data.pubkey;\n return wallet.getKeypair()\n .then(function(keypair) {\n\n // Send to recipient inbox\n return doSendMessage(message, keypair)\n .then(function (res) {\n\n // Check if outbox is enable (in settings)\n var outbox = (csSettings.data.plugins.es.message &&\n angular.isDefined(csSettings.data.plugins.es.message.outbox)) ?\n csSettings.data.plugins.es.message.outbox : true;\n if (!outbox) return res;\n\n // Send to outbox\n return doSendMessage(message, keypair, '/message/outbox', 'issuer')\n .catch(function (err) {\n console.error(\"Failed to store message to outbox: \" + err);\n return res; // the first result\n });\n })\n .then(function (res) {\n // Raise API event\n api.data.raise.sent(res);\n\n return res;\n });\n });\n }\n\n function doSendMessage(message, keypair, boxPath, recipientFieldName) {\n boxPath = boxPath || '/message/inbox';\n\n // Encrypt fields\n return esWallet.box.record.pack(message, keypair, recipientFieldName, ['title', 'content'])\n // Send message\n .then(function(message){\n return esHttp.record.post(boxPath)(message, {pubkey: message.issuer, keypair: keypair});\n });\n }\n\n function loadMessageNotifications(options) {\n options = options || {};\n options.from = options.from || 0;\n options.size = options.size || constants.DEFAULT_LOAD_SIZE;\n var wallet = options.wallet || options.walletId && csWallet.children.get(options.walletId) || csWallet;\n delete options.wallet;\n\n if (!wallet.isLogin()) {\n return $q.when([]); // Should never happen\n }\n var request = {\n sort: {\n \"time\" : \"desc\"\n },\n query: {bool: {filter: {term: {recipient: wallet.data.pubkey}}}},\n from: options.from,\n size: options.size,\n _source: fields.notifications\n };\n\n return raw.postSearch(request)\n .then(function(res) {\n if (!res || !res.hits || !res.hits.total) return [];\n var notifications = res.hits.hits.reduce(function(result, hit) {\n var msg = hit._source;\n msg.id = hit._id;\n msg.read = !!msg.read_signature;\n delete msg.read_signature; // not need anymore\n return result.concat(msg);\n }, []);\n return csWot.extendAll(notifications, 'issuer');\n });\n }\n\n\n function searchMessages(pubkey, options) {\n pubkey = pubkey || csWallet.data.pubkey;\n\n options = options || {};\n options.type = options.type || 'inbox';\n options.from = options.from || 0;\n options.size = options.size || 1000;\n options._source = options._source || fields.commons;\n var request = {\n sort: {\n \"time\" : \"desc\"\n },\n from: options.from,\n size: options.size,\n _source: options._source\n };\n\n if (options.type == 'inbox') {\n request.query = {bool: {filter: {term: {recipient: pubkey}}}};\n }\n else {\n request.query = {bool: {filter: {term: {issuer: pubkey}}}};\n }\n\n return raw.postSearchByType(request, {type: options.type})\n .then(function(res) {\n if (!res || !res.hits || !res.hits.total) {\n return [];\n }\n var messages = res.hits.hits.reduce(function(res, hit) {\n var msg = hit._source || {};\n msg.id = hit._id;\n msg.read = (options.type == 'outbox') || !!msg.read_signature;\n delete msg.read_signature; // not need anymore\n return res.concat(msg);\n }, []);\n\n console.debug('[ES] [message] Loading {0} {1} messages'.format(messages.length, options.type));\n\n return messages;\n });\n }\n\n function loadMessages(options) {\n options = options || {};\n options.type = options.type || 'inbox';\n options._source = fields.commons;\n options.summary = angular.isDefined(options.summary) ? options.summary : true;\n options.filter = angular.isDefined(options.filter) ? options.filter : undefined;\n options.from = options.from || 0;\n\n var wallet = options.wallet || options.walletId && csWallet.children.get(options.walletId) || csWallet;\n delete options.wallet; // avoid error in angular.copy()\n\n var promise = wallet.auth()\n .then(function(walletData) {\n\n // Get encrypted message (with common fields)\n return searchMessages(walletData.pubkey, options)\n\n // Decrypt content\n .then(function(messages) {\n return decryptMessages(messages, walletData.keypair, options.summary);\n });\n })\n\n // Add avatar\n .then(function(messages){\n var avatarField = (options.type == 'inbox') ? 'issuer' : 'recipient';\n return csWot.extendAll(messages, avatarField);\n })\n\n // Update message count\n .then(function(messages){\n if (messages.length && options.filter){\n var filteredMessages = filterMessages(messages, options.filter);\n\n // Need more messages: iterate again\n if (filteredMessages.length < messages.length) {\n options = angular.copy(options);\n options.from += options.size;\n options.size = messages.length - filteredMessages.length;\n // put the wallet again, because it has been removed before the angular.copy()\n // To avoid an error\n options.wallet = wallet;\n return loadMessages(options) // Loop\n .then(function(messages) {\n return filteredMessages.concat(messages);\n });\n }\n }\n\n if (options.from === 0 && !options.filter) {\n wallet.data.messages = wallet.data.messages || {};\n wallet.data.messages.count = messages.length;\n }\n\n return messages;\n });\n\n // If filter, apply sorting (only once)\n if (options.from === 0 && options.filter) {\n promise.then(sortFilteredMessages);\n }\n\n return promise;\n }\n\n function getAndDecrypt(id, type, options) {\n type = type || 'inbox';\n options = options || {};\n options.summary = angular.isDefined(options.summary) ? options.summary : false/*summary not need by default*/;\n var wallet = options.wallet || (options.walletId && csWallet.children.get(options.walletId)) || csWallet;\n\n return wallet.auth()\n .then(function(walletData) {\n return raw.getByTypeAndId({id: id, type: type})\n .then(function(hit) {\n if (!hit.found) return;\n var msg = hit._source;\n msg.id = hit._id;\n msg.read = (type == 'outbox') || !!msg.read_signature;\n delete msg.read_signature; // not need anymore\n\n // Decrypt message\n return decryptMessages([msg], walletData.keypair, options.summary)\n\n // Add avatar\n .then(function(){\n var avatarField = (type == 'inbox') ? 'issuer' : 'recipient';\n return csWot.extend(msg, avatarField);\n });\n });\n });\n }\n\n function decryptMessages(messages, keypair, withSummary) {\n\n var now = Date.now();\n var issuerBoxPks = {}; // a map used as cache\n\n var jobs = [esWallet.box.getKeypair(keypair)];\n return $q.all(messages.reduce(function(jobs, message) {\n if (issuerBoxPks[message.issuer]) return res;\n return jobs.concat(\n CryptoUtils.box.keypair.pkFromSignPk(CryptoUtils.util.decode_base58(message.issuer))\n .then(function(issuerBoxPk) {\n issuerBoxPks[message.issuer] = issuerBoxPk; // fill box pk cache\n }));\n }, jobs))\n .then(function(res){\n var boxKeypair = res[0];\n return $q.all(messages.reduce(function(jobs, message) {\n var issuerBoxPk = issuerBoxPks[message.issuer];\n var nonce = CryptoUtils.util.decode_base58(message.nonce);\n message.valid = true;\n\n return jobs.concat(\n // title\n CryptoUtils.box.open(message.title, nonce, issuerBoxPk, boxKeypair.boxSk)\n .then(function(title) {\n message.title = title;\n })\n .catch(function(err){\n console.error(err);\n console.warn('[ES] [message] may have invalid cypher title');\n message.valid = false;\n }),\n\n // content\n CryptoUtils.box.open(message.content, nonce, issuerBoxPk, boxKeypair.boxSk)\n .then(function(content) {\n message.content = content;\n if (withSummary) {\n fillSummary(message);\n }\n else if (content){\n message.html = esHttp.util.parseAsHtml(content);\n }\n })\n .catch(function(err){\n console.error(err);\n console.warn('[ES] [message] may have invalid cypher content');\n message.valid = false;\n })\n );\n }, []));\n })\n .then(function() {\n console.debug('[ES] [message] All messages decrypted in ' + (Date.now() - now) + 'ms');\n return messages;\n });\n\n }\n\n // Compute a summary (truncated to 140 characters), from the message content\n function fillSummary(message) {\n if (message.content) {\n message.summary = message.content.replace(/(^|[\\n\\r]+)\\s*>[^\\n\\r]*/g, '').trim();\n if (message.summary.length > 140) {\n message.summary = message.summary.substr(0, 137) + '...';\n }\n }\n }\n\n function removeMessage(id, type, options) {\n type = type || 'inbox';\n\n var wallet = options.wallet || (options.walletId && csWallet.children.get(options.walletId)) || csWallet;\n\n return esHttp.record.remove('message', type)(id, {wallet: wallet})\n .then(function(res) {\n // Update message count\n if (type === 'inbox') {\n wallet.data.messages = wallet.data.messages || {};\n wallet.data.messages.count = wallet.data.messages.count > 0 ? wallet.data.messages.count-1 : 0;\n }\n\n // Raise event\n if (wallet.isDefault()) {\n api.data.raise.delete(id);\n }\n\n return res;\n });\n }\n\n function removeAllMessages(type, options) {\n type = type || 'inbox';\n var wallet = options && options.walletId && csWallet.children.get(options.walletId) || csWallet;\n return wallet.auth()\n .then(function(walletData) {\n // Get all message id\n return searchMessages(walletData.pubkey, {type: type, from: 0, size: 1000, _source: false})\n .then(function (res) {\n if (!res || !res.length) return;\n\n var ids = _.pluck(res, 'id');\n\n // Remove each messages\n return $q.all(res.reduce(function (res, msg) {\n return res.concat(esHttp.record.remove('message', type)(msg.id, {wallet: wallet}));\n }, []))\n .then(function() {\n return ids;\n });\n })\n .then(function (ids) {\n // update message count\n if (type === 'inbox') {\n wallet.data.messages = wallet.data.messages || {};\n wallet.data.messages.count = 0;\n wallet.data.messages.unreadCount = 0;\n }\n\n // Raise events\n if (wallet.isDefault()) {\n _.forEach(ids, api.data.raise.delete);\n }\n });\n });\n }\n\n // Mark a message as read\n function markMessageAsRead(message, options) {\n options = options || {};\n var wallet = options.wallet || options.walletId && csWallet.children.get(options.walletId) || csWallet;\n var type = options && options.type || (!wallet.isUserPubkey(message.recipient) ? 'outbox' : 'inbox');\n if (message.read) {\n var deferred = $q.defer();\n deferred.resolve();\n return deferred.promise;\n }\n message.read = true;\n\n return wallet.getKeypair()\n\n // Prepare the read_signature to sent\n .then(function(keypair) {\n return CryptoUtils.sign(message.hash, keypair);\n })\n\n // Send read request\n .then(function(signature){\n return raw.postReadById(signature, {id:message.id});\n })\n\n // Update message count\n .then(function() {\n if (type === 'inbox') {\n wallet.data.messages = wallet.data.messages || {};\n wallet.data.messages.unreadCount = wallet.data.messages.unreadCount ? wallet.data.messages.unreadCount - 1 : 0;\n }\n });\n }\n\n // Mark all messages as read\n function markAllMessageAsRead(options) {\n options = options || {};\n var wallet = options.wallet || options.walletId && csWallet.children.get(options.walletId) || csWallet;\n return wallet.auth()\n .then(function(walletData) {\n\n // Get all messages hash\n return searchMessages(walletData.pubkey, {\n type: 'inbox',\n from: 0,\n size: 1000,\n _source: ['hash', 'read_signature']\n })\n\n .then(function (messages) {\n if (!messages || !messages.length) return;\n\n // Keep only unread message\n messages = _.filter(messages, {read: false});\n\n // Remove messages\n return $q.all(messages.reduce(function (res, message) {\n return res.concat(\n // Sign hash\n CryptoUtils.sign(message.hash, walletData.keypair)\n // then send read request\n .then(function (signature) {\n return raw.postReadById(signature, {id: message.id});\n }));\n }, []));\n })\n .then(function () {\n // update message count\n wallet.data.messages = wallet.data.messages || {};\n wallet.data.messages.unreadCount = 0;\n });\n });\n }\n\n // Filter messages (after decryption) searching on [title, content]\n function filterMessages(messages, filter) {\n if (filter && !filter.trim().length) return messages;\n\n // Init summary, removing reply content (lines starting with '>')\n messages.forEach(function(msg) {\n if (msg.content) {\n msg.summary = msg.content.replace(/(^|[\\n\\r]+)\\s*>[^\\n\\r]*/g, '').trim() || '';\n }\n });\n\n // For each search words\n var words = filter.trim().split(' ');\n words.forEach(function(word) {\n var regexp = new RegExp(word, 'gi');\n messages.forEach(function(msg) {\n\n // Search on title\n var matches = regexp.exec(msg.title);\n if (matches) {\n msg.title = msg.title.replace(regexp, '<b>$&</b>');\n msg.titleMatch = (msg.titleMatch || 0) + 1;\n while(true) {\n matches = regexp.exec(msg.title.substring(matches.index + word.length));\n if (!matches || msg.titleMatch >= 10) break;\n msg.titleMatch = msg.titleMatch + 1;\n }\n return;\n }\n\n // Search on summary\n matches = regexp.exec(msg.summary);\n if (matches) {\n if (matches.index > 140) {\n msg.summary = '...' + msg.summary.substring(matches.index - 20);\n }\n msg.summary = msg.summary.replace(regexp, '<b>$&</b>');\n msg.contentMatch = (msg.contentMatch || 0) + 1;\n while(true) {\n matches = regexp.exec(msg.summary.substring(matches.index + word.length));\n if (!matches || msg.contentMatch >= 10) break;\n msg.contentMatch++;\n }\n if (msg.summary.length > 140) {\n msg.summary = msg.summary.substr(0, 137) + '...';\n }\n }\n });\n });\n\n // Keep only matches\n messages = _.filter(messages, function(msg) {\n return msg.titleMatch || msg.contentMatch;\n });\n\n return messages;\n }\n\n // Sort filtered messages by matches\n function sortFilteredMessages(messages) {\n // Sort by matches\n return _.sortBy(messages, function(msg) {\n return -1 * (\n 1000 * (msg.titleMatch || 0) +\n 100 * (msg.contentMatch || 0) +\n (msg.time / 10000000000));\n });\n }\n\n // Send message to developers - need for issue #524\n function onSendError(message) {\n var developers = csConfig.developers || [{pubkey: '38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE'/*kimamila*/}];\n if(!message || !message.content || !developers || !developers.length) return;\n\n console.info(\"[ES] [message] Sending logs to developers...\");\n message.issuer = csWallet.data.pubkey;\n message.title = message.title || 'Sending log';\n message.time = moment().utc().unix();\n\n csWallet.getKeypair()\n .then(function(keypair) {\n return $q.all(developers.reduce(function(res, developer){\n return !developer.pubkey ? res :\n res.concat(doSendMessage(angular.merge({recipient: developer.pubkey}, message), keypair));\n }, []));\n })\n .then(function(res) {\n console.info(\"[ES] [message] Logs sent to {0} developers\".format(res.length));\n });\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Extend csWallet events\n listeners = [\n csWallet.api.data.on.init($rootScope, onWalletInit, this),\n csWallet.api.data.on.login($rootScope, onWalletLoad, this),\n csWallet.api.data.on.load($rootScope, onWalletLoad, this), // need for secondary wallets\n csWallet.api.data.on.reset($rootScope, onWalletReset, this),\n esNotification.api.event.on.newMessage($rootScope, onNewMessageEvent, this),\n // for issue #524\n csWallet.api.error.on.send($rootScope, onSendError, this)\n ];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [message] Disable\");\n removeListeners();\n if (csWallet.isLogin()) {\n onWalletReset(csWallet.data);\n }\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [message] Enable\");\n addListeners();\n if (csWallet.isLogin()) {\n onWalletLoad(csWallet.data);\n }\n }\n }\n\n // Register extension points\n api.registerEvent('data', 'new');\n api.registerEvent('data', 'delete');\n api.registerEvent('data', 'sent');\n\n // Default action\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n return {\n api: api,\n search: raw.postSearch,\n notifications: {\n load: loadMessageNotifications\n },\n load: loadMessages,\n get: getAndDecrypt,\n send: sendMessage,\n remove: removeMessage,\n removeAll: removeAllMessages,\n markAsRead: markMessageAsRead,\n markAllAsRead: markAllMessageAsRead,\n fields: {\n commons: fields.commons\n }\n };\n }])\n;\n","angular.module('cesium.es.modal.services', ['cesium.modal.services', 'cesium.es.message.services'])\n\n .factory('esModals', ['$state', 'ModalUtils', 'UIUtils', 'csWallet', function($state, ModalUtils, UIUtils, csWallet) {\n 'ngInject';\n\n function showMessageCompose(parameters) {\n return ModalUtils.show('plugins/es/templates/message/modal_compose.html','ESMessageComposeModalCtrl',\n parameters, {focusFirstInput: true});\n }\n\n function updateNotificationCountAndReadTime() {\n csWallet.data.notifications.unreadCount = 0;\n if (csWallet.data.notifications && csWallet.data.notifications.history.length) {\n var lastNotification = csWallet.data.notifications.history[0];\n var readTime = lastNotification ? lastNotification.time : 0;\n csSettings.data.wallet = csSettings.data.wallet || {};\n if (readTime && csSettings.data.wallet.notificationReadTime != readTime) {\n csSettings.data.wallet.notificationReadTime = readTime;\n csSettings.store();\n }\n }\n }\n\n function showNotificationsPopover(scope, event) {\n return UIUtils.popover.show(event, {\n templateUrl :'plugins/es/templates/common/popover_notification.html',\n scope: scope,\n autoremove: false, // reuse popover\n afterHidden: updateNotificationCountAndReadTime\n })\n .then(function(notification) {\n if (!notification) return; // no selection\n if (notification.onRead && typeof notification.onRead == 'function') notification.onRead();\n if (notification.state) {\n $state.go(notification.state, notification.stateParams);\n }\n });\n }\n\n function showNewInvitation(parameters) {\n return csWallet.auth({minData: true})\n .then(function(walletData) {\n UIUtils.loading.hide();\n\n // Not allow for non-member - issue #561\n if (!walletData.isMember) {\n return UIUtils.alert.error('ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION');\n }\n return ModalUtils.show('plugins/es/templates/invitation/modal_new_invitation.html', 'ESNewInvitationModalCtrl',\n parameters);\n });\n }\n\n function showNewPage(options) {\n var wallet = options && options.wallet || csWallet;\n return wallet.auth({minData: true})\n .then(function() {\n UIUtils.loading.hide();\n\n return ModalUtils.show('plugins/es/templates/registry/modal_record_type.html', undefined, {\n title: 'REGISTRY.EDIT.TITLE_NEW'\n })\n .then(function(type){\n if (type) {\n $state.go('app.registry_add_record', {type: type, wallet: wallet.id});\n }\n });\n });\n }\n\n function showNetworkLookup(parameters) {\n return ModalUtils.show('plugins/es/templates/network/modal_network.html', 'ESNetworkLookupModalCtrl',\n parameters, {focusFirstInput: false});\n }\n\n return {\n showMessageCompose: showMessageCompose,\n showNotifications: showNotificationsPopover,\n showNewInvitation: showNewInvitation,\n showNewPage: showNewPage,\n showNetworkLookup: showNetworkLookup\n };\n\n }]);\n","angular.module('cesium.es.blockchain.services', ['cesium.services', 'cesium.es.http.services'])\n\n.factory('esBlockchain', ['$rootScope', '$q', '$timeout', 'BMA', 'csCache', 'esHttp', function($rootScope, $q, $timeout, BMA, csCache, esHttp) {\n 'ngInject';\n\n function EsBlockchain() {\n\n var\n PUBKEY = BMA.constants.regexp.PUBKEY,\n CONSTANTS = {\n DEFAULT_SEARCH_SIZE: 40,\n ES_CORE_API_ENDPOINT: 'ES_CORE_API( ([a-z_][a-z0-9-_.]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))'\n },\n REGEXPS = {\n /* WARNING: keep keys order for UI */\n SEARCH_FILTER: {\n TX_PUBKEY: new RegExp('\\\\(transactions\\\\.issuers:('+PUBKEY+') OR transactions\\\\.outputs:\\\\*('+PUBKEY+')\\\\)([ ]+AND)?'),\n ISSUER: new RegExp('issuer:('+PUBKEY+')([ ]+AND)?'),\n MEMBER_FLOWS: new RegExp('\\\\(_exists_:joiners OR _exists_:leavers OR _exists_:revoked OR _exists_:excluded\\\\)([ ]+AND)?'),\n EXISTING_TRANSACTION: new RegExp('_exists_:transactions([ ]+AND)?'),\n PERIOD: new RegExp('medianTime:>=?([0-9]+)[ ]+AND[ ]+medianTime:<=?([0-9]+)([ ]+AND)?')\n },\n LAST_AND: /[ ]+AND$/\n },\n FIELDS = {\n MINIMAL: ['number', 'hash', 'medianTime', 'issuer'],\n COMMONS: ['number', 'hash', 'medianTime', 'issuer', 'currency', 'version', 'powMin', 'dividend', 'membersCount', 'identities', 'joiners', 'actives', 'leavers', 'revoked', 'excluded', 'certifications', 'transactions']\n },\n exports = {\n node: {},\n block: {},\n raw: {\n block: {\n search: esHttp.post('/:currency/block/_search', csCache.constants.SHORT),\n searchText: esHttp.get('/:currency/block/_search?q=:text'),\n get: esHttp.get('/:currency/block/:number/_source', csCache.constants.SHORT)\n }\n },\n regexp: {\n ES_CORE_API_ENDPOINT: exact(CONSTANTS.ES_CORE_API_ENDPOINT)\n }\n };\n exports.regex = exports.regexp; // deprecated\n\n function exact(regexpContent) {\n return new RegExp('^' + regexpContent + '$');\n }\n\n exports.node.parseEndPoint = function(endpoint) {\n var matches = exports.regexp.ES_CORE_API_ENDPOINT.exec(endpoint);\n if (!matches) return;\n return {\n dns: matches[2] || '',\n ipv4: matches[4] || '',\n ipv6: matches[6] || '',\n port: matches[8] || 80\n };\n };\n\n\n exports.raw.block.processSearchResult = function(res, options) {\n options = options || {};\n options.excludeCurrent = angular.isDefined(options.excludeCurrent) ? options.excludeCurrent : true;\n options.fillAvatar = angular.isDefined(options.fillAvatar) ? options.fillAvatar : true;\n options.cleanData = angular.isDefined(options.cleanData) ? options.cleanData : true;\n\n var hasExcludedCurrent = false;\n var hits = (res && res.hits && res.hits.hits || []).reduce(function(res, hit) {\n if (hit._id == 'current' && options.excludeCurrent) {\n hasExcludedCurrent = true;\n return res;\n }\n if (!hit._source) return res;\n var block = new Block(hit._source);\n if (options.cleanData) {\n block.cleanData(); // release data's arrays\n }\n return res.concat(block);\n }, []);\n return {\n hits: hits,\n took: res.took,\n total: res && res.hits && res.hits.total ? (\n hasExcludedCurrent ? res.hits.total-1 : res.hits.total) : 0\n };\n };\n\n exports.block.search = function(currency, options) {\n var request = options ? angular.copy(options) : {};\n delete request.excludeCurrent;\n delete request.fillAvatar;\n delete request.skipData;\n request.from = request.from || 0;\n request.size = request.size || CONSTANTS.DEFAULT_SEARCH_SIZE;\n request._source = options._source || FIELDS.COMMONS;\n if (options._source && options._source == '*') {\n delete request._source;\n }\n\n return exports.raw.block.search(request, {currency: currency})\n .then(function(res) {\n return exports.raw.block.processSearchResult(res, options);\n });\n };\n\n exports.block.searchText = function(currency, text, options) {\n if (options && angular.isUndefined(options.excludeCurrent)) {\n options.excludeCurrent = true;\n }\n var request = options ? angular.copy(options) : {};\n delete request.excludeCurrent;\n delete request.fillAvatar;\n delete request.skipData;\n request.from = request.from || 0;\n request.size = request.size || CONSTANTS.DEFAULT_SEARCH_SIZE;\n request._source = options._source || FIELDS.COMMONS.join(',');\n if (options._source && options._source == '*') {\n delete request._source;\n }\n\n request.currency=currency;\n request.text=text||'';\n\n return exports.raw.block.searchText(request)\n .then(function(res) {\n return exports.raw.block.processSearchResult(res, options);\n });\n };\n\n exports.block.parseSearchText = function(text, filters) {\n\n var unparsedText = text;\n filters = _.keys(REGEXPS.SEARCH_FILTER).reduce(function(res, filterType){\n var matches = REGEXPS.SEARCH_FILTER[filterType].exec(unparsedText);\n if (matches) {\n var filterText = matches[0];\n\n // update rest\n unparsedText = unparsedText.replace(filterText, '');\n\n filterText = filterText.replace(REGEXPS.LAST_AND, '');\n\n var filter = {\n type: filterType,\n text: filterText,\n params: matches\n };\n return res.concat(filter);\n }\n return res;\n }, filters||[]);\n\n return {\n filters: filters,\n text: unparsedText.trim()\n };\n };\n\n return exports;\n }\n\n\n return EsBlockchain();\n}])\n;\n","angular.module('cesium.es.group.services', ['cesium.platform', 'cesium.es.http.services',\n 'cesium.es.profile.services', 'cesium.es.notification.services', 'cesium.es.comment.services'])\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esGroup');\n }\n\n }])\n\n.factory('esGroup', ['$q', '$rootScope', 'csPlatform', 'BMA', 'csSettings', 'esHttp', 'CryptoUtils', 'csWot', 'csWallet', 'esNotification', 'esComment', function($q, $rootScope, csPlatform, BMA, csSettings, esHttp, CryptoUtils, csWot, csWallet, esNotification, esComment) {\n 'ngInject';\n\n var\n listeners,\n defaultLoadSize = 50,\n fields = {\n list: [\"issuer\", \"title\", \"description\", \"type\", \"creationTime\", \"avatar._content_type\"],\n commons: [\"issuer\", \"title\", \"description\", \"creationTime\", \"time\", \"signature\"],\n notifications: [\"issuer\", \"time\", \"hash\", \"read_signature\"]\n },\n exports = {\n _internal: {}\n };\n\n function onWalletInit(data) {\n data.groups = data.groups || {};\n data.groups.unreadCount = null;\n }\n\n function onWalletReset(data) {\n if (data.groups) {\n delete data.groups;\n }\n }\n\n function onWalletLogin(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey) {\n deferred.resolve();\n return deferred.promise;\n }\n\n // Count unread notifications\n esNotification.unreadCount(data.pubkey, {codes: {\n includes: ['GROUP_INVITATION'],\n excludes: []\n }})\n .then(function(unreadCount){\n data.groups = data.groups || {};\n data.groups.unreadCount = unreadCount;\n console.debug('[ES] [group] Detecting ' + unreadCount + ' unread notifications');\n deferred.resolve(data);\n })\n .catch(function(err){\n console.error('Error while counting group notifications: ' + (err.message ? err.message : err));\n deferred.resolve(data);\n });\n return deferred.promise;\n }\n\n function readRecordFromHit(hit, html) {\n if (!hit) return;\n var record = hit._source;\n if (html && hit.highlight) {\n if (hit.highlight.title) {\n record.title = hit.highlight.title[0];\n }\n if (hit.highlight.description) {\n record.description = hit.highlight.description[0];\n }\n if (hit.highlight.location) {\n record.location = hit.highlight.location[0];\n }\n if (hit.highlight.tags) {\n data.tags = hit.highlight.tags.reduce(function(res, tag){\n return res.concat(tag.replace('<em>', '').replace('</em>', ''));\n },[]);\n }\n }\n\n // description\n if (html) {\n record.description = esHttp.util.parseAsHtml(record.description);\n }\n\n // avatar\n record.avatar = esHttp.image.fromHit(hit, 'avatar');\n\n // pictures\n if (hit._source.pictures && hit._source.pictures.reduce) {\n record.pictures = hit._source.pictures.reduce(function(res, pic) {\n return res.concat(esHttp.image.fromAttachment(pic.file));\n }, []);\n }\n\n return record;\n }\n\n exports._internal.search = esHttp.post('/group/record/_search');\n\n function _executeSearchRequest(request) {\n return exports._internal.search(request)\n .then(function(res) {\n if (!res || !res.hits || !res.hits.total) {\n return [];\n }\n var groups = res.hits.hits.reduce(function(res, hit) {\n var record = readRecordFromHit(hit, true/*html*/);\n record.id = hit._id;\n return record ? res.concat(record) : res;\n }, []);\n\n console.debug('[ES] [group] Loading {0} groups'.format(groups.length));\n\n return groups;\n });\n }\n\n function getLastGroups(options) {\n options = options || {};\n\n /*if (!csWallet.isLogin()) {\n return $q.when([]);\n }*/\n\n var request = {\n sort: {\n \"time\" : \"desc\"\n },\n from: options.from || 0,\n size: options.size || defaultLoadSize,\n _source: options._source || fields.list\n };\n\n return _executeSearchRequest(request);\n }\n\n function searchGroups(options) {\n options = options || {};\n\n var text = options.text && options.text.trim();\n if (!text) return getLastGroups(options);\n\n var request = {\n from: options.from || 0,\n size: options.size || defaultLoadSize,\n highlight: {fields : {title : {}, tags: {}}},\n _source: options._source || fields.list\n };\n\n\n var matches = [];\n var filters = [];\n // pubkey : use a special 'term', because of 'non indexed' field\n if (BMA.regexp.PUBKEY.test(text /*case sensitive*/)) {\n filters.push({term : { issuer: text}});\n filters.push({term : { pubkey: text}});\n }\n else {\n text = text.toLowerCase();\n var matchFields = [\"title\", \"description\"];\n matches.push({multi_match : { query: text,\n fields: matchFields,\n type: \"phrase_prefix\"\n }});\n matches.push({match : { title: text}});\n matches.push({match : { description: text}});\n }\n\n request.query = {bool: {}};\n if (matches.length > 0) {\n request.query.bool.should = matches;\n }\n if (filters.length > 0) {\n request.query.bool.filter = filters;\n }\n\n\n\n\n return _executeSearchRequest(request);\n }\n\n exports._internal.get = esHttp.get('/group/record/:id');\n exports._internal.getCommons = esHttp.get('/group/record/:id?_source=' + fields.commons.join(','));\n\n function loadData(id, options) {\n options = options || {};\n options.fecthPictures = angular.isDefined(options.fetchPictures) ? options.fetchPictures : false;\n options.html = angular.isDefined(options.html) ? options.html : true;\n\n // Do get source\n var promise = options.fecthPictures ?\n exports._internal.get({id: id}) :\n exports._internal.getCommons({id: id});\n\n return promise\n .then(function(hit) {\n var record = readRecordFromHit(hit, options.html);\n\n // Load issuer (avatar, name, uid, etc.)\n return csWot.extend({pubkey: record.issuer})\n .then(function(issuer) {\n return {\n id: hit._id,\n issuer: issuer,\n record: record\n };\n });\n });\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Extend csWallet.loadData()\n listeners = [\n csWallet.api.data.on.login($rootScope, onWalletLogin, this),\n csWallet.api.data.on.init($rootScope, onWalletInit, this),\n csWallet.api.data.on.reset($rootScope, onWalletReset, this)\n ];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [group] Disable\");\n removeListeners();\n if (csWallet.isLogin()) {\n onWalletReset(csWallet.data);\n }\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [group] Enable\");\n addListeners();\n if (csWallet.isLogin()) {\n onWalletLogin(csWallet.data);\n }\n }\n }\n\n // Default actions\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n return {\n record: {\n last: getLastGroups,\n search: searchGroups,\n load: loadData,\n add: esHttp.record.post('/group/record', {tagFields: ['title', 'description']}),\n update: esHttp.record.post('/group/record/:id/_update', {tagFields: ['title', 'description']}),\n remove: esHttp.record.remove('group', 'record'),\n fields: {\n commons: fields.commons\n },\n picture: {\n all: esHttp.get('/group/record/:id?_source=pictures')\n },\n comment: esComment.instance('group')\n }\n };\n}])\n;\n","angular.module('cesium.es.invitation.services', ['cesium.platform',\n 'cesium.es.http.services', 'cesium.es.wallet.services', 'cesium.es.notification.services'])\n\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esInvitation');\n }\n\n }])\n\n.factory('esInvitation', ['$rootScope', '$q', '$timeout', 'CryptoUtils', 'csPlatform', 'Api', 'esHttp', 'csWallet', 'esWallet', 'csWot', 'esNotification', function($rootScope, $q, $timeout, CryptoUtils, csPlatform, Api, esHttp, csWallet, esWallet, csWot, esNotification) {\n 'ngInject';\n\n var\n that = this,\n constants = {\n DEFAULT_LOAD_SIZE: 20\n },\n fields = {\n commons: [\"issuer\", \"time\", \"hash\", \"content\", \"nonce\", \"comment\"]\n },\n api = new Api(this, 'esInvitation'),\n listeners;\n\n that.raw = {\n certification: {\n get: esHttp.get('/invitation/certification/:id?_source:fields'),\n add: esHttp.record.post('/invitation/certification'),\n postSearch: esHttp.post('/invitation/certification/_search'),\n remove: esHttp.record.remove('invitation', 'certification'),\n getIds: esHttp.get('/invitation/certification/_search?q=recipient::pubkey&_source=false&size=1000')\n }\n };\n\n function onWalletInit(data) {\n data.invitations = data.invitations || {};\n data.invitations.unreadCount = null;\n data.invitations.time = null;\n }\n\n function onWalletReset(data) {\n if (data.invitations) {\n delete data.invitations;\n }\n }\n\n function onWalletLoad(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey) {\n $timeout(function() {\n deferred.resolve(data);\n });\n return deferred.promise;\n }\n\n var now = Date.now();\n var time = Math.trunc(now / 1000);\n\n // Skip if loaded less than 1 min ago\n // (This is need to avoid reload on login AND load phases)\n if (data.invitations && data.invitations.time && (time - data.invitations.time < 30 /*=30s*/)) {\n console.debug('[ES] [invitation] Skipping load (loaded {0}s ago)'.format(time - data.invitations.time));\n $timeout(function() {\n deferred.resolve(data);\n });\n return deferred.promise;\n }\n\n console.debug('[ES] [invitation] Loading count...');\n\n // Count unread invitations\n countUnreadInvitations(data.pubkey)\n .then(function(unreadCount){\n data.invitations = data.invitations || {};\n data.invitations.unreadCount = unreadCount;\n data.invitations.time = time;\n console.debug('[ES] [invitation] Loaded count (' + unreadCount + ') in '+(Date.now()-now)+'ms');\n deferred.resolve(data);\n })\n .catch(function(err){\n console.error('Error while counting invitation: ' + (err.message ? err.message : err));\n deferred.resolve(data);\n });\n return deferred.promise;\n }\n\n function onWalletCertify(cert) {\n if (!csWallet.data.invitations || !csWallet.data.invitations.list) return;\n\n // Search on invitations\n var invitationstoRemove = _.where(csWallet.data.invitations.list, {\n type: 'certification',\n pubkey: cert.pubkey\n });\n if (!invitationstoRemove || !invitationstoRemove.length) return;\n\n // Remove all invitations related to this pubkey\n return $q.all(\n invitationstoRemove.reduce(function(res, invitation) {\n return res.concat(\n deleteInvitation(invitation)\n );\n }, []));\n }\n\n function onNewInvitationEvent(event) {\n console.debug(\"[ES] [invitation] detected new invitation (from notification service)\");\n\n // If user not auth: simply increment counter\n if (!csWallet.isAuth()) {\n $rootScope.$applyAsync(function() {\n csWallet.data.invitations = csWallet.data.invitations || {};\n csWallet.data.invitations.unreadCount++;\n });\n return;\n }\n\n getInvitationById(event.reference.id, event.reference.type)\n .then(function(invitation){\n csWallet.data.invitations = csWallet.data.invitations || {};\n csWallet.data.invitations.unreadCount++;\n\n // Insert into the result list (if exists = already loaded)\n if (csWallet.data.invitations.list) {\n csWallet.data.invitations.list.splice(0,0,invitation);\n }\n\n // Raise event\n api.data.raise.new(invitation);\n });\n }\n\n function countUnreadInvitations(pubkey) {\n pubkey = pubkey || (csWallet.isLogin() ? csWallet.data.pubkey : pubkey);\n if (!pubkey) {\n throw new Error('User not connected or no pubkey');\n }\n\n var request = {\n query: {\n bool: {\n must: [\n {term: {recipient: pubkey}}\n ]\n }\n }\n };\n\n // TODO : count using size=0\n // and with 'group by' on type\n return esHttp.post('/invitation/certification/_count')(request)\n .then(function(res) {\n return res.count;\n });\n }\n\n function sendInvitation(record, options) {\n options = options || {};\n options.type = options.type || 'certification';\n var keypair = options.keypair || (options.wallet && options.wallet.data.keypair);\n return esWallet.box.record.pack(record, keypair, 'recipient', ['content', 'comment'])\n .then(function(record) {\n return that.raw[options.type].add(record, options);\n });\n }\n\n function getInvitationById(id, type) {\n type = type || 'certification';\n return $q.all([\n esWallet.box.getKeypair(),\n that.raw[type].get({id: id, fields: fields.commons.join(',')})\n ])\n .then(function(res) {\n var keypair = res[0];\n var hit = res[1];\n var json = hit._source;\n json.id = hit._id;\n json.type = hit._type;\n\n // Encrypt content\n return esWallet.box.record.open([json], keypair, 'issuer', ['content', 'comment']);\n })\n\n // Extend identity: add name, avatar...\n .then(function(jsons) {\n var json = jsons[0];\n if (!json || !json.valid) return; // skip invalid cypher content\n var invitation = new Invitation(json);\n\n return csWot.extendAll(invitation.issuer ? [invitation, invitation.issuer] : [invitation], 'pubkey')\n .then(function() {\n return invitation;\n });\n });\n }\n\n function loadInvitations(options, keypair) {\n if (!csWallet.isLogin()) return $q.when([]); // Should never happen\n options = options || {};\n options.from = options.from || 0;\n options.size = options.size || constants.DEFAULT_LOAD_SIZE;\n\n var issuer = options.issuer || csWallet.data.pubkey;\n var request = {\n sort: {\n \"time\" : \"desc\"\n },\n query: {bool: {filter: {term: {recipient: issuer}}}},\n from: options.from,\n size: options.size,\n _source: fields.commons\n };\n\n // Filter on time\n if (options.readTime) {\n query.bool.must = [{range: {time: {gt: options.readTime}}}];\n }\n\n return that.raw.certification.postSearch(request)\n .then(function(res) {\n if (!res || !res.hits || !res.hits.total) return [];\n\n var invitations = res.hits.hits.reduce(function (result, hit) {\n var msg = hit._source;\n msg.id = hit._id;\n msg.type = hit._type;\n msg.read = !!msg.read_signature;\n delete msg.read_signature; // not need anymore\n return result.concat(msg);\n }, []);\n\n // Encrypt content\n return esWallet.box.record.open(invitations, keypair, 'issuer', ['content', 'comment']);\n })\n\n // Extension identities entity\n .then(function(invitations) {\n\n var identitiesToExtend = [];\n invitations = invitations.reduce(function (res, json) {\n if (!json || !json.valid) return res; // skipping invalid cypher\n var invitation = new Invitation(json);\n identitiesToExtend.push(invitation);\n if (invitation.issuer) {\n identitiesToExtend.push(invitation.issuer);\n }\n return res.concat(invitation);\n }, []);\n\n // Extend all identities (issuer and invitation): add name, avatar...\n return csWot.extendAll(identitiesToExtend, 'pubkey')\n\n // Update invitations count\n .then(function(){\n\n csWallet.data.invitations = csWallet.data.invitations || {};\n\n // Update invitation list\n if (!csWallet.data.invitations.list) {\n csWallet.data.invitations.list = invitations;\n }\n else {\n // Reset previous existing invitation\n if (csWallet.data.invitations.list.length) {\n csWallet.data.invitations.list.splice(options.from, csWallet.data.invitations.list.length-options.from);\n }\n // Then insert new invitations\n _.forEach(invitations, function (invitation) {\n csWallet.data.invitations.list.push(invitation);\n });\n }\n\n return csWallet.data.invitations.list; // final result\n });\n });\n }\n\n function deleteInvitation(invitation, options) {\n if (!invitation || !invitation.id) throw 'Invalid invitation (empty or without id). Could not delete.';\n var type = invitation.type || 'certification';\n var wallet = options && options.walletId && csWallet.children.get(options.walletId) || csWallet;\n return that.raw[type].remove(invitation.id, {wallet: wallet})\n .then(function() {\n // Always reset unread count\n wallet.data.invitations.unreadCount = 0;\n\n if (!wallet.data.invitations || !wallet.data.invitations.list) return;\n\n // Remove form list\n wallet.data.invitations.list.splice(wallet.data.invitations.list.indexOf(invitation), 1);\n });\n }\n\n function deleteInvitationsByIds(ids, type, options) {\n if (!ids || !ids.length) return $q.when();\n type = type || 'certification';\n return $q.all(\n ids.reduce(function(res, id) {\n return res.concat(that.raw[type].remove(id, options));\n }, [])\n );\n }\n\n function deleteAllInvitationsByPubkey(type, options) {\n\n type = type || 'certification';\n\n var now = Date.now();\n console.debug('[ES] [invitation] Deleting all {0} invitations...'.format(type));\n\n var wallet = (options && options.pubkey && csWallet.children.getByPubkey(options.pubkey)) ||\n (options && options.walletId && csWallet.children.getByPubkey(options.walletId)) ||\n csWallet;\n var countBeforeDeletion = (wallet.data.invitations && wallet.data.invitations.count) || 0;\n var unreadCountBeforeDeletion = (wallet.data.invitations && wallet.data.invitations.unreadCount) || 0;\n\n // Get invitation ids\n return that.raw[type].getIds({pubkey: wallet.data.pubkey})\n .then(function(res) {\n if (!res || !res.hits || !res.hits.total) return;\n var ids = res.hits.hits.reduce(function (res, hit) {\n return res.concat(hit._id);\n }, []);\n\n // Do deletion by ids\n return deleteInvitationsByIds(ids, type, {walletId: wallet.id})\n .then(function() {\n // Update wallet count\n wallet.data.invitations = wallet.data.invitations || {};\n // Decrement count (warning: could have received new invitations during deletion execution)\n if (wallet.data.invitations.count >= countBeforeDeletion) {\n wallet.data.invitations.count -= countBeforeDeletion || 0;\n }\n else {\n wallet.data.invitations.count = 0;\n }\n // Decrement count (warning: could have received new invitations during deletion execution)\n if (wallet.data.invitations.unreadCount >= unreadCountBeforeDeletion) {\n wallet.data.invitations.unreadCount -= unreadCountBeforeDeletion || 0;\n }\n else {\n wallet.data.invitations.unreadCount = 0;\n }\n\n console.debug('[ES] [invitation] All {0} invitations deleted in {1}ms'.format(type, Date.now()-now));\n });\n });\n }\n\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Extend csWallet events\n listeners = [\n csWallet.api.data.on.init($rootScope, onWalletInit, this),\n csWallet.api.data.on.login($rootScope, onWalletLoad, this),\n csWallet.api.data.on.load($rootScope, onWalletLoad, this),\n csWallet.api.data.on.reset($rootScope, onWalletReset, this),\n csWallet.api.action.on.certify($rootScope, onWalletCertify, this),\n esNotification.api.event.on.newInvitation($rootScope, onNewInvitationEvent, this)\n ];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [invitations] Disable\");\n removeListeners();\n if (csWallet.isLogin()) {\n onWalletReset(csWallet.data);\n }\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [invitations] Enable\");\n addListeners();\n if (csWallet.isLogin()) {\n onWalletLoad(csWallet.data);\n }\n }\n }\n\n // Register extension points\n api.registerEvent('data', 'new');\n\n // Default action\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n // Exports\n that.api = api;\n that.load = loadInvitations;\n that.get = getInvitationById;\n that.send = sendInvitation;\n that.delete = deleteInvitation;\n that.deleteByIds = deleteInvitationsByIds;\n that.deleteAll = deleteAllInvitationsByPubkey;\n\n that.constants = constants;\n\n return that;\n}])\n;\n","angular.module('cesium.es.subscription.services', ['cesium.platform', 'cesium.es.http.services'])\n.config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esSubscription');\n }\n\n }])\n\n.factory('esSubscription', ['$rootScope', '$q', '$timeout', 'esHttp', '$state', '$sce', '$sanitize', 'esSettings', 'CryptoUtils', 'UIUtils', 'csWallet', 'csWot', 'BMA', 'csPlatform', 'esWallet', function($rootScope, $q, $timeout, esHttp, $state, $sce, $sanitize,\n esSettings, CryptoUtils, UIUtils, csWallet, csWot, BMA, csPlatform, esWallet) {\n 'ngInject';\n var\n constants = {\n },\n that = this,\n listeners;\n\n that.raw = {\n getAll: esHttp.get('/subscription/record/_search?_source_excludes=recipientContent&q=issuer::issuer'),\n count: esHttp.get('/subscription/record/_search?size=0&q=issuer::pubkey'),\n add: esHttp.record.post('/subscription/record'),\n update: esHttp.record.post('/subscription/record/:id/_update'),\n category: {\n get: esHttp.get('/subscription/category/:id'),\n all: esHttp.get('/subscription/category/_search?sort=order&from=0&size=1000&_source=name,parent,key')\n }\n };\n\n function onWalletReset(data) {\n data.subscriptions = null;\n }\n\n function onWalletLoad(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey || !data.keypair) {\n deferred.resolve();\n return deferred.promise;\n }\n\n console.debug('[ES] [subscription] Loading subscriptions count...');\n\n // Load subscriptions count\n that.raw.count({pubkey: data.pubkey})\n .then(function(res) {\n data.subscriptions = data.subscriptions || {};\n data.subscriptions.count = res && res.hits && res.hits.total;\n console.debug('[ES] [subscription] Loaded count (' + data.subscriptions.count + ')');\n deferred.resolve(data);\n })\n .catch(function(err) {\n console.error('[ES] [subscription] Error while counting subscription: ' + (err.message ? err.message : err));\n deferred.resolve(data);\n });\n\n return deferred.promise;\n }\n\n function loadRecordsByPubkey(issuer, keypair) {\n return that.raw.getAll({issuer: issuer})\n .then(function(res) {\n var records = res && res.hits && res.hits.total &&\n res.hits.hits.reduce(function(res, hit) {\n var record = hit._source;\n record.id = hit._id;\n return res.concat(record);\n }, []) || [];\n\n return esWallet.box.record.open(records, keypair, 'issuer', 'issuerContent')\n .then(function(records) {\n _.forEach(records, function(record) {\n record.content = JSON.parse(record.issuerContent || '{}');\n delete record.issuerContent;\n delete record.recipientContent;\n });\n return records;\n });\n });\n }\n\n function addRecord(record, options) {\n if (!record || !record.type || !record.content || !record.recipient) {\n return $q.reject(\"Missing arguments 'record' or 'record.type' or 'record.content' or 'record.recipient'\");\n }\n\n var wallet = options && options.wallet || (options && options.walletId && csWallet.children.get(options.walletId)) || csWallet;\n var issuer = wallet.data.pubkey;\n\n var contentStr = JSON.stringify(record.content);\n\n // Get a unique nonce\n return CryptoUtils.util.random_nonce()\n // Encrypt contents\n .then(function(nonce) {\n return $q.all([\n esWallet.box.record.pack({issuer: issuer, issuerContent: contentStr}, wallet.data.keypair, 'issuer', 'issuerContent', nonce),\n esWallet.box.record.pack({recipient: record.recipient, recipientContent: contentStr}, wallet.data.keypair, 'recipient', 'recipientContent', nonce)\n ]);\n })\n // Merge encrypted record\n .then(function(res){\n var encryptedRecord = angular.merge(res[0], res[1]);\n encryptedRecord.type = record.type;\n\n // Post subscription\n return that.raw.add(encryptedRecord, {wallet: wallet})\n .then(function(id) {\n record.id = id;\n return record;\n });\n })\n ;\n }\n\n function updateRecord(record, options) {\n if (!record || !record.content || !record.recipient) {\n return $q.reject(\"Missing arguments 'record' or 'record.content', or 'record.recipient'\");\n }\n\n var wallet = options && options.wallet || (options && options.walletId && csWallet.children.get(options.walletId)) || csWallet;\n var issuer = wallet.data.pubkey;\n var contentStr = JSON.stringify(record.content);\n\n // Get a unique nonce\n return CryptoUtils.util.random_nonce()\n // Encrypt contents\n .then(function(nonce) {\n return $q.all([\n esWallet.box.record.pack({issuer: issuer, issuerContent: contentStr}, wallet.data.keypair, 'issuer', 'issuerContent', nonce),\n esWallet.box.record.pack({recipient: record.recipient, recipientContent: contentStr}, wallet.data.keypair, 'recipient', 'recipientContent', nonce)\n ]);\n })\n // Merge encrypted record\n .then(function(res){\n var encryptedRecord = angular.merge(res[0], res[1]);\n encryptedRecord.type = record.type;\n\n // Post subscription\n return that.raw.update(encryptedRecord, {id:record.id, wallet: wallet})\n .then(function() {\n return record; // return original record\n });\n })\n ;\n }\n\n function getCategories() {\n if (that.raw.categories && that.raw.categories.length) {\n var deferred = $q.defer();\n deferred.resolve(that.raw.categories);\n return deferred.promise;\n }\n\n return that.raw.category.all()\n .then(function(res) {\n if (res.hits.total === 0) {\n that.raw.categories = [];\n }\n else {\n var categories = res.hits.hits.reduce(function(result, hit) {\n var cat = hit._source;\n cat.id = hit._id;\n return result.concat(cat);\n }, []);\n // add as map also\n _.forEach(categories, function(cat) {\n categories[cat.id] = cat;\n });\n that.raw.categories = categories;\n }\n return that.raw.categories;\n });\n }\n\n function getCategory(params) {\n return that.raw.category.get(params)\n .then(function(hit) {\n var res = hit._source;\n res.id = hit._id;\n return res;\n });\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Extend\n listeners = [\n csWallet.api.data.on.load($rootScope, onWalletLoad, this),\n csWallet.api.data.on.init($rootScope, onWalletReset, this),\n csWallet.api.data.on.reset($rootScope, onWalletReset, this)\n ];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [subscription] Disable\");\n removeListeners();\n if (csWallet.isLogin()) {\n return onWalletReset(csWallet.data);\n }\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [subscription] Enable\");\n addListeners();\n if (csWallet.isLogin()) {\n return onWalletLoad(csWallet.data);\n }\n }\n }\n\n // Default actions\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n // Exports\n that.record = {\n load: loadRecordsByPubkey,\n add: addRecord,\n update: updateRecord,\n remove: esHttp.record.remove('subscription', 'record')\n };\n that.category = {\n all: getCategories,\n get: getCategory\n };\n that.constants = constants;\n\n return that;\n}])\n;\n","angular.module('cesium.es.wallet.services', ['ngResource', 'cesium.platform', 'cesium.es.http.services', 'cesium.es.crypto.services'])\n\n .factory('esWallet', ['$q', '$rootScope', '$timeout', 'CryptoUtils', 'csPlatform', 'csWallet', 'csSettings', 'esCrypto', 'esProfile', 'esHttp', function($q, $rootScope, $timeout, CryptoUtils, csPlatform, csWallet, csSettings, esCrypto, esProfile, esHttp) {\n 'ngInject';\n\n var\n listeners,\n that = this;\n\n function onWalletReset(data) {\n data.name = null;\n data.avatar = null;\n data.profile = null;\n data.moderator = null;\n csWallet.events.cleanByContext('esWallet');\n if (data.keypair) {\n delete data.keypair.boxSk;\n delete data.keypair.boxPk;\n }\n }\n\n function onWalletAuth(data, deferred) {\n deferred = deferred || $q.defer();\n\n // Generate box keypair\n esCrypto.box.getKeypair(data.keypair)\n .then(function(res) {\n data.keypair.boxSk = res.boxSk;\n data.keypair.boxPk = res.boxPk;\n console.debug(\"[ES] [wallet] Box keypair successfully computed\");\n deferred.resolve();\n })\n .catch(deferred.reject);\n return deferred.promise;\n }\n\n function onWalletUnauth(data) {\n data = data || csWallet.data;\n if (data.keypair) {\n delete data.keypair.boxSk;\n delete data.keypair.boxPk;\n }\n }\n\n function onWalletLogin(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey || !data.keypair) {\n deferred.resolve();\n return deferred.promise;\n }\n\n // Waiting to load crypto libs\n if (!CryptoUtils.isLoaded()) {\n console.debug('[ES] [wallet] Waiting crypto lib loading...');\n return $timeout(function() {\n return onWalletLogin(data, deferred);\n }, 50);\n }\n\n console.debug('[ES] [wallet] Loading user avatar+name...');\n var now = Date.now();\n\n var jobs = [\n esProfile.getAvatarAndName(data.pubkey)\n .then(function(profile) {\n if (profile) {\n data.name = profile.name;\n data.avatarStyle = profile.avatarStyle;\n data.avatar = profile.avatar;\n console.debug('[ES] [wallet] Loaded user avatar+name in '+ (Date.now()-now) +'ms');\n }\n else {\n console.debug('[ES] [wallet] No user avatar+name found');\n }\n deferred.resolve(data);\n })\n ];\n\n // Check if user is a moderators (only if expert mode)\n if (csSettings.data.expertMode) {\n jobs.push(esHttp.node.moderators()\n .then(function(res) {\n data.moderator = _.contains(res && res.moderators, data.pubkey);\n })\n .catch(function(err) {\n console.error(\"[ES] [wallet] Cannot check is user is moderator: \", (err && err.message || err));\n // Continue\n })\n );\n }\n\n $q.all(jobs)\n .then(function() {\n deferred.resolve(data);\n })\n .catch(deferred.reject);\n\n return deferred.promise;\n }\n\n function onWalletLoad(data, deferred) {\n deferred = deferred || $q.defer();\n\n // Reset events\n csWallet.events.cleanByContext('esWallet');\n\n // If membership pending and not revocated, but not enough certifications: suggest to fill user profile\n if (!data.name && !data.requirements.revoked && data.requirements.pendingMembership && data.requirements.needCertificationCount > 0) {\n csWallet.events.add({type:'info', message: 'ACCOUNT.EVENT.MEMBER_WITHOUT_PROFILE', context: 'esWallet'});\n }\n\n console.debug('[ES] [wallet] Loading full user profile...');\n var now = Date.now();\n\n // Load full profile\n esProfile.get(data.pubkey)\n .then(function(profile) {\n if (profile) {\n data.name = profile.name;\n data.avatar = profile.avatar;\n data.profile = data.profile || {};\n angular.merge(data.profile, profile.source, {descriptionHtml: profile.descriptionHtml});\n console.debug('[ES] [wallet] Loaded full user profile in {0}ms'.format(Date.now()-now));\n }\n deferred.resolve(data);\n })\n .catch(deferred.reject);\n\n return deferred.promise;\n }\n\n function getBoxKeypair(keypair) {\n if (!keypair && !csWallet.isAuth()) {\n throw new Error('Unable to get box keypair: user not authenticated !');\n }\n\n return (keypair ? $q.when(keypair) : csWallet.getKeypair({silent: true}))\n .then(function(keypair) {\n // box keypair already computed: use it\n if (keypair && keypair.boxPk && keypair.boxSk) {\n return $q.when(keypair);\n }\n // Compute box keypair\n return esCrypto.box.getKeypair(keypair)\n .then(function(res) {\n // Store in the wallet keypair\n keypair.boxSk = res.boxSk;\n keypair.boxPk = res.boxPk;\n console.debug(\"[ES] [wallet] Box keypair successfully computed\");\n return keypair;\n });\n });\n }\n\n function addListeners() {\n // Extend API events\n listeners = [\n csWallet.api.data.on.login($rootScope, onWalletLogin, this),\n csWallet.api.data.on.load($rootScope, onWalletLoad, this),\n csWallet.api.data.on.init($rootScope, onWalletReset, this),\n csWallet.api.data.on.reset($rootScope, onWalletReset, this),\n csWallet.api.data.on.unauth($rootScope, onWalletUnauth, this),\n csWallet.api.data.on.auth($rootScope, onWalletAuth, this)\n ];\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [wallet] Disable\");\n removeListeners();\n if (csWallet.isLogin()) {\n return onWalletReset(csWallet.data);\n }\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [wallet] Enable\");\n addListeners();\n if (csWallet.isLogin()) {\n return onWalletLogin(csWallet.data);\n }\n }\n }\n\n // Default action\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n // exports\n that.box = {\n getKeypair: getBoxKeypair,\n record: {\n pack: function(record, keypair, recipientFieldName, cypherFieldNames, nonce) {\n return getBoxKeypair(keypair)\n .then(function(fullKeypair) {\n return esCrypto.box.pack(record, fullKeypair, recipientFieldName, cypherFieldNames, nonce);\n });\n },\n open: function(records, keypair, issuerFieldName, cypherFieldNames) {\n return getBoxKeypair(keypair)\n .then(function(fullKeypair) {\n return esCrypto.box.open(records, fullKeypair, issuerFieldName, cypherFieldNames);\n });\n }\n }\n };\n\n return that;\n }])\n;\n","angular.module('cesium.es.wot.services', ['ngResource', 'cesium.es.http.services'])\n\n .factory('esWot', ['$rootScope', '$q', 'esHttp', 'csCache', function($rootScope, $q, esHttp, csCache) {\n 'ngInject';\n\n var\n cachePrefix = 'esWot-',\n membershipsCache = csCache.get(cachePrefix + 'memberships-', csCache.constants.MEDIUM),\n raw = {\n user: {\n event: esHttp.post('/user/event/_search')\n }\n };\n\n function loadMemberships(pubkey, options) {\n options = options || {};\n\n var result = (options.cache !== false) ? membershipsCache.get(pubkey) : null;\n if (result) return $q.when(result);\n\n // Get user events on membership state\n var request = {\n \"size\": 1000,\n \"query\": {\n \"bool\": {\n \"filter\": [\n {\"term\": {\"recipient\" : pubkey }},\n {\"terms\": {\"code\" : [\"MEMBER_JOIN\",\"MEMBER_ACTIVE\",\"MEMBER_LEAVE\",\"MEMBER_EXCLUDE\",\"MEMBER_REVOKE\"] }}\n ]\n }\n },\n \"sort\" : [\n { \"time\" : {\"order\" : \"asc\"}}\n ],\n _source: [\"code\", \"time\"]\n };\n\n return raw.user.event(request)\n\n .then(function(res) {\n if (!res.hits || !res.hits.total) return;\n\n // Compute member periods\n var lastJoinTime;\n var result = res.hits.hits.reduce(function(res, hit){\n var isMember = hit._source.code === 'MEMBER_JOIN' || hit._source.code === 'MEMBER_ACTIVE';\n // If join\n if (isMember && !lastJoinTime) {\n lastJoinTime = hit._source.time;\n }\n // If leave\n else if (!isMember && lastJoinTime) {\n // Add an entry\n res = res.concat({\n joinTime: lastJoinTime,\n leaveTime: hit._source.time\n });\n lastJoinTime = 0; // reset\n }\n return res;\n }, []);\n\n if (lastJoinTime) {\n // Add last entry if need\n result.push({\n joinTime: lastJoinTime,\n leaveTime: moment().utc().unix()\n });\n }\n\n // Put in the cache\n membershipsCache.put(pubkey, result);\n\n return result;\n });\n }\n\n function cleanAllCache() {\n console.debug(\"[ES] [wot] Cleaning cache {prefix: '{0}'}...\".format(cachePrefix));\n csCache.clear(cachePrefix);\n }\n\n // Listen if node changed\n esHttp.api.node.on.stop($rootScope, cleanAllCache, this);\n\n return {\n memberships: loadMemberships,\n cache: {\n clearAll: cleanAllCache\n }\n };\n }]);\n","angular.module('cesium.es.tx.services', ['ngResource', 'cesium.services', 'cesium.es.http.services', 'cesium.es.wot.services'])\n\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esTx');\n }\n\n }])\n\n .factory('esTx', ['$q', '$rootScope', 'csPlatform', 'csCurrency', 'csTx', 'esHttp', 'esWot', function($q, $rootScope, csPlatform, csCurrency, csTx, esHttp, esWot) {\n 'ngInject';\n\n var\n listeners,\n raw = {\n block: {\n search: esHttp.post('/:currency/block/_search')\n }\n };\n\n function _powBase(amount, base) {\n return base <= 0 ? amount : amount * Math.pow(10, base);\n }\n\n function onLoadUDs(options, deferred) {\n deferred = deferred || $q.defer();\n\n options = options || {};\n if (!options.pubkey) deferred.reject('Missing [pubkey] when calling [loadUDs] extension point');\n\n $q.all([\n // Get currency\n csCurrency.get(),\n\n // Get user memberships\n esWot.memberships(options.pubkey)\n ])\n .then(function(res) {\n var currency = res[0] && res[0].name;\n var memberships = res[1];\n if (!currency || !memberships || !memberships.length) return;\n\n // Filter memberships using options.fromTime\n if (options.fromTime !== -1) {\n memberships = memberships.reduce(function(res, membership) {\n if (membership.leaveTime < options.fromTime) return res;\n membership.joinTime = Math.max(membership.joinTime, options.fromTime);\n return res.concat(membership);\n }, []);\n }\n\n return $q.all(memberships.reduce(function(res, membership) {\n var request = {\n query: {\n filtered: {\n filter: {\n bool: {\n must: [\n {\n exists: {\n field: 'dividend'\n }\n },\n {\n range: {\n medianTime: {\n // Fix #736: Add 1 second, because when membership begins in a block with DU, the DU is not received\n from: membership.joinTime+1,\n to: membership.leaveTime\n }\n }\n }\n ]\n }\n }\n }\n },\n size: options.size || 10000, // TODO: use scroll ?\n from: options.from || 0,\n sort: {\"medianTime\" : \"desc\"},\n _source: [\"medianTime\", \"number\", \"dividend\", \"unitbase\"]\n };\n return res.concat(raw.block.search(request, {currency: currency}));\n }, []));\n })\n .then(function(res){\n if (!res || !res.length) return;\n return res.reduce(function(uds, res){\n\n if (!res.hits.total || !res.hits.hits.length) return res;\n\n return uds.concat(res.hits.hits.reduce(function(res, hit){\n var block = hit._source;\n return res.concat({\n time: block.medianTime,\n amount: _powBase(block.dividend, block.unitbase),\n isUD: true,\n block_number: block.number\n });\n }, []));\n\n }, []);\n\n })\n .then(function(res){\n deferred.resolve(res);\n })\n .catch(function(err) {\n deferred.reject(err);\n });\n\n return deferred.promise;\n }\n\n function addListeners() {\n // Extend API events\n listeners = [\n csTx.api.data.on.loadUDs($rootScope, onLoadUDs, this)\n ];\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [tx] Disable\");\n removeListeners();\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [tx] Enable\");\n addListeners();\n }\n }\n\n // Default action\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n // Exports\n return {};\n }]);\n","angular.module('cesium.es.geo.services', ['cesium.services', 'cesium.es.http.services'])\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esGeo');\n }\n\n }])\n\n .factory('esGeo', ['$rootScope', '$q', 'csConfig', 'csSettings', 'csHttp', function($rootScope, $q, csConfig, csSettings, csHttp) {\n 'ngInject';\n\n var\n that = this;\n\n that.raw = {\n osm: {\n search: csHttp.get('nominatim.openstreetmap.org', 443, '/search.php?format=json'),\n license: {\n name: 'OpenStreetMap',\n url: 'https://www.openstreetmap.org/copyright'\n }\n },\n google: {\n apiKey: undefined,\n search: csHttp.get('maps.google.com', 443, '/maps/api/geocode/json')\n },\n freegeoip: {\n //search: csHttp.get('localhost', 8080, '/json/:ip'),\n search: csHttp.get('freegeoip.net', 443, '/json/:ip'),\n license: {\n name: 'freegeoip',\n url: 'https://freegeoip.net'\n }\n }\n };\n\n function _normalizeAddressString(text) {\n // Remove line break\n var searchText = text.trim().replace(/\\n/g, ',');\n // Remove zip code\n searchText = searchText.replace(/(?:^|[\\t\\n\\r\\s ])([A−Z09-]+)(?:$|[\\t\\n\\r\\s ])/g, '');\n // Remove redundant comma\n searchText = searchText.replace(/,[ ,]+/g, ', ');\n return searchText;\n }\n\n function googleSearchPositionByString(address) {\n\n return that.raw.google.search({address: address, key: that.raw.google.apiKey})\n .then(function(res) {\n if (!res || !res.results || !res.results.length) return;\n return res.results.reduce(function(res, hit) {\n return res.concat({\n display_name: hit.address_components && hit.address_components.reduce(function(res, address){\n return address.long_name ? res.concat(address.long_name) : res;\n }, []).join(', '),\n lat: hit.geometry && hit.geometry.location && hit.geometry.location.lat,\n lon: hit.geometry && hit.geometry.location && hit.geometry.location.lng\n });\n }, []);\n });\n }\n\n function _fallbackSearchPositionByString(osmErr, address) {\n\n console.debug('[ES] [geo] Search position failed on [OSM]. Trying [google] service');\n\n return googleSearchPositionByString(address)\n .catch(function(googleErr) {\n console.debug('[ES] [geo] Search position failed on [google] service');\n throw osmErr || googleErr; // throw first OMS error if exists\n });\n }\n\n function searchPositionByAddress(query) {\n\n if (typeof query == 'string') {\n query = {q: query};\n }\n\n // Normalize query string\n if (query.q) {\n query.q = _normalizeAddressString(query.q);\n }\n\n query.addressdetails = 1; // need address field\n\n var now = Date.now();\n //console.debug('[ES] [geo] Searching position...', query);\n\n return that.raw.osm.search(query)\n .then(function(res) {\n //console.debug('[ES] [geo] Received {0} results from OSM'.format(res && res.length || 0), res);\n if (!res) return; // no result\n\n // Filter on city/town/village\n res = res.reduce(function(res, hit){\n if (hit.class == 'waterway' || hit.class == 'railway' ||!hit.address) return res;\n hit.address.city = hit.address.city || hit.address.village || hit.address.town || hit.address.postcode;\n hit.address.road = hit.address.road || hit.address.suburb || hit.address.hamlet;\n if (hit.address.postcode && hit.address.city == hit.address.postcode) {\n delete hit.address.postcode;\n }\n if (!hit.address.city) return res;\n return res.concat({\n id: hit.place_id,\n name: hit.display_name,\n address: hit.address,\n lat: hit.lat,\n lon: hit.lon,\n class: hit.class,\n license: that.raw.osm.license\n });\n }, []);\n\n console.debug('[ES] [geo] Found {0} address position(s)'.format(res && res.length || 0, Date.now() - now), res);\n\n return res.length ? res : undefined;\n })\n\n // Fallback service\n .catch(function(err) {\n var address = query.q ? query.q : ((query.street ? query.street +', ' : '') + query.city + (query.country ? ', '+ query.country : ''));\n return _fallbackSearchPositionByString(err, address);\n });\n }\n\n function getCurrentPosition() {\n var defer = $q.defer();\n if (navigator.geolocation) {\n navigator.geolocation.getCurrentPosition(function(position) {\n if (!position || !position.coords) {\n console.error('[ES] [geo] navigator geolocation > Unknown format:', position);\n return;\n }\n defer.resolve({\n lat: position.coords.latitude,\n lon: position.coords.longitude\n });\n }, function(error) {\n defer.reject(error);\n },{timeout:5000});\n }else{\n defer.reject();\n }\n return defer.promise;\n }\n\n function searchPositionByIP(ip) {\n\n //var now = new Date();\n //console.debug('[ES] [geo] Searching IP position [{0}]...'.format(ip));\n\n return that.raw.freegeoip.search({ip: ip})\n .then(function(res) {\n //console.debug('[ES] [geo] Found IP {0} position in {0}ms'.format(res ? 1 : 0, Date.now() - now.getTime()));\n return res ? {\n lat: res.latitude,\n lng: res.longitude\n } : undefined;\n });\n }\n\n // Source: http://www.geodatasource.com/developers/javascript\n // Unit: 'M' is statute miles (default), 'Km' is kilometers, 'N' is nautical miles\n function getDistance(lat1, lon1, lat2, lon2, unit) {\n var radlat1 = Math.PI * lat1/180;\n var radlat2 = Math.PI * lat2/180;\n var theta = lon1-lon2;\n var radtheta = Math.PI * theta/180;\n var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);\n dist = Math.acos(dist);\n dist = dist * 180/Math.PI;\n dist = dist * 60 * 1.1515;\n // nautical miles\n if (unit == \"km\") { return dist * 1.609344; }\n // nautical miles\n if (unit == \"N\") return dist * 0.8684;\n // statute miles\n return dist;\n }\n\n that.raw.google.apiKey = csConfig.plugins && csConfig.plugins.es && csConfig.plugins.es.googleApiKey;\n var hasConfigApiKey = !!that.raw.google.apiKey;\n csSettings.ready()\n .then(function() {\n\n // Listen settings changed\n function onSettingsChanged(data){\n if (!hasConfigApiKey) {\n // If no google api key in config, use in settings\n that.raw.google.apiKey = data.plugins.es.googleApiKey;\n }\n that.raw.google.enable = that.raw.google.apiKey && data.plugins && data.plugins.es && data.plugins.es.enableGoogleApi;\n }\n csSettings.api.data.on.changed($rootScope, onSettingsChanged, this);\n\n onSettingsChanged(csSettings.data);\n });\n\n return {\n point: {\n current: getCurrentPosition,\n searchByAddress: searchPositionByAddress,\n distance: getDistance,\n ip: {\n search: searchPositionByIP,\n license: that.raw.freegeoip.license\n }\n },\n google: {\n isEnable: function() {\n return that.raw.google.enable && that.raw.google.apiKey;\n },\n searchByAddress: googleSearchPositionByString\n }\n };\n }]);\n","angular.module('cesium.es.document.services', ['ngResource', 'cesium.platform', 'cesium.es.http.services'])\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esDocument');\n }\n\n }])\n\n .factory('esDocument', ['$q', '$rootScope', '$timeout', 'UIUtils', 'Api', 'CryptoUtils', 'csPlatform', 'csConfig', 'csSettings', 'csWot', 'csWallet', 'esHttp', function($q, $rootScope, $timeout, UIUtils, Api, CryptoUtils,\n csPlatform, csConfig, csSettings, csWot, csWallet, esHttp) {\n 'ngInject';\n\n var\n constants = {\n DEFAULT_LOAD_SIZE: 40\n },\n fields = {\n commons: [\"issuer\", \"pubkey\", \"hash\", \"time\", \"recipient\", \"nonce\", \"read_signature\"],\n peer: [\"*\"],\n movement: [\"*\"]\n },\n raw = {\n search: esHttp.post('/:index/:type/_search'),\n searchText: esHttp.get('/:index/:type/_search?q=:text&_source=:source')\n };\n\n function _initOptions(options) {\n if (!options || !options.index || !options.type) throw new Error('Missing mandatory options [index, type]');\n\n var side = 'desc';\n if (options.type === 'peer') {\n if (!options.sort || options.sort.time) {\n side = options.sort && options.sort.time || side;\n options.sort = {\n 'stats.medianTime': {\n nested_path: 'stats',\n order: side\n }\n };\n }\n options._source = fields.peer;\n options.getTimeFunction = function(doc) {\n doc.time = doc.stats && doc.stats.medianTime;\n return doc.time;\n };\n }\n else if (options.type === 'movement') {\n if (!options.sort || options.sort.time) {\n side = options.sort && options.sort.time || side;\n options.sort = {'medianTime': side};\n }\n options._source = options._source || fields.movement;\n options.getTimeFunction = function(doc) {\n doc.time = doc.medianTime;\n return doc.time;\n };\n }\n\n return options;\n }\n\n function _readSearchHits(res, options) {\n options.issuerField = options.issuerField || 'pubkey';\n\n var hits = (res && res.hits && res.hits.hits || []).reduce(function(res, hit) {\n var doc = hit._source || {};\n doc.docType = doc.type; // Save source.type, before replacement\n doc.index = hit._index;\n doc.type = hit._type;\n doc.id = hit._id;\n doc.pubkey = doc.issuer || options.issuerField && doc[options.issuerField] || doc.pubkey; // need to call csWot.extendAll()\n doc.time = options.getTimeFunction && options.getTimeFunction(doc) || doc.time;\n doc.thumbnail = esHttp.image.fromHit(hit, 'avatar') || esHttp.image.fromHit(hit, 'thumbnail');\n return res.concat(doc);\n }, []);\n\n\n var recipients = hits.reduce(function(res, doc) {\n if (doc.recipient) {\n doc.recipient = {\n pubkey: doc.recipient\n };\n return res.concat(doc.recipient);\n }\n return res;\n }, []);\n\n return csWot.extendAll(hits.concat(recipients))\n .then(function() {\n return {\n hits: hits,\n took: res.took,\n total: res && res.hits && res.hits.total || 0\n };\n });\n }\n\n function readSearchHit(hit) {\n var options = _initOptions({\n index: hit._index,\n type: hit._type\n });\n\n return _readSearchHits({\n hits: {\n hits: [hit]\n }\n }, options)\n .then(function(res) {\n return res.hits[0];\n });\n }\n\n function search(options) {\n options = _initOptions(options);\n\n var request = {\n from: options.from || 0,\n size: options.size || constants.DEFAULT_LOAD_SIZE,\n sort: options.sort || {time:'desc'},\n _source: options._source || fields.commons\n };\n if (options.query) {\n request.query = options.query;\n }\n\n return raw.search(request, {\n index: options.index,\n type: options.type\n })\n .then(function(res) {\n return _readSearchHits(res, options);\n });\n }\n\n function searchText(queryString, options) {\n\n options = options || {};\n\n var request = {\n text: queryString,\n index: options.index || 'user',\n type: options.type || 'profiles',\n from: options.from || 0,\n size: options.size || constants.DEFAULT_LOAD_SIZE,\n sort: options.sort || 'time:desc',\n source: options._source && options._source.join(',') || fields.commons.join(',')\n };\n\n console.debug('[ES] [wallet] [document] [{0}/{1}] Loading documents...'.format(\n options.index,\n options.type\n ));\n var now = Date.now();\n\n return raw.searchText(request)\n .then(function(res) {\n return _readSearchHits(res, options);\n })\n .then(function(res) {\n console.debug('[ES] [document] [{0}/{1}] Loading {2} documents in {3}ms'.format(\n options.index,\n options.type,\n res && res.hits && res.hits.length || 0,\n Date.now() - now\n ));\n return res;\n });\n }\n\n function remove(document, options) {\n if (!document || !document.index || !document.type || !document.id) return $q.reject('Could not remove document: missing mandatory fields');\n\n return esHttp.record.remove(document.index, document.type)(document.id, options);\n }\n\n function removeAll(documents, options) {\n if (!documents || !documents.length) return;\n\n var wallet = options && options.walletId && csWallet.children.get(options.walletId) || csWallet;\n\n return wallet.auth() // Auth once\n .then(function() {\n // Remove each doc\n return $q.all(documents.reduce(function (res, doc) {\n return res.concat(esHttp.record.remove(doc.index, doc.type)(doc.id, {wallet: wallet}));\n }, []));\n });\n }\n\n return {\n search: search,\n searchText: searchText,\n remove: remove,\n removeAll: removeAll,\n fields: {\n commons: fields.commons\n },\n fromHit: readSearchHit\n };\n }])\n;\n","\nangular.module('cesium.es.network.services', ['ngApi', 'cesium.es.http.services'])\n\n.factory('esNetwork', ['$rootScope', '$q', '$interval', '$timeout', '$window', 'csSettings', 'csConfig', 'esHttp', 'Api', 'BMA', function($rootScope, $q, $interval, $timeout, $window, csSettings, csConfig, esHttp, Api, BMA) {\n 'ngInject';\n\n function EsNetwork(id) {\n\n var\n interval,\n constants = {\n UNKNOWN_BUID: -1\n },\n isHttpsMode = $window.location.protocol === 'https:',\n api = new Api(this, \"csNetwork-\" + id),\n\n data = {\n pod: null,\n listeners: [],\n loading: true,\n peers: [],\n filter: {\n endpointFilter: null,\n online: true,\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 searchingPeersOnNetwork: false,\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.pod = null;\n data.listeners = [];\n data.peers.splice(0);\n data.filter = {\n endpointFilter: null,\n online: true\n };\n data.sort = {\n type: null,\n asc: true\n };\n data.groupBy = 'pubkey';\n data.expertMode = false;\n data.knownBlocks = [];\n data.mainBlock = null;\n data.loading = true;\n data.searchingPeersOnNetwork = false;\n data.timeout = csConfig.timeout;\n\n data.document = {\n index : csSettings.data.plugins.es && csSettings.data.plugins.es.document && csSettings.data.plugins.es.document.index || 'user',\n type: csSettings.data.plugins.es && csSettings.data.plugins.es.document && csSettings.data.plugins.es.document.type || 'profile'\n };\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 loadPeers = function() {\n data.peers = [];\n data.searchingPeersOnNetwork = true;\n data.loading = true;\n data.pod = data.pod || esHttp;\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 return $q.when()\n .then(function(){\n // online nodes\n if (data.filter.online) {\n return data.pod.network.peers()\n .then(function(res){\n var jobs = [];\n _.forEach(res.peers, function(json) {\n if (json.status !== 'UP') return;\n jobs.push(addOrRefreshPeerFromJson(json, newPeers));\n });\n\n if (jobs.length) return $q.all(jobs);\n })\n .catch(function(err) {\n // Log and continue\n console.error(err);\n });\n }\n\n // offline nodes\n return data.pod.network.peers()\n .then(function(res){\n var jobs = [];\n _.forEach(res.peers, function(json) {\n if (json.status === 'UP') return;\n jobs.push(addOrRefreshPeerFromJson(json, newPeers));\n });\n if (jobs.length) return $q.all(jobs);\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 on endpoints\n if (data.filter.endpointFilter &&\n (peer.ep && peer.ep.api && peer.ep.api !== data.filter.endpointFilter || !peer.hasEndpoint(data.filter.endpointFilter))) {\n return false;\n }\n\n // Filter on status\n if (!data.filter.online && peer.status === 'UP') {\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 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.ep && refreshedPeer.ep.api || '',\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.ep && refreshedPeer.ep.api || '',\n refreshedPeer.server,\n refreshedPeer.online ? 'UP' : 'DOWN'));\n hasUpdates = true;\n }\n else {\n console.debug(\"[ES] [network] {0} endpoint [{1}] unchanged\".format(\n refreshedPeer.ep && refreshedPeer.ep.api || '',\n refreshedPeer.server));\n }\n }\n else if (refreshedPeer && (refreshedPeer.online === data.filter.online || data.filter.online === 'all')) {\n console.debug(\"[ES] [network] {0} endpoint [{1}] is {2}\".format(\n refreshedPeer.ep && refreshedPeer.ep.api || '',\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 EsPeer(json);\n\n // Read 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 = esHttp.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.ep = ep;\n peer.server = peer.getServer();\n peer.dns = peer.getDns();\n peer.blockNumber = peer.block && peer.block.replace(/-.+$/, '');\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 // App running in SSL: Do not try to access not SSL node,\n if (isHttpsMode && !peer.isSsl()) {\n peer.online = (peer.status === 'UP');\n peer.buid = constants.UNKNOWN_BUID;\n delete peer.version;\n\n return $q.when(peer);\n }\n\n // Do not try to access TOR or WS2P endpoints\n if (peer.ep.useTor) {\n peer.online = (peer.status == 'UP');\n peer.buid = constants.UNKNOWN_BUID;\n delete peer.software;\n delete peer.version;\n return $q.when(peer);\n }\n\n peer.api = peer.api || esHttp.lightInstance(peer.getHost(), peer.getPort(), peer.isSsl(), data.timeout);\n\n // Get current block\n return peer.api.blockchain.current()\n .then(function(block) {\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 ep = peer.ep || peer.getEP();\n if (ep.dns && peer.server.indexOf(ep.dns) === -1) {\n // try again, using DNS instead of IPv4 / IPV6\n peer.secondTry = true;\n peer.api = esHttp.lightInstance(ep.dns, peer.getPort(), peer.isSsl(), data.timeout);\n return refreshPeer(peer); // recursive call\n }\n }\n\n peer.online=false;\n peer.currentNumber = null;\n peer.buid = null;\n return peer;\n })\n .then(function(peer) {\n // Exit if offline\n if (!data.filter.online || !peer || !peer.online) return peer;\n\n peer.docCount = {};\n\n return $q.all([\n // Get summary (software and version) - expert mode only\n !data.expertMode ? $q.when() : 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 = '?';\n }),\n\n // Count documents\n peer.api.record.count(data.document.index,data.document.type)\n .then(function(count){\n peer.docCount.record = count;\n })\n .catch(function() {\n peer.docCount.record = undefined;\n }),\n\n // Count email subscription\n peer.api.subscription.count({recipient: peer.pubkey, type: 'email'})\n .then(function(res){\n peer.docCount.emailSubscription = res;\n })\n .catch(function() {\n peer.docCount.emailSubscription = undefined; // continue\n })\n ]);\n\n })\n .then(function() {\n // Clean the instance\n delete peer.api;\n return peer;\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 _.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 });\n // Compute pct of use, per buid\n _.forEach(_.values(buids), function(buid) {\n buid.pct = buid.count * 100 / data.peers.length;\n });\n var 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 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 var sortScore = 0;\n sortScore += (data.sort.type == 'name' ? computeScoreAlphaValue(peer.name, 10, data.sort.asc) : 0);\n sortScore += (data.sort.type == 'software' ? computeScoreAlphaValue(peer.software, 10, data.sort.asc) : 0);\n sortScore += (data.sort.type == 'api') &&\n ((peer.hasEndpoint('ES_SUBSCRIPTION_API') && (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 sortScore += (data.sort.type == 'doc_count' ? (peer.docCount ? (data.sort.asc ? (1000000000 - peer.docCount) : peer.docCount) : 0) : 0);\n score += (10000000000 * sortScore);\n }\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 }\n else {\n score += (100 * (peer.uid ? computeScoreAlphaValue(peer.uid, 2, true) : 0));\n score += (1 * (!peer.uid ? computeScoreAlphaValue(peer.pubkey, 2, true) : 0));\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.pod.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.pod.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(pod, options) {\n options = options || {};\n return esHttp.ready()\n .then(function() {\n close();\n resetData();\n data.pod = pod || esHttp;\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 console.info('[ES] [network] Starting network from [{0}]'.format(data.pod.server));\n var now = Date.now();\n\n addListeners();\n\n return loadPeers()\n .then(function(peers){\n console.debug('[ES] [network] Started in '+(Date.now() - now)+'ms');\n return peers;\n });\n });\n },\n\n close = function() {\n if (data.pod) {\n console.info('[ES] [network-service] Stopping...');\n removeListeners();\n resetData();\n }\n },\n\n isStarted = function() {\n return !data.pod;\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 id: id,\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\n var service = new EsNetwork('default');\n\n service.instance = function(id) {\n return new EsNetwork(id);\n };\n\n return service;\n}]);\n","angular.module('cesium.es.like.services', ['ngResource', 'cesium.services',\n 'cesium.es.http.services'])\n\n .factory('esLike', ['$q', 'csWallet', 'esHttp', function($q, csWallet, esHttp) {\n 'ngInject';\n\n\n var constants = {\n KINDS: ['LIKE', 'ABUSE']\n };\n\n function EsLike(index, type) {\n\n var that = this;\n that.raw = {\n getSearch: esHttp.get('/like/record/_search?_source=false&q=:q'),\n searchBaseQueryString: 'index:{0} AND type:{1} AND id:'.format(index, type),\n postSearch: esHttp.post(\"/like/record/_search\"),\n postRecord: esHttp.record.post('/{0}/{1}/:id/_like'.format(index, type)),\n removeRecord: esHttp.record.remove('like', 'record')\n };\n\n function getLikeIds(id, options) {\n options = options || {};\n options.kind = options.kind || 'LIKE';\n var queryString = that.raw.searchBaseQueryString + id;\n if (options.kind) queryString += ' AND kind:' + options.kind.toUpperCase();\n if (options.issuer) queryString += ' AND issuer:' + options.issuer;\n\n return that.raw.getSearch({q: queryString})\n .then(function(res) {\n return (res && res.hits && res.hits.hits || []).map(function(hit) {\n return hit._id;\n });\n });\n }\n\n function addLike(id, options) {\n options = options || {};\n options.kind = options.kind && options.kind.toUpperCase() || 'LIKE';\n if (!csWallet.isLogin()) return $q.reject('Wallet must be login before sending record to ES node');\n var record = {\n version: 2,\n index: index,\n type: type,\n id: id,\n kind: options.kind\n };\n if (options.comment) record.comment = options.comment;\n if (angular.isDefined(options.level)) record.level = options.level;\n\n return that.raw.postRecord(record, options);\n }\n\n function toggleLike(id, options) {\n options = options || {};\n options.kind = options.kind || 'LIKE';\n var pubkey = options.pubkey || options.wallet && options.wallet.data.pubkey || (csWallet.isLogin() && csWallet.data.pubkey);\n if (!pubkey) return $q.reject('User not log in!');\n options.wallet = options.wallet || csWallet.getByPubkey(pubkey);\n return getLikeIds(id, {kind: options.kind, issuer: pubkey})\n .then(function(existingLikeIds) {\n // User already like: so remove it\n if (existingLikeIds && existingLikeIds.length) {\n return $q.all(_.map(existingLikeIds, function(likeId) {\n return removeLike(likeId, options);\n }))\n // Return the deletion, as a delta\n .then(function() {\n return -1 * existingLikeIds.length;\n });\n }\n // User not like, so add it\n else {\n return addLike(id, options)\n // Return the insertion, as a delta\n .then(function() {\n return +1;\n });\n }\n });\n }\n\n function removeLike(id, options) {\n if (!id) throw new Error(\"Missing 'id' argument\");\n return that.raw.removeRecord(id, options);\n }\n\n function countLike(id, options) {\n options = options || {};\n options.kind = options.kind || 'LIKE';\n\n var request = {\n query: {\n bool: {\n filter: [\n {term: {index: index}},\n {term: {type: type}},\n {term: {id: id}},\n {term: {kind: options.kind.toUpperCase()}}\n ]\n }\n },\n size: 0\n };\n\n // To known if the user already like, add 'should' on issuers\n var issuers = options.issuer ? [options.issuer] : options.issuers;\n if (issuers && issuers.length) {\n request.query.bool.should = {terms: {issuer: issuers}};\n request.size = issuers.length;\n request._source = [\"issuer\"];\n }\n\n return that.raw.postSearch(request)\n .then(function(res) {\n var hits = res && res.hits;\n var result = {\n total: hits && hits.total || 0,\n wasHitByPubkey: {},\n wasHitCount: 0\n };\n\n // Check is issuer is return (because of size=1 and should filter)\n _.forEach(issuers, function(issuer) {\n var issuerHitIndex = hits ? _.findIndex(hits.hits || [], function(hit) {\n return hit._source.issuer === issuer;\n }) : -1;\n\n result.wasHitByPubkey[issuer] = issuerHitIndex !== -1 || false;\n result.wasHitCount += issuerHitIndex !== -1 ? 1 : 0;\n });\n\n return result;\n });\n }\n\n // Expose functions\n return {\n index: index,\n type: type,\n toggle: toggleLike,\n add: addLike,\n remove: removeLike,\n count: countLike\n };\n }\n\n return {\n constants: constants,\n instance: EsLike\n };\n }])\n;\n","angular.module('cesium.es.currency.controllers', ['ngResource', 'cesium.es.services'])\n\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n PluginServiceProvider.extendState('app.currency.tab_blocks', {\n points: {\n 'nav-buttons': {\n templateUrl: \"plugins/es/templates/currency/tab_blocks_extend.html\",\n controller: 'ESExtensionCtrl'\n }\n }\n })\n ;\n }\n }])\n;\n\n","\nangular.module('cesium.graph.plugin', [\n // Services\n 'cesium.graph.services',\n // Controllers\n 'cesium.graph.common.controllers',\n 'cesium.graph.blockchain.controllers',\n 'cesium.graph.network.controllers',\n 'cesium.graph.currency.controllers',\n 'cesium.graph.account.controllers',\n 'cesium.graph.docstats.controllers',\n 'cesium.graph.synchro.controllers'\n ])\n;\n","\nangular.module('cesium.graph.services', [\n // Services\n 'cesium.graph.color.services',\n 'cesium.graph.data.services'\n ])\n;\n","angular.module('cesium.graph.data.services', ['cesium.wot.services', 'cesium.es.http.services', 'cesium.es.wot.services'])\n\n .factory('gpData', ['$rootScope', '$q', '$timeout', 'csHttp', 'esHttp', 'BMA', 'csWot', 'csCache', 'esWot', function($rootScope, $q, $timeout, csHttp, esHttp, BMA, csWot, csCache, esWot) {\n 'ngInject';\n\n var\n cachePrefix = 'gpData-',\n currencyCache = csCache.get(cachePrefix + 'currency-', csCache.constants.SHORT),\n exports = {\n node: {},\n wot: {},\n blockchain: {},\n docstat: {},\n synchro: {\n execution: {}\n },\n raw: {\n block: {\n search: esHttp.post('/:currency/block/_search')\n },\n blockstat: {\n search: esHttp.post('/:currency/blockstat/_search')\n },\n movement: {\n search: esHttp.post('/:currency/movement/_search')\n },\n user: {\n event: esHttp.post('/user/event/_search?pretty')\n },\n docstat: {\n search: esHttp.post('/document/stats/_search')\n },\n synchro: {\n search: esHttp.post('/:currency/synchro/_search')\n }\n\n },\n regex: {\n }\n };\n\n function _powBase(amount, base) {\n return base <= 0 ? amount : amount * Math.pow(10, base);\n }\n\n function rawLightInstance(host, port, useSsl, timeout) {\n port = port || 80;\n useSsl = angular.isDefined(useSsl) ? useSsl : (port == 443);\n\n return {\n docstat: {\n search: csHttp.post(host, port, '/document/stats/_search', useSsl, timeout)\n },\n synchro: {\n search: csHttp.post(host, port, '/:currency/synchro/_search', useSsl, timeout)\n }\n };\n }\n\n function _initRangeOptions(options) {\n options = options || {};\n options.maxRangeSize = options.maxRangeSize || 30;\n options.defaultTotalRangeCount = options.defaultTotalRangeCount || options.maxRangeSize*2;\n\n options.rangeDuration = options.rangeDuration || 'day';\n options.endTime = options.endTime || moment().utc().add(1, options.rangeDuration).unix();\n options.startTime = options.startTime ||\n moment.unix(options.endTime).utc().subtract(options.defaultTotalRangeCount, options.rangeDuration).unix();\n // Make to sure startTime is never before the currency starts - fix #483\n if (options.firstBlockTime && options.startTime < options.firstBlockTime) {\n options.startTime = options.firstBlockTime;\n }\n return options;\n }\n\n /**\n * Graph: \"blocks count by issuer\"\n * @param currency\n * @returns {*}\n */\n exports.blockchain.countByIssuer = function(currency) {\n\n var request = {\n size: 0,\n aggs: {\n blocksByIssuer: {\n terms: {\n field: 'issuer',\n size: 0\n }\n }\n }\n };\n\n return exports.raw.block.search(request, {currency: currency})\n .then(function(res) {\n var aggs = res.aggregations;\n if (!aggs.blocksByIssuer || !aggs.blocksByIssuer.buckets || !aggs.blocksByIssuer.buckets.length) return;\n\n var result = {\n blockCount: res.hits.total\n };\n result.data = (aggs.blocksByIssuer.buckets || []).reduce(function(res, agg) {\n return res.concat(agg.doc_count);\n }, []);\n result.issuers = (aggs.blocksByIssuer.buckets || []).reduce(function(res, agg) {\n return res.concat({pubkey: agg.key});\n }, []);\n\n return csWot.extendAll(result.issuers)\n .then(function() {\n // Set labels, using name, uid or pubkey\n result.labels = result.issuers.reduce(function(res, issuer) {\n return res.concat(issuer.name || issuer.uid || issuer.pubkey.substr(0,8));\n }, []);\n return result;\n });\n });\n };\n\n /**\n * All block with dividend\n * @param currency\n * @returns {*}\n */\n exports.blockchain.withDividend = function(currency, options) {\n options = options || {};\n var withCache = angular.isDefined(options.withCache) ? options.withCache : true; // enable by default\n\n var cacheKey = [currency, JSON.stringify(options)].join('-');\n if (withCache) {\n var result = currencyCache.get(cacheKey);\n if (result) {\n // should be already a promise (previous call still running)\n if (!result.blocks) {\n var deferred = $q.defer();\n result.then(function(res) {\n //console.debug(\"[graph] Detected a duplicated request on monetaryMass [\" + currency + \"]: will use same request result\");\n deferred.resolve(res);\n return res;\n });\n return deferred.promise;\n }\n console.debug(\"[graph] monetaryMass for [\" + currency + \"] found in cache\");\n return $q.when(result);\n }\n }\n\n var request = {\n query: {\n filtered: {\n filter: {\n bool: {\n must: [\n {\n exists: {\n field: 'dividend'\n }\n }\n ]\n }\n }\n }\n },\n size: options.size || 10000,\n from: options.from || 0,\n _source: [\"medianTime\", \"number\", \"dividend\", \"monetaryMass\", \"membersCount\", \"unitbase\"],\n sort: {\n \"medianTime\" : \"asc\"\n }\n };\n\n var promise = $q.all([\n // Get the current block (if need)\n options.withCurrent ?\n BMA.blockchain.current()\n .catch(function(err) {\n // Special case when currency not started\n if (err && err.ucode == BMA.errorCodes.NO_CURRENT_BLOCK) return undefined;\n throw err;\n }) : $q.when(),\n // Send search request to the ES node\n exports.raw.block.search(request, {currency: currency})\n ])\n .then(function(res) {\n var currentBlock = res[0];\n res = res[1];\n if (!res.hits.total || !res.hits.hits.length) return;\n\n var result = {};\n result.blocks = res.hits.hits.reduce(function(res, hit){\n var block = hit._source;\n\n // Apply unitbase on dividend\n block.dividend = _powBase(block.dividend, block.unitbase);\n delete block.unitbase;\n\n return res.concat(block);\n }, []);\n\n // Add current block\n if (currentBlock) {\n var deltaWithLastDividend = result.blocks.length && (currentBlock.medianTime - result.blocks[result.blocks.length-1].medianTime);\n if (deltaWithLastDividend && deltaWithLastDividend >= 60*60) {\n // Apply unitbase on dividend\n currentBlock.dividend = _powBase(currentBlock.dividend, currentBlock.unitbase);\n delete currentBlock.unitbase;\n result.blocks.push(currentBlock);\n }\n }\n\n result.times = result.blocks.reduce(function(res, block){\n return res.concat(block.medianTime);\n }, []);\n\n // replace promise in cache, with data\n currencyCache.put(cacheKey, result);\n return result;\n });\n currencyCache.put(cacheKey, promise);\n\n return promise;\n };\n\n /**\n * Graph: \"tx count\"\n * @param currency\n * @returns {*}\n */\n exports.blockchain.txCount = function(currency, options) {\n\n options = _initRangeOptions(options);\n\n var jobs = [];\n\n var from = moment.unix(options.startTime).utc().startOf(options.rangeDuration);\n var to = moment.unix(options.endTime).utc().startOf(options.rangeDuration);\n var ranges = [];\n while(from.isBefore(to)) {\n\n ranges.push({\n from: from.unix(),\n to: from.add(1, options.rangeDuration).unix()\n });\n\n // Flush if max range count, or just before loop condition end (fix #483)\n var flush = (ranges.length === options.maxRangeSize) || !from.isBefore(to);\n if (flush) {\n var request = {\n size: 0,\n aggs: {\n tx: {\n range: {\n field: \"medianTime\",\n ranges: ranges\n },\n aggs: {\n txCount : {\n stats: {\n field : \"txCount\"\n }\n },\n txAmount : {\n stats: {\n field : \"txAmount\"\n }\n }\n }\n\n }\n }\n\n };\n\n if (options.issuer) {\n request.query = {bool: {filter: {term: {issuer: options.issuer}}}};\n }\n // prepare next loop\n ranges = [];\n\n if (jobs.length === 10) {\n console.error('Too many parallel jobs!');\n from = moment.unix(options.endTime).utc(); // stop while\n }\n else {\n jobs.push(\n exports.raw.blockstat.search(request, {currency: currency})\n .then(function (res) {\n var aggs = res.aggregations;\n if (!aggs.tx || !aggs.tx.buckets || !aggs.tx.buckets.length) return;\n return (aggs.tx.buckets || []).reduce(function (res, agg) {\n return res.concat({\n from: agg.from,\n to: agg.to,\n count: agg.txCount.sum||0,\n amount: agg.txAmount.sum || 0,\n avgByBlock: Math.round(agg.txCount.avg * 100) / 100,\n maxByBlock: agg.txCount.max\n });\n }, []);\n })\n );\n }\n }\n } // loop\n\n return $q.all(jobs)\n .then(function(res) {\n res = res.reduce(function(res, hits){\n if (!hits || !hits.length) return res;\n return res.concat(hits);\n }, []);\n\n res = _.sortBy(res, 'from');\n\n return {\n count: _.pluck(res, 'count'),\n avgByBlock: _.pluck(res, 'avgByBlock'),\n maxByBlock: _.pluck(res, 'maxByBlock'),\n amount: res.reduce(function(res, hit){\n return res.concat(hit.amount/100);\n }, []),\n times: _.pluck(res, 'from')\n };\n });\n };\n\n /**\n * Graph: \"block count\"\n * @param currency\n * @returns {*}\n */\n exports.node.blockCount = function(currency, pubkey) {\n\n var request = {\n size: 0,\n query: {bool: {filter: {term: {issuer: pubkey}}}}\n };\n\n return exports.raw.block.search(request, {currency: currency})\n .then(function (res) {\n return res.hits.total;\n });\n };\n\n\n exports.raw.movement.getByRange = function(currency, pubkey, ranges) {\n if (!pubkey) {\n throw new Error('Missing \\'pubkey\\' argument!');\n }\n var request = {\n size: 0,\n query: {\n bool: {\n should: [\n {term: {recipient: pubkey}},\n {term: {issuer: pubkey}}\n ]\n }\n },\n aggs: {\n tx: {\n range: {\n field: \"medianTime\",\n ranges: ranges\n },\n aggs: {\n received: {\n filter: {term: {recipient: pubkey}},\n aggs: {\n received_stats: {\n stats: {\n field: \"amount\"\n }\n }\n }\n },\n sent: {\n filter: {term: {issuer: pubkey}},\n aggs: {\n sent_stats: {\n stats: {\n field: \"amount\"\n }\n }\n }\n }\n }\n\n }\n }\n };\n\n return exports.raw.movement.search(request, {currency: currency})\n .then(function(res) {\n var aggs = res.aggregations;\n if (!aggs.tx || !aggs.tx.buckets || !aggs.tx.buckets.length) return;\n return (aggs.tx.buckets || []).reduce(function (res, agg) {\n var sent = agg.sent.sent_stats;\n var received = agg.received.received_stats;\n return res.concat({\n from: agg.from,\n to: agg.to,\n sent: sent.sum ? (-sent.sum / 100) : 0,\n received: received.sum ? (received.sum / 100) : 0\n });\n }, []);\n });\n };\n\n exports.raw.movement.getUds = function(currency, ranges, fromMapping) {\n var request = {\n size: 0,\n query: {\n bool: {\n should: [\n {exists: {field: 'dividend'}}\n ]\n }\n },\n aggs: {\n ud: {\n range: {\n field: 'medianTime',\n ranges: ranges\n },\n aggs: {\n ud_stats: {\n stats: {\n field: 'dividend'\n }\n },\n unitbase_stats: {\n stats: {\n field: 'unitbase'\n }\n }\n }\n }\n }\n };\n\n return exports.raw.block.search(request, {currency: currency})\n .then(function(res) {\n var aggs = res.aggregations;\n if (!aggs.ud || !aggs.ud.buckets || !aggs.ud.buckets.length) return;\n return (aggs.ud.buckets || []).reduce(function (res, agg) {\n var from = fromMapping[agg.from];\n res[from] = _powBase(agg.ud_stats.sum, agg.unitbase_stats.min) / 100;\n return res;\n }, {});\n });\n };\n\n /**\n * Graph: \"tx amount\"\n * @param currency\n * @returns {*}\n */\n exports.blockchain.movement = function(currency, options) {\n\n options = _initRangeOptions(options);\n options.withUD = angular.isDefined(options.withUD) ? options.withUD : true;\n\n var jobs = [];\n\n // If need and missing: load membership periods\n if (options.withUD && !options.memberships) {\n return esWot.memberships(options.pubkey)\n .then(function(res) {\n options.memberships = res || [];\n // loop, with membership filled\n return exports.blockchain.movement(currency, options);\n });\n }\n\n var from = moment.unix(options.startTime).utc().startOf(options.rangeDuration);\n var to = moment.unix(options.endTime).utc().startOf(options.rangeDuration);\n\n var ranges = [];\n var udRanges = [];\n var udFromMapping = {};\n var memberships = angular.copy(options.memberships).reverse();\n var membership = memberships.pop();\n\n function addRange(range) {\n ranges.push(range);\n var member = membership && membership.joinTime < range.to;\n if (member) {\n var udRange = {\n from: Math.max(membership.joinTime, range.from),\n to: Math.min(membership.leaveTime, range.to)\n };\n udRanges.push(udRange);\n udFromMapping[udRange.from] = range.from;\n while (membership && (membership.leaveTime && membership.leaveTime < range.to)) {\n membership = memberships.pop();\n }\n }\n }\n\n // Add a range to get TX before startTime\n addRange({\n from: 0,\n to: from.unix()\n });\n\n while(from.isBefore(to)) {\n\n addRange({\n from: from.unix(),\n to: from.add(1, options.rangeDuration).unix()\n });\n\n // Flush if max range count, or just before loop condition end (fix #483)\n var flush = (!jobs.length && ranges.length == options.maxRangeSize+1) ||\n (jobs.length && ranges.length == options.maxRangeSize) ||\n !from.isBefore(to);\n if (flush) {\n if (udRanges.length) {\n jobs.push($q.all([\n exports.raw.movement.getUds(currency, udRanges, udFromMapping),\n exports.raw.movement.getByRange(currency, options.pubkey, ranges)\n ])\n .then(function(res){\n var udsMap = res[0];\n res = res[1];\n // fill UD\n res.forEach(function(hit){\n hit.ud = (udsMap[hit.from]) || 0;\n });\n return res;\n }));\n }\n else {\n jobs.push(exports.raw.movement.getByRange(currency, options.pubkey, ranges)\n .then(function(res){\n // fill UD\n res.forEach(function(hit){\n hit.ud = 0;\n });\n return res;\n }));\n }\n\n // reset ranges for the next loop\n ranges = [];\n }\n } // loop\n\n return $q.all(jobs)\n .then(function(res) {\n // concat all results\n res = res.reduce(function(res, hits){\n if (!hits || !hits.length) return res;\n return res.concat(hits);\n }, []);\n\n if (!res.length) return;\n\n // Sort by 'from' field\n res = _.sortBy(res, 'from');\n\n // First item should be history (tx before startTime)\n var history = res.splice(0,1)[0];\n var balance = history.received + history.sent + history.ud;\n\n return {\n times: _.pluck(res, 'from'),\n ud: _.pluck(res, 'ud'),\n sent: _.pluck(res, 'sent'),\n received: _.pluck(res, 'received'),\n balance: res.reduce(function(res, hit){\n balance += hit.received + hit.sent + hit.ud;\n return res.concat(balance);\n }, [])\n };\n });\n };\n\n\n /**\n * Graph: \"tx count\"\n * @param currency\n * @returns {*}\n */\n exports.wot.certifications = function(options) {\n\n options = _initRangeOptions(options);\n\n return csWot.load(options.pubkey)\n .then(function(idty) {\n if (!idty) return;\n var res = {};\n _.forEach(idty.given_cert||[], function(cert){\n var truncTime = moment.unix(cert.time).utc().startOf(options.rangeDuration).unix();\n res[truncTime] = res[truncTime] || {time:truncTime,given:0,received:0};\n res[truncTime].given++;\n });\n _.forEach(idty.received_cert||[], function(cert){\n var truncTime = moment.unix(cert.time).utc().startOf(options.rangeDuration).unix();\n res[truncTime] = res[truncTime] || {time:truncTime,given:0,received:0};\n res[truncTime].received++;\n });\n\n // Sort by time\n res = _.sortBy(_.values(res), 'time');\n\n // create final result\n var result = {\n times: _.pluck(res, 'time'),\n deltaGiven: _.pluck(res, 'given'),\n deltaReceived: _.pluck(res, 'received')\n };\n var sum = 0;\n result.given = result.deltaGiven.reduce(function(res, delta) {\n sum += delta;\n return res.concat(sum);\n }, []);\n sum = 0;\n result.received = result.deltaReceived.reduce(function(res, delta) {\n sum += delta;\n return res.concat(sum);\n }, []);\n return result;\n\n });\n };\n\n\n exports.wot.memberships = function(options) {\n\n options = options || {};\n\n // Get user events on membership state\n var request = {\n \"size\": 1000,\n \"query\": {\n \"bool\": {\n \"filter\": [\n {\"term\": {\"recipient\" : options.pubkey }},\n {\"terms\": {\"code\" : [\"MEMBER_JOIN\",\"MEMBER_ACTIVE\",\"MEMBER_LEAVE\",\"MEMBER_EXCLUDE\",\"MEMBER_REVOKE\"] }}\n ]\n }\n },\n \"sort\" : [\n { \"time\" : {\"order\" : \"asc\"}}\n ],\n _source: [\"code\", \"time\"]\n };\n\n return exports.raw.user.event(request)\n\n .then(function(res) {\n if (!res.hits || !res.hits.total) return;\n\n // Compute member periods\n var lastJoinTime;\n var result = res.hits.hits.reduce(function(res, hit){\n var isMember = hit._source.code == 'MEMBER_JOIN' || hit._source.code == 'MEMBER_ACTIVE';\n // If join\n if (isMember && !lastJoinTime) {\n lastJoinTime = hit._source.time;\n }\n // If leave\n else if (!isMember && lastJoinTime) {\n // Add an entry\n res = res.concat({\n joinTime: lastJoinTime,\n leaveTime: hit._source.time\n });\n lastJoinTime = 0; // reset\n }\n return res;\n }, []);\n\n if (lastJoinTime) {\n // Add last entry if need\n result.push({\n joinTime: lastJoinTime,\n leaveTime: moment().utc().unix()\n });\n }\n\n return result;\n });\n };\n\n /**\n * Graph: \"statictics on ES documents\"\n * @param currency\n * @returns {*}\n */\n exports.docstat.get = function(options) {\n\n options = _initRangeOptions(options);\n\n var searchRequest = exports.raw.docstat.search;\n if (options.server) {\n var serverParts = options.server.split(':');\n var host = serverParts[0];\n var port = serverParts[1] || 80;\n searchRequest = rawLightInstance(host, port, options.useSsl).docstat.search;\n }\n\n var jobs = [];\n\n var from = moment.unix(options.startTime).utc().startOf(options.rangeDuration);\n var to = moment.unix(options.endTime).utc().startOf(options.rangeDuration);\n var ranges = [];\n\n var processSearchResult = function (res) {\n var aggs = res.aggregations;\n return (aggs.range && aggs.range.buckets || []).reduce(function (res, agg) {\n var item = {\n from: agg.from,\n to: agg.to\n };\n _.forEach(agg.index && agg.index.buckets || [], function (agg) {\n var index = agg.key;\n _.forEach(agg.type && agg.type.buckets || [], function (agg) {\n var key = (index + '_' + agg.key);\n item[key] = agg.max.value;\n if (!indices[key]) indices[key] = true;\n });\n });\n return res.concat(item);\n }, []);\n };\n\n while(from.isBefore(to)) {\n\n ranges.push({\n from: from.unix(),\n to: from.add(1, options.rangeDuration).unix()\n });\n\n // Flush if max range count, or just before loop condition end (fix #483)\n var flush = (ranges.length === options.maxRangeSize) || !from.isBefore(to);\n if (flush) {\n var request = {\n size: 0,\n aggs: {\n range: {\n range: {\n field: \"time\",\n ranges: ranges\n },\n aggs: {\n index : {\n terms: {\n field: \"index\",\n size: 0\n },\n aggs: {\n type: {\n terms: {\n field: \"type\",\n size: 0\n },\n aggs: {\n max: {\n max: {\n field : \"count\"\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n };\n\n // prepare next loop\n ranges = [];\n var indices = {};\n var params = {\n request_cache: angular.isDefined(options.cache) ? options.cache : true // enable by default\n };\n\n if (jobs.length === 10) {\n console.error('Too many parallel jobs!');\n from = moment.unix(options.endTime).utc(); // stop while\n }\n else {\n jobs.push(\n searchRequest(request, params)\n .then(processSearchResult)\n );\n }\n }\n } // loop\n\n return $q.all(jobs)\n .then(function(res) {\n res = res.reduce(function(res, hits){\n if (!hits || !hits.length) return res;\n return res.concat(hits);\n }, []);\n\n res = _.sortBy(res, 'from');\n\n return _.keys(indices).reduce(function(series, index) {\n series[index] = _.pluck(res, index);\n return series;\n }, {\n times: _.pluck(res, 'from')\n });\n });\n };\n\n\n /**\n * Graph: \"statictics on ES documents\"\n * @param currency\n * @returns {*}\n */\n exports.synchro.execution.get = function(options) {\n\n options = _initRangeOptions(options);\n\n var searchRequest = exports.raw.synchro.search;\n if (options.server) {\n var serverParts = options.server.split(':');\n var host = serverParts[0];\n var port = serverParts[1] || 80;\n searchRequest = rawLightInstance(host, port, options.useSsl).synchro.search;\n }\n\n var jobs = [];\n\n var from = moment.unix(options.startTime).utc().startOf(options.rangeDuration);\n var to = moment.unix(options.endTime).utc().startOf(options.rangeDuration);\n var ranges = [];\n var processSearchResult = function (res) {\n var aggs = res.aggregations;\n\n return (aggs.range && aggs.range.buckets || []).reduce(function (res, agg) {\n var item = {\n from: agg.from,\n to: agg.to,\n inserts: agg.result.inserts.value,\n updates: agg.result.inserts.value,\n deletes: agg.result.deletes.value,\n duration: agg.duration.value\n };\n _.forEach(agg.api && agg.api.buckets || [], function (api) {\n item[api.key] = api.peer_count && api.peer_count.value || 0;\n if (!apis[api.key]) apis[api.key] = true;\n });\n\n return res.concat(item);\n }, []);\n };\n\n while(from.isBefore(to)) {\n\n ranges.push({\n from: from.unix(),\n to: from.add(1, options.rangeDuration).unix()\n });\n\n // Flush if max range count, or just before loop condition end (fix #483)\n var flush = (ranges.length === options.maxRangeSize) || !from.isBefore(to);\n if (flush) {\n var request = {\n size: 0,\n aggs: {\n range: {\n range: {\n field: \"time\",\n ranges: ranges\n },\n aggs: {\n api: {\n terms: {\n field: \"api\",\n size: 0\n },\n aggs: {\n peer_count: {\n cardinality: {\n field: \"peer\"\n }\n }\n }\n },\n duration: {\n sum: {\n field: \"executionTime\"\n }\n },\n result: {\n nested: {\n path: \"result\"\n },\n aggs: {\n inserts : {\n sum: {\n field : \"result.inserts\"\n }\n },\n updates : {\n sum: {\n field : \"result.updates\"\n }\n },\n deletes : {\n sum: {\n field : \"result.deletes\"\n }\n }\n }\n }\n }\n }\n }\n\n };\n\n // prepare next loop\n ranges = [];\n var apis = {};\n\n if (jobs.length === 10) {\n console.error('Too many parallel jobs!');\n from = moment.unix(options.endTime).utc(); // stop while\n }\n else {\n jobs.push(\n searchRequest(request, {currency: options.currency})\n .then(processSearchResult)\n );\n }\n }\n } // loop\n\n return $q.all(jobs)\n .then(function(res) {\n res = res.reduce(function(res, hits){\n if (!hits || !hits.length) return res;\n return res.concat(hits);\n }, []);\n\n res = _.sortBy(res, 'from');\n\n var series = {\n times: _.pluck(res, 'from'),\n inserts: _.pluck(res, 'inserts'),\n updates: _.pluck(res, 'updates'),\n deletes: _.pluck(res, 'deletes'),\n duration: _.pluck(res, 'duration')\n };\n\n _.keys(apis).forEach(function(api) {\n series[api] = _.pluck(res, api);\n });\n\n return series;\n });\n };\n\n function cleanAllCache() {\n console.debug(\"[graph] Cleaning cache {prefix: '{0}'}...\".format(cachePrefix));\n csCache.clear(cachePrefix);\n }\n\n // Listen if node changed\n esHttp.api.node.on.stop($rootScope, cleanAllCache, this);\n\n return exports;\n }])\n\n;\n","angular.module('cesium.graph.color.services', [])\n\n .factory('gpColor', function() {\n 'ngInject';\n\n var\n constants = {\n css2Rgb: {\n 'white': [255, 255, 255],\n 'assertive': [239, 71, 58], // ok\n 'calm': [17, 193, 243], // ok\n 'positive': [56, 126, 245], // ok\n 'balanced': [51, 205, 95], // ok\n 'energized': [255, 201, 0], // ok\n 'royal': [136, 106, 234], // ok\n 'gray': [150, 150, 150], // ok\n 'stable': [248, 248, 248] // ok\n }\n },\n exports = {\n scale: {}\n };\n\n\n /**\n * Compute colors scale\n * @param count\n * @param opacity\n * @param startColor\n * @param startState\n * @returns {Array}\n */\n exports.scale.custom = function (count, opacity, startColor, startState) {\n\n function _state2side(state) {\n switch (state) {\n case 0:\n return 0;\n case 1:\n return -1;\n case 2:\n return 0;\n case 3:\n return 1;\n }\n }\n\n // From [0,1]\n opacity = opacity>0 && opacity|| 0.55;\n\n var defaultStateSize = Math.round(count / 2.5/*=4 states max*/);\n\n // Start color [r,v,b]\n var color = startColor && startColor.length == 3 ? angular.copy(startColor) : [255, 0, 0]; // Red\n\n // Colors state: 0=keep, 1=decrease, 2=keep, 3=increase\n var states = startState && startState.length == 3 ? angular.copy(startState) : [0, 2, 3]; // R=keep, V=keep, B=increase\n\n var steps = startColor ? [\n Math.round(255 / defaultStateSize),\n Math.round(255 / defaultStateSize),\n Math.round(255 / defaultStateSize)\n ] : [\n Math.round((color[0] - 50) / defaultStateSize),\n Math.round((255 - color[1]) / defaultStateSize),\n Math.round((255 - color[2]) / defaultStateSize)\n ];\n\n\n // Compute start sides (1=increase, 0=flat, -1=decrease)\n var sides = [\n _state2side(states[0]),\n _state2side(states[1]),\n _state2side(states[2])];\n\n // Use to detect when need to change a 'flat' state (when state = 0 or 2)\n var stateCounters = [0, 0, 0];\n\n var result = [];\n for (var i = 0; i < count; i++) {\n for (var j = 0; j < 3; j++) {\n color[j] += sides[j] * steps[j];\n stateCounters[j]++;\n // color has reach a limit\n if (((color[j] <= 0 || color[j] >= 255) && sides[j] !== 0) ||\n (sides[j] === 0 && stateCounters[j] == defaultStateSize)) {\n // Max sure not overflow limit\n if (color[j] <= 0) {\n color[j] = 0;\n }\n else if (color[j] >= 255) {\n color[j] = 255;\n }\n // Go to the next state, in [0..3]\n states[j] = (states[j] + 1) % 4;\n\n // Update side from this new state\n sides[j] = _state2side(states[j]);\n\n // Reset state counter\n stateCounters[j] = 0;\n }\n }\n\n // Add the color to result\n result.push('rgba(' + color[0] + ',' + color[1] + ',' + color[2] + ',' + opacity + ')');\n\n }\n return result;\n };\n\n exports.scale.default = function () {\n return exports.scale.custom(25);\n };\n\n /**\n * Create a array with the given color\n **/\n exports.scale.fix = function (length, color) {\n return Array.apply(null, Array(length||25))\n .map(String.prototype.valueOf, color||exports.rgba.calm(0.5));\n };\n\n // Create a function to generate a rgba string, from\n exports.rgba = _.mapObject(constants.css2Rgb, function(rgbArray){\n var prefix = 'rgba(' + rgbArray.join(',') + ',';\n return function(opacity){\n if (!opacity || opacity < 0) {\n return 'rgb(' + rgbArray.join(',') + ')';\n }\n return prefix + opacity + ')';\n };\n });\n\n exports.rgba.translucent = function() {\n return 'rgb(0,0,0,0)';\n };\n\n exports.constants = constants;\n\n return exports;\n })\n\n;\n","\nangular.module('cesium.map.plugin', [\n 'ui-leaflet',\n // Services\n 'cesium.map.services',\n // Controllers\n 'cesium.map.common.controllers',\n 'cesium.map.wot.controllers',\n 'cesium.map.registry.controllers',\n 'cesium.map.network.controllers',\n 'cesium.map.user.controllers',\n 'cesium.map.settings.controllers',\n 'cesium.map.help.controllers'\n ])\n\n // Configure plugin\n .config(function() {\n 'ngInject';\n\n // Define icon prefix for AwesomeMarker (a Leaflet plugin)\n L.AwesomeMarkers.Icon.prototype.options.prefix = 'ion';\n });\n\n\n","\nangular.module('cesium.map.services', [\n // Services\n 'cesium.map.wot.services',\n 'cesium.map.registry.services',\n 'cesium.map.utils.services'\n ])\n;\n","\nangular.module('cesium.map.wot.services', ['cesium.services'])\n\n.factory('mapWot', ['$q', 'csHttp', 'esHttp', 'esSettings', 'csWot', 'BMA', 'esGeo', function($q, csHttp, esHttp, esSettings, csWot, BMA, esGeo) {\n 'ngInject';\n\n var\n that = this,\n constants = {\n DEFAULT_LOAD_SIZE: 1000\n },\n fields = {\n min: [\"title\", \"geoPoint\"],\n profile: [\"title\", \"geoPoint\", \"avatar._content_type\", \"address\", \"city\"]\n };\n\n that.raw = {\n profile: {\n search: esHttp.post('/user/profile/_search'),\n mixedSearch: esHttp.post('/user,page,group/profile,record/_search')\n //FOR DEV ONLY mixedSearch: esHttp.post('/page/record/_search')\n }\n };\n\n function createFilterQuery(options) {\n options = options || {};\n var query = {\n bool: {}\n };\n\n // Limit to profile with geo point\n if (options.searchAddress) {\n query.bool.should = [\n {exists: {field: \"geoPoint\"}},\n {exists: {field: \"city\"}}\n ];\n }\n else {\n query.bool.must= [\n {exists: {field: \"geoPoint\"}}\n ];\n }\n\n // Filter on bounding box\n // see https://www.elastic.co/guide/en/elasticsearch/reference/2.4/geo-point.html\n if (options.bounds && options.bounds.northEast && options.bounds.southWest) {\n var boundingBox = {\n \"geoPoint\" : {\n \"top_left\" : {\n \"lat\" : Math.max(Math.min(options.bounds.northEast.lat, 90), -90),\n \"lon\" : Math.max(Math.min(options.bounds.southWest.lng, 180), -180)\n },\n \"bottom_right\" : {\n \"lat\" : Math.max(Math.min(options.bounds.southWest.lat, 90), -90),\n \"lon\" : Math.max(Math.min(options.bounds.northEast.lng, 180), -180)\n }\n }\n };\n console.debug(\"[map] [wot] Filtering on bounds: \", options.bounds);\n query.bool.must = query.bool.must || [];\n query.bool.must.push({geo_bounding_box: boundingBox});\n }\n return query;\n }\n\n function load(options) {\n options = options || {};\n options.from = options.from || 0;\n options.size = options.size || constants.DEFAULT_LOAD_SIZE;\n options.searchAddress = esGeo.google.isEnable() && (angular.isDefined(options.searchAddress) ? options.searchAddress : true);\n\n options.fields = options.fields || {};\n options.fields.description = angular.isDefined(options.fields.description) ? options.fields.description : false;\n\n var request = {\n query: createFilterQuery(options),\n from: 0,\n size: options.size,\n _source: options.fields.description ? fields.profile.concat(\"description\") : fields.profile\n };\n\n var mixedSearch = false;\n /*var mixedSearch = esSettings.wot.isMixedSearchEnable();\n if (mixedSearch) {\n // add special fields for page and group\n request._source = request._source.concat([\"type\", \"pubkey\", \"issuer\", \"category\"]);\n console.debug(\"[ES] [map] Mixed search: enable\");\n }*/\n\n var search = mixedSearch ? that.raw.profile.mixedSearch : that.raw.profile.search;\n\n return $q.all([\n search(request),\n BMA.wot.member.uids(),\n BMA.wot.member.pending()\n .then(function(res) {\n return (res.memberships && res.memberships.length) ? res.memberships : [];\n })\n ])\n .then(function(res) {\n var uids = res[1];\n var memberships = res[2];\n res = res[0];\n if (!res.hits || !res.hits.total) return [];\n\n // Transform pending MS into a map by pubkey\n memberships = memberships.reduce(function(res, 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 pending: true\n };\n var otherIdtySamePubkey = res[ms.pubkey];\n if (otherIdtySamePubkey && idty.block > otherIdtySamePubkey.block) {\n return res; // skip\n }\n res[idty.pubkey] = idty;\n }\n return res;\n }, {});\n\n var jobs = [\n processLoadHits(options, uids, memberships, res)\n ];\n\n // Additional slice requests\n request.from += request.size;\n var processRequestResultFn = function(subRes) {\n if (!subRes.hits || !subRes.hits.hits.length) return [];\n return processLoadHits(options, uids, memberships, subRes);\n };\n while (request.from < res.hits.total) {\n var searchRequest = search(angular.copy(request)).then(processRequestResultFn);\n jobs.push(searchRequest);\n request.from += request.size;\n }\n return $q.all(jobs)\n .then(function(res){\n return res.reduce(function(res, items) {\n return res.concat(items);\n }, []);\n });\n });\n }\n\n function processLoadHits(options, uids, memberships, res) {\n\n // Transform profile hits\n var commaRegexp = new RegExp('[,]');\n var searchAddressItems = [];\n var items = res.hits.hits.reduce(function(res, hit) {\n var pubkey = hit._id;\n var uid = uids[pubkey];\n var item = uid && {uid: uid} || memberships[pubkey] || {};\n item.pubkey = pubkey;\n item.index = hit._index;\n\n // City & address\n item.city = hit._source.city;\n item.address = hit._source.address;\n\n // Set geo point\n item.geoPoint = hit._source.geoPoint;\n if (!item.geoPoint || !item.geoPoint.lat || !item.geoPoint.lon) {\n if (!options.searchAddress || !item.city) return res; // no city: exclude this item\n item.searchAddress = item.city && ((hit._source.address ? hit._source.address+ ', ' : '') + item.city);\n searchAddressItems.push(item);\n }\n else {\n // Convert lat/lon to float (if need)\n if (item.geoPoint.lat && typeof item.geoPoint.lat === 'string') {\n item.geoPoint.lat = parseFloat(item.geoPoint.lat.replace(commaRegexp, '.'));\n }\n if (item.geoPoint.lon && typeof item.geoPoint.lon === 'string') {\n item.geoPoint.lon = parseFloat(item.geoPoint.lon.replace(commaRegexp, '.'));\n }\n }\n\n // Avatar\n item.avatar = esHttp.image.fromHit(hit, 'avatar');\n\n // Name\n item.name = hit._source.title;\n // Avoid too long name (workaround for #308)\n if (item.name && item.name.length > 30) {\n item.name = item.name.substr(0, 27) + '...';\n }\n\n // Description\n item.description = hit._source.description && esHttp.util.parseAsHtml(hit._source.description);\n\n return item.geoPoint ? res.concat(item) : res;\n }, []);\n\n // Resolve missing positions by addresses (only if google API enable)\n if (searchAddressItems.length) {\n var now = Date.now();\n console.debug('[map] [wot] Search positions of {0} addresses...'.format(searchAddressItems.length));\n var counter = 0;\n\n return $q.all(searchAddressItems.reduce(function(res, item) {\n return !item.city ? res : res.concat(esGeo.google.searchByAddress(item.searchAddress)\n .then(function(res) {\n if (!res || !res.length) return;\n item.geoPoint = res[0];\n // If search on city, add a randomized delta to avoid superposition\n if (item.city == item.searchAddress) {\n item.geoPoint.lon += Math.random() / 1000;\n item.geoPoint.lat += Math.random() / 1000;\n }\n delete item.searchAddress; // not need anymore\n items.push(item);\n counter++;\n })\n .catch(function() {/*silent*/}));\n }, []))\n .then(function(){\n console.debug('[map] [wot] Resolved {0}/{1} addresses in {2}ms'.format(counter, searchAddressItems.length, Date.now()-now));\n return items;\n });\n }\n\n return $q.when(items);\n }\n\n return {\n load: load\n };\n\n}]);\n","\nangular.module('cesium.map.registry.services', ['cesium.services'])\n\n.factory('mapRegistry', ['$q', 'csHttp', 'esHttp', 'esSettings', 'csWot', 'BMA', 'esGeo', function($q, csHttp, esHttp, esSettings, csWot, BMA, esGeo) {\n 'ngInject';\n\n var\n that = this,\n constants = {\n DEFAULT_LOAD_SIZE: 1000\n },\n fields = {\n record: [\"title\", \"geoPoint\", \"avatar._content_type\", \"address\", \"city\", \"type\", \"pubkey\", \"issuer\", \"category\"]\n };\n\n that.raw = {\n profile: {\n search: esHttp.post('/page/record/_search'),\n mixedSearch: esHttp.post('/user,page,group/profile,record/_search')\n }\n };\n\n function createFilterQuery(options) {\n options = options || {};\n var query = {\n bool: {}\n };\n\n // Limit to profile with geo point\n if (options.searchAddress) {\n query.bool.should = [\n {exists: {field: \"geoPoint\"}},\n {exists: {field: \"city\"}}\n ];\n }\n else {\n query.bool.must= [\n {exists: {field: \"geoPoint\"}}\n ];\n }\n\n // Filter on bounding box\n // see https://www.elastic.co/guide/en/elasticsearch/reference/2.4/geo-point.html\n if (options.bounds && options.bounds.northEast && options.bounds.southWest) {\n query.bool.should = query.bool.should || {};\n query.bool.should.geo_bounding_box = {\n \"geoPoint\" : {\n \"top_left\" : {\n \"lat\" : Math.max(Math.min(options.bounds.northEast.lat, 90), -90),\n \"lon\" : Math.max(Math.min(options.bounds.southWest.lng, 180), -180)\n },\n \"bottom_right\" : {\n \"lat\" : Math.max(Math.min(options.bounds.southWest.lat, 90), -90),\n \"lon\" : Math.max(Math.min(options.bounds.northEast.lng, 180), -180)\n }\n }\n };\n }\n return query;\n }\n\n function load(options) {\n options = options || {};\n options.from = options.from || 0;\n options.size = options.size || constants.DEFAULT_LOAD_SIZE;\n options.searchAddress = esGeo.google.isEnable() && (angular.isDefined(options.searchAddress) ? options.searchAddress : true);\n\n options.fields = options.fields || {};\n options.fields.description = angular.isDefined(options.fields.description) ? options.fields.description : true;\n\n var request = {\n query: createFilterQuery(options),\n from: 0,\n size: options.size,\n _source: options.fields.description ? fields.record.concat(\"description\") : fields.record\n };\n\n // Search on profiles ?\n var mixedSearch = false;\n /*var mixedSearch = esSettings.registry.isMixedSearchEnable();\n if (mixedSearch) {\n console.debug(\"[ES] [map] Mixed search: enable\");\n }*/\n\n var search = mixedSearch ? that.raw.profile.mixedSearch : that.raw.profile.search;\n var processSearchResult = function(res) {\n if (!res.hits || !res.hits.hits.length) return $q.when([]);\n return processLoadHits(options, res);\n };\n return search(request)\n .then(function(res) {\n if (!res.hits || !res.hits.total) return [];\n\n var jobs = [\n processLoadHits(options, res)\n ];\n\n // Additional slice requests\n request.from += request.size;\n while (request.from < res.hits.total) {\n jobs.push(\n search(angular.copy(request)).then(processSearchResult)\n );\n request.from += request.size;\n }\n return $q.all(jobs)\n .then(function(res){\n return res.reduce(function(res, items) {\n return res.concat(items);\n }, []);\n });\n });\n }\n\n function processLoadHits(options, res) {\n // Transform hits\n var commaRegexp = new RegExp('[,]');\n var searchAddressItems = [];\n var items = res.hits.hits.reduce(function(res, hit) {\n var pubkey = hit._source.issuer;\n var item = {};\n item.issuer = pubkey;\n item.pubkey = hit._source.pubkey||item.issuer;\n item.id = hit._id;\n item.index = hit._index;\n item.type = hit._source.type;\n item.category = hit._source.category;\n if (item.category) {\n delete item.category.parent; // parent not need\n }\n\n // City & address\n item.city = hit._source.city;\n item.address = hit._source.address;\n\n // Set geo point\n item.geoPoint = hit._source.geoPoint;\n if (!item.geoPoint || !item.geoPoint.lat || !item.geoPoint.lon) {\n if (!options.searchAddress || !item.city) return res; // no city: exclude this item\n item.searchAddress = item.city && ((hit._source.address ? hit._source.address+ ', ' : '') + item.city);\n searchAddressItems.push(item);\n }\n else {\n // Convert lat/lon to float (if need)\n if (item.geoPoint.lat && typeof item.geoPoint.lat === 'string') {\n item.geoPoint.lat = parseFloat(item.geoPoint.lat.replace(commaRegexp, '.'));\n }\n if (item.geoPoint.lon && typeof item.geoPoint.lon === 'string') {\n item.geoPoint.lon = parseFloat(item.geoPoint.lon.replace(commaRegexp, '.'));\n }\n }\n\n // Avatar\n item.avatar = esHttp.image.fromHit(hit, 'avatar');\n\n // Name\n item.name = hit._source.title;\n // Avoid too long name (workaround for #308)\n if (item.name && item.name.length > 30) {\n item.name = item.name.substr(0, 27) + '...';\n }\n\n // Description\n item.description = hit._source.description && esHttp.util.parseAsHtml(hit._source.description);\n\n return item.geoPoint ? res.concat(item) : res;\n }, []);\n\n // Resolve missing positions by addresses (only if google API enable)\n if (searchAddressItems.length) {\n var now = Date.now();\n console.debug('[map] [registry] Search positions of {0} addresses...'.format(searchAddressItems.length));\n var counter = 0;\n\n return $q.all(searchAddressItems.reduce(function(res, item) {\n return !item.city ? res : res.concat(esGeo.google.searchByAddress(item.searchAddress)\n .then(function(res) {\n if (!res || !res.length) return;\n item.geoPoint = res[0];\n // If search on city, add a randomized delta to avoid superposition\n if (item.city == item.searchAddress) {\n item.geoPoint.lon += Math.random() / 1000;\n item.geoPoint.lat += Math.random() / 1000;\n }\n delete item.searchAddress; // not need anymore\n items.push(item);\n counter++;\n })\n .catch(function() {/*silent*/}));\n }, []))\n .then(function(){\n console.debug('[map] [registry] Resolved {0}/{1} addresses in {2}ms'.format(counter, searchAddressItems.length, Date.now()-now));\n return items;\n });\n }\n\n return $q.when(items);\n }\n\n return {\n load: load\n };\n\n}]);\n","\nangular.module('cesium.map.utils.services', ['cesium.services', 'ui-leaflet'])\n\n.factory('MapUtils', ['$timeout', '$q', '$translate', '$window', 'leafletData', 'csConfig', 'csSettings', 'esGeo', 'UIUtils', 'leafletHelpers', function($timeout, $q, $translate, $window, leafletData, csConfig, csSettings, esGeo, UIUtils, leafletHelpers) {\n 'ngInject';\n\n\n var\n googleApiKey = csConfig.plugins && csConfig.plugins.es && csConfig.plugins.es.googleApiKey,\n constants = {\n locations: {\n FRANCE: {\n lat: 46.5588603, lng: 4.229736328124999, zoom: 6\n }\n },\n LOCALIZE_ZOOM: 15\n },\n data = {\n cache: {}\n };\n constants.DEFAULT_CENTER = csSettings.data && csSettings.data.plugins && csSettings.data.plugins.map && csSettings.data.plugins.map.center || constants.locations.FRANCE;\n\n function initMap(options){\n options = angular.merge({\n center: angular.copy(constants.DEFAULT_CENTER),\n cache: false,\n defaults: {\n scrollWheelZoom: true,\n tileLayerOptions: {\n attribution: '© <a target=\\\"_blank\\\" href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a>'\n }\n },\n layers: {\n baselayers: {\n osm: {\n name: 'OpenStreetMap',\n type: 'xyz',\n url: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',\n layerOptions: {\n subdomains: [\"a\", \"b\", \"c\"],\n attribution: \"© <a target=\\\"_blank\\\" href=\\\"https://www.openstreetmap.org/copyright\\\">OpenStreetMap</a>\",\n continuousWorld: true\n }\n },\n google: {\n name: \"Google map\",\n type: \"xyz\",\n url: ('https://{s}.google.com/vt/lyrs=m&x={x}&y={y}&z={z}&key='+googleApiKey),\n layerOptions: {\n subdomains: ['mt0','mt1','mt2','mt3'],\n attribution: \"© <a target=\\\"_blank\\\" href=\\\"https://www.google.com/intl/fr_fr/help/terms_maps.html\\\">Google</a>\",\n continuousWorld: true\n }\n }\n }\n },\n controls: {\n custom: []\n }\n }, options || {});\n\n // Restore existing map options\n if (options.cache && data.cache[options.cache]) {\n console.debug(\"[map] Restoring map from cache :\", data.cache[options.cache]);\n options = angular.merge(options, data.cache[options.cache]);\n }\n\n // Translate overlays name, if any\n var overlaysNames;\n if (options.layers.overlays) {\n overlaysNames = _.keys(options.layers.overlays).reduce(function (res, key) {\n return res.concat(options.layers.overlays[key].name);\n }, []);\n\n $translate(overlaysNames).then(function (translations) {\n // Translate overlay names\n _.keys(options.layers.overlays || {}).forEach(function (key) {\n options.layers.overlays[key].name = translations[options.layers.overlays[key].name];\n });\n });\n }\n\n return options;\n }\n\n function updateMapCenter(map, center) {\n if (isSameCenter(center, map)) return $q.when();\n\n return $timeout(function () {\n map.invalidateSize();\n map._resetView(center, center.zoom, true);\n }, 300);\n }\n\n function bindMapOptions(scope, mapId, options) {\n options = options || {};\n if (!mapId || !options.layers || !scope) throw 'Illegal arguments';\n if (!options.cache) return; // no cache, so bind not need\n\n // Bind overlays visibility\n if (options.layers.overlays) {\n var overlayNames = _.keys(options.layers.overlays);\n\n // Init the cache if need\n if (!data.cache[options.cache]) {\n data.cache[options.cache] = {\n center: options.center,\n bounds: options.bounds,\n layers: angular.copy(options.layers)\n };\n }\n\n // Listen for changes\n leafletData.getMap(mapId)\n .then(function() {\n _($window.document.querySelectorAll('#{0} .leaflet-control-layers-overlays input[type=checkbox]'.format(mapId)))\n .forEach(function (element, index) {\n var overlayName = overlayNames[index];\n var state = options.layers.overlays[overlayName].visible;\n element.addEventListener('change', function (e) {\n state = !state; // update state\n // update cache\n data.cache[options.cache].layers.overlays[overlayName].visible = state;\n });\n });\n });\n }\n\n // Refresh center and bound, when leaving the view\n scope.$on('$ionicView.leave', function() {\n // update center and bounds\n data.cache[options.cache].center = options.center;\n data.cache[options.cache].bounds = options.bounds;\n });\n\n }\n\n\n function getCenter(options) {\n if (!options) return;\n var center;\n if (options.lat) {\n center = {};\n center.lat = parseFloat(options.lat);\n }\n if (options.lng || options.lon) {\n center = center || {};\n center.lng = parseFloat(options.lng || options.lon);\n }\n if (options.zoom) {\n center = center || {};\n center.zoom = parseFloat(options.zoom);\n }\n if (!center) return;\n\n // If missing some properties, complete with defaults\n if (!leafletHelpers.isValidCenter(center)) {\n center = angular.merge({}, constants.DEFAULT_CENTER, center);\n }\n return center;\n }\n\n function isSameCenter(center, map) {\n return leafletHelpers.isSameCenterOnMap(center, map);\n }\n\n function isDefaultCenter(centerModel) {\n var mapCenter = constants.DEFAULT_CENTER;\n if (centerModel.lat && centerModel.lng && mapCenter.lat.toFixed(4) === centerModel.lat.toFixed(4) && mapCenter.lng.toFixed(4) === centerModel.lng.toFixed(4) && mapCenter.zoom === centerModel.zoom) {\n return true;\n }\n return false;\n }\n\n // Set the id of a control (set the attribute 'id' of the HTML container)\n function setControlId(control, id) {\n if (!control || !id) throw 'Illegal arguments';\n\n // Control already added to map\n if (control._container) {\n control._container.id = id;\n }\n // Control not already added to the map (HTML element not exists yet)\n else {\n // Override onAdd() function\n var superOnAdd = control.onAdd;\n control.onAdd = function (map) {\n var container = superOnAdd.call(this, map);\n container.id = id;\n return container;\n };\n }\n }\n\n // Create a default serach control, with default options\n function initSearchControl(options) {\n\n options = options || {};\n options.initial = angular.isDefined(options.initial) ? options.initial : false;\n options.marker = angular.isDefined(options.marker) ? options.marker : false;\n options.propertyName = angular.isDefined(options.propertyName) ? options.propertyName : 'title';\n options.position = angular.isDefined(options.position) ? options.position : 'topleft';\n options.zoom = angular.isDefined(options.zoom) ? options.zoom : constants.LOCALIZE_ZOOM;\n options.markerLocation = angular.isDefined(options.markerLocation) ? options.markerLocation : true;\n\n var translatePromise = $translate(['MAP.COMMON.SEARCH_DOTS', 'COMMON.SEARCH_NO_RESULT']);\n\n return {\n // Simulate an addTo function, but wait for end of translations job\n addTo: function (map) {\n translatePromise.then(function (translations) {\n var control = L.control.search(angular.merge(options, {\n textPlaceholder: translations['MAP.COMMON.SEARCH_DOTS'],\n textErr: translations['COMMON.SEARCH_NO_RESULT']\n }));\n\n // Set the HTML element id\n if (options.id) {\n setControlId(control, options.id);\n }\n control.addTo(map);\n });\n }\n };\n }\n\n function initLocalizeMeControl(options) {\n options = options || {};\n return L.easyButton({\n position: 'topleft', // inherited from L.Control -- the corner it goes in\n type: 'replace', // set to animate when you're comfy with css\n leafletClasses: true, // use leaflet classes to style the button?\n states:[{ // specify different icons and responses for your button\n stateName: 'locate-me',\n onClick: function(btn, map){\n esGeo.point.current()\n .then(function(res) {\n map.setView({\n lat: res.lat,\n lng: res.lon\n }, constants.LOCALIZE_ZOOM);\n })\n .catch(function(err) {\n console.error(err);\n UIUtils.alert.error('MAP.ERROR.LOCALIZE_ME_FAILED');\n });\n },\n title: options.title,\n icon: 'icon ion-android-locate'\n }]\n });\n }\n\n return {\n map: initMap,\n updateCenter: updateMapCenter,\n center: {\n get: getCenter,\n isSame: isSameCenter,\n isDefault: isDefaultCenter\n },\n control: {\n search: initSearchControl,\n localizeMe: initLocalizeMeControl,\n setId: setControlId\n },\n cache: {\n bind: bindMapOptions\n },\n constants: constants\n };\n\n}]);\n","\nangular.module('cesium.map.network.controllers', ['cesium.services', 'cesium.map.services'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n\n PluginServiceProvider\n\n .extendState('app.network', {\n points: {\n 'filter-buttons': {\n templateUrl: \"plugins/map/templates/network/lookup_extend.html\",\n controller: \"ESExtensionCtrl\"\n }\n }\n });\n\n $stateProvider\n .state('app.view_network_map', {\n url: \"/network/map?c\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/map/templates/network/view_map.html\",\n controller: 'MapNetworkViewCtrl'\n }\n },\n data: {\n silentLocationChange: true\n }\n });\n }\n }])\n\n // [NEW] Manage events from the page #/app/wot/map\n .controller('MapNetworkViewCtrl', ['$scope', '$controller', '$q', '$interpolate', '$translate', '$filter', '$templateCache', '$timeout', '$location', 'esGeo', 'UIUtils', 'csNetwork', 'MapUtils', 'leafletData', function($scope, $controller, $q, $interpolate, $translate, $filter, $templateCache, $timeout, $location,\n esGeo, UIUtils, csNetwork, MapUtils, leafletData) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('NetworkLookupCtrl', {$scope: $scope}));\n\n var\n formatPubkey = $filter('formatPubkey'),\n markerMessageTemplate,\n markersSearchLayer,\n icons= {\n member: {\n type: 'awesomeMarker',\n icon: 'person',\n markerColor: 'green',\n iconColor: 'white'\n },\n mirror: {\n type: 'awesomeMarker',\n icon: 'radio-waves',\n markerColor: 'green',\n iconColor: 'white'\n },\n offline: {\n type: 'awesomeMarker',\n icon: 'ion-close-circled',\n markerColor: 'red',\n iconColor: 'white'\n }\n },\n markerIdByPeerId = {},\n markerCounter = 0\n ;\n\n // Init the template for marker popup\n markerMessageTemplate = '<div class=\"item item-peer item-icon-left no-border\" ng-click=\"selectPeer(peer)\">';\n markerMessageTemplate += $templateCache.get('templates/network/item_content_peer.html');\n markerMessageTemplate += '</div>';\n markerMessageTemplate = markerMessageTemplate.replace(/[:]rebind[:]|[:][:]/g, ''); // remove binding limitation\n\n $scope.loading = true;\n $scope.mapId = 'map-network-' + $scope.$id;\n $scope.helptipPrefix = 'helptip-' + $scope.mapId; //Override value from super controller (avoid error during help tour)\n\n $scope.map = MapUtils.map({\n cache: 'map-network',\n layers: {\n overlays: {\n member: {\n type: 'featureGroup',\n name: 'MAP.NETWORK.VIEW.LAYER.MEMBER',\n visible: true\n },\n mirror: {\n type: 'featureGroup',\n name: 'MAP.NETWORK.VIEW.LAYER.MIRROR',\n visible: true\n },\n offline: {\n type: 'featureGroup',\n name: 'MAP.NETWORK.VIEW.LAYER.OFFLINE',\n visible: false\n }\n }\n },\n bounds: {},\n loading: true,\n markers: {}\n });\n\n var inheritedEnter = $scope.enter;\n $scope.enter = function(e, state) {\n if ($scope.loading) {\n if (state.stateParams && state.stateParams.c) {\n var cPart = state.stateParams.c.split(':');\n $scope.map.center.lat = parseFloat(cPart[0]);\n $scope.map.center.lng = parseFloat(cPart[1]);\n $scope.map.center.zoom = parseInt(cPart[2]);\n }\n\n $scope.$watch(\"map.center\", function() {\n if (!$scope.map.loading) {\n return $timeout(function() {\n $scope.updateLocationHref();\n }, 300);\n }\n }, true);\n\n // Load the map (and init if need)\n $scope.loadMap()\n .then(function(map){\n\n // Load indicator\n map.fire('dataloading');\n\n // inherited\n return inheritedEnter(e, state); // will call inherited load()\n });\n }\n\n else {\n // Make sur to have previous center coordinate defined in the location URL\n $scope.updateLocationHref();\n\n // inherited\n return inheritedEnter(e, state);\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n var inheritedComputeOptions = $scope.computeOptions;\n $scope.computeOptions = function() {\n var options = inheritedComputeOptions();\n options.filter.online = 'all';\n return options;\n };\n\n $scope.loadMap = function() {\n return leafletData.getMap($scope.mapId).then(function(map) {\n if (!$scope.map.loading) return map; // already loaded\n\n // Add loading control\n L.Control.loading({\n position: 'topright',\n separate: true\n }).addTo(map);\n\n // Add search control\n // Create a hidden layer, to hold search markers\n markersSearchLayer = L.layerGroup({visible: false});\n var searchTip = $interpolate($templateCache.get('plugins/map/templates/network/item_search_tooltip.html'));\n MapUtils.control.search({\n layer: markersSearchLayer,\n propertyName: 'title',\n buildTip: function (text, val) {\n return searchTip(val.layer.options);\n },\n moveToLocation: function(lnglat, title, map) {\n if(this.options.zoom)\n this._map.setView(lnglat, this.options.zoom);\n else\n this._map.panTo(lnglat);\n var popupMarkerId = lnglat.layer && lnglat.layer.options && lnglat.layer.options.popupMarkerId;\n if (popupMarkerId) {\n $timeout(function(){\n var popupMarker = _.find(map._layers, function(layer) {\n return (layer.options && layer.options.id === popupMarkerId);\n });\n if (popupMarker) popupMarker.openPopup();\n }, 400);\n }\n },\n firstTipSubmit: true,\n tooltipLimit: 50\n })\n .addTo(map);\n\n // Add marker cluster layer\n var _getMarkerColor = function(marker) {\n return marker.options && marker.options.icon.options.markerColor;\n };\n var markerClusterLayer = L.markerClusterGroup({\n disableClusteringAtZoom: MapUtils.constants.LOCALIZE_ZOOM,\n maxClusterRadius: 65,\n showCoverageOnHover: false,\n iconCreateFunction: function (cluster) {\n var countByColor = _.countBy(cluster.getAllChildMarkers(), _getMarkerColor);\n var markerColor = countByColor.green ? 'green' :\n (countByColor.lightgreen ? 'lightgreen' : (countByColor.lightgray ? 'lightgray' : 'red'));\n var childCount = cluster.getChildCount();\n var className = 'marker-cluster ' + markerColor + ' marker-cluster-';\n if (childCount < 10) {\n className += 'small';\n } else if (childCount < 100) {\n className += 'medium';\n } else {\n className += 'large';\n }\n return L.divIcon({ html: '<div><span>' + childCount + '</span></div>', className: className, iconSize: new L.Point(40, 40) });\n }\n });\n map.eachLayer(function(layer) {\n // Add capabilities of 'featureGroup.subgroup', if layer is a group\n if (layer.addLayer){\n angular.extend(layer, L.featureGroup.subGroup(markerClusterLayer));\n }\n });\n if (esGeo.point.ip.license) {\n markerClusterLayer.getAttribution = function() {\n return '<a target=\\\"_blank\\\" href=\"{0}\">{1}</a>'.format(\n esGeo.point.ip.license.url,\n esGeo.point.ip.license.name);\n };\n }\n markerClusterLayer.addTo(map);\n\n //$scope.map.layers.overlays['offline'].visible=false;\n\n $scope.map.loading = false;\n return map;\n });\n };\n\n $scope.updateView = function(data) {\n console.debug(\"[map] [peers] Updating UI\");\n\n // Always tru if network not started (e.g. after leave+renter the view)\n $scope.search.loading = !$scope.networkStarted || csNetwork.isBusy();\n\n // Store marker id, to be able to apply deletion\n var markerIdByPeerIdToRemove = angular.copy(markerIdByPeerId);\n\n _.forEach(data.peers||[], function(peer){\n // skip TOR peer\n if (peer.isTor()) return; // already define\n // get marker id\n var markerId = markerIdByPeerId[peer.id];\n\n // if already exists\n if (markerId && $scope.map.markers[markerId]) {\n $scope.updateMarker($scope.map.markers[markerId], peer);\n delete markerIdByPeerIdToRemove[peer.id];\n return;\n }\n\n // Get position by IP\n var bma = peer.bma;\n var address = peer.hasValid4(bma) ? bma.ipv4 : (bma.dns || bma.ipv6);\n esGeo.point.ip.search(address)\n\n // Create the marker\n .then(function(position){// Add marker to list\n markerId = '' + markerCounter++;\n var marker = $scope.updateMarker({\n position: position,\n getMessageScope: function() {\n var scope = $scope.$new();\n scope.peer = peer;\n return scope;\n },\n draggable: false,\n focus: false,\n message: markerMessageTemplate,\n id: markerId\n }, peer);\n\n\n $scope.map.markers[markerId] = marker;\n markerIdByPeerId[peer.id] = markerId;\n\n // Create a search marker (will be hide)\n var searchServer = peer.dns || peer.server;\n var searchText = searchServer +\n (peer.uid ? (' | ' + (peer.name||peer.uid)) : '') +\n ' | ' + formatPubkey(peer.pubkey);\n var searchIp;\n if (bma.ipv4 && !(peer.dns || peer.server).startsWith(bma.ipv4)) {\n searchIp = bma.ipv4;\n searchText += ' | ' + bma.ipv4;\n }\n markersSearchLayer.addLayer(new L.Marker({\n lat: position.lat,\n lng: position.lng\n },\n {\n opacity: 0,\n icon: L.divIcon({\n className: 'ng-hide',\n iconSize: L.point(0, 0)\n }),\n title: searchText,\n peer: angular.extend({ipv4: searchIp}, peer),\n popupMarkerId: markerId\n }));\n })\n .catch(function(err) {\n console.debug('No position found for address ['+address+']', err);\n });\n });\n\n // Remove old markers not found in the new result\n _.forEach(_.keys(markerIdByPeerIdToRemove), function(peerId) {\n delete markerIdByPeerId[peerId];\n });\n _.forEach(_.values(markerIdByPeerIdToRemove), function(markerId) {\n delete $scope.map.markers[markerId];\n });\n\n // Hide loading indicator, when finished\n if (!$scope.search.loading) {\n leafletData.getMap($scope.mapId)\n .then(function (map) {\n $scope.loading = false;\n map.fire('dataload');\n });\n }\n };\n\n $scope.updateMarker = function(marker, peer) {\n marker.layer = !peer.online ? 'offline' : (peer.uid ? 'member' : 'mirror');\n marker.icon = angular.copy(icons[marker.layer]);\n marker.opacity = peer.online ? 1 : 1;\n marker.title = peer.dns || peer.server;\n if (peer.online && !peer.hasMainConsensusBlock) {\n marker.icon.markerColor = peer.hasConsensusBlock ? 'lightgreen' : 'lightgray';\n marker.opacity = peer.hasConsensusBlock ? 0.9 : 0.8;\n }\n if (!marker.lng) {\n marker.lng = marker.position.lng + Math.random() / 1000;\n marker.lat = marker.position.lat + Math.random() / 1000;\n }\n\n return marker;\n };\n\n\n // Update the browser location, to be able to refresh the page\n $scope.updateLocationHref = function(centerHash) {\n // removeIf(device)\n var params = $location.search() || {};\n if (!params.c || !MapUtils.center.isDefault($scope.map.center)) {\n centerHash = centerHash || '{0}:{1}:{2}'.format($scope.map.center.lat.toFixed(4), $scope.map.center.lng.toFixed(4), $scope.map.center.zoom);\n $location.search({ c: centerHash}).replace();\n }\n // endRemoveIf(device)\n };\n\n // removeIf(device)\n // Update the browser location, to be able to refresh the page\n // FIXME: not need, should be removed\n $scope.$on(\"centerUrlHash\", function(event, centerHash) {\n if (!$scope.loading) {\n return $timeout(function() {\n $scope.updateLocationHref(centerHash);\n }, 300);\n }\n });\n // endRemoveIf(device)\n\n /* -- help tip -- */\n\n $scope.showHelpTip = function() {\n // override subclass\n };\n }]);\n","angular.module('cesium.map.settings.controllers', ['cesium.services'])\n\n // Configure menu items\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Extend settings via extension points\n PluginServiceProvider.extendState('app.es_settings', {\n points: {\n 'common': {\n templateUrl: \"plugins/map/templates/settings/es_settings_extend.html\"\n }\n }\n });\n }\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', ['ionic', 'ionic-material', 'ngMessages', 'ngSanitize', 'pascalprecht.translate',\n 'ngApi', 'angular-cache', 'angular.screenmatch', 'angular.bind.notifier', 'ImageCropper', 'ion-digit-keyboard', 'angular-fullscreen-toggle',\n // removeIf(no-plugin)\n 'cesium.plugins',\n // endRemoveIf(no-plugin)\n 'cesium.filters', 'cesium.config', 'cesium.platform', 'cesium.controllers', 'cesium.templates', 'cesium.translations', 'cesium.components', 'cesium.directives'\n ])\n\n // Override the automatic sync between location URL and state\n // (see watch event $locationChangeSuccess in the run() function bellow)\n .config(['$urlRouterProvider', function ($urlRouterProvider) {\n 'ngInject';\n\n $urlRouterProvider.deferIntercept();\n }])\n\n .run(['$rootScope', '$translate', '$state', '$window', '$urlRouter', 'ionicReady', 'Device', 'UIUtils', '$ionicConfig', 'PluginService', 'csPlatform', 'csWallet', function($rootScope, $translate, $state, $window, $urlRouter, ionicReady,\n Device, UIUtils, $ionicConfig, PluginService, csPlatform, csWallet) {\n 'ngInject';\n\n // Must be done before any other $stateChangeStart listeners\n csPlatform.disableChangeState();\n\n var preventStateChange = false; // usefull to avoid duplicate login, when a first page with auth\n $rootScope.$on('$stateChangeStart', function (event, next, nextParams, fromState) {\n if (event.defaultPrevented) return;\n\n var skip = !next.data || $rootScope.tour || event.currentScope.tour; // disabled for help tour\n if (skip) return;\n\n if (preventStateChange) {\n event.preventDefault();\n return;\n }\n\n var options;\n\n // removeIf(android)\n // removeIf(ios)\n // removeIf(firefoxos)\n // -- Automatic redirection to large state (if define) (keep this code for platforms web and ubuntu build)\n if (next.data.large && !UIUtils.screen.isSmall()) {\n event.preventDefault();\n $state.go(next.data.large, nextParams);\n return;\n }\n // endRemoveIf(firefoxos)\n // endRemoveIf(ios)\n // endRemoveIf(android)\n\n var wallet = nextParams.wallet && nextParams.wallet != \"default\" ? csWallet.children.get(nextParams.wallet) : csWallet;\n if (nextParams.wallet && !wallet) {\n console.warn(\"[app] Unable to find the children wallet: \" + nextParams.wallet);\n }\n // If state need auth\n if (next.data.auth && !wallet.isAuth()) {\n event.preventDefault();\n options = next.data.minData ? {minData: true} : undefined;\n preventStateChange = true;\n return csWallet.auth(options)\n .then(function() {\n preventStateChange = false;\n return $state.go(next.name, nextParams);\n })\n .catch(function(err) {\n preventStateChange = false;\n // If cancel, redirect to home, if no current state\n if (err === 'CANCELLED' && !$state.current.name) {\n return $state.go('app.home');\n }\n });\n }\n\n // If state need login\n else if (next.data.login && !csWallet.isLogin()) {\n event.preventDefault();\n options = next.data.minData ? {minData: true} : undefined;\n preventStateChange = true;\n return csWallet.login(options)\n .then(function() {\n preventStateChange = false;\n return $state.go(next.name, nextParams);\n })\n .catch(function(err) {\n preventStateChange = false;\n // If cancel, redirect to home, if no current state\n if (err === 'CANCELLED' && !$state.current.name) {\n return $state.go('app.home');\n }\n });\n }\n\n // If state need login or auth, make sure to load wallet data\n else if (next.data.login || next.data.auth) {\n options = next.data.minData ? {minData: true} : undefined;\n if (!wallet.isDataLoaded(options)) {\n event.preventDefault();\n // Show loading message, when full load\n if (!options || !options.minData) UIUtils.loading.show();\n return wallet.loadData(options)\n .then(function() {\n preventStateChange = false;\n return $state.go(next.name, nextParams);\n });\n }\n }\n });\n\n // Leave the current page, if auth was required to access it\n csWallet.api.data.on.unauth($rootScope, function() {\n if ($state.current && $state.current.data && $state.current.data.auth) {\n $state.go('app.home');\n }\n });\n\n // Prevent $urlRouter's default handler from firing (don't sync ui router)\n $rootScope.$on('$locationChangeSuccess', function(event, newUrl, oldUrl) {\n if ($state.current.data && $state.current.data.silentLocationChange === true) {\n // Skipping propagation, because same URL, and state configured with 'silentLocationChange' options\n var sameUrl = oldUrl && (oldUrl.split('?')[0] === newUrl.split('?')[0]);\n if (sameUrl) event.preventDefault();\n }\n });\n\n // Configures $urlRouter's listener *after* the previous listener\n $urlRouter.listen();\n\n // Start plugins eager services\n PluginService.start();\n\n ionicReady().then(function() {\n if (ionic.Platform.isIOS()) {\n if(window.StatusBar) {\n // fix font color not white on iOS 11+\n StatusBar.styleLightContent();\n }\n }\n });\n }])\n;\n\nwindow.ionic.Platform.ready(function() {\n angular.bootstrap(document, ['cesium']);\n});\n","angular.module('cesium.components', [])\n\n .component('csBadgeCertification', {\n bindings: {\n requirements: '=',\n parameters: '<',\n csId: '@'\n },\n templateUrl: 'templates/common/badge_certification_count.html'\n })\n\n .component('csBadgeGivenCertification', {\n bindings: {\n identity: '=',\n parameters: '<',\n csId: '@'\n },\n templateUrl: 'templates/common/badge_given_certification_count.html'\n })\n\n .component('csSortIcon', {\n bindings: {\n asc: '=',\n sort: '=',\n toggle: '<'\n },\n template:\n '<i class=\"ion-chevron-up\" ng-class=\"{gray: !$ctrl.asc || $ctrl.sort != $ctrl.toggle}\" style=\"position: relative; left: 5px; top:-5px; font-size: 9px;\"></i>' +\n '<i class=\"ion-chevron-down\" ng-class=\"{gray : $ctrl.asc || $ctrl.sort != $ctrl.toggle}\" style=\"position: relative; left: -2.6px; top: 3px; font-size: 9px;\"></i>'\n })\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"]} |