├── .editorconfig
├── .gitignore
├── .gitmodules
├── 404.html
├── LICENSE
├── README.md
├── assets
├── images
│ ├── favicon.ico
│ └── icons
│ │ ├── bitbucket.4ebea66e.svg
│ │ ├── github.a4034fb1.svg
│ │ └── gitlab.d80e5efc.svg
├── javascripts
│ ├── application.5165553b.js
│ ├── lunr
│ │ ├── lunr.da.js
│ │ ├── lunr.de.js
│ │ ├── lunr.du.js
│ │ ├── lunr.es.js
│ │ ├── lunr.fi.js
│ │ ├── lunr.fr.js
│ │ ├── lunr.hu.js
│ │ ├── lunr.it.js
│ │ ├── lunr.jp.js
│ │ ├── lunr.multi.js
│ │ ├── lunr.no.js
│ │ ├── lunr.pt.js
│ │ ├── lunr.ro.js
│ │ ├── lunr.ru.js
│ │ ├── lunr.stemmer.support.js
│ │ ├── lunr.sv.js
│ │ ├── lunr.tr.js
│ │ └── tinyseg.js
│ └── modernizr.1aa3b519.js
└── stylesheets
│ ├── application-palette.792431c1.css
│ └── application.41c6761c.css
├── docs
├── CNAME
├── accepting-monero
│ └── overview.md
├── cold-storage
│ └── offline-transaction-signing.md
├── cryptography
│ ├── asymmetric
│ │ ├── edwards25519.md
│ │ ├── introduction.md
│ │ ├── key-image.md
│ │ ├── private-key.md
│ │ └── public-key.md
│ ├── base58.md
│ ├── introduction.md
│ ├── keccak-256.md
│ └── prng.md
├── extra.css
├── images
│ ├── monero-dir.png
│ ├── monero.svg
│ └── sheets-icon.png
├── index.md
├── infrastructure
│ ├── monero-pulse.md
│ ├── networks.md
│ └── tor-onion-p2p-seed-nodes.md
├── interacting
│ ├── download-monero-binaries.md
│ ├── monero-blockchain-export-reference.md
│ ├── monero-blockchain-import-reference.md
│ ├── monero-config-file.md
│ ├── monero-wallet-cli-reference.md
│ ├── monero-wallet-gui-reference.md
│ ├── monero-wallet-rpc-reference.md
│ ├── monerod-reference.md
│ ├── overview.md
│ └── verify-monero-binaries.md
├── multisignature.md
├── overrides.css
├── proof-of-work
│ ├── cryptonight.md
│ ├── pow-in-cryptocurrencies.md
│ ├── random-x.md
│ └── what-is-pow.md
├── public-address
│ ├── integrated-address.md
│ ├── main-address.md
│ ├── standard-address.md
│ └── subaddress.md
├── r
│ └── accepting-monero-comparison-matrix.md
├── running-node
│ └── open-node-tor-onion.md
└── technical-specs.md
├── images
└── monero.svg
├── mkdocs.yml
└── search
└── search_index.json
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | end_of_line = lf
6 | insert_final_newline = true
7 | indent_style = space
8 | indent_size = 2
9 | trim_trailing_whitespace = true
10 | max_line_length = 120
11 |
12 | [*.py]
13 | indent_size = 4
14 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | *.iml
3 | public
4 |
5 |
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "mkdocs-material"]
2 | path = mkdocs-material
3 | url = https://github.com/monerodocs/mkdocs-material.git
4 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017-2021 monerodocs
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # MoneroDocs
2 |
3 | - [MoneroDocs](#monerodocs)
4 | - [About](#about)
5 | - [Contributing](#contributing)
6 |
7 | ## About
8 |
9 | Monerodocs attempts to organize basic technical knowledge on Monero in one place.
10 |
11 | While technical explanations are out there, knowledge is scattered through reddit posts, git comments, stack exchange answers, chat logs and the source code. This makes it hard to find complete and up-to-date explanations on advanced topics.
12 |
13 | The goal is to educate and onboard power users faster.
14 |
15 | ## Contributing
16 |
17 | To contribute to MoneroDocs, you'll need to setup your local [Mkdocs-Material](https://squidfunk.github.io/mkdocs-material/) environment:
18 |
19 | ```sh
20 | # Fork the monerodocs/md Github repo
21 |
22 | # Clone your newly created repo- be sure to include the submodule flag
23 | git clone --recurse-submodules git@github.com:your-user-name/md.git
24 |
25 | cd md
26 |
27 | # Install mkdocs dependencies
28 | pip install mkdocs-material mkdocs-minify-plugin
29 |
30 | # Run the documentation server locally
31 | python3 -m mkdocs serve
32 | ```
33 |
--------------------------------------------------------------------------------
/assets/images/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monerodocs/md/964cd29856e887728b0ad7ddd6c22cc7c2d5d944/assets/images/favicon.ico
--------------------------------------------------------------------------------
/assets/images/icons/bitbucket.4ebea66e.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/images/icons/github.a4034fb1.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/images/icons/gitlab.d80e5efc.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/javascripts/lunr/lunr.da.js:
--------------------------------------------------------------------------------
1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.da=function(){this.pipeline.reset(),this.pipeline.add(e.da.trimmer,e.da.stopWordFilter,e.da.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.da.stemmer))},e.da.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.da.trimmer=e.trimmerSupport.generateTrimmer(e.da.wordCharacters),e.Pipeline.registerFunction(e.da.trimmer,"trimmer-da"),e.da.stemmer=function(){var r=e.stemmerSupport.Among,i=e.stemmerSupport.SnowballProgram,n=new function(){function e(){var e,r=l.limit-l.cursor;l.cursor>=t&&(e=l.limit_backward,l.limit_backward=t,l.ket=l.cursor,l.find_among_b(a,4)?(l.bra=l.cursor,l.limit_backward=e,l.cursor=l.limit-r,l.cursor>l.limit_backward&&(l.cursor--,l.bra=l.cursor,l.slice_del())):l.limit_backward=e)}var n,t,s,o=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],a=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],d=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],u=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],c=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],l=new i;this.setCurrent=function(e){l.setCurrent(e)},this.getCurrent=function(){return l.getCurrent()},this.stem=function(){var r=l.cursor;return function(){var e,r=l.cursor+3;if(t=l.limit,0<=r&&r<=l.limit){for(n=r;;){if(e=l.cursor,l.in_grouping(u,97,248)){l.cursor=e;break}if(l.cursor=e,e>=l.limit)return;l.cursor++}for(;!l.out_grouping(u,97,248);){if(l.cursor>=l.limit)return;l.cursor++}(t=l.cursor)=t&&(r=l.limit_backward,l.limit_backward=t,l.ket=l.cursor,e=l.find_among_b(o,32),l.limit_backward=r,e))switch(l.bra=l.cursor,e){case 1:l.slice_del();break;case 2:l.in_grouping_b(c,97,229)&&l.slice_del()}}(),l.cursor=l.limit,e(),l.cursor=l.limit,function(){var r,i,n,s=l.limit-l.cursor;if(l.ket=l.cursor,l.eq_s_b(2,"st")&&(l.bra=l.cursor,l.eq_s_b(2,"ig")&&l.slice_del()),l.cursor=l.limit-s,l.cursor>=t&&(i=l.limit_backward,l.limit_backward=t,l.ket=l.cursor,r=l.find_among_b(d,5),l.limit_backward=i,r))switch(l.bra=l.cursor,r){case 1:l.slice_del(),n=l.limit-l.cursor,e(),l.cursor=l.limit-n;break;case 2:l.slice_from("løs")}}(),l.cursor=l.limit,function(){var e;l.cursor>=t&&(e=l.limit_backward,l.limit_backward=t,l.ket=l.cursor,l.out_grouping_b(u,97,248)?(l.bra=l.cursor,s=l.slice_to(s),l.limit_backward=e,l.eq_v_b(s)&&l.slice_del()):l.limit_backward=e)}(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}});
--------------------------------------------------------------------------------
/assets/javascripts/lunr/lunr.de.js:
--------------------------------------------------------------------------------
1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.de=function(){this.pipeline.reset(),this.pipeline.add(e.de.trimmer,e.de.stopWordFilter,e.de.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.de.stemmer))},e.de.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.de.trimmer=e.trimmerSupport.generateTrimmer(e.de.wordCharacters),e.Pipeline.registerFunction(e.de.trimmer,"trimmer-de"),e.de.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(e,r,n){return!(!_.eq_s(1,e)||(_.ket=_.cursor,!_.in_grouping(w,97,252)))&&(_.slice_from(r),_.cursor=n,!0)}function i(){for(;!_.in_grouping(w,97,252);){if(_.cursor>=_.limit)return!0;_.cursor++}for(;!_.out_grouping(w,97,252);){if(_.cursor>=_.limit)return!0;_.cursor++}return!1}function s(){return u<=_.cursor}function t(){return c<=_.cursor}var o,c,u,a=[new r("",-1,6),new r("U",0,2),new r("Y",0,1),new r("ä",0,3),new r("ö",0,4),new r("ü",0,5)],d=[new r("e",-1,2),new r("em",-1,1),new r("en",-1,2),new r("ern",-1,1),new r("er",-1,1),new r("s",-1,3),new r("es",5,2)],l=[new r("en",-1,1),new r("er",-1,1),new r("st",-1,2),new r("est",2,1)],m=[new r("ig",-1,1),new r("lich",-1,1)],h=[new r("end",-1,1),new r("ig",-1,2),new r("ung",-1,1),new r("lich",-1,3),new r("isch",-1,2),new r("ik",-1,2),new r("heit",-1,3),new r("keit",-1,4)],w=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32,8],f=[117,30,5],b=[117,30,4],_=new n;this.setCurrent=function(e){_.setCurrent(e)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){var r=_.cursor;return function(){for(var r,n,i,s,t=_.cursor;;)if(r=_.cursor,_.bra=r,_.eq_s(1,"ß"))_.ket=_.cursor,_.slice_from("ss");else{if(r>=_.limit)break;_.cursor=r+1}for(_.cursor=t;;)for(n=_.cursor;;){if(i=_.cursor,_.in_grouping(w,97,252)){if(s=_.cursor,_.bra=s,e("u","U",i))break;if(_.cursor=s,e("y","Y",i))break}if(i>=_.limit)return void(_.cursor=n);_.cursor=i+1}}(),_.cursor=r,function(){u=_.limit,c=u;var e=_.cursor+3;0<=e&&e<=_.limit&&(o=e,i()||((u=_.cursor)=_.limit)return;_.cursor++}}}(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.de.stemmer,"stemmer-de"),e.de.stopWordFilter=e.generateStopWordFilter("aber alle allem allen aller alles als also am an ander andere anderem anderen anderer anderes anderm andern anderr anders auch auf aus bei bin bis bist da damit dann das dasselbe dazu daß dein deine deinem deinen deiner deines dem demselben den denn denselben der derer derselbe derselben des desselben dessen dich die dies diese dieselbe dieselben diesem diesen dieser dieses dir doch dort du durch ein eine einem einen einer eines einig einige einigem einigen einiger einiges einmal er es etwas euch euer eure eurem euren eurer eures für gegen gewesen hab habe haben hat hatte hatten hier hin hinter ich ihm ihn ihnen ihr ihre ihrem ihren ihrer ihres im in indem ins ist jede jedem jeden jeder jedes jene jenem jenen jener jenes jetzt kann kein keine keinem keinen keiner keines können könnte machen man manche manchem manchen mancher manches mein meine meinem meinen meiner meines mich mir mit muss musste nach nicht nichts noch nun nur ob oder ohne sehr sein seine seinem seinen seiner seines selbst sich sie sind so solche solchem solchen solcher solches soll sollte sondern sonst um und uns unse unsem unsen unser unses unter viel vom von vor war waren warst was weg weil weiter welche welchem welchen welcher welches wenn werde werden wie wieder will wir wird wirst wo wollen wollte während würde würden zu zum zur zwar zwischen über".split(" ")),e.Pipeline.registerFunction(e.de.stopWordFilter,"stopWordFilter-de")}});
--------------------------------------------------------------------------------
/assets/javascripts/lunr/lunr.du.js:
--------------------------------------------------------------------------------
1 | !function(r,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(r.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");r.du=function(){this.pipeline.reset(),this.pipeline.add(r.du.trimmer,r.du.stopWordFilter,r.du.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(r.du.stemmer))},r.du.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.du.trimmer=r.trimmerSupport.generateTrimmer(r.du.wordCharacters),r.Pipeline.registerFunction(r.du.trimmer,"trimmer-du"),r.du.stemmer=function(){var e=r.stemmerSupport.Among,i=r.stemmerSupport.SnowballProgram,n=new function(){function r(r){return v.cursor=r,r>=v.limit||(v.cursor++,!1)}function n(){for(;!v.in_grouping(g,97,232);){if(v.cursor>=v.limit)return!0;v.cursor++}for(;!v.out_grouping(g,97,232);){if(v.cursor>=v.limit)return!0;v.cursor++}return!1}function o(){return l<=v.cursor}function t(){return a<=v.cursor}function s(){var r=v.limit-v.cursor;v.find_among_b(_,3)&&(v.cursor=v.limit-r,v.ket=v.cursor,v.cursor>v.limit_backward&&(v.cursor--,v.bra=v.cursor,v.slice_del()))}function u(){var r;m=!1,v.ket=v.cursor,v.eq_s_b(1,"e")&&(v.bra=v.cursor,o()&&(r=v.limit-v.cursor,v.out_grouping_b(g,97,232)&&(v.cursor=v.limit-r,v.slice_del(),m=!0,s())))}function c(){var r;o()&&(r=v.limit-v.cursor,v.out_grouping_b(g,97,232)&&(v.cursor=v.limit-r,v.eq_s_b(3,"gem")||(v.cursor=v.limit-r,v.slice_del(),s())))}var a,l,m,d=[new e("",-1,6),new e("á",0,1),new e("ä",0,1),new e("é",0,2),new e("ë",0,2),new e("í",0,3),new e("ï",0,3),new e("ó",0,4),new e("ö",0,4),new e("ú",0,5),new e("ü",0,5)],f=[new e("",-1,3),new e("I",0,2),new e("Y",0,1)],_=[new e("dd",-1,-1),new e("kk",-1,-1),new e("tt",-1,-1)],w=[new e("ene",-1,2),new e("se",-1,3),new e("en",-1,2),new e("heden",2,1),new e("s",-1,3)],b=[new e("end",-1,1),new e("ig",-1,2),new e("ing",-1,1),new e("lijk",-1,3),new e("baar",-1,4),new e("bar",-1,5)],p=[new e("aa",-1,-1),new e("ee",-1,-1),new e("oo",-1,-1),new e("uu",-1,-1)],g=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],h=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],k=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],v=new i;this.setCurrent=function(r){v.setCurrent(r)},this.getCurrent=function(){return v.getCurrent()},this.stem=function(){var e=v.cursor;return function(){for(var e,i,n,o=v.cursor;;){if(v.bra=v.cursor,e=v.find_among(d,11))switch(v.ket=v.cursor,e){case 1:v.slice_from("a");continue;case 2:v.slice_from("e");continue;case 3:v.slice_from("i");continue;case 4:v.slice_from("o");continue;case 5:v.slice_from("u");continue;case 6:if(v.cursor>=v.limit)break;v.cursor++;continue}break}for(v.cursor=o,v.bra=o,v.eq_s(1,"y")?(v.ket=v.cursor,v.slice_from("Y")):v.cursor=o;;)if(i=v.cursor,v.in_grouping(g,97,232)){if(n=v.cursor,v.bra=n,v.eq_s(1,"i"))v.ket=v.cursor,v.in_grouping(g,97,232)&&(v.slice_from("I"),v.cursor=i);else if(v.cursor=n,v.eq_s(1,"y"))v.ket=v.cursor,v.slice_from("Y"),v.cursor=i;else if(r(i))break}else if(r(i))break}(),v.cursor=e,l=v.limit,a=l,n()||((l=v.cursor)<3&&(l=3),n()||(a=v.cursor)),v.limit_backward=e,v.cursor=v.limit,function(){var r,e,i,n,a,l,d=v.limit-v.cursor;if(v.ket=v.cursor,r=v.find_among_b(w,5))switch(v.bra=v.cursor,r){case 1:o()&&v.slice_from("heid");break;case 2:c();break;case 3:o()&&v.out_grouping_b(k,97,232)&&v.slice_del()}if(v.cursor=v.limit-d,u(),v.cursor=v.limit-d,v.ket=v.cursor,v.eq_s_b(4,"heid")&&(v.bra=v.cursor,t()&&(e=v.limit-v.cursor,v.eq_s_b(1,"c")||(v.cursor=v.limit-e,v.slice_del(),v.ket=v.cursor,v.eq_s_b(2,"en")&&(v.bra=v.cursor,c())))),v.cursor=v.limit-d,v.ket=v.cursor,r=v.find_among_b(b,6))switch(v.bra=v.cursor,r){case 1:if(t()){if(v.slice_del(),i=v.limit-v.cursor,v.ket=v.cursor,v.eq_s_b(2,"ig")&&(v.bra=v.cursor,t()&&(n=v.limit-v.cursor,!v.eq_s_b(1,"e")))){v.cursor=v.limit-n,v.slice_del();break}v.cursor=v.limit-i,s()}break;case 2:t()&&(a=v.limit-v.cursor,v.eq_s_b(1,"e")||(v.cursor=v.limit-a,v.slice_del()));break;case 3:t()&&(v.slice_del(),u());break;case 4:t()&&v.slice_del();break;case 5:t()&&m&&v.slice_del()}v.cursor=v.limit-d,v.out_grouping_b(h,73,232)&&(l=v.limit-v.cursor,v.find_among_b(p,4)&&v.out_grouping_b(g,97,232)&&(v.cursor=v.limit-l,v.ket=v.cursor,v.cursor>v.limit_backward&&(v.cursor--,v.bra=v.cursor,v.slice_del())))}(),v.cursor=v.limit_backward,function(){for(var r;;)if(v.bra=v.cursor,r=v.find_among(f,3))switch(v.ket=v.cursor,r){case 1:v.slice_from("y");break;case 2:v.slice_from("i");break;case 3:if(v.cursor>=v.limit)return;v.cursor++}}(),!0}};return function(r){return"function"==typeof r.update?r.update(function(r){return n.setCurrent(r),n.stem(),n.getCurrent()}):(n.setCurrent(r),n.stem(),n.getCurrent())}}(),r.Pipeline.registerFunction(r.du.stemmer,"stemmer-du"),r.du.stopWordFilter=r.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),r.Pipeline.registerFunction(r.du.stopWordFilter,"stopWordFilter-du")}});
--------------------------------------------------------------------------------
/assets/javascripts/lunr/lunr.es.js:
--------------------------------------------------------------------------------
1 | !function(e,s){"function"==typeof define&&define.amd?define(s):"object"==typeof exports?module.exports=s():s()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.es=function(){this.pipeline.reset(),this.pipeline.add(e.es.trimmer,e.es.stopWordFilter,e.es.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.es.stemmer))},e.es.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.es.trimmer=e.trimmerSupport.generateTrimmer(e.es.wordCharacters),e.Pipeline.registerFunction(e.es.trimmer,"trimmer-es"),e.es.stemmer=function(){var s=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,n=new function(){function e(){if(C.out_grouping(q,97,252)){for(;!C.in_grouping(q,97,252);){if(C.cursor>=C.limit)return!0;C.cursor++}return!1}return!0}function n(){var s,r=C.cursor;if(function(){if(C.in_grouping(q,97,252)){var s=C.cursor;if(e()){if(C.cursor=s,!C.in_grouping(q,97,252))return!0;for(;!C.out_grouping(q,97,252);){if(C.cursor>=C.limit)return!0;C.cursor++}}return!1}return!0}()){if(C.cursor=r,!C.out_grouping(q,97,252))return;if(s=C.cursor,e()){if(C.cursor=s,!C.in_grouping(q,97,252)||C.cursor>=C.limit)return;C.cursor++}}l=C.cursor}function i(){for(;!C.in_grouping(q,97,252);){if(C.cursor>=C.limit)return!1;C.cursor++}for(;!C.out_grouping(q,97,252);){if(C.cursor>=C.limit)return!1;C.cursor++}return!0}function a(){return l<=C.cursor}function t(){return c<=C.cursor}function o(e,s){if(!t())return!0;C.slice_del(),C.ket=C.cursor;var r=C.find_among_b(e,s);return r&&(C.bra=C.cursor,1==r&&t()&&C.slice_del()),!1}function u(e){return!t()||(C.slice_del(),C.ket=C.cursor,C.eq_s_b(2,e)&&(C.bra=C.cursor,t()&&C.slice_del()),!1)}function w(){var e;if(C.ket=C.cursor,e=C.find_among_b(p,46)){switch(C.bra=C.cursor,e){case 1:if(!t())return!1;C.slice_del();break;case 2:if(u("ic"))return!1;break;case 3:if(!t())return!1;C.slice_from("log");break;case 4:if(!t())return!1;C.slice_from("u");break;case 5:if(!t())return!1;C.slice_from("ente");break;case 6:if(!(m<=C.cursor))return!1;C.slice_del(),C.ket=C.cursor,(e=C.find_among_b(_,4))&&(C.bra=C.cursor,t()&&(C.slice_del(),1==e&&(C.ket=C.cursor,C.eq_s_b(2,"at")&&(C.bra=C.cursor,t()&&C.slice_del()))));break;case 7:if(o(h,3))return!1;break;case 8:if(o(v,3))return!1;break;case 9:if(u("at"))return!1}return!0}return!1}var c,m,l,d=[new s("",-1,6),new s("á",0,1),new s("é",0,2),new s("í",0,3),new s("ó",0,4),new s("ú",0,5)],b=[new s("la",-1,-1),new s("sela",0,-1),new s("le",-1,-1),new s("me",-1,-1),new s("se",-1,-1),new s("lo",-1,-1),new s("selo",5,-1),new s("las",-1,-1),new s("selas",7,-1),new s("les",-1,-1),new s("los",-1,-1),new s("selos",10,-1),new s("nos",-1,-1)],f=[new s("ando",-1,6),new s("iendo",-1,6),new s("yendo",-1,7),new s("ándo",-1,2),new s("iéndo",-1,1),new s("ar",-1,6),new s("er",-1,6),new s("ir",-1,6),new s("ár",-1,3),new s("ér",-1,4),new s("ír",-1,5)],_=[new s("ic",-1,-1),new s("ad",-1,-1),new s("os",-1,-1),new s("iv",-1,1)],h=[new s("able",-1,1),new s("ible",-1,1),new s("ante",-1,1)],v=[new s("ic",-1,1),new s("abil",-1,1),new s("iv",-1,1)],p=[new s("ica",-1,1),new s("ancia",-1,2),new s("encia",-1,5),new s("adora",-1,2),new s("osa",-1,1),new s("ista",-1,1),new s("iva",-1,9),new s("anza",-1,1),new s("logía",-1,3),new s("idad",-1,8),new s("able",-1,1),new s("ible",-1,1),new s("ante",-1,2),new s("mente",-1,7),new s("amente",13,6),new s("ación",-1,2),new s("ución",-1,4),new s("ico",-1,1),new s("ismo",-1,1),new s("oso",-1,1),new s("amiento",-1,1),new s("imiento",-1,1),new s("ivo",-1,9),new s("ador",-1,2),new s("icas",-1,1),new s("ancias",-1,2),new s("encias",-1,5),new s("adoras",-1,2),new s("osas",-1,1),new s("istas",-1,1),new s("ivas",-1,9),new s("anzas",-1,1),new s("logías",-1,3),new s("idades",-1,8),new s("ables",-1,1),new s("ibles",-1,1),new s("aciones",-1,2),new s("uciones",-1,4),new s("adores",-1,2),new s("antes",-1,2),new s("icos",-1,1),new s("ismos",-1,1),new s("osos",-1,1),new s("amientos",-1,1),new s("imientos",-1,1),new s("ivos",-1,9)],g=[new s("ya",-1,1),new s("ye",-1,1),new s("yan",-1,1),new s("yen",-1,1),new s("yeron",-1,1),new s("yendo",-1,1),new s("yo",-1,1),new s("yas",-1,1),new s("yes",-1,1),new s("yais",-1,1),new s("yamos",-1,1),new s("yó",-1,1)],k=[new s("aba",-1,2),new s("ada",-1,2),new s("ida",-1,2),new s("ara",-1,2),new s("iera",-1,2),new s("ía",-1,2),new s("aría",5,2),new s("ería",5,2),new s("iría",5,2),new s("ad",-1,2),new s("ed",-1,2),new s("id",-1,2),new s("ase",-1,2),new s("iese",-1,2),new s("aste",-1,2),new s("iste",-1,2),new s("an",-1,2),new s("aban",16,2),new s("aran",16,2),new s("ieran",16,2),new s("ían",16,2),new s("arían",20,2),new s("erían",20,2),new s("irían",20,2),new s("en",-1,1),new s("asen",24,2),new s("iesen",24,2),new s("aron",-1,2),new s("ieron",-1,2),new s("arán",-1,2),new s("erán",-1,2),new s("irán",-1,2),new s("ado",-1,2),new s("ido",-1,2),new s("ando",-1,2),new s("iendo",-1,2),new s("ar",-1,2),new s("er",-1,2),new s("ir",-1,2),new s("as",-1,2),new s("abas",39,2),new s("adas",39,2),new s("idas",39,2),new s("aras",39,2),new s("ieras",39,2),new s("ías",39,2),new s("arías",45,2),new s("erías",45,2),new s("irías",45,2),new s("es",-1,1),new s("ases",49,2),new s("ieses",49,2),new s("abais",-1,2),new s("arais",-1,2),new s("ierais",-1,2),new s("íais",-1,2),new s("aríais",55,2),new s("eríais",55,2),new s("iríais",55,2),new s("aseis",-1,2),new s("ieseis",-1,2),new s("asteis",-1,2),new s("isteis",-1,2),new s("áis",-1,2),new s("éis",-1,1),new s("aréis",64,2),new s("eréis",64,2),new s("iréis",64,2),new s("ados",-1,2),new s("idos",-1,2),new s("amos",-1,2),new s("ábamos",70,2),new s("áramos",70,2),new s("iéramos",70,2),new s("íamos",70,2),new s("aríamos",74,2),new s("eríamos",74,2),new s("iríamos",74,2),new s("emos",-1,1),new s("aremos",78,2),new s("eremos",78,2),new s("iremos",78,2),new s("ásemos",78,2),new s("iésemos",78,2),new s("imos",-1,2),new s("arás",-1,2),new s("erás",-1,2),new s("irás",-1,2),new s("ís",-1,2),new s("ará",-1,2),new s("erá",-1,2),new s("irá",-1,2),new s("aré",-1,2),new s("eré",-1,2),new s("iré",-1,2),new s("ió",-1,2)],y=[new s("a",-1,1),new s("e",-1,2),new s("o",-1,1),new s("os",-1,1),new s("á",-1,1),new s("é",-1,2),new s("í",-1,1),new s("ó",-1,1)],q=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,4,10],C=new r;this.setCurrent=function(e){C.setCurrent(e)},this.getCurrent=function(){return C.getCurrent()},this.stem=function(){var e=C.cursor;return function(){var e=C.cursor;l=C.limit,m=l,c=l,n(),C.cursor=e,i()&&(m=C.cursor,i()&&(c=C.cursor))}(),C.limit_backward=e,C.cursor=C.limit,function(){var e;if(C.ket=C.cursor,C.find_among_b(b,13)&&(C.bra=C.cursor,(e=C.find_among_b(f,11))&&a()))switch(e){case 1:C.bra=C.cursor,C.slice_from("iendo");break;case 2:C.bra=C.cursor,C.slice_from("ando");break;case 3:C.bra=C.cursor,C.slice_from("ar");break;case 4:C.bra=C.cursor,C.slice_from("er");break;case 5:C.bra=C.cursor,C.slice_from("ir");break;case 6:C.slice_del();break;case 7:C.eq_s_b(1,"u")&&C.slice_del()}}(),C.cursor=C.limit,w()||(C.cursor=C.limit,function(){var e,s;if(C.cursor>=l&&(s=C.limit_backward,C.limit_backward=l,C.ket=C.cursor,e=C.find_among_b(g,12),C.limit_backward=s,e)){if(C.bra=C.cursor,1==e){if(!C.eq_s_b(1,"u"))return!1;C.slice_del()}return!0}return!1}()||(C.cursor=C.limit,function(){var e,s,r,n;if(C.cursor>=l&&(s=C.limit_backward,C.limit_backward=l,C.ket=C.cursor,e=C.find_among_b(k,96),C.limit_backward=s,e))switch(C.bra=C.cursor,e){case 1:r=C.limit-C.cursor,C.eq_s_b(1,"u")?(n=C.limit-C.cursor,C.eq_s_b(1,"g")?C.cursor=C.limit-n:C.cursor=C.limit-r):C.cursor=C.limit-r,C.bra=C.cursor;case 2:C.slice_del()}}())),C.cursor=C.limit,function(){var e,s;if(C.ket=C.cursor,e=C.find_among_b(y,8))switch(C.bra=C.cursor,e){case 1:a()&&C.slice_del();break;case 2:a()&&(C.slice_del(),C.ket=C.cursor,C.eq_s_b(1,"u")&&(C.bra=C.cursor,s=C.limit-C.cursor,C.eq_s_b(1,"g")&&(C.cursor=C.limit-s,a()&&C.slice_del())))}}(),C.cursor=C.limit_backward,function(){for(var e;;){if(C.bra=C.cursor,e=C.find_among(d,6))switch(C.ket=C.cursor,e){case 1:C.slice_from("a");continue;case 2:C.slice_from("e");continue;case 3:C.slice_from("i");continue;case 4:C.slice_from("o");continue;case 5:C.slice_from("u");continue;case 6:if(C.cursor>=C.limit)break;C.cursor++;continue}break}}(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.es.stemmer,"stemmer-es"),e.es.stopWordFilter=e.generateStopWordFilter("a al algo algunas algunos ante antes como con contra cual cuando de del desde donde durante e el ella ellas ellos en entre era erais eran eras eres es esa esas ese eso esos esta estaba estabais estaban estabas estad estada estadas estado estados estamos estando estar estaremos estará estarán estarás estaré estaréis estaría estaríais estaríamos estarían estarías estas este estemos esto estos estoy estuve estuviera estuvierais estuvieran estuvieras estuvieron estuviese estuvieseis estuviesen estuvieses estuvimos estuviste estuvisteis estuviéramos estuviésemos estuvo está estábamos estáis están estás esté estéis estén estés fue fuera fuerais fueran fueras fueron fuese fueseis fuesen fueses fui fuimos fuiste fuisteis fuéramos fuésemos ha habida habidas habido habidos habiendo habremos habrá habrán habrás habré habréis habría habríais habríamos habrían habrías habéis había habíais habíamos habían habías han has hasta hay haya hayamos hayan hayas hayáis he hemos hube hubiera hubierais hubieran hubieras hubieron hubiese hubieseis hubiesen hubieses hubimos hubiste hubisteis hubiéramos hubiésemos hubo la las le les lo los me mi mis mucho muchos muy más mí mía mías mío míos nada ni no nos nosotras nosotros nuestra nuestras nuestro nuestros o os otra otras otro otros para pero poco por porque que quien quienes qué se sea seamos sean seas seremos será serán serás seré seréis sería seríais seríamos serían serías seáis sido siendo sin sobre sois somos son soy su sus suya suyas suyo suyos sí también tanto te tendremos tendrá tendrán tendrás tendré tendréis tendría tendríais tendríamos tendrían tendrías tened tenemos tenga tengamos tengan tengas tengo tengáis tenida tenidas tenido tenidos teniendo tenéis tenía teníais teníamos tenían tenías ti tiene tienen tienes todo todos tu tus tuve tuviera tuvierais tuvieran tuvieras tuvieron tuviese tuvieseis tuviesen tuvieses tuvimos tuviste tuvisteis tuviéramos tuviésemos tuvo tuya tuyas tuyo tuyos tú un una uno unos vosotras vosotros vuestra vuestras vuestro vuestros y ya yo él éramos".split(" ")),e.Pipeline.registerFunction(e.es.stopWordFilter,"stopWordFilter-es")}});
--------------------------------------------------------------------------------
/assets/javascripts/lunr/lunr.fi.js:
--------------------------------------------------------------------------------
1 | !function(i,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(i.lunr)}(this,function(){return function(i){if(void 0===i)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===i.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");i.fi=function(){this.pipeline.reset(),this.pipeline.add(i.fi.trimmer,i.fi.stopWordFilter,i.fi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(i.fi.stemmer))},i.fi.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",i.fi.trimmer=i.trimmerSupport.generateTrimmer(i.fi.wordCharacters),i.Pipeline.registerFunction(i.fi.trimmer,"trimmer-fi"),i.fi.stemmer=function(){var e=i.stemmerSupport.Among,r=i.stemmerSupport.SnowballProgram,n=new function(){function i(){for(var i;;){if(i=C.cursor,C.in_grouping(j,97,246))break;if(C.cursor=i,i>=C.limit)return!0;C.cursor++}for(C.cursor=i;!C.out_grouping(j,97,246);){if(C.cursor>=C.limit)return!0;C.cursor++}return!1}function n(){var i,e;if(C.cursor>=u)if(e=C.limit_backward,C.limit_backward=u,C.ket=C.cursor,i=C.find_among_b(c,10)){switch(C.bra=C.cursor,C.limit_backward=e,i){case 1:if(!C.in_grouping_b(q,97,246))return;break;case 2:if(!(a<=C.cursor))return}C.slice_del()}else C.limit_backward=e}function t(){return C.find_among_b(b,7)}function s(){return C.eq_s_b(1,"i")&&C.in_grouping_b(v,97,246)}var o,l,a,u,c=[new e("pa",-1,1),new e("sti",-1,2),new e("kaan",-1,1),new e("han",-1,1),new e("kin",-1,1),new e("hän",-1,1),new e("kään",-1,1),new e("ko",-1,1),new e("pä",-1,1),new e("kö",-1,1)],m=[new e("lla",-1,-1),new e("na",-1,-1),new e("ssa",-1,-1),new e("ta",-1,-1),new e("lta",3,-1),new e("sta",3,-1)],w=[new e("llä",-1,-1),new e("nä",-1,-1),new e("ssä",-1,-1),new e("tä",-1,-1),new e("ltä",3,-1),new e("stä",3,-1)],_=[new e("lle",-1,-1),new e("ine",-1,-1)],k=[new e("nsa",-1,3),new e("mme",-1,3),new e("nne",-1,3),new e("ni",-1,2),new e("si",-1,1),new e("an",-1,4),new e("en",-1,6),new e("än",-1,5),new e("nsä",-1,3)],b=[new e("aa",-1,-1),new e("ee",-1,-1),new e("ii",-1,-1),new e("oo",-1,-1),new e("uu",-1,-1),new e("ää",-1,-1),new e("öö",-1,-1)],d=[new e("a",-1,8),new e("lla",0,-1),new e("na",0,-1),new e("ssa",0,-1),new e("ta",0,-1),new e("lta",4,-1),new e("sta",4,-1),new e("tta",4,9),new e("lle",-1,-1),new e("ine",-1,-1),new e("ksi",-1,-1),new e("n",-1,7),new e("han",11,1),new e("den",11,-1,s),new e("seen",11,-1,t),new e("hen",11,2),new e("tten",11,-1,s),new e("hin",11,3),new e("siin",11,-1,s),new e("hon",11,4),new e("hän",11,5),new e("hön",11,6),new e("ä",-1,8),new e("llä",22,-1),new e("nä",22,-1),new e("ssä",22,-1),new e("tä",22,-1),new e("ltä",26,-1),new e("stä",26,-1),new e("ttä",26,9)],f=[new e("eja",-1,-1),new e("mma",-1,1),new e("imma",1,-1),new e("mpa",-1,1),new e("impa",3,-1),new e("mmi",-1,1),new e("immi",5,-1),new e("mpi",-1,1),new e("impi",7,-1),new e("ejä",-1,-1),new e("mmä",-1,1),new e("immä",10,-1),new e("mpä",-1,1),new e("impä",12,-1)],h=[new e("i",-1,-1),new e("j",-1,-1)],p=[new e("mma",-1,1),new e("imma",0,-1)],g=[17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8],j=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],v=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],q=[17,97,24,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],C=new r;this.setCurrent=function(i){C.setCurrent(i)},this.getCurrent=function(){return C.getCurrent()},this.stem=function(){var e=C.cursor;return u=C.limit,a=u,i()||(u=C.cursor,i()||(a=C.cursor)),o=!1,C.limit_backward=e,C.cursor=C.limit,n(),C.cursor=C.limit,function(){var i,e,r;if(C.cursor>=u)if(e=C.limit_backward,C.limit_backward=u,C.ket=C.cursor,i=C.find_among_b(k,9))switch(C.bra=C.cursor,C.limit_backward=e,i){case 1:r=C.limit-C.cursor,C.eq_s_b(1,"k")||(C.cursor=C.limit-r,C.slice_del());break;case 2:C.slice_del(),C.ket=C.cursor,C.eq_s_b(3,"kse")&&(C.bra=C.cursor,C.slice_from("ksi"));break;case 3:C.slice_del();break;case 4:C.find_among_b(m,6)&&C.slice_del();break;case 5:C.find_among_b(w,6)&&C.slice_del();break;case 6:C.find_among_b(_,2)&&C.slice_del()}else C.limit_backward=e}(),C.cursor=C.limit,function(){var i,e,r;if(C.cursor>=u)if(e=C.limit_backward,C.limit_backward=u,C.ket=C.cursor,i=C.find_among_b(d,30)){switch(C.bra=C.cursor,C.limit_backward=e,i){case 1:if(!C.eq_s_b(1,"a"))return;break;case 2:case 9:if(!C.eq_s_b(1,"e"))return;break;case 3:if(!C.eq_s_b(1,"i"))return;break;case 4:if(!C.eq_s_b(1,"o"))return;break;case 5:if(!C.eq_s_b(1,"ä"))return;break;case 6:if(!C.eq_s_b(1,"ö"))return;break;case 7:if(r=C.limit-C.cursor,!t()&&(C.cursor=C.limit-r,!C.eq_s_b(2,"ie"))){C.cursor=C.limit-r;break}if(C.cursor=C.limit-r,C.cursor<=C.limit_backward){C.cursor=C.limit-r;break}C.cursor--,C.bra=C.cursor;break;case 8:if(!C.in_grouping_b(j,97,246)||!C.out_grouping_b(j,97,246))return}C.slice_del(),o=!0}else C.limit_backward=e}(),C.cursor=C.limit,function(){var i,e,r;if(C.cursor>=a)if(e=C.limit_backward,C.limit_backward=a,C.ket=C.cursor,i=C.find_among_b(f,14)){if(C.bra=C.cursor,C.limit_backward=e,1==i){if(r=C.limit-C.cursor,C.eq_s_b(2,"po"))return;C.cursor=C.limit-r}C.slice_del()}else C.limit_backward=e}(),C.cursor=C.limit,o?(!function(){var i;C.cursor>=u&&(i=C.limit_backward,C.limit_backward=u,C.ket=C.cursor,C.find_among_b(h,2)?(C.bra=C.cursor,C.limit_backward=i,C.slice_del()):C.limit_backward=i)}(),C.cursor=C.limit):(C.cursor=C.limit,function(){var i,e,r,n,t,s;if(C.cursor>=u){if(e=C.limit_backward,C.limit_backward=u,C.ket=C.cursor,C.eq_s_b(1,"t")&&(C.bra=C.cursor,r=C.limit-C.cursor,C.in_grouping_b(j,97,246)&&(C.cursor=C.limit-r,C.slice_del(),C.limit_backward=e,n=C.limit-C.cursor,C.cursor>=a&&(C.cursor=a,t=C.limit_backward,C.limit_backward=C.cursor,C.cursor=C.limit-n,C.ket=C.cursor,i=C.find_among_b(p,2))))){if(C.bra=C.cursor,C.limit_backward=t,1==i){if(s=C.limit-C.cursor,C.eq_s_b(2,"po"))return;C.cursor=C.limit-s}return void C.slice_del()}C.limit_backward=e}}(),C.cursor=C.limit),function(){var i,e,r,n;if(C.cursor>=u){for(i=C.limit_backward,C.limit_backward=u,e=C.limit-C.cursor,t()&&(C.cursor=C.limit-e,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del())),C.cursor=C.limit-e,C.ket=C.cursor,C.in_grouping_b(g,97,228)&&(C.bra=C.cursor,C.out_grouping_b(j,97,246)&&C.slice_del()),C.cursor=C.limit-e,C.ket=C.cursor,C.eq_s_b(1,"j")&&(C.bra=C.cursor,r=C.limit-C.cursor,C.eq_s_b(1,"o")?C.slice_del():(C.cursor=C.limit-r,C.eq_s_b(1,"u")&&C.slice_del())),C.cursor=C.limit-e,C.ket=C.cursor,C.eq_s_b(1,"o")&&(C.bra=C.cursor,C.eq_s_b(1,"j")&&C.slice_del()),C.cursor=C.limit-e,C.limit_backward=i;;){if(n=C.limit-C.cursor,C.out_grouping_b(j,97,246)){C.cursor=C.limit-n;break}if(C.cursor=C.limit-n,C.cursor<=C.limit_backward)return;C.cursor--}C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,l=C.slice_to(),C.eq_v_b(l)&&C.slice_del())}}(),!0}};return function(i){return"function"==typeof i.update?i.update(function(i){return n.setCurrent(i),n.stem(),n.getCurrent()}):(n.setCurrent(i),n.stem(),n.getCurrent())}}(),i.Pipeline.registerFunction(i.fi.stemmer,"stemmer-fi"),i.fi.stopWordFilter=i.generateStopWordFilter("ei eivät emme en et ette että he heidän heidät heihin heille heillä heiltä heissä heistä heitä hän häneen hänelle hänellä häneltä hänen hänessä hänestä hänet häntä itse ja johon joiden joihin joiksi joilla joille joilta joina joissa joista joita joka joksi jolla jolle jolta jona jonka jos jossa josta jota jotka kanssa keiden keihin keiksi keille keillä keiltä keinä keissä keistä keitä keneen keneksi kenelle kenellä keneltä kenen kenenä kenessä kenestä kenet ketkä ketkä ketä koska kuin kuka kun me meidän meidät meihin meille meillä meiltä meissä meistä meitä mihin miksi mikä mille millä miltä minkä minkä minua minulla minulle minulta minun minussa minusta minut minuun minä minä missä mistä mitkä mitä mukaan mutta ne niiden niihin niiksi niille niillä niiltä niin niin niinä niissä niistä niitä noiden noihin noiksi noilla noille noilta noin noina noissa noista noita nuo nyt näiden näihin näiksi näille näillä näiltä näinä näissä näistä näitä nämä ole olemme olen olet olette oli olimme olin olisi olisimme olisin olisit olisitte olisivat olit olitte olivat olla olleet ollut on ovat poikki se sekä sen siihen siinä siitä siksi sille sillä sillä siltä sinua sinulla sinulle sinulta sinun sinussa sinusta sinut sinuun sinä sinä sitä tai te teidän teidät teihin teille teillä teiltä teissä teistä teitä tuo tuohon tuoksi tuolla tuolle tuolta tuon tuona tuossa tuosta tuota tähän täksi tälle tällä tältä tämä tämän tänä tässä tästä tätä vaan vai vaikka yli".split(" ")),i.Pipeline.registerFunction(i.fi.stopWordFilter,"stopWordFilter-fi")}});
--------------------------------------------------------------------------------
/assets/javascripts/lunr/lunr.fr.js:
--------------------------------------------------------------------------------
1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.fr=function(){this.pipeline.reset(),this.pipeline.add(e.fr.trimmer,e.fr.stopWordFilter,e.fr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.fr.stemmer))},e.fr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.fr.trimmer=e.trimmerSupport.generateTrimmer(e.fr.wordCharacters),e.Pipeline.registerFunction(e.fr.trimmer,"trimmer-fr"),e.fr.stemmer=function(){var r=e.stemmerSupport.Among,s=e.stemmerSupport.SnowballProgram,i=new function(){function e(e,r,s){return!(!z.eq_s(1,e)||(z.ket=z.cursor,!z.in_grouping(v,97,251)))&&(z.slice_from(r),z.cursor=s,!0)}function i(e,r,s){return!!z.eq_s(1,e)&&(z.ket=z.cursor,z.slice_from(r),z.cursor=s,!0)}function n(){for(;!z.in_grouping(v,97,251);){if(z.cursor>=z.limit)return!0;z.cursor++}for(;!z.out_grouping(v,97,251);){if(z.cursor>=z.limit)return!0;z.cursor++}return!1}function t(){return w<=z.cursor}function u(){return l<=z.cursor}function o(){return a<=z.cursor}function c(){if(!function(){var e,r;if(z.ket=z.cursor,e=z.find_among_b(d,43)){switch(z.bra=z.cursor,e){case 1:if(!o())return!1;z.slice_del();break;case 2:if(!o())return!1;z.slice_del(),z.ket=z.cursor,z.eq_s_b(2,"ic")&&(z.bra=z.cursor,o()?z.slice_del():z.slice_from("iqU"));break;case 3:if(!o())return!1;z.slice_from("log");break;case 4:if(!o())return!1;z.slice_from("u");break;case 5:if(!o())return!1;z.slice_from("ent");break;case 6:if(!t())return!1;if(z.slice_del(),z.ket=z.cursor,e=z.find_among_b(_,6))switch(z.bra=z.cursor,e){case 1:o()&&(z.slice_del(),z.ket=z.cursor,z.eq_s_b(2,"at")&&(z.bra=z.cursor,o()&&z.slice_del()));break;case 2:o()?z.slice_del():u()&&z.slice_from("eux");break;case 3:o()&&z.slice_del();break;case 4:t()&&z.slice_from("i")}break;case 7:if(!o())return!1;if(z.slice_del(),z.ket=z.cursor,e=z.find_among_b(b,3))switch(z.bra=z.cursor,e){case 1:o()?z.slice_del():z.slice_from("abl");break;case 2:o()?z.slice_del():z.slice_from("iqU");break;case 3:o()&&z.slice_del()}break;case 8:if(!o())return!1;if(z.slice_del(),z.ket=z.cursor,z.eq_s_b(2,"at")&&(z.bra=z.cursor,o()&&(z.slice_del(),z.ket=z.cursor,z.eq_s_b(2,"ic")))){z.bra=z.cursor,o()?z.slice_del():z.slice_from("iqU");break}break;case 9:z.slice_from("eau");break;case 10:if(!u())return!1;z.slice_from("al");break;case 11:if(o())z.slice_del();else{if(!u())return!1;z.slice_from("eux")}break;case 12:if(!u()||!z.out_grouping_b(v,97,251))return!1;z.slice_del();break;case 13:return t()&&z.slice_from("ant"),!1;case 14:return t()&&z.slice_from("ent"),!1;case 15:return r=z.limit-z.cursor,z.in_grouping_b(v,97,251)&&t()&&(z.cursor=z.limit-r,z.slice_del()),!1}return!0}return!1}()&&(z.cursor=z.limit,!function(){var e,r;if(z.cursor=w){if(s=z.limit_backward,z.limit_backward=w,z.ket=z.cursor,e=z.find_among_b(g,7))switch(z.bra=z.cursor,e){case 1:if(o()){if(i=z.limit-z.cursor,!z.eq_s_b(1,"s")&&(z.cursor=z.limit-i,!z.eq_s_b(1,"t")))break;z.slice_del()}break;case 2:z.slice_from("i");break;case 3:z.slice_del();break;case 4:z.eq_s_b(2,"gu")&&z.slice_del()}z.limit_backward=s}}();z.cursor=z.limit,z.ket=z.cursor,z.eq_s_b(1,"Y")?(z.bra=z.cursor,z.slice_from("i")):(z.cursor=z.limit,z.eq_s_b(1,"ç")&&(z.bra=z.cursor,z.slice_from("c")))}var a,l,w,f=[new r("col",-1,-1),new r("par",-1,-1),new r("tap",-1,-1)],m=[new r("",-1,4),new r("I",0,1),new r("U",0,2),new r("Y",0,3)],_=[new r("iqU",-1,3),new r("abl",-1,3),new r("Ièr",-1,4),new r("ièr",-1,4),new r("eus",-1,2),new r("iv",-1,1)],b=[new r("ic",-1,2),new r("abil",-1,1),new r("iv",-1,3)],d=[new r("iqUe",-1,1),new r("atrice",-1,2),new r("ance",-1,1),new r("ence",-1,5),new r("logie",-1,3),new r("able",-1,1),new r("isme",-1,1),new r("euse",-1,11),new r("iste",-1,1),new r("ive",-1,8),new r("if",-1,8),new r("usion",-1,4),new r("ation",-1,2),new r("ution",-1,4),new r("ateur",-1,2),new r("iqUes",-1,1),new r("atrices",-1,2),new r("ances",-1,1),new r("ences",-1,5),new r("logies",-1,3),new r("ables",-1,1),new r("ismes",-1,1),new r("euses",-1,11),new r("istes",-1,1),new r("ives",-1,8),new r("ifs",-1,8),new r("usions",-1,4),new r("ations",-1,2),new r("utions",-1,4),new r("ateurs",-1,2),new r("ments",-1,15),new r("ements",30,6),new r("issements",31,12),new r("ités",-1,7),new r("ment",-1,15),new r("ement",34,6),new r("issement",35,12),new r("amment",34,13),new r("emment",34,14),new r("aux",-1,10),new r("eaux",39,9),new r("eux",-1,1),new r("ité",-1,7)],k=[new r("ira",-1,1),new r("ie",-1,1),new r("isse",-1,1),new r("issante",-1,1),new r("i",-1,1),new r("irai",4,1),new r("ir",-1,1),new r("iras",-1,1),new r("ies",-1,1),new r("îmes",-1,1),new r("isses",-1,1),new r("issantes",-1,1),new r("îtes",-1,1),new r("is",-1,1),new r("irais",13,1),new r("issais",13,1),new r("irions",-1,1),new r("issions",-1,1),new r("irons",-1,1),new r("issons",-1,1),new r("issants",-1,1),new r("it",-1,1),new r("irait",21,1),new r("issait",21,1),new r("issant",-1,1),new r("iraIent",-1,1),new r("issaIent",-1,1),new r("irent",-1,1),new r("issent",-1,1),new r("iront",-1,1),new r("ît",-1,1),new r("iriez",-1,1),new r("issiez",-1,1),new r("irez",-1,1),new r("issez",-1,1)],p=[new r("a",-1,3),new r("era",0,2),new r("asse",-1,3),new r("ante",-1,3),new r("ée",-1,2),new r("ai",-1,3),new r("erai",5,2),new r("er",-1,2),new r("as",-1,3),new r("eras",8,2),new r("âmes",-1,3),new r("asses",-1,3),new r("antes",-1,3),new r("âtes",-1,3),new r("ées",-1,2),new r("ais",-1,3),new r("erais",15,2),new r("ions",-1,1),new r("erions",17,2),new r("assions",17,3),new r("erons",-1,2),new r("ants",-1,3),new r("és",-1,2),new r("ait",-1,3),new r("erait",23,2),new r("ant",-1,3),new r("aIent",-1,3),new r("eraIent",26,2),new r("èrent",-1,2),new r("assent",-1,3),new r("eront",-1,2),new r("ât",-1,3),new r("ez",-1,2),new r("iez",32,2),new r("eriez",33,2),new r("assiez",33,3),new r("erez",32,2),new r("é",-1,2)],g=[new r("e",-1,3),new r("Ière",0,2),new r("ière",0,2),new r("ion",-1,1),new r("Ier",-1,2),new r("ier",-1,2),new r("ë",-1,4)],q=[new r("ell",-1,-1),new r("eill",-1,-1),new r("enn",-1,-1),new r("onn",-1,-1),new r("ett",-1,-1)],v=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,128,130,103,8,5],h=[1,65,20,0,0,0,0,0,0,0,0,0,0,0,0,0,128],z=new s;this.setCurrent=function(e){z.setCurrent(e)},this.getCurrent=function(){return z.getCurrent()},this.stem=function(){var r=z.cursor;return function(){for(var r,s;;){if(r=z.cursor,z.in_grouping(v,97,251)){if(z.bra=z.cursor,s=z.cursor,e("u","U",r))continue;if(z.cursor=s,e("i","I",r))continue;if(z.cursor=s,i("y","Y",r))continue}if(z.cursor=r,z.bra=r,!e("y","Y",r)){if(z.cursor=r,z.eq_s(1,"q")&&(z.bra=z.cursor,i("u","U",r)))continue;if(z.cursor=r,r>=z.limit)return;z.cursor++}}}(),z.cursor=r,function(){var e=z.cursor;if(w=z.limit,l=w,a=w,z.in_grouping(v,97,251)&&z.in_grouping(v,97,251)&&z.cursor=z.limit){z.cursor=w;break}z.cursor++}while(!z.in_grouping(v,97,251))}w=z.cursor,z.cursor=e,n()||(l=z.cursor,n()||(a=z.cursor))}(),z.limit_backward=r,z.cursor=z.limit,c(),z.cursor=z.limit,function(){var e=z.limit-z.cursor;z.find_among_b(q,5)&&(z.cursor=z.limit-e,z.ket=z.cursor,z.cursor>z.limit_backward&&(z.cursor--,z.bra=z.cursor,z.slice_del()))}(),z.cursor=z.limit,function(){for(var e,r=1;z.out_grouping_b(v,97,251);)r--;if(r<=0){if(z.ket=z.cursor,e=z.limit-z.cursor,!z.eq_s_b(1,"é")&&(z.cursor=z.limit-e,!z.eq_s_b(1,"è")))return;z.bra=z.cursor,z.slice_from("e")}}(),z.cursor=z.limit_backward,function(){for(var e,r;r=z.cursor,z.bra=r,e=z.find_among(m,4);)switch(z.ket=z.cursor,e){case 1:z.slice_from("i");break;case 2:z.slice_from("u");break;case 3:z.slice_from("y");break;case 4:if(z.cursor>=z.limit)return;z.cursor++}}(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.fr.stemmer,"stemmer-fr"),e.fr.stopWordFilter=e.generateStopWordFilter("ai aie aient aies ait as au aura aurai auraient aurais aurait auras aurez auriez aurions aurons auront aux avaient avais avait avec avez aviez avions avons ayant ayez ayons c ce ceci celà ces cet cette d dans de des du elle en es est et eu eue eues eurent eus eusse eussent eusses eussiez eussions eut eux eûmes eût eûtes furent fus fusse fussent fusses fussiez fussions fut fûmes fût fûtes ici il ils j je l la le les leur leurs lui m ma mais me mes moi mon même n ne nos notre nous on ont ou par pas pour qu que quel quelle quelles quels qui s sa sans se sera serai seraient serais serait seras serez seriez serions serons seront ses soi soient sois soit sommes son sont soyez soyons suis sur t ta te tes toi ton tu un une vos votre vous y à étaient étais était étant étiez étions été étée étées étés êtes".split(" ")),e.Pipeline.registerFunction(e.fr.stopWordFilter,"stopWordFilter-fr")}});
--------------------------------------------------------------------------------
/assets/javascripts/lunr/lunr.hu.js:
--------------------------------------------------------------------------------
1 | !function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hu=function(){this.pipeline.reset(),this.pipeline.add(e.hu.trimmer,e.hu.stopWordFilter,e.hu.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hu.stemmer))},e.hu.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.hu.trimmer=e.trimmerSupport.generateTrimmer(e.hu.wordCharacters),e.Pipeline.registerFunction(e.hu.trimmer,"trimmer-hu"),e.hu.stemmer=function(){var n=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,i=new function(){function e(){return s<=_.cursor}function i(){var e=_.limit-_.cursor;return!!_.find_among_b(w,23)&&(_.cursor=_.limit-e,!0)}function a(){if(_.cursor>_.limit_backward){_.cursor--,_.ket=_.cursor;var e=_.cursor-1;_.limit_backward<=e&&e<=_.limit&&(_.cursor=e,_.bra=e,_.slice_del())}}function t(){_.ket=_.cursor,_.find_among_b(u,44)&&(_.bra=_.cursor,e()&&(_.slice_del(),function(){var n;if(_.ket=_.cursor,(n=_.find_among_b(o,2))&&(_.bra=_.cursor,e()))switch(n){case 1:_.slice_from("a");break;case 2:_.slice_from("e")}}()))}var s,c=[new n("cs",-1,-1),new n("dzs",-1,-1),new n("gy",-1,-1),new n("ly",-1,-1),new n("ny",-1,-1),new n("sz",-1,-1),new n("ty",-1,-1),new n("zs",-1,-1)],o=[new n("á",-1,1),new n("é",-1,2)],w=[new n("bb",-1,-1),new n("cc",-1,-1),new n("dd",-1,-1),new n("ff",-1,-1),new n("gg",-1,-1),new n("jj",-1,-1),new n("kk",-1,-1),new n("ll",-1,-1),new n("mm",-1,-1),new n("nn",-1,-1),new n("pp",-1,-1),new n("rr",-1,-1),new n("ccs",-1,-1),new n("ss",-1,-1),new n("zzs",-1,-1),new n("tt",-1,-1),new n("vv",-1,-1),new n("ggy",-1,-1),new n("lly",-1,-1),new n("nny",-1,-1),new n("tty",-1,-1),new n("ssz",-1,-1),new n("zz",-1,-1)],l=[new n("al",-1,1),new n("el",-1,2)],u=[new n("ba",-1,-1),new n("ra",-1,-1),new n("be",-1,-1),new n("re",-1,-1),new n("ig",-1,-1),new n("nak",-1,-1),new n("nek",-1,-1),new n("val",-1,-1),new n("vel",-1,-1),new n("ul",-1,-1),new n("nál",-1,-1),new n("nél",-1,-1),new n("ból",-1,-1),new n("ról",-1,-1),new n("tól",-1,-1),new n("bõl",-1,-1),new n("rõl",-1,-1),new n("tõl",-1,-1),new n("ül",-1,-1),new n("n",-1,-1),new n("an",19,-1),new n("ban",20,-1),new n("en",19,-1),new n("ben",22,-1),new n("képpen",22,-1),new n("on",19,-1),new n("ön",19,-1),new n("képp",-1,-1),new n("kor",-1,-1),new n("t",-1,-1),new n("at",29,-1),new n("et",29,-1),new n("ként",29,-1),new n("anként",32,-1),new n("enként",32,-1),new n("onként",32,-1),new n("ot",29,-1),new n("ért",29,-1),new n("öt",29,-1),new n("hez",-1,-1),new n("hoz",-1,-1),new n("höz",-1,-1),new n("vá",-1,-1),new n("vé",-1,-1)],m=[new n("án",-1,2),new n("én",-1,1),new n("ánként",-1,3)],k=[new n("stul",-1,2),new n("astul",0,1),new n("ástul",0,3),new n("stül",-1,2),new n("estül",3,1),new n("éstül",3,4)],f=[new n("á",-1,1),new n("é",-1,2)],b=[new n("k",-1,7),new n("ak",0,4),new n("ek",0,6),new n("ok",0,5),new n("ák",0,1),new n("ék",0,2),new n("ök",0,3)],d=[new n("éi",-1,7),new n("áéi",0,6),new n("ééi",0,5),new n("é",-1,9),new n("ké",3,4),new n("aké",4,1),new n("eké",4,1),new n("oké",4,1),new n("áké",4,3),new n("éké",4,2),new n("öké",4,1),new n("éé",3,8)],g=[new n("a",-1,18),new n("ja",0,17),new n("d",-1,16),new n("ad",2,13),new n("ed",2,13),new n("od",2,13),new n("ád",2,14),new n("éd",2,15),new n("öd",2,13),new n("e",-1,18),new n("je",9,17),new n("nk",-1,4),new n("unk",11,1),new n("ánk",11,2),new n("énk",11,3),new n("ünk",11,1),new n("uk",-1,8),new n("juk",16,7),new n("ájuk",17,5),new n("ük",-1,8),new n("jük",19,7),new n("éjük",20,6),new n("m",-1,12),new n("am",22,9),new n("em",22,9),new n("om",22,9),new n("ám",22,10),new n("ém",22,11),new n("o",-1,18),new n("á",-1,19),new n("é",-1,20)],h=[new n("id",-1,10),new n("aid",0,9),new n("jaid",1,6),new n("eid",0,9),new n("jeid",3,6),new n("áid",0,7),new n("éid",0,8),new n("i",-1,15),new n("ai",7,14),new n("jai",8,11),new n("ei",7,14),new n("jei",10,11),new n("ái",7,12),new n("éi",7,13),new n("itek",-1,24),new n("eitek",14,21),new n("jeitek",15,20),new n("éitek",14,23),new n("ik",-1,29),new n("aik",18,26),new n("jaik",19,25),new n("eik",18,26),new n("jeik",21,25),new n("áik",18,27),new n("éik",18,28),new n("ink",-1,20),new n("aink",25,17),new n("jaink",26,16),new n("eink",25,17),new n("jeink",28,16),new n("áink",25,18),new n("éink",25,19),new n("aitok",-1,21),new n("jaitok",32,20),new n("áitok",-1,22),new n("im",-1,5),new n("aim",35,4),new n("jaim",36,1),new n("eim",35,4),new n("jeim",38,1),new n("áim",35,2),new n("éim",35,3)],p=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,52,14],_=new r;this.setCurrent=function(e){_.setCurrent(e)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){var n=_.cursor;return function(){var e,n=_.cursor;if(s=_.limit,_.in_grouping(p,97,252))for(;;){if(e=_.cursor,_.out_grouping(p,97,252))return _.cursor=e,_.find_among(c,8)||(_.cursor=e,e<_.limit&&_.cursor++),void(s=_.cursor);if(_.cursor=e,e>=_.limit)return void(s=e);_.cursor++}if(_.cursor=n,_.out_grouping(p,97,252)){for(;!_.in_grouping(p,97,252);){if(_.cursor>=_.limit)return;_.cursor++}s=_.cursor}}(),_.limit_backward=n,_.cursor=_.limit,function(){var n;if(_.ket=_.cursor,(n=_.find_among_b(l,2))&&(_.bra=_.cursor,e())){if((1==n||2==n)&&!i())return;_.slice_del(),a()}}(),_.cursor=_.limit,t(),_.cursor=_.limit,function(){var n;if(_.ket=_.cursor,(n=_.find_among_b(m,3))&&(_.bra=_.cursor,e()))switch(n){case 1:_.slice_from("e");break;case 2:case 3:_.slice_from("a")}}(),_.cursor=_.limit,function(){var n;if(_.ket=_.cursor,(n=_.find_among_b(k,6))&&(_.bra=_.cursor,e()))switch(n){case 1:case 2:_.slice_del();break;case 3:_.slice_from("a");break;case 4:_.slice_from("e")}}(),_.cursor=_.limit,function(){var n;if(_.ket=_.cursor,(n=_.find_among_b(f,2))&&(_.bra=_.cursor,e())){if((1==n||2==n)&&!i())return;_.slice_del(),a()}}(),_.cursor=_.limit,function(){var n;if(_.ket=_.cursor,(n=_.find_among_b(d,12))&&(_.bra=_.cursor,e()))switch(n){case 1:case 4:case 7:case 9:_.slice_del();break;case 2:case 5:case 8:_.slice_from("e");break;case 3:case 6:_.slice_from("a")}}(),_.cursor=_.limit,function(){var n;if(_.ket=_.cursor,(n=_.find_among_b(g,31))&&(_.bra=_.cursor,e()))switch(n){case 1:case 4:case 7:case 8:case 9:case 12:case 13:case 16:case 17:case 18:_.slice_del();break;case 2:case 5:case 10:case 14:case 19:_.slice_from("a");break;case 3:case 6:case 11:case 15:case 20:_.slice_from("e")}}(),_.cursor=_.limit,function(){var n;if(_.ket=_.cursor,(n=_.find_among_b(h,42))&&(_.bra=_.cursor,e()))switch(n){case 1:case 4:case 5:case 6:case 9:case 10:case 11:case 14:case 15:case 16:case 17:case 20:case 21:case 24:case 25:case 26:case 29:_.slice_del();break;case 2:case 7:case 12:case 18:case 22:case 27:_.slice_from("a");break;case 3:case 8:case 13:case 19:case 23:case 28:_.slice_from("e")}}(),_.cursor=_.limit,function(){var n;if(_.ket=_.cursor,(n=_.find_among_b(b,7))&&(_.bra=_.cursor,e()))switch(n){case 1:_.slice_from("a");break;case 2:_.slice_from("e");break;case 3:case 4:case 5:case 6:case 7:_.slice_del()}}(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.hu.stemmer,"stemmer-hu"),e.hu.stopWordFilter=e.generateStopWordFilter("a abban ahhoz ahogy ahol aki akik akkor alatt amely amelyek amelyekben amelyeket amelyet amelynek ami amikor amit amolyan amíg annak arra arról az azok azon azonban azt aztán azután azzal azért be belül benne bár cikk cikkek cikkeket csak de e ebben eddig egy egyes egyetlen egyik egyre egyéb egész ehhez ekkor el ellen elsõ elég elõ elõször elõtt emilyen ennek erre ez ezek ezen ezt ezzel ezért fel felé hanem hiszen hogy hogyan igen ill ill. illetve ilyen ilyenkor ismét ison itt jobban jó jól kell kellett keressünk keresztül ki kívül között közül legalább legyen lehet lehetett lenne lenni lesz lett maga magát majd majd meg mellett mely melyek mert mi mikor milyen minden mindenki mindent mindig mint mintha mit mivel miért most már más másik még míg nagy nagyobb nagyon ne nekem neki nem nincs néha néhány nélkül olyan ott pedig persze rá s saját sem semmi sok sokat sokkal szemben szerint szinte számára talán tehát teljes tovább továbbá több ugyanis utolsó után utána vagy vagyis vagyok valaki valami valamint való van vannak vele vissza viszont volna volt voltak voltam voltunk által általában át én éppen és így õ õk õket össze úgy új újabb újra".split(" ")),e.Pipeline.registerFunction(e.hu.stopWordFilter,"stopWordFilter-hu")}});
--------------------------------------------------------------------------------
/assets/javascripts/lunr/lunr.it.js:
--------------------------------------------------------------------------------
1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.it=function(){this.pipeline.reset(),this.pipeline.add(e.it.trimmer,e.it.stopWordFilter,e.it.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.it.stemmer))},e.it.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.it.trimmer=e.trimmerSupport.generateTrimmer(e.it.wordCharacters),e.Pipeline.registerFunction(e.it.trimmer,"trimmer-it"),e.it.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(e,r,n){return!(!z.eq_s(1,e)||(z.ket=z.cursor,!z.in_grouping(h,97,249)))&&(z.slice_from(r),z.cursor=n,!0)}function i(e){if(z.cursor=e,!z.in_grouping(h,97,249))return!1;for(;!z.out_grouping(h,97,249);){if(z.cursor>=z.limit)return!1;z.cursor++}return!0}function o(){var e,r=z.cursor;if(!function(){if(z.in_grouping(h,97,249)){var e=z.cursor;if(z.out_grouping(h,97,249)){for(;!z.in_grouping(h,97,249);){if(z.cursor>=z.limit)return i(e);z.cursor++}return!0}return i(e)}return!1}()){if(z.cursor=r,!z.out_grouping(h,97,249))return;if(e=z.cursor,z.out_grouping(h,97,249)){for(;!z.in_grouping(h,97,249);){if(z.cursor>=z.limit)return z.cursor=e,void(z.in_grouping(h,97,249)&&z.cursor=z.limit)return;z.cursor++}m=z.cursor}function t(){for(;!z.in_grouping(h,97,249);){if(z.cursor>=z.limit)return!1;z.cursor++}for(;!z.out_grouping(h,97,249);){if(z.cursor>=z.limit)return!1;z.cursor++}return!0}function s(){return m<=z.cursor}function a(){return w<=z.cursor}function u(){var e;if(z.ket=z.cursor,!(e=z.find_among_b(p,51)))return!1;switch(z.bra=z.cursor,e){case 1:if(!a())return!1;z.slice_del();break;case 2:if(!a())return!1;z.slice_del(),z.ket=z.cursor,z.eq_s_b(2,"ic")&&(z.bra=z.cursor,a()&&z.slice_del());break;case 3:if(!a())return!1;z.slice_from("log");break;case 4:if(!a())return!1;z.slice_from("u");break;case 5:if(!a())return!1;z.slice_from("ente");break;case 6:if(!s())return!1;z.slice_del();break;case 7:if(!(l<=z.cursor))return!1;z.slice_del(),z.ket=z.cursor,(e=z.find_among_b(_,4))&&(z.bra=z.cursor,a()&&(z.slice_del(),1==e&&(z.ket=z.cursor,z.eq_s_b(2,"at")&&(z.bra=z.cursor,a()&&z.slice_del()))));break;case 8:if(!a())return!1;z.slice_del(),z.ket=z.cursor,(e=z.find_among_b(g,3))&&(z.bra=z.cursor,1==e&&a()&&z.slice_del());break;case 9:if(!a())return!1;z.slice_del(),z.ket=z.cursor,z.eq_s_b(2,"at")&&(z.bra=z.cursor,a()&&(z.slice_del(),z.ket=z.cursor,z.eq_s_b(2,"ic")&&(z.bra=z.cursor,a()&&z.slice_del())))}return!0}function c(){!function(){var e=z.limit-z.cursor;z.ket=z.cursor,z.in_grouping_b(q,97,242)&&(z.bra=z.cursor,s()&&(z.slice_del(),z.ket=z.cursor,z.eq_s_b(1,"i")&&(z.bra=z.cursor,s())))?z.slice_del():z.cursor=z.limit-e}(),z.ket=z.cursor,z.eq_s_b(1,"h")&&(z.bra=z.cursor,z.in_grouping_b(C,99,103)&&s()&&z.slice_del())}var w,l,m,f=[new r("",-1,7),new r("qu",0,6),new r("á",0,1),new r("é",0,2),new r("í",0,3),new r("ó",0,4),new r("ú",0,5)],v=[new r("",-1,3),new r("I",0,1),new r("U",0,2)],b=[new r("la",-1,-1),new r("cela",0,-1),new r("gliela",0,-1),new r("mela",0,-1),new r("tela",0,-1),new r("vela",0,-1),new r("le",-1,-1),new r("cele",6,-1),new r("gliele",6,-1),new r("mele",6,-1),new r("tele",6,-1),new r("vele",6,-1),new r("ne",-1,-1),new r("cene",12,-1),new r("gliene",12,-1),new r("mene",12,-1),new r("sene",12,-1),new r("tene",12,-1),new r("vene",12,-1),new r("ci",-1,-1),new r("li",-1,-1),new r("celi",20,-1),new r("glieli",20,-1),new r("meli",20,-1),new r("teli",20,-1),new r("veli",20,-1),new r("gli",20,-1),new r("mi",-1,-1),new r("si",-1,-1),new r("ti",-1,-1),new r("vi",-1,-1),new r("lo",-1,-1),new r("celo",31,-1),new r("glielo",31,-1),new r("melo",31,-1),new r("telo",31,-1),new r("velo",31,-1)],d=[new r("ando",-1,1),new r("endo",-1,1),new r("ar",-1,2),new r("er",-1,2),new r("ir",-1,2)],_=[new r("ic",-1,-1),new r("abil",-1,-1),new r("os",-1,-1),new r("iv",-1,1)],g=[new r("ic",-1,1),new r("abil",-1,1),new r("iv",-1,1)],p=[new r("ica",-1,1),new r("logia",-1,3),new r("osa",-1,1),new r("ista",-1,1),new r("iva",-1,9),new r("anza",-1,1),new r("enza",-1,5),new r("ice",-1,1),new r("atrice",7,1),new r("iche",-1,1),new r("logie",-1,3),new r("abile",-1,1),new r("ibile",-1,1),new r("usione",-1,4),new r("azione",-1,2),new r("uzione",-1,4),new r("atore",-1,2),new r("ose",-1,1),new r("ante",-1,1),new r("mente",-1,1),new r("amente",19,7),new r("iste",-1,1),new r("ive",-1,9),new r("anze",-1,1),new r("enze",-1,5),new r("ici",-1,1),new r("atrici",25,1),new r("ichi",-1,1),new r("abili",-1,1),new r("ibili",-1,1),new r("ismi",-1,1),new r("usioni",-1,4),new r("azioni",-1,2),new r("uzioni",-1,4),new r("atori",-1,2),new r("osi",-1,1),new r("anti",-1,1),new r("amenti",-1,6),new r("imenti",-1,6),new r("isti",-1,1),new r("ivi",-1,9),new r("ico",-1,1),new r("ismo",-1,1),new r("oso",-1,1),new r("amento",-1,6),new r("imento",-1,6),new r("ivo",-1,9),new r("ità",-1,8),new r("istà",-1,1),new r("istè",-1,1),new r("istì",-1,1)],k=[new r("isca",-1,1),new r("enda",-1,1),new r("ata",-1,1),new r("ita",-1,1),new r("uta",-1,1),new r("ava",-1,1),new r("eva",-1,1),new r("iva",-1,1),new r("erebbe",-1,1),new r("irebbe",-1,1),new r("isce",-1,1),new r("ende",-1,1),new r("are",-1,1),new r("ere",-1,1),new r("ire",-1,1),new r("asse",-1,1),new r("ate",-1,1),new r("avate",16,1),new r("evate",16,1),new r("ivate",16,1),new r("ete",-1,1),new r("erete",20,1),new r("irete",20,1),new r("ite",-1,1),new r("ereste",-1,1),new r("ireste",-1,1),new r("ute",-1,1),new r("erai",-1,1),new r("irai",-1,1),new r("isci",-1,1),new r("endi",-1,1),new r("erei",-1,1),new r("irei",-1,1),new r("assi",-1,1),new r("ati",-1,1),new r("iti",-1,1),new r("eresti",-1,1),new r("iresti",-1,1),new r("uti",-1,1),new r("avi",-1,1),new r("evi",-1,1),new r("ivi",-1,1),new r("isco",-1,1),new r("ando",-1,1),new r("endo",-1,1),new r("Yamo",-1,1),new r("iamo",-1,1),new r("avamo",-1,1),new r("evamo",-1,1),new r("ivamo",-1,1),new r("eremo",-1,1),new r("iremo",-1,1),new r("assimo",-1,1),new r("ammo",-1,1),new r("emmo",-1,1),new r("eremmo",54,1),new r("iremmo",54,1),new r("immo",-1,1),new r("ano",-1,1),new r("iscano",58,1),new r("avano",58,1),new r("evano",58,1),new r("ivano",58,1),new r("eranno",-1,1),new r("iranno",-1,1),new r("ono",-1,1),new r("iscono",65,1),new r("arono",65,1),new r("erono",65,1),new r("irono",65,1),new r("erebbero",-1,1),new r("irebbero",-1,1),new r("assero",-1,1),new r("essero",-1,1),new r("issero",-1,1),new r("ato",-1,1),new r("ito",-1,1),new r("uto",-1,1),new r("avo",-1,1),new r("evo",-1,1),new r("ivo",-1,1),new r("ar",-1,1),new r("ir",-1,1),new r("erà",-1,1),new r("irà",-1,1),new r("erò",-1,1),new r("irò",-1,1)],h=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2,1],q=[17,65,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2],C=[17],z=new n;this.setCurrent=function(e){z.setCurrent(e)},this.getCurrent=function(){return z.getCurrent()},this.stem=function(){var r=z.cursor;return function(){for(var r,n,i,o,t=z.cursor;;){if(z.bra=z.cursor,r=z.find_among(f,7))switch(z.ket=z.cursor,r){case 1:z.slice_from("à");continue;case 2:z.slice_from("è");continue;case 3:z.slice_from("ì");continue;case 4:z.slice_from("ò");continue;case 5:z.slice_from("ù");continue;case 6:z.slice_from("qU");continue;case 7:if(z.cursor>=z.limit)break;z.cursor++;continue}break}for(z.cursor=t;;)for(n=z.cursor;;){if(i=z.cursor,z.in_grouping(h,97,249)){if(z.bra=z.cursor,o=z.cursor,e("u","U",i))break;if(z.cursor=o,e("i","I",i))break}if(z.cursor=i,z.cursor>=z.limit)return void(z.cursor=n);z.cursor++}}(),z.cursor=r,function(){var e=z.cursor;m=z.limit,l=m,w=m,o(),z.cursor=e,t()&&(l=z.cursor,t()&&(w=z.cursor))}(),z.limit_backward=r,z.cursor=z.limit,function(){var e;if(z.ket=z.cursor,z.find_among_b(b,37)&&(z.bra=z.cursor,(e=z.find_among_b(d,5))&&s()))switch(e){case 1:z.slice_del();break;case 2:z.slice_from("e")}}(),z.cursor=z.limit,u()||(z.cursor=z.limit,function(){var e,r;z.cursor>=m&&(r=z.limit_backward,z.limit_backward=m,z.ket=z.cursor,(e=z.find_among_b(k,87))&&(z.bra=z.cursor,1==e&&z.slice_del()),z.limit_backward=r)}()),z.cursor=z.limit,c(),z.cursor=z.limit_backward,function(){for(var e;z.bra=z.cursor,e=z.find_among(v,3);)switch(z.ket=z.cursor,e){case 1:z.slice_from("i");break;case 2:z.slice_from("u");break;case 3:if(z.cursor>=z.limit)return;z.cursor++}}(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.it.stemmer,"stemmer-it"),e.it.stopWordFilter=e.generateStopWordFilter("a abbia abbiamo abbiano abbiate ad agl agli ai al all alla alle allo anche avemmo avendo avesse avessero avessi avessimo aveste avesti avete aveva avevamo avevano avevate avevi avevo avrai avranno avrebbe avrebbero avrei avremmo avremo avreste avresti avrete avrà avrò avuta avute avuti avuto c che chi ci coi col come con contro cui da dagl dagli dai dal dall dalla dalle dallo degl degli dei del dell della delle dello di dov dove e ebbe ebbero ebbi ed era erano eravamo eravate eri ero essendo faccia facciamo facciano facciate faccio facemmo facendo facesse facessero facessi facessimo faceste facesti faceva facevamo facevano facevate facevi facevo fai fanno farai faranno farebbe farebbero farei faremmo faremo fareste faresti farete farà farò fece fecero feci fosse fossero fossi fossimo foste fosti fu fui fummo furono gli ha hai hanno ho i il in io l la le lei li lo loro lui ma mi mia mie miei mio ne negl negli nei nel nell nella nelle nello noi non nostra nostre nostri nostro o per perché più quale quanta quante quanti quanto quella quelle quelli quello questa queste questi questo sarai saranno sarebbe sarebbero sarei saremmo saremo sareste saresti sarete sarà sarò se sei si sia siamo siano siate siete sono sta stai stando stanno starai staranno starebbe starebbero starei staremmo staremo stareste staresti starete starà starò stava stavamo stavano stavate stavi stavo stemmo stesse stessero stessi stessimo steste stesti stette stettero stetti stia stiamo stiano stiate sto su sua sue sugl sugli sui sul sull sulla sulle sullo suo suoi ti tra tu tua tue tuo tuoi tutti tutto un una uno vi voi vostra vostre vostri vostro è".split(" ")),e.Pipeline.registerFunction(e.it.stopWordFilter,"stopWordFilter-it")}});
--------------------------------------------------------------------------------
/assets/javascripts/lunr/lunr.jp.js:
--------------------------------------------------------------------------------
1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.jp=function(){this.pipeline.reset(),this.pipeline.add(e.jp.stopWordFilter,e.jp.stemmer),r?this.tokenizer=e.jp.tokenizer:(e.tokenizer&&(e.tokenizer=e.jp.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.jp.tokenizer))};var t=new e.TinySegmenter;e.jp.tokenizer=function(n){if(!arguments.length||null==n||void 0==n)return[];if(Array.isArray(n))return n.map(function(t){return r?new e.Token(t.toLowerCase()):t.toLowerCase()});for(var i=n.toString().toLowerCase().replace(/^\s+/,""),o=i.length-1;o>=0;o--)if(/\S/.test(i.charAt(o))){i=i.substring(0,o+1);break}return t.segment(i).filter(function(e){return!!e}).map(function(t){return r?new e.Token(t):t})},e.jp.stemmer=function(e){return e},e.Pipeline.registerFunction(e.jp.stemmer,"stemmer-jp"),e.jp.wordCharacters="一二三四五六七八九十百千万億兆一-龠々〆ヵヶぁ-んァ-ヴーア-ン゙a-zA-Za-zA-Z0-90-9",e.jp.stopWordFilter=function(t){if(-1===e.jp.stopWordFilter.stopWords.indexOf(r?t.toString():t))return t},e.jp.stopWordFilter=e.generateStopWordFilter("これ それ あれ この その あの ここ そこ あそこ こちら どこ だれ なに なん 何 私 貴方 貴方方 我々 私達 あの人 あのかた 彼女 彼 です あります おります います は が の に を で え から まで より も どの と し それで しかし".split(" ")),e.Pipeline.registerFunction(e.jp.stopWordFilter,"stopWordFilter-jp")}});
--------------------------------------------------------------------------------
/assets/javascripts/lunr/lunr.multi.js:
--------------------------------------------------------------------------------
1 | !function(e,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(e.lunr)}(this,function(){return function(e){e.multiLanguage=function(){for(var i=Array.prototype.slice.call(arguments),t=i.join("-"),r="",n=[],s=[],p=0;p=u.limit)return;u.cursor=r+1}for(;!u.out_grouping(a,97,248);){if(u.cursor>=u.limit)return;u.cursor++}(i=u.cursor)=i&&(r=u.limit_backward,u.limit_backward=i,u.ket=u.cursor,e=u.find_among_b(t,29),u.limit_backward=r,e))switch(u.bra=u.cursor,e){case 1:u.slice_del();break;case 2:n=u.limit-u.cursor,u.in_grouping_b(m,98,122)?u.slice_del():(u.cursor=u.limit-n,u.eq_s_b(1,"k")&&u.out_grouping_b(a,97,248)&&u.slice_del());break;case 3:u.slice_from("er")}}(),u.cursor=u.limit,function(){var e,r=u.limit-u.cursor;u.cursor>=i&&(e=u.limit_backward,u.limit_backward=i,u.ket=u.cursor,u.find_among_b(o,2)?(u.bra=u.cursor,u.limit_backward=e,u.cursor=u.limit-r,u.cursor>u.limit_backward&&(u.cursor--,u.bra=u.cursor,u.slice_del())):u.limit_backward=e)}(),u.cursor=u.limit,function(){var e,r;u.cursor>=i&&(r=u.limit_backward,u.limit_backward=i,u.ket=u.cursor,(e=u.find_among_b(s,11))?(u.bra=u.cursor,u.limit_backward=r,1==e&&u.slice_del()):u.limit_backward=r)}(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}});
--------------------------------------------------------------------------------
/assets/javascripts/lunr/lunr.pt.js:
--------------------------------------------------------------------------------
1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.pt=function(){this.pipeline.reset(),this.pipeline.add(e.pt.trimmer,e.pt.stopWordFilter,e.pt.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.pt.stemmer))},e.pt.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.pt.trimmer=e.trimmerSupport.generateTrimmer(e.pt.wordCharacters),e.Pipeline.registerFunction(e.pt.trimmer,"trimmer-pt"),e.pt.stemmer=function(){var r=e.stemmerSupport.Among,s=e.stemmerSupport.SnowballProgram,n=new function(){function e(){if(j.out_grouping(q,97,250)){for(;!j.in_grouping(q,97,250);){if(j.cursor>=j.limit)return!0;j.cursor++}return!1}return!0}function n(){var r,s,n=j.cursor;if(j.in_grouping(q,97,250))if(r=j.cursor,e()){if(j.cursor=r,function(){if(j.in_grouping(q,97,250))for(;!j.out_grouping(q,97,250);){if(j.cursor>=j.limit)return!1;j.cursor++}return l=j.cursor,!0}())return}else l=j.cursor;if(j.cursor=n,j.out_grouping(q,97,250)){if(s=j.cursor,e()){if(j.cursor=s,!j.in_grouping(q,97,250)||j.cursor>=j.limit)return;j.cursor++}l=j.cursor}}function i(){for(;!j.in_grouping(q,97,250);){if(j.cursor>=j.limit)return!1;j.cursor++}for(;!j.out_grouping(q,97,250);){if(j.cursor>=j.limit)return!1;j.cursor++}return!0}function o(){return l<=j.cursor}function a(){return m<=j.cursor}function t(){var e;if(j.ket=j.cursor,!(e=j.find_among_b(h,45)))return!1;switch(j.bra=j.cursor,e){case 1:if(!a())return!1;j.slice_del();break;case 2:if(!a())return!1;j.slice_from("log");break;case 3:if(!a())return!1;j.slice_from("u");break;case 4:if(!a())return!1;j.slice_from("ente");break;case 5:if(!(c<=j.cursor))return!1;j.slice_del(),j.ket=j.cursor,(e=j.find_among_b(v,4))&&(j.bra=j.cursor,a()&&(j.slice_del(),1==e&&(j.ket=j.cursor,j.eq_s_b(2,"at")&&(j.bra=j.cursor,a()&&j.slice_del()))));break;case 6:if(!a())return!1;j.slice_del(),j.ket=j.cursor,(e=j.find_among_b(p,3))&&(j.bra=j.cursor,1==e&&a()&&j.slice_del());break;case 7:if(!a())return!1;j.slice_del(),j.ket=j.cursor,(e=j.find_among_b(_,3))&&(j.bra=j.cursor,1==e&&a()&&j.slice_del());break;case 8:if(!a())return!1;j.slice_del(),j.ket=j.cursor,j.eq_s_b(2,"at")&&(j.bra=j.cursor,a()&&j.slice_del());break;case 9:if(!o()||!j.eq_s_b(1,"e"))return!1;j.slice_from("ir")}return!0}function u(e,r){if(j.eq_s_b(1,e)){j.bra=j.cursor;var s=j.limit-j.cursor;if(j.eq_s_b(1,r))return j.cursor=j.limit-s,o()&&j.slice_del(),!1}return!0}function w(){if(!t()&&(j.cursor=j.limit,!function(){var e,r;if(j.cursor>=l){if(r=j.limit_backward,j.limit_backward=l,j.ket=j.cursor,e=j.find_among_b(b,120))return j.bra=j.cursor,1==e&&j.slice_del(),j.limit_backward=r,!0;j.limit_backward=r}return!1}()))return j.cursor=j.limit,void function(){var e;j.ket=j.cursor,(e=j.find_among_b(g,7))&&(j.bra=j.cursor,1==e&&o()&&j.slice_del())}();j.cursor=j.limit,j.ket=j.cursor,j.eq_s_b(1,"i")&&(j.bra=j.cursor,j.eq_s_b(1,"c")&&(j.cursor=j.limit,o()&&j.slice_del()))}var m,c,l,f=[new r("",-1,3),new r("ã",0,1),new r("õ",0,2)],d=[new r("",-1,3),new r("a~",0,1),new r("o~",0,2)],v=[new r("ic",-1,-1),new r("ad",-1,-1),new r("os",-1,-1),new r("iv",-1,1)],p=[new r("ante",-1,1),new r("avel",-1,1),new r("ível",-1,1)],_=[new r("ic",-1,1),new r("abil",-1,1),new r("iv",-1,1)],h=[new r("ica",-1,1),new r("ância",-1,1),new r("ência",-1,4),new r("ira",-1,9),new r("adora",-1,1),new r("osa",-1,1),new r("ista",-1,1),new r("iva",-1,8),new r("eza",-1,1),new r("logía",-1,2),new r("idade",-1,7),new r("ante",-1,1),new r("mente",-1,6),new r("amente",12,5),new r("ável",-1,1),new r("ível",-1,1),new r("ución",-1,3),new r("ico",-1,1),new r("ismo",-1,1),new r("oso",-1,1),new r("amento",-1,1),new r("imento",-1,1),new r("ivo",-1,8),new r("aça~o",-1,1),new r("ador",-1,1),new r("icas",-1,1),new r("ências",-1,4),new r("iras",-1,9),new r("adoras",-1,1),new r("osas",-1,1),new r("istas",-1,1),new r("ivas",-1,8),new r("ezas",-1,1),new r("logías",-1,2),new r("idades",-1,7),new r("uciones",-1,3),new r("adores",-1,1),new r("antes",-1,1),new r("aço~es",-1,1),new r("icos",-1,1),new r("ismos",-1,1),new r("osos",-1,1),new r("amentos",-1,1),new r("imentos",-1,1),new r("ivos",-1,8)],b=[new r("ada",-1,1),new r("ida",-1,1),new r("ia",-1,1),new r("aria",2,1),new r("eria",2,1),new r("iria",2,1),new r("ara",-1,1),new r("era",-1,1),new r("ira",-1,1),new r("ava",-1,1),new r("asse",-1,1),new r("esse",-1,1),new r("isse",-1,1),new r("aste",-1,1),new r("este",-1,1),new r("iste",-1,1),new r("ei",-1,1),new r("arei",16,1),new r("erei",16,1),new r("irei",16,1),new r("am",-1,1),new r("iam",20,1),new r("ariam",21,1),new r("eriam",21,1),new r("iriam",21,1),new r("aram",20,1),new r("eram",20,1),new r("iram",20,1),new r("avam",20,1),new r("em",-1,1),new r("arem",29,1),new r("erem",29,1),new r("irem",29,1),new r("assem",29,1),new r("essem",29,1),new r("issem",29,1),new r("ado",-1,1),new r("ido",-1,1),new r("ando",-1,1),new r("endo",-1,1),new r("indo",-1,1),new r("ara~o",-1,1),new r("era~o",-1,1),new r("ira~o",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("ir",-1,1),new r("as",-1,1),new r("adas",47,1),new r("idas",47,1),new r("ias",47,1),new r("arias",50,1),new r("erias",50,1),new r("irias",50,1),new r("aras",47,1),new r("eras",47,1),new r("iras",47,1),new r("avas",47,1),new r("es",-1,1),new r("ardes",58,1),new r("erdes",58,1),new r("irdes",58,1),new r("ares",58,1),new r("eres",58,1),new r("ires",58,1),new r("asses",58,1),new r("esses",58,1),new r("isses",58,1),new r("astes",58,1),new r("estes",58,1),new r("istes",58,1),new r("is",-1,1),new r("ais",71,1),new r("eis",71,1),new r("areis",73,1),new r("ereis",73,1),new r("ireis",73,1),new r("áreis",73,1),new r("éreis",73,1),new r("íreis",73,1),new r("ásseis",73,1),new r("ésseis",73,1),new r("ísseis",73,1),new r("áveis",73,1),new r("íeis",73,1),new r("aríeis",84,1),new r("eríeis",84,1),new r("iríeis",84,1),new r("ados",-1,1),new r("idos",-1,1),new r("amos",-1,1),new r("áramos",90,1),new r("éramos",90,1),new r("íramos",90,1),new r("ávamos",90,1),new r("íamos",90,1),new r("aríamos",95,1),new r("eríamos",95,1),new r("iríamos",95,1),new r("emos",-1,1),new r("aremos",99,1),new r("eremos",99,1),new r("iremos",99,1),new r("ássemos",99,1),new r("êssemos",99,1),new r("íssemos",99,1),new r("imos",-1,1),new r("armos",-1,1),new r("ermos",-1,1),new r("irmos",-1,1),new r("ámos",-1,1),new r("arás",-1,1),new r("erás",-1,1),new r("irás",-1,1),new r("eu",-1,1),new r("iu",-1,1),new r("ou",-1,1),new r("ará",-1,1),new r("erá",-1,1),new r("irá",-1,1)],g=[new r("a",-1,1),new r("i",-1,1),new r("o",-1,1),new r("os",-1,1),new r("á",-1,1),new r("í",-1,1),new r("ó",-1,1)],k=[new r("e",-1,1),new r("ç",-1,2),new r("é",-1,1),new r("ê",-1,1)],q=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,3,19,12,2],j=new s;this.setCurrent=function(e){j.setCurrent(e)},this.getCurrent=function(){return j.getCurrent()},this.stem=function(){var e=j.cursor;return function(){for(var e;;){if(j.bra=j.cursor,e=j.find_among(f,3))switch(j.ket=j.cursor,e){case 1:j.slice_from("a~");continue;case 2:j.slice_from("o~");continue;case 3:if(j.cursor>=j.limit)break;j.cursor++;continue}break}}(),j.cursor=e,function(){var e=j.cursor;l=j.limit,c=l,m=l,n(),j.cursor=e,i()&&(c=j.cursor,i()&&(m=j.cursor))}(),j.limit_backward=e,j.cursor=j.limit,w(),j.cursor=j.limit,function(){var e;if(j.ket=j.cursor,e=j.find_among_b(k,4))switch(j.bra=j.cursor,e){case 1:o()&&(j.slice_del(),j.ket=j.cursor,j.limit,j.cursor,u("u","g")&&u("i","c"));break;case 2:j.slice_from("c")}}(),j.cursor=j.limit_backward,function(){for(var e;;){if(j.bra=j.cursor,e=j.find_among(d,3))switch(j.ket=j.cursor,e){case 1:j.slice_from("ã");continue;case 2:j.slice_from("õ");continue;case 3:if(j.cursor>=j.limit)break;j.cursor++;continue}break}}(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.pt.stemmer,"stemmer-pt"),e.pt.stopWordFilter=e.generateStopWordFilter("a ao aos aquela aquelas aquele aqueles aquilo as até com como da das de dela delas dele deles depois do dos e ela elas ele eles em entre era eram essa essas esse esses esta estamos estas estava estavam este esteja estejam estejamos estes esteve estive estivemos estiver estivera estiveram estiverem estivermos estivesse estivessem estivéramos estivéssemos estou está estávamos estão eu foi fomos for fora foram forem formos fosse fossem fui fôramos fôssemos haja hajam hajamos havemos hei houve houvemos houver houvera houveram houverei houverem houveremos houveria houveriam houvermos houverá houverão houveríamos houvesse houvessem houvéramos houvéssemos há hão isso isto já lhe lhes mais mas me mesmo meu meus minha minhas muito na nas nem no nos nossa nossas nosso nossos num numa não nós o os ou para pela pelas pelo pelos por qual quando que quem se seja sejam sejamos sem serei seremos seria seriam será serão seríamos seu seus somos sou sua suas são só também te tem temos tenha tenham tenhamos tenho terei teremos teria teriam terá terão teríamos teu teus teve tinha tinham tive tivemos tiver tivera tiveram tiverem tivermos tivesse tivessem tivéramos tivéssemos tu tua tuas tém tínhamos um uma você vocês vos à às éramos".split(" ")),e.Pipeline.registerFunction(e.pt.stopWordFilter,"stopWordFilter-pt")}});
--------------------------------------------------------------------------------
/assets/javascripts/lunr/lunr.ro.js:
--------------------------------------------------------------------------------
1 | !function(e,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ro=function(){this.pipeline.reset(),this.pipeline.add(e.ro.trimmer,e.ro.stopWordFilter,e.ro.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ro.stemmer))},e.ro.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.ro.trimmer=e.trimmerSupport.generateTrimmer(e.ro.wordCharacters),e.Pipeline.registerFunction(e.ro.trimmer,"trimmer-ro"),e.ro.stemmer=function(){var i=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,n=new function(){function e(e,i){h.eq_s(1,e)&&(h.ket=h.cursor,h.in_grouping(k,97,259)&&h.slice_from(i))}function n(){if(h.out_grouping(k,97,259)){for(;!h.in_grouping(k,97,259);){if(h.cursor>=h.limit)return!0;h.cursor++}return!1}return!0}function t(){var e,i,r=h.cursor;if(h.in_grouping(k,97,259)){if(e=h.cursor,!n())return void(f=h.cursor);if(h.cursor=e,!function(){if(h.in_grouping(k,97,259))for(;!h.out_grouping(k,97,259);){if(h.cursor>=h.limit)return!0;h.cursor++}return!1}())return void(f=h.cursor)}h.cursor=r,h.out_grouping(k,97,259)&&(i=h.cursor,n()&&(h.cursor=i,h.in_grouping(k,97,259)&&h.cursor=h.limit)return!1;h.cursor++}for(;!h.out_grouping(k,97,259);){if(h.cursor>=h.limit)return!1;h.cursor++}return!0}function o(){return l<=h.cursor}function s(){var e,i=h.limit-h.cursor;if(h.ket=h.cursor,(e=h.find_among_b(b,46))&&(h.bra=h.cursor,o())){switch(e){case 1:h.slice_from("abil");break;case 2:h.slice_from("ibil");break;case 3:h.slice_from("iv");break;case 4:h.slice_from("ic");break;case 5:h.slice_from("at");break;case 6:h.slice_from("it")}return w=!0,h.cursor=h.limit-i,!0}return!1}function c(){var e,i;for(w=!1;;)if(i=h.limit-h.cursor,!s()){h.cursor=h.limit-i;break}if(h.ket=h.cursor,(e=h.find_among_b(v,62))&&(h.bra=h.cursor,m<=h.cursor)){switch(e){case 1:h.slice_del();break;case 2:h.eq_s_b(1,"ţ")&&(h.bra=h.cursor,h.slice_from("t"));break;case 3:h.slice_from("ist")}w=!0}}function u(){var e;h.ket=h.cursor,(e=h.find_among_b(g,5))&&(h.bra=h.cursor,f<=h.cursor&&1==e&&h.slice_del())}var w,m,l,f,p=[new i("",-1,3),new i("I",0,1),new i("U",0,2)],d=[new i("ea",-1,3),new i("aţia",-1,7),new i("aua",-1,2),new i("iua",-1,4),new i("aţie",-1,7),new i("ele",-1,3),new i("ile",-1,5),new i("iile",6,4),new i("iei",-1,4),new i("atei",-1,6),new i("ii",-1,4),new i("ului",-1,1),new i("ul",-1,1),new i("elor",-1,3),new i("ilor",-1,4),new i("iilor",14,4)],b=[new i("icala",-1,4),new i("iciva",-1,4),new i("ativa",-1,5),new i("itiva",-1,6),new i("icale",-1,4),new i("aţiune",-1,5),new i("iţiune",-1,6),new i("atoare",-1,5),new i("itoare",-1,6),new i("ătoare",-1,5),new i("icitate",-1,4),new i("abilitate",-1,1),new i("ibilitate",-1,2),new i("ivitate",-1,3),new i("icive",-1,4),new i("ative",-1,5),new i("itive",-1,6),new i("icali",-1,4),new i("atori",-1,5),new i("icatori",18,4),new i("itori",-1,6),new i("ători",-1,5),new i("icitati",-1,4),new i("abilitati",-1,1),new i("ivitati",-1,3),new i("icivi",-1,4),new i("ativi",-1,5),new i("itivi",-1,6),new i("icităi",-1,4),new i("abilităi",-1,1),new i("ivităi",-1,3),new i("icităţi",-1,4),new i("abilităţi",-1,1),new i("ivităţi",-1,3),new i("ical",-1,4),new i("ator",-1,5),new i("icator",35,4),new i("itor",-1,6),new i("ător",-1,5),new i("iciv",-1,4),new i("ativ",-1,5),new i("itiv",-1,6),new i("icală",-1,4),new i("icivă",-1,4),new i("ativă",-1,5),new i("itivă",-1,6)],v=[new i("ica",-1,1),new i("abila",-1,1),new i("ibila",-1,1),new i("oasa",-1,1),new i("ata",-1,1),new i("ita",-1,1),new i("anta",-1,1),new i("ista",-1,3),new i("uta",-1,1),new i("iva",-1,1),new i("ic",-1,1),new i("ice",-1,1),new i("abile",-1,1),new i("ibile",-1,1),new i("isme",-1,3),new i("iune",-1,2),new i("oase",-1,1),new i("ate",-1,1),new i("itate",17,1),new i("ite",-1,1),new i("ante",-1,1),new i("iste",-1,3),new i("ute",-1,1),new i("ive",-1,1),new i("ici",-1,1),new i("abili",-1,1),new i("ibili",-1,1),new i("iuni",-1,2),new i("atori",-1,1),new i("osi",-1,1),new i("ati",-1,1),new i("itati",30,1),new i("iti",-1,1),new i("anti",-1,1),new i("isti",-1,3),new i("uti",-1,1),new i("işti",-1,3),new i("ivi",-1,1),new i("ităi",-1,1),new i("oşi",-1,1),new i("ităţi",-1,1),new i("abil",-1,1),new i("ibil",-1,1),new i("ism",-1,3),new i("ator",-1,1),new i("os",-1,1),new i("at",-1,1),new i("it",-1,1),new i("ant",-1,1),new i("ist",-1,3),new i("ut",-1,1),new i("iv",-1,1),new i("ică",-1,1),new i("abilă",-1,1),new i("ibilă",-1,1),new i("oasă",-1,1),new i("ată",-1,1),new i("ită",-1,1),new i("antă",-1,1),new i("istă",-1,3),new i("ută",-1,1),new i("ivă",-1,1)],_=[new i("ea",-1,1),new i("ia",-1,1),new i("esc",-1,1),new i("ăsc",-1,1),new i("ind",-1,1),new i("ând",-1,1),new i("are",-1,1),new i("ere",-1,1),new i("ire",-1,1),new i("âre",-1,1),new i("se",-1,2),new i("ase",10,1),new i("sese",10,2),new i("ise",10,1),new i("use",10,1),new i("âse",10,1),new i("eşte",-1,1),new i("ăşte",-1,1),new i("eze",-1,1),new i("ai",-1,1),new i("eai",19,1),new i("iai",19,1),new i("sei",-1,2),new i("eşti",-1,1),new i("ăşti",-1,1),new i("ui",-1,1),new i("ezi",-1,1),new i("âi",-1,1),new i("aşi",-1,1),new i("seşi",-1,2),new i("aseşi",29,1),new i("seseşi",29,2),new i("iseşi",29,1),new i("useşi",29,1),new i("âseşi",29,1),new i("işi",-1,1),new i("uşi",-1,1),new i("âşi",-1,1),new i("aţi",-1,2),new i("eaţi",38,1),new i("iaţi",38,1),new i("eţi",-1,2),new i("iţi",-1,2),new i("âţi",-1,2),new i("arăţi",-1,1),new i("serăţi",-1,2),new i("aserăţi",45,1),new i("seserăţi",45,2),new i("iserăţi",45,1),new i("userăţi",45,1),new i("âserăţi",45,1),new i("irăţi",-1,1),new i("urăţi",-1,1),new i("ârăţi",-1,1),new i("am",-1,1),new i("eam",54,1),new i("iam",54,1),new i("em",-1,2),new i("asem",57,1),new i("sesem",57,2),new i("isem",57,1),new i("usem",57,1),new i("âsem",57,1),new i("im",-1,2),new i("âm",-1,2),new i("ăm",-1,2),new i("arăm",65,1),new i("serăm",65,2),new i("aserăm",67,1),new i("seserăm",67,2),new i("iserăm",67,1),new i("userăm",67,1),new i("âserăm",67,1),new i("irăm",65,1),new i("urăm",65,1),new i("ârăm",65,1),new i("au",-1,1),new i("eau",76,1),new i("iau",76,1),new i("indu",-1,1),new i("ându",-1,1),new i("ez",-1,1),new i("ească",-1,1),new i("ară",-1,1),new i("seră",-1,2),new i("aseră",84,1),new i("seseră",84,2),new i("iseră",84,1),new i("useră",84,1),new i("âseră",84,1),new i("iră",-1,1),new i("ură",-1,1),new i("âră",-1,1),new i("ează",-1,1)],g=[new i("a",-1,1),new i("e",-1,1),new i("ie",1,1),new i("i",-1,1),new i("ă",-1,1)],k=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,2,32,0,0,4],h=new r;this.setCurrent=function(e){h.setCurrent(e)},this.getCurrent=function(){return h.getCurrent()},this.stem=function(){var i=h.cursor;return function(){for(var i,r;i=h.cursor,h.in_grouping(k,97,259)&&(r=h.cursor,h.bra=r,e("u","U"),h.cursor=r,e("i","I")),h.cursor=i,!(h.cursor>=h.limit);)h.cursor++}(),h.cursor=i,function(){var e=h.cursor;f=h.limit,l=f,m=f,t(),h.cursor=e,a()&&(l=h.cursor,a()&&(m=h.cursor))}(),h.limit_backward=i,h.cursor=h.limit,function(){var e,i;if(h.ket=h.cursor,(e=h.find_among_b(d,16))&&(h.bra=h.cursor,o()))switch(e){case 1:h.slice_del();break;case 2:h.slice_from("a");break;case 3:h.slice_from("e");break;case 4:h.slice_from("i");break;case 5:i=h.limit-h.cursor,h.eq_s_b(2,"ab")||(h.cursor=h.limit-i,h.slice_from("i"));break;case 6:h.slice_from("at");break;case 7:h.slice_from("aţi")}}(),h.cursor=h.limit,c(),h.cursor=h.limit,w||(h.cursor=h.limit,function(){var e,i,r;if(h.cursor>=f){if(i=h.limit_backward,h.limit_backward=f,h.ket=h.cursor,e=h.find_among_b(_,94))switch(h.bra=h.cursor,e){case 1:if(r=h.limit-h.cursor,!h.out_grouping_b(k,97,259)&&(h.cursor=h.limit-r,!h.eq_s_b(1,"u")))break;case 2:h.slice_del()}h.limit_backward=i}}(),h.cursor=h.limit),u(),h.cursor=h.limit_backward,function(){for(var e;;){if(h.bra=h.cursor,e=h.find_among(p,3))switch(h.ket=h.cursor,e){case 1:h.slice_from("i");continue;case 2:h.slice_from("u");continue;case 3:if(h.cursor>=h.limit)break;h.cursor++;continue}break}}(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.ro.stemmer,"stemmer-ro"),e.ro.stopWordFilter=e.generateStopWordFilter("acea aceasta această aceea acei aceia acel acela acele acelea acest acesta aceste acestea aceşti aceştia acolo acord acum ai aia aibă aici al ale alea altceva altcineva am ar are asemenea asta astea astăzi asupra au avea avem aveţi azi aş aşadar aţi bine bucur bună ca care caut ce cel ceva chiar cinci cine cineva contra cu cum cumva curând curînd când cât câte câtva câţi cînd cît cîte cîtva cîţi că căci cărei căror cărui către da dacă dar datorită dată dau de deci deja deoarece departe deşi din dinaintea dintr- dintre doi doilea două drept după dă ea ei el ele eram este eu eşti face fata fi fie fiecare fii fim fiu fiţi frumos fără graţie halbă iar ieri la le li lor lui lângă lîngă mai mea mei mele mereu meu mi mie mine mult multă mulţi mulţumesc mâine mîine mă ne nevoie nici nicăieri nimeni nimeri nimic nişte noastre noastră noi noroc nostru nouă noştri nu opt ori oricare orice oricine oricum oricând oricât oricînd oricît oriunde patra patru patrulea pe pentru peste pic poate pot prea prima primul prin puţin puţina puţină până pînă rog sa sale sau se spate spre sub sunt suntem sunteţi sută sînt sîntem sînteţi să săi său ta tale te timp tine toate toată tot totuşi toţi trei treia treilea tu tăi tău un una unde undeva unei uneia unele uneori unii unor unora unu unui unuia unul vi voastre voastră voi vostru vouă voştri vreme vreo vreun vă zece zero zi zice îi îl îmi împotriva în înainte înaintea încotro încât încît între întrucât întrucît îţi ăla ălea ăsta ăstea ăştia şapte şase şi ştiu ţi ţie".split(" ")),e.Pipeline.registerFunction(e.ro.stopWordFilter,"stopWordFilter-ro")}});
--------------------------------------------------------------------------------
/assets/javascripts/lunr/lunr.ru.js:
--------------------------------------------------------------------------------
1 | !function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ru=function(){this.pipeline.reset(),this.pipeline.add(e.ru.trimmer,e.ru.stopWordFilter,e.ru.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ru.stemmer))},e.ru.wordCharacters="Ѐ-҄҇-ԯᴫᵸⷠ-ⷿꙀ-ꚟ︮︯",e.ru.trimmer=e.trimmerSupport.generateTrimmer(e.ru.wordCharacters),e.Pipeline.registerFunction(e.ru.trimmer,"trimmer-ru"),e.ru.stemmer=function(){var n=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,t=new function(){function e(){for(;!g.in_grouping(h,1072,1103);){if(g.cursor>=g.limit)return!1;g.cursor++}return!0}function t(){for(;!g.out_grouping(h,1072,1103);){if(g.cursor>=g.limit)return!1;g.cursor++}return!0}function w(e,n){var r,t;if(g.ket=g.cursor,r=g.find_among_b(e,n)){switch(g.bra=g.cursor,r){case 1:if(t=g.limit-g.cursor,!g.eq_s_b(1,"а")&&(g.cursor=g.limit-t,!g.eq_s_b(1,"я")))return!1;case 2:g.slice_del()}return!0}return!1}function i(e,n){var r;return g.ket=g.cursor,!!(r=g.find_among_b(e,n))&&(g.bra=g.cursor,1==r&&g.slice_del(),!0)}function u(){return!!i(l,26)&&(w(f,8),!0)}function s(){var e;g.ket=g.cursor,(e=g.find_among_b(_,2))&&(g.bra=g.cursor,o<=g.cursor&&1==e&&g.slice_del())}var o,c,m=[new n("в",-1,1),new n("ив",0,2),new n("ыв",0,2),new n("вши",-1,1),new n("ивши",3,2),new n("ывши",3,2),new n("вшись",-1,1),new n("ившись",6,2),new n("ывшись",6,2)],l=[new n("ее",-1,1),new n("ие",-1,1),new n("ое",-1,1),new n("ые",-1,1),new n("ими",-1,1),new n("ыми",-1,1),new n("ей",-1,1),new n("ий",-1,1),new n("ой",-1,1),new n("ый",-1,1),new n("ем",-1,1),new n("им",-1,1),new n("ом",-1,1),new n("ым",-1,1),new n("его",-1,1),new n("ого",-1,1),new n("ему",-1,1),new n("ому",-1,1),new n("их",-1,1),new n("ых",-1,1),new n("ею",-1,1),new n("ою",-1,1),new n("ую",-1,1),new n("юю",-1,1),new n("ая",-1,1),new n("яя",-1,1)],f=[new n("ем",-1,1),new n("нн",-1,1),new n("вш",-1,1),new n("ивш",2,2),new n("ывш",2,2),new n("щ",-1,1),new n("ющ",5,1),new n("ующ",6,2)],a=[new n("сь",-1,1),new n("ся",-1,1)],p=[new n("ла",-1,1),new n("ила",0,2),new n("ыла",0,2),new n("на",-1,1),new n("ена",3,2),new n("ете",-1,1),new n("ите",-1,2),new n("йте",-1,1),new n("ейте",7,2),new n("уйте",7,2),new n("ли",-1,1),new n("или",10,2),new n("ыли",10,2),new n("й",-1,1),new n("ей",13,2),new n("уй",13,2),new n("л",-1,1),new n("ил",16,2),new n("ыл",16,2),new n("ем",-1,1),new n("им",-1,2),new n("ым",-1,2),new n("н",-1,1),new n("ен",22,2),new n("ло",-1,1),new n("ило",24,2),new n("ыло",24,2),new n("но",-1,1),new n("ено",27,2),new n("нно",27,1),new n("ет",-1,1),new n("ует",30,2),new n("ит",-1,2),new n("ыт",-1,2),new n("ют",-1,1),new n("уют",34,2),new n("ят",-1,2),new n("ны",-1,1),new n("ены",37,2),new n("ть",-1,1),new n("ить",39,2),new n("ыть",39,2),new n("ешь",-1,1),new n("ишь",-1,2),new n("ю",-1,2),new n("ую",44,2)],d=[new n("а",-1,1),new n("ев",-1,1),new n("ов",-1,1),new n("е",-1,1),new n("ие",3,1),new n("ье",3,1),new n("и",-1,1),new n("еи",6,1),new n("ии",6,1),new n("ами",6,1),new n("ями",6,1),new n("иями",10,1),new n("й",-1,1),new n("ей",12,1),new n("ией",13,1),new n("ий",12,1),new n("ой",12,1),new n("ам",-1,1),new n("ем",-1,1),new n("ием",18,1),new n("ом",-1,1),new n("ям",-1,1),new n("иям",21,1),new n("о",-1,1),new n("у",-1,1),new n("ах",-1,1),new n("ях",-1,1),new n("иях",26,1),new n("ы",-1,1),new n("ь",-1,1),new n("ю",-1,1),new n("ию",30,1),new n("ью",30,1),new n("я",-1,1),new n("ия",33,1),new n("ья",33,1)],_=[new n("ост",-1,1),new n("ость",-1,1)],b=[new n("ейше",-1,1),new n("н",-1,2),new n("ейш",-1,1),new n("ь",-1,3)],h=[33,65,8,232],g=new r;this.setCurrent=function(e){g.setCurrent(e)},this.getCurrent=function(){return g.getCurrent()},this.stem=function(){return c=g.limit,o=c,e()&&(c=g.cursor,t()&&e()&&t()&&(o=g.cursor)),g.cursor=g.limit,!(g.cursor=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor++,!0}return!1},in_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e<=s&&e>=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor--,!0}return!1},out_grouping:function(t,i,s){if(this.cursors||e>3]&1<<(7&e)))return this.cursor++,!0}return!1},out_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e>s||e>3]&1<<(7&e)))return this.cursor--,!0}return!1},eq_s:function(t,i){if(this.limit-this.cursor>1),f=0,l=o0||e==s||c)break;c=!0}}for(;;){if(o>=(_=t[s]).s_size){if(this.cursor=n+_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n+_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},find_among_b:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit_backward,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o=0;_--){if(n-l==u){f=-1;break}if(f=r.charCodeAt(n-1-l)-m.s[_])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){var m=t[s];if(o>=m.s_size){if(this.cursor=n-m.s_size,!m.method)return m.result;var b=m.method();if(this.cursor=n-m.s_size,b)return m.result}if((s=m.substring_i)<0)return 0}},replace_s:function(t,i,s){var e=s.length-(i-t),n=r.substring(0,t),u=r.substring(i);return r=n+s+u,this.limit+=e,this.cursor>=i?this.cursor+=e:this.cursor>t&&(this.cursor=t),e},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>r.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),r.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}});
--------------------------------------------------------------------------------
/assets/javascripts/lunr/lunr.sv.js:
--------------------------------------------------------------------------------
1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,t=new function(){var e,t,i=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],s=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],a=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],o=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],u=[119,127,149],c=new n;this.setCurrent=function(e){c.setCurrent(e)},this.getCurrent=function(){return c.getCurrent()},this.stem=function(){var r=c.cursor;return function(){var r,n=c.cursor+3;if(t=c.limit,0<=n||n<=c.limit){for(e=n;;){if(r=c.cursor,c.in_grouping(o,97,246)){c.cursor=r;break}if(c.cursor=r,c.cursor>=c.limit)return;c.cursor++}for(;!c.out_grouping(o,97,246);){if(c.cursor>=c.limit)return;c.cursor++}(t=c.cursor)=t&&(c.limit_backward=t,c.cursor=c.limit,c.ket=c.cursor,e=c.find_among_b(i,37),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del();break;case 2:c.in_grouping_b(u,98,121)&&c.slice_del()}}(),c.cursor=c.limit,function(){var e=c.limit_backward;c.cursor>=t&&(c.limit_backward=t,c.cursor=c.limit,c.find_among_b(s,7)&&(c.cursor=c.limit,c.ket=c.cursor,c.cursor>c.limit_backward&&(c.bra=--c.cursor,c.slice_del())),c.limit_backward=e)}(),c.cursor=c.limit,function(){var e,r;if(c.cursor>=t){if(r=c.limit_backward,c.limit_backward=t,c.cursor=c.limit,c.ket=c.cursor,e=c.find_among_b(a,5))switch(c.bra=c.cursor,e){case 1:c.slice_del();break;case 2:c.slice_from("lös");break;case 3:c.slice_from("full")}c.limit_backward=r}}(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return t.setCurrent(e),t.stem(),t.getCurrent()}):(t.setCurrent(e),t.stem(),t.getCurrent())}}(),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}});
--------------------------------------------------------------------------------
/assets/javascripts/modernizr.1aa3b519.js:
--------------------------------------------------------------------------------
1 | !function(e,t){for(var n in t)e[n]=t[n]}(window,function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=4)}({4:function(e,t,n){"use strict";n(5)},5:function(e,t){!function(t){!function(e,t,n){function r(e,t){return typeof e===t}function o(e){var t=_.className,n=C._config.classPrefix||"";if(T&&(t=t.baseVal),C._config.enableJSClass){var r=new RegExp("(^|\\s)"+n+"no-js(\\s|$)");t=t.replace(r,"$1"+n+"js$2")}C._config.enableClasses&&(t+=" "+n+e.join(" "+n),T?_.className.baseVal=t:_.className=t)}function i(e,t){if("object"==typeof e)for(var n in e)b(e,n)&&i(n,e[n]);else{e=e.toLowerCase();var r=e.split("."),s=C[r[0]];if(2==r.length&&(s=s[r[1]]),void 0!==s)return C;t="function"==typeof t?t():t,1==r.length?C[r[0]]=t:(!C[r[0]]||C[r[0]]instanceof Boolean||(C[r[0]]=new Boolean(C[r[0]])),C[r[0]][r[1]]=t),o([(t&&0!=t?"":"no-")+r.join("-")]),C._trigger(e,t)}return C}function s(){return"function"!=typeof t.createElement?t.createElement(arguments[0]):T?t.createElementNS.call(t,"http://www.w3.org/2000/svg",arguments[0]):t.createElement.apply(t,arguments)}function a(){var e=t.body;return e||(e=s(T?"svg":"body"),e.fake=!0),e}function u(e,n,r,o){var i,u,l,f,c="modernizr",d=s("div"),p=a();if(parseInt(r,10))for(;r--;)l=s("div"),l.id=o?o[r]:c+(r+1),d.appendChild(l);return i=s("style"),i.type="text/css",i.id="s"+c,(p.fake?p:d).appendChild(i),p.appendChild(d),i.styleSheet?i.styleSheet.cssText=e:i.appendChild(t.createTextNode(e)),d.id=c,p.fake&&(p.style.background="",p.style.overflow="hidden",f=_.style.overflow,_.style.overflow="hidden",_.appendChild(p)),u=n(d,e),p.fake?(p.parentNode.removeChild(p),_.style.overflow=f,_.offsetHeight):d.parentNode.removeChild(d),!!u}function l(e,t){return!!~(""+e).indexOf(t)}function f(e){return e.replace(/([A-Z])/g,function(e,t){return"-"+t.toLowerCase()}).replace(/^ms-/,"-ms-")}function c(t,n,r){var o;if("getComputedStyle"in e){o=getComputedStyle.call(e,t,n);var i=e.console;if(null!==o)r&&(o=o.getPropertyValue(r));else if(i){var s=i.error?"error":"log";i[s].call(i,"getComputedStyle returning null, its possible modernizr test results are inaccurate")}}else o=!n&&t.currentStyle&&t.currentStyle[r];return o}function d(t,r){var o=t.length;if("CSS"in e&&"supports"in e.CSS){for(;o--;)if(e.CSS.supports(f(t[o]),r))return!0;return!1}if("CSSSupportsRule"in e){for(var i=[];o--;)i.push("("+f(t[o])+":"+r+")");return i=i.join(" or "),u("@supports ("+i+") { #modernizr { position: absolute; } }",function(e){return"absolute"==c(e,null,"position")})}return n}function p(e){return e.replace(/([a-z])-([a-z])/g,function(e,t,n){return t+n.toUpperCase()}).replace(/^-/,"")}function h(e,t,o,i){function a(){f&&(delete j.style,delete j.modElem)}if(i=!r(i,"undefined")&&i,!r(o,"undefined")){var u=d(e,o);if(!r(u,"undefined"))return u}for(var f,c,h,m,v,g=["modernizr","tspan","samp"];!j.style&&g.length;)f=!0,j.modElem=s(g.shift()),j.style=j.modElem.style;for(h=e.length,c=0;h>c;c++)if(m=e[c],v=j.style[m],l(m,"-")&&(m=p(m)),j.style[m]!==n){if(i||r(o,"undefined"))return a(),"pfx"!=t||m;try{j.style[m]=o}catch(e){}if(j.style[m]!=v)return a(),"pfx"!=t||m}return a(),!1}function m(e,t){return function(){return e.apply(t,arguments)}}function v(e,t,n){var o;for(var i in e)if(e[i]in t)return!1===n?e[i]:(o=t[e[i]],r(o,"function")?m(o,n||t):o);return!1}function g(e,t,n,o,i){var s=e.charAt(0).toUpperCase()+e.slice(1),a=(e+" "+k.join(s+" ")+s).split(" ");return r(t,"string")||r(t,"undefined")?h(a,t,o,i):(a=(e+" "+A.join(s+" ")+s).split(" "),v(a,t,n))}function y(e,t,r){return g(e,n,n,t,r)}var w=[],S={_version:"3.5.0",_config:{classPrefix:"",enableClasses:!0,enableJSClass:!0,usePrefixes:!0},_q:[],on:function(e,t){var n=this;setTimeout(function(){t(n[e])},0)},addTest:function(e,t,n){w.push({name:e,fn:t,options:n})},addAsyncTest:function(e){w.push({name:null,fn:e})}},C=function(){};C.prototype=S,C=new C;var b,x=[],_=t.documentElement,T="svg"===_.nodeName.toLowerCase();!function(){var e={}.hasOwnProperty;b=r(e,"undefined")||r(e.call,"undefined")?function(e,t){return t in e&&r(e.constructor.prototype[t],"undefined")}:function(t,n){return e.call(t,n)}}(),S._l={},S.on=function(e,t){this._l[e]||(this._l[e]=[]),this._l[e].push(t),C.hasOwnProperty(e)&&setTimeout(function(){C._trigger(e,C[e])},0)},S._trigger=function(e,t){if(this._l[e]){var n=this._l[e];setTimeout(function(){var e;for(e=0;eab",e=t.offsetHeight,t.open=!0,e=e!=t.offsetHeight}),e)}),C.addTest("fetch","fetch"in e);var z="Moz O ms Webkit",k=S._config.usePrefixes?z.split(" "):[];S._cssomPrefixes=k;var N={elem:s("modernizr")};C._q.push(function(){delete N.elem});var j={style:N.elem.style};C._q.unshift(function(){delete j.style});var A=S._config.usePrefixes?z.toLowerCase().split(" "):[];S._domPrefixes=A,S.testAllProps=g,S.testAllProps=y;var E="CSS"in e&&"supports"in e.CSS,O="supportsCSS"in e;C.addTest("supports",E||O),C.addTest("csstransforms3d",function(){var e=!!y("perspective","1px",!0),t=C._config.usePrefixes;if(e&&(!t||"webkitPerspective"in _.style)){var n;C.supports?n="@supports (perspective: 1px)":(n="@media (transform-3d)",t&&(n+=",(-webkit-transform-3d)")),n+="{#modernizr{width:7px;height:18px;margin:0;padding:0;border:0}}",P("#modernizr{width:0;height:0}"+n,function(t){e=7===t.offsetWidth&&18===t.offsetHeight})}return e}),function(){var e,t,n,o,i,s,a;for(var u in w)if(w.hasOwnProperty(u)){if(e=[],t=w[u],t.name&&(e.push(t.name.toLowerCase()),t.options&&t.options.aliases&&t.options.aliases.length))for(n=0;n Accepting Monero as a Business - Comparison Matrix](/r/accepting-monero-comparison-matrix)
16 |
--------------------------------------------------------------------------------
/docs/cold-storage/offline-transaction-signing.md:
--------------------------------------------------------------------------------
1 | # Offline Transaction Signing
2 |
3 | !!! warning
4 | This is **NOT** necessarily the recommended cold storage setup,
5 | due to high complexity, large room for errors and employing
6 | a general purpose computer for transaction signing (even if offline).
7 |
8 | Published for educational purposes only to understand "what would it take to sign offline".
9 |
10 | It is generally better to use a hardware wallet like Trezor or Ledger.
11 |
12 | Opinions may vary.
13 |
14 | !!! note
15 | This is a guest tutorial contributed by [crocket](https://github.com/crocket).
16 |
17 | Offline transaction signing involves:
18 |
19 | * Creating an unsigned transaction on an online, view-only wallet
20 | * Moving the unsigned transaction to an offline machine
21 | * Signing the unsigned transaction on an offline machine
22 | * Moving the signed transaction back to online, view-only wallet
23 | * Broadcasting the transaction
24 |
25 | ## Creating a new offline wallet
26 |
27 | Constructing a new offline wallet is done by executing:
28 |
29 | ```
30 | monero-wallet-cli --generate-new-wallet /path/to/wallet-file
31 | ```
32 |
33 | on an offline machine. Record the seed on paper by executing `seed` on the offline wallet.
34 |
35 | ## Creating a new offline wallet with seed offset passphrase
36 |
37 | Seed and seed offset passphrase combine to create a new seed. You can store seed
38 | and seed offset passphrase in separate places so that a thief can't steal your
39 | fund without stealing seed and seed offset passphrase. I recommend 6 to 8
40 | (english) words as a seed offset passphrase as one english word has 11 bits of
41 | entropy on average and 8 words have 88 bits of entropy. With seed passphrase,
42 | you can also create decoy wallets that contain a little bit of money and can
43 | protect you from torturers or blackmailers who demand money from you.
44 |
45 | If you want to create an offline wallet with seed and seed passphrase,
46 | create an offline wallet, record the seed on paper, delete the wallet file,
47 | generate seed offset passphrase, record seed offset passphrase on paper, and
48 | execute
49 |
50 | ```
51 | monero-wallet-cli --generate-new-wallet /path/to/wallet-file \
52 | ---restore-deterministic-wallet
53 | ```
54 |
55 | to restore from seed and seed offset passphrase. When you restore from seed, you
56 | can enter seed offset passphrase.
57 |
58 | Generate seed offset passphrase on an offline machine or with diceware because
59 | humans are bad at creating random passphrases.
60 |
61 | If you want to reconstruct an existing offline wallet that received or sent
62 | transactions, you need extra steps. Refer to `Restoring offline wallet`.
63 |
64 | ## Creating a new view-only wallet
65 |
66 | To create a view-only wallet, copy primary address and secret view key from an
67 | offline wallet to an online machine where a view-only wallet is going to be
68 | created. You can get primary address by executing `address` on an offline wallet
69 | and secret view key by executing `viewkey` on the offline wallet.
70 |
71 | You can use a microSD card and two USB microSD card readers to exchange data
72 | between an offline wallet and a view-only wallet. You can also use a USB flash
73 | drive.
74 |
75 | To create a view-only wallet on an online machine, execute
76 |
77 | ```
78 | monero-wallet-cli --generate-from-view-key /path/to/wallet-file \
79 | --daemon-address remote-node-address:port
80 | ```
81 |
82 | If you want to reconstruct an existing view-only wallet that received or sent
83 | transactions, refer to `Restoring view-only wallet`.
84 |
85 | ## Launching offline wallet
86 |
87 | Execute
88 |
89 | ```
90 | monero-wallet-cli --wallet-file /path/to/wallet-file
91 | ```
92 |
93 | ## Launching a view-only wallet
94 |
95 | Execute
96 |
97 | ```
98 | monero-wallet-cli --wallet-file /path/to/wallet-file \
99 | --daemon-address remote-node-address:port
100 | ```
101 |
102 | It's safe to sync your wallet over clearnet. If you want to broadcast a
103 | transaction without revealing your IP address, execute
104 |
105 | ```
106 | monero-wallet-cli --wallet-file /path/to/wallet-file \
107 | --daemon-address tor-or-i2p-remote-node-address:port \
108 | --proxy 127.0.0.1:tor-or-i2p-port
109 | ```
110 |
111 | Synchronizing wallet over clearnet is a lot faster than doing it on tor or i2p.
112 | Thus, consider synchronizing over clearnet even if you broadcast transactions
113 | over tor or i2p.
114 |
115 | ## Offline transaction signing
116 |
117 | Execute any wallet command that transfers monero to any address. For example,
118 |
119 | ```
120 | transfer xmr-address amount-of-xmr-to-send
121 | ```
122 |
123 | Any transfer command on a view-only wallet creates `unsigned_monero_tx` in the
124 | current working directory.
125 |
126 | Move `unsigned_monero_tx` to an offline machine that has an offline wallet.
127 | Execute
128 |
129 | ```
130 | sign_transfer
131 | ```
132 |
133 | on the offline wallet in the directory with `unsigned_monero_tx`.
134 | `signed_monero_tx` file is created in the current working directory. Move
135 | `signed_monero_tx` to the online machine with a view-only wallet. In the
136 | directory with `signed_monero_tx`, launch the view-only wallet, and execute
137 |
138 | ```
139 | submit_transfer
140 | ```
141 |
142 | Because a view-only wallet doesn't have key images, it can't see outgoing
143 | transactions. To make a view-only wallet see outgoing transactions, it has
144 | to export new outputs created by `submit_transfer` to an offline wallet which
145 | creates key images out of new outputs.
146 |
147 | Execute
148 |
149 | ```
150 | export_outputs outputs
151 | ```
152 |
153 | on a view-only wallet. Move `outputs` file to the offline machine with an offline
154 | wallet. Launch the offline wallet, and execute
155 |
156 | ```
157 | import_outputs /path/to/outputs
158 | ```
159 |
160 | Export key images derived from new outputs by executing
161 |
162 | ```
163 | export_key_images key_images
164 | ```
165 |
166 | on an offline wallet. Move `key_images` file to the machine with a view-only
167 | wallet. Launch the view-only wallet, and execute
168 |
169 | ```
170 | import_key_images /path/to/key_images
171 | ```
172 |
173 | ## Updating wallet software on an offline signing machine
174 |
175 | When you update an offline machine with offline wallets, you can't just
176 | connect the machine to the internet and update wallet software because
177 | doing so exposes offline wallets to the internet.
178 |
179 | Instead, boot OS installation media, wipe filesystems, and then connect
180 | to the internet, and install everything from scratch again.
181 |
182 | If your root filesystem is encrypted, OS installation media can connect
183 | to the internet from the beginning because encrypted data are safe until
184 | they are decrypted.
185 |
186 | ## Restoring offline wallet
187 |
188 | After updating wallet software on an offline signing machine by wiping it out
189 | and reinstalling everything, you have to restore offline wallet.
190 |
191 | Restore an offline wallet from seed (and seed offset passphrase) by executing
192 |
193 | ```
194 | monero-wallet-cli --generate-new-wallet wallet-file --restore-deterministic-wallet
195 | ```
196 |
197 | The new offline wallet can't sign new transactions because it doesn't have
198 | all trasaction outputs that precede a new unsigned transaction. Thus, it first
199 | has to import all outputs from a view-only wallet.
200 |
201 | On a view-only wallet that was derived from the offline wallet, execute
202 |
203 | ```
204 | export_outputs all all_outputs
205 | ```
206 |
207 | `all` is important because `export_outputs` exports only new outputs that weren't
208 | exported before, but
209 |
210 | ```
211 | export_outputs all
212 | ```
213 |
214 | exports all outputs. Move `all_outputs` file to the offline machine with the
215 | offline wallet. Execute
216 |
217 | ```
218 | import_outputs /path/to/all_outputs
219 | ```
220 |
221 | on the new offline wallet.
222 |
223 | ## Restoring view-only wallet
224 |
225 | If you reconstruct view-only wallet, because it doesn't have key images,
226 | it can't see outgoing transactions. If it can't see outgoing transactions,
227 | it reports wrong account balances. Thus, it has to import all key images
228 | from its corresponding offline wallet.
229 |
230 | On the offline wallet, execute
231 |
232 | ```
233 | export_key_images all all_key_images
234 | ```
235 |
236 | `export_key_images` doesn't work because it exports only new key images that
237 | weren't exported before.
238 |
239 | ```
240 | export_key_images all
241 | ```
242 |
243 | exports all key images. Move `all_key_images` file to the machine with the
244 | view-only wallet. Execute
245 |
246 | ```
247 | import_key_images /path/to/all_key_images
248 | ```
249 |
--------------------------------------------------------------------------------
/docs/cryptography/asymmetric/edwards25519.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Edwards25519 Elliptic Curve
3 | ---
4 | # Edwards25519 Elliptic Curve
5 |
6 | !!! note
7 | Author is nowhere close to being a cryptographer. Be sceptical on accuracy.
8 |
9 | !!! note
10 | This article is only about the underlying curve. Public key derivation and signing algorithm will be treated separately.
11 |
12 | Monero employs edwards25519 elliptic curve as a basis for its key pair generation.
13 |
14 | The curve comes from the Ed25519 signature scheme. While Monero takes the curve unchanged, it does not exactly follow rest of the Ed25519.
15 |
16 | The edwards25519 curve is [birationally equivalent to Curve25519](https://tools.ietf.org/html/rfc7748#section-4.1).
17 |
18 | ## Definition
19 |
20 | This is the standard edwards25519 curve definition, no Monero specific stuff here,
21 | except the naming convention. The convention comes from the CryptoNote
22 | whitepaper and is widely used in Monero literature.
23 |
24 | ### Curve equation
25 |
26 | −x^2 + y^2 = 1 − (121665/121666) * x^2 * y^2
27 |
28 | Note:
29 |
30 | * curve is in two dimensions (nothing fancy, like all the curves is high school)
31 | * curve is mirrored below y axis due to `y^2` part of the equation (not a polynomial)
32 |
33 | ### Base point: `G`
34 |
35 | The base point is a specific point on the curve. It is used
36 | as a basis for further calculations. It is an arbitrary choice
37 | by the curve authors, just to standardize the scheme.
38 |
39 | Note that it is enough to specify the y value and the sign of the x value.
40 | That's because the specific x can be calculated from the curve equation.
41 |
42 | G = (x, 4/5) # take the point with the positive x
43 |
44 | # The hex representation of the base point
45 | 5866666666666666666666666666666666666666666666666666666666666666
46 |
47 | ### Prime order of the base point: `l`
48 |
49 | In layment terms, the "canvas" where the curve is drawn is assumed
50 | to have a finite "resolution", so point coordinates must "wrap around"
51 | at some point. This is achieved by modulo the `l` value (lowercase L).
52 | In other words, the `l` defines the maximum scalar we can use.
53 |
54 | l = 2^252 + 27742317777372353535851937790883648493
55 | # => 7237005577332262213973186563042994240857116359379907606001950938285454250989
56 |
57 | The `l` is a prime number specified by the curve authors.
58 |
59 | In practice this is the private key's strength.
60 |
61 | ### Total number of points on the curve
62 |
63 | The total number of points on the curve is also a prime number:
64 |
65 | q = 2^255 - 19
66 |
67 | In practice not all points are "useful" and so the private key strength is limited to `l` describe above.
68 |
69 | ## Implementation
70 |
71 | Monero uses (apparently modified) Ref10 implementation by Daniel J. Bernstein.
72 |
73 | ## Reference
74 |
75 | * [A (Relatively Easy To Understand) Primer on Elliptic Curve Cryptography](https://blog.cloudflare.com/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/)
76 | * [RFC 8032 defining EdDSA](https://tools.ietf.org/html/rfc8032)
77 | * [Understanding Monero Cryptography](https://steemit.com/monero/@luigi1111/understanding-monero-cryptography-privacy-introduction) - excellent writeup by Luigi
78 | * [StackOverflow answer](https://monero.stackexchange.com/questions/2290/why-how-does-monero-generate-public-ed25519-keys-without-using-the-standard-publ)
79 | * [Python implementation](https://github.com/monero-project/mininero/blob/master/ed25519.py) - not the reference one but easier to understand
80 | * [Encoding point to hex](https://monero.stackexchange.com/questions/6050/what-is-the-base-point-g-from-the-whitepaper-and-how-is-it-represented-as-a)
81 | * [EdDSA on Wikipedia](https://en.wikipedia.org/wiki/EdDSA)
82 |
--------------------------------------------------------------------------------
/docs/cryptography/asymmetric/introduction.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Asymmetric Cryptography in Moner
3 | ---
4 | # Asymmetric Cryptography in Monero
5 |
6 | !!! note
7 | Author is nowhere close to being a cryptographer. Be sceptical on accuracy.
8 |
9 | Before we get to Monero specific stuff, a little bit of context. We are talking asymmetric cryptography here.
10 | The "asymmetric" simply means the are two keys:
11 |
12 | * the private key (used primarily for signing data and for decrypting data)
13 | * the public key (used primarily for signature verification and encrypting data)
14 |
15 | This is in contrast to symmetric cryptography which uses a single key. This key is a secret shared among the parties.
16 |
17 | Historically, asymmetric cryptography was based on the problem of factorization of a very large integers
18 | back into prime numbers (which is practically impossible for large enough integers).
19 |
20 | Recently, asymmetric cryptography is based on a mathematical notion of elliptic curves.
21 | Edwards25519 is a specific, well researched and standardized elliptic curve used in Monero.
22 |
--------------------------------------------------------------------------------
/docs/cryptography/asymmetric/key-image.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Monero Private Key Image
3 | ---
4 | # Monero Private Key Image
5 |
6 | !!! note
7 | Author is nowhere close to being a cryptographer. Be sceptical on accuracy.
8 |
9 | Private key image serves to detect double spending attempts.
10 |
11 | In Monero funds are always sent to a one-time public key `P`.
12 | Related one-time private key `x` is specific to unspent output.
13 |
14 | As output can be spent only once (in whole), the related private key can be used only once as well.
15 |
16 | Thus, specific private key image `I` being present on the blockchain means
17 | that related output was already spent, and subsequent attempts must not be allowed.
18 |
19 | This whole scheme is necessary because Monero uses Ring Signatures
20 | which make it impossible to know whom exactly signed the transaction.
21 | This is why a simple Bitcoin-like double spending check wouldn't work here.
22 |
23 | ## Definition
24 |
25 | I = x*Hp(P)
26 |
27 | Where:
28 |
29 | * `I` - private key image (or "key image" for short)
30 | * `x` - one-time private key used to unlock an unspent output
31 | * `P` - one-time public key of an unspent output
32 | * `Hp()` - hash function accepting an EC point as an argument
33 |
34 | The `P` comes from this:
35 |
36 | P = xG
37 |
38 | Where `G` is the [edwards25519](/cryptography/asymmetric/edwards25519) base point.
39 |
40 | Substitute `P` with `xG` and we get:
41 |
42 | I = x*Hp(xG)
43 |
44 | The key image `I` is a one-way function of the private key `x`.
45 |
46 | ## Reference
47 |
48 | * [StackExchange answer](https://monero.stackexchange.com/questions/2883/what-is-a-key-image)
49 | * [Another SE answer](https://monero.stackexchange.com/questions/2158/what-is-moneros-mechanism-for-defending-against-a-double-spend-attack)
50 | * [Critical bug](https://getmonero.org/2017/05/17/disclosure-of-a-major-bug-in-cryptonote-based-currencies.html) regarding key image verification that was once present in Monero
51 |
--------------------------------------------------------------------------------
/docs/cryptography/asymmetric/private-key.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Private Keys in Monero
3 | ---
4 | # Private Keys in Monero
5 |
6 | !!! note
7 | Author is nowhere close to being a cryptographer. Be sceptical on accuracy.
8 |
9 | In Monero, the root private key is generated [randomly](/cryptography/prng). Other private keys are derived deterministically from the root private key.
10 |
11 | Private key must be kept secret.
12 |
13 | Private key is a **large integer** impossible to guess, like:
14 | `108555083659983933209597798445644913612440610624038028786991485007418559037440`
15 |
16 | Private key is 256 bits long.
17 |
18 | Private key is a **scalar**, meaning it is a single value.
19 |
20 | In equations scalars are represented by **lowercase letters**.
21 |
22 | ## Relation to Ed25519
23 |
24 | Being simply a random integer, private key is not specific to any particular asymmetric cryptography scheme.
25 |
26 | In context of Monero EC cryptography the private key is a number the base point `G` is multiplied by.
27 | The result of the multiplication is the public key `P` (another point on the curve).
28 | Multiplication of a point by a number has a very special definition in EC cryptography.
29 | See this [this guide](https://blog.cloudflare.com/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/) for details.
30 |
31 | ### Key strength
32 |
33 | Before deriving the public key, private key is subject to modulo `l`,
34 | where `l` is the maximum scalar allowed by the [edwards25519 curve](/cryptography/asymmetric/edwards25519).
35 |
36 | The `l` is on the order of 2^252, so the effective key strength is technically 252 bits, not 256 bits.
37 | This is standard for EC cryptography and is more of a cosmetic nuance than any concern.
38 |
39 | ## Encoding
40 |
41 | In user-facing contexts, the private key integer is:
42 |
43 | 1. Taken modulo `l` to avoid malleability
44 | 2. Put as array of 32 bytes in a [little-endian](https://en.wikipedia.org/wiki/Endianness#Little) direction (the first byte is the least significant)
45 | 3. Converted to hexadecimal form, like: `b3588a87056fb21dc4d052d59e83b54293882e646b543c29478e4cf45c28a402`
46 |
47 | ## Private spend key
48 |
49 | Private spend key is used to spend moneros.
50 |
51 | More specifically, it is used to build one-time private keys which allow to spend related outputs.
52 |
53 | ## Private view key
54 |
55 | Private view key is used to recognize your incoming transactions on the otherwise opaque blockchain.
56 |
57 | ## One-time private keys
58 |
59 | One-time private key like construct is used in [stealth addresses](https://monero.stackexchange.com/questions/1409/constructing-a-stealth-monero-address).
60 |
--------------------------------------------------------------------------------
/docs/cryptography/asymmetric/public-key.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Public Keys in Monero
3 | ---
4 | # Public Keys in Monero
5 |
6 | !!! note
7 | Author is nowhere close to being a cryptographer. Be sceptical on accuracy.
8 |
9 | Public key is deterministically derived from private key based on [edwards25519 curve](/cryptography/asymmetric/edwards25519) with a little Monero-specific twist.
10 |
11 | Public key is meant to be shared. Assuming correct implementation, it is not practically possible to recover private key from public key.
12 |
13 | Public key is a **point (x,y)** on the elliptic curve.
14 |
15 | In equations points are represented by **uppercase letters**.
16 |
17 | In user-facing contexts, public key is encoded in a [little-endian](https://en.wikipedia.org/wiki/Endianness#Little) hexadecimal form, like:
18 | `016a941812293cf9a86071060fb090ab38d67945e659968cb8cf30e1bc725683`
19 |
20 | ## Deriving public key
21 |
22 | Say:
23 |
24 | * P is a public key
25 | * x is a private key
26 | * G is a "base point"; this is simply a constant specific to [edwards25519](/cryptography/asymmetric/edwards25519); this point lies on the elliptic curve
27 |
28 | Then:
29 |
30 | P = xG
31 |
32 | The public key is simply the base point (G) multiplied by the private key (x).
33 | Multiplying the point is adding the point to itself a number of times.
34 |
35 | However, the addition is **not** a simple vector addition. It has a very specific
36 | definition nicely described in [this article](https://blog.cloudflare.com/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/).
37 | What is important is that result of addition is always a point on the curve.
38 | For example, G + G is another point on the curve.
39 |
40 | ## Use cases
41 |
42 | [Monero address](/public-address/standard-address) is composed of public spend key and public view key.
43 | These keys are used to build stealth addresses to receive payments.
44 |
--------------------------------------------------------------------------------
/docs/cryptography/base58.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Base58
3 | ---
4 | # Base58
5 |
6 | Base58 is a binary-to-text encoding scheme. It is similar to Base64 but has been modified to avoid both non-alphanumeric characters and letters which might look ambiguous when printed. The characters excluded in relation to Base64 are: `IOl0+/`
7 |
8 | Base58 does not strictly specify the format. This results in some implementations being incompatible with others, for example with regard to alphabet order.
9 |
10 | For details, see [Wikipedia](https://en.wikipedia.org/wiki/Base58).
11 |
12 | ## Base58 in Monero
13 |
14 | Monero has its own variant of Base58.
15 |
16 | In Monero the Base58 encoding is performed in 8-byte blocks, except the last block which is the remaining (8 or less) bytes .
17 |
18 | The 8-byte block converts to 11 or less Base58 characters. If the block converted to less than 11 characters, the output is padded with "1"s (0 in Base58). The final block is padded as well to whatever would be the maximum size of this number of bytes encoded in Base58.
19 |
20 | The advantage of Monero implementation is that output is of a fixed size which is not the case with plain Base58. The disadvantage is that default libraries won't work.
21 |
22 | For details, see [reference C++ Base58](https://github.com/monero-project/monero/blob/master/src/common/base58.cpp) implementation and [unofficial Python Base58](https://github.com/bigreddmachine/MoneroPy/blob/master/moneropy/base58.py) implementation.
23 |
--------------------------------------------------------------------------------
/docs/cryptography/introduction.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Cryptography in Monero
3 | ---
4 | # Cryptography in Monero
5 |
6 | Monero uses a wide variety of cryptographic primitives for various use cases.
7 |
8 | Comparing to altcoins, Monero cryptography is considered conservative, sound and robust.
9 |
10 | Comparing to Bitcoin, Monero uses much more primitives, and some of them are more advanced, especially those related to privacy and Proof of Work.
11 | Some choices are deliberately non-standard (for better or worse) - oftentimes a legacy of the CryptoNote protocol.
12 |
--------------------------------------------------------------------------------
/docs/cryptography/keccak-256.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Keccak-256 Hash Function
3 | ---
4 | # Keccak-256 Hash Function
5 |
6 | Monero employs Keccak as a hashing function. In most context specifically Keccak-256 is used,
7 | providing 32-byte hashes.
8 |
9 | Keccak is the leading hashing function, designed by non-NSA designers.
10 | Keccak won [NIST competition](https://en.wikipedia.org/wiki/NIST_hash_function_competition) to become the official SHA3.
11 |
12 | ## Use Cases
13 |
14 | Monero does **not** employ Keccak for Proof-of-Work. Instead, Keccak is used for:
15 |
16 | * random number generator
17 | * block hashing
18 | * transaction hashing
19 | * stealth address private key image (for double spend protection)
20 | * public address checksum
21 | * RingCT
22 | * multisig
23 | * bulletproofs
24 |
25 | ...and likely a few other things.
26 |
27 | ## Keccak-256 vs SHA3-256
28 |
29 | SHA3-256 is Keccak-256, except that NIST changed the padding.
30 | For this reason, the original Keccak-256 gives a different hash value than NIST SHA3-256.
31 |
32 | Monero uses original Keccak-256.
33 | The NIST standard was only published on August 2015, while Monero went live on 18 April 2014.
34 |
35 | ## Reference
36 |
37 | * [Keccak source code used in Monero](https://github.com/monero-project/monero/blob/5c2dfe157b48a486eb2b92dcf8789b3b1eb20f60/src/crypto/keccak.c)
38 | * [SHA3 on Wikipedia](https://en.wikipedia.org/wiki/SHA-3)
39 | * [Keccak-256 vs SHA3-256](https://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use) explained on Ethereum stackexchange
40 | * [Online tool to calculate Keccak-256 and SHA3-256](https://emn178.github.io/online-tools/keccak_256.html)
41 |
--------------------------------------------------------------------------------
/docs/cryptography/prng.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Monero Pseudorandom Number Generator
3 | ---
4 | # Monero Pseudorandom Number Generator
5 |
6 | Monero uses PRNG based on the Keccak hashing function.
7 | Basically, output of the previous hashing round is input for the next one.
8 |
9 | The initial seed comes from entropy sources provided by operating system.
10 | On Linux and MacOS the seed comes from `/dev/urandom`.
11 | On Windows the WinAPI `CryptGenRandom` call is used for seeding.
12 |
13 | There is no reseeding.
14 |
15 | ## Caveats
16 |
17 | * This concerns the reference C++ implementation of Monero.
18 | Please note there are many alternative implementations of private key generation,
19 | including JavaScript, Python, Android/Java. These should be researched case by case for correctness.
20 | * In Monero source code you can also find libsodium based random bytes generator. It is part of the embedded library and apparently is not used in actual Monero code.
21 |
22 | ## Reference
23 |
24 | * [Source code](https://github.com/monero-project/monero/blob/1a4298685aa9e694bc555ae69be59d14d3790465/src/crypto/random.c)
25 | * [StackExchange answer](https://monero.stackexchange.com/a/2076/3218)
26 |
--------------------------------------------------------------------------------
/docs/images/monero-dir.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monerodocs/md/964cd29856e887728b0ad7ddd6c22cc7c2d5d944/docs/images/monero-dir.png
--------------------------------------------------------------------------------
/docs/images/monero.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/docs/images/sheets-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/monerodocs/md/964cd29856e887728b0ad7ddd6c22cc7c2d5d944/docs/images/sheets-icon.png
--------------------------------------------------------------------------------
/docs/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Monero Documentation
3 | ---
4 | # Unofficial Monero Documentation
5 |
6 | ## Work in Progress
7 |
8 | Monerodocs attempts to organize basic technical knowledge on Monero in one place.
9 |
10 | While technical explanations are out there, knowledge is scattered through reddit posts, git comments, stack exchange answers, chat logs and the source code. This makes it hard to find complete and up-to-date explanations on advanced topics.
11 |
12 | The goal is to educate and onboard power users faster.
13 |
14 | Please submit your feedback and corrections directly on [github](https://github.com/monerodocs/md/issues).
15 |
16 | Find my contact details at [qertoip.com](https://qertoip.com/).
17 |
--------------------------------------------------------------------------------
/docs/infrastructure/monero-pulse.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: MoneroPulse
3 | ---
4 | # MoneroPulse
5 |
6 | ## What is MoneroPulse?
7 |
8 | MoneroPulse is infrastructure for emergency checkpointing the blockchain.
9 |
10 | It aims to mitigate chain-splits resulting from consensus bugs (like [this one from 2014](https://monero.stackexchange.com/questions/421/what-happened-at-block-202612/424#424)).
11 |
12 | Effectively, MoneroPulse operators can publish which fork they consider the valid one. Technically, the "checkpoint" they publish is a block hash and the block height.
13 |
14 | By default, Monero full node will simply warn users when MoneroPulse checkpoint does not match the fork it is on. The error will be present in the log and on the console in red. Users are free to discard it. Ideally though, users should consult community on what is going on, and make educated decission on whether to follow the checkpoint-compatible fork or the default fork.
15 |
16 | Users can also set auto-enforcing the checkpoints via `--enforce-dns-checkpointing` option to `monerod`. In case of mismatch, `monerod` will rollback the local blockchain by a few blocks. Eventually, the alternative ("fixed") fork will get heavier and the node will follow it, leaving the "invalid" fork behind. This option is recommended for unattended full nodes.
17 |
18 | Summing up, MoneroPulse is emergency checkpointing mechanism. It is opt-in for the users.
19 |
20 | ## MoneroPulse is DNS based
21 |
22 | The ckeckpoints are stored as DNS TXT records for domains owned by MoneroPulse operators.
23 |
24 | To get the idea you can access the checkpoints manually with any DNS client:
25 |
26 | Try:
27 |
28 | dig -t txt checkpoints.moneropulse.net +dnssec
29 |
30 | Result:
31 |
32 | (cut)
33 |
34 | ;; ANSWER SECTION:
35 | checkpoints.moneropulse.net. 299 IN TXT "1288616:875ac1bc7aa6c5eedc5410abb9c694034f9e7f79dce4c60698baf37009cb6365"
36 | checkpoints.moneropulse.net. 299 IN TXT "375000:c80c23e387585e12ffb6649d678e9ba328181797b9583a6d8911b77e25375737"
37 | checkpoints.moneropulse.net. 299 IN TXT "325000:4260d56368267bc2a70dd58d73c5ecf23b4e4d96e63c29a868e4a679b0741c7f"
38 | checkpoints.moneropulse.net. 299 IN TXT "233000:4f69bec2af6c0852412bdd10c19e6af10c8d738fe2618b5511a98efd03ab477e"
39 | checkpoints.moneropulse.net. 299 IN TXT "450000:4d098b511ca97723e81737c448343cfd4e6dadb3d8a0e757c6e4d595e6e48357"
40 | checkpoints.moneropulse.net. 299 IN TXT "250000:f59d31839bd909ec8830b4f7f66ff213f0bd006334c8523daee452725e5c7a79"
41 | checkpoints.moneropulse.net. 299 IN TXT "550000:c2e80a636438bd9f7a7ab432a6ad297e35540d80ff5b868bca098124cad2ff8c"
42 | checkpoints.moneropulse.net. 299 IN TXT "650000:1d567f2b491324375a825895c5e7b52857b38e4fed0e42c40909c2d52240b4e0"
43 | checkpoints.moneropulse.net. 299 IN TXT "800000:2ced10aa85357ab6c14bb12b6b56d1dde28940820dda30911b73a5cc9a301760"
44 | checkpoints.moneropulse.net. 299 IN TXT "850000:00e2b557dde9fd4a9e2e3dd7ddac962f5ca475eb1095bc50aa757fd1218ab0a5"
45 | checkpoints.moneropulse.net. 299 IN TXT "900000:d9958d0e7dcf91a5a7b11de225927bf7efc6eb26240315ce12372be902cc1337"
46 | checkpoints.moneropulse.net. 299 IN TXT "913193:5292d5d56f6ba4de33a58d9a34d263e2cb3c6fee0aed2286fd4ac7f36d53c85f"
47 | checkpoints.moneropulse.net. 299 IN TXT "913269:f8302e6b8ba1c49aad9a854b8d6c79d8272c6239dcbba5a75ed0784c1d4f56a1"
48 | checkpoints.moneropulse.net. 299 IN TXT "350000:74da79f6a136969abd6364bd3d37af273c408d6471e8ab598e80569b42415f86"
49 | checkpoints.moneropulse.net. 299 IN TXT "400000:1b2b0e7a30e59691491529a3d506d1ba3d6052d0f6b52198b7330b28a6f1b6ac"
50 | checkpoints.moneropulse.net. 299 IN TXT "500000:2428f0dbe49796be05ed81b347f53e1f7f44aed0abf641446ec2b94cae066b02"
51 | checkpoints.moneropulse.net. 299 IN TXT "600000:f5828ebf7d7d1cb61762c4dfe3ccf4ecab2e1aad23e8113668d981713b7a54c5"
52 | checkpoints.moneropulse.net. 299 IN TXT "700000:12be9b3d210b93f574d2526abb9c1ab2a881b479131fd0d4f7dac93875f503cd"
53 | checkpoints.moneropulse.net. 299 IN TXT "300000:0c1cd46df6ccff90ec4ab493281f2583c344cd62216c427628990fe9db1bb8b6"
54 | checkpoints.moneropulse.net. 299 IN RRSIG TXT 13 3 300 20180922151845 20180920131845 35273 moneropulse.net. 8CyqtsM2f9o6OHZYqtGPVf+8gcFM+eUyoMi29LlkcLtK1AXbZlKqCcdN NvdvB+4OzepmpTanSc+TbLWbz/sIzA==
55 |
56 | Please note the DNSSEC signature entry at the end.
57 |
58 | The checkpoints are mirrored on several DNS servers:
59 |
60 | Mainnet:
61 |
62 | checkpoints.moneropulse.se
63 | checkpoints.moneropulse.org
64 | checkpoints.moneropulse.net
65 | checkpoints.moneropulse.co
66 |
67 | Stagenet:
68 |
69 | stagenetpoints.moneropulse.se
70 | stagenetpoints.moneropulse.org
71 | stagenetpoints.moneropulse.net
72 | stagenetpoints.moneropulse.co
73 |
74 | Testnet:
75 |
76 | testpoints.moneropulse.se
77 | testpoints.moneropulse.org
78 | testpoints.moneropulse.net
79 | testpoints.moneropulse.co
80 |
81 | ## MoneroPulse as attack vector
82 |
83 | It is worth noting that MoneroPulse does not produce blocks and cannot split the chain on its own. It only suggests the valid fork.
84 |
85 | Should MoneroPulse got entirely compromised, attacker could stop all auto-enforcing nodes from advancing, by feeding them with the fake checkpoint. This is partially mitigated by DNSSEC and by operating multiple domains. Monero expects checkpoints are consistent across domains. Thus, compromising a single domain or registrar should not lead to any disruption.
86 |
87 | MoneroPulse also increases the say of its operators in case of possible contentious hard forks. While well intended, this effectively centralizes more power in hands of core developers, or whomever is at the time running MoneroPulse infrastructure.
88 |
89 | ### Who are MoneroPulse operators?
90 |
91 | MoneroPulse is operated by selected core developers.
92 |
93 | ## Fixing "WARNING: no two valid MoneroPulse DNS checkpoint records were received"
94 |
95 | This means DNS server you are using does not ackonwledge the +dnssec flag necessary for securely query for checkpoints.
96 |
97 | By default, your operating system will use DNS server provided by your Internet Service Provider.
98 |
99 | To fix this warning, change your DNS server either system-wide in your network configuration, or specifically for `monerod`.
100 |
101 | Many people find Google's or Cloudflare's DNS servers superior to those offered by their ISPs.
102 |
103 | Using Google DNS:
104 |
105 | DNS_PUBLIC=tcp://8.8.8.8 ./monerod
106 |
107 | Using Cloudflare DNS:
108 |
109 | DNS_PUBLIC=tcp://1.1.1.1 ./monerod
110 |
111 |
112 | ## Reference
113 |
114 | * [StackExchange answer](https://monero.stackexchange.com/questions/679/what-is-moneropulse?noredirect=1&lq=1)
115 | * [Reddit answer](https://www.reddit.com/r/Monero/comments/419qdd/p2p4warning_no_two_valid_moneropulse_dns/)
116 | * [Monero source code](https://github.com/monero-project/monero/blob/ff7dc087ae5f7de162131cea9dbcf8eac7c126a1/src/checkpoints/checkpoints.cpp)
117 |
--------------------------------------------------------------------------------
/docs/infrastructure/networks.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Mainnet, Stagenet, Testnet
3 | ---
4 | # Networks
5 |
6 | Monero offers three separate networks and blockchains: **mainnet**, **stagenet** and **testnet**. Every blockchain has its own genesis block and is entirely seperate from others. Also, corresponding p2p networks are separate.
7 |
8 | ## Mainnet
9 |
10 | Mainnet is the "production" network and blockchain.
11 |
12 | Mainnet is the only blockchain where XMR units have value.
13 |
14 | Mainnet is what people mean by default.
15 |
16 | Default TCP ports (listening):
17 |
18 | * 18080 - p2p network
19 | * 18081 - JSON-RPC server
20 | * 18082 - ZMQ server
21 |
22 | ## Stagenet
23 |
24 | Stagenet is what you need to learn Monero safely.
25 |
26 | Stagenet is technically equivalent to mainnet, both in terms of features and consensus rules. Similar to mainnet, use the [latest official Monero release](https://getmonero.org/downloads/) to be compatible with stagenet.
27 |
28 | To get started:
29 |
30 | * Connect your GUI or CLI to stagenet open node **monero-stagenet.exan.tech:38081**
31 | * Get free stagenet XMR from [stagenet faucet](https://melo.tools/faucet/stagenet/) or [stagenet faucet 2](https://stagenet-faucet.xmr-tw.org/)
32 | * Check the [stagenet block explorer 1](https://stagenet.xmrchain.net/) or [stagenet block explorer 2](https://melo.tools/explorer/stagenet/)
33 |
34 | Default TCP ports (listening):
35 |
36 | * 38080 - p2p network
37 | * 38081 - JSON-RPC server
38 | * 38082 - ZMQ server
39 |
40 | Stagenet was introduced in March 2018 as part of Monero 0.12.0.0.
41 |
42 | ## Testnet
43 |
44 | As a normal user, use [stagenet](#stagenet) instead. Testnet is for developers.
45 |
46 | Testnet is the "experimental" network and blockchain where things get released long before mainnet.
47 |
48 | Testnet forks early and often. Most of the time you need to compile Monero from source to be compatible with testnet. Otherwise you will get stuck on the old not-forked version.
49 |
50 | To get started:
51 |
52 | * Build Monero from [source](https://github.com/monero-project/monero)
53 | * Connect your GUI or CLI to testnet open node **monero-testnet.exan.tech:28081**
54 | * Get free XMR from [testnet faucet](https://melo.tools/faucet/testnet/)
55 | * Check the [testnet block explorer 1](https://testnet.xmrchain.net/) or [testnet block explorer 2](https://melo.tools/explorer/testnet/)
56 |
57 | Default TCP ports (listening):
58 |
59 | * 28080 - p2p network
60 | * 28081 - JSON-RPC server
61 | * 28082 - ZMQ server
62 |
63 | ## Private Testnet
64 |
65 | You can also create your private version of the testnet.
66 |
67 | Private testnet gives more flexibility to arange for specific situations for developers.
68 |
69 | Check the [private testnet guide](https://github.com/moneroexamples/private-testnet).
70 |
71 | ## Why stagenet and testnet coins have no value?
72 |
73 | If mainnet and stagenet are technically equivalent then why only mainnet coins have value?
74 |
75 | This is simply the convention community embraced. Value only comes from a shared believe that mainnet coins will be accepted by other people in the future.
76 |
--------------------------------------------------------------------------------
/docs/infrastructure/tor-onion-p2p-seed-nodes.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Tor Onion Seed Nodes for Monero P2P Network
3 | ---
4 | # Tor onion seed nodes for Monero network
5 |
6 |
7 | ## When this is necessary?
8 |
9 | This is only necessary if you run a full node and you want to propagate locally-originating transactions over Tor (using `tx-proxy` option, see [monerod reference](/interacting/monerod-reference/#tori2p)). This allows you to mask your IP (as transaction originator) against P2P network surveillence, on top of Monero's built-in Dandelion++.
10 |
11 | ## What are P2P seed nodes?
12 |
13 | Your monero daemon will discover other P2P nodes but it needs to start somewhere. These starting nodes are known as "seed nodes". For clearnet the seed nodes are hardcoded in the software so no configuration is needed.
14 |
15 | For the Tor network there are no hardcoded seed nodes. You must specify them manually by using the `add-peer` option in `monero.conf`.
16 |
17 | ## Config snippet
18 |
19 | These were tested working as of 2020-01-11. They are ran by volunteers and are **not guaranteed** to work or be maintained. See below how you can quickly test them.
20 |
21 | ```
22 | # monero.conf snippet
23 | # ...
24 | add-peer=moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion:18080
25 | add-peer=monerozf6koypqrt.onion:18080
26 | add-peer=zbjkbsxc5munw3qusl7j2hpcmikhqocdf4pqhnhtpzw5nt5jrmofptid.onion:18083 # https://github.com/monero-project/monero/blob/master/src/p2p/net_node.inl
27 | add-peer=rno75kjcw3ein6i446sqby2xkyqjarb75oq36ah6c2mribyklzhurpyd.onion:28083 # it is mainnet despite the weird port
28 | add-peer=sqzrokz36lgkng2i2nlzgzns2ugcxqosflygsxbkybb4xn6gq3ouugqd.onion:18083 # very flaky, works 1 in 3 times
29 | add-peer=blzchctiibfjfvtukctsydhquucz2oajnxnfc5hh4ix35gyqjhdnaqqd.onion:18083 # full node by author of monerodocs.org
30 | # ...
31 | ```
32 |
33 | ## How to test onion seed nodes?
34 |
35 | You need Tor daemon installed and running on your laptop. You will also need `torsocks` command line tool that either comes with Tor or needs to be installed separately.
36 |
37 | ### Test using torsocks and telnet
38 |
39 | You need tor, torsocks and telnet installed.
40 |
41 | To test speficic onion:
42 |
43 | torsocks telnet moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion 18080
44 |
45 | The expected output (domain resolution errors are fine):
46 |
47 | ```
48 | 1610372702 ERROR torsocks[11332]: Unable to resolve. Status reply: 4 (in socks5_recv_resolve_reply() at socks5.c:677)
49 | Trying 127.42.42.0...
50 | Connected to moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion.
51 | Escape character is '^]'.
52 | ```
53 |
54 | ### Test using torsocks and proxychains
55 |
56 | You need tor, torsocks and proxychains installed.
57 |
58 | To test specific onion:
59 |
60 | proxychains nmap -Pn -p 18080 moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion
61 |
62 | The expected output (example):
63 |
64 | ````
65 | [proxychains] Strict chain ... 127.0.0.1:9050 ... moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion:18080 ... OK
66 | Nmap scan report for moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion (224.0.0.1)
67 | Host is up (0.74s latency).
68 | rDNS record for 224.0.0.1: all-systems.mcast.net
69 |
70 | PORT STATE SERVICE
71 | 18080/tcp open unknown
72 | ````
73 |
74 | ## Not enough onion seed nodes
75 |
76 | The onion seed nodes are a scarce resource. Most nodes are only maintained temporarily by their authors.
77 |
78 | You can greatly contribute to Monero P2P network performance and resillience by running onion-enabled monero full node.
79 |
--------------------------------------------------------------------------------
/docs/interacting/download-monero-binaries.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Download Monero
3 | ---
4 | # Download Monero
5 |
6 | A single archive contains all you need to start using Monero (the full node and the wallet).
7 |
8 | We recommend downloading Monero binaries directly from GitHub:
9 |
10 | * GUI + CLI: [https://github.com/monero-project/monero-gui/releases](https://github.com/monero-project/monero-gui/releases)
11 | * CLI only: [https://github.com/monero-project/monero/releases](https://github.com/monero-project/monero/releases)
12 |
13 | GUI is a graphical desktop wallet.
14 |
15 | CLI is a commandline desktop wallet.
16 |
17 | If you need more guidance check [download Monero](https://getmonero.org/downloads) section on Monero website.
18 |
19 | It is critical to [verify the signature](/interacting/verify-monero-binaries) of downloaded archive.
20 |
21 | ## Which version to download?
22 |
23 | Download the latest version matching your operating system and processor architecture.
24 |
25 | The CLI version is released earlier and is suitable for server deployments.
26 |
27 | The GUI version contains both CLI and GUI. It is preferable for end-users.
28 |
29 | All versions contain a full node and a wallet.
30 |
31 | ## Why prefer GitHub over getmonero.org?
32 |
33 | Binaries appear earlier on GitHub.
34 |
35 | On top of that, if you fail to properly verify the signature, GitHub is safer, simply because you don't need to trust a separate website to not be compromised.
36 | Obviously, you should still carefully verify the signature for each release. Signature verification is always the primary line of defense.
37 |
--------------------------------------------------------------------------------
/docs/interacting/monero-blockchain-export-reference.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: monero-blockchain-export - Reference
3 | ---
4 | # `monero-blockchain-export` - Reference
5 |
6 | !!! note
7 | Nowadays, there is little usage for raw blockchain export / import. In the past the p2p blockchain download was much slower. Back than blockchain.raw file was used to speed up the process of bootstrapping a node.
8 |
9 | ## Overview
10 |
11 | The tool dumps local blockchain to raw format, known as the `blockchain.raw` file.
12 |
13 | This could be useful if you want to process blockchain efficiently with your custom tools,
14 | as the raw format is probably easier to work with than Monero's custom lmdb database.
15 |
16 | The tool works on your local copy of the blockchain. It does not require `monerod` running.
17 |
18 | ## Syntax
19 |
20 | `./monero-blockchain-export [options]`
21 |
22 | Example:
23 |
24 | `./monero-blockchain-export --help`
25 |
26 | ## Running
27 |
28 | Go to directory where you unpacked Monero.
29 |
30 | `./monero-blockchain-export --stagenet --output-file=/tmp/blockchain.raw`
31 |
32 |
33 | ## Options
34 |
35 | ### Help
36 |
37 | | Option | Description
38 | |---------------------|--------------------------------------------------------------------------------------------------------------------------------------
39 | | `--help` | Enlist available options.
40 |
41 | ### Pick network
42 |
43 | | Option | Description
44 | |---------------------|--------------------------------------------------------------------------------------------------------------------------------------
45 | | (missing) | By default `monero-blockchain-export` assumes [mainnet](/infrastructure/networks#mainnet).
46 | | `--stagenet` | Export [stagenet](/infrastructure/networks#stagenet) blockchain.
47 | | `--testnet` | Export [testnet](/infrastructure/networks#testnet) blockchain.
48 |
49 | ### Logging
50 |
51 | Specifying the log file path is not supported.
52 |
53 | | Option | Description
54 | |---------------------|--------------------------------------------------------------------------------------------------------------------------------------
55 | | `--log-level` | `0-4` with `0` being minimal logging and `4` being full tracing. Defaults to `0`. These are general presets and do not directly map to severity levels. For example, even with minimal `0`, you may see some most important `INFO` entries. Example:
`./monero-blockchain-export --log-level=1`
56 |
57 | ### Input
58 |
59 | | Option | Description
60 | |----------------------------|--------------------------------------------------------------------------------------------------------------------------------------
61 | | `--data-dir` | Full path to data directory. This is where the blockchain, log files, and p2p network memory are stored. For defaults and details see [data directory](/interacting/overview/#data-directory).
62 | | `--database`, `--db-type` | The default and only valid value is `lmdb`.
63 |
64 | ### Output
65 |
66 | | Option | Description
67 | |---------------------|--------------------------------------------------------------------------------------------------------------------------------------
68 | | `--output-file` | Specify output file path. The default is `$DATA_DIR/export/blockchain.raw`. Example:
`./monero-blockchain-export --output-file=/tmp/blockchain.raw`
69 | | `--blocksdat` | Output in blocks.dat format.
70 | | `--block-stop` | Only export up to this block number. By default do the full export (value `0`).
71 |
72 | ## Reference
73 |
74 | * [https://github.com/monero-project/monero/tree/master/src/blockchain_utilities](https://github.com/monero-project/monero/tree/master/src/blockchain_utilities)
75 |
--------------------------------------------------------------------------------
/docs/interacting/monero-blockchain-import-reference.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: monero-blockchain-import - Reference
3 | ---
4 | # `monero-blockchain-import` - Reference
5 |
6 | !!! note
7 | Nowadays, there is little usage for raw blockchain export / import. In the past the p2p blockchain download was much slower. Back than blockchain.raw file was used to speed up download process of bootstrapping a node.
8 |
9 | ## Overview
10 |
11 | The tool imports bootstrap file `blockchain.raw` to your full node.
12 |
13 | This could be useful if you want to decouple download from verification for any reason (like testing performance in isolation).
14 | In this case, you may download the `blockchain.raw` file from [https://downloads.getmonero.org/blockchain.raw](https://downloads.getmonero.org/blockchain.raw).
15 |
16 | Ideally though, you should use your own trusted `blockchain.raw` file that you [exported](/interacting/monero-blockchain-export-reference) earlier.
17 |
18 | Please note that importing `blockchain.raw` will **not** speed up the process over syncing up from p2p network.
19 | This is because usual bottlenecks are disk IO and verification, not the download.
20 |
21 | The tool works on your local files. It does not require `monerod` running.
22 |
23 | ## Syntax
24 |
25 | `./monero-blockchain-import [options]`
26 |
27 | Example:
28 |
29 | `./monero-blockchain-import --help`
30 |
31 | ## Running
32 |
33 | Go to directory where you unpacked Monero.
34 |
35 | `./monero-blockchain-import --stagenet --output-file=/tmp/blockchain.raw`
36 |
37 |
38 | ## Options
39 |
40 | ### Help
41 |
42 | | Option | Description
43 | |---------------------|--------------------------------------------------------------------------------------------------------------------------------------
44 | | `--help` | Enlist available options.
45 |
46 | ### Pick network
47 |
48 | | Option | Description
49 | |---------------------|--------------------------------------------------------------------------------------------------------------------------------------
50 | | (missing) | By default `monero-blockchain-import` assumes the [mainnet](/infrastructure/networks#mainnet) blockchain.
51 | | `--stagenet` | Import [stagenet](/infrastructure/networks#stagenet) blockchain.
52 | | `--testnet` | Import [testnet](/infrastructure/networks#testnet) blockchain.
53 |
54 | ### Logging
55 |
56 | Specifying the log file path is not supported.
57 |
58 | | Option | Description
59 | |---------------------|--------------------------------------------------------------------------------------------------------------------------------------
60 | | `--log-level` | `0-4` with `0` being minimal logging and `4` being full tracing. Defaults to `0`. These are general presets and do not directly map to severity levels. For example, even with minimal `0`, you may see some most important `INFO` entries. Example:
`./monero-blockchain-import --log-level=1`
61 |
62 | ### Input
63 |
64 | | Option | Description
65 | |---------------------|--------------------------------------------------------------------------------------------------------------------------------------
66 | | `--input-file` | Full path to raw blockchain file. The default is `$DATA_DIR/export/blockchain.raw`.
67 | | `--block-stop` | Only import up to this block height. By default import all blocks (value `0`).
68 | | `--pop-blocks` | Discard specified number of blocks from the tip of the bootstrapped blockchain. By default don't discard anything (value `0`).
69 |
70 | ### Output
71 |
72 | | Option | Description
73 | |---------------------|--------------------------------------------------------------------------------------------------------------------------------------
74 | | `--data-dir` | Full path to data directory. This is where the blockchain, log files, and p2p network memory are stored. For defaults and details see [data directory](/interacting/overview/#data-directory).
75 | | `--count-blocks` | Count blocks in the bootstrap file and exit.
76 | | `--drop-hard-fork` | Whether to drop hard fork data. Off by default (`0`).
77 | | `--database` | The only valid value seems to be `lmdb` (the default).
78 |
79 | ### Performance
80 |
81 | | Option | Description
82 | |-----------------------------------|--------------------------------------------------------------------------------------------------------------------------------------
83 | | `--dangerous-unverified-import` | The safe default is to run verification (value `0`). You can enable `--dangerous-unverified-import` if you are importing from your own and trusted blockchain.raw (which we assume was already verified). The "dangerous" mode will greatly speed up the process.
84 | | `--batch` | Whether to save to disk on an ongoing basis (the default, value `1`) or maybe do everything in RAM and save everything in the end (value `0`). No batching is only effective in combination with no verification (`--dangerous-unverified-import`). See also `--batch-size`.
85 | | `--batch-size` | How often to save to disk expressed in number of blocks. By default save every `5000` blocks (when verifying) or every `20000` blocks (when not verifying). Big batches are faster but require more RAM.
86 | | `--resume` | Resume from current height if output database already exists (the default, value `1`). Changing to `--resume=0` doesn't change much — existing blocks are skipped pretty quickly and the process is resumed anyway.
87 |
88 | ## Reference
89 |
90 | * [https://github.com/monero-project/monero/tree/master/src/blockchain_utilities](https://github.com/monero-project/monero/tree/master/src/blockchain_utilities)
91 |
--------------------------------------------------------------------------------
/docs/interacting/monero-config-file.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Monero Configuration File
3 | ---
4 | # Monero Configuration File
5 |
6 | ## Applicability
7 |
8 | By default Monero looks for `bitmonero.conf` in Monero [data directory](/interacting/overview/#data-directory).
9 |
10 | To use a specific config file add `--config-file` option:
11 |
12 | `./monerod --config-file=/etc/monerod.conf`
13 |
14 | The `--config-file` option is available for:
15 |
16 | * `monerod`
17 | * `monero-wallet-cli`
18 | * `monero-wallet-rpc`
19 | * `monero-gen-trusted-multisig`
20 |
21 | ## Syntax
22 |
23 | * `option-name=value`
24 | * `valueless-option-name=1` for options that don't expect value
25 | * `# comment`
26 | * whitespace is ignored
27 |
28 | ## Reference
29 |
30 | All configuration options are the same as command line options for the binary.
31 |
32 | * [monerod reference](/interacting/monerod-reference)
33 | * [monero-wallet-cli reference](/interacting/monero-wallet-cli-reference)
34 | * [monero-wallet-rpc reference](/interacting/monero-wallet-rpc-reference)
35 |
36 | Skip the `--` from `--option-name`.
37 |
38 | Example:
39 |
40 | `./monerod --log-level=4 --stagenet`
41 |
42 | translates to:
43 |
44 | log-level=4
45 | stagenet=1 # use value "1" to enable the value-less options like --stagenet
46 |
47 | ## Examples
48 |
49 | ### `monerod.conf`
50 |
51 | This config is tailored for production server usage.
52 |
53 | # /etc/monero/monerod.conf
54 |
55 | # Data directory (blockchain db and indices)
56 | data-dir=/home/monero/.monero # Remember to create the monero user first
57 |
58 | # Log file
59 | log-file=/var/log/monero/monerod.log
60 | max-log-file-size=0 # Prevent monerod from managing the log files; we want logrotate to take care of that
61 |
62 | # P2P full node
63 | p2p-bind-ip=0.0.0.0 # Bind to all interfaces (the default)
64 | p2p-bind-port=18080 # Bind to default port
65 |
66 | # RPC open node
67 | rpc-bind-ip=0.0.0.0 # Bind to all interfaces
68 | rpc-bind-port=18081 # Bind on default port
69 | confirm-external-bind=1 # Open node (confirm)
70 | restricted-rpc=1 # Prevent unsafe RPC calls
71 | no-igd=1 # Disable UPnP port mapping
72 |
73 | # Slow but reliable db writes
74 | db-sync-mode=safe
75 |
76 | # Emergency checkpoints set by MoneroPulse operators will be enforced to workaround potential consensus bugs
77 | # Check https://monerodocs.org/infrastructure/monero-pulse/ for explanation and trade-offs
78 | enforce-dns-checkpointing=1
79 |
80 | out-peers=64 # This will enable much faster sync and tx awareness; the default 8 is suboptimal nowadays
81 | in-peers=1024 # The default is unlimited; we prefer to put a cap on this
82 |
83 | limit-rate-up=1048576 # 1048576 kB/s == 1GB/s; a raise from default 2048 kB/s; contribute more to p2p network
84 | limit-rate-down=1048576 # 1048576 kB/s == 1GB/s; a raise from default 8192 kB/s; allow for faster initial sync
85 |
86 | ### `monero-wallet-cli.conf`
87 |
88 | This config is tailored for desktop usage on [stagenet](/infrastructure/networks).
89 |
90 | # $HOME/.bitmonero/stagenet/monero-wallet-cli.conf
91 |
92 | # Pick network
93 | stagenet=1
94 |
95 | # Connect to a remote full node
96 | daemon-address=monero-stagenet.exan.tech:38081
97 | untrusted-daemon=1
98 |
99 | # Log file
100 | log-file=/tmp/monero-wallet-cli.log
101 |
102 | # wallet-file=/home/YOUR-USER/.bitmonero/stagenet/wallets/MoneroExampleStagenetWallet
103 |
--------------------------------------------------------------------------------
/docs/interacting/monero-wallet-gui-reference.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: monero-wallet-gui - Reference
3 | ---
4 | # `monero-wallet-gui` - Reference
5 |
6 | ## Overview
7 |
8 | ### Desktop GUI wallet
9 |
10 | The "official" desktop wallet for Monero. Available for Linux, macOS and Windows.
11 |
12 | Wallet uses your private keys to understand your total balance,
13 | transactions history, and to facilitate creating transactions.
14 |
15 | However, wallet does not store the blockchain and does not directly participate in the p2p network.
16 |
17 | ### Depends on the full node
18 |
19 | Wallet connects to a [full node](/interacting/monerod-reference) to scan the blockchain for your transaction outputs and to send your transactions out to the network.
20 |
21 | The full node can be either local (same computer) or remote.
22 |
23 | Normally, you run the full node on the same computer as wallet (or within your home network).
24 |
25 | Connection happens over HTTP and uses [this API](https://www.getmonero.org/resources/developer-guides/wallet-rpc.html).
26 |
27 | Any transaction leaving the wallet is already blinded by all Monero privacy features.
28 | This means plain text HTTP communication isn't an issue on its own even if you connect to a remote node.
29 |
30 | However, connecting to a remote node has other nuanced trade-offs, which is a topic for a separate article.
31 |
32 | ### User guide PDF
33 |
34 | A nice PDF guide is available in the catalog you unpacked Monero. Make sure to check it out!
35 |
36 | The online living version is also available:
37 | [https://github.com/monero-ecosystem/monero-GUI-guide/blob/master/monero-GUI-guide.md](https://github.com/monero-ecosystem/monero-GUI-guide/blob/master/monero-GUI-guide.md)
38 |
39 | ## Syntax
40 |
41 | `./monero-wallet-gui [options]`
42 |
43 | Example:
44 |
45 | `./monero-wallet-gui --log-file=/dev/null`
46 |
47 | ## Running
48 |
49 | Go to directory where you unpacked Monero.
50 |
51 | Run the full node and wait until it syncs up with the network (may take up to a few days):
52 |
53 | `./monerod`
54 |
55 | In a separate terminal window, run the wallet:
56 |
57 | `./monero-wallet-gui`
58 |
59 | ## Options
60 |
61 | There are very few options because everything is set up via a GUI.
62 |
63 | | Option | Description
64 | |---------------------|--------------------------------------------------------------------------------------------------------------------------------------
65 | | `--help` | Enlists available options.
66 | | `--log-file` | Full path to the log file. Example (mind file permissions):
`./monerod --log-file=/var/log/monero/mainnet/monerod.log`
67 |
68 | ## Defaults
69 |
70 | The wallet is created in `$HOME/Monero/wallets/`.
71 | You may want to change it to `$HOME/.bitmonero/wallets/` to have all Monero related files in one place.
72 | This is possible on wallet creation wizard in the GUI.
73 |
74 | The log file is created directly in the home directory `$HOME/monero-wallet-gui.log`.
75 | You may want to change with `--log-file=$HOME/.bitmonero/monero-wallet-gui.log` option.
76 |
--------------------------------------------------------------------------------
/docs/interacting/overview.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Interacting with Monero
3 | ---
4 | # Interacting with Monero
5 |
6 | You can interact with Monero via desktop GUI, commandline interface, and programming API.
7 |
8 | On top of that, Monero nodes interact with each other in a peer-to-peer network.
9 |
10 | ## Installation directory overview
11 |
12 | Once unpacked you will see several executable files. You will also find a nice PDF guide for the GUI wallet.
13 |
14 | Monero project nicely decouples network node logic from wallet logic.
15 | Wallet logic is offered through three independent user interfaces - the GUI, the CLI, and the HTTP API.
16 |
17 | ```
18 | # cd monero-gui-v0.17.1.9
19 |
20 | # ---- guide to Monero GUI ----
21 |
22 | monero-gui-wallet-guide.pdf
23 |
24 | # ---- main executable files -----------
25 |
26 | monerod
27 | monero-wallet-gui
28 |
29 | # ---- extra executable files -----------
30 |
31 | extras/monero-wallet-cli
32 | extras/monero-wallet-rpc
33 |
34 | extras/monero-blockchain-prune
35 | extras/monero-gen-trusted-multisig
36 | extras/monero-gen-ssl-cert
37 |
38 | extras/monero-blockchain-export
39 | extras/monero-blockchain-import
40 |
41 | # ---- don't bother with these ----------
42 |
43 | extras/monero-blockchain-stats
44 | extras/monero-blockchain-mark-spent-outputs
45 | extras/monero-blockchain-prune-known-spent-data
46 | extras/monero-blockchain-usage
47 | extras/monero-blockchain-ancestry
48 | extras/monero-blockchain-depth
49 | ```
50 |
51 | ## Executables
52 |
53 | | Executable | Description
54 | | -------------------------- |:-----------------------------------------------------------------------------------------------------------------------------------
55 | | `monerod` | The full node daemon. Does not require a wallet.
[Documentation](/interacting/monerod-reference/).
56 | | `monero-wallet-gui` | Wallet logic and __graphical__ user interface.
Requires `monerod` running.
57 | | `monero-wallet-cli` | Wallet logic and __commandline__ user interface.
Requires `monerod` running.
58 | | `monero-wallet-rpc` | Wallet logic and __HTTP API__ (JSON-RPC protocol).
Requires `monerod` running.
59 | | `monero-blockchain-prune` | Prune existing local blockchain. This saves 2/3 of disk space (down to 31GB as of Jan 2021). This is preferable over `monerod --prune-blockchain` which only logically releases space inside the file while the file remains large. The `monero-blockchain-prune` creates a shrinked copy of the blockchain file. See [tutorial1](https://monero.stackexchange.com/questions/11454/how-do-i-utilize-blockchain-pruning-in-the-gui-monero-wallet-gui), [tutorial2](https://www.publish0x.com/solareclipse/howto-prune-shrink-the-database-of-the-monero-blockchain-on-xpgwjx).
60 | | `monero-gen-ssl-cert` | Generate 4096 bit RSA private key and self signed TLS certificate for use with `monerod` RPC interface. Note, Monero daemon automatically generates TLS certificate on each restart. Manual generation with this tool is only useful if you want to pin TLS certificate fingerprint in your monero wallet. See the [pull request](https://github.com/monero-project/monero/pull/5495).
61 | | `monero-gen-trusted-multisig` | Tool to generate a set of multisig wallets.
See chapter on [multisignatures](/multisignature).
62 | | `monero-blockchain-export` | Tool to export blockchain to `blockchain.raw` file.
63 | | `monero-blockchain-import` | Tool to import [blockchain.raw](https://downloads.getmonero.org/blockchain.raw) - ideally your own trusted copy.
64 |
65 | ## Executables - legacy
66 |
67 | You most likely should not bother with these legacy or very specialized tools.
68 |
69 | | Executable | Description
70 | | -------------------------- |:-----------------------------------------------------------------------------------------------------------------------------------
71 | | `monero-blockchain-stats` | Generate stats like tx/day, blocks/day, bytes/day based on your local blockchain.
72 | | `monero-blockchain-mark-spent-outputs` | Advanced tool to mitigate potential privacy issues related to Monero forks. You normally shouldn't be concerned with that.
See the [commit](https://github.com/monero-project/monero/commit/df6fad4c627b99a5c3e2b91b69a0a1cc77c4be14#diff-0410fba131d9a7024ed4dcf9fb4a4e07) and [pull request](https://github.com/monero-project/monero/pull/3322).
73 | | `monero-blockchain-prune-known-spent-data` | Previous limited pruning tool to prune select "known spent" transaction outputs (from the before RCT era). Nowadays prefer `monero-blockchain-prune`. This only saves ~200 MB. See the [commit](https://github.com/monero-project/monero/commit/d855f9bb92dbfab707a0e37505906366de818a14).
74 | | `monero-blockchain-usage` | Advanced tool to mitigate potential privacy issues related to Monero forks. You normally shouldn't be concerned with that.
See the [commit](https://github.com/monero-project/monero/commit/0590f62ab64cf023d397b995072035986931a6b4) and the [pull request](https://github.com/monero-project/monero/pull/3322).
75 | | `monero-blockchain-ancestry` | Advanced research tool to learn ancestors of a transaction, block or chain. Irrelevant for normal users. See this [pull request](https://github.com/monero-project/monero/pull/4147/files).
76 | | `monero-blockchain-depth` | Advanced research tool to learn depth of a transaction, block or chain. Irrelevant for normal users. See this [commit](https://github.com/monero-project/monero/commit/289880d82d3cb206a2cf4ae67d2deacdab43d4f4#diff-34abcc1a0c100efb273bf36fb95ebfa0).
77 |
78 |
79 | ## Interacting
80 |
81 | There are quite a few ways you can interact with Monero software.
82 | Perhaps the most surprising for newcomers is that `monerod` daemon accepts interactive keyboard commands while it is running.
83 |
84 | Also, please note that HTTP API is split across `monerod` and `monero-wallet-rpc`. You need to run and call both daemons to explore the full API.
85 | This follows the node-logic vs wallet-logic split mentioned earlier.
86 |
87 | All wallet implementations depend on the `monerod` running.
88 |
89 | | Executable | p2p network | node commands via keyboard | node HTTP API | wallet commands via keyboard | wallet HTTP API | wallet via GUI
90 | | -------------------------- | ------------------- | -------------------------- | ------------- | ---------------------------- | --------------- | --------------
91 | | `monerod` | ✔ | ✔ | ✔ | | |
92 | | `monero-wallet-cli` | | | | ✔ | |
93 | | `monero-wallet-rpc` | | | | | ✔ |
94 | | `monero-wallet-gui` | | | | | | ✔
95 |
96 | ## Data directory
97 |
98 | This is where the blockchain, log files, and p2p network memory are stored.
99 |
100 | By default data directory is at:
101 |
102 | * `$HOME/.bitmonero/` on Linux and macOS
103 | * `C:\ProgramData\bitmonero\` on Windows
104 |
105 | Please mind:
106 |
107 | * data directory is hidden as per OS convention
108 | * the `bitmonero` directory name is historical artefact from before Monero forked away from Bitmonero, about 2000 years Before Christ
109 |
110 | Data directory contains:
111 |
112 | * `lmdb/` - the blockchain database directory
113 | * `p2pstate.bin` - saved memory of discovered and rated peers
114 | * `bitmonero.log` - log file
115 |
116 | It can also contain subdirectories for stagenet and testnet, mirroring the same structure:
117 |
118 | * `stagenet/` - data directory for Stagenet
119 | * `testnet/` - data directory for Testnet
120 |
--------------------------------------------------------------------------------
/docs/interacting/verify-monero-binaries.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Verifying Monero Binaries Signature
3 | ---
4 | # Verify Monero Binaries
5 |
6 | Verification must be carried on **before extracting the archive and before using Monero**.
7 |
8 | Instructions were tested on Linux. They should also work on macOS with slight modifications.
9 |
10 | ## 1. Import lead maintainer PGP key
11 |
12 | This is a one time action. Skip this step for subsequent Monero releases.
13 |
14 | Monero core developers sign a list of hashes of released binaries.
15 |
16 | BinaryFate is Monero core developer who signs the releases.
17 | His public key is available on GitHub in the project source code.
18 | Import binaryFate's public key to your keyring:
19 |
20 | `curl https://raw.githubusercontent.com/monero-project/monero/master/utils/gpg_keys/binaryfate.asc | gpg --import`
21 |
22 | Trust binaryFate's public key (fingerprint must be exactly this):
23 |
24 | gpg --edit-key '81AC591FE9C4B65C5806AFC3F0AF4D462A0BDF92'
25 | trust
26 | 4
27 |
28 | !!! danger
29 | If key with this fingerprint was not found then remove imported key immediately (gpg --delete-keys ...).
30 | That would mean the key changed (likely was compromised).
31 |
32 | ## 2. Verify signature of hash list (hashes.txt)
33 |
34 | The list of binaries and their hashes is published on [getmonero.org](https://www.getmonero.org/downloads/hashes.txt) and a few other places like release notes on [r/monero](https://reddit.com/r/monero).
35 | Please note the publication channel does not matter as long as you properly verify the signature! u
36 |
37 | To verify these are real hashes (not tampered with) run:
38 |
39 | `curl https://www.getmonero.org/downloads/hashes.txt | gpg --verify`
40 |
41 | The expected output should contain the line:
42 |
43 | `gpg: Good signature from "binaryFate "`
44 |
45 | ## 3. Verify the hash
46 |
47 | By this step we checked that published hashes were not tampered with.
48 |
49 | The last step is to compare published hash with downloaded archive SHA-256 hash.
50 |
51 | [Download Monero](/interacting/download-monero-binaries) if you didn't already (but do not unpack).
52 |
53 | Replace the example file name with actual one:
54 |
55 | file_name=monero-gui-linux-x64-v0.17.1.9.tar.bz2
56 |
57 | file_hash=`sha256sum $file_name | cut -c 1-64`
58 |
59 | curl https://www.getmonero.org/downloads/hashes.txt > /tmp/reference-hashes.txt
60 |
61 | # verify the signature (previous step is repeated here for completeness)
62 | gpg --verify /tmp/reference-hashes.txt
63 |
64 | # grep must print the hash (output cannot be empty)
65 | grep $file_hash /tmp/reference-hashes.txt
66 |
67 | !!! danger
68 | If the grep output is empty then double check everything because apparently the hashes don't match.
69 |
70 | If grep printed filename and hash then everything is alright!
71 |
--------------------------------------------------------------------------------
/docs/overrides.css:
--------------------------------------------------------------------------------
1 |
2 | /* Make reference options non-wrapping */
3 | article .md-typeset__table td:nth-child(1) {
4 | white-space: nowrap;
5 | }
6 |
7 | /* Make reference tables occupying full width */
8 | article .md-typeset__table {
9 | width: 100%;
10 | }
11 |
12 | :root {
13 | --md-primary-fg-color: #121212;
14 | }
15 |
16 | [data-md-color-scheme="default"] {
17 | --md-typeset-a-color: #4051b5;
18 | }
19 |
20 |
21 | [data-md-color-scheme="slate"] {
22 | --md-hue: 232;
23 | --md-default-bg-color: #121212;
24 | --md-footer-bg-color: #181818;
25 | --md-footer-bg-color--dark: #181818;
26 | --md-typeset-a-color: #FF6600;
27 | --md-code-bg-color: #191919;
28 | }
29 |
--------------------------------------------------------------------------------
/docs/proof-of-work/cryptonight.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: CryptoNight
3 | ---
4 | # CryptoNight
5 |
6 | > CryptoNight is a memory hard hash function
7 |
8 | ## Background
9 |
10 | CryptoNight was originally designed around 2013 as part of the CryptoNote suite.
11 |
12 | One design goal was to make it very friendly for the off-the-shelf CPU-s, by employing:
13 |
14 | * native AES encryption
15 | * fast 64 bit multipliers
16 | * scratchpad fitting exactly the size of the per-core L3 cache on Intel CPUs (about 2MB)
17 |
18 | More ambitious design goal was to make it inefficiently computable on ASIC-s.
19 | This goal has since failed, as it inevitably happens with "ASIC hard" algorithms.
20 | Efficient CryptoNight ASIC was developed in 2017 by Bitmain.
21 |
22 | Monero inherited CryptoNight as its proof of work in 2014.
23 | Since then Monero slightly evolved the algorithm to intentionally break compatibility with released ASIC-s. Three used variants existed: Cryptonightv1, Cryptonightv2 and [Cryptonight-R](https://github.com/SChernykh/CryptonightR).
24 | **Monero no longer uses CryptoNight or any variant. Monero changed its mining algorithm to [RandomX](/proof-of-work/random-x) in November 2019.**
25 |
26 | ## The goal is to find small-enough hash
27 |
28 | In hashing based PoW algorithms the goal is to find small-enough hash.
29 |
30 | Hash is simply an integer (normally, a very large integer).
31 | Most hashing functions result in 256-bit hashes (integers between 0 and 2^256).
32 | This includes Bitcoin's double-SHA-256 and Monero's CryptoNight.
33 |
34 | Miner randomly tweaks input data until the hash fits under specified threshold.
35 | The threshold (also a large integer) is established collectively by the network as part of the consensus mechanism.
36 | The PoW is only considered valid (solved) if hash fits under the threshold.
37 |
38 | Because hash functions are one-way, it is not possible to analytically calculate input data that would result in a small-enough hash.
39 | The solution must be brute-forced by tweaking the input data and recalculating the hash over and over again.
40 |
41 | Miners have a few areas of flexibility regarding input data - most importantly they can iterate with the nonce value.
42 | They also have a power over which transactions are included in the block and how they are put together in a merkle tree.
43 |
44 | ## Cryptographic primitives
45 |
46 | CryptoNight is based on:
47 |
48 | * AES encryption
49 | * 5 hashing functions, all of which were finalists in NIST SHA-3 competition:
50 | * Keccak (the primary one)
51 | * BLAKE
52 | * Groestl
53 | * JH
54 | * Skein
55 |
56 | ## Input data
57 |
58 | In Monero the input to hashing function is concatenation of:
59 |
60 | * serialized block header (around 46 bytes; subject to varint representation)
61 | * merkle tree root (32 bytes)
62 | * number of transactions included in the block (around 1-2 bytes; subject to varint representation)
63 |
64 | See [get_block_hashing_blob()](https://github.com/monero-project/monero/blob/master/src/cryptonote_basic/cryptonote_format_utils.cpp#L1078) function to dig further.
65 |
66 | ## Algorithm
67 |
68 | !!! warning
69 | The article attempts to give reader a high-level understanding of the CryptoNight algorithm.
70 | For implementation details refer to CryptoNote Standard and Monero source code.
71 | See references at the bottom.
72 |
73 | ### Overview
74 |
75 | CryptoNight attempts to make memory access a bottleneck for performance ("memory hardness"). It has three steps:
76 |
77 | 1. Initialize large area of memory with pseudo-random data. This memory is known as the scratchpad.
78 | 2. Perform numerous read/write operations at pseudo-random (but deterministic) addresses on the scratchpad.
79 | 3. Hash the entire scratchpad to produce the resulting value.
80 |
81 | ### Step 1: scratchpad initialization
82 |
83 | Firstly, the input data is hashed with Keccak-1600. This results in 200 bytes of pseudorandom data (1600 bits == 200 bytes).
84 |
85 | These 200 bytes become a seed to generate a larger, 2MB-wide buffer of pseudorandom data,
86 | by applying AES-256 encryption.
87 |
88 | The first 0..31 bytes of Keccak-1600 hash are used as AES key.
89 |
90 | The encryption is performed on 128 bytes-long payloads until 2MB is ready.
91 | The first payload are Keccak-1600 bytes 66..191.
92 | The next payload is encryption result of the previous payload.
93 |
94 | Each 128-byte payload is actually encrypted 10 times.
95 |
96 | The details are a bit more nuanced, see "Scratchpad Initialization" in [CryptoNote Standard](https://cryptonote.org/cns/cns008.txt).
97 |
98 | ### Step 2: memory-hard loop
99 |
100 | The second step is basically 524288 iterations of a simple stateful algorithm.
101 |
102 | Each algorithm iteration reads from and writes back to the scratchpad,
103 | at pseudorandom-but-deterministic locations.
104 |
105 | Critically, next iteration depends on the state prepared by previous iterations.
106 | It is not possible to directly calculate state of future iterations.
107 |
108 | The specific operations include AES, XOR, 8byte_mul, 8byte_add - operations that are CPU-friendly (highly optimized on modern CPU-s).
109 |
110 | The goal here is to make memory latency the bottleneck in attempt to close the gap between potential ASIC-s and general purpose CPU-s.
111 |
112 | ### Step 3: hashing
113 |
114 | The final step (simplifying) is to:
115 |
116 | * combine original Keccak-1600 output with the whole scratchpad
117 | * pick the hashing algorithm based on 2 low-order bits of the result
118 | * 0=BLAKE-256
119 | * 1=Groestl-256
120 | * 2=JH-256
121 | * 3=Skein-256
122 | * hash the result with selected function
123 |
124 | The resulting 256-bit hash is the final output of CryptoNight algorithm.
125 |
126 | ## Monero specific modifications
127 |
128 | ### CryptoNight v0
129 |
130 | This is how Monero community refers to original implementation of CryptoNight.
131 |
132 | ### CryptoNight v1
133 |
134 | See the [source code diff](https://github.com/monero-project/monero/pull/3253/files).
135 |
136 | ### CryptoNight v2
137 |
138 | See the [rationale](https://github.com/SChernykh/xmr-stak-cpu/blob/master/README.md) and the [source code diff](https://github.com/monero-project/monero/commit/5fd83c13fbf8dc304909345e60a853c15b0de1e5#diff-7000dc02c792439471da62856f839d62).
139 |
140 | ### CryptoNight v3 aka CryptoNightR
141 |
142 | See the [rationale](https://github.com/monero-project/monero/pull/5126) and the [source code diff](https://github.com/monero-project/monero/pull/5126/files).
143 |
144 | ## Critique
145 |
146 | * CryptoNight hash is relatively expensive to verify. This poses a risk of DoS-ing nodes with incorrect proofs to process. See [strong asymmetry](/proof-of-work/what-is-pow/#strong-asymmetry) requirement.
147 | * The hash function was designed from scratch with limited peer review. While CryptoNight is composed of proven and peer-reviewed primitives, combining secure primitives doesn't necessarily result in a secure cryptosystem.
148 | * CryptoNight ultimately failed to prevent ASIC-s.
149 | * Complexity of CryptoNight kills competition in ASIC manufacturing.
150 |
151 | CryptoNight proof of work remains one of the most controversial aspect of Monero.
152 |
153 | ## Reference
154 |
155 | * [CryptoNight hash function](https://cryptonote.org/cns/cns008.txt) description in the CryptoNote Standard
156 | * [CryptoNight v2 source code](https://github.com/monero-project/monero/blob/master/src/crypto/slow-hash.c)
157 | * The entry point is `cn_slow_hash()` function. Manually removing support and optimizations for multiple architectures should help you understand the actual code.
158 | * "Egalitarian Proof of Work" chapter in [CryptoNote whitepaper](https://downloads.getmonero.org/whitepaper_annotated.pdf)
159 | * [First days of Monero mining](https://da-data.blogspot.com/2014/08/minting-money-with-monero-and-cpu.html) by dr David Andersen
160 | * Some [test vectors](https://github.com/monero-project/monero/tree/master/tests/hash) in Monero source code
161 |
--------------------------------------------------------------------------------
/docs/proof-of-work/pow-in-cryptocurrencies.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Proof of Work in Cryptocurrencies
3 | ---
4 | # Proof of Work in Cryptocurrencies
5 |
6 | > Proof of work is a Sybil protection mechanism
7 |
8 | ## PoW protects against Sybil attack
9 |
10 | In decentralized cryptocurrencies **untrusted** actors confirm (blocks of) transactions.
11 |
12 | If threshold voting was employed then the scheme would break immediately.
13 | This is because nothing prevents a single actor from creating arbitrary number of pseudonyms and take over the voting.
14 | In distributed systems this is known as Sybil attack.
15 |
16 | Instead, cryptocurrencies employ proof of work. In the proof of work scheme,
17 | it is not the number of actors that counts. It is the amount of committed
18 | computational resources.
19 |
20 | This, of course, is much harder to game.
21 | To endanger the scheme, an attacker would have to actually control majority (>50%) of computational resources.
22 | In practice, attacker would need this control over significant period of time.
23 |
24 | ## PoW is a leader election mechanism
25 |
26 | In distributed systems "leader election" is a process of establishing which node is responsible for (temporarily) coordinating the system.
27 |
28 | In cryptocurrencies PoW is used to elect the node that "wins" the next block.
29 |
30 | Using PoW for leader election was one of the key inventions introduced by Bitcoin.
31 |
32 | Competing nodes (known as "miners") work on a solution to artificial problem.
33 | Every now and then, someone randomly finds the solution.
34 | Chances are linearly proportional to committed computing power.
35 |
36 | The winner uses its solution to "underwrite" the block it assembled. Only blocks with valid solutions are accepted by the network.
37 |
38 | The winner also gets a reward for its work. The reward is a specific amount of cryptocurrency created "out of thin air" and assigned to self. The winner also gets all fees coming from transactions included in the block.
39 |
40 | The difficulty of the PoW problem is dynamically adjusted by the network, with the goal of finding blocks with a roughly constant rate (typically, every couple of minutes).
41 |
--------------------------------------------------------------------------------
/docs/proof-of-work/random-x.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: RandomX
3 | ---
4 | # RandomX
5 |
6 | For general information about RandomX you can read this [article](https://www.monerooutreach.org/stories/RandomX.html).
7 |
--------------------------------------------------------------------------------
/docs/proof-of-work/what-is-pow.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Proof of Work
3 | ---
4 | # Proof of Work
5 |
6 | > Proof of work is a way to legitimize untrusted party
7 |
8 | ### What exactly is proof of work?
9 |
10 | Proof of work is a cryptographic proof that untrusted party committed significant computational resources to solve artificial problem.
11 |
12 | Technically, the "proof" is simply a solution to the problem at hand.
13 |
14 | ### It's all about legitimizing untrusted party
15 |
16 | How an untrusted party on the Internet could earn any level of your trust?
17 |
18 | It can prove its commitment by solving agreed computationally hard problem.
19 |
20 | For example, by requiring untrusted party to perform a hard computation before you accept their connection, you limit connections only to "committed" parties.
21 |
22 | In another example, you could require PoW to be attached to incoming e-mails to make spam prohibitively expensive.
23 |
24 | ### Work must be otherwise useless
25 |
26 | The work on and solution to "computationally hard problem" cannot be useful in any other way than to prove the commitment.
27 |
28 | If the work is useful elsewhere then it doesn't prove commitment to you.
29 |
30 | The problem must be artificial. Otherwise incentives are skewed and the whole scheme breaks.
31 |
32 | ### Strong asymmetry
33 |
34 | The requirement for proof of work scheme is strong asymmetry for work vs verification resources.
35 |
36 | The work must be arbitrarily hard. At the same time proof verification must remain dirt cheap (in terms of computational resources).
37 |
38 | Cheap verification is critical because at this stage we are dealing with potentially huge number of untrusted parties,
39 | who could DoS the verifier by submitting invalid proofs. Such proofs should be trivial to discard.
40 |
--------------------------------------------------------------------------------
/docs/public-address/integrated-address.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Integrated Address
3 | ---
4 | # Integrated Address
5 |
6 | Integrated addresses are ideal for accepting Monero in an automated fashion - like in online stores and exchanges.
7 |
8 | Monero integrated address embeds a payment ID. This allows you to learn for what you are being paid.
9 |
10 | Please note these are Monero technical payment IDs and must not be confused with business identifiers like order number or invoice number.
11 |
12 | The transaction to integrated address will not reveal the payment ID publicly.
13 | Payment ID in a transaction will be encrypted with a shared secret (one-time random key known only to sender and recipient).
14 | Only the recipient will be able to match the transaction against payment ID.
15 |
16 | Monero integrated address obsoletes the former practice of using full 32-bytes payment ID in a transaction extra field (where it was not encrypted).
17 |
18 | Data structure ([src](https://github.com/monero-project/monero/blob/f7b9f44c1b0d53170fd7f53d37fc67648f3247a2/src/cryptonote_basic/cryptonote_basic_impl.cpp#L172)):
19 |
20 | Index | Size in bytes | Description
21 | ------------|------------------|-------------------------------------------------------------
22 | 0 | 1 | identifies the network and address type; [19](https://github.com/monero-project/monero/blob/793bc973746a10883adb2f89827e223f562b9651/src/cryptonote_config.h#L150) - main chain; [54](https://github.com/monero-project/monero/blob/793bc973746a10883adb2f89827e223f562b9651/src/cryptonote_config.h#L162) - test chain
23 | 1 | 32 | public spend key
24 | 33 | 32 | public view key
25 | 65 | 8 | compact payment ID - 8 bytes randomly generated by the recipient; note that it does not need encryption in the address itself but it is hidden in a transaction paying to integrated address to prevent linking payment with the address by external observers
26 | 73 | 4 | checksum ([Keccak-f[1600] hash](https://github.com/monero-project/monero/blob/8f1f43163a221153403a46902d026e3b72f1b3e3/src/common/base58.cpp#L261) of the previous 73 bytes, trimmed to first [4](https://github.com/monero-project/monero/blob/8f1f43163a221153403a46902d026e3b72f1b3e3/src/common/base58.cpp#L53) bytes)
27 |
28 | It totals to 77 bytes. The bytes are then encoded ([src](https://github.com/monero-project/monero/blob/8f1f43163a221153403a46902d026e3b72f1b3e3/src/common/base58.cpp#L240)) in [Monero specific Base58](/cryptography/base58) format, resulting in a 106 chars long string. Example integrated address:
29 |
30 | `4LL9oSLmtpccfufTMvppY6JwXNouMBzSkbLYfpAV5Usx3skxNgYeYTRj5UzqtReoS44qo9mtmXCqY45DJ852K5Jv2bYXZKKQePHES9khPK`
31 |
32 | ## Integrated addresses vs subaddresses
33 |
34 | Both types allow you to learn for what you are being paid.
35 |
36 | **Individuals** should prefer **subaddresses** to receive payments. This is to improve privacy in certain scenarios. See article on [subaddresses](/public-address/subaddress) for details.
37 |
38 | **Businesses** accepting payments in an automated way should prefer **integrated addresses**. The rationale is as follows:
39 |
40 | * Scenario where subaddresses improve privacy is not applicable to businesses b/c businesses have the same identity over time. Consequently, subaddresses provide no benefits over integrated addresses.
41 |
42 | * No private key is necessary to generate integrated address. This provides a strong security advantage because services that generate integrated addresses need no access to wallet. In contrast, to generate a subaddress, one needs a private view key.
43 |
44 | * No shared counter is necessary to generate integrated address. This allows individual services to independently generate integrated addresses w/o synchronizing on a common sequence. In contrast, subaddresses are generated sequentially, and so the sequence (the counter or index) is a coupling point between the wallet and all services that need to generate the address. Back to integrated addresses, note that embedded payment IDs are 64-bit. This means the space is large enough that one can simply generate them randomly and reliably assume uniqueness.
45 |
46 | * In very specific scenarios, preparation effort to monitor a very huge number of subaddresses, could became an issue. See [this reddit thread](https://www.reddit.com/r/Monero/comments/9aevri/is_it_fair_to_say_integrated_addresses_are/e4vf47p) for details.
47 |
48 |
49 | ## Caveats
50 |
51 | There are some caveats:
52 |
53 | * Single transaction cannot pay to multiple integrated addresses.
54 |
55 | * As individual running a wallet you should generally prefer subaddresses. However, if you happen to use integrated addresses, you should allow Monero software to generate integrated addresses for you (instead of forcing your own payment IDs).
56 |
57 |
58 | ## Reference
59 |
60 | * question on [StackExchange](https://monero.stackexchange.com/questions/3179/what-is-an-integrated-address)
61 |
--------------------------------------------------------------------------------
/docs/public-address/main-address.md:
--------------------------------------------------------------------------------
1 | ---
2 | redirect: /public-address/standard-address/
3 | ---
4 |
--------------------------------------------------------------------------------
/docs/public-address/standard-address.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Standard Address
3 | ---
4 | # Address
5 |
6 | Monero public address is what you publish to get paid.
7 |
8 | An address can be generated offline and for free. It boils down to generating a large random number representing your private spending key.
9 |
10 | Publishing your Monero address does __not__ endanger your privacy. That's because in Monero transactions go to stealth addresses which are decoupled from your public address.
11 |
12 | There are a few **types of public addresses** in Monero:
13 |
14 | * Standard address - basic type of an address, also referred to as raw address
15 | * Subaddress - what you should be using by default
16 | * Integrated address - relevant for exchanges, merchants, and other businesses accepting Monero in a fully automated way
17 |
18 | ## Standard address
19 |
20 | Historically, raw address was the only available option. For that reason it is the most widely adopted and supported address type.
21 |
22 | Its strength is simplicity. However, these days users should prefer receiving to subaddresses instead.
23 |
24 | Technically, raw address is also a basis for creating subaddresses and integrated addresses.
25 |
26 | Raw address is **still useful for**:
27 |
28 | * accepting block reward in a solo-mining scenario as other addresses are not supported
29 | * accepting from senders who batch payouts (like mining pools); in this scenario the sender is paying multiple parties using a single transaction; such transaction has multiple outputs; subaddresses do not work in this scenario
30 | * accepting from senders who use legacy wallets (can't send to subaddress)
31 |
32 | Monero raw address is composed of two public keys:
33 |
34 | * public spend key
35 | * public view key
36 |
37 | It also contains a checksum and a "network byte" which actually identifies both the network and the address type.
38 |
39 | ## Data structure
40 |
41 | Index | Size in bytes | Description
42 | ------------|------------------|-------------------------------------------------------------
43 | 0 | 1 | identifies the network and address type; [18](https://github.com/monero-project/monero/blob/793bc973746a10883adb2f89827e223f562b9651/src/cryptonote_config.h#L149) - main chain; [53](https://github.com/monero-project/monero/blob/793bc973746a10883adb2f89827e223f562b9651/src/cryptonote_config.h#L161) - test chain
44 | 1 | 32 | public spend key
45 | 33 | 32 | public view key
46 | 65 | 4 | checksum ([Keccak-f[1600] hash](https://github.com/monero-project/monero/blob/8f1f43163a221153403a46902d026e3b72f1b3e3/src/common/base58.cpp#L261) of the previous 65 bytes, trimmed to first [4](https://github.com/monero-project/monero/blob/8f1f43163a221153403a46902d026e3b72f1b3e3/src/common/base58.cpp#L53) bytes)
47 |
48 | It totals to 69 bytes. The bytes are then encoded ([src](https://github.com/monero-project/monero/blob/8f1f43163a221153403a46902d026e3b72f1b3e3/src/common/base58.cpp#L240)) in [Monero specific Base58](/cryptography/base58) format, resulting in a 95 chars long string. Example standard address:
49 |
50 | `4AdUndXHHZ6cfufTMvppY6JwXNouMBzSkbLYfpAV5Usx3skxNgYeYTRj5UzqtReoS44qo9mtmXCqY45DJ852K5Jv2684Rge`
51 |
52 | See the [source code](https://github.com/monero-project/monero/blob/f7b9f44c1b0d53170fd7f53d37fc67648f3247a2/src/cryptonote_basic/cryptonote_basic_impl.cpp#L159).
53 |
54 | ## Generating
55 |
56 | ### Generating the keys
57 |
58 | As mentioned above, a Monero address encodes two elliptic curve public keys so the first step is to generate two elliptic curve private keys from which the public keys may be derived.
59 |
60 | Each private key is represented by a scalar between 1 and 2^252 + 27742317777372353535851937790883648492 inclusive. (Note: 2^252 + 27742317777372353535851937790883648492 + 1 is a prime order of the elliptic curve basepoint, `l`).
61 |
62 | To generate a new private key, the convention is to generate a random 256 bit numbers and reduce it modulo 2^252 + 27742317777372353535851937790883648493.
63 |
64 | To get the public keys to be encoded in the address, the ed25519 basepoint `G` is multiplied by each key scalar.
65 |
66 | ### Checksum
67 |
68 | A checksum of the network byte and public keys is included in the address to help wallet software verify that a typo hasn't been made when users enter the address.
69 |
70 | To get this checksum, the network byte as well as the public spend and view keys are concatenated together and Keccak-256 hashed. The first four bytes of this hash are the checksum.
71 |
72 | When wallet software parses a Monero address it should decode the address and recompute the checksum and verify that it matches the checksum included in the address.
73 |
74 | ### Base58 Encoding
75 |
76 | In an effort to further prevent errors from typos Monero addresses are encoded using a special character dictionary.
77 |
78 | Characters used in Monero base58: `123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz`. Notice how characters that look similar such as `O` and `0` are missing.
79 |
80 | [More about Monero base58](https://monerodocs.org/cryptography/base58/).
81 |
82 | ### Deteministic Wallets
83 |
84 | There is no way to regulate how people choose their address keys, it is simply highly suggested that they are chosen at random. The original CryptoNote implementation generated each keypair randomly, independently of each other. Addresses generated this way are called non-deterministic, they have fallen out of popularity.
85 |
86 | As of present, the convention is to derive an address's view key deterministically from the spend key which allows for human language encoded seed mnemonics.
87 |
88 | Deterministic addresses derive the private view key from the private spend key by hashing it (conventionally Keccak-256) and reducing it modulo `l`.
89 |
90 | ## Reference
91 |
92 | * [StackExchenge answer](https://monero.stackexchange.com/questions/980/what-are-the-public-viewkeys-and-spendkeys)
93 | * [https://xmr.llcoins.net/addresstests.html](https://xmr.llcoins.net/addresstests.html)
94 | * [src/cryptonote_basic/account.cpp account_base::generate](https://github.com/monero-project/monero/blob/dcba757dd283a3396120f0df90fe746e3ec02292/src/cryptonote_basic/account.cpp#L155)
95 |
--------------------------------------------------------------------------------
/docs/public-address/subaddress.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Subaddress
3 | ---
4 | # Subaddress
5 |
6 | Subaddress is what you should be using by default to receive Monero.
7 |
8 | ## Learn for what you are being paid
9 |
10 | By providing a unique subaddress for each anticipated payment you will know for what you are being paid.
11 |
12 | This use case overlaps with integrated addresses. Subaddresses are generally prefered for reasons outlined below.
13 |
14 | ## Prevent payer from linking your payouts together
15 |
16 | To prevent the payer from linking your payouts together simply generate a new subaddress for each payout.
17 | This way specific service (like anonymous exchange) that sends you Monero won't (easilly) know it is you again receving Monero.
18 |
19 | The exception to this is when a service (or group of colluding services) decides to actively attack you, one address at the time, with the so-called [Janus attack](https://web.getmonero.org/2019/10/18/subaddress-janus.html), which risks them losing funds. If you need perfect unlinkability of your receivables, the only solution remains to use a separate seed (separate Monero wallet).
20 |
21 | Also, note it won't help if you have an account with the service. Then your payouts are already linked in the service database, regardless of Monero.
22 |
23 | ## Group funds into accounts
24 |
25 | **Accounts** are a convenience wallet-level feature to group subaddresses under one label and balance.
26 |
27 | You may want to organize your funds into accounts like "cash", "work", "trading", "mining", "donations", etc.
28 |
29 | As accounts are only groupings of subaddresses, they themselves do not have an address.
30 |
31 | Accounts are deterministically derived from the root private key along with subaddresses.
32 |
33 | Accounts are similar to subaccounts in your classic bank account. There is a very important difference though. In Monero funds don't really sit on accounts or public addresses. Public addresses are conceptually a gateway or a routing mechanism. Funds sit on transactions' unspent outputs. Thus, a single transaction can - in principle - aggregate and spend outputs from multiple addresses (and by extension from multiple accounts). The CLI or GUI wallet may not directly support creating such transactions for simplicity.
34 |
35 | In short, think of accounts as a **soft** grouping of your funds.
36 |
37 | ## Why not multiple wallets?
38 |
39 | The advantage over creating multiple wallets is that you only have a **single seed** to manage.
40 | All subaddresses can be derived from the wallet seed.
41 |
42 | Additionally, you conveniently manage your subaddresses within a single user interface.
43 |
44 | ## Wallet level feature
45 |
46 | Subaddresses and accounts are a wallet-level feature to construct and interpret transactions. They do not affect the consensus.
47 |
48 | ## Data structure
49 |
50 | Subaddress has a dedicated "network byte":
51 |
52 | Index | Size in bytes | Description
53 | ------------|------------------|-------------------------------------------------------------
54 | 0 | 1 | identifies the network and address type; [42](https://github.com/monero-project/monero/blob/31bdf7bd113c2576fe579ef3a25a2d8fef419ffc/src/cryptonote_config.h#L171) - mainnet; [36](https://github.com/monero-project/monero/blob/31bdf7bd113c2576fe579ef3a25a2d8fef419ffc/src/cryptonote_config.h#L200) - stagenet; [63](https://github.com/monero-project/monero/blob/31bdf7bd113c2576fe579ef3a25a2d8fef419ffc/src/cryptonote_config.h#L185) - testnet
55 |
56 | Otherwise the data structure is the same as for the [standard address](/public-address/standard-address/#data-structure).
57 |
58 | ## Generating
59 |
60 | Each subaddress conceptually has:
61 |
62 | * account index (also known as "major" index)
63 | * subaddress index within the account (also known as "minor" index)
64 |
65 | The indexes are 0-based. By default wallets use account index 0.
66 |
67 | The indexes are not directly included in the subaddress data structure.
68 | Instead, they are used as input to generating subaddress keys.
69 |
70 | ### Private view key
71 |
72 | A per-subaddress scalar `m` is derived as follows:
73 |
74 | m = Hs("SubAddr" || a || account_index || subaddress_index_within_account)
75 |
76 | Where:
77 |
78 | * `Hs` is a Keccak-256 hash function interpreted as integer and modulo `l` (maximum edwards25519 scalar)
79 | * `||` is a byte array concatenation operator
80 | * `SubAddr` is a 0-terminated fixed string (8 bytes total)
81 | * `a` is a private view key of the standard address (a 32 byte little endian unsigned integer)
82 | * `account_index` is index of an account (a 32 bit little endian unsigned integer)
83 | * `subaddress_index_within_account` is index of the subaddress within the account (a 32 bit little endian unsigned integer)
84 |
85 | Deriving "sub view keys" from the main view key allows for creating a view only wallet that monitors the entire wallet including subaddresses.
86 |
87 | ### Public spend key
88 |
89 | The subaddress public spend key `D` is derived as follows:
90 |
91 | D = B + m*G
92 |
93 | Where:
94 |
95 | * `B` is standard address public spend key
96 | * `m` is a per-subaddress scalar that is derived from the private spend key
97 | * `G` is the "base point"; this is simply a constant specific to [edwards25519](/cryptography/asymmetric/edwards25519)
98 |
99 | ### Public view key
100 |
101 | The subaddress public view key `C` is derived as follows:
102 |
103 | C = a*D
104 |
105 | Where:
106 |
107 | * `a` is a private view key of the standard address
108 | * `D` is a public spend key of the subaddress
109 |
110 | ### Special case for (0, 0)
111 |
112 | The subaddress #0 on the account #0 is the [standard address](/public-address/standard-address).
113 | As standard address has different generation rules, this is simply implemented via an `if` statement.
114 |
115 | ### Building the address string
116 |
117 | The procedure is the same as for the [standard address](/public-address/standard-address).
118 |
119 | ## Caveats
120 |
121 | * It is not recommended to sweep all the balances of subaddress to standard address in a single transaction. That links the subaddresses together on the blockchain. However, this only concerns privacy against specific sender and the situation will never get worse than not using subaddresses in the first place. If you need to join funds while preserving maximum privacy do it with individual transactions (one per subaddress).
122 | * Convenience labels are not preserved when recreating from seed.
123 |
124 | ## Reference
125 |
126 | * [monero-python](https://github.com/emesik/monero-python/blob/125d5eac0d4583b586b98e21b28fb9a291db26e5/monero/wallet.py#L195) - the easiest to follow implementation by Michał Sałaban
127 | * [get_subaddress_spend_public_key()](https://github.com/monero-project/monero/blob/16dc6900fb556b61edaba5e323497e9b8c677ae2/src/device/device_default.cpp#L143) - Monero reference implementation
128 | * [historical discussion on Github](https://github.com/monero-project/monero/pull/2056) - gives context but is not up to date with all details
129 | * [StackExchange answer](https://monero.stackexchange.com/questions/10674/how-are-subaddresses-and-account-addresses-generated-from-master-wallet-keys/10676#10676) - excellent summary by knaccc
130 |
--------------------------------------------------------------------------------
/docs/r/accepting-monero-comparison-matrix.md:
--------------------------------------------------------------------------------
1 | ---
2 | redirect: https://docs.google.com/spreadsheets/d/1pqwEYe4WFKeuY2iNn2tUkbinfmoH2KBrepWLIJOHL7I
3 | ---
4 |
--------------------------------------------------------------------------------
/docs/technical-specs.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Monero Technical Specification
3 | ---
4 | # Monero Technical Specs
5 |
6 | ## Live
7 |
8 | * Monero blockchain is live since 18 April 2014
9 |
10 | ## No premine, no instamine, no ICO, no token
11 |
12 | * Monero had no premine or instamine
13 | * Monero did not sell any token
14 | * Monero had no presale of any kind
15 |
16 | ## Proof of Work
17 |
18 | * CryptoNight
19 | * v0 since block height 0
20 | * v1 since block height 1546000 (forked on 2018-04-06)
21 | * v2 since block height 1685555 (forked on 2018-10-18)
22 | * v3 since block height 1788000 (forked on 2019-03-09); "CryptonightR"
23 | * RandomX
24 | * v0 since block height 1978433 (forked on 2019-11-30)
25 |
26 | ## Difficulty retarget
27 |
28 | * every block
29 | * based on the last 720 blocks (24h), excluding 20% of the timestamp outliers
30 |
31 | ## Block time
32 |
33 | * 2 minutes
34 | * may change in the future as long as emission curve is preserved
35 |
36 | ## Block reward
37 |
38 | * smoothly decreasing and subject to penalties for blocks greater than median size of the last 100 blocks (M100)
39 | * 0.6 XMR as of June 2023; for the current reward check the coinbase transaction of the [latest block](https://xmrchain.net/)
40 |
41 | ## Block size
42 |
43 | * dynamic
44 | * maximum of two times the median size of the last 100 blocks (2 * M100)
45 | * ~50KB as of June 2020; check [the latest block size](https://bitinfocharts.com/comparison/monero-size.html#3m)
46 |
47 | ## Current blockchain size
48 |
49 | * Pruned node: ~ 57GB as of Jan 2023
50 | * Complete chain without any pruning: ~138GB as of Jan 2023
51 |
52 | ## Emission curve
53 |
54 | ### Main emission
55 |
56 | * first, the main emission is about to produce ~18.132 million coins by the end of May 2022
57 | * as of June 2023 the emission is about 3 XMR per 10 minutes
58 | * see [charts and details](https://www.reddit.com/r/Monero/comments/512kwh/useful_for_learning_about_monero_coin_emission/)
59 |
60 | ### Tail emission
61 |
62 | * the tail emission kicked in after main emission is done
63 | * it will produce 0.6 XMR per 2-minute block
64 | * this translates to <1% inflation decreasing over time
65 |
66 | ## Max supply
67 |
68 | * ~18.293 million XMR + 0.6 XMR per 2 minutes
69 | * technically infinite but practically deflationary if accounted for lost coins
70 |
71 | ## Divisibility
72 |
73 | * Monero is divisible up to 12 digits
74 | * The smallest unit is called piconero and equals 1e-12 XMR, or 0.000000000001 XMR
75 |
76 | ## Sender privacy
77 |
78 | * ring signatures
79 | * the ring size is 16 (15 decoys)
80 | * assurance: probabilistic / plausible deniability
81 |
82 | ## Recipient privacy
83 |
84 | * stealth addresses
85 | * assurance: strong
86 |
87 | ## Amount privacy
88 |
89 | * ring confidential transactions
90 | * assurance: strong
91 |
92 | ## IP address privacy
93 |
94 | For the full node (`monerod`):
95 |
96 | * dandelion++
97 | * assurance: won't protect against ISP/VPN provider, won't protect against the very first remote node in Dandellion++ protocol
98 | * for the full protection user must manually wrap `monerod` with Tor
99 |
100 | For the wallet (`monero-wallet-gui` or `monero-wallet-cli`):
101 |
102 | * typically wallet runs on the same machine as full node so there is no risk
103 | * if wallet connects to remote full node, there is no IP protection by default
104 | * user must manually wrap wallet with Tor or I2P
105 |
--------------------------------------------------------------------------------
/images/monero.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/mkdocs.yml:
--------------------------------------------------------------------------------
1 | # Project information
2 | site_name: Monero Documentation
3 | site_description: 'Unofficial Monero Documentation'
4 | site_author: "Piotr 'Qertoip' Włodarek"
5 | site_url: 'https://monerodocs.org'
6 | site_dir: 'public'
7 |
8 | copyright: '© 2021 MoneroDocs under MIT'
9 |
10 | nav:
11 | - Home: 'index.md'
12 | - Interacting:
13 | - Download: 'interacting/download-monero-binaries.md'
14 | - Verify: 'interacting/verify-monero-binaries.md'
15 | - Overview: 'interacting/overview.md'
16 | - Config file: 'interacting/monero-config-file.md'
17 | - monerod: 'interacting/monerod-reference.md'
18 | - monero-wallet-cli: 'interacting/monero-wallet-cli-reference.md'
19 | - monero-wallet-gui: 'interacting/monero-wallet-gui-reference.md'
20 | - monero-wallet-rpc: 'interacting/monero-wallet-rpc-reference.md'
21 | - monero-blockchain-export: 'interacting/monero-blockchain-export-reference.md'
22 | - monero-blockchain-import: 'interacting/monero-blockchain-import-reference.md'
23 | - Technical specs: 'technical-specs.md'
24 | - Cryptography:
25 | - Introduction: 'cryptography/introduction.md'
26 | - Asymmetric:
27 | - Introduction: 'cryptography/asymmetric/introduction.md'
28 | - Private keys: 'cryptography/asymmetric/private-key.md'
29 | - Public keys: 'cryptography/asymmetric/public-key.md'
30 | - Edwards25519 curve: 'cryptography/asymmetric/edwards25519.md'
31 | - Key image: 'cryptography/asymmetric/key-image.md'
32 | - Base58: 'cryptography/base58.md'
33 | - PRNG: 'cryptography/prng.md'
34 | - 'Keccak-256': 'cryptography/keccak-256.md'
35 | - Address:
36 | - Standard: 'public-address/standard-address.md'
37 | - Subaddress: 'public-address/subaddress.md'
38 | - Integrated: 'public-address/integrated-address.md'
39 | - Proof of Work:
40 | - What is PoW?: 'proof-of-work/what-is-pow.md'
41 | - PoW in Cryptocurrencies: 'proof-of-work/pow-in-cryptocurrencies.md'
42 | - CryptoNight: 'proof-of-work/cryptonight.md'
43 | - RandomX: 'proof-of-work/random-x.md'
44 | - Multisignature: 'multisignature.md'
45 | - Infrastructure:
46 | - Mainnet, stagenet, testnet: 'infrastructure/networks.md'
47 | - Tor onion seed nodes: 'infrastructure/tor-onion-p2p-seed-nodes.md'
48 | - MoneroPulse: 'infrastructure/monero-pulse.md'
49 | - Running a Node:
50 | # - On your Laptop: 'localhost-node.md'
51 | # - Remote Node: 'remote-node.md'
52 | # - Open Remote Node: 'open-remote-node.md'
53 | - Open Node + Tor Onion: 'running-node/open-node-tor-onion.md'
54 | - Cold storage:
55 | - Offline Transaction Signing: 'cold-storage/offline-transaction-signing.md'
56 | - Accepting Monero:
57 | - Overview: 'accepting-monero/overview.md'
58 |
59 |
60 | theme:
61 | name: null
62 | custom_dir: mkdocs-material/material
63 |
64 | # 404 page
65 | static_templates:
66 | - 404.html
67 |
68 | # Necessary for search to work properly
69 | include_search_page: false
70 | search_index_only: true
71 |
72 | # Default values, taken from mkdocs_theme.yml
73 | language: en
74 | font:
75 | text: Roboto
76 | code: Roboto Mono
77 | favicon: assets/favicon.png
78 | palette:
79 | - scheme: default
80 | primary: white
81 | toggle:
82 | icon: material/weather-night
83 | name: Switch to dark mode
84 | - scheme: slate
85 | toggle:
86 | icon: material/weather-sunny
87 | name: Switch to light mode
88 | icon:
89 | logo: logo
90 | logo: 'images/monero.svg'
91 |
92 | extra_css: ['overrides.css']
93 |
94 | repo_name: 'monerodocs/md'
95 | repo_url: 'https://github.com/monerodocs/md'
96 |
97 | markdown_extensions:
98 | # https://squidfunk.github.io/mkdocs-material/extensions/admonition/
99 | - admonition
100 | - abbr
101 | - def_list
102 | - footnotes
103 | - meta
104 | - toc:
105 | permalink: true
106 | - pymdownx.details
107 | - pymdownx.highlight:
108 | use_pygments: true # build time highlighting, not client side
109 | - pymdownx.inlinehilite
110 | - pymdownx.superfences # nest code blocks inside codeblocks
111 | - pymdownx.snippets # insert content from other files
112 |
113 | plugins:
114 | - search
115 | - minify:
116 | minify_html: true
117 | minify_js: true
118 | htmlmin_opts:
119 | remove_comments: true
120 |
--------------------------------------------------------------------------------