<div dir="ltr">If someone knows a browser testing package that will traverse a collection of pages, let me know.<div><br></div><div>Maybe puppeteer or CEFpython? We were talking about using python. I just got CEFpython working the other day for our RPG product.</div><div><br>Will be very helpful!</div><div><br></div><div>John</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Apr 20, 2020 at 6:57 AM John Carlson <<a href="mailto:yottzumm@gmail.com">yottzumm@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">One can get a snapshot out of chrome --headless, or perhaps use puppeteer, but I'm not pursuing that until I have an X_ITE SAI HelloWorld file example that passes through the browser in normal mode.<div><br></div><div>I spent the last couple of days polishing up X3DJSONLD and pythonSAI.</div><div><br></div><div>John</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Apr 20, 2020 at 6:48 AM John Carlson <<a href="mailto:yottzumm@gmail.com" target="_blank">yottzumm@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">what I do plan on doing is generating an XHTML package around my VRMLScript. Then I will go headless if necessary--But I'm not clear at all how to get data out of chrome --headless (docs seem to be wrong). There was a previous email, not sure.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Apr 20, 2020 at 6:44 AM John Carlson <<a href="mailto:yottzumm@gmail.com" target="_blank">yottzumm@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">I did not "go with" headless chrome. Node.js yes. That's different from headless chrome. Chrome is a full browser environment. I currently am using your suggestion of pasting VRMLScript into the headed browser.<div><div><br></div><div>I am supporting Nashorn, Node.js, Python, Java on server side, XML, JSON, EXI, PLY (not done) and STL (not done), and soon (hopefully, still thinking of how I want to handle MF nodes), VRMLScript.</div></div><div><br></div><div>Thanks for the link on tessellation, I will look into it. By chance is there a JavaScript tessellator?</div><div><br></div><div>John</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Apr 19, 2020 at 8:15 PM Andreas Plesch <<a href="mailto:andreasplesch@gmail.com" target="_blank">andreasplesch@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Thanks for the response, see below for more.<br>
<br>
On Sun, Apr 19, 2020 at 7:29 PM Don Brutzman <<a href="mailto:brutzman@nps.edu" target="_blank">brutzman@nps.edu</a>> wrote:<br>
><br>
> cooler and cooler!<br>
><br>
> On 4/19/2020 1:54 PM, Andreas Plesch wrote:<br>
> > I am happy to report that the core OCCT vrml writer works fine with<br>
> > pythonocc. It generates more optimized vrml than the pythonocc x3d<br>
> > exporter.<br>
><br>
> obvious statement: if the vrml exporter works well, it might be a simple variation to copy/refactor the output-producing sections of that code to output XML instead of WRL.<br>
><br>
> ... reading on ...<br>
><br>
> > I updated <a href="https://github.com/andreasplesch/OCCToX3D" rel="noreferrer" target="_blank">https://github.com/andreasplesch/OCCToX3D</a> with example vrml<br>
> > output, and used tovrmlx3d to convert to xml which is also available<br>
> > in the repo.<br>
><br>
> very pretty outputs. is it using LineProperties to give colored borders along mesh edges?<br>
<br>
There is an option to generate wireframe output in addition to what<br>
they call shaded shape output. The edges are IndexedLineSets but the<br>
Appearance does not have a LineProperties. This is something which<br>
x3d.py could presumably do in postprocessing.<br>
<br>
Another goal would be to add better Metadata since it should be<br>
possible to get those - probably prettyy easily - with pythonocc from<br>
the original source.<br>
<br>
> > I could add tovrmlx3d to the docker image, and then call it from<br>
> > python. Are there other options to convert from vrml2 to xml x3d,<br>
> > using python ? x_ite could do it but requires a browser.<br>
><br>
> i suspect that Holger knows how to run x_ite headless without a browser.<br>
<br>
John went with headless chrome which is an option but it seems heavier<br>
than using castle tovrmlx3d.<br>
<br>
><br>
> > Enhancing c++ OCCT itself with a x3d writer, parallel to the vrml<br>
> > writer is in principle possible but pretty daunting.<br>
><br>
> this is what i was trying to express above... don't rewrite the whole functionality, just look for output-producing code and put a selector on those code blocks for one X3D encoding or another - .wrl for VRML97, .x3dv for ClassicVRML (differs only in header line), then .x3d for XML.<br>
<br>
Yes but even with this strategy in mind it seems a major effort:<br>
<br>
mostly in:<br>
<a href="http://git.dev.opencascade.org/gitweb/?p=occt.git;a=tree;f=src/Vrml;h=d24d7db215fb0c4f26ac73af52fe68735bf8adee;hb=master" rel="noreferrer" target="_blank">http://git.dev.opencascade.org/gitweb/?p=occt.git;a=tree;f=src/Vrml;h=d24d7db215fb0c4f26ac73af52fe68735bf8adee;hb=master</a><br>
<br>
but also in:<br>
<a href="http://git.dev.opencascade.org/gitweb/?p=occt.git;a=tree;f=src/VrmlAPI;h=bacc62597d161a9cb978386b13cb8ba8f072d6e4;hb=master" rel="noreferrer" target="_blank">http://git.dev.opencascade.org/gitweb/?p=occt.git;a=tree;f=src/VrmlAPI;h=bacc62597d161a9cb978386b13cb8ba8f072d6e4;hb=master</a><br>
<a href="http://git.dev.opencascade.org/gitweb/?p=occt.git;a=tree;f=src/VrmlConverter;h=79507809ac27c8b4ed3674ede2c3198b06b352e1;hb=master%5C" rel="noreferrer" target="_blank">http://git.dev.opencascade.org/gitweb/?p=occt.git;a=tree;f=src/VrmlConverter;h=79507809ac27c8b4ed3674ede2c3198b06b352e1;hb=master\</a><br>
<a href="http://git.dev.opencascade.org/gitweb/?p=occt.git;a=tree;f=src/VrmlData;h=18683ffff1dac6a17cd9eef9a3e37b25e642e50b;hb=master" rel="noreferrer" target="_blank">http://git.dev.opencascade.org/gitweb/?p=occt.git;a=tree;f=src/VrmlData;h=18683ffff1dac6a17cd9eef9a3e37b25e642e50b;hb=master</a><br>
<br>
This would make x3d available to all OCCT users.<br>
<br>
Another option is to improve x3d generation by pythonocc:<br>
<br>
<a href="https://github.com/tpaviot/pythonocc-core/blob/master/src/Display/WebGl/x3dom_renderer.py" rel="noreferrer" target="_blank">https://github.com/tpaviot/pythonocc-core/blob/master/src/Display/WebGl/x3dom_renderer.py</a><br>
which uses<br>
<a href="https://github.com/tpaviot/pythonocc-core/blob/master/src/Tesselator/ShapeTesselator.cpp#L427" rel="noreferrer" target="_blank">https://github.com/tpaviot/pythonocc-core/blob/master/src/Tesselator/ShapeTesselator.cpp#L427</a><br>
<br>
> > The pythonocc generated vrml and x3d does not include a nice default<br>
> > viewpoint. If x3d.py would have a createX3DfromString() method, it may<br>
> > be possible to add a viewpoint and then create xml with toXML.<br>
><br>
> somebody with better python skills than me should write that parser. shouldn't be hard for a python guru since all of the X3D nodes have Python classes with essentially the same name.<br>
<br>
Yes, I think that would make x3d.py a lot more useful. In addition a<br>
createVRMLfromString() would help with legacy content, and conversion.<br>
x_ite has good parsers in js which could serve as a template for<br>
python parsers. titanias parsers are probably similar.<br>
<br>
> > John suggested to use the stylesheet to convert from xml to Python<br>
> > code. Saxon is probably the only processor which can handle the<br>
> > stylesheet ? There is saxon-c/he which is free and has apparently a<br>
> > python wrapper: <a href="https://www.saxonica.com/saxon-c/doc/html/saxonc.html" rel="noreferrer" target="_blank">https://www.saxonica.com/saxon-c/doc/html/saxonc.html</a><br>
><br>
> I'm using Saxon Home Edition jar in all of the ant files for builds and regression testing. Also embedded in X3DJSAIL. Even checked in to help builders avoid versionitis.<br>
><br>
> Better to find and use a Python package for XSLT 2 (not 1).<br>
<br>
Agree but there seem to be no native Python packages for XSLT 2. The<br>
Python recommendation seems to be to use saxon he. In addition to the<br>
java version, there is the c version which has an official Python<br>
wrapper. Do you want to give it a quick try ?<br>
<br>
> We would not want to hardwire such a package into x3d.py since it might collide with other uses. am trying to fit x3d.py well in the python ecology.<br>
><br>
> meanwhile I believe there is a python incantation to check at run time and load such-and-such a package (if necessary) if a specialty method gets invoked. we might also create a x3d-tools.py package for simplfying addition of commonly used packages (such as XSLT or even pythonocc).<br>
<br>
pythonocc is big, since it depends on c++ occ.<br>
<br>
There is a pip package:<br>
<a href="https://pypi.org/project/pythonocc-core/#description" rel="noreferrer" target="_blank">https://pypi.org/project/pythonocc-core/#description</a><br>
but it has not been updated to 7.4.0, the current version.<br>
<br>
But there is also a conda package<br>
<a href="https://anaconda.org/pythonocc/pythonocc-core" rel="noreferrer" target="_blank">https://anaconda.org/pythonocc/pythonocc-core</a><br>
which is uptodate. Hm, I wonder why this is not used for the binderhub<br>
pythonocc docker image. It is compiled from scratch in the Dockerfile,<br>
instead. Perhaps the package does not work well.<br>
<br>
> > Did anybody try saxon-c/he with the python api ? It may work.<br>
> ><br>
> > If that is succesful, it would be probably possible to eval the<br>
> > resulting python code in python and get a x3d document/object. This<br>
> > could then be manipulated with x3d.py.<br>
><br>
> with enough coercion many things can be forced to work... but cross-language solutions are notoriously difficult to port and maintain. also worth noting is that 'eval()' opens up an endless security hole, usually frowned upon...<br>
<br>
I do not think there would a lot of coercion sicne there is an<br>
official Python API for saxon.<br>
<br>
><br>
> don't want to sound discouraging! a build workflow can work even if cross-language. so those might establish initial capability, but we are likely best served by seeking general Pythonic solutions when possible/practical and then folding them into x3d.py itself.<br>
<br>
I agree, this should stay Python as much as possible.<br>
<br>
Cheers, -Andreas<br>
<br>
> > So think the plan would be for now:<br>
> ><br>
> > - create a Dockerfile which includes also view3dscene for tovrmlx3d<br>
> > - try Jupyter viola and/or appmode, there is an example with upload of a file<br>
> > - use binder to host for now, get a viable service<br>
> > - try saxon-c/he python api, by installing in dockerfile and then<br>
> > trying it in Jupyter.<br>
> ><br>
> > -Andreas<br>
><br>
> good luck out there! 8)<br>
><br>
><br>
> > On Sun, Apr 19, 2020 at 12:35 PM Andreas Plesch <<a href="mailto:andreasplesch@gmail.com" target="_blank">andreasplesch@gmail.com</a>> wrote:<br>
> >><br>
> >> OpenCascade is the only realistic, open-source option to digest step<br>
> >> format. It is a c++ library, so there is a need for backend/server<br>
> >> side processing. The easiest option for that is docker and there is a<br>
> >> preconfigured, working docker image with both, a working OpenCascade<br>
> >> installation, and the pythonocc wrapper which also adds some<br>
> >> functionality such as x3d export. Also, python is faster to iterate<br>
> >> than c++, and jupyter gets you even more convenience.<br>
> >><br>
> >> I added a small example jupyter notebook which work on top of<br>
> >> <a href="https://mybinder.org/v2/gh/tpaviot/pythonocc-binderhub/master" rel="noreferrer" target="_blank">https://mybinder.org/v2/gh/tpaviot/pythonocc-binderhub/master</a> to<br>
> >> <a href="https://github.com/andreasplesch/OCCToX3D" rel="noreferrer" target="_blank">https://github.com/andreasplesch/OCCToX3D</a>, and an example x3d<br>
> >> conversion as proof of concept.<br>
> >><br>
> >> I also discovered that OpenCascade supports generally compilation to<br>
> >> wasm using emscripten. So longer term it may be possible to compile<br>
> >> the OCC libraries required for loading, triangulation and exporting<br>
> >> (to VRML) to wasm/ecmascript, and get a completely client based<br>
> >> solution. However, the content typically is large and complex, and<br>
> >> there is a lot of computation involved. So in practice it may not work<br>
> >> out. A main advantage would be that users would not have to trust a<br>
> >> remote server with their valuable content.<br>
> >><br>
> >> I think next I will try for a bit if is feasible to use the OCC VRML<br>
> >> writer, rather than the relatively simple pythonocc x3d exporter. The<br>
> >> python wrapper seems to exist but I do not think there is an example.<br>
> >><br>
> >> -Andreas<br>
> >><br>
> >> On Sat, Apr 18, 2020 at 9:47 PM John Carlson <<a href="mailto:yottzumm@gmail.com" target="_blank">yottzumm@gmail.com</a>> wrote:<br>
> >>><br>
> >>> X3DJSAIL has <a href="http://www.web3d.org/x3d/stylesheets/java/src/org/web3d/x3d/jsail/X3DLoaderDOM.java" rel="noreferrer" target="_blank">www.web3d.org/x3d/stylesheets/java/src/org/web3d/x3d/jsail/X3DLoaderDOM.java</a> which supports DOM scenegraphs.<br>
> >>><br>
> >>> Examples of usage are here:<br>
> >>><br>
> >>> <a href="http://www.web3d.org/x3d/stylesheets/java/nashorn/examples/Json.js" rel="noreferrer" target="_blank">www.web3d.org/x3d/stylesheets/java/nashorn/examples/Json.js</a><br>
> >>> <a href="http://www.web3d.org/x3d/stylesheets/java/nashorn/examples/Nashorn.js" rel="noreferrer" target="_blank">www.web3d.org/x3d/stylesheets/java/nashorn/examples/Nashorn.js</a><br>
> >>> <a href="http://www.web3d.org/x3d/stylesheets/java/nashorn/examples/X3d.js" rel="noreferrer" target="_blank">www.web3d.org/x3d/stylesheets/java/nashorn/examples/X3d.js</a><br>
> >>><br>
> >>> Basically, the examples parse JSON into a document using X3DJSONLD.java then convert DOM into a X3DJSAIL scenegraph.<br>
> >>><br>
> >>> So to answer your createX3DFromString() question, if you start with JSON, I think you could get a X3DJSAIL scenegraph from a JSON string using the X3DJSAIL-like python API (the one we got to work with Jupyter).<br>
> >>><br>
> >>> Otherwise, you probably have to wait for enhancements to x3d.py. It looks like toXML is supported in x3d.py currently. One could use a stylesheet X3dToPython.xslt to convert XML to Python.<br>
> >>><br>
> >>> So one could use the stylesheet in a web program (GL with that!) to output python. Then you would have to use something like eval (ugh!).<br>
> >>><br>
> >>> John<br>
> >>><br>
> >>><br>
> >>><br>
> >>><br>
> >>> On Sat, Apr 18, 2020 at 5:20 PM Andreas Plesch <<a href="mailto:andreasplesch@gmail.com" target="_blank">andreasplesch@gmail.com</a>> wrote:<br>
> >>>><br>
> >>>> Thanks for the interest. I initialized a project at<br>
> >>>><br>
> >>>> <a href="https://github.com/andreasplesch/OCCToX3D" rel="noreferrer" target="_blank">https://github.com/andreasplesch/OCCToX3D</a><br>
> >>>><br>
> >>>> The wiki has some collected info and a short outline. The wiki is<br>
> >>>> editable by anyone.<br>
> >>>><br>
> >>>> pythonocc has a method to generate X3D xml. It is a simple Shape with<br>
> >>>> a TriangleSet, nothing sophisticated. If x3d.py would have a<br>
> >>>> createX3DFromString() function, it would be possible to use x3d.py to<br>
> >>>> enhance the generated X3D. But I do not think x3d.py has that. But<br>
> >>>> x3d.py may come in handy in other ways.<br>
> >>>><br>
> >>>> The first goal is to add a simple jupyter notebook to the repo based<br>
> >>>> on the available pythonocc docker image which demonstrate how to load<br>
> >>>> step and output X3D.<br>
> >>>><br>
> >>>> Any feedback or ideas welcome, using Issues on the project or here,<br>
> >>>><br>
> >>>> -Andreas<br>
> >>>><br>
> >>>><br>
> >>>><br>
> >>>><br>
> >>>> On Sat, Apr 18, 2020 at 1:27 PM Don Brutzman <<a href="mailto:brutzman@nps.edu" target="_blank">brutzman@nps.edu</a>> wrote:<br>
> >>>>><br>
> >>>>> Hi Andreas, sounds like a great idea to me. Here are some peripheral points of support.<br>
> >>>>><br>
> >>>>> Last weekend i updated and deployed the x3d.py package (sometimes called X3DPSAIL) at<br>
> >>>>><br>
> >>>>> [1] Python Package Index (PyPi) x3d 0.0.25<br>
> >>>>> Package support for Extensible 3D (X3D) Graphics International Standard (IS)<br>
> >>>>> <a href="https://pypi.org/project/x3d/" rel="noreferrer" target="_blank">https://pypi.org/project/x3d/</a><br>
> >>>>><br>
> >>>>> [2] Python X3D Package x3d.py,X3D Python Scene Access Interface Library (X3DPSAIL)<br>
> >>>>> <a href="https://www.web3d.org/x3d/stylesheets/python/python.html" rel="noreferrer" target="_blank">https://www.web3d.org/x3d/stylesheets/python/python.html</a><br>
> >>>>><br>
> >>>>> "The x3d.py Python X3D Package supports programmers with Python interfaces and objects for standards-based X3D programming, all as open source.<br>
> >>>>> The presentation *Python X3D Package Implementation* provides an overview and shows examples."<br>
> >>>>><br>
> >>>>> [2.1] Python X3D Package Implementation<br>
> >>>>> <a href="https://www.web3d.org/x3d/stylesheets/python/documents/PythonX3dPackageImplementation.pdf" rel="noreferrer" target="_blank">https://www.web3d.org/x3d/stylesheets/python/documents/PythonX3dPackageImplementation.pdf</a><br>
> >>>>><br>
> >>>>> So you would use this library for model creation and data-driven improvement, no need to reinvent X3D data structures or methods.<br>
> >>>>><br>
> >>>>> This is autogenerated from X3DUOM so it will always stay in sync with latest/greatest X3D4.<br>
> >>>>><br>
> >>>>> We've done some preliminary work with Jupyter notebook, listed there. Lots of potential projects in TODO section.<br>
> >>>>><br>
> >>>>> [2.2] X3DPSAIL: Jupyter notebook, TODO<br>
> >>>>> <a href="https://www.web3d.org/x3d/stylesheets/python/python.html#Jupyter" rel="noreferrer" target="_blank">https://www.web3d.org/x3d/stylesheets/python/python.html#Jupyter</a><br>
> >>>>> <a href="https://www.web3d.org/x3d/stylesheets/python/python.html#TODO" rel="noreferrer" target="_blank">https://www.web3d.org/x3d/stylesheets/python/python.html#TODO</a><br>
> >>>>><br>
> >>>>> For pythonocc conversion efforts, will be happy to ensure that<br>
> >>>>> a. all improvements to API are applied,<br>
> >>>>> b. ensure that validation of all scene-graph inputs remains rigorous,<br>
> >>>>> b. utility methods are added for easy use together,<br>
> >>>>> d. examplar conversion models are properly saved in X3D Examples Archive,<br>
> >>>>> e. Whatever else!<br>
> >>>>><br>
> >>>>> Looks like there is vast potential here. Hoping folks start picking it up and applying capabilities.<br>
> >>>>><br>
> >>>>> Have fun with X3D Python! 8)<br>
> >>>>><br>
> >>>>><br>
> >>>>> On 4/17/2020 5:15 PM, Andreas Plesch wrote:<br>
> >>>>>> Did somebody put together an x3d converter based on pythonocc ?<br>
> >>>>>><br>
> >>>>>> Here is an example:<br>
> >>>>>><br>
> >>>>>> <a href="https://senties-martinelli.com/software/cad-viewer" rel="noreferrer" target="_blank">https://senties-martinelli.com/software/cad-viewer</a><br>
> >>>>>><br>
> >>>>>> It could convert step, stp, igs, iges, obj and stl formats. Format<br>
> >>>>>> import and export is only a small subset of pythonocc<br>
> >>>>>> (<a href="https://github.com/tpaviot/pythonocc-core" rel="noreferrer" target="_blank">https://github.com/tpaviot/pythonocc-core</a>) but I think just making<br>
> >>>>>> this functionality easy to use with a dedicated converter could be<br>
> >>>>>> really valuable.<br>
> >>>>>><br>
> >>>>>> In the end, I think a web service just for conversion would be most useful.<br>
> >>>>>><br>
> >>>>>> I played with the Jupyter notebook and could generate with only a few lines x3d.<br>
> >>>>>><br>
> >>>>>> And there are ways to generate a standalone webapp from a notebook:<br>
> >>>>>> <a href="https://discourse.jupyter.org/t/how-to-transform-a-jupyter-notebook-into-a-webapp/758/6" rel="noreferrer" target="_blank">https://discourse.jupyter.org/t/how-to-transform-a-jupyter-notebook-into-a-webapp/758/6</a><br>
> >>>>>><br>
> >>>>>> That could be quick way to offer a web service.<br>
> >>>>>><br>
> >>>>>> Have there been attempts of this kind ? Would there be interest in a<br>
> >>>>>> open source github hosted project ?<br>
> >>>>>><br>
> >>>>>> -Andreas<br>
> >>>>><br>
> >>>>> all the best, Don<br>
> >>>>> --<br>
> >>>>> Don Brutzman Naval Postgraduate School, Code USW/Br <a href="mailto:brutzman@nps.edu" target="_blank">brutzman@nps.edu</a><br>
> >>>>> Watkins 270, MOVES Institute, Monterey CA 93943-5000 USA +1.831.656.2149<br>
> >>>>> X3D graphics, virtual worlds, navy robotics <a href="http://faculty.nps.edu/brutzman" rel="noreferrer" target="_blank">http://faculty.nps.edu/brutzman</a><br>
> >>>><br>
> >>>><br>
> >>>><br>
> >>>> --<br>
> >>>> Andreas Plesch<br>
> >>>> Waltham, MA 02453<br>
> >>>><br>
> >>>> _______________________________________________<br>
> >>>> x3d-public mailing list<br>
> >>>> <a href="mailto:x3d-public@web3d.org" target="_blank">x3d-public@web3d.org</a><br>
> >>>> <a href="http://web3d.org/mailman/listinfo/x3d-public_web3d.org" rel="noreferrer" target="_blank">http://web3d.org/mailman/listinfo/x3d-public_web3d.org</a><br>
> >><br>
> >><br>
> >><br>
> >> --<br>
> >> Andreas Plesch<br>
> >> Waltham, MA 02453<br>
> ><br>
> ><br>
> ><br>
> > --<br>
> > Andreas Plesch<br>
> > Waltham, MA 02453<br>
> ><br>
><br>
> all the best, Don<br>
> --<br>
> Don Brutzman Naval Postgraduate School, Code USW/Br <a href="mailto:brutzman@nps.edu" target="_blank">brutzman@nps.edu</a><br>
> Watkins 270, MOVES Institute, Monterey CA 93943-5000 USA +1.831.656.2149<br>
> X3D graphics, virtual worlds, navy robotics <a href="http://faculty.nps.edu/brutzman" rel="noreferrer" target="_blank">http://faculty.nps.edu/brutzman</a><br>
<br>
<br>
<br>
-- <br>
Andreas Plesch<br>
Waltham, MA 02453<br>
</blockquote></div>
</blockquote></div>
</blockquote></div>
</blockquote></div>