1function supportsTransitions() { 2 return getSupportedTransition() != ''; 3} 4 5function getSupportedTransition() { 6 var b = document.body || document.documentElement, 7 s = b.style, 8 p = 'transition'; 9 10 if (typeof s[p] == 'string') { return p; } 11 12 // Tests for vendor specific prop 13 var v = ['Moz', 'webkit', 'Webkit', 'Khtml', 'O', 'ms']; 14 p = p.charAt(0).toUpperCase() + p.substr(1); 15 16 for (var i=0; i<v.length; i++) { 17 if (typeof s[v[i] + p] == 'string') { return true; } 18 } 19 20 return ''; 21} 22window.supportedTransition = getSupportedTransition(); 23window.supportsTransitions = supportsTransitions(); 24 25function supportsAnimations() { 26 return getSupportedAnimation() != ''; 27} 28 29function getSupportedAnimation() { 30 var t, 31 el = document.createElement("fakeelement"); 32 33 var animations = { 34 "animation" : "animationend", 35 "OAnimation" : "oAnimationEnd", 36 "MozAnimation" : "animationend", 37 "WebkitAnimation": "webkitAnimationEnd", 38 'msAnimation' : 'MSAnimationEnd' 39 }; 40 41 for (t in animations){ 42 if (el.style[t] !== undefined) { 43 return t; 44 } 45 } 46 return ''; 47} 48window.supportedAnimation = getSupportedAnimation(); 49window.supportsAnimations = supportsAnimations(); 50 51function getMobileMenuType() { 52 if(!document.getElementById('site-header')) return 'default'; 53 var m = document.getElementById('site-header').className.match(/mobile-menu-layout-([a-zA-Z0-9]+)/); 54 window.gemMobileMenuType = m ? m[1] : 'default'; 55 return window.gemMobileMenuType; 56} 57getMobileMenuType(); 58 59(function() { 60 var logoFixTimeout = false; 61 62 function getElementPosition(elem) { 63 var w = elem.offsetWidth, 64 h = elem.offsetHeight, 65 l = 0, 66 t = 0; 67 68 while (elem) { 69 l += elem.offsetLeft; 70 t += elem.offsetTop; 71 elem = elem.offsetParent; 72 } 73 return {"left":l, "top":t, "width": w, "height":h}; 74 } 75 76 function fixMenuLogoPosition() { 77 if (logoFixTimeout) { 78 clearTimeout(logoFixTimeout); 79 } 80 81 var headerMain = document.querySelector('#site-header .header-main'); 82 if (headerMain == null) { 83 return false; 84 } 85 86 var headerMainClass = headerMain.className; 87 if (headerMainClass.indexOf('logo-position-menu_center') == -1 || headerMainClass.indexOf('header-layout-fullwidth_hamburger') != -1 || headerMainClass.indexOf('header-layout-vertical') != -1) { 88 return false; 89 } 90 91 logoFixTimeout = setTimeout(function() { 92 var page = document.getElementById('page'), 93 primaryMenu = document.getElementById('primary-menu'), 94 primaryNavigation = document.getElementById('primary-navigation'), 95 windowWidth = page.offsetWidth; 96 97 if (headerMainClass.indexOf('header-layout-fullwidth') != -1) { 98 var logoItem = primaryMenu.querySelector('.menu-item-logo'), 99 lastItem = primaryNavigation.querySelector('#primary-menu > li:last-child'); 100 101 primaryMenu.style.display = ''; 102 logoItem.style.marginLeft = ''; 103 logoItem.style.marginRight = ''; 104 105 if (windowWidth < 1212) { 106 return; 107 } 108 109 primaryMenu.style.display = 'block'; 110 111 var pageCenter = windowWidth / 2, 112 logoOffset = getElementPosition(logoItem), 113 offset = pageCenter - logoOffset.left - logoItem.offsetWidth / 2; 114 115 logoItem.style.marginLeft = offset + 'px'; 116 117 var primaryMenuOffsetWidth = primaryMenu.offsetWidth, 118 primaryMenuOffsetLeft = getElementPosition(primaryMenu).left, 119 lastItemOffsetWidth = lastItem.offsetWidth, 120 lastItemOffsetLeft = getElementPosition(lastItem).left, 121 rightItemsOffset = primaryMenuOffsetWidth - lastItemOffsetLeft - lastItemOffsetWidth + primaryMenuOffsetLeft; 122 123 logoItem.style.marginRight = rightItemsOffset + 'px'; 124 } else { 125 if (windowWidth < 1212) { 126 primaryNavigation.style.textAlign = ''; 127 primaryMenu.style.position = ''; 128 primaryMenu.style.left = ''; 129 return; 130 } 131 132 primaryNavigation.style.textAlign = 'left'; 133 primaryMenu.style.left = 0 + 'px'; 134 135 var pageCenter = windowWidth / 2, 136 logoOffset = getElementPosition(document.querySelector('#site-header .header-main #primary-navigation .menu-item-logo')), 137 pageOffset = getElementPosition(page), 138 offset = pageCenter - (logoOffset.left - pageOffset.left) - document.querySelector('#site-header .header-main #primary-navigation .menu-item-logo').offsetWidth / 2; 139 140 primaryMenu.style.position = 'relative'; 141 primaryMenu.style.left = offset + 'px'; 142 } 143 }, 50); 144 } 145 146 window.fixMenuLogoPosition = fixMenuLogoPosition; 147 148})(); 149 150 151(function($) { 152 /* PRIMARY MENU */ 153 154 var isVerticalMenu = $('.header-main').hasClass('header-layout-vertical'), 155 isHamburgerMenu = $('.header-main').hasClass('header-layout-fullwidth_hamburger'); 156 157 $(window).resize(function() { 158 window.updateGemClientSize(false); 159 window.updateGemInnerSize(); 160 }); 161 162 window.menuResizeTimeoutHandler = false;
163 164 var megaMenuSettings = {}; 165 166 function getOffset(elem) { 167 if (elem.getBoundingClientRect && window.gemBrowser.platform.name != 'ios'){ 168 var bound = elem.getBoundingClientRect(), 169 html = elem.ownerDocument.documentElement, 170 htmlScroll = getScroll(html), 171 elemScrolls = getScrolls(elem), 172 isFixed = (styleString(elem, 'position') == 'fixed'); 173 return { 174 x: parseInt(bound.left) + elemScrolls.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft, 175 y: parseInt(bound.top) + elemScrolls.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop 176 }; 177 } 178 179 var element = elem, position = {x: 0, y: 0}; 180 if (isBody(elem)) return position; 181 182 while (element && !isBody(element)){ 183 position.x += element.offsetLeft; 184 position.y += element.offsetTop; 185 186 if (window.gemBrowser.name == 'firefox'){ 187 if (!borderBox(element)){ 188 position.x += leftBorder(element); 189 position.y += topBorder(element); 190 } 191 var parent = element.parentNode; 192 if (parent && styleString(parent, 'overflow') != 'visible'){ 193 position.x += leftBorder(parent); 194 position.y += topBorder(parent); 195 } 196 } else if (element != elem && window.gemBrowser.name == 'safari'){ 197 position.x += leftBorder(element); 198 position.y += topBorder(element); 199 } 200 201 element = element.offsetParent; 202 } 203 if (window.gemBrowser.name == 'firefox' && !borderBox(elem)){ 204 position.x -= leftBorder(elem); 205 position.y -= topBorder(elem); 206 } 207 return position; 208 }; 209 210 function getScroll(elem){ 211 return {x: window.pageXOffset || document.documentElement.scrollLeft, y: window.pageYOffset || document.documentElement.scrollTop}; 212 }; 213 214 function getScrolls(elem){ 215 var element = elem.parentNode, position = {x: 0, y: 0}; 216 while (element && !isBody(element)){ 217 position.x += element.scrollLeft; 218 position.y += element.scrollTop; 219 element = element.parentNode; 220 } 221 return position; 222 }; 223 224 function styleString(element, style) { 225 return $(element).css(style); 226 }; 227 228 function styleNumber(element, style){ 229 return parseInt(styleString(element, style)) || 0; 230 }; 231 232 function borderBox(element){ 233 return styleString(element, '-moz-box-sizing') == 'border-box'; 234 }; 235
236 function topBorder(element){ 237 return styleNumber(element, 'border-top-width'); 238 }; 239 240 function leftBorder(element){ 241 return styleNumber(element, 'border-left-width'); 242 }; 243 244 function isBody(element){ 245 return (/^(?:body|html)$/i).test(element.tagName); 246 }; 247 248 249 function checkMegaMenuSettings() { 250 if (window.customMegaMenuSettings == undefined || window.customMegaMenuSettings == null) { 251 return false; 252 } 253 254 var uri = window.location.pathname; 255 256 window.customMegaMenuSettings.forEach(function(item) { 257 for (var i = 0; i < item.urls.length; i++) { 258 if (uri.match(item.urls[i])) { 259 megaMenuSettings[item.menuItem] = item.data; 260 } 261 } 262 }); 263 } 264 265 function fixMegaMenuWithSettings() { 266 checkMegaMenuSettings(); 267 268 $('#primary-menu > li.megamenu-enable').each(function() { 269 var m = this.className.match(/(menu-item-(\d+))/); 270 if (!m) { 271 return; 272 } 273 274 var itemId = parseInt(m[2]); 275 if (megaMenuSettings[itemId] == undefined || megaMenuSettings[itemId] == null) { 276 return; 277 } 278 279 var $item = $('> ul', this); 280 281 if (megaMenuSettings[itemId].masonry != undefined) { 282 if (megaMenuSettings[itemId].masonry) { 283 $item.addClass('megamenu-masonry'); 284 } else { 285 $item.removeClass('megamenu-masonry'); 286 } 287 } 288 289 if (megaMenuSettings[itemId].style != undefined) { 290 $(this).removeClass('megamenu-style-default megamenu-style-grid').addClass('megamenu-style-' + megaMenuSettings[itemId].style); 291 } 292 293 var css = {}; 294 295 if (megaMenuSettings[itemId].backgroundImage != undefined) { 296 css.backgroundImage = megaMenuSettings[itemId].backgroundImage; 297 } 298 299 if (megaMenuSettings[itemId].backgroundPosition != undefined) { 300 css.backgroundPosition = megaMenuSettings[itemId].backgroundPosition; 301 } 302 303 if (megaMenuSettings[itemId].padding != undefined) { 304 css.padding = megaMenuSettings[itemId].padding; 305 } 306 307 if (megaMenuSettings[itemId].borderRight != undefined) { 308 css.borderRight = megaMenuSettings[itemId].borderRight; 309 } 310 311 $item.css(css); 312 }); 313 } 314 315 function isResponsiveMenuVisible() { 316 // var menuToggleDisplay = $('.menu-toggle').css('display'); 317 // return menuToggleDisplay == 'block' || menuToggleDisplay == 'inline-block'; 318 return $('.menu-toggle').is(':visible'); 319 } 320 window.isResponsiveMenuVisible = isResponsiveMenuVisible; 321 322 function isTopAreaVisible() { 323 return window.gemSettings.topAreaMobileDisable ? window.gemOptions.clientWidth >= 768 : true; 324 } 325 window.isTopAreaVisible = isTopAreaVisible; 326 327 function isVerticalToggleVisible() { 328 return window.gemOptions.clientWidth > 1600; 329 } 330 331 $('#primary-menu > li.megamenu-enable').hover( 332 function() { 333 fix_megamenu_position(this); 334 }, 335 function() {} 336 ); 337 338 $('#primary-menu > li.megamenu-enable:hover').each(function() { 339 fix_megamenu_position(this); 340 }); 341 342 $('#primary-menu > li.megamenu-enable').each(function() { 343 var $item = $('> ul', this); 344 if($item.length == 0) return; 345 $item.addClass('megamenu-item-inited'); 346 }); 347 348 function fix_megamenu_position(elem) { 349 if (!$('.megamenu-inited', elem).length && isResponsiveMenuVisible()) { 350 return false; 351 } 352 353 var $item = $('> ul', elem); 354 if($item.length == 0) return; 355 var self = $item.get(0); 356 357 $item.addClass('megamenu-item-inited'); 358 359 var default_item_css = { 360 width: 'auto', 361 height: 'auto' 362 }; 363 364 if (!isVerticalMenu && !isHamburgerMenu) { 365 default_item_css.left = 0; 366 } 367 368 $item 369 .removeClass('megamenu-masonry-inited megamenu-fullwidth') 370 .css(default_item_css); 371 372 $(' > li', $item).css({ 373 left: 0, 374 top: 0 375 }).each(function() { 376 var old_width = $(this).data('old-width') || -1; 377 if (old_width != -1) { 378 $(this).width(old_width).data('old-width', -1); 379 } 380 }); 381 382 if (isResponsiveMenuVisible()) { 383 return; 384 } 385 386 if (isVerticalMenu) { 387 var container_width = window.gemOptions.clientWidth - $('#site-header-wrapper').outerWidth(); 388 } else if (isHamburgerMenu) { 389 var container_width = window.gemOptions.clientWidth - $('#primary-menu').outerWidth(); 390 } else { 391 var $container = $item.closest('.header-main'), 392 container_width = $container.width(), 393 container_padding_left = parseInt($container.css('padding-left')), 394 container_padding_right = parseInt($container.css('padding-right')), 395 parent_width = $item.parent().outerWidth(); 396 } 397 398 var megamenu_width = $item.outerWidth(); 399 400 if (megamenu_width > container_width) { 401 megamenu_width = container_width; 402 var new_megamenu_width = container_width - parseInt($item.css('padding-left')) - parseInt($item.css('padding-right')); 403 var columns = $item.data('megamenu-columns') || 4; 404 var column_width = parseFloat(new_megamenu_width - columns * parseInt($(' > li:first', $item).css('margin-left'))) / columns; 405 var column_width_int = parseInt(column_width); 406 $(' > li', $item).each(function() { 407 $(this).data('old-width', $(this).width()).css('width', column_width_int); 408 }); 409 $item.addClass('megamenu-fullwidth').width(new_megamenu_width - (column_width - column_width_int) * columns); 410 } 411 412 if (!isVerticalMenu && !isHamburgerMenu) { 413 if (megamenu_width > parent_width) { 414 var left = -(megamenu_width - parent_width) / 2; 415 } else { 416 var left = 0; 417 } 418 419 var container_offset = getOffset($container[0]); 420 var megamenu_offset = getOffset(self); 421 422 if ((megamenu_offset.x - container_offset.x - container_padding_left + left) < 0) { 423 left = -(megamenu_offset.x - container_offset.x - container_padding_left); 424 } 425 426 if ((megamenu_offset.x + megamenu_width + left) > (container_offset.x + $container.outerWidth() - container_padding_right)) { 427 left -= (megamenu_offset.x + megamenu_width + left) - (container_offset.x + $container.outerWidth() - container_padding_right); 428 } 429 430 $item.css('left', left).css('left'); 431 } 432 433 if ($item.hasClass('megamenu-masonry')) { 434 var positions = {}, 435 max_bottom = 0; 436 437 $item.width($item.width() - 1); 438 var new_row_height = $('.megamenu-new-row', $item).outerHeight() + parseInt($('.megamenu-new-row', $item).css('margin-bottom')); 439 440 $('> li.menu-item', $item).each(function() { 441 var pos = $(this).position(); 442 if (positions[pos.left] != null && positions[pos.left] != undefined) { 443 var top_position = positions[pos.left]; 444 } else { 445 var top_position = pos.top; 446 } 447 positions[pos.left] = top_position + $(this).outerHeight() + new_row_height + parseInt($(this).css('margin-bottom')); 448 if (positions[pos.left] > max_bottom) 449 max_bottom = positions[pos.left]; 450 $(this).css({ 451 left: pos.left, 452 top: top_position 453 }) 454 }); 455 456 $item.height(max_bottom - new_row_height - parseInt($item.css('padding-top')) - 1); 457 $item.addClass('megamenu-masonry-inited'); 458 } 459 460 if ($item.hasClass('megamenu-empty-right')) { 461 var mega_width = $item.width(); 462 var max_rights = { 463 columns: [], 464 position: -1 465 }; 466 467 $('> li.menu-item', $item).removeClass('megamenu-no-right-border').each(function() { 468 var pos = $(this).position(); 469 var column_right_position = pos.left + $(this).width(); 470 471 if (column_right_position > max_rights.position) { 472 max_rights.position = column_right_position; 473 max_rights.columns = []; 474 } 475 476 if (column_right_position == max_rights.position) { 477 max_rights.columns.push($(this)); 478 } 479 }); 480 481 if (max_rights.columns.length && max_rights.position >= (mega_width - 7)) { 482 max_rights.columns.forEach(function($li) { 483 $li.addClass('megamenu-no-right-border'); 484 }); 485 } 486 } 487 488 if (isVerticalMenu || isHamburgerMenu) { 489 var clientHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight, 490 itemOffset = $item.offset(), 491 itemHeight = $item.outerHeight(), 492 scrollTop = $(window).scrollTop(); 493 494 if (itemOffset.top - scrollTop + itemHeight > clientHeight) { 495 $item.css({ 496 top: clientHeight - itemOffset.top + scrollTop - itemHeight - 20 497 }); 498 } 499 } 500 501 $item.addClass('megamenu-inited'); 502 } 503 504 function primary_menu_reinit() { 505 if(isResponsiveMenuVisible()) { 506 if (window.gemMobileMenuType == 'default') { 507 var $submenuDisabled = $('#primary-navigation .dl-submenu-disabled'); 508 if ($submenuDisabled.length) { 509 $submenuDisabled.addClass('dl-submenu').removeClass('dl-submenu-disabled'); 510 } 511 } 512 if ($('#primary-menu').hasClass('no-responsive')) { 513 $('#primary-menu').removeClass('no-responsive'); 514 } 515 if (!$('#primary-navigation').hasClass('responsive')) { 516 $('#primary-navigation').addClass('responsive'); 517 } 518 window.fixMenuLogoPosition(); 519 } else { 520 if (window.gemMobileMenuType == 'overlay' && !$('.header-layout-overlay').length && $('.menu-overlay').hasClass('active')) { 521 $('.mobile-menu-layout-overlay .menu-toggle').click(); 522 } 523 524 $('#primary-navigation').addClass('without-transition'); 525 526 if (window.gemMobileMenuType == 'default') { 527 $('#primary-navigation .dl-submenu').addClass('dl-submenu-disabled').removeClass('dl-submenu'); 528 } 529 $('#primary-menu').addClass('no-responsive'); 530 $('#primary-navigation').removeClass('responsive'); 531 532 window.fixMenuLogoPosition(); 533 534 setTimeout(function() { 535 $('#primary-menu ul:not(.minicart ul), #primary-menu .minicart, #primary-menu .minisearch').each(function() { 536 var $item = $(this); 537 var self = this; 538 $item.removeClass('invert'); 539 $item.removeClass('vertical-invert'); 540 $item.css({top: ''}); 541 if ($item.closest('.megamenu-enable').size() == 0 && $item.closest('.header-layout-overlay').size() == 0) { 542 if($item.offset().left - $('#page').offset().left + $item.outerWidth() > $('#page').width()) { 543 $item.addClass('invert'); 544 } 545 if($('.header-main').first().hasClass('header-style-vertical')) { 546 if($item.offset().top - $('#site-header').offset().top + $item.outerHeight() > $(window).height()) { 547 $item.addClass('vertical-invert'); 548 $item.css({ top: -($item.offset().top - $('#site-header').offset().top + $item.outerHeight() - $(window).height()) + 'px' }); 549 } 550 } else if($item, $item.parents('#primary-menu ul').length) { 551 if($item.offset().top - $('#site-header').offset().top + $item.outerHeight() > $(window).height()) { 552 $item.addClass('vertical-invert'); 553 $item.css({ top: -($item.offset().top - $('#site-header').offset().top + $item.outerHeight() - $(window).height()) + 'px' }); 554 } 555 } 556 } 557 }); 558 }, 50); 559 560 $('#primary-navigation').removeClass('without-transition'); 561 } 562 } 563 564 if (window.gemMobileMenuType == 'default') { 565 $('#primary-navigation .submenu-languages').addClass('dl-submenu'); 566 } 567 $('#primary-navigation > ul> li.menu-item-language').addClass('menu-item-parent'); 568 569 fixMegaMenuWithSettings(); 570 571 if (window.gemMobileMenuType == 'default') { 572 $('#primary-navigation').dlmenu({ 573 animationClasses: { 574 classin : 'dl-animate-in', 575 classout : 'dl-animate-out' 576 }, 577 onLevelClick: function (el, name) { 578 $('html, body').animate({ scrollTop : 0 }); 579 }, 580 backLabel: thegem_dlmenu_settings.backLabel, 581 showCurrentLabel: thegem_dlmenu_settings.showCurrentLabel 582 }); 583 } 584 primary_menu_reinit(); 585 586 $('.hamburger-toggle').click(function(e) { 587 e.preventDefault(); 588 $(this).closest('#primary-navigation').toggleClass('hamburger-active'); 589 $('.hamburger-overlay').toggleClass('active'); 590 }); 591 592 $('.overlay-toggle, .mobile-menu-layout-overlay .menu-toggle').click(function(e) { 593 e.preventDefault(); 594 if($('.menu-overlay').hasClass('active')) { 595 $('.menu-overlay').removeClass('active'); 596 $(this).closest('#primary-navigation').addClass('close'); 597 $(this).closest('#primary-navigation').one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function(e) { 598 $(this).closest('#primary-navigation').removeClass('overlay-active close'); 599 $('.overlay-menu-wrapper').removeClass('active'); 600 }); 601 } else { 602 $('.overlay-menu-wrapper').addClass('active'); 603 $(this).closest('#primary-navigation').off('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend'); 604 $(this).closest('#primary-navigation').addClass('overlay-active').removeClass('close'); 605 $('.menu-overlay').addClass('active'); 606 } 607 }); 608 609 $('.header-layout-overlay #primary-menu a, .mobile-menu-layout-overlay #primary-navigation.responsive #primary-menu a').on('click', function(e) { 610 //if(!$('#primary-menu').hasClass('no-responsive')) return ; 611 612 var $itemLink = $(this); 613 var $item = $itemLink.closest('li'); 614 if($item.hasClass('menu-item-parent')) { 615 e.preventDefault(); 616 if($item.hasClass('menu-overlay-item-open')) { 617 $(' > ul, .menu-overlay-item-open > ul', $item).each(function() { 618 $(this).css({height: $(this).outerHeight()+'px'}); 619 }); 620 setTimeout(function() { 621 $(' > ul, .menu-overlay-item-open > ul', $item).css({height: 0}); 622 $('.menu-overlay-item-open', $item).add($item).removeClass('menu-overlay-item-open'); 623 }, 50); 624 } else { 625 var $oldActive = $('#primary-navigation .menu-overlay-item-open').not($item.parents()); 626 $('> ul', $oldActive).not($item.parents()).each(function() { 627 $(this).css({height: $(this).outerHeight()+'px'}); 628 }); 629 setTimeout(function() { 630 $('> ul', $oldActive).not($item.parents()).css({height: 0}); 631 $oldActive.removeClass('menu-overlay-item-open'); 632 }, 50); 633 $('> ul', $item).css({height: 'auto'}); 634 var itemHeight = $('> ul', $item).outerHeight(); 635 $('> ul', $item).css({height: 0}); 636 setTimeout(function() { 637 $('> ul', $item).css({height: itemHeight+'px'}); 638 $item.addClass('menu-overlay-item-open'); 639 $('> ul', $item).one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function() { 640 $('> ul', $item).css({height: 'auto'}); 641 }); 642 }, 50); 643 } 644 } 645 }); 646 647 $('.vertical-toggle').click(function(e) { 648 e.preventDefault(); 649 $(this).closest('#site-header-wrapper').toggleClass('vertical-active'); 650 }); 651 652 $(function() { 653 $(window).resize(function() { 654 if (window.menuResizeTimeoutHandler) { 655 clearTimeout(window.menuResizeTimeoutHandler); 656 } 657 window.menuResizeTimeoutHandler = setTimeout(primary_menu_reinit, 50); 658 }); 659 }); 660 661 $('#primary-navigation a').click(function(e) { 662 var $item = $(this); 663 if($('#primary-menu').hasClass('no-responsive') && window.gemSettings.isTouch && $item.next('ul').length) { 664 e.preventDefault(); 665 } 666 }); 667})(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.