# Notebook from kfrancis01/Implement-Route-Planner
Path: ImplementRoutePlanner.ipynb

# Implementing a Route Planner
In this project you will use A\* search to implement a "Google-maps" style route planning algorithm._____no_output_____## The Map_____no_output_____

# Run this cell first!

from helpers import Map, load_map_10, load_map_40, show_map
import math

%load_ext autoreload
%autoreload 2_____no_output_____

### Map Basics_____no_output_____

map_10 = load_map_10()
show_map(map_10)_____no_output_____

The map above (run the code cell if you don't see it) shows a disconnected network of 10 intersections. The two intersections on the left are connected to each other but they are not connected to the rest of the road network. This map is quite literal in its expression of distance and connectivity. On the graph above, the edge between 2 nodes(intersections) represents a literal straight road not just an abstract connection of 2 cities.

These `Map` objects have two properties you will want to use to implement A\* search: `intersections` and `roads`

**Intersections**

The `intersections` are represented as a dictionary.

In this example, there are 10 intersections, each identified by an x,y coordinate. The coordinates are listed below. You can hover over each dot in the map above to see the intersection number._____no_output_____

map_10.intersections_____no_output_____

**Roads**

The `roads` property is a list where `roads[i]` contains a list of the intersections that intersection `i` connects to._____no_output_____

# this shows that intersection 0 connects to intersections 7, 6, and 5
map_10.roads[0] _____no_output_____# This shows the full connectivity of the map
map_10.roads_____no_output_____# map_40 is a bigger map than map_10
map_40 = load_map_40()
show_map(map_40)_____no_output_____

### Advanced Visualizations

The map above shows a network of roads which spans 40 different intersections (labeled 0 through 39).

The `show_map` function which generated this map also takes a few optional parameters which might be useful for visualizing the output of the search algorithm you will write.

* `start` - The "start" node for the search algorithm.
* `goal`  - The "goal" node.
* `path`  - An array of integers which corresponds to a valid sequence of intersection visits on the map._____no_output_____

# run this code, note the effect of including the optional
# parameters in the function call.
show_map(map_40, start=5, goal=34, path=[5,16,37,12,34])_____no_output_____

## The Algorithm
### Writing your algorithm
The algorithm written will be responsible for generating a `path` like the one passed into `show_map` above. In fact, when called with the same map, start and goal, as above you algorithm should produce the path `[5, 16, 37, 12, 34]`. However you must complete several methods before it will work.

```bash
> PathPlanner(map_40, 5, 34).path
[5, 16, 37, 12, 34]
```_____no_output_____### PathPlanner class

The below class is already partly implemented for you - you will implement additional functions that will also get included within this class further below.

Let's very briefly walk through each part below.

`__init__` - We initialize our path planner with a map, M, and typically a start and goal node. If either of these are `None`, the rest of the variables here are also set to none. If you don't have both a start and a goal, there's no path to plan! The rest of these variables come from functions you will soon implement.
- `closedSet` includes any explored/visited nodes.
- `openSet` are any nodes on our frontier for potential future exploration.
- `cameFrom` will hold the previous node that best reaches a given node
- `gScore` is the `g` in our `f = g + h` equation, or the actual cost to reach our current node
- `fScore` is the combination of `g` and `h`, i.e. the `gScore` plus a heuristic; total cost to reach the goal
- `path` comes from the `run_search` function, which is already built for you.

`reconstruct_path` - This function just rebuilds the path after search is run, going from the goal node backwards using each node's `cameFrom` information.

`_reset` - Resets *most* of our initialized variables for PathPlanner. This *does not* reset the map, start or goal variables, for reasons which you may notice later, depending on your implementation.

`run_search` - This does a lot of the legwork to run search once you've implemented everything else below. First, it checks whether the map, goal and start have been added to the class. Then, it will also check if the other variables, other than `path` are initialized (note that these are only needed to be re-run if the goal or start were not originally given when initializing the class, based on what we discussed above for `__init__`.

From here, we use a function you will implement, `is_open_empty`, to check that there are still nodes to explore (you'll need to make sure to feed `openSet` the start node to make sure the algorithm doesn't immediately think there is nothing to open!). If we're at our goal, we reconstruct the path. If not, we move our current node from the frontier (`openSet`) and into explored (`closedSet`). Then, we check out the neighbors of the current node, check out their costs, and plan our next move.

This is the main idea behind A*, but none of it is going to work until you implement all the relevant parts, which will be included below after the class code._____no_output_____

# Do not change this cell
# When you write your methods correctly this cell will execute
# without problems
class PathPlanner():
    """Construct a PathPlanner Object"""
    def __init__(self, M, start=None, goal=None):
        """ """
        self.map = M
        self.start= start
        self.goal = goal
        self.closedSet = self.create_closedSet() if goal != None and start != None else None
        self.openSet = self.create_openSet() if goal != None and start != None else None
        self.cameFrom = self.create_cameFrom() if goal != None and start != None else None
        self.gScore = self.create_gScore() if goal != None and start != None else None
        self.fScore = self.create_fScore() if goal != None and start != None else None
        self.path = self.run_search() if self.map and self.start != None and self.goal != None else None

    def reconstruct_path(self, current):
        """ Reconstructs path after search """
        total_path = [current]
        while current in self.cameFrom.keys():
            current = self.cameFrom[current]
            total_path.append(current)
        return total_path

    def _reset(self):
        """Private method used to reset the closedSet, openSet, cameFrom, gScore, fScore, and path attributes"""
        self.closedSet = None
        self.openSet = None
        self.cameFrom = None
        self.gScore = None
        self.fScore = None
        self.path = self.run_search() if self.map and self.start and self.goal else None

    def run_search(self):
        """ """
        if self.map == None:
            raise(ValueError, "Must create map before running search. Try running PathPlanner.set_map(start_node)")
        if self.goal == None:
            raise(ValueError, "Must create goal node before running search. Try running PathPlanner.set_goal(start_node)")
        if self.start == None:
            raise(ValueError, "Must create start node before running search. Try running PathPlanner.set_start(start_node)")

        self.closedSet = self.closedSet if self.closedSet != None else self.create_closedSet()
        self.openSet = self.openSet if self.openSet != None else  self.create_openSet()
        self.cameFrom = self.cameFrom if self.cameFrom != None else  self.create_cameFrom()
        self.gScore = self.gScore if self.gScore != None else  self.create_gScore()
        self.fScore = self.fScore if self.fScore != None else  self.create_fScore()

        while not self.is_open_empty():
            current = self.get_current_node()

            if current == self.goal:
                self.path = [x for x in reversed(self.reconstruct_path(current))]
                return self.path
            else:
                self.openSet.remove(current)
                self.closedSet.add(current)

            for neighbor in self.get_neighbors(current):
                if neighbor in self.closedSet:
                    continue    # Ignore the neighbor which is already evaluated.

                if not neighbor in self.openSet:    # Discover a new node
                    self.openSet.add(neighbor)

                # The distance from start to a neighbor
                #the "dist_between" function may vary as per the solution requirements.
                if self.get_tentative_gScore(current, neighbor) >= self.get_gScore(neighbor):
                    continue        # This is not a better path.

                # This path is the best until now. Record it!
                self.record_best_path_to(current, neighbor)
        print("No Path Found")
        self.path = None
        return False_____no_output_____

## Your Turn

Implement the following functions to get your search algorithm running smoothly!_____no_output_____### Data Structures

The next few functions requre you to decide on data structures to use - lists, sets, dictionaries, etc. Make sure to think about what would work most efficiently for each of these. Some can be returned as just an empty data structure (see `create_closedSet()` for an example), while others should be initialized with one or more values within._____no_output_____

def create_closedSet(self):
    """ Creates and returns a data structure suitable to hold the set of nodes already evaluated"""
    # EXAMPLE: return a data structure suitable to hold the set of nodes already evaluated
    return set()_____no_output_____def create_openSet(self):
    """ Creates and returns a data structure suitable to hold the set of currently discovered nodes
    that are not evaluated yet. Initially, only the start node is known."""
    if self.start != None:
        # TODO: return a data structure suitable to hold the set of currently discovered nodes
        # that are not evaluated yet. Make sure to include the start node.
        return set(lists)

    raise(ValueError, "Must create start node before creating an open set. Try running PathPlanner.set_start(start_node)")_____no_output_____def create_cameFrom(self):
    """Creates and returns a data structure that shows which node can most efficiently be reached from another,
    for each node."""
    # TODO: return a data structure that shows which node can most efficiently be reached from another,
    # for each node.
    #for x in nodes:
    return set(sets)_____no_output_____def create_gScore(self):
    """Creates and returns a data structure that holds the cost of getting from the start node to that node,
    for each node. The cost of going from start to start is zero."""
    # TODO:  return a data structure that holds the cost of getting from the start node to that node, for each node.
    # for each node. The cost of going from start to start is zero. The rest of the node's values should
    # be set to infinity.
    #for i in self:
    cost = self(i) - start
    return set(sets)_____no_output_____def create_fScore(self):
    """Creates and returns a data structure that holds the total cost of getting from the start node to the goal
    by passing by that node, for each node. That value is partly known, partly heuristic.
    For the first node, that value is completely heuristic."""
    # TODO: return a data structure that holds the total cost of getting from the start node to the goal
    # by passing by that node, for each node. That value is partly known, partly heuristic.
    # For the first node, that value is completely heuristic. The rest of the node's value should be
    # set to infinity.
    for i in self:
    cost = self(i) - start
    i++
    total = cost
    return set()
_____no_output_____

### Set certain variables

The below functions help set certain variables if they weren't a part of initializating our `PathPlanner` class, or if they need to be changed for anothe reason._____no_output_____

def set_map(self, M):
    """Method used to set map attribute """
    self._reset(self)
    self.start = None
    self.goal = None
    # TODO: Set map to new value.
    set_map() =  _____no_output_____def set_start(self, start):
    """Method used to set start attribute """
    self._reset(self)
    # TODO: Set start value. Remember to remove goal, closedSet, openSet, cameFrom, gScore, fScore,
    # and path attributes' values.
    _____no_output_____def set_goal(self, goal):
    """Method used to set goal attribute """
    self._reset(self)
    # TODO: Set goal value.
    int goal _____no_output_____

### Get node information

The below functions concern grabbing certain node information. In `is_open_empty`, you are checking whether there are still nodes on the frontier to explore. In `get_current_node()`, you'll want to come up with a way to find the lowest `fScore` of the nodes on the frontier. In `get_neighbors`, you'll need to gather information from the map to find the neighbors of the current node._____no_output_____

def is_open_empty(self):
    """returns True if the open set is empty. False otherwise. """
    # TODO: Return True if the open set is empty. False otherwise.
    if self ==
    return true
    else
    return false_____no_output_____def get_current_node(self):
    """ Returns the node in the open set with the lowest value of f(node)."""
    # TODO: Return the node in the open set with the lowest value of f(node).
_____no_output_____def get_neighbors(self, node):
    """Returns the neighbors of a node"""
    # TODO: Return the neighbors of a node
_____no_output_____

### Scores and Costs

Below, you'll get into the main part of the calculation for determining the best path - calculating the various parts of the `fScore`._____no_output_____

def get_gScore(self, node):
    """Returns the g Score of a node"""
    # TODO: Return the g Score of a node
_____no_output_____def distance(self, node_1, node_2):
    """ Computes the Euclidean L2 Distance"""
    # TODO: Compute and return the Euclidean L2 Distance
_____no_output_____def get_tentative_gScore(self, current, neighbor):
    """Returns the tentative g Score of a node"""
    # TODO: Return the g Score of the current node
    # plus distance from the current node to it's neighbors
_____no_output_____def heuristic_cost_estimate(self, node):
    """ Returns the heuristic cost estimate of a node """
    # TODO: Return the heuristic cost estimate of a node
_____no_output_____def calculate_fscore(self, node):
    """Calculate the f score of a node. """
    # TODO: Calculate and returns the f score of a node.
    # REMEMBER F = G + H
    _____no_output_____

### Recording the best path

Now that you've implemented the various functions on scoring, you can record the best path to a given neighbor node from the current node!_____no_output_____

def record_best_path_to(self, current, neighbor):
    """Record the best path to a node """
    # TODO: Record the best path to a node, by updating cameFrom, gScore, and fScore
_____no_output_____

### Associating your functions with the `PathPlanner` class

To check your implementations, we want to associate all of the above functions back to the `PathPlanner` class. Python makes this easy using the dot notation (i.e. `PathPlanner.myFunction`), and setting them equal to your function implementations. Run the below code cell for this to occur.

*Note*: If you need to make further updates to your functions above, you'll need to re-run this code cell to associate the newly updated function back with the `PathPlanner` class again!_____no_output_____

# Associates implemented functions with PathPlanner class
PathPlanner.create_closedSet = create_closedSet
PathPlanner.create_openSet = create_openSet
PathPlanner.create_cameFrom = create_cameFrom
PathPlanner.create_gScore = create_gScore
PathPlanner.create_fScore = create_fScore
PathPlanner.set_map = set_map
PathPlanner.set_start = set_start
PathPlanner.set_goal = set_goal
PathPlanner.is_open_empty = is_open_empty
PathPlanner.get_current_node = get_current_node
PathPlanner.get_neighbors = get_neighbors
PathPlanner.get_gScore = get_gScore
PathPlanner.distance = distance
PathPlanner.get_tentative_gScore = get_tentative_gScore
PathPlanner.heuristic_cost_estimate = heuristic_cost_estimate
PathPlanner.calculate_fscore = calculate_fscore
PathPlanner.record_best_path_to = record_best_path_to_____no_output_____

### Preliminary Test

The below is the first test case, just based off of one set of inputs. If some of the functions above aren't implemented yet, or are implemented incorrectly, you likely will get an error from running this cell. Try debugging the error to help you figure out what needs further revision!_____no_output_____

planner = PathPlanner(map_40, 5, 34)
path = planner.path
if path == [5, 16, 37, 12, 34]:
    print("great! Your code works for these inputs!")
else:
    print("something is off, your code produced the following:")
    print(path)_____no_output_____

#### Visualize

Once the above code worked for you, let's visualize the results of your algorithm!_____no_output_____

# Visualize your the result of the above test! You can also change start and goal here to check other paths
start = 5
goal = 34

show_map(map_40, start=start, goal=goal, path=PathPlanner(map_40, start, goal).path)_____no_output_____

### Testing your Code
If the code below produces no errors, your algorithm is behaving correctly. You are almost ready to submit! Before you submit, go through the following submission checklist:

**Submission Checklist**

1. Does my code pass all tests?
2. Does my code implement `A*` search and not some other search algorithm?
3. Do I use an **admissible heuristic** to direct search efforts towards the goal?
4. Do I use data structures which avoid unnecessarily slow lookups?

When you can answer "yes" to all of these questions, and also have answered the written questions below, submit by pressing the Submit button in the lower right!_____no_output_____

from test import test

test(PathPlanner)_____no_output_____

## Questions

**Instructions**

Answer the following questions in your own words. We do not you expect you to know all of this knowledge on the top of your head. We expect you to do research and ask question. However do not merely copy and paste the answer from a google or stackoverflow. Read the information and understand it first. Then use your own words to explain the answer._____no_output_____---
How would you explain A-Star to a family member(layman)?

**ANSWER**:
_____no_output_____---
How does A-Star search algorithm differ from Uniform cost search? What about Best First search?

**ANSWER**:
_____no_output_____---
What is a heuristic?

**ANSWER**:_____no_output_____---
What is a consistent heuristic?

**ANSWER**:_____no_output_____---
What is a admissible heuristic?

**ANSWER**:
_____no_output_____---
___ admissible heuristic are consistent.

*CHOOSE ONE*
    - All
    - Some
    - None

**ANSWER**:_____no_output_____---
___ Consistent heuristic are admissible.

*CHOOSE ONE*
    - All
    - Some
    - None

**ANSWER**:_____no_output_____---_____no_output_____


# Notebook from cmbennett01/notebooks
Path: notebooks/MAST/K2/K2_Lightcurve/K2_Lightcurve.ipynb

# Beginner: Read and Plot A K2 Light Curve File

This notebook tutorial demonstrates how to load and plot the contents of a K2 light curve (lc) file.  We will plot the flux timeseries contained within the file, and display which pixels were used in the photometric aperture._____no_output_____

%matplotlib inline
from astropy.io import fits
import matplotlib.pyplot as plt
import numpy as np_____no_output_____

## Introduction

A light curve is a plot of flux versus time, and is used to identify variability, including the transits of orbiting companions like planets.  The light curve shown here will be for the star TRAPPIST-1 (the K2 ID for the standard readout is EPIC 246199087, a larger readout for this star was also obtained with a K2 ID of EPIC 200164267).  TRAPPIST-1 is known to host a system of seven Earth-sized planets.

This tutorial will refer to a couple K2-related terms that we define here.
* Campaign = During the K2 mission, the Kepler telescope observed the sky in a given pointing along the ecliptic plane for approximately 80 days at a time.  Each of these regions is referred to as a "Campaign", starting with Campaign 0 and ending with Campaign 19. There was also a special "Engineering" Campaign before Campaign 0 that lasted ~10 days.
* HDU = Header Data Unit.  A FITS file is made up of HDUs that contain data and metadata relating to the file. The first HDU is called the primary HDU, and anything that follows is considered an "extension", e.g., "the first FITS extension", "the second FITS extension", etc.
* BJD = Barycentric Julian Date, the Julian Date that has been corrected for differences in the Earth's position with respect to the Solar System center of mass.
* BKJD =  Barycentric Kepler Julian Date, the timestamp measured in BJD, but offset by 2454833.0.  I.e., BKJD = BJD - 2454833.0
* WCS = World Coordinate System, A FITS convention used to store coordinate information inside FITS headers.  For K2 full frame images, it is used to provide the translation needed to go from pixel coorindates to celestial coordinates in right ascension and declination.
* SAP Flux = Simple Aperture Photometry flux, the flux after summing the calibrated pixels within the K2 optimal photometric aperture.
* PDCSAP Flux = Pre-search Data Conditioned Simple Aperture Photometry, the SAP flux values nominally corrected for instrumental variations.  Thus, these fluxes are the mission's best estimate of the intrinsic variability of the target._____no_output_____## Obtaining The Light Curve File

We will read the light curve file from Campaign 12 using the MAST URL location.  So that we can get started with understanding the file contents without reviewing how to automatically search for and retrieve K2 files, we won't show how to search and retrieve K2 light curve files in this tutorial._____no_output_____

# For the purposes of this tutorial, we just know the MAST URL location of the file we want to examine.
fits_file = "https://archive.stsci.edu/missions/k2/lightcurves/c12/246100000/99000/ktwo246199087-c12_llc.fits"_____no_output_____

## Understanding The Light Curve FITS File Structure

K2 light curve FITS files contain a primary HDU with metadata stored in the header.  The first extension HDU contains more metadata in the header, and stores arrays of data in a binary FITS table, which include the timestamps, SAP fluxes, and PDCSAP fluxes.  The second extension HDU consists of an image that contains the collected pixels for this target, and records information about them, such as which of those pixels were used in the optimal photometric aperture to create the SAP fluxes.  Let's examine the structure of the FITS file using the astropy.fits `info` function, which shows the FITS file format in more detail._____no_output_____

fits.info(fits_file)_____no_output_____

Let's examine the binary table in the first FITS extension, since that contains the arrays of timestamps and fluxes we want to plot.  We will use the astropy.fits `getdata` function to access the table from the first extension HDU, and then show the columns of the table.  We can see that the table includes columns for the timestamps in Kepler BJD format (**TIME**), SAP flux (**SAP_FLUX**), and PDCSAP flux (**PDCSAP_FLUX**)._____no_output_____

fits.getdata(fits_file, ext=1).columns_____no_output_____

## Reading the timestamps and fluxes.

Now that we have the light curve file, let's store the timestamps and fluxes as arrays for use later._____no_output_____

with fits.open(fits_file, mode="readonly") as hdulist:
    k2_bjds = hdulist[1].data['TIME']
    sap_fluxes = hdulist[1].data['SAP_FLUX']
    pdcsap_fluxes = hdulist[1].data['PDCSAP_FLUX']_____no_output_____

## Plot the light curve.

Let's make a plot of the PDCSAP flux vs. time in Kepler BJD._____no_output_____

# Start figure and axis.
fig, ax = plt.subplots()
fig.set_size_inches(12., 8.)

# Plot the timeseries in black circles.
ax.plot(k2_bjds, pdcsap_fluxes, 'ko')

# Let's label the axes and define a title for the figure.
fig.suptitle("TRAPPIST-1 Light Curve - Campaign 12")
ax.set_ylabel("PDCSAP Flux (e-/s)")
ax.set_xlabel("Time (BKJD)")

# Let's zoom in on the x-axis and y-axis.  We can see a sinusoidal pattern due to starspots.
# The transits are in there too, but you'd need to clean the light curve before you see them.
ax.set_xlim(2920., 2950.)
ax.set_ylim(0.1e7, 0.2e7)

# Adjust the left margin so the y-axis label shows up.
plt.subplots_adjust(left=0.15)
plt.show()_____no_output_____

## Understanding Light Curve Flags

The table of information contains more than just timestamps and fluxes.  In particular, there is a column of flags associated with every timestamp that indicate a number of warnings and conditions associated with that measurement.  Not every flag is worth excluding from your analysis: you should always make your own decision.  A summary of the flags can be found [here](https://archive.stsci.edu/kepler/manuals/archive_manual.pdf#page=19)._____no_output_____

# First we need to read in the array of cadence quality flags, let's do
# that now.
with fits.open(fits_file, mode="readonly") as hdulist:
    qual_flags = hdulist[1].data['SAP_QUALITY']_____no_output_____

Now let's plot the full time series, but this time we'll overplot those points that have a quality flag greater than zero in red._____no_output_____

# Start figure and axis.
fig, ax = plt.subplots()
fig.set_size_inches(12., 8.)

# Plot the timeseries in black circles.
ax.plot(k2_bjds, pdcsap_fluxes, 'ko')

# Locate quality flags greater than zero.
where_gt0 = np.where(qual_flags > 0)[0]

# Overplot the fluxes with quality flags greater than zero in red.
ax.plot(k2_bjds[where_gt0], pdcsap_fluxes[where_gt0], 'ro')

# Let's zoom in on the x-axis and y-axis.
ax.set_xlim(2920., 2950.)
ax.set_ylim(0.1e7, 0.2e7)

# Let's label the axes and define a title for the figure.
fig.suptitle("TRAPPIST-1 Light Curve - Campaign 12")
ax.set_ylabel("PDCSAP Flux (e-/s)")
ax.set_xlabel("Time (TBJD)")
plt.show()_____no_output_____

Intriguingly, some of the largest outliers in the positive flux direction are flagged: are these bad measurements that should be excised from the time series?  Finding out the quality flag value and converting the value to its consitutent bit masks to understand why these points are flagged would be the first step.  We encourage you to do this as a follow-up to this tutorial._____no_output_____## Displaying The Aperture Pixel Information

Let's read in the second FITS extension HDU to display the aperture information.  First, let's read in the aperture pixels from the HDU._____no_output_____

with fits.open(fits_file, mode="readonly") as hdulist:
    aperture = hdulist[2].data_____no_output_____

Let's plot the pixels as an image._____no_output_____

# Start figure and axis.
fig, ax = plt.subplots()
fig.set_size_inches(12., 8.)

# Display the pixels as an image.
cax = ax.imshow(aperture, cmap=plt.cm.YlGnBu_r, origin="lower")

# Add a color bar.
cbar = fig.colorbar(cax)

# Add a title to the plot.
fig.suptitle("TRAPPIST-1 Aperture - Campaign 12")
plt.show()_____no_output_____

## Understanding The Aperture Pixel Values

We see the pixel values are integers, but what do they mean?  The pixels are bitmasks that encode information about each pixel.  You can find a summary of what the different values mean [here](https://archive.stsci.edu/kepler/manuals/archive_manual.pdf#page=20).  For example, a pixel in the aperture that might have a value of 15 can be broken down into power of 2 like: 8+4+2+1 = 15.  Referencing the table of values, this means this particular pixel was used to calculate the Pixel Response Function (PRF) centroid, was used to calculate the flux weighted centroid, was part of the optimal photometric aperture, and was collected by the spacecraft.  Numpy has a bulit-in function that can convert an integer into a binary bit mask.  Let's use that now on one of the common values we see in our displayed image above._____no_output_____

# Break down a pixel value of 267 (yellow pixels displayed above) into its
# constituent bits.
bitmask = np.binary_repr(15)
print(bitmask)_____no_output_____

Binary bits start from the right and end at the left, so the bit farthest on the right is the Least Significant Bit (LSB, equal to 2^0 = 1), the second from the right is 2^1=2, the third from the right is 2^2=4, etc.  This bit mask has bit values of 1 (2^0), 2 (2^1), 4 (2^2), and 8 (2^3) set.  If any were not set, there would be a zero in that position instead of a one._____no_output_____## About this Notebook

**Author:** Scott W. Fleming, STScI Archive Scientist

**Updated On:** 2019-02-01_____no_output_____[Top of Page](#title_ID)
 _____no_output_____


# Notebook from aisutd/Intro-to-NLP-pretrained
Path: showcase - utilize pretrained models.ipynb

# Use a pretrained model to do NLP tasks
## like: sentiment analysis, summerization, text generation, etc_____no_output_____## Build Environment _____no_output_____

<code>
pip install transformers_____no_output_____import tensorflow
from transformers import pipeline_____no_output_____
</code>

# Sentiment analysis
from amazon, we copied some comments, and here is a showcase about useing a pretrained NLP model to identify sentiment of comments_____no_output_____![image.png](data:image/png;base64,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)_____no_output_____![image.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAzsAAABsCAYAAABNTKz9AAAgAElEQVR4Ae29f0xV19rv23POzcnNyck1/HOyc3Nzkzc3kbz3nni74zk1p0nbZCeL5Ox7kbhvFgm7ytGtcvXtwuphobVQXq9wcCO8vA0QD8qmWLV7U3+0btAKuqlFqRWs0AWoQIsuLVagtqxacLWIfm+eMeeYc4y55lxrodiKfUh0zTXmGM/zjM/4Mcczx4/1DPiPCTABJsAEmAATYAJMgAkwASbwFBJ45inME2eJCTABJsAEmAATYAJMgAkwASYAdna4EjABJsAEmAATYAJMgAkwASbwVBJgZ+epLFbOFBNgAkyACTABJsAEmAATYALs7HAdYAJMgAkwASbABJgAE2ACTOCpJMDOzlNZrJwpJsAEmAATYAJMgAkwASbABOI6Ow8ePAD9m83fQ6W5f3/2eu7fn41ZIu6Dh0gzayWcgAkwASbABJgAE2ACTIAJMIEngoCrsyMclvszmPzmOr4bvYL7935IwtgHuD8zjds3ujEVuYn7M/cSpnnw4D7uz/yIrwY+xI93I6Dvif4ozr0f72Lk8klMR+8kii7uP7g/gx+mvsXY8Ce49+NUUmk4EhNgAkyACTABJsAEmAATYALzm4CHs3Mf09HvcOPTOnzRvh0/fD+WcOblwf17mPz2BvpP7cQXn+wVTkWiWSFydCZu9uPi+5vxZW8z7t9P7CDNTEcx9kUHLhzaiPHhc0CimacHDzAzfRcjfcfQ01QgnLeEaZIu0wgGzrQjdDOadIqfI2JkuAud1x/NxrmQEZP36BhCZ9oxcDvmDgcwASbABJgAE2ACTIAJMIFHJuDq7NBMznejl3DpcBou/XkRvrvVDXJm4v3RjMn1nvdw5W//hLNvZSE6+U3CNDSb09dahutdf0bH3hWYjn4PmoWJ9/fD5G188k4Oblz4C3pbSsUsT9wZoQf3cfe7W/h47wpcOVWOcPcRzIiZqtktzwsfzcVzqSlYkJKCBalLUN1NVnahPCUFyw+PxTM58b3bg2jvHsOjuSNeasbQtC4FC7ecRMQrilu4ZtNDynCTq4bdPITlKSkov6AGOq+jCF9I5BCN4eDKFCxY14RRZ3L+zgSYABNgAkyACTABJvCLJWA5O/d++B7RyJf4fvwyIl+ew3D7Noz89X/BaNP/hM//lodvr3+MO6N9uDtxHdN3vxVL28hZmfwmjMitKxgf7kD/yTLcGmjD1a4DuPLhm7h9/VN8NzaIqYkRsUyNnIwfpr7B97evIvJVP0b6jqO35b9h4qtLGDyzC8Of7MU3N7pxZ/wL3I18JZap0UxO9M4Yvv96GBM3+3Dt00b0tpTgzvjnGPioGtc/ew/fjnwmZFK8ez9Milmlu999JeJ8++VnGOrYg8ttlfj6Wicut/0zbg2eFrLI9uj34yAdcf8iJxFMSUHgcBjRySgikTBGxWyE4uxMRhCJOOREKSwCLZjCJg1tUfNGuDEbC1bsx0Ak4u7wCNnyHulXZEq99yic9DvuUwjFt3RGECW/leJLc035Mg5Z57RJlSGsj5u3WBs0vsLWCKLXnc6OmU7j0IXilBQUn7LzQLKEPVYGomgvSsGCnV2aGv7CBJgAE2ACTIAJMAEm8MsmYDk7ty6fwNCJXAwc/X8wePh5DB/8nzHZ9q9x7+y/xJeH/x0GDv1HDLz/f2Hgg1cwEjoiZku+6DyAnmNvIHR8G/pb/huu9xxG9M6o+Hf5w39G6IPtCB3//4RDc/PSCdz5ehiDZ3fjMzPN5VPluDVwSiyZ+/7rL9DXugO9H2wX/y6d2onx4Y/xzY3P0P+3CiPNsX/ElbZKfHP9U9z7cRJfX/sEvSdKjDQnijHwUY1wnL4aOC3CP2t+A73Ht2GwvQaR0QHhBH3Z+1dxT9h1ogSfn3tLOGNxq4Hp7Pi27EentmTNcHYWLl4Cn28JFqakwLd7UIgaPZUPX0oqnqPw1AyUXzA8i9HD2ViwLB/BrFQsWHkIoxcqjNkimjFKycbBm6olUYSqMrBwcRrSfc9i4dI6hBBFZ+lLRtrJdhSkphmyhZw0+PxpSH8+FQtS1+LgdZJlznoIR8C4Ts/Lhz/VmJEaPboWC5/PQPqyNCxKeRbFn0SBGJtUGUDcvL2YgXRfGnyLaQYsH63O6aSbTQgsThE6fc+nCmbGzE4I5anPwrcsQ9i/cMUhhKXtgo3pzERDqF6aikW+DPgWpyJ9d0gA69zJzo5ac/iaCTABJsAEmAATYAJMALCcncnbX+DK8Vdw4+j/hu9b/w1+bPsfcP+jf4EH7c/g3of/CpMn/y2uHf5fMdiSi++//lzsgxn7/KzYB/PV5VYxw0OzQ3RIAf378e4EJkY+Q//JP+Ly3/5JHFowI5a6HUHPX1/H7avncDdyEzPTU+IwA9q/E538Wjg4nzUX4vOOOkTvjIsZocH2XcKh+ebGp8KRmrkXFcvdaC8OLVG7deUkev66FTdCR/Hj1ASi342ir6XUcHK+6gctfZuZ/kEcgEAzP7S36EbPYeGIjX/xsZgNSlQZwicK4acBfEoKFvkr0K7O7DSGRfLO0hTDCUEI1S+mIL3ecHxCVS9hwbL9oFjC2UnJR9OYPRMkBurk+DiNEE5WBvYN0w1yrFJRTsvnJrtQ/GIq0pemwbezy5gNEg6KdJYGsWdZCl7YRY6A6qiY11uaMKrODgm9+uyIbpMqI1HeStBJ8mJmbYzMhXYRizoM0FevZWzD+5EuHT9HnMiJfIulcMpSK0C5ZGfH4Mv/MwEmwASYABNgAkyACdgELGfnPi0t+iqE4ZYVuP1+Ch6c/FfAqWfEvwcn/wXuNKWg++BKRL7qEc4MbfKnfTq3Bj/EpVPlYlma3PhPBxPQ0rCrF97BxffzxcwJOUD0RyeoXe85gisf/jMmb1+zLKF9N3QowmfH/1EsgZu++5255+cBfpz6VixxG/6kQTg7MhHtI4p+P4Yzb2WJ5W1kD+35IV20dG6oYzdGev8KcsLkHx2C8P031/Dhf/+/cWvgb2L/Ttw9PzKh+Ixi9EId1qSmYGElDbGVZWxywC2cFj3ccHAqhBOgXkvRumMhQ6UzkIrnltLMC/3Lxr7Lxv2B+jQsSEnDHvO7MRsjnR3VOfG6NuREe+uwfLExoyJmY8ylYLpNqowk8+ZwUmSuNLlanDBaX8/AIpplWkqzZGZetDims5i6xOSRgfSV+4XjFD5Rg30XnNNIUit/MgEmwASYABNgAkyACfwSCVjODmWeBv1ff/E3DPz5P2Dm+L8GPngGD44/g+nmf4lrh/49bl05AZqdsf7od3ju3xOOBi1bk4cLUBjtuRk889/FyWk0A2P9kSP045S4F+4+ZAXfv/ej2HtDS9FouRt9t/8e4Ifvx4VT9fW181YwySWH5fKHb+IHOhBBO7r6ASa+6kfviWIxgyQTkeMTvtiIobO7hXMlw+N+RiMYHTP3zERDYtYkvrNjzH68IBwimjExl6xZMzuG4yN1CgdghTHzI8PEp5jZeQnFZxyD+JtNWJOaiUAgTcwkiXklc2ZnHy1dEzM/KfAfoDuqo6Jekwbj4AG510XMTKnOjmWTmi7JvDmcFJkvMbPzYgk6aQ/R9f32AQXdFbaDI2aFdGen+IwhQczsvFiCdolEnJsRRfhEHfacNmbYpC7+ZAJMgAkwASbABJgAE/hlE9CcHUIxerkZl/f/n7j73r/BeOMC3Gr8d5g8/D/i+l8W4vrFRkwrsyQUnxycL869hctt/ySWst289AFGh06b+3NqQUvcnL9tQ7M+l/72T7ja9Q5or0744rsYv/oJvv2yx5glukW/7aM6OxCHFND+nFuDbeL46GsX/izij37ejtCxfxTOkO7sAHQ4Ae3NiXx1Cd/e6BanxUVuXRbHXPd+UCxmjJIq/rEmBORJbCkpWLi0EK1iP4w+y6HOWkQvVCBdplmcjT29yp6dFN3ZiXbXmHHlzIxtFZ0Ct0juWUnNRdNYGAfXpeIFWr5mOjXLaRmdcHZeQvrSZ8VSu4VLKwyHIq6zA4g9OzRTsjQT/qWp1iZ/3SbV2QGSypuHs0OOWDnpEcsBM+GTp7FFQyj3pYi9OOlZFC5ZjKEpYOTJcMrC9ncqiwCdwBbGwRV8Gptda/iKCTABJsAEmAATYAJMgAjEODvXOv+E4Xf+D3y2539H75HVuNLyOj576z/geuO/x8BHVTE/5EnOTvfRreK3dTrffUUcVtB18FV0vhvA5ZNlxvKyH8yjwEzmNCNDcWkW59yBNbhyugqf/Pn/xWfHinDxSBDffNljHg9tFxItS7v4/hb0n9yBsw0vY6B9l0gz8OE/4+O3/4vYu+N0dkaHPhKHHvQ0F6Bjbzb6Wv8o0lz95C2c2/cHRL//2laQxJV+AlgSCcyT0eShZ8mkcI0jTy9zvWkGqnt2orPUOGme0BZPfsw94+S0WWqypLibSDKTlChPoZMS70XdT7KT9/mTCTABJsAEmAATYAJM4BdHQHN2Hty/L46N7vtgOyI3ezDz4/e4f++u+M2dwfYqsfSMDgBQ/2h/DP3AZ+jYNnHMNM3akDNDJ6mRc3L1wl9iZoOmf5jE2b0rhLMzRYcU3PsB03cjYsaFnKSvwxdABxbIP9oD9P3tMD7e919w7cJfxOEHNPNDS+WGz7+Nj/evwvffXNeWsVGam1dO4ZMDa3Hzykkxu0Qy73z9hVj2dv4v63A3ckuqmP+fqrMz/3PDOWACTIAJMAEmwASYABNgAo9MQHd2zB/gpNPLyDGQMyV0TQcLTH77pXBkVK33Z+6J37OhQwTI8aE09I8cHvrdm6mJL2OWpN2bjuK70QGxZ0bs8xF7f2bEqWgUn9LJ/T9S14/RO0IP7bmhe+TMkD46gpp+g4f27MgDEigN3afT3Ca/vW4sozP385CTRDK+GxtKfs+ONII/mQATYAJMgAkwASbABJgAE5g3BDRnZ95YzYYyASbABJgAE2ACTIAJMAEmwAQSEGBnJwEgvs0EmAATYAJMgAkwASbABJjA/CTAzs78LDe2mgkwASbABJgAE2ACTIAJMIEEBNjZSQCIbzMBJsAEmAATYAJMgAkwASYwPwnMvbMzPY3pmccJYxpjl/ox5nJC8bRLWHKWTODqxWvQz5lLLuVDx4pOP3TS6dF+9I0+fPqHVjwfE05cQ3f4Jy3Z+UiJbWYCTIAJMAEmwASYwFNJQHN2+uqz8PL6DQhs3IDAhhI0DkzNMtMTaNmWjfpLs0w2q+jjaHmjCC3jjkSXGvDyttakHRZyGK5aY+B+1Gc1oM8hMqmvvQ3IrO9XopIsF/uUGEA/6rOL0PINBU7g6qVxzMZ1GWspQmEMAGDsTCU2WeVXhjYhn5zDJBy5iWs/rwP1TRdq81Zj1YYNCKxfj03Vrbgat/olma+Y8tEKYnZfZsbR11yDTauyUN9rJ53oPYBCsnvDary8oQF98eye6Me+bUYbW7VqA+p7ZeQpDB7cihwqv/XrseOUUsHH+9FcHcTLjjo62duATeuLUFW9FTkF72PwoZ19Oy98xQSYABNgAkyACTCBp4lAjLNjDeKmOlCRrTgAM9OYvDOFydmMygFMU5rZDsKmp4QubYbI1D894+HsuJVKdAqTU+4Gk8Ng5ZWcD3MgOT3lYq+bPVJfzGDaxdmxbJeJ1M9+1L/RijE1yIO1tM3V2Yl2oSprN7pjZtWIl1KOpMfMj1YuvQ2xDpRbvt3CVNuJ+Z0p19k9ab8aXVzPDGHfK0HsU5xrymNOfb/uBArdsjxd8iXrm1rmsnwEU5lWsUDY6xI+EztDOdiyGy294+isVZ2daYzdtB2Twf2rUXjK8qIVRcbl9PgIxmQZDRzAKumg03VlB8TP786M4MjmErQJMUNoqWtF32gXajVnh/Jfg06zbY28twE7zkjHKUYtBzABJsAEmAATYAJM4BdJwNvZmemxB1dT/ajP24qqvQ2oKAhi36VpTJ6vwcvWjMYIms3BGc0OCSeCnJLSIHbUNaC2OIjtbePAjfcRKDMHdDQTQ84UDfxooL7xXVydAcTb6oIa1O+txOa8A+ijwdzMNRx5bQO2k6zKrcihWRF7fGkU3HgrCoXTQIPA1dhcWmPY+1o2dpzRB58TH1UiZ5U5i/XmaUwIZyeI7dU1qN27G9tfWY99Q4ZYV3vUqiIH01aY4uzQvbwSVFXvRn1dCXJeOYBBMdAlGykPQ2ik2YDs1WI2rXEAgAtrEn316FYEiklOJTavz451TDCEfTlB7OtV8zqBtjfX4+WsbORs3ICKjyaAiQ7UVzegfu9u7NiwAfWXpoGBdxHIycbLOTTj8C4G4V4O05caEHitEvV7G1D7TlfMLNrYqRLkUNnVlWFTnpzhIB7ubC1kQ8qgXwaK+mc7b0J2Xpkon33nr8fmS9S39dhc3YDasiA27e03HAcqg1eCqNjVgPrqrcK5kM7GWEsJNpUZZbOp9LRwOMnJCmwrw2bJS9qjfFp1XAkzLqfRWZ2Nqi4X5ykmLjBNbWhXl3Doxo5v1cq0by/VW9V5IY6q0zqFs5XrUXuR4kyhu3YrGoddlHAQE2ACTIAJMAEmwAR+wQRinJ1N5TQQbkBVwXpsN5fS0FvjqvPmAI4cFnJyxNt401m5eQybqo1BmxwI0kAu8N6IgZacGeGIjODIRuNt9Mh7NaiqLjKcClqOI+La9ykh6SXHiWSt2m96H5COgqPUNGdHcYZinBEjnbTT+KYPJO2ZE3d7NM0x8kmWqV+7p9qtXFt2G1JdWRO/HOkoAbZ9miXAeA8ay4N4eVUQVS3XjMG+MmvliC24yuVwukz3fE+cKkJhs1mmTmGeNnqxVQRonGS4wpFkS8dY3nbky7OOaLINZ0QssySZG9+HkRsKN8qMOGz2yqOpW687lkHCUQ9sc8zS2bf1K3JqN9j11ClTLw9KqnMUwkZbsZ0c1A2rEdg/pM+C6dr4GxNgAkyACTABJsAEfpEEYpydqo+nMBk+hsIN9uCaBmLSCSJHqP6MMUQcfGe9eIs90rzVepstB200WFu1bbdwnESaZuNN+8h7QdT3jqOl7AAGhw5gR8s4BvcX4cgN4k8DuiB2kA7z39kbzsG94iioRWY5DY772mDXTiDtNEL0gaQ90HS3x5YCIEY+pTH342j3VLuUa8tuQ6ora0cc2z7NEvvLnWs4si0bFR/TW389bxjvQNUbQWzauBWFr623ZhN0mR75nhlH9/4S5KwPouqMY2rNYaPNRdev6zFNppkdOeMnc6HO7Dhlizjx5Vrlq5UBIGZQaJkZycwpQq1V146h746zrklj9E9Ltho82orCRPt1ZHyahdqm7tcxHHvpeFK0wXdWx5/ZidJsq9lGZ6Zw9WARNiVw0qR6/mQCTIAJMAEmwASYwC+FQIyzI/exjB0vMmdbjIGYMXB2YLl5DJt3vYt9b+iOkZyNCRy85kgAsZStsLoGFWJ2qB/1lTWoekO+YacZhUqcVVfv0D6MrhrkPIaZndoeaZ7XwNndHplKfNKs1ub3MSL3YUycxnaahaGb2kBbcXDU2SkadL92zNqzQzM7MaxpFsJaApfcgPzqwQ3m3hHKm7IcrKXIlt+zW3N2Nh+XDkyCfM9cQ+NGdUmVuRRRsXGkOWjK9mKrUBSzhEVoHrXDJj+2l3iJZY6r7P0pRiw9X3odoWWVyuyaVdC09Gu1MZsoZnaMpZO21uTYxjg7NMNiLdtTpLmduGcu77QPJjDj9zbg5eouZc9OEM03FVkxTqteb9Cz23FQhpqWr5kAE2ACTIAJMAEm8Msk4OnsGMvUzAGo2EeyHoW016O6xNj7IXhNoK00y16uBsAaCJp7KDaV056IMmxulMvQaCCdZS6Lo+VDenrrhClaSldcaZwoJmStxqptZajYVobCPHv5j1Vs1tt/1alwOhxWbExf3I1VtARo8/sYdAwk1dkHV3tsMWK/hHGK1lbsKC9BTo7yxj4ZZwcjaH5ttdhTU0V7izxY056VVTlF2FFZhB3bpCOhGjKEfXQiWHEZdmxejVXW6VzT6K41Tjnb9N4QxL6bDWWoratEhSqHHNec9QhsrMHZCXPPDp30pZTD4Hu098bY+0LLFtXdQWSJta+G9sa8dgCDwmlNwtmhxKMdqMhbr9j/rpneyOPYqTLjpLKNG0D5APR8QalvVQWrsfmdIWvPzsuvlWD7G2XYsW29vZdHtZf2LxUYe5XUslfpqtdWHReBdAKhcoohnWQo9oFRuNNhAWgpYOYq4myeerjRrOOYQt/eIHK2lWFH3npsprJSlTrqKO3T6du7AavkHqn1JWhRnEUtKX9hAkyACTABJsAEmMAvlIDm7CRiIE7T0kdgiZIAdNrVbE9j8zq9bHq2yhObl1QML3vUxIlOKVPjJnHtytrlhDCnqKROv0tCjpDrlu9E5Ulp1NPQnAYm+O55YpuZLmEVIPs8qolrWpFHjwQJbI1/ux/1m4+Ze4Lix9TuxrFfiye/aCfUyUD+ZAJMgAkwASbABJgAEyACs3J2GBkTYAJJErjTj7Ye59xXkmk5GhNgAkyACTABJsAEmMCcEGBnZ04wshAmwASYABNgAkyACTABJsAEnjQC7Ow8aSXC9jABJsAEmAATYAJMgAkwASYwJwTY2ZkTjCyECTABJsAEmAATYAJMgAkwgSeNADs7T1qJsD1MgAkwASbABJgAE2ACTIAJzAkBdnbmBOOTI+SLL754coxhS5gAE2ACTIAJMAEmwASYwM9IgJ2dnxH+41A9PDz8OMSyTCbABJgAE2ACTIAJMAEmMO8IaM6O+I2TO1OYFP+mgRsdaL4kfhnysWVM1Tk9k6yaKfQ1d8T/DRP6/ZSbQ+geGhG/uzJ56RjO3khWfoJ4c8HF/A0bg7XJ3PXnXkZwtrnf+IHMBGbR7UTOzo/RCUTuRPGjlDUTReTOBO4mYH/v2ju4WHsc4yLdBK7tXY1zuQX4fOg4Lv6xBl8m+i2lO+dw6a0/4dodqRi4N022mP8mo7hn35rl1VUMvlWBwbkq31lq5+hMgAkwASbABJgAE2ACTyYBxdkZR8sbq1FY24D6vfSvAyO9DShsMYa3j8d80rkBtW09ONtyADvygqjvTca5onQN6PMyarQDFXlbUXX0NLo/el84bGMtRajv9Uowy/AEXK4e3Y22bxLIvNFhcC4PYtW23eLa3bHsR/0brRhLIE7eTuTs3O0sQIf/FQyaTkek/RV0/KEC4UTOzq02hP7cZjg7QxU451+NKyMTuEvhb72T2NkZfwfn/b/DJaU6jX/wO3T8/u9xLvc3OLfiVzi3txt3ZUZm9XkOPf5n0BOaVSKOzASYABNgAkyACTABJvCUE3A4O0XQfBtrUD+NkTPvor66BlV7WzE4NYHu91oxaL7Np1mTtuFp4M41tDXWoKr6XbQNk9Myhb5TXbg6fBqNzf242VaCl/cPKUjJaVF0TnWh6pUDGIRTHyUZwdlT/Ri5+D7qz/Tazs43PTjyXg/sn2+cRueu9dg3oKgBQM5O1al+tAj7KA/G/bGL76O2uga1R3swYQ74KYwcvsYzI6DJlpg4nlyA6dEu1OcZTqNwXu70o2XvbtTWvY9uNwfIkgV9Js2aPepH/Wvv4uxHB1BVfcDkqudN/ZbI2cHMOfT8/hl8eo4KL4rP33xGOBn3ZiYw/F4eOl97BT0fXsYdTODaX2vw+ReXceXPf8K1K8fR89ZxfEXhdb9Fh/+3+PStCvSIf8aMzb3b59D35mqc/2MFrnxhVI47V97BxW2rcfGtV3DOzdl5/R3hQN3rJiesBNdAszTmDJA1G+Sw5Q7w43gb+mrzcLH2T7g2YTg7nzYeQc8ff4fO2jaMzgB3bxxH6M3VOGflKYqRDyvw6Wu/w6d7DcfNzWaVJ18zASbABJgAE2ACTIAJzF8CDmfHmGXpvtiDvtFpQBmIT0fNNVYXaxB4bwQjzUFUnaewKZwtK0HbhOG4NN8EMHMNja/VoDNqhO3rHcHklNsaLYezA/u7Ux/Qj/qcGrSFxzEp5Dag+04P6gvoUy2AERzZuBvdjpkKcna2nxoHLZUbad6KwlMTmO5twKbaHkzOAJMf12Bz8wgwcACbaruE40M2uMaJwwXTUzi7ayuODE9hcnoEza/V4CzZd6cDFWUdscvRFFkqb/u6H/UbG9BHMqZ6UPsKcVXzq18ndHYAhPf+Gh1153BPOD6/RmgI+Oqvv8W5XW24Pd6Gi3/4Dfpu3MKl15/BuTcK0EPOx/kS0xmZwMjh1ejwr0bfp20Y/luB6cRcRd9//TUudt7C7c4CnMv9E0aibbj4+1/j0/aruN1Ns0EuMzv5f8KXd67i2v7foWNdDb4EOS5mPGs2yGHL1yT3V+j883EMf9qGEdPZ6TzcjRFFT+TGOXw5MoHIUA3O02xW+Ag6/a/gyq0J3L52Fd/CxWYdJ39jAkyACTABJsAEmAATmMcEHM6OOUinPTvkmygD8YkeY7ajvjyIzPp+YOI0tld3YZoG8bu6ME3OiLLcqq8+G/WXyHmJs9xMcW4MhhS/TDgHMfo0+RRvAwIbytBmT+mYxTAuHAynQ6AuY6NrWp6nhmG8FYXbWvG5Y7mbW5yJeFwA9NXL2Spy0IpQK5YFlmGTwseqM4oslbd97eQqZVsStItknJ17Vypw7vclGO4uEUvYvsQtXHnjGXT84TdiSVnH72lJmOFgnP/gliE/JJ0dAOq1dEgGyZH4FTr+4Tc49w9/bzhG/ZQmD5+TcybjeSxj63zzTxi+Taq8nR3LFlWusE5ZxqboEbM2YvbnFWMJ3a2ruFL8d+hY8Vtc/OAy7tx2sVmjyV+YABNgAkyACTABJsAE5jMBh7PjGEjLgfidDux47RhGaLakt8FwdkDLxWrQfLzSXDLWj3pagiZmVKbRWU2yZunsjB5D4eZjGHHVpw76DblnaWamtBVjjlmcwf3rUXVe3/ujOi3S2Zk4VYTtH5ne0o33sam+H1oYoH8341iOiKudDmdn8/vxD1KQjKkWuV6r+Z5AW6nhDHkZzHQAACAASURBVHpVumScHaAboT/8Guc3/hrnDl8Voq7V/QrnGi8rhwTM0tm5RcvjfoM+9eRr4XiYYYoTIm0Xe3bMZWwyzHB2aGYJwC25z8dhiypXJHRzdgwH7vxfr+LeTBsuytkiAHdvvYNO/68RGnCx2TaEr5gAE2ACTIAJMAEmwATmOYH4zs7NY9j8WhnaPh9CY95WVOxtQG3lVqyimR36623AyznSwQHGTpVhU9lu1FcXYdNeOkFMd3YmXPfsZGPVhg0IbNyAQPEBY1/LjJs+ddBvy53sacDmXcayM6sspobQuG0DAgVlqCrfikDjkDaLI50dTPWjfnMRqvbuxo7NZWgZpaVi/ajPC2JHXQOq9nZgwi1OAi4jx7cKDkcuTthM9jag6p0OZW+Raa3q4JDcDSWo3bsb9aVbzcMhaHYoiO2Vu1FbFsSm/f1iH5GVV8dFcs4OMHL4N2LfTd+IIeDerSPoXPEMOtbSYQG/x5XbDgdDnc1RrxUnZrSVlrf9Hc7l/id0vHEEtxHFtbd+g47f/x06Nv7GfRlbjLNzGaF1z6Bjxd/j3Bu/Mw81cNhCcvfSvqFn0OH/FXr63Zwd4Mv9/0nMVp1//beGbpp9otkrmnn6hwpciwKxNjuA8lcmwASYABNgAkyACTCBeUtAcXYS52HabduNMxkdqRxnT4kzerzvSemLJ2BmWuzRiReF7tHx14mOvY4XJ6GdxMR1z5KLZdOJbXFJZQUl6+xYCRwXk0kcQ+1Ion+lo6wf6Rhp2vMVxZ05qkN3J5VjtslSkq0evW2GPbLNOgX+xgSYABNgAkyACTABJvAEEJiVs/ME2MsmJCDwqM5OAvF8mwkwASbABJgAE2ACTIAJzBsC7OzMm6JiQ5kAE2ACTIAJMAEmwASYABOYDQF2dmZDi+MyASbABJgAE2ACTIAJMAEmMG8IsLMzb4qKDWUCTIAJMAEmwASYABNgAkxgNgTY2ZkNLY7LBJgAE2ACTIAJMAEmwASYwLwhwM7OvCkqNpQJMAEmwASYABNgAkyACTCB2RBgZ2c2tDguE2ACTIAJMAEmwASYABNgAvOGADs786ao2FAmwASYABNgAkyACTABJsAEZkOAnZ3Z0OK4TIAJMAEmwASYABNgAkyACcwbAj+9s3N7EO1DERdAUYx2hzAadbn1EwdFb4YQuvkEGDKrfEcwcGYQbmRnJSZu5OR0PHZ+nnUorvHGzdmknU3cJFTPPkpyvGcvN8kUk4/YBh41fYyZPzOPGHucAXH6MNe6NFf5mSs5zvw8pu+TIRx8u8voq+a8jig2R6OIrcFxykhJOqeXrmU/pxoeSlh0qAl7TocfKu3jSBSdfBxSdZlP9LPJNPWx26gjmYNvs29Tdh5nn3YODPYW8Qj9kZ0nb/FP35358+zRnJ3OnSkov/CYi+NCBRbs7HJRMoaDK7Nx8KbLrZ84aPRwNpYfHvuJtT6qui6Up1Sg81HFxE3vpSOCge4xa2Dx2Pl51qG4xhs3PdK61n2PuEloeego1GEO3JbJvXjL+4/zM4Ty1LVomkUz0G2fffrEuUmCx+3Bn/FFRZw+zLUuJZGfxFAAPKKcaBhNr2cifVkGfIufReCoHABHEdqdDZ8vA+m+NCUcwFgX9hVlYpGjz4leqIDftxYFRdnwraxDKNbbQKgqDcVn6IZaR2jQM5cva8bQtC4V5d1OgHHK6HY7yv1L8NxSI7/+okMYiDsAT9Jm17J32vVzfA9j34pCtMfL4yParvcJah4d7LorsHBdE0bVKI907V7OP9+zyZFfLW8/8fNT0618eei+0521Ijnm0i6H2aclYd71KkbVLALU/iiZZE9IuSVj6hzG0dk/4rNnDu1KJGrOnJ1oJIJIxOXJ5rQgpvOMIhKJIHovQaW/Z8bT5BlhyahFlOyLWANyVUzUYbbVEN10ThpyktIp4jqEq4qp0RK3+FGcKRC9ZwZp9tmVTsjUHmAmJ6ciN/vcwiw9tg7dqC6UrzxkPaji8oNbmSUbZmq16pCRzuJBt81yjmj5ByDzZaXVc/BQzo6UqYky8+LUr8Xx/kLs7BcONu/YMrXz6l193Lh66yYdGkuXqFZbEXnX665ue2xikQdnHRTRXMpRTe5V/9zK+kJF7IuKOG1fVeN5LdPLducZ0aUPk3XEtd7p5RvDXur10ufFRfYrzjpoxXcIjIQRllPCt5sQSK1AiKL01uCFLSfNPjOMff5cNAlHPISDOw+h82Y7ijVnh/JfiHazQobfzkDwhBQsdXahfLHbSxlK6whPlH+zL5H1X9Qv+UWqsz5lHXMpIxEnhGpfJqp7bQHhw2vh29mlPTP0duhis+zfVPay7AV/W740TZcpQ6kQY+PKu65pzDbpnUqmtj/dy8i+D2m7EmRcmn2Lsz3L+m7G9+4T3Ng5lGi8ZPnpcVw5iCju5Ww9m0TdiiUl5DnzpKtUvrnYZPFy3ouX39k8P80xg1q/XNu7WT6xWTTsN9uW9px06zut3JryXNnYrAU/L52WLMAqB9hplduxl8nUq3j1X2lL3nUmVi1kH+Pa9z96uVkaE/Z1VkzjgvIq64BHXbZsN5O6lo2Dq60l6jkW0Nu0/gyzbJKCZpsvme4xfCZwdqJoL3oJ1b2kmd6UpVgDCdFJnqJaHUZTIA3Li2pQ/Gom/JXmw8Fq9JTWBqJ3noPYl5WBQGkNirdkw5caO7NDYF9YmYuC7TWofj0Ti/JOmssfulDuz0ZBVQ0KVmaiujuK6OlCLLJmjeyHs3jbuLIQ1VWFWO6vMd42kn0rcxFcloH03eLRbuH11Nm7H8HSGkPO82vRdJP4PGsPTof3wx9oEvaFD+fC/2oJqktzRZj+xooa+EvwB/JRXFWCwNIMlF8wegi7EwBw8xCWm04Ehaevy8XyZRkoODEG6w0q5b+R7CfGmQgUFRoyfWlmuUXQWkV5p/LJQHplSDy8R4+uRXqgRIQb6QFXm2+3o2BppsH51Qw8pw1uCFkIe5YuwcLUJeLN8J5uoyNLtswQDaHclF9dWoNWmkmYjC1bq3DogsrOn4uCIoOvz1djDM5un0R1EZWPybTbYBo5U4j0LKP8A0uXuM4sxnd2oujcmYE1jWFERef8Epa/SpxrUJD1rD2gE3ZnivpcsNJ8Ez68H+myztLby1RzQBdtR8GyOgwoGRs9UQjf4hQsojfpr5/EqGeZwih/Z51WZLkyHGtCcGmFqP9U/msO0Bt8qjdp8G+hulCI5c+vxcHrJEh5CDnbSkw7AGJtV9LH6yPcylHNh1f9cyvr7jqkP5+Khc9nIH1ZnagTrm3fkh/GvmX5aBXjcXqrl2q2ZWrXGdgzZHL256KY2Phy0eRkA+8Hd+J658U+ifL14oIwDgaMOlhMn83G1Fxsf2FB0C+ovvr3g2pGuFGf4Q5Vptp1XaRS+nXxPYLWLTRrQ0Cj6CzNxJ7LunjhQMn2YNWxMbS+noZFKc/CJ/u37gqzzdageBe1BeWP6qMvE0H5TMjKRTDP6AvSF5dYzpbdphM/Z4RdMTMLXShOKTFny43nnF/ooX4q1majzTnaP5mt2luUjefWHRJ86dkZW1bUbjKw5tVspC8rNPpDK+tefTwQPpoLH/UH9LzxV6BzEuJ5+MIu49lG7X2BfCFFZSydWLKtqF1z6Cx10nbrmSrvJPdMie0TZHoXdo5n3Qv+XPGsLQ6kwbcyH0Hq64uyscism+7spHz6VPsfO1w826Vseh5azuwsxzHREKr9ZjvLW4v0F81+nXjG9Gku+bVMmsXz06O+NK0zxlDUfx+kmcxEz88k+07LRLiXt32fWM9+PGOsnlHK6fohrFlagXZrZYOhwTlWcatXbvXfeLZlI5Annwdu7c3OhVZnXMtRjfuo5WbLisb0dQqTmOeLwtmXhuV5+SgopTHws/CL57mjv6Exs0f/6Dbec44zbSuNq1j23n1S/GevU/Lj/57A2TE6zPS3w0C0HcVFhQiKBxUVhvEGjxyMF6qks6AUElUWq5NUHopKuGdaJd/a4F9xmsjZKjhtvkKgzlvoordzZqdDjofoxGlAo79tFG/OyY7t7Yom+9JLpx0DIP1CTm+NePtH98IHMg2bxEDWGDDQQ7+9yOnEKZwoIdlvPmg13Y4HwHJZmUF5cspUGGsNRLGa7DIfeKFKOSgx73vYTPkMNMu3s7oOS7JiJ4VpeUhUZmNNWLNyP8LKmxP3srW0GYMHq245WMrsnC40HXNiJd9Imx2BldaWaQ+M7DDDMT9pOTrGHYc+pT7HsBJvsO36F367UCzvES8PaLkPtSvHn26Hztvmasuk5FZdVGR5MYycyEf6lkIEAnLApeugNrmwktqzks84bUXVrdtup/ds5wo7TZ8jH4nqH8mXy05tRoKMe9t3yBf9yPB+FBQVYrkYHJKzTe03tu4YL1PsvJEoW6caHpvW7g+lAV7skytfNy7EQvTXpMJq7yTP2V9IG9TPMA6uy0C5+ZJAL081nzKNbr8IvXkIAXI2ly5BepXxYkXGFp+eZa7LogGO3d9pEhztX02n8gek/Z71TxWr2SVvkGyDG8lYGNNvqLqNdqiViZzB0mTT88BYXudeVkYe9gmnWtohP3V9Vr2jcn7RfOGj1kerT4+ifXshCrYYjj2ls56d1+0XalKL9qnZrt0xvlh1DIh5psAug9iUel6cL/Zke1bD1Zem7uxULXpdkHcsZiKA2oWxVNezjmj5t22mftQe99jh+stc1QYljjRGfib5/HTPcwjlvhK0y0e0+TywytcaG0ll+ifJlKx1Nno865tS3laY+qygwGTHM2KrgMnoE8PR6VTyIeUnrFde9V+MPUrQbo4t3PlJLfSplJdW7kq4Gv2Rys0WFNvX6frscvEKd4xrNNvVeqekt/oGssMeowpd1jjTtlG9kv2qEabKV58RiZ9hqsyf4jqhsyMfmOELFQieCKN1SwU6x5oQMN8G2QVhmGuB8AKuhOtplYJQcq7HscGSHn8evcU3/50wBo6hXTSIjyJ8INtcF05pMhGU8apq0DrsqByKPrr00hntrUMgKxPpWdlYvkzO6JCDRW8Taf2z+VaRGsGLa8Wbf8O+/dAbsTOvXSg2l45oupXGpIUrDoRtus1Gz8MYWovWwp+VgeXraB29udwsMoiDRZnw+dZiDy3d8LDZKk+hSNdh6Vbs1HXTNzuNV5mNnqlBwJcGf9FJ8cbTK56lT6lDWgd18yQK1mTCvywba1akmZ24rV+k19JaEq2BkR1i1hFav58lHVe66yg7RZ7Oyo4XfjsT5RfCOJhXg1BvDYKHwwhVZWMf1UPHny5Dt92uAxTuUqcVWd4MB7HnP6cob+h1HaDBj3C8bfv1Bzjg3g6cAxs7vW23YaCVR4VdDFczL1Zc8V2x1bWs3dpufE70YPbv7EL4cD6qe0OozjuEcG8NlgtHVNFH+q16bueNgu38qeGOtFpezcwpbUOEWOwpbXy7vbiQLS+sM2ZsRd9zgA4CcNgi1Wuf5uzlYdsBJ0dWDoQoamjXS0q9oRCH3Cg5iXLQHcFAfbb9tlHq0jjE4XVvDO1VufD5MlFg9u1ShF4fVRtUeXZ9tMuHJOhxLJm0ZM+acZKh9syOLsO+r+6T1MtE0aPl2ZgxW3N0TNSb2LJS0kk11qeaV6XeWfXSjGjpMwcx17tQvuUkwifyUX5hDE0B++WfaO/ymWDpUS4sWUoYknymPEZnx72e6za67QF2lmNnqeF4xoTL/cta/m3+enw7XK+balkqcVQz6dpRfl6yKTy2vgCRy4dQkJUG35o6hCaNeu82NrLUJtV3WrFFm3EdQ1hR1HxS4GzGM5Q2DelLX0LBaRdPh8Q5xyrOeuXgZ5eBztyLn5UNtW/Qyt2ZPzOFQ+9sy83SG9PX6fpsuV7hjvGsZrvKQElPtruMUW1dlnUxF3o/p8pX+iTxbIj/DIsR/JgDEjs7wuvLR0FRvjg8YPSwcS3fHETPlMBnzezQ0jHzDSIBL5UHEShAlILQ0yoFoWRah2/LoQdxUCyjUyLT5fB+LN9eh+qV8qFLHmY+WuX6RhldsUMGyU8vnZ0708TSFopHSzzk3grhWO2uwXLJQXjN+hIlKdv4NPMq394N1VlLnYTuRnPAoTQm3SbinOkYLNtsSIcVn2TIJQvUCTkfbJMnEaQwD5tptkp7WxmzjM3srFfImQJFt8isbZdnmZlwBuqN2bJE8ezOjBLa9YbybNWJT0rMgZq9nFGo8Sh3vQGbBplxI6dLkG4tPbH1OeVprGgmVL7ZpTpJs6LizTANPApRQLNZphr1g+wo/kSG2OwoxCpTMePgUqdlMvPtnsVCC89GsLEJ5UsLzY3JpEMu1QGip/JhLH1R8ulg5tUOdNvt9Ho7d/QR1ttyO75irpgtdat/7mVtMpLtJwlOtBxm30p6623MCHfupP5NOqJ63aF8aDM7Zvu1y0XNg55Wr7Myh17sPfosmYzK16NdireX9YNKTLokW5z9hRolis7KTAQUR0fcvVCBRdYSJzcZev0UgzalH8AnJcrsvqlPeeurtl3DcbLroW3dIPYsM2frZaBWH1UbVP62s6PXPz2OFEnLcat92eYSTiM0cqoQi7YbS7xE2ZvXdhq9/LQyUds/2Ws9C6No3WIsDXcvKy/7SKuaV6U/IF1yKa9ZN6STSjqC1PfQW/Sbh4xrq0wBUUbStkmXPa0aazPnyT5TzEGp3Z/Z5GLK2+tZp4Sr+Xdnp8p35yjaqtU/UN0yZrv0OkJ1PfE4ZlGRuaT+nrJ3TeOl2qDXFdVSZ7ux+xOKZZd5ojxT303lnuj5mVzfqViYqLzlM/ihxjMmo6FB7KNZZXM5v6LdvpRjFWe98qz/NjsSkoif1h95lqNtzlyVmy1R9nUmk7jPF6X9kwDVXvVaqT9a/jzGe3rdi7puG9Sf8zpjO33iZ5id75/mKglnx6gkC5aZgzN6WKUob4bM9fi0lrlg5RL4d5lLFyInEVycgUApLX0rQVA+sG5T+BIET9BaclonuwTPrclHcF0+1sgORsm7DY8CFbBiXWoa1tAejaJcsY/FSBZBUyDFXspBlVyeEER7LALmOmitQigKtUGlrpOmG5+jddHb8xHIeslydkCbelMyNOdDrCH1G3tygnQqkaaCKjOtvVyLQF4+/NZeAACX6+BbnI2C0nwESwu1PTvyAUaiohdq4PeliX0yNCNi7O+wBwUWN7EnhsqhBMEta+EXzo7xZo72H9E+q+UHjMGRq83EeekS+POojHLhl2uTtfyEcXDFEnO9fUQZlOv8jLXEjjLrrYM/IPdTFRrrdT3L1lSqlZ39QBFrX5fmopjYrcm03kpT+ac/n4lgXj7WvJqJF6wBtp2JeM4OxaLNyulbmhB2HqSh2mLZbewZoplQ448afoq5dITetur107YCiH5SgudoGVAW1RmlvjvqpWudVgVZtijto7fGcqpJj08MekhHJta8uhbBvLXwmev9tY5RzSPZ4dEOdNvtcjHaeRpi+ghNrhpfyYhH/fMqawwfwvLnqV0UovW2R9tXxNMlDQ7kvgV6IFp9ndp3lOYifWk+Ws0H0MDuNCxaWYjiLfkoft3e20Izy4t89n6h+PWuC+WpmQjEsE/Cbg8uKuvq0nwsN/cjxvYXCgSxl8zYc0cnstE/2nsn9t1UZsJH/bM/DcvrncvS9PppxM8w+shSR79mqZMz4RSgljnt8TFOQvPXhxCqp/2HVHezxXJk7Z2vVm9UG1R5trOTzHNGmHf9JAr8aUgP5COYtQTPUb9tvSQLo+nVNPhopndZJvaIfay6zXb/5mj/FyqwMCsXAeK4Js3e16o8O+2y0vNgYRMXal71wY7Vd9OeoKwa224a1FjPJrUfMiSLgbE4RMLj9Dpivdh4zhh1g07Yo32WyT1T9D5BzY2DneLUWM8uiq6Ea89/V3aqfHeOJNu3MhdrXjXqtH3yoL0nK6lxDOikwlzxzFtTlI/l8iWgVjdVGxz5VU2lvTjJPD/d8jxGqxnMvb/+bOwbknt2HM9ZRV+yfaeVxLW8rbtmO07D8leTH8/QHjnf4jTs6VYYiT6N9l+rrd19rOKsV+71X28vXn2jnRPFFs9ytGOTvIcuN0WMW1/n/nxR7HOMB2bt7NBzj/b5OcaoWtvrrrBe9ijmzt0YRRX6E1xrzs4j6aNTHcwtNJYcOk3FelhYobEXykkZsTfjh7ieMOGaxDwdxfXeLAJdf7vBI712mowaR6m0bnmnEyycLNXkyrVbcuW2den2Gwau7DxsTlaPpTDORYxeL52zPqkOwD2vU0S8wuMY+pC3KH8xJ2s9pKz4yRLX6RjWMQKVB8JsCnk27UDqdOsj5L0En66meZa1U1hiTs4U+ndKH9sgRTnrEV2+JVnvXDOY2G7XZGSFelqPYpVnfCVOzOVsy83zdCBDcvhtZc9IjDIlwCMPSozZXSaZedFmvJ5bVOcSaI3X/l1NmKt8evSj3uaqjqd3LK87ST9TvATMRfhDs/Nol251nbh61QfKAzmU8gTDuchTIhkxeXbvJ+L2/Un3nbYxbuVt3zWv3Cr4LMYzMfKk2GTGAsnW/xh+XlrnODyeXpd7yT1fHtHGOMxGD681t4I8ig73uvkoEh827dw5Ow9rwS8yneLs/CLzz5l+cggozs6TYxRb8jQTiI4hdIFONuS/n5XAzRA6r3MpPFQZKDMqQX8mgqdm8YNkD6WQEzGBn5ZA+MRJ7bTYn1b73GtjZ2fumbJEJsAEmAATYAJM4KkmYL61Vk4Sfaqzy5ljAvOYADs787jw2HQmwASYABNgAkyACTABJsAEvAmws+PNhu8wASbABJgAE2ACTIAJMAEmMI8JsLMzjwuPTWcCTIAJMAEmwASYABNgAkzAmwA7O95s+A4TYAJMgAkwASbABJgAE2AC85jAnDs7SR1PGAfYo6aPEX17EO1D6rntMTE4wCIQwcCZQcyWVvRmCKGbP+epPg9nt5XtJ+4iitHuEEYlUnnM88PWZZn+ScvnpJFBtf6o1z+/uVGET+1H9e6TCEeBqGlvPLu8+6+HqKMPW97xDJzre142PkKde7LqwCyAebGYhQiOygSYABNgAnNPYG6dHfpxunVNGE3aThrUKYPrWadPQpH241Du8enhOnDb/d5PE2r8grlvTSEKVrr9eN/js0LP+8MdQ6z9EJWrqY5ydo2TOJD0LEhJcfyjH1Kdrd0RDHSP2Uffevx4VmKLHlcM9Why5cf+kqjLsRYp6eknIbS6HkL1i+YvhcuE9KPB8geEAUROlSB9u/lL4eYPcKo/biuTzf4zhPLUtWga038cMXFdmr2mh07RW4MXXt2PgetjiAw3YU2i39KI238lU0cd7eShyvuhc/twCV1t1OvcbAU/dB2gH6BMNX4c1edLw/KiQxiI9/soszUsUXxXFokS8X0mwASYABN43ARinR3xg3AReyAYz4I4P0hkJ7N/vEv8yBX94KJ1kwZ1NFj1+jOOdnT9QS+hW5XlkEE/0kQ/BOh8AIlw/Uc76eFafsEjvSM42a+xeaWRJtnkYjM9pMWv2ZN0+pXrfLR6Tq/oP9Lk+sNhZh5tzrbVIr4yANDzbg/InPFIglsYhccMTmIYu5ezlzy4/TCZnYXYMlWcnViZZh3SfhSyC+UrD1lOeeREPgLNJnCvMlL0Cx0Srqxnyn2rnN2OJFXz5pZWyFGdHUWwsy4rt8SPSGp5VG/a13p5u+mh+mc7QJ2lqVi4WLZRip+BfcO2vFje9r1kr9T6o167pndlZpaxLBPXhGaga3q6Z/dTVvJ4vEUksy26lTPd13TFb1uGTkc7sfS763Fjn2yYlUe6EHVehyfkuNSnmHDLRk1i7BeNhXnbLUztT1zsihWshFA/qrbrMyV4QflOMd340A8Rx/TLHrYZcSUrR7lIFl7PRS+ZbnVPyRZfMgEmwASYwKMR0Jyd6IUK+FcWorqqEMv9NQhFgdHmfKRXhhAFva1bi33XYQw2fZkIbq9BdVE2nlt3CGGyQ3nY0KAlfV0uli/LQMGJMYQO5KO4Ssan2Z8xtL6ehkUpz8JnxlHTY7IL5f5MBEprxGxH4KjQIAbWL6zMRQHpfj0Ti/Lst84SReRMIdKzjHwEli7Bgp1dxq3e/QiW1hj5e34tmm4CoycK4VucgkW+DKS/flIMgMOHc+F/tQTVpbnwBxwzVfTmW+qkN7mp5kCQfkV5WZ34EabYvALR7grTphoU7zL0SHsROYmgrwTtNN6e7EJxliHHuk8X9CCVzCnfWbkI5hk2pi8uQbv5/A0fzYWPypBs91egUzg2NNDKRKCoEMVVJQj40lDd65Z393gQZZ8hyoLqxsFuzTLd2Ylh7FLOCONgwCjbYvpsph9kMwbSa17NRvqyQrTG+402OaiwzPCyO4LWKqoHNSh+NcOsxyHsWboEC803wHu6gdEzTeiMJCgj4VClwb+lRNQf/+JMBPKoTpcgsPRZ65eGRRvy56KY2pAvF03UXlzyFreOifiKw7EzxXDGrXxH0bkzA2sajR9mjC8L6DTTx9Z1N2cHCO16CQWnqUKFUO2vwb5d2YaDI+r4fqOtu5ahVSCIni7EC7tCImD06FoskINOaj9bTor+5OBKI4+qg6Ne29LIzpew/FWqvzUoyHoWwROmcyr6iWwUUPjKTFR3R4XuRbLN08sDfy6abgNunJz9lKWzuw7pvmexYHEa0pdlIH0Z9VVmW6dy8OeioMhofz5fDURO1f7v6FqkB6iu1KCgke561VGp0aWdeOlxZU/9s7ONurUzqc/4FP2F36jH1eKHEcNoCtCsCLWZTPgru8yXUx7hHnVS1jnS4so9ho9tF5XJC/5c0VeLdruTbIiivehZ+6XU8H7RN2vvhBT+Zu6wb5kxe0gvkWL7HEC0V99ao/6IcvKwV7UpkAbfynwEqfyLsrHIb7YJYiH7aPW56MXA8Yy0CfAVE2ACTIAJzCUBxdmhN7qF9qD57QzzwRJBOSYRcQAAETZJREFUa14Ggq/nInDYcDj02RJ6CKWinAbAysNGDFoOmPE1i0mPfFNMAwB5racPv51hv22ngYL5dlkfDDnSCz0k3xjciK/Ww1gzAiRfzuaoD2ZoAzrKmz3oNCTYnMJvF6KgKFs4DsTE/7Yzv3ZeacC33JWHIXW0MRfPLc1A+vMZYsCmW2s6O9YATs23MmAl2180B17qG1Jl5oPkqgy1vHvGC6FcOmMxhuny1Ns2Y9VeiMFoumRFNouBsJEP4UyrQtyuY8pUl6/mz0pu6dHrmXWfuMQtI12Hys3WF1v3jEG3I28J65hSprCdFaPdnbQcHWF7QllKelWWSEx6SmJnVi9UQNhN7bm0S5TXmqNjwuH2mQ4MOTOxZajQtOyKon17IQq2GLOVxMpwpOw82vy86pIdV2hQyp/qmCEPADlSoo2EUO0z+xUaFNOsqWUPSbDbtdDt1S4VPYazYsrUwhXblP4vVJmG4jPqUFyvP2qebWp6HL2ftfW4s49to+7xbG2ir5Mva8xg4aRWGU6q4aQb/Z9XuGudVOuZB/dYPrZdOhtqU6bD0lsD3/Z24XyFD2Ta5S6TKvyNIGJmvChwZ0GyHf27h72aTZoepcy0eqE8F+PJ9Kp7Mk/8yQSYABNgAo9MQHF2qNPORJBmX8x/rXK5yuU6+FKUpVVapw6EG7MhBkPKQ0B7OCCKUH0u/FkZ8K/MRrq1LEZ5UFBWlPTqYFJ96OpyHekFDkeYYmu0tw6BrEykZ2Vj+TL7LaGmi2x4ca0xCyU47Bdv/VXS4bczUX4hjIN5NQj11iB4OIxQlfn22yuv98bQXpULny8TBSd0p0i8XZQDjMgg9qzM1JYKCd1KPrSBlzoLoPDT0+hMVIZa3j2dHSBy+RAKstLgW1OHkLIMjvSo8twZx+p/YZ3x1lvUtQNdiKj5UGG7XWssKEKsfGNfyRhai9aKerd8XTZ8cnbByUnqiFNGTh0qNzv/uh12fbYHqkJVwjqmx7d0Ub7JIc6Ssytmm0lQX6306iBUGEJ6lJcNkoM5OAudLjRmUMaasKaoHZ270qwXBJTn2DKUAujTdCiud6F8y0mET+Sj/MIYmgLyhYqdR5ufXpdsaXZcEaaUP+XNn2f3WdVm2wrtImcjivCBbGPWzYO5qtvWZ14perTy18IV29R6FRnEwaJM+HxrsaeXZsn0uuGuV4/j5ex4sXe2Ua94Vj5Ve81Ap12y7niFCxuddVKtZx7cEcPHskrrTyiUllKKl2lilo5mscPYt8KezbZSxuQnjIMr7NnD2Prq4E2CPOzV8q/pUWRo9cLxXHRpo5pMKxN8wQSYABNgAnNNQHF26C1XPlodA1mxh2RFPg42VyBd7iuhTr3UXBqGKFq3vGTMbigPAb0j70L5f5ZLs+gBJAdY9KBQ3iwr6enNnb2Poh3Fs5nZMZetCFjKA6hzZxr2DBkIyUFTZ3aKPzHRioGetNUD9/B+LC8qRFC8RabBHB0sIAegXnmVsgaxx5rZMsIEq0bbAeosNZctyST0qeRDHzgpg61oO4rlkhpaOnEgE8agX3kgO5wTGsxYeU9iQBY9lW/KtI1Ty9qdsV7O4i1r/aAtQFwp+RDfo3Ddq0X3NBYU4JE/qk9iyZQRp1h1dlaYSy+FLud/sWXk1CEHgZTSzr+9ZIrCo2dKjBkSpyOXsI7pLCxdZr4jp0uQLpeOJpQVO7NjlzftYZD7D1QGhqOyZl02DopleGHso2U76+wBpnsZqjKMGbwgtZPDY2IQKa5lH6IwsfmpLFVZOg+1/GlmJ3jKJQ/URrfXoXqlOdPpwUnVrWoU11o9U+qYFq7YpvRflqzJkwiKeqek1+qMFdOsx0p/6KEnEXvZRhPFo5mdYmUJLFlCddYnX7wI58Kc2fEIl2Wh1UnV2fHgbuXa4mOFGO3J6g+pLdov2oTzursOaywb7XT2ywUjjF4i+cwlZu4sqL06Xix52KvVE62clXKl8nJ7LiYjE0p/N2nv63Rvn0qe+ZIJMAEmwAQSElCcHcf65YCxbyJUlWGuj4+iszTNWDpAnbp/LQJr8hFck2av61YeAtrDQez5WGKsA9+SC/+L0tkhmUvE8i1/fUib2TH27KRhTRHtiSAbDGdAl6s8aJSs0kMu/flMBPPysebVTLxgLv+iZUrP0X6W7fkIZL1kOTvRT0rw3PP0xrxOrL1X17EHVxphinjzEIEUcxkFDQxT7CU9HnkN1dOeGWPPEi2rURe4iLwuNfnkZcIXaDL3RShatYGPmm9lsEWW0Z4dWoNPa8azasxZGDW+PqDU8+4Rb+wkCtaY+1P82dhnOoyWdbS8ZHEaxP4XV8aOcoax/t8v9hzlY/luWjaj5wPxTrbSWJAVHnZHQyhfSvsYShDcshZ+6ezQ+v0VS8y9YnZJxC0jhw7LAXEMXK09AKW5SF+aj1bhLDjyppZTVQnc6hjNTCzyGXXP0qXkO3x4LdK3NCF8TylzD1lWehrManWdTkRLw57LVklaF3RowwJlSWTnzlQssBwViuZWhlZy44IGeSnyQAN6mSLbDN1WmCj1B+q1JU6JS2EKB7ufoLaVK/YHGskiaAqo7dKdk96fWAqNC1WPWv5auGKb1f8ZM4q0P5D2vSw/QI69Rx3VVDraiZceN/aubTRxGYn+gvYrLsuA6IMV2QUrl8C/i/Zr0p8tSwtXbFTrpFrnrD7Jqp9ufGwQVCa+lblY82o+gv40yP2aIsbtJgSsOmWnEVfE39yLl06zTYEadFqnbNr2V5fKPoeeeTXw+4x9Wf4ic8+m7EMte/U+U3eqlHK9UIGFWbmxz0WP9q7VPau/U0+ys08sdOSUvzIBJsAEmMAsCGjOjpHO5WQap0DlAaceLuWM5vyezO9UxKSh08u8TjtyRta+u5yuRPeT/f0HrxN1NB3eX1zzSqfxxMyc2TJcTwqybyd/9Yi2uytKol7IhMkyTsBDinvUT+/fPnGRPCc2ESuX2Qanurksp7mU5bQz3vc54RVPQXL3RNtJArl+mlZysh82VtI2PayCGPYebTQmXqzCmH6c0rjx9AqPFamHuNTPxHxc+nCajVohZ9F1FUl982ARk38Xe5OSb0aKkUfhjyhzNvo5LhNgAkyACdgEXJwd+6bnleLseMbhG0yACTABJsAE5ohA+IRxMiftxeI/JsAEmAATYALJEng4ZydZ6RyPCTABJsAEmMBcEKDf3YkzMz4XKlgGE2ACTIAJPH0E2Nl5+sqUc8QEmAATYAJMgAkwASbABJgAAHZ2uBowASbABJgAE2ACTIAJMAEm8FQSYGfnqSxWzhQTYAJMgAkwASbABJgAE2AC7OxwHWACTIAJMAEmwASYABNgAkzgqSTAzs5TWaycKSbABJgAE2ACTIAJMAEmwATY2eE6wASYABNgAkyACTABJsAEmMBTSYCdnaeyWDlTTIAJMAEmwASYABNgAkyACbCzw3WACTABJsAEmAATYAJMgAkwgaeSADs7T2WxcqaYABNgAkyACTABJsAEmAATYGeH6wATYAJMgAkwASbABJgAE2ACTyWBeeLsTODqxWuYSLYIZibQ1/Iu6o/2J58mWdlmvOnRfvSNTidIFcfuaKK0JDpOehfNydkE4Jt+tDQ24EivN9GkZbnYwUFMgAkwASbABJgAE2ACTOBJIKA7OzNTGPn4AApzslHYMm7bN9qBirz1CGxcj5y8A+ibsm/9NFf9qM9qQF+SyibPlCFQ14WRm+OPzdkZaynSGZm2kZNw1fIhvOzuR312EVq+SZQhr/Tu6bxs0mNP4WzZBtR2jWBk3DJUjwIgOVkxyTiACTABJsAEmAATYAJMgAk8MQQ0Z2fi/AE0fnwNg83qQH4CbaUb0Dhs2Dx5vgY5+4c8MzB9ZwrTM47b01OYdAmnuJNTLjMcM9OYvKOGxw76RdqoQ4/51XWgHnW3wV2CETo9NYVJhw4Z5qrDdBLqe6VU226ZTt7RPj34AAnSizzZnFxtItka43G0vFEE1ZfVbDG/uMpyi8hhTIAJMAEmwASYABNgAkzgCSWgOTvSRm2gO9ODWnVW5ZtWFOYcwKCMLD5pUL4emyprUL+3BptzitAyakSY7G3ApgIKr8RmmhUi52FmHC2l67G5ugG1ZUFs2tuPSYre24DMV4Ko2NWA+uqtWLWtFWPCcbIH/UbaIHbUNaC2OIjtbcoMFC38+qgSgZxsvJyzAYGN7wo7x06VIIdsqCvDprwGc2ZKkQmgrz4LhpNC4UFsr65B7d7d2P7KeuwzfburR7ciULwb9XWV2LzeMftl6s5ZlYWX129A4M3TmBDOipss2+GYvtSAwGuVqN/bgNp3uhwzUd62jLWUYFMZ2VKCTaWnMeaYjaEyXJVXggriVLYBgXpiPIG2NzdgVXY2Vm3YgEDjkD6DM96KwjdaY2RpRc1fmAATYAJMgAkwASbABJjAPCGQ2NlRBsBGnnQnwS1s+nwNXt7bD2AERzbWoNOcHRl5b4NwKOj+Kmt2yB74C2enntLR3zQ6q7NRf4mubZ2UNvDeiBEl2oUqc3BuBBj/a84axSHnzJxtsu/ZMimV7uzYS+as+J5yVM2qHArXdViyYOd54lQRCpvN/OiivNOTLRvfh5GKOBkzNbZ85zI0Kge5bM7WTerUNFDKWguPsYsDmAATYAJMgAkwASbABJjAk08gsbNDA2t1ZudOB3a4zuzYDgJGj2HztlZrZmPH3gYxc0GzF2dvOAbYqqNBMzuWswOMHd+KwlO0r8R2GmgQvmrbbktefbM5K6Sw1gbqygBeRLF02DIpPKGz45Cj6VB023IoUNdhp1EcjplxdO8vQc76IKrO6LNUnunJlpwi1Fpcj6Hvjs7V1mUY110rHUdFNzs7SsnxJRNgAkyACTABJsAEmMDTRiCxsyNmIYI4csPIOu3ZeXlXF+ydIhROg/rd6DZnTyY/rsSqd2jtF80oVOKs40CD6S51388Imjebe0jIEantMRlP4WzlanMJme00iJmdg9filoM20Cdn7RV7ZmekOWgeLKDbbDspti5SYslyyLHCHZaQHCsLyTg7Mv3MNTRuVBxGER7Hlo3v4qpjb5RqE11vPm46T0J2Gc7eIaGxzo4VT3HoVFnSRP5kAkyACTABJsAEmAATYALziUASzg6A0VZsXx/EjvIi5ORV4qxzAkIM6oMoLC0y48h9MYDYs7O+CFV7G1BVXIk2OoHM3LOzqXw3qgpWY/M7Q/aenbwibH+jDDu2rbf38mACZ8uysar8NCaUtLQHZ3Nj7GEJzoG62LOTV4Za2gf02gEMCueLnKlsBMp2o6q8TOxrsffs2E6HKovkrMopwo7KIuzYJp0mvbinL+7GKtovtPl9DCbh7Ay+R3t6jD1Km6rd9ux425JDedq7GzsKjL1JGDqAnFXr0ThgOGmrXitBYWkZduStx/ZTstB0ZwfD7yJn1VZU1VViR12ltWdHlaXnkL8xASbABJgAE2ACTIAJMIH5QcDV2XE1PeaENDWWMgMxrc/5iFgircspbXSamBrdWmIGuIlRNYLSOk5K0+47v5AN2qlkRoRp7dQ3ZyKX7zPTsafNuUSbVdBs8yKFxykTy0lLxl46sU0tBymfP5kAE2ACTIAJMAEmwASYwDwmkLyzEzeTirMTN16Cm4qzkyAm305AwHJ2EsTj20yACTABJsAEmAATYAJM4GklMEfOztOKh/PFBJgAE2ACTIAJMAEmwASYwHwlwM7OfC05tpsJMAEmwASYABNgAkyACTCBuATY2YmLh28yASbABJgAE2ACTIAJMAEmMF8JsLMzX0uO7WYCTIAJMAEmwASYABNgAkwgLgF2duLi4ZtMgAkwASbABJgAE2ACTIAJzFcC7OzM15Jju5kAE2ACTIAJMAEmwASYABOIS+D/B1bf8qJmZHELAAAAAElFTkSuQmCC)_____no_output_____

<code>
## download pretrained models
classifier = pipeline('sentiment-analysis')_____no_output_____## here are three positive comments and three negative comments
comment_stars_5 = [
                   r'Wonderful! Comes exactly as pictured in the listing in a plastic case, the cookies also have a plastic insert to stop them from being crushed. Excellent for lunches and take along snacks! I purchased these May 12, 2017 and they expire December 2017, perfect for our needs.',
                   r"You know when you're just having a bad day and you need a little pick me up, but you don't want to be a tubby tub? I love these individually wrapped Milanos because I can commit to two at a time. Yes yes, I sometimes have four...but at the end of the day, as a forever alone kind of guy...these work because they won't go stale.",
                   r"My mom has been eating Dark Chocolate Milano cookies for years. I purchased one package for her house and one for ours! I love that these are individually wrapped with 2 cookies per package. The plastic tub is awesome for keeping them fresh."
                   ]

comment_stars_1 = [
                   r'Oh my word, can we say disappointing? These cookies are individually wrapped, 2 cookies per pack. I was thinking they’d be fresh & delicious as when you buy them in the bag. NO. These are not even Milano’s. They are SO dry and full of air they seriously taste awful. They’re like a dried, flavorless old dehydrated marshmallow. And there’s also very very little chocolate. And the cookie is a lot whiter than normal. I’d love a refund or replacement. I threw the whole box out after trying a few packs.',
                   r"These used to be a pretty good value until the price went up. At 6.99, it's a bit overpriced for what you get.",
                   r'I would never have purchased these had I know the expiration date would be dec 2018 (its mid October now). Last time I bought these at a bulk store in the summer, the expiration date was 8 months later. That’s more like it! We will never finish these cookies by December...'
                   ]

## show prediction by our model
for comment in comment_stars_5:
  result = classifier(comment)
  print('five star comments are predicted to be:', result)

for comment in comment_stars_1:
  result = classifier(comment)
  print('one star comments are predicted to be:', result)
  _____no_output_____
</code>

#Summerization
## -- extracting the main contents_____no_output_____

<code>
## download pretrained summarization models
summarizer = pipeline("summarization")
_____no_output_____content = r"Reading others reviews, I could tell some buyers were not familiar with Milano Cookies. Some complaints were that there wasn’t enough chocolate... \
that is the way they make them, on purpose! Some complained that the ‘use by date’ was only 3 months. That is standard, that is NOT stale! Some reviews thought the cookies were not crisp enough. \
Milano is a thin short bread cookie. Each bag contains 3 layers with 4 cookies on each layer. That is 12 cookies per bag OR a total of 36 cookies for $8 plus and free shipping. \
My delivery was free next day delivery. Glad to say only about 10-12 % of the cookies had broken in half. No chocolate melted outside of the cookie. \
My Milano bags shipped from Ft Myers, Florida to Port Charlotte, Florida in 97’ weather that felt like 110’ or more! \
Maybe the condition becomes more melted and broken the further they travel! Am enjoying my Milano cookies so much!!"
result = summarizer(content,min_length=50, max_length=200)
print(result)_____no_output_____
</code>

# Text generation
give some context to the generator, it will generate the rest of that sentence_____no_output_____

<code>
generator = pipeline("text-generation")_____no_output_____your_context = 'I am super man '
for i in range(1,4):
  result = generator(your_context)
  print()
  print(f"sentence{i}:")
  print(result[0]['generated_text'])_____no_output_____
</code>