1(function( $ ) { 2 'use strict'; 3 4 // Create the defaults once 5 var pluginName = "gdpr", 6 defaults = { 7 bla: "", 8 }; 9 10 // The actual plugin constructor 11 function Plugin ( element, options ) { 12 this.element = element; 13 this.settings = $.extend( {}, defaults, options ); 14 this._defaults = defaults; 15 16 this._name = pluginName; 17 this.init(); 18 } 19 20 // Avoid Plugin.prototype conflicts 21 $.extend( Plugin.prototype, { 22 init: function() { 23 var that = this; 24 this.window = $(window); 25 this.documentHeight = $( document ).height(); 26 this.windowHeight = this.window.height(); 27 this.privacySettingsCheckPerformed = false; 28 29 this.elements = {}; 30 this.elements.popUp = $('.wordpress-gdpr-popup-container'); 31 this.elements.popUpAgreeLink = $('.wordpress-gdpr-popup-agree'); 32 this.elements.popUpDeclineLink = $('.wordpress-gdpr-popup-decline'); 33 this.elements.popUpCloseLink = $('.wordpress-gdpr-popup-close'); 34 this.elements.popUpBackdrop = $('.wordpress-gdpr-popup-overlay-backdrop'); 35 36 this.privacySettingsLoaded = {}; 37 this.elements.privacySettingsPopupTrigger = $('.wordpress-gdpr-privacy-settings-trigger-container'); 38 this.elements.privacySettingsPopup = $('.wordpress-gdpr-privacy-settings-popup'); 39 this.elements.privacySettingsPopupPrivacySettings = $('.wordpress-gdpr-privacy-settings-popup-privacy-settings-modal'); 40 this.elements.privacySettingsPopupAgreeLink = $('.wordpress-gdpr-privacy-settings-popup-agree'); 41 this.elements.privacySettingsPopupDeclineLink = $('.wordpress-gdpr-privacy-settings-popup-decline'); 42 this.elements.privacySettingsPopupCloseLink = $('.wordpress-gdpr-privacy-settings-popup-close'); 43 this.elements.privacySettingsPopupBackdrop = $('.wordpress-gdpr-privacy-settings-popup-backdrop'); 44 45 if(this.settings.geoIP == "1") { 46 this.getUsersCountry(function(country) { 47 48 var euCountries = ['AT', 'BE', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'HU', 'IE', 'IT', 'LV', 'LT', 'LU', 'MT', 'NL', 'PL', 'PT', 'RO', 'SK', 'SI', 'ES', '
48SE', 'GB']; 49 var isEU = that.isInArray(country, euCountries); 50 if(isEU) { 51 that.popUp(); 52 } else { 53 $('.wordpress-gdpr-popup-actions-buttons .wordpress-gdpr-popup-agree').trigger('click'); 54 that.elements.privacySettingsPopupTrigger.remove(); 55 } 56 }); 57 58 } else { 59 this.popUp(); 60 } 61 62 this.popUpAgree(); 63 this.popUpClose(); 64 this.popUpDecline(); 65 66 this.popUpPrivacySettings(); 67 this.popUpPrivacySettingsOpen(); 68 this.popUpPrivacySettingsClose(); 69 70 this.privacyPolicyTermsAcceptance(); 71 this.commentFormprivacyPolicyTermsAcceptance(); 72 }, 73 popUp : function() { 74 75 var botPattern = "(craw|googlebot\/|bot|Googlebot-Mobile|Googlebot-Image|Google favicon|Mediapartners-Google|bingbot|Slurp|Java|wget|curl|Commons-HttpClient|Python-urllib|libwww|httpunit|nutch|phpcrawl|msnbot|jyxobot|FAST-WebCrawler|FAST Enterprise Crawler|biglotron|teoma|convera|seekbot|gigablast|exabot|ngbot|ia_archiver|GingerCrawler|webmon |httrack|webcrawler|grub.org|UsineNouvelleCrawler|antibot|netresearchserver|speedy|fluffy|bibnum.bnf|findlink|msrbot|panscient|yacybot|AISearchBot|IOI|ips-agent|tagoobot|MJ12bot|dotbot|woriobot|yanga|buzzbot|mlbot|yandexbot|purebot|Linguee Bot|Voyager|CyberPatrol|voilabot|baiduspider|citeseerxbot|spbot|twengabot|postrank|turnitinbot|scribdbot|page2rss|sitebot|linkdex|Adidxbot|blekkobot|ezooms|dotbot|Mail.RU_Bot|discobot|heritrix|findthatfile|europarchive.org|NerdByNature.Bot|sistrix crawler|ahrefsbot|Aboundex|domaincrawler|wbsearchbot|summify|ccbot|edisterbot|seznambot|ec2linkfinder|gslfbot|aihitbot|intelium_bot|facebookexternalhit|yeti|RetrevoPageAnalyzer|lb-spider|sogou|lssbot|careerbot|wotbox|wocbot|ichiro|DuckDuckBot|lssrocketcrawler|drupact|webcompanycrawler|acoonbot|openindexspider|gnam gnam spider|web-archive-net.com.bot|backlinkcrawler|coccoc|integromedb|content crawler spider|toplistbot|seokicks-robot|it2media-domain-crawler|ip-web-crawler.com|lighthouse|siteexplorer.info|elisabot|proximic|changedetection|blexbot|arabot|WeSEE:Search|niki-bot|CrystalSemanticsBot|rogerbot|360Spider|psbot|InterfaxScanBot|Lipperhey SEO Service|CC Metadata Scaper|g00g1e.net|GrapeshotCrawler|urlappendbot|brainobot|fr-crawler|binlar|SimpleCrawler|Livelapbot|Twitterbot|cXensebot|smtbot|bnf.fr_bot|A6-Indexer|ADmantX|Facebot|Twitterbot|OrangeBot|memorybot|AdvBot|MegaIndex|SemanticScholarBot|ltx71|nerdybot|xovibot|BUbiNG|Qwantify|archive.org_bot|Applebot|TweetmemeBot|crawler4j|findxbot|SemrushBot|yoozBot|lipperhey|y!j-asr|Domain Re-Animator Bot|AddThis|bot|googlebot|crawler|spider|robot|crawling)"; 76 var re = new RegExp(botPattern, 'i'); 77 if (re.test(navigator.userAgent)) { 78 return false; 79 } 80 81 var that = this; 82 var cookiesAllowed = false; 83 84 85 if(localStorage && that.getParameterByName('gdpr') !== "debug" && ( that.getCookie('wordpress_gdpr_cookies_allowed') || that.getCookie('wordpress_gdpr_cookies_declined') ) ) { 86 87 var retrievedObject = localStorage.getItem('wordpress_gdpr_services_allowed_temp'); 88 if(retrievedObject) { 89 var services = JSON.parse(retrievedObject); 90 that.executeServices(services); 91 return; 92 } 93 } 94 95 $.ajax({ 96 type : 'post', 97 url : that.settings.ajaxURL, 98 dataType : 'json', 99 data : { 100 action : 'check_privacy_setting', 101 setting : 'wordpress_gdpr_cookies_allowed', 102 current_page_id : that.get_current_page_id() 103 }, 104 success : function( response ) { 105 106 var popupExcludePages = that.settings.popupExcludePages; 107 var exclude = false; 108 if(!that.isEmpty(popupExcludePages)) { 109 var currentPage, matches = document.body.className.match(/(^|\s)post-id-(\d+)(\s|$)/); 110 if (matches) { 111 currentPage = matches[2]; 112 } else { 113 matches = document.body.className.match(/(^|\s)page-id-(\d+)(\s|$)/); 114 if (matches) { 115 currentPage = matches[2]; 116 } 117 } 118 if(currentPage !== "" && that.isInArray(currentPage, popupExcludePages)) { 119 exclude = true; 120 } 121 } 122 123 if(!exclude) { 124 if(response.firstTime) { 125 if(that.elements.popUpBackdrop.length > 0) { 126 that.elements.popUpBackdrop.show(); 127 } 128 $.each($('.gdpr-service-switch:not(:disabled)'), function(i, index) { 129 $(this).prop('checked', true); 130 }); 131 that.elements.popUp.show(); 132 } 133 else if((!response.allowed && !response.declined) || that.getParameterByName('gdpr') === "debug") { 134 if(that.elements.popUpBackdrop.length > 0) { 135 that.elements.popUpBackdrop.show(); 136 } 137 that.elements.popUp.show(); 138 } else { 139 if(that.elements.popUpBackdrop.length > 0) { 140 that.elements.popUpBackdrop.hide(); 141 } 142 that.elements.popUp.hide(); 143 } 144 } 145 146 if(response.declined == true) { 147 return; 148 } 149 that.checkPrivacySettings(); 150 }, 151 error: function (xhr, ajaxOptions, thrownError) { 152 console.log(xhr); 153 console.log(ajaxOptions); 154 console.log(thrownError); 155 } 156 }); 157 }, 158 popUpClose : function() { 159 160 var that = this; 161 162 $(that.elements.popUpCloseLink).on('click', function(e) { 163 e.preventDefault(); 164 if(that.elements.popUpBackdrop.length > 0) { 165 that.elements.popUpBackdrop.fadeOut(); 166 } 167 that.elements.popUp.fadeOut(); 168 }); 169 }, 170 popUpDecline : function() { 171 172 var that = this; 173 174 that.elements.popUpDeclineLink.on('click', function(e) { 175 176 e.preventDefault(); 177 178 var $this = $(this); 179 var text = $this.text(); 180 $this.html('<i class="fa fa-spinner fa-spin"></i>'); 181 182 $.ajax({ 183 type : 'post', 184 url : that.settings.ajaxURL, 185 dataType : 'json', 186 data : {
187 action : 'wordpress_gdpr_decline_cookies' 188 }, 189 success : function( response ) { 190 191 if(localStorage) { 192 localStorage.removeItem('wordpress_gdpr_services_allowed_temp'); 193 } 194 195 if(that.elements.popUpBackdrop.length > 0) { 196 that.elements.popUpBackdrop.fadeOut(); 197 } 198 $('.wordpress-gdpr-privacy-settings-popup, .wordpress-gdpr-privacy-settings-popup-backdrop').fadeOut(); 199 that.elements.popUp.fadeOut(); 200 $.each($('.gdpr-service-switch:not(:disabled)'), function(i, index) { 201 $(this).prop('checked', false); 202 }); 203 $this.text(text); 204 205 }, 206 error: function (xhr, ajaxOptions, thrownError) { 207 console.log(xhr); 208 console.log(ajaxOptions); 209 console.log(thrownError); 210 } 211 }); 212 }); 213 }, 214 popUpAgree : function() { 215 216 var that = this; 217 218 that.elements.popUpAgreeLink.on('click', function(e) { 219 e.preventDefault(); 220 221 var $this = $(this); 222 var text = $this.text(); 223 $this.html('<i class="fa fa-spinner fa-spin"></i>'); 224 225 $.ajax({ 226 type : 'post', 227 url : that.settings.ajaxURL, 228 dataType : 'json', 229 data : { 230 action : 'wordpress_gdpr_allow_cookies' 231 }, 232 success : function( response ) { 233 234 if(localStorage) { 235 localStorage.removeItem('wordpress_gdpr_services_allowed_temp'); 236 } 237 238 if(that.elements.popUpBackdrop.length > 0) { 239 that.elements.popUpBackdrop.fadeOut(); 240 } 241 $('.wordpress-gdpr-privacy-settings-popup, .wordpress-gdpr-privacy-settings-popup-backdrop').fadeOut(); 242 that.elements.popUp.fadeOut(); 243 $.each($('.gdpr-service-switch:not(:disabled)'), function(i, index) { 244 $(this).prop('checked', true); 245 }); 246 247 that.checkPrivacySettings(); 248 $this.text(text); 249 }, 250 error: function (xhr, ajaxOptions, thrownError) { 251 console.log(xhr); 252 console.log(ajaxOptions); 253 console.log(thrownError); 254 } 255 }); 256 }); 257 }, 258 popUpPrivacySettingsOpen : function () { 259 260 var that = this; 261 262 $('.wordpress-gdpr-open-privacy-settings-modal').on('click', function(e) { 263 e.preventDefault(); 264 265 if(($('.wordpress-gdpr-privacy-settings-popup-services-container').length < 1)) { 266 alert('No GDPR Service Categories / Services created yet. Remove the trigger or create services and attach them to service categories first.'); 267 return false; 268 } 269 270 if($('.wordpress-gdpr-popup').length > 0) { 271 $('.wordpress-gdpr-popup').hide(0, function() { 272 $('.wordpress-gdpr-privacy-settings-popup, .wordpress-gdpr-privacy-settings-popup-backdrop').fadeIn(); 273 }); 274 } else { 275 $('.wordpress-gdpr-privacy-settings-popup, .wordpress-gdpr-privacy-settings-popup-backdrop').fadeIn(); 276 } 277 }); 278 }, 279 popUpPrivacySettingsClose : function () { 280 var that = this; 281 282 $(that.elements.privacySettingsPopupCloseLink).on('click', function(e) { 283 e.preventDefault(); 284 if(that.elements.privacySettingsPopupBackdrop.length > 0) { 285 that.elements.privacySettingsPopupBackdrop.fadeOut(); 286 } 287 that.elements.privacySettingsPopup.fadeOut(); 288 }); 289 290 if(!that.settings.privacySettingsPopupBackdropDisableClick) { 291 $(that.elements.privacySettingsPopupBackdrop).on('click', function(e) { 292 e.preventDefault(); 293 if(that.elements.privacySettingsPopupBackdrop.length > 0) { 294 that.elements.privacySettingsPopupBackdrop.fadeOut(); 295 } 296 that.elements.privacySettingsPopup.fadeOut(); 297 }); 298 } 299 }, 300 popUpPrivacySettings : function() { 301 302 $('.wordpress-gdpr-popup-privacy-settings-open-service-category').on('click', function(e) { 303 e.preventDefault(); 304 305 var id = $(this).data('id'); 306 $('.wordpress-gdpr-popup-privacy-settings-services-content:not(#wordpress-gdpr-popup-privacy-settings-services-content-' + id + ')').hide(0, function() { 307 $('#wordpress-gdpr-popup-privacy-settings-services-content-' + id).show(); 308 }); 309 }); 310 311 $('.wordpress-gdpr-popup-privacy-settings-services-content-title').on('click', function(e) { 312 e.preventDefault(); 313 314 var $this = $(this); 315 var id= $(this).data('id'); 316 var fa = $this.find('.fa'); 317 318 var description = $('#wordpress-gdpr-popup-privacy-settings-services-content-description-' + id); 319 if (description.css('display') == 'none') { 320 description.slideDown(); 321 fa.removeClass('fa-caret-right').addClass('fa-caret-down'); 322 } else {
323 description.slideUp(); 324 fa.removeClass('fa-caret-down').addClass('fa-caret-right'); 325 } 326 }); 327 }, 328 checkPrivacySettings : function() { 329 330 var that = this; 331 var settings = {}; 332 var switches = $('.gdpr-service-switch'); 333 334 $.each(switches, function() { 335 var serviceID = $(this).data('id'); 336 settings[serviceID] = serviceID; 337 }); 338 339 $.ajax({ 340 type : 'post', 341 url : that.settings.ajaxURL, 342 dataType : 'json', 343 data : { 344 action : 'check_privacy_settings', 345 settings : settings, 346 }, 347 success : function( response ) { 348 349 if(localStorage) { 350 localStorage.setItem('wordpress_gdpr_services_allowed_temp', JSON.stringify(response)); 351 } 352 353 that.executeServices(response); 354 }, 355 error: function (xhr, ajaxOptions, thrownError) { 356 console.log(xhr); 357 console.log(ajaxOptions); 358 console.log(thrownError); 359 } 360 }); 361 }, 362 executeServices : function(services) { 363 364 if(!services) { 365 return; 366 } 367 368 var that = this; 369 $.each(services, function(i, index) { 370 371 if(index.allowed && !that.privacySettingsLoaded[i]) { 372 if(index.head !== "") { 373 $("head").append(index.head); 374 } 375 376 if(index.body !== "") { 377 $(index.body).prependTo($('body')); 378 } 379 } 380 381 if(index.adsense == "1" && !index.allowed && that.privacySettingsLoaded[i]) { 382 var adsExists = $(".adsbygoogle"); 383 384 if(adsExists.length > 0 && that.getCookie('wordpress_gdpr_adsense_allowed') !== "true") { 385 adsExists.remove(); 386 } 387 } 388 389 var checkbox_exists = $('input[name="' + i + '"]') ; 390 if(checkbox_exists.length > 0) { 391 if(index.allowed) { 392 checkbox_exists.prop('checked', true); 393 that.privacySettingsLoaded[i] = true; 394 } else { 395 checkbox_exists.prop('checked', false); 396 that.privacySettingsLoaded[i] = false; 397 } 398 } 399 400 if(checkbox_exists.length > 0 && !that.privacySettingsCheckPerformed) { 401 402 checkbox_exists.on('change', function(e) { 403 404 var checked = $(this).prop('checked'); 405 var name = $(this).prop('name'); 406 407 $('.wordpress-gdpr-privacy-settings-popup-message').fadeIn(); 408 409 $.ajax({ 410 type : 'post', 411 url : that.settings.ajaxURL, 412 dataType : 'json', 413 data : { 414 action : 'update_privacy_setting', 415 setting : name, 416 checked : checked, 417 }, 418 success : function( response ) { 419 420 if(localStorage) { 421 localStorage.removeItem('wordpress_gdpr_services_allowed_temp'); 422 } 423 424 setTimeout(function(){ $('.wordpress-gdpr-privacy-settings-popup-message').fadeOut(); }, 1500); 425 426 var index = response[name]; 427 if(index.head !== "" && index.allowed && !that.privacySettingsLoaded[name]) { 428 $("head").append(index.head); 429 } 430 if(index.body !== "" && index.allowed && !that.privacySettingsLoaded[name]) { 431 $(index.body).prependTo($('body')); 432 } 433 434 if(index.adsense == "1" && !index.allowed && !that.privacySettingsLoaded[name]) { 435 var adsExists = $(".adsbygoogle"); 436 437 if(adsExists.length >
437 0 && that.getCookie('wordpress_gdpr_adsense_allowed') !== "true") { 438 adsExists.remove(); 439 } 440 } 441 442 443 var checkbox_exists = $('input[name="' + name + '"]') ; 444 if(checkbox_exists.length > 0) { 445 if(index.allowed) { 446 checkbox_exists.prop('checked', true); 447 that.privacySettingsLoaded[name] = true; 448 } else { 449 checkbox_exists.prop('checked', false); 450 } 451 } 452 } 453 }); 454 }); 455 } 456 }); 457 that.privacySettingsCheckPerformed = true; 458 }, 459 get_current_page_id : function() { 460 var page_body = $('body.page'); 461 462 var id = 0; 463 464 if(page_body) { 465 var page_body_class = page_body.attr('class') 466 467 if(page_body_class || page_body_class != null) { 468 if(page_body_class.length > 1) { 469 var page_body_class_list = page_body_class.split(/\s+/); 470 471 $.each(page_body_class_list, function(index, item) { 472 if (item.indexOf('page-id') >= 0) { 473 var item_arr = item.split('-'); 474 id = item_arr[item_arr.length -1]; 475 return false; 476 } 477 }); 478 } 479 } 480 } 481 return id; 482 }, 483 getUsersCountry : function(callback) { 484 var that = this; 485 486 $.ajax({ 487 url: "https://get.geojs.io/v1/ip/geo.json", 488 type: 'get', 489 dataType: 'json', 490 success : function( response ) { 491 callback(response.country_code); 492 }, 493 error: function(jqXHR, textStatus, errorThrown) { 494 console.log(jqXHR); 495 console.log(textStatus); 496 console.log(errorThrown); 497 } 498 }); 499 }, 500 commentFormprivacyPolicyTermsAcceptance : function() { 501 var that = this; 502 503 var submit = $('#commentform input[type="submit"]'); 504 if(submit.length < 1) { 505 return false; 506 } 507 508 var checkbox = $('#commentform #privacy_policy'); 509 if(checkbox.length < 1) { 510 return false; 511 } 512 513 submit.on('click', function(e) { 514 var checkboxChecked = checkbox.is(':checked'); 515 if(!checkboxChecked) { 516 e.preventDefault(); 517 alert(that.settings.acceptanceText); 518 return false; 519 } 520 521 $.ajax({ 522 type : 'post', 523 url : that.settings.ajaxURL, 524 dataType : 'json', 525 data : { 526 action : 'wordpress_gdpr_update_privacy_policy_terms', 527 setting : 'wordpress_gdpr_privacy_policy_accepted', 528 checked : checkboxChecked, 529 } 530 }); 531 return true; 532 }); 533 }, 534 privacyPolicyTermsAcceptance : function() { 535 var that = this; 536 537 if($('#accept-privacy-policy-checkbox').length < 1 && $('#accept-terms-conditions-checkbox').length < 1) { 538 return false; 539 } 540 541 $('#accept-privacy-policy-checkbox').on('click', function(e) { 542 var name = $(this).prop('name'); 543 var checked = $(this).prop('checked'); 544 545 if(!checked) { 546 alert(that.settings.acceptanceText); 547 return false;
548 } 549 550 $.ajax({ 551 type : 'post', 552 url : that.settings.ajaxURL, 553 dataType : 'json', 554 data : { 555 action : 'wordpress_gdpr_update_privacy_policy_terms', 556 setting : name, 557 checked : checked, 558 }, 559 }); 560 }); 561 562 $('#accept-terms-conditions-checkbox').on('click', function(e) { 563 var name = $(this).prop('name'); 564 var checked = $(this).prop('checked'); 565 566 // if(!checked) { 567 // alert(that.settings.termsAcceptanceText); 568 // return false; 569 // } 570 571 $.ajax({ 572 type : 'post', 573 url : that.settings.ajaxURL, 574 dataType : 'json', 575 data : { 576 action : 'wordpress_gdpr_update_privacy_policy_terms', 577 setting : name, 578 checked : checked, 579 }, 580 }); 581 }); 582 },
583 ////////////////////// 584 ///Helper Functions/// 585 ////////////////////// 586 deleteAllCookies : function() { 587 var cookies = document.cookie.split(";"); 588 console.log(cookies); 589 for (var i = 0; i < cookies.length; i++) { 590 var cookie = cookies[i]; 591 var eqPos = cookie.indexOf("="); 592 var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie; 593 document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT"; 594 } 595 596 }, 597 isEmpty: function(obj) { 598 599 if (obj == null) return true; 600 if (obj.length > 0) return false; 601 if (obj.length === 0) return true; 602 603 for (var key in obj) { 604 if (hasOwnProperty.call(obj, key)) return false; 605 } 606 607 return true; 608 }, 609 sprintf: function parse(str) { 610 var args = [].slice.call(arguments, 1), 611 i = 0; 612 613 return str.replace(/%s/g, function() { 614 return args[i++]; 615 616 }); 617 }, 618 getCookie: function(cname) { 619 var name = cname + "="; 620 var ca = document.cookie.split(';'); 621 for(var i=0; i<ca.length; i++) { 622 var c = ca[i]; 623 while (c.charAt(0)==' ') c = c.substring(1); 624 if (c.indexOf(name) === 0) return c.substring(name.length, c.length); 625 } 626 return ""; 627 }, 628 createCookie: function(name, value, days) { 629 var expires = ""; 630 631 if (days) { 632 var date = new Date(); 633 date.setTime(date.getTime() + (days*24*60*60*1000)); 634 var expires = "; expires="+date.toGMTString(); 635 } 636 637 document.cookie = name + "=" + value+expires + "; path=/"; 638 }, 639 deleteCookie: function(name) { 640 this.createCookie(name, '', -10); 641 }, 642 getParameterByName: function(name, url) { 643 if (!url) url = window.location.href; 644 name = name.replace(/[\[\]]/g, "\\$&"); 645 var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)", "i"), 646 results = regex.exec(url); 647 if (!results) return null; 648 if (!results[2]) return ''; 649 return decodeURIComponent(results[2].replace(/\+/g, " ")); 650 }, 651 isInArray : function (value, array) { 652 return array.indexOf(value) > -1; 653 } 654 } ); 655 656 // Constructor wrapper 657 $.fn[ pluginName ] = function( options ) { 658 return this.each( function() { 659 if ( !$.data( this, "plugin_" + pluginName ) ) { 660 $.data( this, "plugin_" + 661 pluginName, new Plugin( this, options ) ); 662 } 663 } ); 664 }; 665 666 $(document).ready(function() { 667 668 $( "body" ).gdpr( 669 gdpr_options 670 ); 671 672 } ); 673 674})( jQuery );
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.