1jQuery(document).ready(function($) { 2 3 if (typeof sesamy === 'undefined') { 4 return; 5 } 6 7 window.myPagesCurrentPage = null; 8 window.myPagesSubcriptions = null; 9 10 // Get 'active' parameter from url. If it's not set, set it to the first item 11 var url = new URL(window.location.href); 12 var selectedPage = url.searchParams.get('sida'); 13 14 if (selectedPage === null) { 15 $('.MyPages__template').first().css('display', 'flex'); 16 window.myPagesCurrentPage = $('.MyPages__template').first().attr('my-pages-page-id'); 17 } 18 19 else { 20 $('.MyPages__template[my-pages-page-id="' + selectedPage + '"]').css('display', 'flex');; 21 window.myPagesCurrentPage = selectedPage; 22 } 23 24 $(document).on('click','[my-pages-id]',function() { 25 var id = $(this).attr('my-pages-id'); 26 27 if (id == 'logout') { 28 sesamy.logout().then(function() { 29 location.href = '/'; 30 }); 31 return; 32 } 33 34 $('.MyPages__template').hide(); 35 $('.MyPages__template[my-pages-page-id="' + id + '"]').css('display', 'flex');; 36 37 // Set url parameter 38 var currentUrl = new URL(window.location.href); 39 currentUrl.searchParams.set('sida', id); 40 window.history.replaceState({}, '', currentUrl.href); 41 42 window.myPagesCurrentPage = id; 43 44 // If we are on mobile, scroll to top 45 if ($(window).width() < 768) { 46 $('html, body').animate({ 47 scrollTop: 0 48 }, 500); 49 } 50 }); 51 52 async function initMyPages() { 53 54 sesamy.isLoggedIn().then(async (isLoggedIn) => { 55 56 $('.MyPages__loading-indicator').hide(); 57 58 if (isLoggedIn) { 59 60 const FokusSKU = 'sid:58RAor9IXy_ntdljLH38l'; 61 62 const sesamyProfile = await sesamy.getUserProfile(); 63 const sesamyEntitlements = await sesamy.getEntitlements(); 64 const fulfillmentProductionItems = await sesamy.getFulfillmentProductItems(FokusSKU); 65 const subscriptions = await sesamy.getSubscriptions(); 66 const transactions = await sesamy.getTransactions(); 67 68 window.myPagesSubcriptions = subscriptions; 69 window.myPagesFulfillmentProductionItems = fulfillmentProductionItems; 70 window.myPagesProfile = sesamyProfile; 71 72 fillChangeSubscriptionAddressForm(); 73 74 if (transactions.length > 0) { 75 var template = $('.MyPages__payment-list-item-template'); 76 transactions.forEach(element => { 77 var transactionDate = new Date(element.modified); 78 var item = template.clone(); 79 item.removeClass('hidden'); 80 item.removeClass('MyPages__payment-list-item-template'); 81 item.find('.MyPages__payment-list-item__name').text(transactionDate.toLocaleDateString('en-us', { year: 'numeric', month: 'long', day: 'numeric' })); 82 item.find('.MyPages__payment-list-item__amount').text(element.totalPrice.toLocaleString('en-us', { style: 'currency', currency: 'EUR' })); 83 item.find('.my-pages-download-receipt').attr('href', element.receiptUrl); 84 $('.MyPages__payment-history-list').append(item); 85 }); 86 } 87 88 else { 89 $('.MyPages__payment-history-list').html("<i>You have no previous payments.</i>"); 90 } 91 92 if (fulfillmentProductionItems.count > 0) { 93 fulfillmentProductionItems.items.forEach(issue => { 94 $('.my-pages-issues-list').append('<div class="my-pages-issue"><input type="checkbox" id="' + issue.sku + '" item-id="'+issue.itemId+'"><label for="' + issue.sku + '"><img class="cover" src="'+issue.cover+'"><span class="title">' + issue.title + '</span></label></div>'); 95 }); 96 } 97 else { 98 $('.my-pages-select-issue').html("<i>You have no previous editions to choose from.</i>"); 99 $('[my-pages-page-id="report-missing-edition-previous"] .send-missing-issues').hide(); 100 $('.MyPages__card-link--report-missing-edition').hide(); 101 } 102 103 var hasActiveSubscription = false;
104 var hasPhysicalSubscription = false; 105 106 if (subscriptions.length > 0) { 107 var validSubs = 0; 108 subscriptions.forEach(async subscription => { 109 110 // Check if the status is 'cancelled', and that the currentPeriodEnd is in the past 111 if (subscription.status == 'canceled' && new Date(subscription.currentPeriodEnd) < new Date()) { 112 return; 113 } 114 115 validSubs++; 116 117 var template = $('.MyPages__subscription-card__card__template').first(); 118 var cardHtml = await getSubscriptionCardHtml(subscription, template); 119 $('.MyPages__subscription-sections').prepend(cardHtml); 120 121 if (!subscription.hasOwnProperty('cancelAt') || subscription.cancelAt == null || subscription.cancelAt == '') { 122 $('.my-pages-subscriptions-list').append('<div class="my-pages-issue"><input type="checkbox" id="' + subscription.id + '" item-id="'+subscription.id+'"><label for="' + subscription.id + '"><img class="cover" src="'+subscription.product.image+'"><span class="title">' + subscription.product.name + '</span></label></div>'); 123 hasActiveSubscription = true; 124 } 125 126 // If the subscription.product.name has the word 'tidning' in it, then it's a physical subscription 127 if (subscription.product.name.toLowerCase().indexOf('tidning') > -1) { 128 hasPhysicalSubscription = true; 129 } 130 }); 131 132 $('.MyPages__subscription-card__card__template').closest('.MyPages__card').remove(); 133 134 if (!hasActiveSubscription) { 135 $('.my-pages-select-issue-to-cancel').html("<i>You have no active subscriptions.</i>"); 136 } 137 138 if (!hasPhysicalSubscription) { 139 $('.MyPages__card-link--report-missing-edition').hide(); 140 } 141 142 if (validSubs < 1) { 143 $('.MyPages__subscription-card').html("<i>You have no subscriptions.</i>"); 144 $('.my-pages-select-issue-to-cancel').html("<i>You have no subscriptions.</i>"); 145 } 146 } 147 else { 148 $('.MyPages__subscription-card').html("<i>You have no subscriptions.</i>"); 149 $('.my-pages-select-issue-to-cancel').html("<i>You have no subscriptions.</i>"); 150 } 151 152 $('.MyPages__subscription-card .fpg-sesamy-spinner').hide(); 153 154 $(document).on('change', '.my-pages-issues-list input[type="checkbox"]', function() { 155 var checked = $(this).is(':checked'); 156 var issueId = $(this).attr('id'); 157 var issueItemId = $(this).attr('item-id'); 158 var issueTitle = $(this).parent().find('.title').text(); 159 160 if (checked) { 161 $('.my-pages-selected-issues').append('<div class="my-pages-selected-issue" data-issue-id="' + issueId + '" data-issue-item-id="'+issueItemId+'">' + issueTitle + ' <div class="remove-selected-issue" data-issue-id="' + issueId + '">X</div></div>'); 162 } 163 else { 164 $('.my-pages-selected-issues').find('[data-issue-id="' + issueId + '"]').remove(); 165 } 166 }); 167 168 $(document).on('change', '.my-pages-subscriptions-list input[type="checkbox"]', function() { 169 var checked = $(this).is(':checked'); 170 var issueId = $(this).attr('id'); 171 var issueTitle = $(this).parent().find('.title').text(); 172 173 if (checked) { 174 $('.my-pages-selected-subscriptions-to-be-cancelled').append('<div class="my-pages-selected-issue" data-issue-id="' + issueId + '">' + issueTitle + ' <div class="remove-subscription-to-cancel" data-issue-id="' + issueId + '">X</div></div>'); 175 } 176 else { 177 $('.my-pages-selected-subscriptions-to-be-cancelled').find('[data-issue-id="' + issueId + '"]').remove(); 178 } 179 }); 180 181 window.sesamyMyPagesCurrentSubscriptionId = null; 182 $(document).on('click', '.MyPages__card-link--change-subscription-address', function() { 183 window.sesamyMyPagesCurrentSubscriptionId = $(this).attr('data-select-subscription-id'); 184 }); 185 186 $(document).on('click', '.MyPages__select__open', function() { 187 $(this).parent().find('.MyPages__select__dropdown-list').toggle(); 188 $('.MyPages__select__overlay').fadeIn(); 189 }); 190 191 $(document).on('click', '.remove-selected-issue', function() { 192 var issueId = $(this).attr('data-issue-id'); 193 $('.my-pages-issues-list').find('[id="' + issueId + '"]').prop('checked', false); 194 $('.my-pages-selected-issues').find('[data-issue-id="' + issueId + '"]').remove(); 195 }); 196 197 $(document).on('click', '.remove-subscription-to-cancel', function() { 198 var issueId = $(this).attr('data-issue-id'); 199 $('.my-pages-subscriptions-list').find('[id="' + issueId + '"]').prop('checked', false); 200 $('.my-pages-selected-subscriptions-to-be-cancelled').find('[data-issue-id="' + issueId + '"]').remove(); 201 }); 202 203 $(document).on('click', '.my-pages-cancel-subscription-button', function() { 204 var subscriptionsToCancel = []; 205 $('.my-pages-selected-subscriptions-to-be-cancelled').find('.my-pages-selected-issue').each(function() { 206 subscriptionsToCancel.push({ 207 subscriptionId: $(this).attr('data-issue-id') 208 }); 209 }); 210 211 if (subscriptionsToCancel.length < 1) { 212 alert('You must select at least one subscription.'); 213 return; 214 } 215 216 var confirmCancel = confirm('Are you sure you want to cancel the subscription?'); 217 if (!confirmCancel) { 218 return; 219 } 220 221 var btn = $(this); 222 223 var response = subscriptionsToCancel.forEach(subscription => { 224 sesamy.cancelSubscription(subscription.subscriptionId, { version: '2' }).then(function(response) { 225 $('[my-pages-page-id="cancel-subscription"] .MyPages__sections').html("<div><h2>Your subscription is now cancelled</h2><p>You will now be redirected back to your pages.</p></div>"); 226 227 setTimeout(function() { 228 location.href = '/my-account'; 229 }, 5000); 230 }); 231 }); 232 233 if (!response) { 234 btn.html('Something went wrong.'); 235 } 236 }); 237 238 $(document).on('click', '.MyPages__select__overlay', function() { 239 $(this).fadeOut(); 240 $('.MyPages__select__dropdown-list').hide(); 241 }); 242 243 $(document).on('click', '.send-missing-issues', function() { 244 var missingIssues = []; 245 $('.my-pages-selected-issues').find('.my-pages-selected-issue').each(function() { 246 missingIssues.push({ 247 sku: $(this).attr('data-issue-id'), 248 item_id: $(this).attr('data-issue-item-id'), 249 title: $(this).text() 250 }); 251 }); 252 253 ReportMissingIssues(sesamyProfile, missingIssues); 254 }); 255 256 $(document).on('click', '.MyPages__change_personal_info', function() { 257 258 $(this).html('Spara'); 259 $(this).addClass('MyPages__change_personal_info--save Button--accent'); 260 $(this).removeClass('MyPages__change_personal_info'); 261 262 var contactFirstName = sesamyProfile.firstName ? sesamyProfile.firstName : ''; 263 var contactSurname = sesamyProfile.lastName ? sesamyProfile.lastName : ''; 264 var contactEmail = sesamyProfile.email ? sesamyProfile.email : ''; 265 266 $('.sesamy-contact-firstname').after('<input type="text" class="sesamy-contact-firstname-input" value="' + contactFirstName + '">'); 267 $('.sesamy-contact-firstname').hide(); 268 269 $('.sesamy-contact-surname').after('<input type="text" class="sesamy-contact-surname-input" value="' + contactSurname + '">'); 270 $('.sesamy-contact-surname').hide(); 271 272 $('.sesamy-contact-email').after('<input type="text" class="sesamy-contact-email-input" value="' + contactEmail + '">'); 273 $('.sesamy-contact-email').hide(); 274 }); 275 276 $(document).on('click', '.change-subscription-address', function() { 277 278 var latestIssue = window.myPagesFulfillmentProductionItems.items[0]; 279 280 if (latestIssue == null) { 281 alert('You have no previous editions to change the address for. Once you have received your first edition, you can change the address here.'); 282 return; 283 } 284 285 $(this).html('Spara'); 286 $(this).addClass('change-subscription-address--save Button--accent'); 287 $(this).removeClass('change-subscription-address'); 288 289 var subscriptionStreet = latestIssue.deliveryAddress.street; 290 var subscriptionZip = latestIssue.deliveryAddress.zip; 291 var subscriptionCity = latestIssue.deliveryAddress.city; 292 var subscriptionCountry = latestIssue.deliveryAddress.country; 293 294 $('.sesamy-subscription-street').after('<input type="text" class="sesamy-subscription-street
294-input" value="' + subscriptionStreet + '">'); 295 $('.sesamy-subscription-street').hide(); 296 297 $('.sesamy-subscription-zip').after('<input type="text" class="sesamy-subscription-zip-input" value="' + subscriptionZip + '">'); 298 $('.sesamy-subscription-zip').hide(); 299 300 $('.sesamy-subscription-city').after('<input type="text" class="sesamy-subscription-city-input" value="' + subscriptionCity + '">'); 301 $('.sesamy-subscription-city').hide(); 302 303 $('.sesamy-subscription-country').after('<input type="text" class="sesamy-subscription-country-input" value="' + subscriptionCountry + '">'); 304 $('.sesamy-subscription-country').hide(); 305 }); 306 307 $(document).on('click', '.change-subscription-address--save', function() { 308 309 var latestIssue = window.myPagesFulfillmentProductionItems.items[0]; 310 311 var subscriptionStreet = $('.sesamy-subscription-street-input').val(); 312 var subscriptionZip = $('.sesamy-subscription-zip-input').val(); 313 var subscriptionCity = $('.sesamy-subscription-city-input').val(); 314 var subscriptionCountry = $('.sesamy-subscription-country-input').val(); 315 316 var thisBtn = $(this); 317 thisBtn.html('Saving ...'); 318 sesamy.updateFulfillmentProductItemAddress(FokusSKU, latestIssue.itemId, { street: subscriptionStreet, zip: subscriptionZip, city: subscriptionCity, country: subscriptionCountry, firstName: window.myPagesProfile.firstname, lastName: window.myPagesProfile.lastname }).then(function() { 319 location.href = '/my-account'; 320 }).catch(function(error) { 321 thisBtn.html('Something went wrong.'); 322 }); 323 }); 324 325 $(document).on('click', '.MyPages__change_personal_info--save', function() { 326 var firstname = $('.sesamy-contact-firstname-input').val(); 327 var surname = $('.sesamy-contact-surname-input').val(); 328 var email = $('.sesamy-contact-email-input').val(); 329 330 $(this).html('Sparar...'); 331 332 sesamy.updateUserProfile({ firstName: firstname, lastName: surname, email: email }).then(function() { 333 location.reload(); 334 }); 335 }); 336 337 $(document).on('click', '.change-address', function() { 338 $(this).html('Spara'); 339 $(this).addClass('change-address--save Button--accent'); 340 $(this).removeClass('change-address'); 341 342 var card = $(this).closest('.MyPages__card'); 343 344 var street = card.find('.sesamy-street').text(); 345 var zip = card.find('.sesamy-zip').text(); 346 var city = card.find('.sesamy-city').text(); 347 var country = card.find('.sesamy-country').text(); 348 349 card.find('.sesamy-street').after('<input type="text" class="sesamy-street-input" value="' + street + '">'); 350 card.find('.sesamy-street').hide(); 351 352 card.find('.sesamy-zip').after('<input type="text" class="sesamy-zip-input" value="' + zip + '">'); 353 card.find('.sesamy-zip').hide(); 354 355 card.find('.sesamy-city').after('<input type="text" class="sesamy-city-input" value="' + city + '">'); 356 card.find('.sesamy-city').hide(); 357 358 card.find('.sesamy-country').after('<input type="text" class="sesamy-country-input" value="' + country + '">'); 359 card.find('.sesamy-country').hide(); 360 361 }); 362 363 $(document).on('click', '.change-address--save', function() { 364 365 var card = $(this).closest('.MyPages__card'); 366 var street = card.find('.sesamy-street-input').val(); 367 var zip = card.find('.sesamy-zip-input').val(); 368 var city = card.find('.sesamy-city-input').val(); 369 var country = card.find('.sesamy-country-input').val(); 370 371 $(this).html('Sparar...'); 372 373 var cityObject = {street: street, zip: zip, city: city, country: country} 374 375 sesamy.updateUserProfile({ deliveryAddress: cityObject, billingAddress: cityObject}).then(function() { 376 location.reload(); 377 }); 378 }); 379
380 if (sesamyProfile == null) { 381 return null; 382 } 383 384 var profileName = sesamyProfile.firstname; 385 if (profileName == null || profileName == '') { 386 profileName = sesamyProfile.email; 387 } 388 389 // Check if sesamyProfile has the property 'primaryAddress' 390 if (sesamyProfile.hasOwnProperty('billingAddress')) { 391 const city = sesamyProfile.billingAddress.city; 392 const street = sesamyProfile.billingAddress.street; 393 const zip = sesamyProfile.billingAddress.zip; 394 const country = sesamyProfile.billingAddress.country; 395 396 $('.sesamy-street').text(street); 397 $('.sesamy-zip').text(zip); 398 $('.sesamy-city').text(city); 399 $('.sesamy-country').text(country); 400 } 401 402 if (sesamyProfile) { 403 const firstname = sesamyProfile.firstName; 404 const surname = sesamyProfile.lastName; 405 const email = sesamyProfile.email; 406 407 $('.sesamy-contact-firstname').text(firstname); 408 $('.sesamy-contact-surname').text(surname); 409 $('.sesamy-contact-email').text(email); 410 } 411 412 // Check if we have subscription by checking the url and the entitlements 413 var hasSubscription = false; 414 sesamyEntitlements.forEach(entitlement => { 415 if (entitlement.url == 'https://nordiclifescience.org/subscribe') { 416 hasSubscription = true; 417 } 418 }); 419 420 if (!hasSubscription) { 421 $('.show-if-logged-in-no-sub').show(); 422 $('.sesamy-active-subscription-text').html('Not active'); 423 } 424 else { 425 $('.sesamy-active-subscription-text').html('Active'); 426 427 // If we are on the page "prenumerera-for-att-bli-kund" or "/prenumerera/fod/", then redirect to home page 428 if (window.location.href.indexOf('prenumerera-for-att-bli-kund') > -1 || window.location.href.indexOf('/prenumerera/fod') > -1) { 429 location.href = '/'; 430 } 431 } 432 } 433 else { 434 435 // If we are on my-pages, then redirect to login 436 if (window.location.href.indexOf('my-account') > -1 && window.location.href.indexOf('fokus') != -1) { 437 window.sesamy.login(); 438 } 439 440 // Show all elements with class 'show-if-logged-out' 441 if (window.location.href.indexOf('fokus') > -1) { 442 $('.show-if-logged-out').show(); 443 $('.show-if-logged-out').addClass('show-if-logged-out--show'); 444 } 445 446 } 447 448 }); 449 } 450 451 function ReportMissingIssues(userInformation, missingIssues=[]) { 452 453 if (window.myPagesCurrentPage == 'report-missing-edition-previous') { 454 if (missingIssues.length < 1) { 455 alert('You must select at least one edition.'); 456 return; 457 } 458 459 missingIssues.forEach(issue => { 460 window.sesamy.requestFulfillmentProductItem(issue.sku, issue.item_id).then(function(response) { 461 $('[my-pages-page-id="report-missing-edition-previous"] .MyPages__sections').html("<div><h2>Thank you for your registration!</h2><p>We will send out the missing edition as soon as possible.</p></div>"); 462 }); 463 }); 464 } 465 466 } 467 468 function getSubscriptionCardTableRow(label, value) { 469 let html = ` 470 <div class="MyPages__subscription-card__content__table__row"> 471 <div class="MyPages__subscription-card__content__table__row__cell"> 472 <span class="MyPages__subscription-card__content__table__row__cell__label">${label}</span> 473 </div> 474 <div class="MyPages__subscription-card__content__table__row__cell">
475 <span class="MyPages__subscription-card__content__table__row__cell__value">${value}</span> 476 </div> 477 </div> 478 `; 479 return html; 480 } 481 482 async function getSubscriptionCardHtml(subscription, templateElement) { 483 484 // Copy 'MyPages__subscription-card__card__template' and remove the class 'MyPages__subscription-card__card__template' 485 var card = templateElement.clone(); 486 card.removeClass('MyPages__subscription-card__card__template'); 487 488 var subscriptionTitle = subscription.product.name; 489 var subscriptionImage = subscription.product.image; 490 491 var price = subscription.amount; // This is in cents 492 var price = price / 100; // Convert to SEK 493 494 var interval = subscription.interval; 495 if (interval == 'month') { 496 interval = '/month'; 497 } 498 else if (interval == 'week') { 499 interval = '/week'; 500 } 501 else if (interval == 'year') { 502 interval = '/year'; 503 } 504 505 506 card.find('.MyPages__subscription-card__header__title__value').text(subscriptionTitle); 507 card.find('.MyPages__subscription-card__header__image img').attr('src', subscriptionImage); 508 509 var prenumerationRow = getSubscriptionCardTableRow('Subscription', subscriptionTitle); 510 card.find('.MyPages__subscription-card__content__table').append(prenumerationRow); 511 512 var customerNumberRow = getSubscriptionCardTableRow('Customer number', subscription.userId); 513 card.find('.MyPages__subscription-card__content__table').append(customerNumberRow); 514 515 var startDate = new Date(subscription.created); 516 if (startDate && !isNaN(startDate)) { 517 var startDateRow = getSubscriptionCardTableRow('Start date', startDate.toLocaleDateString('sv-SE', { year: 'numeric', month: 'long', day: 'numeric' })); 518 card.find('.MyPages__subscription-card__content__table').append(startDateRow); 519 } 520 521 var endDate = new Date(subscription.currentPeriodEnd); 522 if (endDate && !isNaN(endDate)) { 523 var endDateRow = getSubscriptionCardTableRow('Until further notice', endDate.toLocaleDateString('sv-SE', { year: 'numeric', month: 'long', day: 'numeric' })); 524 card.find('.MyPages__subscription-card__content__table').append(endDateRow); 525 } 526 527 if (price != null && price != '' && !isNaN(price)) { 528 var priceRow = getSubscriptionCardTableRow('Price', price + ' ' + subscription.currency + interval); 529 card.find('.MyPages__subscription-card__content__table').append(priceRow); 530 } 531 532 var handlePaymentUrl = await sesamy.generateLink({target: 'account', contractId: subscription.id}); 533 console.log(handlePaymentUrl); 534 535 var handlePayment = getSubscriptionCardTableRow('Manage payment', '<a target="_blank" href="'+handlePaymentUrl+'">Click here</a>'); 536 card.find('.MyPages__subscription-card__content__table').append(handlePayment); 537 538 539 // If the subscription has the cancelAt property, then it's already cancelled 540 if (subscription.hasOwnProperty('cancelAt') && subscription.cancelAt != null && subscription.cancelAt != '') { 541 var cancelAtRow = getSubscriptionCardTableRow('<span style="color:red;">Active until (cancelled)</span>', new Date(subscription.cancelAt).toLocaleDateString('sv-SE', { year: 'numeric', month: 'long', day: 'numeric' })); 542 card.find('.MyPages__subscription-card__content__table').append(cancelAtRow); 543 card.find('.MyPages__card-link--cancel-subscription').remove(); 544 card.find('.MyPages__card-link--change-subscription-address').remove(); 545 } 546 else { 547 card.find('.MyPages__card-link--cancel-subscription').attr('data-select-subscription-id', subscription.id); 548 card.find('.MyPages__card-link--change-subscription-address').attr('data-select-subscription-id', subscription.id); 549 } 550 551 return "<div class='MyPages__subscription-card MyPages__card "+subscription.status+"'>" + card.html() + "</div>"; 552 } 553 554 function fillChangeSubscriptionAddressForm() { 555 556 if (window.myPagesFulfillmentProductionItems.count > 0 && window.myPagesFulfillmentProductionItems.items.length > 0) { 557 var latestIssue = window.myPagesFulfillmentProductionItems.items[0]; 558 $('.sesamy-subscription-street').text(latestIssue.deliveryAddress.street); 559 $('.sesamy-subscription-zip').text(latestIssue.deliveryAddress.zip); 560 $('.sesamy-subscription-city').text(latestIssue.deliveryAddress.city); 561 $('.sesamy-subscription-country').text(latestIssue.deliveryAddress.country); 562 } 563 } 564 565 initMyPages(); 566 567});
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.