Full Chapter Reactive Patterns With Rxjs For Angular A Practical Guide To Managing Your Angular Application S Data Reactively and Efficiently Using Rxjs 7 Lamis Chebbi PDF

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 54

Reactive Patterns with RxJS for

Angular A practical guide to managing


your Angular application s data
reactively and efficiently using RxJS 7
Lamis Chebbi
Visit to download the full and correct content document:
https://textbookfull.com/product/reactive-patterns-with-rxjs-for-angular-a-practical-guid
e-to-managing-your-angular-application-s-data-reactively-and-efficiently-using-rxjs-7-l
amis-chebbi/
More products digital (pdf, epub, mobi) instant
download maybe you interests ...

Reactive Programming with Angular and ngrx: Learn to


Harness the Power of Reactive Programming with RxJS and
ngrx Extensions 1st Edition Oren Farhi (Auth.)

https://textbookfull.com/product/reactive-programming-with-
angular-and-ngrx-learn-to-harness-the-power-of-reactive-
programming-with-rxjs-and-ngrx-extensions-1st-edition-oren-farhi-
auth/

Reactive Programming with RxJS 5 Untangle your


asynchronous Javascript code 1st Edition Sergi Mansilla

https://textbookfull.com/product/reactive-programming-with-
rxjs-5-untangle-your-asynchronous-javascript-code-1st-edition-
sergi-mansilla/

Essential Angular for ASP.NET Core MVC 3: A Practical


Guide to Successfully Using Both in Your Projects 2nd
Edition Adam Freeman

https://textbookfull.com/product/essential-angular-for-asp-net-
core-mvc-3-a-practical-guide-to-successfully-using-both-in-your-
projects-2nd-edition-adam-freeman/

Learn With Angular 4 Collected Essays Angular CLI Unit


Testing Debugging TypeScript and Angular Build
Processes 2nd Edition Jeffry Houser

https://textbookfull.com/product/learn-with-angular-4-collected-
essays-angular-cli-unit-testing-debugging-typescript-and-angular-
build-processes-2nd-edition-jeffry-houser/
ng-book The Complete Guide to Angular Nate Murray

https://textbookfull.com/product/ng-book-the-complete-guide-to-
angular-nate-murray/

Angular Up and Running Learning Angular Step by Step


Shyam Seshadri

https://textbookfull.com/product/angular-up-and-running-learning-
angular-step-by-step-shyam-seshadri/

ng-book: The Complete Guide to Angular 5 Nathan Murray

https://textbookfull.com/product/ng-book-the-complete-guide-to-
angular-5-nathan-murray/

Ng Book The Complete Guide to Angular 9 Nathan Murray

https://textbookfull.com/product/ng-book-the-complete-guide-to-
angular-9-nathan-murray/

Ng Book The Complete Guide to Angular 11 Felipe Coury

https://textbookfull.com/product/ng-book-the-complete-guide-to-
angular-11-felipe-coury/
Reactive Patterns
with RxJS
for Angular

A practical guide to managing your Angular


application's data reactively and efficiently
using RxJS 7

Lamis Chebbi

BIRMINGHAM—MUMBAI
Reactive Patterns with RxJS for Angular
Copyright © 2022 Packt Publishing
All rights reserved. No part of this book may be reproduced, stored in a retrieval system, or
transmitted in any form or by any means, without the prior written permission of the publisher,
except in the case of brief quotations embedded in critical articles or reviews.
Every effort has been made in the preparation of this book to ensure the accuracy of the
information presented. However, the information contained in this book is sold without warranty,
either express or implied. Neither the author, nor Packt Publishing or its dealers and distributors,
will be held liable for any damages caused or alleged to have been caused directly or indirectly by
this book.
Packt Publishing has endeavored to provide trademark information about all of the companies
and products mentioned in this book by the appropriate use of capitals. However, Packt Publishing
cannot guarantee the accuracy of this information.
Associate Group Product Manager: Pavan Ramchandani
Publishing Product Manager: Ashitosh Gupta
Senior Editor: Mark Dsouza
Content Development Editor: Divya Vijayan
Technical Editor: Shubham Sharma
Copy Editor: Safis Editing
Project Coordinator: Ajesh Devavaram
Proofreader: Safis Editing
Indexer: Rekha Nair
Production Designer: Alishon Mendonca
Marketing Coordinator: Elizabeth Varghese

First published: April 2022

Production reference: 2210422

Published by Packt Publishing Ltd.


Livery Place
35 Livery Street
Birmingham
B3 2PB, UK.

ISBN 978-1-80181-151-4

www.packt.com
To my father, who taught me diligence, perseverance, and work ethic. Thank
you for always being there to support me and lift me up.
To my mother, who taught me selflessness and doing things with love.
Thank you for your enduring encouragement during the writing of this
book.

To my brother and my sisters, for their continuous support.


-Lamis Chebbi
Contributors
About the author
Lamis Chebbi is a Google Developer Expert for Angular and an Auth0 ambassador.
She is an enthusiastic software engineer with a strong passion for the modern web. She's
the founder of Angular Tunisia, a member of the WWCode community, a speaker, a
content creator, and a trainer. She has been into Angular for the past few years and loves
to share her knowledge about Angular through participating in workshops and organizing
training sessions. ng-girls is one of the communities she supports. Empowering women
and students is one of her highest priorities. Besides Angular and the web, Lamis loves
music, traveling, chromotherapy, and volunteering. Last but not least, she's a forever
student.
I want to thank all the people that believed in me and supported me.
I am thankful for the people who helped me in the journey.
I am thankful for the people who inspired me in the journey.
About the reviewer
Dave Muellerchen is a freelancer. He loves sharing his self-taught knowledge of JavaScript
at meetups and conferences.
His passion for communities shows in his commitment to them. He is the organizer of
the Angular Hamburg Meetup and Tech Meetup Hamburg. He is also a team member
at the Angular conference in Germany (ng-de) and a Google Developer Expert for web
technologies. He streams developer content on Twitch.
Thanks to my wife, who has my back to do what I do. Thank you my sons, for the fun and the
distraction. And of course, thank you Lamis for your trust.
Anu Nagan G has worked in various corporate organizations starting from SaaS startup
[GenDeep], midsize [GAVS], Fortune 500 companies [DXC] playing various roles there
such as Technical Product Manager, Full Stack Product Lead [Angular, Java, Python,
AWS], Delivery Lead respectively in his 8 years of tenure. Currently, he is with Bounteous,
leading parallel projects such as Clinical mobile app development, Fintech marketing data
migration. Contributed to various AIOps products ZIF, Gcare in the past. He is an avid
reader, cinephile, who loves to play Guitar, makes short films with his friends.
I would like to dedicate this to my grandparents who are celebrating their 82nd anniversary,
to my wife and we are expecting. Happy birthday Hema.
Table of Contents

Preface

Part 1 – Introduction
1
The Power of the Reactive Paradigm
Technical requirements 4 The HTTP client module 7
Exploring the pillars of reactive The router module 8
programming  4 Reactive forms 13
Data streams 4 The event emitter  14
Observer patterns 5 The async pipe 15

Using RxJS in Angular and its Learning about the marble


advantages7 diagram – our secret weapon 15
Summary18

2
RxJS 7 – The Major Features
Technical requirements 20 The firstValueFrom() method 25
Exploring the bundle size The lastValueFrom() method 26
improvements  20 Empty errors 26

Reviewing the TypeScript typing Highlighting API consistency


improvements22 improvements27
Understanding the toPromise() Summary29
deprecation23
viii Table of Contents

3
A Walkthrough of the Application
Technical requirements 32 View five – the modify recipe interface 36
Our app's user stories 32 View six – the recipe details interface 37

View one – the landing page  32 Our app's architecture 38


View two – the new recipe interface 34
The components overview 38
View three – the My Recipes interface 35
View four – the My Favourites interface 36
Summary39

Part 2 – A Trip into Reactive Patterns


4
Fetching Data as Streams
Technical requirements 44 Exploring the reactive pattern
Defining the requirement  45 for fetching data 52
Exploring the classic pattern for Retrieving data as streams 53
fetching data 45 Defining the stream in your component 53
Using the async pipe in your template 54
Defining the structure of your data 45
Creating an Angular service 46 Highlighting the advantages of
Retrieving the data through a method 47 the reactive pattern 55
Injecting and subscribing to the service Using the declarative approach 55
in your component 47
Using the change detection strategy of
Displaying the data in the template 48 OnPush 56
Managing unsubscriptions 49 Wrapping up 58

Summary59

5
Error Handling
Technical requirements 62 Exploring error handling
Understanding the anatomy of patterns and strategies 63
an Observable 62 Handling error operators 64
Table of Contents ix

The catchError operator  64 Error handling in action  75


The delayWhen operator 72 Summary77

6
Combining Streams
Technical requirements 80 Exploring the declarative
Defining the requirement 80 pattern for filtering data 85
Exploring the imperative The combineLatest operator 86
pattern for filtering data 81 The declarative pattern pillars 87
Emitting a value when an action occurs 90
A look at the filter component 81
A look at the recipes list component 82 Summary94

7
Transforming Streams
Technical requirements 96 Learning about other useful
Defining the requirement 96 higher-order mapping
operators107
Exploring the imperative
pattern for autosave 97 The mergeMap operator  107
The switchMap operator  108
Exploring the reactive pattern
The exhaustMap operator  109
for autosave 100
Higher-order observables 101 Summary110
Higher-order mapping operators 101
The concatMap operator 102

Part 3 – Multicasting Takes You to


New Places
8
Multicasting Essentials
Technical requirements 114 Producer  114
Explaining Multicasting A cold observable  114
versus Unicasting 114 A hot observable  116
x Table of Contents

Exploring Subjects 118 Highlighting Multicasting


A plain Subject 119 operators123
ReplaySubject120 Summary123
BehaviorSubject  121

9
Caching Streams
Technical requirements 126 Exploring the RxJS 7
Defining the requirement 126 recommended pattern to
cache streams 133
Learning about using
the reactive pattern to Highlighting the use cases of
cache streams 127 caching streams 134
Summary135

10
Sharing Data between Components
Technical requirements 138 Step two – updating the last-selected
recipe140
Defining the requirement 138
Step three – consuming the
Exploring the reactive pattern last-selected recipe 142
to share data 139
Step one – creating a shared service 139 Highlighting other ways for
sharing data 144
Summary145

11
Bulk Operations
Technical requirements 147 The pattern in action 151
Defining the requirement 148 Learning about the reactive
Learning about the reactive pattern for tracking progress 156
pattern for bulk operations 149 Summary157
The forkJoin operator 150
Table of Contents xi

12
Processing Real-Time Updates
Technical requirements 160 Connection management 164
Defining the requirement 160 Putting the pattern into action 166

Learning the reactive pattern Learning the reactive pattern


for consuming real-time for handling reconnection 170
messages 161 Retrying the reconnection 172
The WebSocketSubject behavior 161
Summary173

Part 4 – Final Touch


13
Testing RxJS Observables
Technical requirements 178 Understanding the syntax 182
Learning about the subscribe Implementing marble tests 184
and assert pattern 178 Highlighting testing streams
Learning about the marble using HttpClientTestingModule 190
testing pattern 182 Summary192

Index
Other Books You May Enjoy
Preface
Switching to a reactive mindset is one of the biggest challenges when you start learning
Reactive programming using RxJS. I believe that the reactive mindset is gradually
achieved by learning reactive patterns and comparing the reactive way with the imperative
one to distinguish the difference and the benefits.
That's why I wrote this book, which gathers a set of reactive patterns applied in an
Angular application. Learning reactive patterns helps with managing your application's
data efficiently, writing clean and maintainable code, reacting to user changes faster, and
consequently, enhancing the user experience.
So, all that you have to do is get started!

Who this book is for


The book is for Angular developers who want to use RxJS to build reactive web
applications. This book assumes beginner-level knowledge of and experience with
Angular, RxJS, TypeScript, and functional programming concepts.

What this book covers


Chapter 1, The Power of the Reactive Paradigm, explains the fundamentals of Reactive
programming.
Chapter 2, RxJS 7 – The Major Features, focuses on the main improvements of RxJS 7.
Chapter 3, A Walkthrough of the Application, highlights the architecture and requirements
of the application that we will be building gradually.
Chapter 4, Fetching Data as Streams, explains the first reactive pattern for fetching data.
Chapter 5, Error Handling, details the error handling strategies and the reactive patterns
for handling errors.
Chapter 6, Combining Streams, explains the reactive pattern for combining streams.
Chapter 7, Transforming Streams, explains the reactive pattern for transforming streams.
xiv Preface

Chapter 8, Multicasting Essentials, focuses on the multicasting approach essentials.


Chapter 9, Caching Streams, explains the reactive pattern for caching streams.
Chapter 10, Sharing Data between Components, explains the reactive patterns for sharing
data between components.
Chapter 11, Bulk Operations, explores the reactive pattern for performing bulk actions.
Chapter 12, Processing Real-Time Updates, explores the reactive pattern for consuming
real-time updates.
Chapter 13, Testing RxJS Observables, explains the different strategies for testing reactive
patterns.

To get the most out of this book


All code examples have been tested using Angular 12 on a Windows operating system.
However, it should work with future releases too.

Please make sure you follow the prerequisites at https://angular.io/guide/


setup-local. The prerequisites include the environment setup and the technologies
needed in order to install and use Angular.
We also used the Bootstrap library to manage the application responsiveness. We used
primeng as a library of rich components and RxJS 7 as the reactive library, of course.
If you are using the digital version of this book, we advise you to type the code yourself or
access the code from the book's GitHub repository (a link is available in the next section).
Doing so will help you avoid any potential errors related to the copying and pasting of
code.
Preface xv

Download the example code files


You can download the example code files for this book from GitHub at https://
github.com/PacktPublishing/Reactive-Patterns-with-RxJS-for-
Angular. If there's an update to the code, it will be updated in the GitHub repository.
We also have other code bundles from our rich catalog of books and videos available at
https://github.com/PacktPublishing/. Check them out!

Download the color images


We also provide a PDF file that has color images of the screenshots and diagrams used
in this book. You can download it here: https://static.packt-cdn.com/
downloads/9781801811514_ColorImages.pdf.

Conventions used
There are a number of text conventions used throughout this book.
Code in text: Indicates code words in text, database table names, folder names,
filenames, file extensions, pathnames, dummy URLs, user input, and Twitter handles.
Here is an example: "In the try block, you place your risky statements, and inside catch,
you handle the possible exceptions."
A block of code is set as follows:

behaviourSubject$.subscribe({
next: (message) => console.log(message),
error: (error) => console.log(error),
complete: () => console.log('Stream Completed'),
});

When we wish to draw your attention to a particular part of a code block, the relevant
lines or items are set in bold:

behaviourSubject$.subscribe({
next: (message) => console.log(message),
error: (error) => console.log(error),
complete: () => console.log('Stream Completed'),
});
xvi Preface

Any command-line input or output is written as follows:

$ mkdir css
$ cd css

Bold: Indicates a new term, an important word, or words that you see onscreen. For
instance, words in menus or dialog boxes appear in bold. Here is an example: "Select
System info from the Administration panel."

Tips or Important Notes


Appear like this.

Get in touch
Feedback from our readers is always welcome.
General feedback: If you have questions about any aspect of this book, email us at
customercare@packtpub.com and mention the book title in the subject of your message.
Errata: Although we have taken every care to ensure the accuracy of our content, mistakes
do happen. If you have found a mistake in this book, we would be grateful if you would
report this to us. Please visit www.packtpub.com/support/errata and fill in the
form.
Piracy: If you come across any illegal copies of our works in any form on the internet,
we would be grateful if you would provide us with the location address or website name.
Please contact us at copyright@packt.com with a link to the material.
If you are interested in becoming an author: If there is a topic that you have expertise in
and you are interested in either writing or contributing to a book, please visit authors.
packtpub.com.
Preface xvii

Share Your Thoughts


Once you've read Reactive Patterns with RxJS for Angular, we'd love to hear your thoughts!
Please click here to go straight to the Amazon review page for this
book and share your feedback.
Your review is important to us and the tech community and will help us make sure we're
delivering excellent quality content.
Part 1 –
Introduction

In this section, you will understand the importance of using the reactive paradigm in
an Angular application, as well as the new features of RxJS 7. In the third chapter, we
will introduce the application that we are going to progressively build as we go through
the book.
This part comprises the following chapters:

• Chapter 1, The Power of the Reactive Paradigm


• Chapter 2, RxJS 7 – The Major Features
• Chapter 3, A Walkthrough of the Application
1
The Power of the
Reactive Paradigm
This book is based entirely on useful reactive patterns in Angular applications. Reactive
patterns are reusable solutions to a commonly occurring problem using reactive
programming. Behind all of these patterns, there is a new way of thinking, new
architecture, new coding styles, and new tools.
I know you are impatient to write your first reactive pattern in Angular, but before doing
that, and to help you take full advantage of all the RxJS patterns and leverage the reactive
paradigm, we will start by explaining, in detail, all the fundamentals. Additionally, we
will prepare the groundwork for the following chapters. First, let's start with a basic
understanding of the reactive paradigm, its advantages, and the problems it solves. And
best of all, let's get into the reactive mindset and start thinking reactively.
We will begin by highlighting the pillars and the advantages of the reactive paradigm.
Then, we will describe the relationship between Angular and RxJS. Finally, we will explain
the Marble diagram and why it is useful.
Giving an insight into the fundamentals of the reactive paradigm is incredibly important.
This will ensure you get the basics right, help you understand the usefulness of the reactive
approach, and consequently, help you determine which situation it is best to use it in.
4 The Power of the Reactive Paradigm

In this chapter, we're going to cover the following topics:

• Exploring the pillars of reactive programming


• Using RxJS in Angular and its advantages
• Learning about the marble diagram – our secret weapon

Technical requirements
This chapter does not require an environment setup or installation steps. All the code
snippets here are just examples to illustrate the concepts. This book assumes that you have
a basic understanding of Angular and RxJS.

Exploring the pillars of reactive programming


Let's begin with a little bit of background!
Reactive programming is among the major programming paradigms used by developers
worldwide. Every programming paradigm solves some problems and has its own
advantages. By definition, reactive programming is programming with asynchronous
data streams and is based on observer patterns. So, let's talk about these pillars of reactive
programming!

Data streams
Data streams are the spine of reactive programming. Everything that might change or
happen over time (you don't know when exactly) is represented as a stream, such as data,
events, notifications, and messages. Reactive programming is about reacting to changes as
soon as they are emitted!
An excellent example of data streams is UI events. Let's suppose that we have an HTML
button, and we want to execute an action whenever a user clicks on it. Here, we can think
of the click event as a stream:

//HTML code
<button id='save'>Save</button>

//TS code
const saveElement = document.getElementById('save');
saveElement.addEventListener('click', processClick);
Exploring the pillars of reactive programming 5

function processClick(event) {
console.log('Hi');
}

As implemented in the preceding code snippet, in order to react to this click event, we
register an EventListener event. Then, every time a click occurs, the processClick
method is called to execute a side effect. In our case, we are just logging Hi in the console.
As you might have gathered, to be able to react when something happens and execute
a side effect, you should listen to the streams to become notified. We can say listen or
observe to get closer to the reactive terminology. And this leads us to the observer design
pattern, which is at the heart of reactive programming.

Observer patterns
The observer pattern is based on two main roles: a publisher and a subscriber.
A publisher maintains a list of subscribers and notifies them or propagates a change every
time there is an update. On the other hand, a subscriber performs an update or executes a
side effect every time they receive a notification from the publisher:

Figure 1.1 – The observer pattern


So, to get notified about any updates, you need to subscribe to the publisher. A real-world
analogy would be a newsletter; you don't get any emails if you don't subscribe
to a newsletter.
6 The Power of the Reactive Paradigm

This leads us to the building blocks of RxJS. They include the following:

• Observables: These are a representation of the data streams that notify the
observers of any change.
• Observers: These are the consumers of the data streams emitted by observables.

RxJS combines the observer pattern with the iterator pattern and functional programming
to process and handle asynchronous events.
This was a reminder of the fundamentals of reactive programming. Remember, it is
crucial to understand when to put a reactive implementation in place and when to
avoid it.
In general, whenever you have to handle asynchronous tasks in your Angular application,
always think of RxJS. The main advantages of RxJS over other asynchronous APIs are
listed as follows:

• RxJS makes dealing with event-based programs, asynchronous data calls, and
callbacks an easy task.
• Observables guarantee consistency. They emit multiple values over time so that you
can consume continuous data streams.
• Observables are lazy; they are not executed until you subscribe to them. This helps
with writing declarative code that is clean, efficient, and easy to understand and
maintain.
• Observables can be canceled, completed, and retrieved at any moment. This makes
a lot of sense in many real-world scenarios.
• RxJS provides many operators with a functional style to manipulate collections and
optimize side effects.
• Observables push errors to the subscribers and provide a clean way to handle errors.
• RxJS allows you to write clean and efficient code to handle asynchronous data in
your application.

Now that we have given some insight into the reactive programming pillars and detailed
the major advantages of RxJS, let's shed some light on the relationship between Angular
and RxJS.
Using RxJS in Angular and its advantages 7

Using RxJS in Angular and its advantages


RxJS is a first-class citizen in Angular. It is part of the Angular ecosystem and is used in
many features to handle asynchronous operations. Primarily, this includes the following:

• HTTP client module


• Router module
• Reactive forms
• Event emitter
• Async pipe

We will discuss each of the following concepts in the subsequent subsections.

Note
We recommend taking a quick look at https://angular.io/docs.
Here, you can find further details about the features mentioned earlier.

The HTTP client module


You might be familiar with the HTTP client API provided by Angular in order to
communicate with your server over the HTTP protocol. The HttpClient service is
based on observables to manage all transactions. This means that the result of calling the
API methods (such as GET, PATCH, POST, or PUT) is an observable.
In the following code snippet, we have an example of an Angular service that injects
the HttpClient service and fetches data from the server using the HttpClient.
get() method:

Import { Injectable } from '@angular/core';


import { HttpClient } from '@angular/common/http';
import { Observable} from 'rxjs';
import { environment } from '@env/environment';
const BASE_PATH = environment.basePath;

@Injectable()
export class RecipesService {
constructor(private http: HttpClient) { }
getRecipes(): Observable<Recipe[]> {
return this.http.get<Recipe[]>(`${BASE_PATH}/recipes/search/
8 The Power of the Reactive Paradigm

all`);
}

The following is the content of the environment.ts file where we define the
basePath property of our backend:

export const environment = {


basePath: '/app/rest',
production: false
};

The getRecipes() method or, to be more accurate, the call to this.http.


get<Recipe>(`${BASE_PATH}/recipes/search`) returns an observable that
you should subscribe to in order to issue the GET request to the server. Please note that
this is an example of an HTTP transaction, and it is the same for all of the other HTTP
methods available in the API (such as POST, PUT, and PATCH)
For those familiar with promise-based HTTP APIs, you might be wondering, in this case,
what the advantages of using observables are.
Well, there are a lot of advantages but the most important ones are listed as follows:

• Observables are cancellable, so you can cancel the HTTP request whenever you
want by calling the unsubscribe method.
• Also, you can retry HTTP requests when an error occurs or an exception is thrown.
• The server's response cannot be mutated by observables, although this can be the
case when chaining then() to promises.

The router module


The router module, which is available in the @angular/router package, uses
observables in router events and activated routes.

Router events
The router exposes events as observables. The router events allow you to intercept the
navigation life cycle. The following list shows the sequence of router events:
• NavigationStart
• RouteConfigLoadStart
• RouteConfigLoadEnd
Using RxJS in Angular and its advantages 9

• RoutesRecognized
• GuardsCheckStart
• ChildActivationStart
• ActivationStart
• GuardsCheckEnd
• ResolveStart
• ResolveEnd
• ActivationEnd
• ChildActivationEnd
• NavigationEnd
• NavigationCancel
• NavigationError
• Scroll

Note
We recommend that you take a quick look at https://angular.io/
api/router/Event. Here, you can find further details about the events
and their order.

To intercept all the events that the router goes through, first, you should inject the
Router service, which provides navigation and URL manipulation capabilities. Then,
subscribe to the events observable available in the Router object, and filter the events
of the RouterEvent type using the rxjs filter operator.
This is an example of an Angular service that injects the Router object in the
constructor, subscribes to the router events, and just traces the event ID and path in the
console. However, note that you can also introduce pretty much any specific behavior:

import { Injectable } from '@angular/core';


import { Router, RouterEvent } from '@angular/router';
import { filter } from 'rxjs/operators';
@Injectable()
export class CustomRouteService {
constructor(public router: Router) {
this.router.events.pipe(
10 The Power of the Reactive Paradigm

filter(event => event instanceof RouterEvent)


).subscribe((event: RouterEvent) => {
console.log(`The current event is : ${event.id} |
event.url`);
});
}
}

You can filter any specific event by putting the target type. The following code example
only filters the NavigationStart event and traces the event ID and path inside the
console. However, you can also introduce pretty much any specific behavior:

import { Injectable } from '@angular/core';


import { NavigationStart, Router } from '@angular/router';
import { filter } from 'rxjs/operators';

@Injectable()
export class CustomRouteService {
constructor(public router: Router) {
this.router.events.pipe(
filter(event => event instanceof NavigationStart)
).subscribe((event: NavigationStart) => {
console.log(`The current event is : ${event.id} |
event.url`);
});

}
}

The majority of Angular applications have a routing mechanism. The router events change
frequently over time, and it makes sense to listen to changes to execute the side effects.
That's why observables are a flexible way in which to handle those streams.
Another random document with
no related content on Scribd:
Willets W, L’t 22d Mich Vol
Wands H P, Cap “ “
Welker W H, L’t 21st O Vol
Welshimer P, Cap 21st Ill Vol
Weatherby J, L’t 51st O Vol
Weesner T A, L’t 14 & 15 Ill V Bat
Wyman E F, C S
West D J, L’t 6th Conn Vol
Ware E W, L’t 9th Me Vol
White Dan, Col 31st Me Vol
Washburne W, Cap 35th Mass Vol
Wing G H, L’t 14th N Y Art
Wilder G O, Adj 15th Mass Vol
Willis A R, Cap 8th Me Vol
Wilcox C W, L’t 9th N H Vol
Westbrook U S, Cap 135th O Vol
Weeks E J, L’t 67th Pa Vol
Woodard J E, L’t 18th Conn Vol
Weakly T J, L’t 100th O Vol
Wright B F, Cap 146th N Y Vol
Wilson W M, Jr, Cap 122d O Vol
Watson J C, L’t 126th O Vol
Woodruff F M, L’t 76th N Y Vol
Wright D L, L’t 51st Ind Vol
Whiting J D, L’t 3d O Vol
Wright W R, Cap 80th Ill Vol
Wilson A, Cap “ “
Wolbach A R, L’t 3d O Vol
Woodrow J C, L’t 73d Ind Vol
Williamson J B, L’t 14th W Va Vol
Weaver J R, L’t 18th Pa Cav
Wilson H, L’t “ “
Worthen T A, L’t 118th Ill Vol
Wakefield H B, Can 55th Ind Vol
Whitman W S, L’t 66th Ind Vol
Wiltshire J W, L’t 45th O Vol
Weddle Geo, L’t 144th O Vol
Woodrow C W, L’t 19th Iowa Vol
Webb G W, Cap 2d Pa Art
White A B, L’t 4th Pa Cav
Warwick Jos F, L’t 101st Pa Vol
Willis H H, L’t 40th N Y Vol
Winship J, L’t 88th Ill Vol
Whitney J N, L’t 2d R I Cav
Wilson R, L’t 113th Ill Vol
Whitten B F, L’t 9th Me Vol
Whiteside J C, Cap 94th N Y Vol
Warren J W, L’t 1st Wis Cav
Wanzer G G, Major 24th N Y Cav
Wadsworth M C, L’t 16th Me Vol
Warchaw F, L’t 54th N Y Vol
Wilson W C, Cap 104th N Y Vol
White H G, Cap 94th N Y Vol
Widdess C C, Cap 150th Pa Vol
Whiston D, L’t 13th Mass Vol
Welsh W H H, L’t 87th Pa Vol
White C W, Cap 5th W Va Cav
Wilson J, Cap 57th O Vol
Williams W H, Cap 41st N Y Vol
Watson W L, L’t 21st Wis Vol
Winner C N, L’t 1st O Vol
Wasson J M, L’t 40th O Vol
Webb G W, Cap 2d Pa Art
Williams R, Cap 12th O Vol
Welch J C, L’t 85th N Y Vol
Wheeler J D, Cap 15th Conn Vol
Wenrick J E, 19th Pa Cav
Williams W, L’t 8th Mich Cav
Willis W, L’t 51st Ind Vol
Williams M F, L’t 15th Ky Vol
Wiley M, Cap 1st Tenn Vol
Whittaker E B, Cap 72d Pa Vol
Wallace J, L’t Col 47th O Vol
Ward T H, L’t 59th U S Cav
Wheaton J, L’t “ “
Wright R J, Cap 6th O Vol
Wilcox W H H, L’t 10th N Y Cav
Wallace R P, L’t 120th O Vol
Walpole H H, Cap 122d N Y Vol
Wright J W, L’t 10th Iowa Vol
Whittemore B W, L’t 5th N Y Vol
Wallace J J, L’t 7th Tenn Cav
Wentworth H A, L’t 14th N Y H Art
Wall M W, Cap 69th N Y Vol
Walker W H, L’t 4th O Vol
Wislon E S, L’t 1st Mass Cav
Warren D H, Ass Surg 8th Iowa Cav
Wilson R P, L’t 5th U S Cav
Willets W, L’t 22d Mich Vol
White H, Major
While G M, Cap 1st W Va Vol
Whitney J de W, O Vet Inf
Yaw E C, L’t 67th N Y Vol
York J H, L’t 63d Ind Vol
Youtz H C, Cap 126th O Vol
Young D G, Cap 81st Ill Vol
Young W J, L’t 111th Ill Vol
York E D, L’t 2d N C U Vol
Young J W, Major 76th NY Vol
Yates C H, L’t 96th Ill Vol
Young A, L’t 4th Pa Cav
Young T P, L’t 4th Ky Cav
Zarracher F K, Cap 18th Pa Cav
Zeigler Aaron, L’t 7th Pa V R C
Zeis H, Cap 80th Id Vol
Zimm A, L’t 15th Iowa Vol
Zobel C, L’t 15th N Y Art
Zeigler J D, L’t 114th Ill Vol
DEATHS.
Eckings T R, L’t 3d N J Vol
Henderson J H, L’t 14th Ill Vet Batn
Jackson R W, L’t 21st Wis Vol
Spafford A C, L’t 41st O Vol
Wenrick J E, Cap 19th Penn Cav
Young A, L’t 4th Penn Cav
JAS. A. GARFIELD.

In the closing of this book, we deem it fitting to


produce a very correct likeness of our beloved

President, who lies at death’s door, smitten by the


hand of the assassin Guiteau. This is done more in

appreciation of the peculiar sadness of the


circumstances and the anxiety of the people, than

because of any connection which the cut may have

with the other contents of the book.


46th CONGRESS,
H. R. 4495.
2d Session.

IN THE HOUSE OF REPRESENTATIVES.


February 16, 1880.
Read twice, referred to the Committee on Invalid
Pensions, and ordered to be printed.

Mr. Keifer, by unanimous consent, introduced the


following bill:
A BILL granting pensions to certain Union soldiers
and sailors of the late war of the rebellion who
were confined in so called Confederate prisons.
Whereas during the late rebellion many soldiers and
sailors of the Federal Army and Navy, through the
fortunes of war, became prisoners and were
confined in so called Confederate prisons, to the
detriment and permanent injury of their health, but
whose debility is of such a general and indefinable
character as to exclude them from the benefits of
existing pension laws: Therefore
Be it enacted by the Senate and House of
Representatives of the United States of America in
Congress assembled, That the Secretary of the
Interior be, and he hereby is, authorized and required
to place upon the pension-rolls of the United States,
upon application and proof being made to the
satisfaction of the Department, all honorably
discharged soldiers and sailors of the Federal Army
and Navy who, during the late war, were captured
and confined, during the period of six months or
more, in any of the prisons or places commonly used
for the confinement of prisoners by the so called
Confederate authorities during the late rebellion, and
who are not now beneficiaries, nor entitled to
become so under existing pension laws of the United
States.
Sec. 2. That such pension shall in each case begin
from the date of the discharge of the soldier or sailor
aforesaid from the military or naval service of the
United States, and shall be at the rate of eight dollars
per month in cases where the term of imprisonment
shall have been more than six months and less than
one year, and one dollar per month additional for
each full month of such imprisonment in excess of
one year. And the said pension shall be paid at the
same time and in the same manner as other
pensions are paid: Provided, That nothing in this act
shall be construed to authorize the reduction or to
prevent the increase of the pension of any person
now receiving or entitled to receive the benefits of
existing pension laws.
TRANSCRIBER’S NOTE
Each line of the List of the Dead gives as much information about
that soldier as was known. A missing item was left blank in the
original book, but has been given a - or — mark in this etext.
The format of each entry is as follows:
Grave number from 1 to 12916.
There are some gaps in the numbering and some
duplicates; this book states a total of 12,912 deaths over
the fourteen months.
Name with initials or first name, or —— if none known.
If he held a rank other than Private it is added after a
comma. The most common abbreviations are Cor and S’t
for Corporal and Sergeant, but others are used as well.
Branch of the Army, if not Infantry.
The most common are Cav for Cavalry, Art for Artillery, Bat
for Battery, Mar for Marine Corps, Cit for Citizen.
Cemetery number at Andersonville.
Nearly 200 separate numbered burial areas were used.
Assigned Company within Andersonville.
Thirteen groups or Companies, A through M.
Recorded date of burial.
Month and day. The year 1864 is assumed, unless 65 is
added after the date. The following entries will be assumed
65 as well, until a 64 is given, indicating a reversion to
1864. The original book also placed a 64 (sometimes 65) at
the first entry on a book page, and these have not been
removed.

The first few pages covering Alabama, Connecticut, Delaware and


District of Columbia, had the ‘Cemetery’ before the ‘Branch’ field
when that was present; also a few in Illinois; for example ‘1 Cav’
and ‘2 Art’. These have been reversed to ‘Cav 1’ and ‘Art 2’ to be
consistent with the rest of the List.
In most pages of the later States (Massachusetts to Pennsylvania)
the rank was missing; this has been added (Cor or S’t), when
present in the Library of Congress (LoC) source document.
In some cases the service branch has been changed to a shorter
abbreviation of 3-5 characters to maintain the table format. For
example ‘Tenn St Gd’ or similar has been changed to ‘StG’; ‘St
Militia’ or similar has been changed to ‘Mil’; ‘Mar Corps’ or similar
has been changed to ‘Mar’; ‘Sig Corps’ or similar has been
changed to ‘Sig’.
A few names had different spelling in this List versus the LoC
document. In general the List spelling has been retained unless
clearly a typo.

Obvious typographical errors and punctuation errors in the diary


and in the List have been corrected after careful comparison with
other occurrences within the text and reference to the LoC
document.
Some hyphens in words have been silently removed, some added,
when a predominant preference was found in the original book.
Except for those changes in the diary text noted below, all
misspellings in the text, and inconsistent or archaic usage, have
been retained.
Pg 15: ‘not conformiug with’ replaced by ‘not conforming with’.
Pg 17: ‘eat everythihg on’ replaced by ‘eat everything on’.
Pg 21: ‘agrees with we’ replaced by ‘agrees with me’.
Pg 22: ‘quantities. Rlchmond’ replaced by ‘quantities. Richmond’.
Pg 27: ‘what he he is worth’ replaced by ‘what he is worth’.
Pg 30: ‘They Holy Sabbath’ replaced by ‘The Holy Sabbath’.
Pg 32: ‘friends Myres and’ replaced by ‘friends Myers and’.
Pg 40: ‘into the croud’ replaced by ‘into the crowd’.
Pg 45: ‘at comcealment’ replaced by ‘at concealment’.
Pg 48: ‘quarters near is’ replaced by ‘quarters near us’.
Pg 51: ‘stood i bravely’ replaced by ‘stood it bravely’.
Pg 54: ‘men at the time’ replaced by ‘men all the time’.
Pg 56: ‘slung shots’ replaced by ‘sling shots’.
Pg 57: ‘stortly after being’ replaced by ‘shortly after being’.
Pg 58: ‘and perhaps myelf’ replaced by ‘and perhaps myself’.
Pg 64: ‘ard negotiating’ replaced by ‘and negotiating’.
Pg 72: ‘the more peacable’ replaced by ‘the more peaceable’.
Pg 73: ‘sick a e again’ replaced by ‘sick are again’.
Pg 73: ‘Mang prefer to’ replaced by ‘Many prefer to’.
Pg 75: ‘tolera- no longer’ replaced by ‘tolerated no longer’.
Pg 80: ‘and perpaps a few’ replaced by ‘and perhaps a few’.
Pg 83: ‘if neccessary using’ replaced by ‘if necessary using’.
Pg 85: ‘business of g’ replaced by ‘business of living’.
Pg 86: ‘Statue has nothing’ replaced by ‘Stature has nothing’.
Pg 87: ‘much nore to eat’ replaced by ‘much more to eat’.
Pg 92: ‘Ang. 17.’ replaced by ‘Aug. 17.’.
Pg 100: ‘Knaw onion’ replaced by ‘Gnaw onion’.
Pg 105: ‘belive they would’ replaced by ‘believe they would’.
Pg 108: ‘never endnred any’ replaced by ‘never endured any’.
Pg 109: ‘WAR ELECTION DAY’ replaced by ‘WAR—ELECTION
DAY’.
Pg 110: ‘his portion is his’ replaced by ‘his portion in his’.
Pg 110: ‘see one onother’ replaced by ‘see one another’.
Pg 110: ‘little Bulluck who’ replaced by ‘little Bullock who’.
Pg 111: ‘a good murse’ replaced by ‘a good nurse’.
Pg 113: ‘and ver often’ replaced by ‘and very often’.
Pg 115: ‘occasions helped the’ replaced by ‘occasions I helped
the’.
Pg 122: ‘the heighth of’ replaced by ‘the height of’.
Pg 124: ‘and shave eaten’ replaced by ‘and have eaten’.
Pg 126: ‘a small pototoe’ replaced by ‘a small potatoe’.
Pg 129: ‘given me comfidence’ replaced by ‘given me confidence’.
Pg 132: ‘are alse entitled’ replaced by ‘are also entitled’.
Pg 135: ‘a though “Dave” says’ replaced by ‘although “Dave”
says’.
Pg 136: ‘joined one anotder’ replaced by ‘joined one another’.
Pg 137: ‘yon are Yankees’ replaced by ‘you are Yankees’.
Pg 137: ‘ate and and talked’ replaced by ‘ate and talked’.
Pg 141: ‘to Jocco’s hut’ replaced by ‘to Jocko’s hut’.
Pg 142: ‘caught halping’ replaced by ‘caught helping’.
Pg 142: ‘for his pictnre’ replaced by ‘for his picture’.
Pg 143: ‘a chain b at’ replaced by ‘a chain boat’.
Pg 144: ‘Wil stick to him’ replaced by ‘Will stick to him’.
Pg 145: ‘not go as as quiet’ replaced by ‘not go as quiet’.
Pg 146: ‘See kept talking’ replaced by ‘She kept talking’.
Pg 148: ‘and he wovld have’ replaced by ‘and he would have’.
Pg 149: ‘won’t get canght’ replaced by ‘won’t get caught’.
Pg 150: ‘or black cloth’ replaced by ‘of black cloth’.
Pg 152: ‘as near at we can’ replaced by ‘as near as we can’.
Pg 154: ‘also some shouttng’ replaced by ‘also some shouting’.
Pg 155: ‘and say tle’ replaced by ‘and say the’.
Pg 155: ‘must heep watch’ replaced by ‘must keep watch’.
Pg 156: ‘left them entirly’ replaced by ‘left them entirely’.
Pg 156: ‘2d Divisiom’ replaced by ‘2d Division’.
Pg 157: ‘the rebel cttizens’ replaced by ‘the rebel citizens’.
Pg 160: ‘In may interest’ replaced by ‘It may interest’.
Pg 161: ‘a delieate frame’ replaced by ‘a delicate frame’.
Pg 170: ‘this time Skelly’ replaced by ‘this time Skelley’.
Pg 172: ‘my descriipton of’ replaced by ‘my description of’.
Pg 178: ‘to the brian’ replaced by ‘to the bran’.
Pg 180: ‘from the balnket’ replaced by ‘from the blanket’.
Pg 184: ‘the Eng-ligh navy’ replaced by ‘the English navy’.
Pg 192: ‘cam grano salis’ replaced by ‘cum grano salis’.
*** END OF THE PROJECT GUTENBERG EBOOK
ANDERSONVILLE DIARY ***

Updated editions will replace the previous one—the old editions will
be renamed.

Creating the works from print editions not protected by U.S.


copyright law means that no one owns a United States copyright in
these works, so the Foundation (and you!) can copy and distribute it
in the United States without permission and without paying copyright
royalties. Special rules, set forth in the General Terms of Use part of
this license, apply to copying and distributing Project Gutenberg™
electronic works to protect the PROJECT GUTENBERG™ concept
and trademark. Project Gutenberg is a registered trademark, and
may not be used if you charge for an eBook, except by following the
terms of the trademark license, including paying royalties for use of
the Project Gutenberg trademark. If you do not charge anything for
copies of this eBook, complying with the trademark license is very
easy. You may use this eBook for nearly any purpose such as
creation of derivative works, reports, performances and research.
Project Gutenberg eBooks may be modified and printed and given
away—you may do practically ANYTHING in the United States with
eBooks not protected by U.S. copyright law. Redistribution is subject
to the trademark license, especially commercial redistribution.

START: FULL LICENSE


THE FULL PROJECT GUTENBERG
LICENSE
PLEASE READ THIS BEFORE YOU
DISTRIBUTE OR USE THIS WORK
To protect the Project Gutenberg™ mission of promoting the free
distribution of electronic works, by using or distributing this work (or
any other work associated in any way with the phrase “Project
Gutenberg”), you agree to comply with all the terms of the Full
Project Gutenberg™ License available with this file or online at
www.gutenberg.org/license.

Section 1. General Terms of Use and


Redistributing Project Gutenberg™
electronic works
1.A. By reading or using any part of this Project Gutenberg™
electronic work, you indicate that you have read, understand, agree
to and accept all the terms of this license and intellectual property
(trademark/copyright) agreement. If you do not agree to abide by all
the terms of this agreement, you must cease using and return or
destroy all copies of Project Gutenberg™ electronic works in your
possession. If you paid a fee for obtaining a copy of or access to a
Project Gutenberg™ electronic work and you do not agree to be
bound by the terms of this agreement, you may obtain a refund from
the person or entity to whom you paid the fee as set forth in
paragraph 1.E.8.

1.B. “Project Gutenberg” is a registered trademark. It may only be


used on or associated in any way with an electronic work by people
who agree to be bound by the terms of this agreement. There are a
few things that you can do with most Project Gutenberg™ electronic
works even without complying with the full terms of this agreement.
See paragraph 1.C below. There are a lot of things you can do with
Project Gutenberg™ electronic works if you follow the terms of this
agreement and help preserve free future access to Project
Gutenberg™ electronic works. See paragraph 1.E below.
1.C. The Project Gutenberg Literary Archive Foundation (“the
Foundation” or PGLAF), owns a compilation copyright in the
collection of Project Gutenberg™ electronic works. Nearly all the
individual works in the collection are in the public domain in the
United States. If an individual work is unprotected by copyright law in
the United States and you are located in the United States, we do
not claim a right to prevent you from copying, distributing,
performing, displaying or creating derivative works based on the
work as long as all references to Project Gutenberg are removed. Of
course, we hope that you will support the Project Gutenberg™
mission of promoting free access to electronic works by freely
sharing Project Gutenberg™ works in compliance with the terms of
this agreement for keeping the Project Gutenberg™ name
associated with the work. You can easily comply with the terms of
this agreement by keeping this work in the same format with its
attached full Project Gutenberg™ License when you share it without
charge with others.

1.D. The copyright laws of the place where you are located also
govern what you can do with this work. Copyright laws in most
countries are in a constant state of change. If you are outside the
United States, check the laws of your country in addition to the terms
of this agreement before downloading, copying, displaying,
performing, distributing or creating derivative works based on this
work or any other Project Gutenberg™ work. The Foundation makes
no representations concerning the copyright status of any work in
any country other than the United States.

1.E. Unless you have removed all references to Project Gutenberg:

1.E.1. The following sentence, with active links to, or other


immediate access to, the full Project Gutenberg™ License must
appear prominently whenever any copy of a Project Gutenberg™
work (any work on which the phrase “Project Gutenberg” appears, or
with which the phrase “Project Gutenberg” is associated) is
accessed, displayed, performed, viewed, copied or distributed:
This eBook is for the use of anyone anywhere in the United
States and most other parts of the world at no cost and with
almost no restrictions whatsoever. You may copy it, give it
away or re-use it under the terms of the Project Gutenberg
License included with this eBook or online at
www.gutenberg.org. If you are not located in the United States,
you will have to check the laws of the country where you are
located before using this eBook.

1.E.2. If an individual Project Gutenberg™ electronic work is derived


from texts not protected by U.S. copyright law (does not contain a
notice indicating that it is posted with permission of the copyright
holder), the work can be copied and distributed to anyone in the
United States without paying any fees or charges. If you are
redistributing or providing access to a work with the phrase “Project
Gutenberg” associated with or appearing on the work, you must
comply either with the requirements of paragraphs 1.E.1 through
1.E.7 or obtain permission for the use of the work and the Project
Gutenberg™ trademark as set forth in paragraphs 1.E.8 or 1.E.9.

1.E.3. If an individual Project Gutenberg™ electronic work is posted


with the permission of the copyright holder, your use and distribution
must comply with both paragraphs 1.E.1 through 1.E.7 and any
additional terms imposed by the copyright holder. Additional terms
will be linked to the Project Gutenberg™ License for all works posted
with the permission of the copyright holder found at the beginning of
this work.

1.E.4. Do not unlink or detach or remove the full Project


Gutenberg™ License terms from this work, or any files containing a
part of this work or any other work associated with Project
Gutenberg™.

1.E.5. Do not copy, display, perform, distribute or redistribute this


electronic work, or any part of this electronic work, without
prominently displaying the sentence set forth in paragraph 1.E.1 with
active links or immediate access to the full terms of the Project
Gutenberg™ License.

1.E.6. You may convert to and distribute this work in any binary,
compressed, marked up, nonproprietary or proprietary form,
including any word processing or hypertext form. However, if you
provide access to or distribute copies of a Project Gutenberg™ work
in a format other than “Plain Vanilla ASCII” or other format used in
the official version posted on the official Project Gutenberg™ website
(www.gutenberg.org), you must, at no additional cost, fee or expense
to the user, provide a copy, a means of exporting a copy, or a means
of obtaining a copy upon request, of the work in its original “Plain
Vanilla ASCII” or other form. Any alternate format must include the
full Project Gutenberg™ License as specified in paragraph 1.E.1.

1.E.7. Do not charge a fee for access to, viewing, displaying,


performing, copying or distributing any Project Gutenberg™ works
unless you comply with paragraph 1.E.8 or 1.E.9.

1.E.8. You may charge a reasonable fee for copies of or providing


access to or distributing Project Gutenberg™ electronic works
provided that:

• You pay a royalty fee of 20% of the gross profits you derive from
the use of Project Gutenberg™ works calculated using the
method you already use to calculate your applicable taxes. The
fee is owed to the owner of the Project Gutenberg™ trademark,
but he has agreed to donate royalties under this paragraph to
the Project Gutenberg Literary Archive Foundation. Royalty
payments must be paid within 60 days following each date on
which you prepare (or are legally required to prepare) your
periodic tax returns. Royalty payments should be clearly marked
as such and sent to the Project Gutenberg Literary Archive
Foundation at the address specified in Section 4, “Information
about donations to the Project Gutenberg Literary Archive
Foundation.”
• You provide a full refund of any money paid by a user who
notifies you in writing (or by e-mail) within 30 days of receipt that
s/he does not agree to the terms of the full Project Gutenberg™
License. You must require such a user to return or destroy all
copies of the works possessed in a physical medium and
discontinue all use of and all access to other copies of Project
Gutenberg™ works.

• You provide, in accordance with paragraph 1.F.3, a full refund of


any money paid for a work or a replacement copy, if a defect in
the electronic work is discovered and reported to you within 90
days of receipt of the work.

• You comply with all other terms of this agreement for free
distribution of Project Gutenberg™ works.

1.E.9. If you wish to charge a fee or distribute a Project Gutenberg™


electronic work or group of works on different terms than are set
forth in this agreement, you must obtain permission in writing from
the Project Gutenberg Literary Archive Foundation, the manager of
the Project Gutenberg™ trademark. Contact the Foundation as set
forth in Section 3 below.

1.F.

1.F.1. Project Gutenberg volunteers and employees expend


considerable effort to identify, do copyright research on, transcribe
and proofread works not protected by U.S. copyright law in creating
the Project Gutenberg™ collection. Despite these efforts, Project
Gutenberg™ electronic works, and the medium on which they may
be stored, may contain “Defects,” such as, but not limited to,
incomplete, inaccurate or corrupt data, transcription errors, a
copyright or other intellectual property infringement, a defective or
damaged disk or other medium, a computer virus, or computer
codes that damage or cannot be read by your equipment.

1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except


for the “Right of Replacement or Refund” described in paragraph

You might also like