Build a text notebook with independent state for each instance. Inputs are strings; empty strings and duplicates are valid.
Prototype: implement Note(text) with a public text attribute and preview(limit). For a nonnegative integer limit, return the first limit characters of the text. Note("hello").preview(3) -> "hel".
Final: implement Notebook() with methods add(text), all_notes(), and find(term). add appends a string and returns None. all_notes returns a fresh list of every note. find returns a fresh list of notes containing the case-sensitive substring term, preserving insertion order and duplicates. An empty term matches every note. Modifying a returned list must not affect the notebook. Separate notebooks must not share storage. No file persistence is needed.
Complete the starter code, then run the checks.
Results and errors will appear here.