Advertisement
Guest User

Babelfish Firefox addon/extension 1.97/1.53 working dict.leo

a guest
Mar 27th, 2013
453
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.78 KB | None | 0 0
  1. var bfplugin = {//never change this line
  2.  
  3.   //BabelFish compatibility:
  4.   minBFVersion: '1.94',
  5.   //Your plugin edit version:
  6.   pluginVersion: '1.53',
  7.   //Author:
  8.   pluginAuthor: 'NettiCat, modified by Arkitk',
  9.  
  10.  
  11.  
  12.   //Display name of your service:
  13.   service1Name: 'Google',
  14.   service2Name: 'Yahoo',
  15.   service3Name: 'LeoDic',
  16.   detectionName: 'Google',
  17.    
  18.  
  19.   //URL to get the text translation (enclose in outer single '' AND inner double ""):
  20.   //placeholder for the text to translate is %s
  21.   //placeholder for source language code is %from
  22.   //placeholder for target language code is %to
  23.   service1URL: '"http://translate.google.de/translate_a/t?client=t&text=%s&hl=en&sl=auto&tl=%to&ie=UTF-8&oe=UTF-8&multires=1&otf=2&ssel=0&tsel=0&uptl=%to&sc=1"',
  24.   service2URL: '"http://babelfish.yahoo.com/translate_txt?ei=UTF-8&lp=%from_%to&text=%s"',
  25.   service3URL: '"http://dict.leo.org/%from%to/?search=%s"',
  26.   // alternativ
  27.   //'"http://dict.leo.org/?lp=%from%to&lang=en&relink=off&search=%s"',
  28.   //'"http://dict.leo.org/%from%to?lp=%from%to&lang=en&relink=off&search=%s"',
  29.   //'"http://dict.leo.org/%from%to/?search=%s"';
  30.   //http://translate.google.de/translate_a/t?client=t&text=%s&hl=en&sl=auto&tl=%to&ie=UTF-8&oe=UTF-8&multires=1&otf=2&ssel=0&tsel=0&uptl=%to&sc=1
  31.   //service1URL: '"http://translate.google.de/translate_a/t?client=t&text=fenetre&hl=en&sl=auto&tl=de&ie=UTF-8&oe=UTF-8&multires=1&otf=2&ssel=0&tsel=0&uptl=de&sc=1"',
  32.   //service1URL: '"http://translate.google.de/?hl=en&tab=wT#auto/%to/%s"',
  33.  
  34.   //URL to translate a whole page (enclose in outer single '' AND inner double ""):
  35.   //placeholder for the site to translate is %url
  36.   //placeholder for source language code is %from
  37.   //placeholder for target language code is %to
  38.   //placeholder for browser language code is %nl
  39.   service1SiteURL: '"http://translate.google.com/translate?hl=%nl&langpair=%from|%to&u=%url"',
  40.   service2SiteURL: '"http://babelfish.yahoo.com/translate_url?doit=done&tt=url&intl=1&fr=bf-home&btnTrUrl=Translate&lp=%from_%to&trurl=%url"',
  41.    
  42.  
  43.   //URL to detect a language (enclose in outer single '' AND inner double ""):
  44.   //placeholder for the text is %s
  45.   detectionURL: '"http://translate.google.de/translate_a/t?client=t&text=%s&hl=en&sl=auto&tl=en&ie=UTF-8&oe=UTF-8&multires=1&otf=2&ssel=0&tsel=0&uptl=en&sc=1"',
  46.   //Maximum text-length accepted by service, otherwise text is splitted:
  47.   service2MaxLength: 1000,
  48.   //service5MaxLength: 300,
  49.  
  50.  
  51.   //Whole page translation supports translation of secure sites (HTTPS):
  52.   service1HTTPSSupport: 0,
  53.   service2HTTPSSupport: 1,
  54.    
  55.  
  56.   //Whole page translation cookie requirement (0=no, 1=yes, 2=if enabled only):
  57.   service1CookieRequirement: 0,
  58.   service2CookieRequirement: 2,
  59.    
  60.  
  61.   //Post methods needed
  62.   //service4PostParams: '"go=Search&lan1=%from&lan2=%to&word=%s"',
  63.    
  64.  
  65.   //Language codes used in the service URL (with %from or %to):
  66.   //Remove languages not supported by your service
  67.   //Change the short language codes to those used by your service
  68.   service1LanguageCodes : {
  69.     'auto' : '',
  70.     'AFRIKAANS' : 'af',
  71.     'ALBANIAN' : 'sq',
  72.     'AMHARIC' : 'am',
  73.     'ARABIC' : 'ar',
  74.     'ARMENIAN' : 'hy',
  75.     'AZERBAIJANI' : 'az',
  76.     'BASQUE' : 'eu',
  77.     'BELARUSIAN' : 'be',
  78.     'BENGALI' : 'bn',
  79.     'BIHARI' : 'bh',
  80.     'BULGARIAN' : 'bg',
  81.     'BURMESE' : 'my',
  82.     'CATALAN' : 'ca',
  83.     'CHEROKEE' : 'chr',
  84.     'CHINESE' : 'zh',
  85.     'CHINESE[S]' : 'zh-CN',
  86.     'CHINESE[T]' : 'zh-TW',
  87.     'CROATIAN' : 'hr',
  88.     'CZECH' : 'cs',
  89.     'DANISH' : 'da',
  90.     'DHIVEHI' : 'dv',
  91.     'DUTCH': 'nl',
  92.     'English' : 'en',
  93.     'ESPERANTO' : 'eo',
  94.     'ESTONIAN' : 'et',
  95.     'FILIPINO' : 'tl',
  96.     'FINNISH' : 'fi',
  97.     'French' : 'fr',
  98.     'GALICIAN' : 'gl',
  99.     'GEORGIAN' : 'ka',
  100.     'German' : 'de',
  101.     'GREEK' : 'el',
  102.     'GUARANI' : 'gn',
  103.     'GUJARATI' : 'gu',
  104.     'HEBREW' : 'iw',
  105.     'HINDI' : 'hi',
  106.     'HUNGARIAN' : 'hu',
  107.     'ICELANDIC' : 'is',
  108.     'INDONESIAN' : 'id',
  109.     'INUKTITUT' : 'iu',
  110.     'ITALIAN' : 'it',
  111.     'JAPANESE' : 'ja',
  112.     'KANNADA' : 'kn',
  113.     'KAZAKH' : 'kk',
  114.     'KHMER' : 'km',
  115.     'KOREAN' : 'ko',
  116.     'KURDISH': 'ku',
  117.     'KYRGYZ': 'ky',
  118.     'LAOTHIAN': 'lo',
  119.     'LATVIAN' : 'lv',
  120.     'LITHUANIAN' : 'lt',
  121.     'MACEDONIAN' : 'mk',
  122.     'MALAY' : 'ms',
  123.     'MALAYALAM' : 'ml',
  124.     'MALTESE' : 'mt',
  125.     'MARATHI' : 'mr',
  126.     'MONGOLIAN' : 'mn',
  127.     'NEPALI' : 'ne',
  128.     'NORWEGIAN' : 'no',
  129.     'ORIYA' : 'or',
  130.     'PASHTO' : 'ps',
  131.     'PERSIAN' : 'fa',
  132.     'POLISH' : 'pl',
  133.     'PORTUGUESE' : 'pt',
  134.     'PUNJABI' : 'pa',
  135.     'ROMANIAN' : 'ro',
  136.     'RUSSIAN' : 'ru',
  137.     'SANSKRIT' : 'sa',
  138.     'SERBIAN' : 'sr',
  139.     'SINDHI' : 'sd',
  140.     'SINHALESE' : 'si',
  141.     'SLOVAK' : 'sk',
  142.     'SLOVENIAN' : 'sl',
  143.     'SPANISH' : 'es',
  144.     'SWAHILI' : 'sw',
  145.     'SWEDISH' : 'sv',
  146.     'TAJIK' : 'tg',
  147.     'TAMIL' : 'ta',
  148.     'TAGALOG' : 'tl',
  149.     'TELUGU' : 'te',
  150.     'THAI' : 'th',
  151.     'TIBETAN' : 'bo',
  152.     'TURKISH' : 'tr',
  153.     'UKRAINIAN' : 'uk',
  154.     'URDU' : 'ur',
  155.     'UZBEK' : 'uz',
  156.     'UIGHUR' : 'ug',
  157.     'VIETNAMESE' : 'vi',
  158.     'UNKNOWN' : ''
  159.   },
  160.    
  161.   service2LanguageCodes : {
  162.    'Chinese[S]' : 'zh',
  163.    'Chinese[T]' : 'zt',
  164.    'Dutch' : 'nl',
  165.    'English' : 'en',
  166.    'French' : 'fr',
  167.    'German' : 'de',
  168.    'Greek' : 'el',
  169.    'Italian' : 'it',
  170.    'Japanese' : 'ja',
  171.    'Korean' : 'ko',
  172.    'Portuguese' : 'pt',
  173.    'Russian' : 'ru',
  174.    'Spanish' : 'es'
  175.   },
  176.  
  177.   service3LanguageCodes : {
  178.    'Chinese' : 'ch',
  179.    'English' : 'en',
  180.    'French' : 'fr',
  181.    'German' : 'de',
  182.    'Italian' : 'it',
  183.    'Spanish' : 'es',
  184.   },
  185.    
  186.   //Language codes used by language detection:
  187.   //Change the short language codes on the right to those sent by your language detection service
  188.   detectionLanguageCodes : {
  189.     'AFRIKAANS' : 'af',
  190.     'ALBANIAN' : 'sq',
  191.     'AMHARIC' : 'am',
  192.     'ARABIC' : 'ar',
  193.     'ARMENIAN' : 'hy',
  194.     'AZERBAIJANI' : 'az',
  195.     'BASQUE' : 'eu',
  196.     'BELARUSIAN' : 'be',
  197.     'BENGALI' : 'bn',
  198.     'BIHARI' : 'bh',
  199.     'BULGARIAN' : 'bg',
  200.     'BURMESE' : 'my',
  201.     'CATALAN' : 'ca',
  202.     'CHEROKEE' : 'chr',
  203.     'CHINESE' : 'zh',
  204.     'CHINESE[S]' : 'zh-CN',
  205.     'CHINESE[T]' : 'zh-TW',
  206.     'CROATIAN' : 'hr',
  207.     'CZECH' : 'cs',
  208.     'DANISH' : 'da',
  209.     'DHIVEHI' : 'dv',
  210.     'DUTCH': 'nl',
  211.     'English' : 'en',
  212.     'ESPERANTO' : 'eo',
  213.     'ESTONIAN' : 'et',
  214.     'FILIPINO' : 'tl',
  215.     'FINNISH' : 'fi',
  216.     'French' : 'fr',
  217.     'GALICIAN' : 'gl',
  218.     'GEORGIAN' : 'ka',
  219.     'German' : 'de',
  220.     'GREEK' : 'el',
  221.     'GUARANI' : 'gn',
  222.     'GUJARATI' : 'gu',
  223.     'HEBREW' : 'iw',
  224.     'HINDI' : 'hi',
  225.     'HUNGARIAN' : 'hu',
  226.     'ICELANDIC' : 'is',
  227.     'INDONESIAN' : 'id',
  228.     'INUKTITUT' : 'iu',
  229.     'ITALIAN' : 'it',
  230.     'JAPANESE' : 'ja',
  231.     'KANNADA' : 'kn',
  232.     'KAZAKH' : 'kk',
  233.     'KHMER' : 'km',
  234.     'KOREAN' : 'ko',
  235.     'KURDISH': 'ku',
  236.     'KYRGYZ': 'ky',
  237.     'LAOTHIAN': 'lo',
  238.     'LATVIAN' : 'lv',
  239.     'LITHUANIAN' : 'lt',
  240.     'MACEDONIAN' : 'mk',
  241.     'MALAY' : 'ms',
  242.     'MALAYALAM' : 'ml',
  243.     'MALTESE' : 'mt',
  244.     'MARATHI' : 'mr',
  245.     'MONGOLIAN' : 'mn',
  246.     'NEPALI' : 'ne',
  247.     'NORWEGIAN' : 'no',
  248.     'ORIYA' : 'or',
  249.     'PASHTO' : 'ps',
  250.     'PERSIAN' : 'fa',
  251.     'POLISH' : 'pl',
  252.     'PORTUGUESE' : 'pt',
  253.     'PUNJABI' : 'pa',
  254.     'ROMANIAN' : 'ro',
  255.     'RUSSIAN' : 'ru',
  256.     'SANSKRIT' : 'sa',
  257.     'SERBIAN' : 'sr',
  258.     'SINDHI' : 'sd',
  259.     'SINHALESE' : 'si',
  260.     'SLOVAK' : 'sk',
  261.     'SLOVENIAN' : 'sl',
  262.     'SPANISH' : 'es',
  263.     'SWAHILI' : 'sw',
  264.     'SWEDISH' : 'sv',
  265.     'TAJIK' : 'tg',
  266.     'TAMIL' : 'ta',
  267.     'TAGALOG' : 'tl',
  268.     'TELUGU' : 'te',
  269.     'THAI' : 'th',
  270.     'TIBETAN' : 'bo',
  271.     'TURKISH' : 'tr',
  272.     'UKRAINIAN' : 'uk',
  273.     'URDU' : 'ur',
  274.     'UZBEK' : 'uz',
  275.     'UIGHUR' : 'ug',
  276.     'VIETNAMESE' : 'vi',
  277.     'UNKNOWN' : ''
  278.   },
  279.  
  280.  
  281.  
  282.   service1ProcessResponse: function(response){
  283.   // NEW
  284.   // possible results of query
  285.   /* // example 1
  286.   [
  287.   [["language","language","",""]],
  288.   ,"en",,,,,,
  289.   [["en"]],
  290.   2]
  291.   // example 2
  292.   [
  293.     [["boy","garçon","",""]],
  294.     [["noun",["boy","lad","chap","youngster"],
  295.         [["boy",["garçon","boy","fils","gamin","jeune homme","élève"],[2],0.55225247],
  296.          ["lad",["garçon","gars","jeune","gamin","homme","fils"],[3],0.01382537],
  297.          ["chap",["type","garçon","bonhomme","gerçure","jeune homme","joue"],[3],0.0010172778],
  298.          ["youngster",["enfant","jeune homme","garçon","jeune cheval"],[4],0.00053606776]]
  299.         ]],
  300.     "fr",
  301.     ,
  302.     [["boy",[5],1,0,1000,0,1,0]],
  303.     [["garçon",4,,,""],["garçon",5,[["boy",1000,1,0],["guy",0,1,0],["fellow",0,1,0],["son",0,1,0],["boys",0,1,0]],[[0,6]],"garçon"]],
  304.     ,
  305.     ,
  306.     [["fr"]],
  307.     3
  308.   ]
  309.   // example 3
  310.   [
  311.   [["boy , window","garçon, fenetre","",""]],,"fr",,[["boy",[4],1,0,597,0,1,0],[", window",[5],0,0,529,1,3,0]],[["garçon",4,[["boy",597,1,0],["son",0,1,0],["guy",0,1,0],["fellow",0,1,0],["boys",0,1,0]],[[0,6]],"garçon, fenetre"],[", fenetre",5,[[", window",529,0,0]],[[6,15]],""]],,,[["fr"]],13]
  312.   */
  313.    //your regex rules go here...
  314.     var response=response.replace(/,,/g,",[[]],");          // ",," replace with ",[[]]," to make the response a full matrix
  315.     response=response.replace(/,,/g,",[[]],");          // again because of odd occurance of "," example ",,,"
  316.     var ds = response.split(']],');                 // split into elements
  317.     ds[0]=""+ds[0];                         //make string again
  318.     ds[0]=ds[0].replace(/\[/g, '');                 //delete [
  319.     ds[0]=ds[0].replace(/,\"\"/g, '');              //delete ,"",""
  320.     ds[0]=ds[0].replace(/\]/g, '');                 //delete ]
  321.     var directtranlation=ds[0].split('","');
  322.     if (directtranlation) {
  323.         directtranlation[0]=directtranlation[0].replace(/\"/g, ''); //delete "
  324.         directtranlation[1]=directtranlation[1].replace(/\"/g, ''); //delete "
  325.     }
  326.        
  327.     /* ds[1]~alttr contains possible alternative source words and their translations, example output for alttr 
  328.     noun
  329.     boy,lad,chap,youngster
  330.     boy
  331.     garçon,boy,fils,gamin,jeune homme,élève
  332.     2,0.55225247
  333.     lad
  334.     garçon,gars,jeune,gamin,homme,fils
  335.     3,0.01382537
  336.     chap
  337.     type,garçon,bonhomme,gerçure,jeune homme,joue
  338.     3,0.0010172778
  339.     youngster
  340.     enfant,jeune homme,garçon,jeune cheval
  341.     4,0.00053606776 */
  342.     // alttr[0] type of word (noun, adjective ...
  343.     // alttr[1] length= number of possible alternative source words, iterator i
  344.     // alttr[3*(i-1)+2] first possible source word
  345.     // alttr[3*(i-1)+3] first possible source word with possible translations in target language
  346.     // alttr[3*(i-1)+4]     second item = probability of first possible source word with
  347.     //             first item = unknown
  348. /*  ds[1]=""+ds[1];
  349.     alert(ds[0]);
  350.     alert(ds[1]);  
  351.     var alttr = ds[1].split(',\[');
  352.     alert(alttr);
  353.     for( var i = 0, len = alttr.length; i < len; i++ ) {       
  354.         if( alttr[i] ) {
  355.             alttr[i] = alttr[i].split(',');
  356.             alttr[i] = ""+alttr[i];
  357.             alttr[i]=alttr[i].replace(/\[/g, '');       //delete [
  358.             alttr[i]=alttr[i].replace(/\]/g, '');       //delete ]
  359.             alttr[i]=alttr[i].replace(/\"/g, '');       //delete "
  360.         }
  361.     } */
  362.     // building simple html view
  363. /*  if( directtranlation ) {
  364.         response="<b>"+directtranlation[1]+"</b> - ";
  365.         if( directtranlation ) {
  366.                 response=response+directtranlation[0];
  367.         }
  368.     } */
  369.     if( directtranlation ) {
  370.         response=directtranlation[0];
  371.     }
  372.     /* here addtional info (response contains addional information) should be parsed and evaluated, but results differ and i have no time to find
  373.     a aprobiate solution, and it is not important
  374.     response=response+"\n";response=response+"\n"+"<b>"+alttr[0]+"</b>"+"\n";   //word class
  375.     for( var i = 0, len = alttr[1].length; i < len; i++ ) {             // iterate through alternatives
  376.         if( alttr[i] ) {
  377.             response="<b>"+alttr[3*(i-1)+2]+"</b> - "+alttr[[3*(i-1)+4]]+" - "+alttr[[3*(i-1)+3]]+"\n";
  378.             alert(response);
  379.         }
  380.     } */
  381.    
  382.     /* //other tests, not working, but for info
  383.     javascript:alert("detection:"+detectedlang, "isReliable", 1);
  384.         var startdelimeter='<div class="goog-inline-block goog-toolbar-button-inner-box">';         // start html-tag of translation
  385.         var enddelimeter="</div>";              // end tag of translation
  386.         var startindexoutput=response.lastIndexOf(startdelimeter);      // corresponding start index/position
  387.         response=response.substring(startindexoutput);          // delete all text before start delimeter, for easier finding the end delimeter          
  388.         var endindexoutput=response.indexOf(enddelimeter);      // end index/position
  389.         response=response.substring(startdelimeter.length,endindexoutput);      // extract translation as html (between start and end)
  390.         javascript:alert("detection:"+response, "isLastReliable", 1); */
  391.    return response;
  392.   },
  393.  
  394.   service2ProcessResponse: function(response){
  395.    //your regex rules go here...
  396.    response = response.match(/v style="padding:0.6em;">[^<]+/mi);
  397.    if(!response)
  398.     return '';
  399.    response = response[0].replace(/.*>/m, ""); //remove remaining HTML
  400.    //...your regex rules end
  401.    return response;
  402.   },
  403.  
  404.   service3ProcessResponse: function(response){
  405. /* // OLD APPROACH  
  406.    var search=response.match(/<input name="search" value="([^"]+)"/i);
  407.    if(!search) {return '';}
  408.    search = search[1];
  409.    response = response.match(/<td\svalign="middle"\swidth="43%">.+?<td nowrap.*?>/gmi);
  410.    if(!response) {return '';}
  411.    var str = '';
  412.    for (var i=0; i<response.length-1; i+=2) {
  413.      var otherLang = bfplugin.leoClearHTML(response[i]);
  414.      var german = bfplugin.leoClearHTML(response[i+1]);
  415.      str += otherLang + ' = ' + german + ', ';                              // ** translation pair format **
  416.    }
  417.    str = str.replace(/, $/, '');                                            // delete last comma
  418.    var searchRegExp = new RegExp('\\b('+search+')\\b', 'gi');               // abbreviation ~ for search term
  419.    str = str.replace(searchRegExp, '~'); */
  420.    
  421.    var startdelimeter='<div data-dz-role="result">';            // start html-tag of translation
  422.    var enddelimeter="<h2>Weitere Treffer</h2>";             // end tag of translation
  423.    var startindexoutput=response.lastIndexOf(startdelimeter);       // corresponding start index/position
  424.    var endindexoutput=response.lastIndexOf(enddelimeter);       // end index/position
  425.    str=response.substring(startindexoutput,endindexoutput);     // extract translation as html (between start and end)
  426.    //...your regex rules end
  427.    return str;
  428.   },
  429.  
  430.   detectionProcessResponse: function(response){
  431.         /* // OLD APPROACH        
  432.     try{
  433.           var result = JSON.parse(String(response));
  434.           if(!result || !result.responseData || !result.responseData.language)
  435.              throw "error";
  436.        }catch(e){return "";}
  437.        return [result.responseData.language, result.responseData.isReliable, result.responseData.confidence]; */
  438.        
  439.         // NEW
  440.     // http://translate.google.de/translate_a/t?client=t&text=fenetre&hl=en&sl=auto&tl=de&ie=UTF-8&oe=UTF-8&multires=1&otf=2&ssel=0&tsel=0&uptl=de&sc=1
  441.     // will get
  442.     // file "t" with:
  443.     //[[["Fenster","fenetre","",""]],,"fr",,[["Fenster",[4],1,0,1000,0,1,0]],[["fenetre",4,[["Fenster",1000,1,0],["Fensters",0,1,0],["window",0,1,0]],[[0,7]],"fenetre"]],,,[["fr","en"]],4]
  444.     var detectedlang=response.replace(/,,/g,",[[]],");          // ",," replace with ",[[]],"
  445.     detectedlang=detectedlang.replace(/,,/g,",[[]],");          // again because of odd occurance of "," example ",,,"
  446.     detectedlang=detectedlang.match(/\]\],\"(.*?)\",\[\[/g);        // search for ]],"*",[[ where * is the detected language
  447.     if (detectedlang) {
  448.         var detectedlang=response.replace(/,,/g,",[[]],");
  449.         var detectedlang=detectedlang.replace(/,,/g,",[[]],");
  450.         detectedlang=detectedlang.match(/\]\],\"(.*?)\",\[\[/g);
  451.         detectedlang=""+detectedlang;                   //String(detectedlang)
  452.         //detectedlang=detectedlang.substring(4,6);         //alternative zu .match
  453.         detectedlang=detectedlang.replace(/"/g, '');    //delete "
  454.         detectedlang=detectedlang.replace(/\[/g, '');   //delete [
  455.         detectedlang=detectedlang.replace(/\]/g, '');   //delete ]
  456.         detectedlang=detectedlang.replace(/,/g, '');    //delete ,
  457.     }
  458.     else {
  459.         detectedlang="unknown";
  460.     }
  461.     alert("Detected language: "+detectedlang);
  462.     return [detectedlang, true, 1];                     // fake isReliable and fake confidence, since i have no time to extract
  463. /*  try{
  464.           var result = JSON.parse(String(response)));
  465.           if(!result || !result.responseData || !result.responseData.language)
  466.              throw "error";
  467.        }catch(e){return "";}
  468.        return [result.responseData.language, result.responseData.isReliable, result.responseData.confidence]; */
  469.      //
  470.   },
  471.  
  472.   //User defined function
  473.   //To use this function anywhere above you would address it with bfplugin.leoClearHTML(...)
  474.   leoClearHTML: function(str) {
  475.    str = str.replace(/<small>.*?<\/small>/gi, '');    // delete additional grammar hints
  476.    str = str.replace(/<sup>.*?<\/sup>/gi, '');
  477.    str = str.replace(/<[^>]*>/g, '');                 // delete all html tags
  478.    str = str.replace(/^\s+/,'').replace(/\s+$/,'');   // delete heading and trailing spaces
  479.    return str;
  480.   }
  481.  
  482.  
  483. };//never change this line
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement