Remote work. Distance learning. Virtual events. These terms are becoming more commonplace as quarantines and stayathome orders continue and folks practice social distancing. While brainstorming how best to contribute to our customers around the world during these unusual times, we’ve generated a ton of data resources, analytics, free access to technology and much more.
However, these resources were still missing a deeper level of collaboration and interaction—the simple power of people coming together to connect, work and learn. With that in mind, here are some more grouporiented offerings to help keep you connected and in touch with one another, even in the new landscape of an almost entirely virtual world.
Starting on Monday, April 6 and taking place every weekday, we will be running hourlong events that we’re calling “Wolfram Study Groups.” Each session will include short lesson videos from the interactive course An Elementary Introduction to the Wolfram Language, based on Stephen Wolfram’s book, with experts on hand to explain concepts in more depth. We plan to include multiparadigm data science and other application topics too. The last 30 minutes of each session will be reserved for additional questions, commentary and group discussions—a great chance to learn from our incredible staff and other Wolfram users!
Sessions are currently scheduled for noon EDT (4pm GMT) Monday through Friday, and will run through May 1. Sign up in advance to reserve your seat, or jump right in to any session.
For those who participate in the Study Groups, a certificate of completion will be awarded for passing autograded online quizzes. For those who prefer more independent activities, we have a broad selection of selfpaced learning resources at Wolfram U. Many courses will soon include topic certifications, so you can demonstrate your skills in a variety of subjects. These certificates make great supplementary additions to any résumé, college application or professional profile to show your Wolfram Language prowess.
You can also connect and collaborate with our staff and our user base around the globe on the Wolfram YouTube and Twitch channels, where we’ve hosted a growing number of data explorations and livecoding sessions. For a chance to interact with our CEO, head to Stephen Wolfram’s Twitch channel, where Stephen holds frequent Q&A sessions, topic explorations and language design meetings.
People of all backgrounds have also added their computations to Wolfram Community. You can follow the latest coronavirusrelated computations at our community hub.
Wolfram Research is dedicated to making highquality content and interaction available to everyone. Although live events will likely transition to virtual events in the coming weeks, we’re doing everything we can to prevent cancellations. In the meantime, stay tuned for updates—and keep exercising your computational curiosity!
]]>With many schools transitioning to remote learning for the remainder of the school year, educators face the challenge of maintaining the same quality of education as inperson lessons. Here’s a collection of the resources offered by Wolfram Research and others to help educators in an e‑learning environment.
These resources are aimed at parents and educators of students of ages 10–18 years with little to no knowledge of coding or the Wolfram Language. Whether you teach art, geography, English, mathematics or science, there’s something here to get started in applying computational thinking to enable greater engagement with your students and enrich your curriculum aims.
Computational Thinking Problem on Modeling »A 10hour, teacherled, problemsolving activity for students to learn how to create and validate a mathematical model of a cyclist’s race. 
ComputerBased Maths »A sample of selfstudy resources temporarily made freely available for students to learn problem solving with computation. Try the examples here » 

Wolfram Programming Lab »Start using the Wolfram Language in your browser using failsafe, friendly, guided Explorations. Examples: Text Analysis of the Gettysburg Address  Flower Polar Plots  City Tours 
(Find, Use, Share Education) »The State of Victoria’s Department of Education and Training resources and lessons for teachers. A wealth of resources for teaching mathematics using the Wolfram Language. Examples: Measurement and Shape: Class Notebook  Sequences and Series  Algebra 

Virtual Labs »Make education more lively and engaging. Virtual Labs are open educational resources (OER) designed to encourage student curiosity by allowing students to test ideas with immediate feedback in a programmatic environment. Examples: Ibuprofen Doses  HighSchoolChemistry: Chemical Reactions  CollegeThermal Library 
WolframAlpha Course Assistant Apps »Available on Android and iOS, a range of apps to give students a competitive edge in their school courses. 

Raspberry Pi Wolfram Language Projects »Ten mini selfguided projects, originally aimed at Raspberry Pi users but equally applicable to other platforms. Examples: Which Harry Potter Character Do You Look Like?  Crossword Solver  Face Swap 
Generate Ideas for Projects to Create »Generate an idea with supportive links to help you to develop and deploy useful applications in minutes. See more Hackathon resources here » 

Wolfram Challenges »Tackle short coding challenges, test them and compare your solutions to others. Examples: How Many Basketball Scores?  Find the Average Elevation on a Line of Latitude  Fizz Buzz Sequence  Delete Duplicate Characters in a String 
Wolfram Demonstrations Project »Thousands of interactive Demonstrations implemented in the Wolfram Language with source code available. Examples: Common Core  Statistics  Mathematics  Science  Geography  Art and Design 

Introduction to Calculus »A comprehensive introduction to fundamental concepts in calculus, including video lessons and interactive notebooks 
Introduction to Image Processing »Learn cuttingedge image processing techniques along with practical applications using the Wolfram Language. 

Introduction to Data Science »Learn to chart a path from questions to actionable insights using modern analytical techniques, computation and a flexible, integrated project workflow. 
Code Cards »Budding artists can access and use the source code that created the graphics on the Wolfram playing cards. 

Wolfram Problem Generator »Unlimited AIgenerated practice problems and answers for mathematics at any level. Examples: Calculus Problems  Statistics Problems 
Student Projects from the Wolfram High School Summer Camp »Computational thinking essays and projects from the intensive twoweek program designed to advance highschool students’ programming and problemsolving skills. 
It’s easy to get started with the Wolfram Language and access its builtin knowledge of the world.
First Five Minutes »A guided tour of essential Wolfram Language functions and concepts in an easytouse cloud notebook. 

An Elementary Introduction to the Wolfram Language »Stephen Wolfram’s online book introduces the Wolfram Language and modern computational thinking—no prior knowledge of programming is required. Get free paper copies for your school or class when you share your lesson plans based on the book! 

Learning the Wolfram Language Screencasts and Videos »A bank of video tutorials and workshops on all sorts of topics. Examples: Workshop for the Hour of Code  Teaching Computational Thinking: Virtual Workshop  HandsOn Start to Mathematica  Working with Notebooks 

Fast Introduction for Math Students »This tutorial will quickly bring all levels of math students up to speed on how to use the Wolfram Language for calculations, plots and presentations, from basic arithmetic to integral calculus. 

Fast Introduction for Programmers »This tutorial will give you what you need to read and understand almost any Wolfram Language code and to get started doing Wolfram Language programming yourself—with additional notes for those with Python or Java experience. 

Wolfram Community »If you need any help, we have a vast community of helpers that can advise you. 
We have a number of platforms for educators to work with:
WolframAlpha Notebook Edition »Combining the best of both WolframAlpha and Mathematica into a single, unified tool perfect for teaching and learning. 

Wolfram Cloud »Instant access to the Wolfram Language in your browser. 

Wolfram Cloud App »Instant access to the Wolfram Language on your tablet or mobile device. 

Mathematica »The principal computation environment for millions of innovators, educators, students and others around the world. 

System Modeler »An easytouse, nextgeneration modeling and simulation environment for cyberphysical systems. 
Join Wolfram Community to share how you’ve been using Wolfram technology to enhance your virtual classroom, and for more activities and ideas from other educators. If you have followup questions or would like to discuss Wolfram technology in education, please comment on this post.
For students and those looking to continue their education at home, check out this previous post for an additional set of resources to try out.
And we’re planning more, including a Wolfram Study Group stream and more webinars, to be announced soon!
]]>We recently released Version 12.1 of the Wolfram Language, and with it, a number of new documentation features and page types. With every release, you’ll find an increasing scope of functionality, examples and use cases documented for different fields and applications, presented with an intuitive, userfriendly design.
The Documentation Center’s home page is organized by topic and demonstrates the vast coverage of our knowledgebased language. There are three stacks of tiles for different needs: Wolfram Language reference material; taskoriented, stepbystep documents called workflows; and additional language resources.
Before we dig into these tiles in depth, let’s first see how to find what’s new in the latest Wolfram Language release. There are two notable ways to do this from the home page: the Recent Features tile and the New Features footer link.
The Recent Features tile takes you to the Recently Added Features guide page, which outlines handy resources for each of the recent Wolfram Language releases. This landing page contains links to announcement webpages, new function listings and revision history:
This page includes a link to the Summary of New Features guide page for each release—also linked to from the bottom of the Documentation Center home page. This summary page is a great way to discover new and updated functionality. Some of the new features in Version 12.1 include computation with video, substantial advances within machine learning, major updates to geographic visualization and more.
The backbone of the Wolfram Language documentation is the guide pages. Each guide page is a topical, loosely hierarchical page that contains links to functions relevant to that topic, roughly in order of importance to that topic. On one hand, a guide page is a table of contents—a quick reference to functions on a topic—but it’s also a node in the network of Wolfram Language documentation, with the colorful tiles on the home page serving as the primary entry point. You’ll find higherlevel guide pages linked directly from the home page, and each of those guides typically contains many links to other, more specific guides.
Across all pages, especially those documenting specific functions, we ensure that users have a seamless experience in finding what they need. This includes the addition of visual differentiators, established assets and some other noteworthy UX choices when it comes to interlinking various networks of functionality.
Thoughtful, curated linking of related content is a principle carried into every area of our documentation. Functionspecific reference pages have dedicated areas at the top and bottom of the page with links to related pages. You’ll see some combination of these dropdowns at the top of any reference page:
In the following screenshot, you’ll notice the gray bar spanning the top of the page. This is the sticky header on our web documentation. It appears when you’ve scrolled away from the top of the page, providing you with the topofpage dropdowns in case it’s time to jump to related content.
Each of these link sections has a stylized icon (at the bottom of the page on the lefthandside) for quick visual reference. Similarly, Related Links have Wolfram product icons when applicable:
A common complaint in previous versions was that closed sections were often hard to see when browsing a page. Now, these closed sections often include an image preview of the hidden content:
These previews are generated by capturing the section’s content in an image, splitting it vertically and placing the resulting list of images in a row—all produced by the Wolfram Language.
You may have noticed that guide pages have dedicated link colors for certain types of reference pages. You can now determine at a glance whether you’re looking at a builtin or package function, an entity type or another reference page type. System symbol links are blue and nonsymbol reference pages are quoted and light gray:
Entity page links have their own style too; they’re similar to entity pods and light up when hovered over or clicked:
Other link styles include package symbols (light blue) and nonWolfram Language functions, such as WSTP C language functions (green):
A workflow takes a different approach from the categorical reference material. Workflows are taskoriented pieces of documentation, providing a stepbystep walkthrough of that task. Workflows are also used to show tasks involving interface items or other user actions outside of the literal syntax of the language, such as external program setup, and includes screenshots or diagrams to accurately describe those processes.
While workflows are intended to be standalone documents, they are grouped together by general topic in, as you may have guessed, workflow guides. For example, the toplevel workflow guide Working in the Cloud contains a number of links to workflows (and workflow guides) on interacting with the Wolfram Cloud.
Within each tile opener on the home page, you’ll see links to related categories within Wolfram repositories:
Near the bottom, there is a third group of links under a Resources heading for related outofsystem documentation and general information regarding the use of Wolfram products.
Our web documentation pages are all fully responsive. This means that no matter what device you’re using, you get the same webpage, but the font sizes, white space and various page data will adjust accordingly based on your browser window size. Here’s an example of how that happens horizontally:
Unique to our documentation is that we also respond to vertical breakpoints in the same way:
If you’re viewing web documentation narrowly on the side of your notebook window, shortened above or beneath a notebook, or on a separate screen entirely—our webpage responsiveness has got you covered.
We have two new web features for previewing content before clicking through the site: guide previews on the home page and function template previews from guide pages.
From the home page, hovering over a guide link will pop up a preview of the guide itself. This preview is fully interactive, including relevant hyperlinked functions that users can click to jump directly to the reference page and skip the intermediary guide:
While on a guide page, hovering over the link to any reference page with a topofpage template box will give a preview of documented function patterns:
For web documentation users who only need a refresher on the syntax of the Wolfram Language, this second feature will be all they need. It’s comparable to the function template tooltip (an innotebook feature and part of the Wolfram Predictive Interface).
When viewing a reference page on the web, you can select any example’s input to immediately copy its contents to your system clipboard:
In the same hover effect, there’s an icon providing an anchor link to that example (for later reference or ease of sharing):
Easily copying examples from the web is more useful than you might initially suspect. Not only does it save the time otherwise spent rewriting the example in your notebook, but it is also helpful when copying an example that contains something that isn’t text. For example, the first basic example for the function ImageResize looks like this:
This example copies as faithfully as any other; pasting in a notebook shows the image inline, just as you see it on the web.
Another useful feature is the ability to copy an entire usage template, which then pastes (with placeholders) into a notebook:
Copying templates like this is an online analog of the function and option templates from the Wolfram Predictive Interface tooltip.
Easily copying content from the web to your notebook is especially powerful in the Wolfram Cloud—where you can now quickly evaluate or tweak documentation examples just as in the desktop product.
A good search system can be crucial for finding the content you need. That’s why considerable optimizations and improvements have been made to searching our documentation, both within the product itself and on the web. These improvements are architected inhouse using our own search technology.
The search results page itself is slightly different in the product versus on the web, but either way the focus is on visual cues for finding the content or page type desired.
Often, new functionality needs to be documented in specific ways, and we craft entirely new kinds of reference pages to accommodate that. Although there may be significant differences among these new page types, the overall design principles are still apparent. Here are some of the new page types introduced in recent releases:
Here’s a list with examples:
Starting in Version 12.0 and continuing in 12.1, tutorial documents are being rebranded into either monographs or tech notes. Monographs are long expositions considered timeless across versions, and tend to richly explain a topic as you would see in a textbook. Tech notes generally focus solely on the implementation details of a given topic in the Wolfram Language.
The Wolfram Function Repository, announced last year by Stephen Wolfram, also has its own documentation pages. In a future release, access to these pages will be fully integrated into our documentation search and crossreferencing efforts. The content is created by users like you who design their own tools that do not yet have dedicated functions. If you have custom functions, go to the website to learn how to contribute.
Good content doesn’t mean anything if customers can’t find or use it. While other companies are just now understanding the benefits of interactivity and runnable code examples, Wolfram pioneered them, and we’ve got three decades of computation and innovation to show for it. Where opensource projects fail to deliver meaningful docs to their users, Wolfram ensures it through tens of thousands of hours of rigorous language design reviews—and our documentation creation process directly informs that design review process. For us, documentation has been a foundational component of a good software experience for more than 30 years.
Browse our Documentation Center and try out examples, learn more about cuttingedge features and discover something new!
Get full access to the latest Wolfram Language functionality with Mathematica 12.1. 
We’re pleased that despite the coronavirus pandemic and its impact on so many people and businesses we’re still able to launch today as planned… (Thanks to our dedicated team and the fact that remote working has been part of our company for decades…)
It’s always an interesting time. We’re getting ready to wrap up a .1 version—to release the latest fruits of our research and development efforts. “Is it going to be a big release?”, I wonder. Of course, I know we’ve done a lot of work since we released Version 12.0 last April. All those design reviews (many livestreamed). All those new things we’ve built and figured out.
But then we start actually making the list for the new version. And—OMG—it goes on and on. Different teams are delivering on this or that project that started X years ago. A new function is being added for this. There’s some new innovation about that. Etc.
We started this journey a third of a century ago when we began the development of Version 1.0. And after all these years, it’s amazing how the energy of each new release seems to be ever greater.
And as we went on making the list for Version 12.1 we wondered, “Will it actually be our biggest .1 release ever?”. We finally got the answer: “Yes! And by a lot”.
Counting functions isn’t always the best measure, but it’s an indication. And in Version 12.1 there are a total of 182 completely new functions—as well as updates and enhancements to many hundreds more.
Back in 1988 when we released Version 1.0 a typical computer display was maybe 640 pixels across (oh, and it was a CRT). And I was recently using some notebooks of mine from the 1990s (yes, they still work, which is spectacular!), and I was amazed at what a small window size they were made for. But as I write this today, I’m looking at two 3000pixel displays. And 4k displays aren’t uncommon. So one of the things we’ve done for Version 12.1 is to add systemwide support for the new world of veryhighresolution displays.
One might think that would be easy, and would just “come with the operating system”. But actually it’s taken two years of hard work to deliver full HiDPI support. Well over a thousand carefully designed icons and other assets went from being bitmaps to being workatanysize algorithmic graphics. Everything about rasterization (not just for Rasterize, but for 3D graphics textures, etc. etc.) had to be redone. Sizes of things—and their interactions with the tower of kludges that operating systems have introduced over the years—had to be respecified and rethought.
But now it’s done. And we’re ready for displays of any resolution:
By the way, talking of displays, another “infrastructure” enhancement in Version 12.1 is moving to Metal and Direct3D 11 for 3D graphics rendering on macOS and Windows. Right now these just make 3D graphics modestly faster. But they also lay the groundwork for full multithreaded rendering, as well as VR, AR and more.
We’ve been working towards it for nearly 15 years… but finally it’s here: computation with video! We introduced images into the language in 2008; audio in 2016. But now in Version 12.1 we for the first time have computation with video. There’ll be lots more coming in future releases, but there’s already quite a bit in 12.1.
So… just like Image and Audio, which symbolically represent images and audio, we now have Video.
This asks for five frames from a video:
✕
VideoFrameList[ Video["ExampleData/Caminandes.mp4", Appearance > Automatic, AudioOutputDevice > Automatic, SoundVolume > Automatic], 5] 
This asks to make a time series of the mean color of every frame:
✕
VideoTimeSeries[Mean, Video["ExampleData/Caminandes.mp4", Appearance > Automatic, AudioOutputDevice > Automatic, SoundVolume > Automatic]] 
And then one can just plot the time series:
✕
DateListPlot[%, PlotStyle > {RGBColor[1, 0, 0], RGBColor[0, 1, 0], RGBColor[ 0, 0, 1]}] 
Video is a complicated area, with lots of different encodings optimized for different purposes. In Version 12.1 we’re supporting more than 250 of them, for import, export and transcoding. You can refer to a video on the web as well:
✕
Video["http://exampledata.wolfram.com/cars.avi"] 
And the big thing is that video is now getting integrated into everything. So, for example, you can immediately use image processing or audio processing or machine learning functions on video. Here’s an example plotting the location of cars in the video above:
✕
v = Video["http://exampledata.wolfram.com/cars.avi"] 
✕
ts = VideoTimeSeries[Point[ImagePosition[#, Entity["Word", "car"]]] &, v] 
✕
HighlightImage[ VideoExtractFrames[v, Quantity[5, "Seconds"]], {PointSize[Medium], Values[ts]}] 
Let’s say you’ve got a Manipulate, or an animation (say from ListAnimate). Well, now you can just immediately make a video of it:
✕
Video[CloudGet["https://wolfr.am/L9r00rk5"]] 
You can add an audio track, then export the whole thing directly to a file, the cloud, etc.
So is this new video capability really industrial strength? I’ve been recording hundreds of hours of video in connection with a new project I’m working on. So I decided to try our new capabilities on it. It’s spectacular! I could take a 4hour video, and immediately extract a bunch of sample frames from it, and then—yes, in a few hours of CPU time—“summarize the whole video”, using SpeechRecognize to do speechtotext on everything that was said and then generating a word cloud:
Speaking of audio, there’s new stuff in Version 12.1 there too. We’ve redone the GUI for innotebook Audio objects. And we’ve introduced SpeechInterpreter, which is the spoken analog of the Interpreter function, here taking an audio object and returning what airline name was said in it:
✕
SpeechInterpreter["Airline"][CloudGet["https://wolfr.am/L9r410jA"]] 
In Version 12.0 we introduced the important function TextCases for extracting from text hundreds of kinds of entities and “text content types” (which as of 12.1 now have their own documentation pages). In 12.1 we’re also introducing SpeechCases, which does the same kind of thing for audio speech.
One of our major longterm projects is the creation of a full compiler for the Wolfram Language, targeting native machine code. Version 12.0 was the first exposure of this project. In Version 12.1 there’s now a spinoff from the project—which is actually a very important project in its own right: the new DataStructure function.
We’ve curated many kinds of things in the past: chemicals, equations, movies, foods, importexport formats, units, APIs, etc. And in each case we’ve made the things seamlessly computable as part of the Wolfram Language. Well, now we’re adding another category: data structures.
Think about all those data structures that get mentioned in textbooks, papers, libraries, etc. Our goal is to have all of them seamlessly usable directly in the Wolfram Language, and accessible in compiled code, etc. Of course it’s huge that we already have a universal “data structure”: the symbolic expressions in the Wolfram Language. And internal to the Wolfram Language we’ve always used all sorts of data structures, optimized for different purposes, and automatically selected by our algorithms and metaalgorithms.
But now with DataStructure there’s something new. If you have a particular kind of data structure you want to use, you can just ask for it by name, and use it.
Here’s how you create a linked list data structure:
✕
ds = CreateDataStructure["LinkedList"] 
Append a million random integers to the linked list (it takes 380 ms on my machine):
✕
Do[ds["Append", RandomInteger[]], 10^6] 
Now there’s immediate visualization of the structure:
✕
ds["Visualization"] 
Here’s the numerical mean of all the values:
✕
Mean[N[Normal[ds]]] 
Like so much of what we do DataStructure is set up to span from small scale and pedagogical to large scale and full industrial strength. Teaching a course about data structures? Now you can immediately use the Wolfram Language, storing everything you do in notebooks, automatically visualizing your data structures, etc. Building largescale production code? Now you can have complete control over optimizing the data structures you’re using.
How does DataStructure work? Well, it’s all written in the Wolfram Language, and compiled using the compiler (which itself is also written in the Wolfram Language).
In Version 12.1 we’ve got most of the basic data structures covered, with various kinds of lists, arrays, sets, stacks, queues, hash tables, trees, and more. And here’s an important point: each one is documented with the running time for its various operations (“O(n)”, “O(n log(n))”, etc.), and the code ensures that that’s correct.
It’s pretty neat to see classic algorithms written directly for DataStructure.
Create a binary tree data structure (and visualize it):
✕
(ds = CreateDataStructure["BinaryTree", 3 > {1 > {0, Null}, Null}])["Visualization"] 
Here’s a function for rebalancing the tree:
✕
RightRotate[y_] := Module[{x, tmp}, x = y["Left"]; tmp = x["Right"]; x["SetRight", y]; y["SetLeft", tmp]; x] 
Now do it, and visualize the result:
✕
RightRotate[ds]["Visualization"] 
You’ve got a symbolic math expression and you want to figure out its rough value. If it’s a number you just use N to get a numerical approximation. But how do you get a symbolic approximation?
Ever since Version 1.0—and, in the history of math, ever since the 1600s—there’s been the idea of power series: find an essentially polynomiallike approximation to a function, as Series does. But not every mathematical expression can be reasonably approximated that way. It’s difficult math, but it’s very useful if one can make it work. We started introducing “asymptotic approximation” functions for specific cases (like integrals) in Version 11.3, but now in 12.1 we’re introducing the asymptotic superfunction Asymptotic.
Consider this inverse Laplace transform:
✕
InverseLaplaceTransform[1/(s Sqrt[s^3 + 1]), s, t] 
There’s no exact symbolic solution for it. But there is an asymptotic approximation when t is close to 0:
✕
Asymptotic[InverseLaplaceTransform[1/(s Sqrt[s^3 + 1]), s, t], t > 0] 
Sometimes it’s convenient to not even try to evaluate something exactly—but just to leave it inactive until you give it to Asymptotic:
✕
Asymptotic[ DSolveValue[Sin[x]^2 y''[x] + x y[x] == 0, y[x], x], {x, 0, 5}] 
Asymptotic deals with functions of continuous variables. In Version 12.1 there’s also DiscreteAsymptotic. Here we’re asking for the asymptotic behavior of the Prime function:
✕
DiscreteAsymptotic[Prime[n], n > Infinity] 
Or the factorial:
✕
DiscreteAsymptotic[n!, n > Infinity] 
We can ask for more terms if we want:
✕
DiscreteAsymptotic[n!, n > Infinity, SeriesTermGoal > 5] 
Sometimes even quite simple functions can lead to quite exotic asymptotic approximations:
✕
DiscreteAsymptotic[BellB[n], n > Infinity] 
Math is big, and math is important. And for the Wolfram Language (which also means for Mathematica) we’re always pushing the frontiers of what’s computable in math.
One longterm story has to do with special functions. Back in Version 1.0 we already had 70 special functions. We covered univariate hypergeometric functions—adding the general _{p}F_{q} case in Version 3.0. Over the years we’ve gradually added a few other kinds of hypergeometric functions (as well as 250 other new kinds of special functions). Typical hypergeometric functions are solutions to differential equations with three regular singular points. But in Version 12.1 we’ve generalized that. And now we have Heun functions, that solve equations with four regular singular points. That might not sound like a big deal, but actually they’re quite a mathematical jungle—for example with 192 known special cases. And they’re very much in vogue now, because they show up in the mathematics of black holes, quantum mechanics and conformal field theory. And, yes, Heun functions have a lot of arguments:
✕
Series[HeunG[a, q, \[Alpha], \[Beta], \[Gamma], \[Delta], z], {z, 0, 3}] 
By the way, when we “support a special function” these days, there’s a lot we do. It’s not just a question of evaluating the function to arbitrary precision anywhere in the complex plane (though that’s often hard enough). We also need to be able to compute asymptotic approximations, simplifications, singularities, etc. And we have to make sure the function can get produced in the results of functions like Integrate, DSolve and Sum.
One of our consistent goals in dealing with superfunctions like DSolve is to make them “handbook complete”. To be sure that the algorithms we have—that are built to handle arbitrary cases—successfully cover as much as possible of the cases that appear anywhere in the literature, or in any handbook. Realistically, over the years, we’ve done very well on this. But in Version 12.1 we’ve made a new, big push, particularly for DSolve.
Here’s an example (oh, and, yes, it happens to need Heun functions):
✕
DSolveValue[(d + c x + b x^2) y[x] + a x y'[x] + (1 + x^2) y''[x] == 0, y[x], x] 
There’s a famous book from the 1940s that’s usually just called Kamke, and that’s a huge collection of solutions to differential equations, some extremely exotic. Well, we’ll soon be able to do 100% of the (concrete) equations in this book (we’re still testing the last few…).
In Version 12.0 we introduced functions like ComplexPlot and ComplexPlot3D for plotting complex functions of complex variables. In Version 12.1 we now also have complex contour plotting. Here we’re getting two sets of contours—from the Abs and the Arg of a complex function:
✕
ComplexContourPlot[ AbsArg[(z^2  I)/(z^3 + I)], {z, 3  3 I, 3 + 3 I}, Contours > 30] 
Also new in 12.1 is ComplexRegionPlot, which effectively solves equations and inequalities in the complex plane. Like here’s the (very much branchcutinformed) solution to an equation whose analog would be trivial over the reals:
✕
ComplexRegionPlot[Sqrt[z^(2 + 2 I)] == z^(1 + I), {z, 10}] 
In a very different area of mathematics, another new function in Version 12.1 is CategoricalDistribution. We introduced the idea of symbolic representations of statistical distributions back in Version 6—with things like NormalDistribution and PoissonDistribution—and the idea has been extremely successful. But so far all our distributions have been distributions over numbers. In 12.1 we have our first distribution where the possible outcomes don’t need to be numbers.
Here’s a distribution where there are outcomes x, y, z with the specified probabilities:
✕
dist = CategoricalDistribution[{x, y, z}, {.1, .2, .7}] 
Given this distribution, one can do things like generate random variates:
✕
RandomVariate[dist, 10] 
Here’s a 3D categorical distribution:
✕
dist = CategoricalDistribution[{{"A", "B", "C"}, {"D", "E"}, {"X", "Y"}}, {{{2, 4}, {2, 1}}, {{2, 2}, {3, 2}}, {{4, 3}, {1, 3}}}] 
Now we can work out the PDF of the distribution, asking in this case what the probability to get A, D, Y is:
✕
PDF[dist, {"A", "D", "Y"}] 
By the way, if you want to “see the distribution” you can either click the + on the summary box, or explicitly use Information:
✕
Information[dist, "ProbabilityTable"] 
There are lots of uses of CategoricalDistribution, for example in machine learning. Here we’re creating a classifier:
✕
cf = Classify[{1, 2, 3, 4} > {a, a, b, b}] 
If we just give it input 2.3, the classifier will give its best guess for the corresponding output:
✕
cf[2.3] 
But in 12.1 we can also ask for the distribution—and the result is a CategoricalDistribution:
✕
cf[2.3, "Distribution"] 
✕
Information[%, "ProbabilityTable"] 
In Version 12.0 we introduced industrialscale convex optimization. We covered most of the usual problem classes (like linear, semidefinite, quadratic and conic). But there was one straggler: geometric optimization. And now we’re adding that for 12.1:
✕
GeometricOptimization[\[Pi] r (r + Sqrt[h^2 + r^2]), {1 <= \[Pi]/ 3 h r^2 }, {h, r}] 
✕
GeometricOptimization[ 1/(h w d), {h <= 2 w, d <= 2 w, h*w + h*d <= 50, 2 w*d <= 20}, {h, w, d}] 
You can solve all sorts of practical problems with GeometricOptimization—with thousands of variables if need be. As one example, consider laying out rectangles of certain sizes with a certain partial ordering in x and y. To specify the problem, you give a bunch of inequalities:
✕
With[{c1 = 0.25, c2 = 0.618}, ineqs = {{c1 + w[1] + x[1] <= x[2], c1 + w[1] + x[1] <= x[3], c1 + w[1] + x[1] <= x[4], c1 + w[1] + x[1] <= x[5], c1 + w[1] + x[1] <= x[6], c1 + w[1] + x[1] <= x[7], c1 + w[2] + x[2] <= x[3], c1 + w[4] + x[4] <= x[5], c1 + w[2] + x[2] <= x[3], c1 + w[2] + x[2] <= x[5], c1 + w[2] + x[2] <= x[7], c1 + w[4] + x[4] <= x[3], c1 + w[4] + x[4] <= x[5], c1 + w[4] + x[4] <= x[7], c1 + w[6] + x[6] <= x[5], c1 + w[8] + x[8] <= x[4], c1 + w[9] + x[9] <= x[4], c1 + w[10] + x[10] <= x[4], c1 + w[10] + x[10] <= x[6], c1 + w[6] + x[6] <= x[7], c1 + w[8] + x[8] <= x[9], c1 + w[8] + x[8] <= x[10], x[1] >= 0, x[8] >= 0, w[3] + x[3] <= \[ScriptW], w[5] + x[5] <= \[ScriptW], w[7] + x[7] <= \[ScriptW]}, {c1 + h[1] + y[1] <= y[6], c1 + h[1] + y[1] <= y[7], c1 + h[1] + y[1] <= y[8], c1 + h[1] + y[1] <= y[9], c1 + h[1] + y[1] <= y[10], c1 + h[2] + y[2] <= y[4], c1 + h[2] + y[2] <= y[9], c1 + h[4] + y[4] <= y[6], c1 + h[3] + y[3] <= y[5], c1 + h[5] + y[5] <= y[7], c1 + h[9] + y[9] <= y[6], c1 + h[9] + y[9] <= y[10], y[1] >= 0, y[2] >= 0, y[3] >= 0, h[6] + y[6] <= \[ScriptH], h[7] + y[7] <= \[ScriptH], h[8] + y[8] <= \[ScriptH], h[10] + y[10] <= \[ScriptH]}, {c2 <= h[1]/w[1] <= (1 + c2), c2 <= h[2]/w[2] <= (1 + c2), c2 <= h[3]/w[3] <= (1 + c2), c2 <= h[4]/w[4] <= (1 + c2), c2 <= h[5]/w[5] <= (1 + c2), c2 <= h[6]/w[6] <= (1 + c2), c2 <= h[7]/w[7] <= (1 + c2), c2 <= h[8]/w[8] <= (1 + c2), c2 <= h[9]/w[9] <= (1 + c2), c2 <= h[10]/w[10] <= (1 + c2)}, {h[1] w[1] == 1, h[2] w[2] == 2, h[3] w[3] == 3, h[4] w[4] == 4, h[5] w[5] == 5, h[6] w[6] == 6, h[7] w[7] == 7, h[8] w[8] == 8, h[9] w[9] == 9, h[10] w[10] == 10}}]; 
It then takes only about a second to generate an optimal solution:
In optimization, there are usually two broad types: continuous and discrete. Our convex optimization functions in 12.0 handled the case of continuous variables. But a major new feature—and innovation—in 12.1 is the addition of support for discrete (i.e. integer) variables, and for mixed discrete and continuous variables.
Here’s a very simple example:
✕
QuadraticOptimization[ 2 x^2 + 20 y^2 + 6 x y + 5 x, x + y >= 2, {x \[Element] Integers, y \[Element] Reals}] 
If x wasn’t constrained to be an integer, the result would be different:
✕
QuadraticOptimization[ 2 x^2 + 20 y^2 + 6 x y + 5 x, x + y >= 2, {x, y}] 
But—as with our other optimization capabilities—this can be scaled up, though the combinatorial optimization that’s involved is fundamentally more computationally difficult (and for example it’s often NPcomplete). And actually the only reason we can do largescale problems of this kind at all is that we’ve implemented a novel iterationbased technique that successfully unlocks mixed convex optimization.
I’ve been trying to make good vector plots for about 40 years, but in the past it just never worked. If the vectors got too short, you couldn’t see their direction—and if you made them longer they crashed into each other. But particularly after our success in Version 12.0 in cracking the ComplexPlot problem (which had also been languishing for a long time) we decided for Version 12.1 to try to solve the vectorplotting problem once and for all. And, I’m happy to say, we seem to have been able to do that.
So now, you can just ask VectorPlot (and all sorts of related functions) to make a vector plot, and you’ll automatically get something that’s a good representation of your vector field:
✕
VectorPlot[{2 x^2  y^2, 3 x y}, {x, 5, 5}, {y, 5, 5}] 
✕
VectorPlot[{2 x^2  y^2, 3 x y}, {x, 5, 5}, {y, 5, 5}, VectorPoints > 30] 
What’s the trick? It’s basically about placing vectors on a hexagonal grid so they’re packed better, and are visually more uniform. (You can also make other choices if you want to.) And then it’s about using appropriately scaled color to represent vector magnitudes.
There are all sorts of other challenges too. Like being able to draw vectors in a region:
✕
VectorPlot[{2 x^2  y^2, 3 x y}, {x, y} \[Element] Disk[{0, 0}, 3]] 
And putting together our complexnumberplotting capabilities with our new vector plotting, we also in 12.1 have ComplexVectorPlot:
✕
ComplexVectorPlot[z^ Log[z], {z, 6}, PlotLegends > Automatic] 
Before there were gray scales, there were things like crosshatching. Look at a book from a century ago (or less), and you’ll see all sorts of diagrams elegantly drawn with things like crosshatching. Well, now we can do that too.
✕
Graphics[Style[RegularPolygon[5], HatchFilling[]]] 
✕
Plot[{Sin[x], Cos[x]}, {x, 0, 10}, Filling > Axis, FillingStyle > HatchFilling[]] 
Of course, everything is computable:
✕
Graphics[Table[ Style[Disk[RandomReal[10, 2]], HatchFilling[RandomReal[{0, 2 \[Pi]}]]], 50]] 
We also have an important generalization of crosshatching: PatternFilling. Here are examples with named patterns:
✕
Graphics[Style[Disk[], PatternFilling["DiamondBox"]]] 
✕
Graphics[Style[Disk[], PatternFilling[{"Checkerboard", Red, Black}]]] 
You can use any image as a pattern too:
✕
GeoGraphics[ Style[Polygon[Entity["Country", "UnitedStates"]], PatternFilling[CloudGet["https://wolfr.am/L9r9AL5O"], 270]]] 
Version 12.1 also has what one can think of as 3D generalizations of these kinds of textures:
✕
Graphics3D[Style[Icosahedron[], HatchShading[]]] 
It looks pretty good even in black and white:
✕
Graphics3D[Style[Icosahedron[], HatchShading[]], Lighting > "Accent"] 
There’s stipple shading too:
✕
Plot3D[Exp[(x^2 + y^2)], {x, 2, 2}, {y, 2, 2}, PlotStyle > {White, StippleShading[]}, Mesh > None, Lighting > "Accent"] 
In the past few versions, we’ve introduced deeper and deeper coverage of computational geometry. In coming versions, we’re going to be covering more and more of computational topology too. Things like EulerCharacteristic and PolyhedronGenus were already in Version 12.0. In Version 12.1 we’re introducing several powerful functions for dealing with the topology of simplicial complexes, of the kind that are for example used in representing meshes.
This makes a connectivity graph for the dimension0 components of a dodecahedron, i.e. its corners:
✕
MeshConnectivityGraph[Dodecahedron[], 0] 
Here’s the corresponding result for the connectivity of lines to lines in the dodecahedron:
✕
MeshConnectivityGraph[Dodecahedron[], 1] 
And here’s the connectivity of corners to faces:
✕
MeshConnectivityGraph[Dodecahedron[], {0, 2}] 
It’s a very general function. Here are the graphs for different dimensional cells of a Menger sponge:
✕
Table[MeshConnectivityGraph[MengerMesh[2, 3], d], {d, 0, 3}] 
Given a mesh, it’s often useful to do what amounts to a topological search. For example, here’s a random Voronoi mesh:
✕
vm = VoronoiMesh[RandomReal[1, {200, 2}]] 
Here are the 10 closest mesh cells to position {.5, .5} (the 2 before each index indicates that these are dimension2 cells):
✕
NearestMeshCells[vm, {.5, .5}, 10] 
Now highlight these cells:
✕
HighlightMesh[vm, %] 
Dataset has been a big success in the six years since it was first introduced in Version 10.0. Version 12.1 has the beginning of a major project to upgrade and extend the functionality of Dataset.
The first thing is something you might not notice, because now it “just works”. When you see a Dataset in a notebook, you’re just seeing its displayed form. But often there is lots of additional data that you’d get to by scrolling or drilling down. In Version 12.1 Dataset automatically stores that additional data directly in the notebook (at least up to a size specified by $NotebookInlineStorageLimit) so when you open the notebook again later, the Dataset is all there, and all ready to compute with.
In Version 12.1 a lot has been done with the formatting of Dataset. Something basic is that you can now say how many rows and columns to display by default:
✕
Dataset[CloudGet["https://wolfr.am/L9o1Pb7V"], MaxItems > {4, 3}] 
In Version 12.1 there are many options that allow detailed programmatic control over the appearance of a display Dataset. Here’s a simple example:
✕
Dataset[CloudGet["https://wolfr.am/L9o1Pb7V"], MaxItems > 5, HeaderBackground > LightGreen, Background > {{{LightBlue, LightOrange}}}, ItemDisplayFunction > {"sex" > (If[# === "female", \[Venus], \[Mars]] &)} ] 
A major new feature is “rightclick” interactivity (which works on rows, columns and individual items):
Dataset is a powerful construct for displaying and computing with tabular data of any depth. But sometimes you just want to enter or edit simple 2D tabular data—and the user interface requirements for this are rather different from those for Dataset. So in Version 12.1 we’re introducing a new experimental function called TableView, which is a user interface for entering—and viewing—purely twodimensional tabular data:
✕
TableView[{{5, 6}, {7, 3}}] 
Like a typical spreadsheet, TableView has fixedwidth columns that you can manually adjust. It can efficiently handle largescale data (think millions of items). The items can (by default) be either numbers or strings.
When you’ve finished editing a TableView, you can just ask for Normal and you’ll get lists of data out. (You can also feed it directly into a Dataset.) Like in a typical spreadsheet, TableView lets you put data wherever you want; if there’s a “hole”, it’ll show up as Null in lists you generate.
TableView is actually a dynamic control. So, for example, with TableView[Dynamic[x]] you can edit a TableView, and have its payload automatically be the value of some variable x. (And, yes, all of this is done efficiently, with minimal updates being made to the expression representing the value of x.)
Machine learning is all the rage these days. Of course, we were involved with it even a very long time ago. We introduced the first versions of our flagship highly automated machinelearning functions Classify and Predict back in 2014, and we introduced our first explicitly neuralnetbased function—ImageIdentify—in early 2015.
And in the years since then we’ve built a very strong system for machine learning in general, and for neural nets in particular. Several things about it stand out. First, we’ve emphasized high automation—using machine learning to automate machine learning wherever possible, so that even nonexperts can immediately make use of leadingedge capabilities. The second big thing is that we’ve been curating neural nets, just like we curate so many other things. So that means that we have pretrained classifiers and predictors and feature extractors that you can immediately and seamlessly use. And the other big thing is that our whole neural net system is symbolic—in the sense that neural nets are specified as computable, symbolic constructs that can be programmatically manipulated, visualized, etc.
In Version 12.1 we’ve continued our leadingedge development in machine learning. There are 25 new types of neural nets in our Wolfram Neural Net Repository, including ones like BERT and GPT2. And the way things are set up, it’s immediate to use any of these nets. (Also, in Version 12.1 there’s support for the new ONNX neural net specification standard, which makes it easier to import the very latest neural nets that are being published in almost any format.)
This gets the symbolic representation of GPT2 from our repository:
✕
gpt2 = NetModel["GPT2 Transformer Trained on WebText Data", "Task" > "LanguageModeling"] 
If you want to see what’s inside, just click—and keep clicking to drill down into more and more details:
Now you can immediately use GPT2, for example progressively generating a random piece of text one token at a time:
✕
Nest[StringJoin[#, gpt2[#, "RandomSample"]] &, "Stephen Wolfram is", 20] 
Hmmmm. I wonder what that was trained on….
By the way, people sometimes talk about machine learning and neural nets as being in opposition to traditional programming language code. And in a way, that’s correct. A neural net just learns from realworld examples or experience, whereas a traditional programming language is about giving a precise abstract specification of what in detail a computer should do. We’re in a wonderful position with the Wolfram Language, because what we have is something that already spans these worlds: we have a fullscale computational language that takes advantage of all those precise computation capabilities, yet can meaningfully represent and compute about things in the real world.
So it’s been very satisfying in the past few years to see how modern machine learning can be integrated into the Wolfram Language. We’ve been particularly interested in new superfunctions—like Predict, Classify, AnomalyDetection, LearnDistribution and SynthesizeMissingValues—that do “symbolically specified” operations, but do them using neural nets and modern machine learning.
In Version 12.1 we’re continuing in this direction, and moving towards superfunctions that use more elaborate neural net workflows, like GANs. In particular, Version 12.1 introduces the symbolic NetGANOperator, as well as the new option TrainingUpdateSchedule. And it turns out these are the only things we had to change to allow our general NetTrain function to work with GANs.
A typical GAN setup is quite complicated (and that’s why we’re working on devising superfunctions that conveniently deliver applications of GANs). But here’s an example of a GAN in action in Version 12.1:
How do you add metadata annotations to something you’re computing with? For Version 12.1 we’ve begun rolling out a general framework for making annotations—and then computing with and from them.
Let’s talk first about the example of graphs. You can have both annotations that you can immediately “see in the graph” (like vertex colors), and ones that you can’t (like edge weights).
Here’s an example where we’re explicitly constructing a graph with annotations:
✕
Graph[{Annotation[1 > 2, EdgeStyle > Red], Annotation[2 > 1, EdgeStyle > Blue]}] 
Here we’re annotating the vertices:
✕
Graph[{Annotation[x, VertexStyle > Red], Annotation[y, VertexStyle > Blue]}, {x > y, y > x, y > y}, VertexSize > .2] 
AnnotationValue lets you query values of annotations:
✕
AnnotationValue[{%, x}, VertexStyle] 
Something important about AnnotationValue is that you can assign it. Set g to be the graph:
✕
g = CloudGet["https://wolfr.am/L9rgvixl"]; 
Now do an assignment to an annotation value:
✕
AnnotationValue[{g, x}, VertexStyle] = Green 
Now the graph has changed:
✕
g 
You can always delete the annotation if you want:
✕
AnnotationDelete[{g, x}, VertexStyle] 
If you don’t want to permanently modify a graph, you can just use Annotate to produce a new graph with annotations added (3 and 5 are names of vertices):
✕
Annotate[{CloudGet["https://wolfr.am/L9rpqPJ0"], {3, 5}}, VertexSize > .3] 
Some annotations are important for actual computations on graphs. An example is edge weighting. This puts edgeweight annotations into a graph—though by default they don’t get displayed:
✕
Graph[Catenate[ Table[Annotation[i > j, EdgeWeight > GCD[i, j]], {i, 5}, {j, 5}]]] 
This displays the edge weights:
✕
Graph[%, EdgeLabels > "EdgeWeight"] 
And this actually does a computation that includes the weights:
✕
WeightedAdjacencyMatrix[ CloudGet["https://wolfr.am/L9rtJdd9"]] // MatrixForm 
You can use your own custom annotations too:
✕
Graph[{Annotation[x, "age" > 10], Annotation[y, "age" > 20]}, {x > y, y > x, y > y}] 
This retrieves the value of the annotation:
✕
AnnotationValue[{CloudGet["https://wolfr.am/L9rx8Mxe"], x}, "age"] 
Annotations are ultimately stored in an AnnotationRules option:
✕
Options[CloudGet["https://wolfr.am/L9rx8Mxe"], AnnotationRules] 
You can always give all annotations as a setting for this option.
A major complexity with annotations is when in a computation they should be preserved—or combined—and when they should be dropped. We always try to keep annotations whenever it makes sense:
✕
TransitiveReductionGraph[CloudGet["https://wolfr.am/L9rBdIZt"]] 
Annotations are something quite general, that apply not only to graphs, but to an increasing number of other constructs too. But in Version 12.1 we’ve added something else that’s specific to graphs, and that handles a complicated case there. It has to do with multigraphs, i.e. graphs with multiple edges between the same vertices. Take the graph:
✕
Graph[{1 > 2, 1 > 2}] 
How do you distinguish these two edges? It’s not a question of annotation; you actually want these edges to be distinct, just like the vertices in the graph are distinct. Well, in Version 12.1, you can give names (or “tags”) to edges, just like you give names to vertices:
✕
EdgeTaggedGraph[{1 > 2, 1 > 2} > {a, b}] 
In the edge list for this graph the edges are shown “tagged”:
✕
EdgeList[%] 
The tags are part of the edge specification:
✕
InputForm[%] 
But back to annotations. Another kind of structure that can be annotated just like graphs is a mesh. This is saying to annotate dimension0 boundary cells with a style:
✕
Annotate[{MengerMesh[2], {0, "Boundary"}}, MeshCellStyle > Red] 
A completely different kind of structure that can also use annotations is audio. This annotates an Audio object with information about where there’s voice activity in the audio:
✕
AudioAnnotate[ExampleData[{"Audio", "MaleVoice"}], "Voiced"] 
This retrieves the value of the annotation:
✕
AnnotationValue[%, "Voiced"] // TimelinePlot 
We’ll be rolling out annotations in lots of other things too. One that’s coming is images. But in preparation for that, in Version 12.1 we’ve added some new capabilities to HighlightImage.
Use machine learning to find what’s in the picture:
✕
ImageBoundingBoxes[CloudGet["https://wolfr.am/L9qz1zu4"]] 
Now HighlightImage can use the annotation information:
✕
HighlightImage[CloudGet["https://wolfr.am/L9qz1zu4"], %] 
Nothing has been a big success:
✕
{a, b, Nothing, c, Nothing} 
Before Nothing, you always had to poke at a list from the outside to get elements in it deleted. But Nothing is a symbolic way of specifying deletion that “works from the inside”.
Pretty much as soon as we’d invented Nothing, we realized we also wanted another piece of functionality: a symbolic object that would somehow automatically disgorge its contents into a list. People had been using idioms like Sequence@@… to do this. But Sequence is a slippery construct, and this idiom is fragile and ugly.
The functionality of our autoinserter was easy to define. But what were we going to call it? For several years this very useful piece of functionality languished for want of a name. It came up several times in our livestreamed design reviews. Every time we would discuss it for a while—and often our viewers would offer good suggestions. But we were never happy with the name.
Finally, though, we decided we had to solve the problem. It was a painful naming process, culminating in a 90minute livestream whose net effect was a change in one letter in the name. But in the end, we’re pretty happy with the name: Splice. Splice is a splice, like for film, or DNA—and it’s something that gets inserted. So now, as of Version 12.1 we have it:
✕
{a, b, Splice[{x, y, z}], c, d} 
Of course, the more common case is something like:
✕
{a, b, x, c, d} /. x > Splice[{p, q, r}] 
There’s a lot of strange (and potentially buggy) Flatten operations that are going to be avoided by Splice.
One of the things we’re always trying to do in developing Wolfram Language is to identify important “lumps of computation” that we can conveniently encapsulate into functions (and where we can give those functions good names!). In Version 12.1 there’s a family of new functions that handle computations around subsets of elements in lists:
✕
SubsetCases[{a, b, a, b, a, c}, {x_, y_, x_}, Overlaps > True] 
I must have written special cases of these functions a zillion times. But now we’ve got general functions that anyone can just use. These functions come up in lots of places. And actually we first implemented general versions of them in connection with semanticquerytype computations.
But on the theory that any sufficiently welldesigned function eventually gets a very wide range of uses, I can report that I’ve recently found a most unexpected but spectacular use for SubsetReplace in the context of fundamental physics. But much more on that in a little while…
Talking about physics brings me to something else in 12.1: new functions for handling time. DateInterval now provides a symbolic representation for an interval of time. And there’s an interesting algebra of ordering that needs to be defined for it. Which includes the need for the symbols InfinitePast and InfiniteFuture:
✕
Today < InfiniteFuture 
We’re always working to make the Wolfram Language easier and more elegant to use, and Version 12.1 contains the latest in an idea we’ve been developing for symbolic functional programming. If you think of a builtin function as a verb, what we’re adding are adverbs: constructs that modify the operation of the verb.
A first example is OperatorApplied. Here’s the basic version of what it does:
✕
OperatorApplied[f][x][y] 
Why is this useful? Many functions have “operator forms”. For example, instead of
✕
Select[{1, 2, 3, 4}, PrimeQ] 
you can say
✕
Select[PrimeQ][{1, 2, 3, 4}] 
and that means you can just “pick up” the modified function and do things with it:
✕
Map[Select[PrimeQ], {{6, 7, 8}, {11, 12, 13, 14}}] 
or (using the operator form of Map):
✕
Map[Select[PrimeQ]][{{6, 7, 8}, {11, 12, 13, 14}}] 
OK, so what does OperatorApplied do? Basically it lets you create an operator form of any function.
Let’s say you have a function f that—like Select—usually takes two arguments. Well, then
✕
OperatorApplied[f][y] 
is a function that takes a single argument, and forms f[x,y] from it:
✕
OperatorApplied[f][y][x] 
OperatorApplied allows for some elegant programming, and often lets one avoid having to insert pure functions with # and & etc.
At first, OperatorApplied may seem like a very abstract “higherorder” construct. But it quickly becomes natural, and is particularly convenient when, for example, one has to provide a function for something—like as a setting for an option, the first argument to Outer, and so on.
By default, OperatorApplied[f][y] creates an operator form to be applied to an expression which will become the first argument of f. There’s a generalized form in which one specifies exactly how arguments should be knitted together, as in:
✕
OperatorApplied[f, 4 > {3, 2, 1, 4}][x][y][z][u][v] 
CurryApplied is in a sense a “purer” variant of OperatorApplied, in which one specifies up front the number of arguments to expect, and then (unless specified otherwise) these arguments are always used in the order they appear. So, for example, this makes a function that expects two arguments:
✕
CurryApplied[f, 2][x][y] 
✕
CurryApplied[f, 2][x][y][z][u][v] 
Needless to say—given that it’s a purer construct—CurryApplied is itself curryable: it has an operator form in which one just gives the number of arguments to expect:
✕
CurryApplied[2][f][x][y][z][u][v] 
In Version 12.1, there’s another convenient adverb that we’ve introduced: ReverseApplied. As its name suggests, it specifies that a function should be applied in a reverse way:
✕
ReverseApplied[f][x, y, z] 
This is particularly convenient when you’re doing things like specifying sorting functions:
✕
Sort[{5, 6, 1, 7, 3, 7, 3}, ReverseApplied[NumericalOrder]] 
All of this symbolic functional programming emphasizes the importance of thinking about symbolic expressions structurally. And one new function to help with this is ExpressionGraph, which turns the tree structure (think TreeForm) of an expression into an actual graph that can be manipulated:
✕
ExpressionGraph[{{a, b}, {c, d, e}}] 
✕
ExpressionGraph[{{a, b}, {c, d, e}}, VertexLabels > Automatic] 
While we’re talking about the niceties of programming, one additional feature of Version 12.1 is TimeRemaining, which, as the name suggests, tells you how much time you have left in a computation before a time constraint hits you. So, for example, here TimeConstrained said the computation should be allocated 5 seconds. But after the Pause used about 1 second, there was a little less than 4 seconds remaining:
✕
TimeConstrained[Pause[1]; TimeRemaining[], 5] 
If you’re writing sophisticated code, it’s very useful to be able to find out how much “temporal headroom” you have, to see for example whether it’s worth trying a different strategy, etc.
In using the Wolfram Language the emphasis is usually on what the result of a computation is, not why it is that. But in Version 11.3 we introduced FindEquationalProof, which generates proofs of assertions given axioms.
AxiomaticTheory provides a collection of standard axiom systems. One of them is an axiom system for group theory:
✕
axioms = AxiomaticTheory[{"GroupAxioms", "Multiplication" > p, "Identity" > e}] 
This axiom system is sufficient to allow proofs of general results about groups. For example, we can show that—even though the axioms only asserted that e is a right identity—it is possible to prove from the axioms that it is also a left identity:
✕
FindEquationalProof[p[e, x] == x, axioms] 
This dataset shows the actual steps in our automatically generated proof:
✕
Dataset[%["ProofDataset"], MaxItems > {6, 1}] 
But if you want to prove a result not about groups in general, but about a specific finite group, then you need to add to the axioms the particular defining relations for your group. You can get these from FiniteGroupData—which has been much extended in 12.1. Here are the axioms for the quaternion group, given in a default notation:
✕
FiniteGroupData["Quaternion", "DefiningRelations"] 
To use these axioms in FindEquationalProof, we need to merge their notation with the notation we use for the underlying group axioms. In Version 12.1, you can do this directly in AxiomaticTheory:
✕
AxiomaticTheory[{"GroupAxioms", "Quaternion", "Multiplication" > p, "Identity" > e}] 
But to use the most common notation for quaternions, we have to specify a little more:
✕
AxiomaticTheory[{"GroupAxioms", "Quaternion", <"Multiplication" > p, "Inverse" > inv, "Identity" > e, "Generators" > {i, j}>}] 
But now we can prove theorems about the quaternions. This generates a 54step proof that the 4th power of the generator we have called i is the identity:
✕
FindEquationalProof[p[i, p[i, p[i, i]]] == e, %] 
In addition to doing mathematical proofs, we can now use FindEquationalProof in Version 12.1 to do general proofs with arbitrary predicates (or, more specifically, general firstorder logic). Here’s a famous example of a syllogism, based on the predicates mortal and man. FindEquationalProof gives a proof of the assertion that Socrates is mortal:
✕
FindEquationalProof[ mortal[socrates], {ForAll[x, Implies[man[x], mortal[x]]], man[socrates]}] 
I think it’s pretty neat that this is possible, but it must be admitted that the actual proof generated (which is 53 steps long in this case) is a bit hard to read, not least because it involves conversion to equational logic.
Still, FindEquationalProof can successfully automate lots of proofs. Here it’s solving a logic puzzle given by Lewis Carroll, that establishes (here with a 100step proof) that babies cannot manage crocodiles:
✕
FindEquationalProof[ Not[Exists[x, And[baby[x], manageCrocodile[x]]]], {ForAll[x, Implies[baby[x], Not[logical[x]]]], ForAll[x, Implies[manageCrocodile[x], Not[despised[x]]]], ForAll[x, Implies[Not[logical[x]], despised[x]]]}] 
The Wolfram Language knows about many things. One of them is geography. And in Version 12.1 we’ve substantially updated and expanded our sources of geographic data (as well as upgrading our serverbased algorithms). So, for example, the level of detail available in typical maps has increased substantially:
For many years now we’ve had outstanding geodetic computation in the Wolfram Language. And we also have excellent computational geometry for doing all sorts of computations on regions in Euclidean space. But of course the Earth is not flat, and one of the achievements of Version 12.1 is to bring our regioncomputation capabilities to the geo domain, handling nonflat regions.
It’s an interesting exercise in geometry. We have things like the polygon of the United States defined in geo coordinates—as a latlong region on the Earth. But to use our computational geometry capabilities we need to make it something purely Euclidean. But we can do that by using our geodesy capabilities to embed it in full 3D space.
So now we can just compute the centroid of the region that is the US:
✕
RegionCentroid[Polygon[Entity["Country", "UnitedStates"]]] 
That third element in the geo position is a depth (in meters), and reflects the curvature of the US polygon. And, actually, we can see this directly too:
✕
DiscretizeRegion[Entity["Country", "UnitedStates"]["Polygon"]] 
This is a 3D object, so we can rotate it to see the curvature more clearly:
We can also work the other way around: taking geo regions and projecting them onto a flat map, then computing with them. One knows that Greenland looks very different sizes with different map projections. Here’s its “map area” in the Mercator projection (in units of degreessquared):
✕
Area[GeoGridPosition[Entity["Country", "Greenland"]["Polygon"], "Mercator"]] 
But here it is (also in degreessquared) in an areapreserving projection:
✕
Area[GeoGridPosition[Entity["Country", "Greenland"]["Polygon"], "CylindricalEqualArea"]] 
And as part of the effort to make “geo everything”, Version 12.1 also includes GeoDensityPlot and GeoContourPlot.
Every second of every day there is new data flowing into the Wolfram Knowledgebase that powers WolframAlpha and Wolfram Language. Needless to say, it takes a lot of effort to keep everything as correct and up to date as possible. But beyond this, we continue to push to cover more and more domains, with the goal of making as many things in the world as possible computable.
I mentioned earlier in this piece how we’re extending our computational knowledge by curating one particular new domain: different types of data structures. But we’ve been covering a lot of different new areas as well. I was trying to think of something as different from data structures as possible to use as an example. I think we have one in Version 12.1: goat breeds. As people who’ve watched our livestreamed design reviews have commented, I tend to use (with a thought of the Babylonian astrologers who in a sense originated what is now our scientific enterprise) “entrails of the goat” as a metaphor for details that I don’t think should be exposed to users. But this is not why we have goats in Version 12.1.
For nearly a decade we’ve had some coverage of a few million species. We’ve gradually been deepening this coverage, essentially mining the natural history literature, where the most recent “result” on the number of teeth that a particular species of snail has might be from sometime in the 1800s. But we’ve also had a project to cover at much greater depth those species—and subspecies—of particular relevance to our primary species of users (i.e. us humans). And so it is that in Version 12.1 we’ve added coverage of (among many other things) breeds of goats:
✕
Entity["GoatBreed", "OberhasliGoat"]["Image"] 
✕
EntityList[ EntityClass["GoatBreed", "Origin" > Entity["Country", "Spain"]]] 
It may seem a long way from the origins of the Wolfram Language and Mathematica in the domain of mathematical and technical computing, but one of our great realizations over the past thirty years is just how much in the world can be put in computable form. One example of an area that we’ve been covering at great depth—and with excellent results—is food. We’ve already got coverage of hundreds of thousands of foods—packaged, regional, and asyou’dseeitonmenu. In Version 12.1 we’ve added for example computable data about cooking times (and temperatures, etc.):
✕
Entity["FoodType", "Potato"][ EntityProperty["FoodType", "ApproximateCookingTimes"]] 
Books have ISBNs. Chemicals have CAS numbers. Academic papers have DOIs. Movies have ISANs. The world is full of standardized identifiers. And in Version 12.1 we’ve introduced the new symbolic construct ExternalIdentifier as a way to refer to external things that have identifiers—and to link them up, both among themselves, and to the entities and entity types that we have built into the Wolfram Language.
So, for example, here’s how my magnum opus shows up in ISBN space:
✕
ExternalIdentifier["ISBN10", "1579550088"] 
Right now we support 46 types of external identifiers, and our coverage will grow broader and deeper in the coming years. One particularly nice example that we’re already covering in some depth is Wikidata identifiers. This leverages both the structure of our builtin knowledgebase, and the work that we’ve done in areas like SPARQL support.
Let’s find our symbolic representation for me:
✕
\!\(\*NamespaceBox["LinguisticAssistant", DynamicModuleBox[{Typeset`query$$ = "stephen wolfram", Typeset`boxes$$ = TemplateBox[{"\"Stephen Wolfram\"", RowBox[{"Entity", "[", RowBox[{"\"Person\"", ",", "\"StephenWolfram::j276d\""}], "]"}], "\"Entity[\\\"Person\\\", \\\"StephenWolfram::j276d\ \\\"]\"", "\"person\""}, "Entity"], Typeset`allassumptions$$ = {}, Typeset`assumptions$$ = {}, Typeset`open$$ = {1}, Typeset`querystate$$ = {"Online" > True, "Allowed" > True, "mparse.jsp" > 0.488214`6.140155222562331, "Messages" > {}}}, DynamicBox[ ToBoxes[AlphaIntegration`LinguisticAssistantBoxes["", 4, Automatic, Dynamic[Typeset`query$$], Dynamic[Typeset`boxes$$], Dynamic[Typeset`allassumptions$$], Dynamic[Typeset`assumptions$$], Dynamic[Typeset`open$$], Dynamic[Typeset`querystate$$]], StandardForm], ImageSizeCache > {117., {7., 16.}}, TrackedSymbols :> {Typeset`query$$, Typeset`boxes$$, Typeset`allassumptions$$, Typeset`assumptions$$, Typeset`open$$, Typeset`querystate$$}], DynamicModuleValues :> {}, UndoTrackedVariables :> {Typeset`open$$}], BaseStyle > {"Deploy"}, DeleteWithContents > True, Editable > False, SelectWithContents > True]\) 
Now we can use the WikidataData function to get my WikidataID:
✕
WikidataData[Entity["Person", "StephenWolfram::j276d"], "WikidataID"] 
✕
InputForm[%] 
Let’s ask what Wikidata classes I’m a member of:
✕
WikidataData[Entity["Person", "StephenWolfram::j276d"], "Classes"] 
Not that deep, but correct so far as I know.
There’s lots of data that’s been put into Wikidata over the past few years. Some of it is good; some of it is not. But with WikidataData in Version 12.1 you can systematically study what’s there.
As one example, let’s look at something that we’re unlikely to curate in the foreseeable future: famous hoaxes. First, let’s use WikidataSearch to search for hoaxes:
✕
WikidataSearch["hoax"] 
Hover over each of these to see more detail about what it is:
✕
WikidataSearch["hoax"] 
OK, the first one seems to be the category of hoaxes. So now we can take this and for example make a dataset of information about what’s in this entity class:
✕
WikidataData[ EntityClass[ ExternalIdentifier["WikidataID", "Q190084", <"Label" > "hoax", "Description" > "deliberately fabricated falsehood made to masquerade as the truth">], All], "WikidataID"] 
We could use the Wikidata ExternalIdentifier that represents geo location, then ask for the locations of these hoaxes. Not too many have locations given, and I’m pretty suspicious about that one at Null Island (maybe it’s a hoax?):
✕
GeoListPlot[ Flatten[WikidataData[ EntityClass[ ExternalIdentifier["WikidataID", "Q190084", <"Label" > "hoax", "Description" > "deliberately fabricated falsehood made to masquerade as the \ truth">], All], ExternalIdentifier["WikidataID", "P625", <"Label" > "coordinate location", "Description" > "geocoordinates of the subject. For Earth, please note that \ only WGS84 coordinating system is supported at the moment">]]]] 
As another example, which gets a little more elaborate in terms of semantic querying, let’s ask for the opposites of things studied by philosophy, giving the result as an association:
✕
WikidataData[ EntityClass[All, ExternalIdentifier["WikidataID", "P2579", <"Label" > "studied by", "Description" > "subject is studied by this science or domain">] > ExternalIdentifier["WikidataID", "Q5891", <"Label" > "philosophy", "Description" > "intellectual and/or logical study of general and fundamental \ problems">]], ExternalIdentifier["WikidataID", "P461", <"Label" > "opposite of", "Description" > "item that is the opposite of this item">], "Association"] 
You have an image of a molecular structure diagram, say from a paper. But how can you get the molecule it represents in a computable form? Well, with Version 12.1 all you need do is use MoleculeRecognize:
✕
MoleculeRecognize[CloudGet["https://wolfr.am/L9rL9B2K"]] 
It’s the analog of TextRecognize, but for molecules. And what it produces is a Wolfram Language symbolic representation of the molecule. So, for example, you can then generate a 3D structure:
✕
mol = MoleculeRecognize[CloudGet["https://wolfr.am/L9rL9B2K"]]; 
✕
MoleculePlot3D[mol] 
Or you can compute the distribution of torsion angles of the structure:
✕
Histogram[MoleculeValue[mol, "TorsionAngle"], 360] 
You can also connect to the world of external identifiers:
✕
MoleculeValue[mol, "PubChemCompoundID"] 
But what’s really useful about MoleculeRecognize is that it can be used programmatically. Take all the images of chemicals from a paper, “molecule OCR” them—then do things like check whether the molecules are equivalent, or make a word cloud of their 3D structures:
✕
WordCloud[ MoleculePlot3D /@ DeleteDuplicates[MoleculeRecognize[{\!\(\* GraphicsBox[ TagBox[RasterBox[CompressedData[" 1:eJzt3Qm4VVX5BvBSTGwSM8vUTEzTUjOHDNEyVDSaQ8kUS0HAqBwCC9RSaZJM Tc1GrTSFQrFBDQQtpcxyaLCyOacsxyybbF5/f+v/LJ7t6XI498K5Z59zv/d5 Tsa955y799rrXd/7DetbIycfNX7aGo95zGNmDn/kf8ZPmjVmxoxJx+434pF/ TDhy5vTDj5w6ZdyRx0w9fOqMUZPXfOSH8x953fvIa9gjrxQIBAKBQCAQCAQC gUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAg EAi0gH//+9/pb3/7W/rNb36Tbrnllvy69dZb00MPPZT+85//dPryAoEhCxy8 6aab0oIFC9LZZ5+dZs2alSZPnpxfRx99dDrzzDPTV77ylfTTn/40Pfzww52+ 3EBgSOHOO+9M5513XjrggAPSNttskzbccMO07rrrpic+8Yn59eQnPzltvPHG aeedd07Tp09PixYtSg8++GCnLzsQGBK4//7701lnnZVe8IIXZD4OGzYsbbLJ JmnXXXdN48aNS/vuu2964QtfmJ7+9Kenxz3ucWm99dZLY8eOTQsXLkx//vOf O335gUBPg9950UUXZT6utdZa2Xbutttuac6cOenLX/5y+s53vpO+9a1vZT4e f/zxaaeddkrDhw9P66yzTnrVq16VvvnNb4aPGgi0ET/4wQ/SG97whsw7NvS1 r31t5uY999yT+fvPf/4z/eMf/0h//etf0913350uuOCC9JKXvCStvfbamc94 e++993b6NgKBnoT47TnnnJM233zzpO3wqFGjluvX//73v//zfj/74x//mD75 yU+mrbfeOj32sY9No0ePTkuXLu3A1QcCvY8//OEPaebMmdmGsov+/+9+97um n8HTX//61+nQQw/Nvilbesopp2Q7GwgEVi9+9rOfpQkTJmR7KGZ77rnnZtu6 MtC/c+fOTeuvv37+7BFHHJF++9vfDsIVBwJDC1dffXXaY489luvcJUuWtPzZ 888/P2255Zb5s/I1P/7xj9t4pYHA0MTixYszN/Hsla98Zbrhhhta/qxaBjFe nx0zZkxatmxZG680EBia+PrXv77cju65557pG9/4RsufvfDCC3PcqPD7xhtv bOOVBgJDE3KfL3vZyzLP1BZ98YtfbOlzfNYPfvCD6SlPeUr+7GGHHZZuu+22 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 nXdemjhxYq4/kAviC6utsBbccccd/1NPISbE3rKdahfoWlrYZ+bNm5evudOx rkBgsIBHagJxyT6YffbZJ2tfelIsh/4Vd+1vLQAbt2TJkpyXVfvObuKZ73R+ ON+4MV5rPWAf9UJjb2lh17LnnnvmOt2+ahcCgaEC8159wxVXXJH9Rb5fqb2j Ndkv9emt1D+Ix4pN7b333lmf4udee+2VuadOmF/aqGvFhNRd2FPnb6otEhti 3xctWpT/dujawFAH/qkToD/Vw4qhbrXVVpljciJymPIbfMdmXBWTYgf5uKX2 ffHixbl2tsoz+vaBBx7I68LMmTPT9ttvn2O84rXqjORY7A+t1i4EAoH/5yr9 q8aB7Rs7dmyufdhoo41ynQDdSZOuSP/Ke6q1ZY/V4/k3nlV9TraUhnZ2GxtL 14oL4fapp56afWEx6KhDCARWjKJ/1arPnj07x29oUHaOX+lMJ/mSxviNf9Om YsO4XvUfcU5NLhu5//775++iqdUWz5gxI1111VVRhxAI9ANF/6p9XbBgQa6n pV/xSq5G3YEaJnmSqs3zuSrH/H/7WEu9k5p3Gtp32GvGF2Vvow4hEBgYSvzX +Z5yKfanqt+T61QLrCaCH9pXrRKbKu4jn6N2QS6FrnXmQ6mvFa8NXRsIrDpw FZ/0/OKX0qv2muCrGkO1P0X/lvpD78NjfObTqpfnq1brawOBwOoFDorTqtNT z77TTjtl+4ivkyZNyrnWM844I02ZMiXnUOw1UyPB51THr1d16NpAoL3AL1yV 23TesDpCNfKlDpdtLTVCBx98cPY5xYsaa3IDgUB7UfTvzTffnGO9fFW9QXGT /pVLiRqhQKDzEPOhf/mqdC6+0sLiueFzBgL1QNG/4rvsZjf0HwwEAoFAIBAI BAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKB QCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUCg2/F/bm+/Rg== "], {{0, 166.}, { 233., 0}}, {0, 255}, ColorFunction>RGBColor, ImageResolution>72], BoxForm`ImageTag["Byte", ColorSpace > "RGB", Interleaving > True], Selectable>False], DefaultBaseStyle>"ImageGraphics", ImageSize>Automatic, ImageSizeRaw>{233., 166.}, PlotRange>{{0, 233.}, {0, 166.}}]\), \!\(\* GraphicsBox[ TagBox[RasterBox[CompressedData[" 1:eJzt3Qm8pWMdB3BbkrZJlKJEUVKKRqgQ2caEzDSUtZkYkQyzYWYoCQmlkdRM JaVNG7JFImU3pdFqaZH2sqRN25Pv4/Ncr+OuM/eee973/H+fzzHjzjnnvs/7 Pv/t91+etadMmzB1uWWWWWbGSg/9Z8LkI7aePn3yURPHPPQ/kw6dcdCBhx6w /7hDZx5w4AHTN5uy/EM/PPuh1zLLLrPMCg/9kQKBQCAQCAQCgUAgEAgEAoFA IBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUBgCfHf//43Pfjg g+mf//xnfv373/8e9Of+9a9/pf/85z8jfIUjh//97395DWXt/u5nTYdnZ71/ +ctf0j333JNf9913X/r73/+e/y3QbHjGDzzwQPrNb36TfvKTn6Qbb7wxXXPN Nfm1ePHidPfdd6d77703y0NvICPec/PNN6c77rgj/eMf/+j39/meP/7xj+mX v/xl+t3vfjfg+0cSrt0+//3vf5+vfdGiRT1r/973vpd+/vOf52slH00DXX3/ /fen22+/PV133XXpvPPOS2effXZ+ff7zn0/f/OY3837485//3OezD9Qb9v7P fvazdOGFF6bjjz8+ve1tb0t77LFH2m233fJr8uTJ6Zhjjkmf+tSn0ve///2s J1pt4t/+9rf873vuuWd617velX7wgx/0+zvJmj02Y8aMNH/+/LzHRgNkms67 6qqr0qmnnpoOPfTQtNdee/WsfZ999kmzZ89OZ555ZpYPdrEp9tBzv/POO9OX vvSlNHPmzPTGN74xbbXVVukVr3hF2njjjdPmm2+eXv/616e3v/3t6eMf/3h+ pj4TaA48z29/+9tp7ty56XWve11aY4010lOf+tS02mqrpWc+85lplVVWSU95 ylPy38eOHZsOOeSQ9PWvfz37AlUd8Ktf/Sq99a1vTcsvv3xaf/3107nnntvv 7yXv5GzllVdOW265Zf7OdoM9o8/IPVlfe+2105gxY9LTn/70vF5/Wvuqq66a XvziF2dd8LnPfS79+te/rr0OsHY+3rx589JrXvOavMYnP/nJ6VnPelZ6/vOf n+/F6quvntfv9fKXvzxNnz4975XQAc2AuP6GG27Icmu/P/7xj8/P33444IAD 0qxZs9KUKVPS1ltvnffDE57whCwTEyZMyL7CX//6157vIs98BuPOnv3sZ2d7 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 T1QDghMTF5V8nhqTuug3elqOAi+J38R1FIT8dweqssnus99DiVMHU/9TzrH3 Hryg+LIuIOO9yT/7717Jm+GExYv4ozrY/AL+Pn+Oz9d65nbIf3dgsPn/vjAY +Rcjqw3wHrnUTqiLHizIvzncrfJf8kby32qd6lj/Qc+reZPXUIOsL7Ag5L87 0A7518dWfkfd4n+5MLkLnB4/pmlg//EXrWdu0mulriPkv7loh/yXc+zrKP/s o5ofHKjahaahyL/8hjrAgir/H/LfXLRD/tW8sS91lH91O0X+S29Ek6CGV62C XD8+o8C8MP0cnpk+PzU/geYBX60XFceFw67GuIOBHgC14urj1ITriW0FuRE/ e4/Zb62zbDsZJf+nbl+OrGkwl9Scklb51/+j1pH8q/3XzxBoHtSsql9Rw2se 8VDnd/ALyxku+sZ6qxPR9+O7vQfHVCeurPj/TY3/9b7w/1vlH2ejP5b8m+vS xDN3Aw/Pc1DDLw9M9ofay4UH1x8g70+X9CbbZVY9X6MdM+CGE/r3zEXRv2Te S9PAv1G/0Cr/agHUNEb8H+hmFPnHj1X58aZAXb8+l1b5j/xfIPCI/Jt7YCZS 06BWWU93q/wH/x8IPCL/epjVQTcNJf/XKv/iwVKzFfIf6FYU+ZcbbWL+z5wS 8y5a5V/NpnxQyH+gm1Hkv7X+tymQu+mN/zMPqMx1CfkPdCuaLv9mXfaW/w/+ LxBovvz3Vf8T8h8IpDzPyOyjpsp/X/xfyH8gkHJNo7lnTZV/9X/mvoT8BwKP BfnAjzVV/vvi/0P+A4GH/WP20ex35/g0DSH/gUDfcCaG+R9mITsvqmko8h/z vwKBx8J5BeZ/sY9Nln85AGeXFIT8BwKPzP9tav9vkX/n4OoFKAj5DwRSWrBg QZ6P23T+T39DzP8MBB6Ncv5X0+VfD6A5bQUh/4FASqeffnqWj0033TRdcskl o305ww7rW3311bP/7yz7gqr8O7/RmYeBQLfhxBNPzPwffrw6H7cpKPV/7L/z zAuq8u88Y2e+BQLdhsL/m1/c2v9vVprz85xnZMZZHVH4jf7if2eD3XHHHaN4 lYHA6MB8PP6x808vvvjinp+bYWhGNvuph+7666/PMXLdzoZ3pvG66677mPkm Vfk3/9dZ7oFAt0FMvM466zyG/2Pvzc5zrqGzAfbZZ5/cS0dunA1al/OizTQf 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 "], {{0, 161.}, { 256., 0}}, {0, 255}, ColorFunction>RGBColor, ImageResolution>72], BoxForm`ImageTag["Byte", ColorSpace > "RGB", Interleaving > True], Selectable>False], DefaultBaseStyle>"ImageGraphics", ImageSize>{60.703125, Automatic}, ImageSizeRaw>{256., 161.}, PlotRange>{{0, 256.}, {0, 161.}}]\), \!\(\* GraphicsBox[ TagBox[RasterBox[CompressedData[" 1:eJzt3Qnc5WP5P/CxDYMaKlmSopJSoexNRAijaFCaUo0YScY0QzUZTIORJYwR UilKNWSyJHtE0jYyEaN916Z90fr9ed+v1z3/2/mfZ5s5Z875nnN9Xq/DM89z nvOc5Xt/7uv6XJ/rujc+5OgJk1ccNWrU9NUe+8+ESe/eZdq0STP2X+uxfxw4 ZfoRh0857NC9phxz2OGHTdv+kJUe++bdj93WW2HUqJUf+38VCAQCgUAgEAgE AoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFA IBAIBAKBQCAQCAQCgUAgUFP873//q/7973+nm68DgUCgVfjLX/5S3XvvvdWi RYvS14FAINAqPPTQQ9X06dOrww47rPra174WMUwgEGgZFi9eXB1wwAHVBhts UF1wwQXV3//+904/pUAg0CP4zW9+U02ePLladdVVUwzz/e9/v9NPKRAI9Aj+ 8Y9/VLNnz67WXnvtaty4cdUtt9zS6acUCAR6BPSW+fPnVy984Qurddddt7ro oouq//znP51+WoFAoEfwzW9+sxo/fnw1evToasaMGdUjjzzS6acUCAR6BA8/ /HB1xBFHJA1m4sSJ1QMPPNDppxQIBHoE//rXv6q5c+dWT3va06qXvvSl1c03 3xx16kAg0DLgFPruhhtumDSYf/7zn51+SoFAoEfwwx/+sDr44IOrMWPGVNOm TUs5UyAQCLQC6tSzZs2q1lprrWqfffapvv71r3f6KQUCgR7CJz7xieq5z31u 9fznP7+64oorqv/+97+dfkqBQKBHoP/ola98ZfXEJz6xOuOMM6JXIBAItAy/ //3vq6OOOirVqY855pjUOxAIBAKtgJr0Bz7wgWqdddZJPY/mNgQCgUCrcOml l1abbrpp9aIXvai66qqrwgcTCARahi996UvVy1/+8hTDnHvuuamuFAgEAq3A T3/602rSpEnJB/OOd7yj+slPftLppxQIBHoE4pX3v//91VOf+tRq7733rr76 1a92+ikFAoEeAb2F7vKSl7ykes5znlNdfvnlocEEAoGWYeHChdWrXvWqavXV V69OO+200GACgUDLwPdy9NFHV2ussUaamfmjH/2o008pEAj0CJyFZNb3M5/5 zGqXXXZJNaVAIBBoFcxrMAsGx3zsYx9LM2ICgUCgFXCOwOtf//qkwegV+OUv f9nppxQIBHoENN0TTjihGjt2bNJ6zegNBAKBVkGvgHkNzhZYsGBBzGsIBAIt w+233556BcycOv300+N86kAg0DKYmfnGN76xWmWVVdL5AtErEAgEWgXzpWgw 5k1Fr0AgEGg1PvKRj1Qbb7xx0mHmzZtX/eAHP6h++9vfVn/961+TTyYQCASW FjfddFPywein3nbbbaspU6ZUH/zgB5Pe++Uvf7l68MEHq5///OfVn//85zhX NhAIjAjmNbz5zW+uVlxxxXR+rPOR1JO23nrrarfddktnmpx00kmpD/IrX/lK tXjx4uSVkVvpi4zeyEAgMBD4YI477rjUiySG2WabbVJNafPNN095kzMfN9lk k2qrrbaqdt999+otb3lLmu/w+c9/Pnlm8M2vfvWr6m9/+1vKp4JvAoFABs/L mWeemebZbbTRRqmf+otf/GI6y+Tkk09OHl+xzDOe8YxqvfXWq9Zff/3q2c9+ duKhvfbaqzr00EPTWQRmPtx5552Jb+g3+CbyqUCgv/HII49UM2fOrJ785Cen GEVcIg6ht9BdzAC/+uqrE+8ceeSR1X777Zdmx4htNthggxTfmCPje7vuumv1 tre9rTrvvPOqa665Jp3h9t3vfndJPhUIBPoHziv59Kc/Xb3sZS9LuRHu+MY3 vvH/5ThyKBwhNnGG0pVXXlmdddZZSQvWWyC+edaznpVm4olxzA/ffvvtq/Hj x1eTJ09O+dR1112Xfv9nP/tZ4rQ4/zoQ6E3gD9zymc98Jmkqa665ZupznDBh QvXZz362WrRoUfXjH/843aexr9rvyn1+/etfp9gE31x77bXV+eefn7gEVzkf 8ulPf3r1lKc8pVp33XWTfrPjjjumub8nnnhi9eEPf7i65ZZbUm0Kb/3xj39M fBPaTSBQb1jD4gdxC25Ze+21U+yCX3CCGrU45j3veU+a26BGjUcefvjhpp4Y j/foo49Wv/vd7xJf3HbbbdUnP/nJ5Ns76KCD0nyZLbfcMmk2ZkHIq/DPDjvs kLRieZc+KL/n98U3eC34JhCoF6xXs+suu+yyVHum6dJceHfVjF7wghckjRfP iDnUqf1M74D+JLENj6++AhzVzH9H06Xd6DWg3dxxxx1L8qlDDjmkGjduXPW8 5z0v6Tb+llzK33nFK16Rfi6+wWtmXsmnxDaBQKD7gRM+/vGPJy6hze68884p r7n77rtT/HDJJZdUp5xySjq3xHoXc/DDuPn6xS9+cfXqV7+6mj59evL9qhc9 8MADyfM7EN/gNNqufOr+++9Pc60uvvjixCNvetObEt/Qh3GNGpX4Rm0c/6lN yb3ETYHehOtDrCrnjhln9YTPUBwwf/78lK/ol3bOvX9b934u7nAfNaOHHnqo uuGGG1LMoWZEp3Xeo/wm84CYAwe84Q1vqKZOnVp96EMfSnzjd+VSerGb1adx kL/D1/ftb387+YcvvPDCasaMGanXkpdY7EQrxoFmX8V84N4EXvnFL36Rrhv+ BvscL1XwTL3wpz/9KX1+eILeIicSf9A5BoKakc9ajuJzl1PxyagZ4SaaipqR 2EauQ1PBXW9961tTLnXFFVek+jS+oakMxDeuJbEPDqEr33jjjdU555yTciXP V68CP02gd5D3O7n2qaeemnJw/obXvOY1aU/jE7fvBc90N3yOtBCeFpqtmEDc 4Yx7ccpw9dP8OOISWq/rghaj7qy3QM1os802S7GN2APX5OtFjiMXwjdq33hk sPq079OI5FL4CTeFT693INc1m/VTn/pU8m66XvTvq2E+6UlPSrmy6+bss89O +5prJT7/7gRO4Ds54IADki/Fmhcb0F6XtTYjX1Zbvu+++1KtWX40a9asdN7J HnvskTQU8Y2cKvcX0G7kOxdddNGSepHH8Dxjr+pt+Hx91q5H1wB/FP+CHJgG t//++yfNz/XC64lnDjzwwKTVfe9734szuroMcqLrr78+cYvP0fp2nv1I4pbh gqZin6Gp0Hvl0zwuatziG94Xuq26FO0m51K5l0mt3Cw9+RHuw11Rm+4NiD1c G3xS8maeCD0m8nS+TNcIznHmn76UOXPmpGvDfohn7Inu42fi59iHOg/1mi98 4QtpT+BvUwO2jtvBLc3gmqLtyIVouGpAcjJ1qT333DNxnXkz4htcoy6llrXv vvtW733ve1M+h2fiWqovXGf2OHvGRz/60ZQLiUl4Iuw18nU+BLXHHJvYp1yj +lGmTZuWtH48I++m0dD/8FTkTJ2Bz1R+K35Qi/HZWMuzZ89OOm2nYoKsFdN6 XR/4Q57GV7PPPvskT5/6Ny4U34h39DDx7AXqB35LvMEfTu9XexRDy33win5Y vig80eyazBoN3xRPOF8WXrInTZw4MfGVONn9Is5dfvjDH/6Q6r3yDjEoLdc6 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 NM73cXaK/V7vQB35RW/VwoULl5yRZw7APffc8zgPU6Cz6Hd+KeOXE0444XEe Vp5dvdPOXqzzfMxyfl0z/25d59eJU84888zUg+pzsgeEB7m7UPLLnnvu+bjz SfoBpf4iVyhnLM2fPz+dS63H0ZmKdcRg81/qzC9iF+eG2hOdzeV1lN7kQHeg 5Jd+9FiV/KJ/uuzxK/27vdB/xJ/drD5dR37Ry6Anc5111knzBS+77LKIXboQ /X5+QMkv6ps0iYxe89fJA2+//fYlPyvPV6sTv9ClzftyTvFaa61VTZky5XFz hQPdg5JfGuuzwKskZ+Bf6kXdrOQXPsNyxnWv8cs222xTXX/99Ut+5kxHczHV p+vEL2bwibVxC850Bl546roTvALZXydW5rcroZ/6kksuqa688sran2XfDCW/ WGulN8tr3nLLLVNvdV3rR3QKc23WWGON9DrvvPPOJT8r52PWxf/CP3D22Wen nnazS33Ngx7oTlhPzq3I9ctyPitYY7vuumuq4cp3b7jhhrTHl3XcOqPkF7P0 S2+W2pIzc/3c664rzCZ3tjgvXdkjXfYHyJO6Pccwm8dnQkd6whOekPbFe++9 t2fOQu9F4H4eiIH6G2n01hgPCC8IrnGOBx6ihdb9sy35pfH8DtwrduOzq7Pn XF+Rsyh9lrSLjFLfNcOw27V9s8+OPfbY1M++2WabJc29fD2B7gNdJfdPN8bP IEd3bZoPsummm6ac1//t9c4cu//++xPP1FGbwY36Vnbaaacla8zryTALxtr0 HpRzYeoGr1OffLkWfY/eUs5evvvuu7v2daoN8QtsvfXWKXZxzdZFL+pn4Jfp 06cnjY/HWp2vnHEN/s33edZZZ6UZrvJemoRzgSZPnpz82XSbOmkzYm0xybnn npv2QmtMbHbNNdf0RFw2GGih6oT2h3z2tvfgtNNOS3o/Huqm1++58OWaU2QO mP2AptsrOXovw2c0b968asMNN0yxiTPQL7/88hSLlp+ffU1/rfrm8ccfX+24 445prj7/wXbbbZe0GbGAmmc5w7bb4LmJSfhAeD/pSrRPa0wOKEfCsXXjy+GC PmrG94knnpi4xWfutetB4iNR67366quTDlXO2uok8J3PSi87Xff000+PWZ41 grVmBi8fmTXmutOLI1eyx5e1P1+rM6jdil1ck+q3Pnf6sP4yjyen6KacKecI 1tZ5552XciG+/7Fjx6bXzafLZ77++uunGJyXl16BU7uZL4cDr11+gTN9bnJb n5e9wfmU22+/fbXFFlukPcYaxrli2muvvTZpNJ18/fa1u+66K+Vv8qKJEyem nqNuurYCg0OOJC7hX3Vt6XPfZJNNEl+ImWn21lmOZ1yvfodWYW6kPX/zzTdP a9OatXbVcx988MG0B3Y61ra27MfydzG2nmhrC6/wT8yYMaO69NJLUx3Xv70O 60+/sX2zG/lyuLA+xaJ8L2YYyGm9PjyiH4lG6rP33tBO8+fvvdl5552Tlq9n xD7TiXzE33VdZp+unK5b4qrA8GENqk+qR/PZ2c9oLPrG1I9oLzQYvJL5wv/V n6w/c31yTCAG4ksTa9MzrO1OeLfFWvbfG2+8McUjO+ywQ+qzVX/IvKJ2Kx4T 2/AW0rI9b140r8PrwZ8XX3zxEr6sA3CB127eLo6gLYlPcEf2GuAVPYI+RzkI vXTBggXJZ7jVVlstef0+fzyrZuh9Wl77hfdavMWnu+aaa6bn1ejPCtQL+EOd UvxhXdnr6Sz0Pz4Z2gzPXVmLyJqG+sMZZ5yR+iTtjznWdn6gNU6bWR71CX9D vGHftbbEIZ4LvrQHqsfjPXzayHv0iewp5BHFr/Zy2jfekTPw/3RrzmTt81v7 LMSeehrV+3yG8iA9EIN5Jb1+cSk+Vbv2fvld14FZd/rI8dCjjz7a9teBz+RD 9gR631VXXdX2vxtoP+QB1qe9T31lv/32W7I+xQDibPu8uWGlNmPN5XjB/uh6 dm3KNXAOr6UYqJ31XnxhfWR+xA/0IToDfjST7r777hvUN5HXKG9MXqPyRfv/ LrvsUp166qlJE9Cr1E05k/3e/u415lhSLiR3NftTboE7yxi0GfLnr2ZjRqj+ ERzl9ftMzeGizXn97eJZ77/3Pu9T9q2yNyxQf7h26PS33XZbikFwi/jajQZs Xoqf0WZKvsi5Fk3DHijXkj+7RukfznLmY2ulNuOx8B1u4/O371pbNFvxC26z XuQDw+UE3Cn/zzUzcTq+xFk4x9rrBo3Jni63u+6661J8QmOxF4g5cKznKRbI udBwkf0/8l+6Pd8sb4LXj3M8rp9Z963cL+R2N998c/J7yovCp9vbcP3ii5yb yxVcv+IS1xxtxvXbeJ3ZgxYtWpTORZTDu7+c3toXA1kPtI9liXn9rnyFHwIH 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 A1Df "], {{0, 199.}, {280., 0}}, {0, 255}, ColorFunction>RGBColor, ImageResolution>72], BoxForm`ImageTag["Byte", ColorSpace > "RGB", Interleaving > True], Selectable>False], DefaultBaseStyle>"ImageGraphics", ImageSize>Automatic, ImageSizeRaw>{280., 199.}, PlotRange>{{0, 280.}, {0, 199.}}]\), \!\(\* GraphicsBox[ TagBox[RasterBox[CompressedData[" 1:eJztnQusbGdZ97lpiMZIjEai0bQNTdsUAxiVTwwoBCJEI0k/BJGQCLblolBD SwuFll7Ooff7/UZbCrQFwqUWhCIXobRQrhIUxYDFAu2BAsX7fT5+K/mt7z/v WbNn5uw9c2bOfv7J2jN7Zq0173rXev/v8zzvc9n/hUcdduRDHvSgBx398B/8 OewFxz35Fa94wav/7yN+8M/vvvzol7zo5Ucc/oyXH3PEi454xf954UN/8OH3 f7A9+sEPetDDfvA6KhQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoXC QvA///M/o//+7/8e+59N/O///u+Gm+AcfvZf//VfY+echv/4j//otmzDpPYN 7V8oFLYf4IDkhlk45z//8z97rtoTDP2GHAXvAc5N2/itPf2dQqGw/vjXf/3X /n0rV80COSWPc8vzTUL+TnsuAEcllP9mPX+hUNh3oHyUXAEX/Pu///vc52rP Mw+fID/927/929i5bEd7HvmqUChsT8AVe8JRyjvwFNyX3DKLPunxeRzc9c// /M9jNiraxm9oH2t/q1Ao7Pv4x3/8x14mYvz/y7/8S//drHzQ8g3v4ZfUNTc6 NnU+jss2KP8l+L+4qlDYnki5Cq7wf3lhow3ke+QfzjHP+l3y1QMPPNDret/+ 9rfHeAkZUJ2Rff7pn/5pD6+4UCisI+CW888/f/TSl750dMYZZ4x27tw5Ovnk k0dnn3326KSTThqdeuqpG26nnXba6IQTThideOKJo9e//vXdsa997WtHF154 4ejd7373TG1o+RJ873vfG1111VUjUuK4PfKRjxyde+65o+9///u7HVcoFLYH khMe/vCHd68PechDxj7faHvYwx42euhDHzr6sR/7se7/Bz/4wd3xfM7/v/3b vz360Ic+1Ot12KZA68OV4POzzjqrO5ftYYNbC4VVArqEeoBzqPqFvjh872et XrLRlnqK9hU+Yz7P32vtL2lTybUsxqDjL8+X52p/d5WA7QpO+KEf+qExDpqV r374h3+4f8855CmP53v3efaznz26/fbbx+xkrgPSDu328trll19efFVYaQzN t9g3Lrjggm7+Zkyw+d5x4fM8z/h6xCMe0f2PHoNu853vfKf/TbhHHlT/aNsG HzF+fvzHf7yXJWgXbW39hiZd2ypATkhZKftp2ka/c93JLcpp9A2vP/IjP9LL b3fdddeY7wKwb3i176688sriq8JagOeWZ9q5FnvIpPGi/jHL2GIstp8xhhin P/VTPzU67rjjxtakUq5StktZ6dJLL+3Oye//6I/+aHc+2go4B9ewqjwFuFZ5 nH7wGrJvN9rsT/ug5TllrZ/7uZ8bmy/uuOOOXv5sfT+181988cXFV4WVxpA/ DoAXkId4/nnmlWfmkQPSbsvYZM5XDthvv/3GzvfZz362k6scU6xFpd7JOOc7 xlSOWdpIW2e5plWBvGT/wFlXXHHFTOuD6sD0xXXXXTe67LLLRrfcckuny8lR 2rWYD9JGBuhH+D91b/kd3i++Kqw6GCe59sPzzDpU6h/KU44Bx5nfTdocK2mz +Ymf+Ind9EX2+9znPteNydRdtLMIuIljUragra2v4zzxv8sE1+L12jds8/CC Mmer46Ffv/zlL+/6Wn3QPqLPzznnnH5f+zV919Gri68K6wBtr3ID8728IM/w /o1vfOPozW9+8+jaa68dvelNb+r+32h7znOeM/rJn/zJnrOc+9l+5md+ptdh HLusawHGHmMy4014z/p6ax+jrUPXsKqwL5UT4ZaLLrqo9yffaDM2WY5BToKf 0//8iU98YtfPysRyF7+nbVDkuc4777ziq8JKo31+Bc9pq7fAWynHzGIncgwx LvBN/MxnPjP6gz/4g06PS1sW5+Yzxpq29zy/chc6C8cw9hzvk8bUpGvbm+Ca htb50HNnkQntk9ZXAcB3/k8fc251RH/zU5/6VOcX6nmS24uvCusAbe25xnbJ JZf0cpXrgjzLyjCz+gsoDxCHAtQ7n/nMZ/ZrWcoB/v+JT3xibBxlu9AH0zZN 22hr7rvqNvfkBK/FNYPNwn6De1qbI/x+5pln9lznPVSvhDOVxX76p3+6O/51 r3td9136PaS+bWxhC/1VvBetrFwo7AlyXKc/4aT1waF9pyHlBtf/4C98vF1r VFaCs04//fRunxwH/h7clOtovIfDGAuOnRyH6ljZDm35bW46f4/9F2n/WiRf yQ/f+ta3drMRwj/PetazevnVa/S6kaVomzZK7gk+Dn6fa7Xcx/e85z3d+u7x xx8/OuWUU0YvfvGLx+KLPM74xkJhs1g0XzF+Wn9Un3lsVK7ra9difkdmct/2 91q+Yl9sWsJjUheEn3JdzN/3NdcikyMXpU8ukq+yf9PHIddIzBMoX8nd2Ntb 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 Ozc2o4wjnKedxVebR/FVYZ0xy/qg4xjbdtaNmgXYuFvfBHXCedtZfLV5FF8V 1hnz6IPwVcZlzDOejcXZk7XxbFvx1eZQfFVYZ8wSP5j5XoaO29PfnSe2p/hq a1B8VVhnzOt/JeapP5jnt47dvHxXfLU1KL4qrDP2dH2w5YZltLP4avMoviqs M4qviq9E8VVh1VF8VXwliq8Kq47iq+IrUXxVWHUUXxVfieKrwqqj+Kr4ShRf FVYdxVfFV6L4qrDqKL5aLl9xbnKB4YebeRCXWZuPfmmvjbgpcq9+8pOfHH30 ox/t6qFRF4ecP8R7znq/9a2jRi45OTgX56Tu0Mc+9rGZ2kd+xbwH5AQBxseb hz+vx5rVhdWHueWyJkDmksx8wJP8PHk+zCnMvvCCOa6yhouYJ7fCZtDGHiaP Ms5pI231+riGeXKDeq5lXqN5v7g228q9mqemw2bAb7UxnDwXOeZ5pvhM/hnK UT2E9pyZj3+W4/0tNmpV3nLLLd09eexjH9vXWPQVZJv9rLC6GHrG87mQn4by A/s8+nmeE92greNCrr5Z6zptJawRRf6sc889t8urbE5h2khbW64Gs/CW12jN MmQf+ITrnLcW0KyAC8xXYXuRR5aF5ATntfZ/YW7lWWPU6bfN1Jm1viIgv1rm /bd2EXIg8J6z/6J098Ji4P1ybOczI8cwPqw9MHRc3ndqit9+++2dTM+GbvDB D36w+86cw4sazxvhG9/4xui2224b3XnnnZ3OQhtp69A1zPIMo6dwrjvuuKM7 V9ZpWASUB7gn2b5lyauJ5CmR+TeMn/Jez5ojOrkvn5V55N6nPvWpY3Y06whQ qzKhPL1M20Rhc3Ceyeeufbbe8IY3DB6TnMN9b+vAs59jyX0XVad9CPw2z6Sy Ps/lkNw/1PZZ+HSI0/iM616ELOm4sg+t5zOpLYv6/fazrR7vk+yi05DPLbXg 4Czr6bKR4xaZ+M1vfvNuNo69MX8W5kd7v7QZ8D95PcmVTk1ycqcDa7TnnN7q BnzneM1xlPPxrPXotgJtGwDcRBuVqYbkhWnIvnOsLPq5b7nQGljLkLEm8UbK RLSHtlhrZx6wvzHtQ+efBp4pjucVu/rpp5/e2xetEUndRWStt7zlLb1tvrhq PeA8rdwOXD/hnqPDaXvidb/99uvWadr7m89r+3nWrctxvQx5IO29rW2lHXuT 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 hefWjbMLhX0FKTede+65u+VGcTMnPHbldYqXbnVX/TV4Peigg8bWGbBRWW+Z +BrlKvzc5easCVkoFJaPlJUuuOCCsbwO6EXIG4xh4qRTzloH3kpdznUG3pun WD3YeCXseGeddVbv/zG0RjpUu6tQKCwe7Toi3HXRRReNreXnGiIyCUDmWIcc pXLLvffe26+PwrvmXWUdkGvjlevFnxaeQu/TVwReVpeEo4qnCoW9h7TrOEZ3 7NjRc5ZcpY7IK1iHeB3zT8FVcLM+65mvyv+pRSsHe22ZkzVz8FQ+40Jh+Whz yViTFZjbIWPm9HUgX906yFfam5CJzF2sbz/XYh1T5C8hF3l9+q/5f/mtFwqr CfP+pSxijIo2eGB9MbBsH29t6MAYb7mFV+rC45vBph+odnY+k6va/FXrID8W CoVxkNvBHCpyFz7gyCj4AiDDyA/LXutvfSrIQ6V/Pxu+VelPxntkQ2s1WnfD NUNQul6hsL5AbsK+rnx14IEH9nYs+Ivxb86t1KWW6Z+V+auU7ZCrtMHBr9Y7 02cBrjLGOe1UWRO7UCisD3LMEsMiZxmnoryFbkg+mvaYRUOfirRTwTesceqj gFylDyicRZtF5imEu1K2Kh+rQmE9oY3Z2juZDyrzlpLbAQ7Q12kZMBex9qes A6gPhu3Dj5/9U/8TrW9HoVBYL8hTjHHfM9Yzvs66C8ozF1988ZjNe5FIXoFv lPnSb931TNoF1FOtD885eD+pTmChUFgfZF1ixjZyDDJU8oFc5fobuuGybO/4 3MM7tIFN3/UDDjigb8+xxx7b7Zv1BNvchvAY+mWtCxYK6wl1rPTTMiYPPkq9 UG7wlbW5RUM7v7pf1v5R1jrjjDP6+hvKVvBS1ufItYH0ay8UCvsO4AE5wjoy +f7SSy/tOWFPa7S28S/WVxSuUWbco35i2N2tV5b+++uSW6JQKGwd9FtIn1L1 MXzHkXuI7RnCLOuI8ouykLnoQdZaZr0SfuL39FvIuoCtT2nlhCkUth8yVkWZ xvpXbsTBkPdB/YqcB/PwBXzY+pxfccUVnd4pN8FXmQMHpG8C65pp/y9dr1DY fnAdTb8nbEXasOCtlLvIOZw8NW9OZfy/4B3quxoHiF8Vv6XNDLtVy0u0TZ5L +3rZ1QuF7Qk5An4wH426WsbxkM/Tuqyz6IOp/yGXkVO+redjDgm4Sv2PNcPW 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 CwB5Cdu6sW3IVYwTxgtcxTogKL5aPOxT5gf6PXMqu+ZBTgzrWHA/uH/GIHJf W18s71mhsE6Qo6wzBdDjvvGNb3RxIvpYZ51A7L1Cv8Qhriru2hok3zhv6E+C zwMbMu9rXvOaXr7yODApf1bxVWEdkX6d2J7gq/SvJv+4c/njHve4Pj+T+Xkn yVbFV1uDXLugz4kdMBei/u/6apEjA3hPUq7if/xNvC/lH1dYR+R4YH5Wx8hc AczpxLhp/8i5u+q7LA/KRPg6aHM3XhoZGF3xiCOO6Pah/5GZ1QvbGj7l81BY Nzj/Yvv47ne/O8ZP2nbZ8F8EzM+uPfG8T6qbXvXUtwbKvsi8WeuMeeNXf/VX O7mK+9TWZD366KPH/Bsqf1ZhXwG8QjwgvMR6E/M0PlXpZyX0UcAW77GTzll8 tbVo89Kgkz/mMY8Zi9kh57RrJOQku/fee/tjyj+rsO5gzoWrnJ8z1yWcpX+V NqtZbbTFV1uHjHFSps049F//9V/vuarNQXbaaaf1/llwVMYrFAqrCOP/gflA fW6Rk5SltLFbM5335a+w+sCf9+lPf3rPVcw9WY+I/FmZf6ZQWFXk3Jw2DGxV X/ziF7u1Jv0Q0QVZc1LWevvb3158teJI3wRipYgzxOauj6/zzute97pen6y4 g8KqQnt61i+Aw/CvMs4DruI5zzrxt956ax/3X/5VqwtjcIiX5j6R809fUvPC u8570kkn9cepVxYKqwbmU+dWdEHsVTn/ph8P23ve855u33YdvPhqNdHmRWbu YY2EdRN8e+Wum266qc9NViisIrKuCpyFraPNC+o8zPbhD3+4zxOQeS/Lv2p1 kWt9ylvUCst4HbgKcC9rbbCwqvDZhLPMC4otVhsHchVzMZ+hA6InuIHyr1pt ZH1tX33/K7/yK939fd/73tfti81SlA2rsIrweWbeVaYyf3HWM7jlllvG8u2p M5R/1eoj69P73nhQ5iDz+8BXrreUP0NhFaHd6hWveEVnp9JnXZ2Q7V3velc/ L2demY3qqxRfrQaG5pWUj/0uc2OlfaCwfGS8rmPM+2V9NzEUP+X32myAtma+ Ywynzp/j2nufx9KGnL+y9gLf+X4rYyLkl6zHaUwyNQLlKHO+IVfx2Qc+8IE+ DwnI6yy77L6P1g/Y8eMz2+Z2yOP8LOtfKMv5vc+TdRPz2cz/0wcWqK9mfjZr AvndutcrY50e/nCctrnKGMt8n/3i9ed6v/sDa8NpG8i1GPut7Xv7kT6Ww/K+ tnGnm8UQ733rW9/qXl/60pf269muc/v6zne+s3uOco5u660Utg+Yu7B1ffzj Hx996lOfGn3iE5/o3rt98IMfHH3oQx8a3XnnnaO77rpr9OlPf7rb773vfW+3 TsNnn//857vPOQ+f8f0999zTPUuMHcbMpHw2fE5+yPRtZux5/s997nOjz372 s107ho5fByR/OL7+4i/+outf+o9X+pdX+v8zn/lM955+/+hHP9r1Jxt9zP8c yyt9wufs98lPfrL7/u677+54zH4XQzKJ7WI/2kX+c85NGz7ykY905+WzrUDW PGf9z+fhmGOOGYtftp4dr/iCJn/Cq6UfbE9w/5m3yAWYPnjaOvGRx5Zg/MPQ lnFc5qBNOynnoxYZ8RTqHvrcM9+39n9zftE24ozS34b3mX97HaEcxLVbByHX czPntf1uH3P9eS/a/duaMMcff/zo7/7u73bze7HPs2a4uPjii8d8CHg2zjjj jC259nZ9mpww5G7L5838uTx32NZzrai1d1Tuye2DvO/5zPvM5DgyL+BQTW8/ z3GkzUF/GZ9/6pF96Utf6n4zcxnl/Jlc5Pkyv1Huv45IHStlCvoQm01yRXsf 6GP63XzY9EtbD7ztM/b7kz/5k9Ff//Vfj9nPMr8jfMaGTn/++ef3cXm+UmN8 q65dUC+F3Li2PWtu8j9ylTzb6sBtX67z81CYH3JP1uPJfKa58Sy14yifOXNy OVayHhkyPq+Z4yNtKu18n/FiyVfrDm19clXKqK1cxX3gNcdzW1ud77wn5lmR 7+xzcm/S73CAck7a48UVV1yx27295JJLNn3N6n5yJrq+Ps35DHG/3//+90+0 T7V+DKD8Cvd9aAfgtR0Hjhd0AcYDz7/jRXnK8cA8zqu5aN0vxxSyvfO9cUPI WdqFU74CfI5N2pq8qVu262jrglx7U7bNvpZX+D/z+rpl3v6UNx3zyl059of4 jftN32a8HlDGuuyyy/pjPAcy11agtbe/6U1v6s5P3gV+j9ebb765l6tsU67x 0N6Wr9bZPlCYD8xXWf/WcXH55Zd3OhtzV7ue7vPh9wA7w4tf/OLRYYcdNjr8 8MNHz372s7tz5hyateHYfC7Je9PagmkXPJm5Q3i/zr40bQ30Vu+D6+GGVl7I dbFcxwWsr7G29tznPrfLL/usZz2rzy9Ef8uD6pvKqOnTkPPFkHyFTWuzSL+J vD5sVLYPmcs+4pmzjZPuOedcx7mrMD+MZ+dZMP9M6oRnnnlmv29bv6K1c/r8 scbn/z5H5m/W5y/1yRtvvLGLvxfwl88mr0N25GzHuqGVIx2nzBHKR8oy0/y2 W1izzWOz3q5cry2b3GhDOTs47tJLL93NdnbhhRf2Omz682X7fJVvUg5uOcWc k4B5jueAdci0abJP1UcpiOSe1lbLdsEFF/T7ts/NLGNIOYDnlxqKqcNok+G9 MRgt4Dw4Km1qbJ43c4fYnqwn5GvrS7Y35+NF8pXHJP88+tGP7uyJ3N+sz0f+ Ic6LXJu1KjfiK+Hchb3eNspl/j8kF6nL5f/OmcxznGOSf1XJUIVF8xW2c+Uu nl/qKzFWXMP3N1lv9zlun8u0QasbJlLuS7/Tdv1eHlOf2lvz9SL5Km1DrlvA Aax3pL7vq+uFrU/9JL6SX9qct967zGGb+yhzA2tjDrXZay3/qsIQFs1XIP1l zj777O68rh+q51177bX9uc27Jhw3OXYAz3M+945PfZuE8z7IMbS3bGCLlq+8 duRVORuuYb0j7fT0vWt+HDOPfEXfpwzH8e19y/fJPcpNylUic323/lVlSy+A ZfCV/OF6lGOFsWme+ec85zndvml78bVd22L/BONSTjKuI9GOG2Wr1u69LCya r5BxUnZEZ4O38r7an8973vP6/kl9bhJfMSckT/Fe+bmN85E3rXniOl/2Qxt3 P8RL8lvJW4VF85WxE4m0/zoeWL8CQ3yVYwZdUn+GXO8G5JkkNiX9mNjwT2XN 6a/+6q/6NgzZypaFRfKVcYOAe6rM6TzhPZav8Jnw/mTs4DT5CsBVX/va1zo/ qZe85CX9OfH9Yj4ij8Kf/dmf7XbdopW5Es5xbRx/YXtjGfJVcgN2jDa3vFsb Y+v5k9fkImUBxsyxxx475kvqOFTX1DcDvx58vP/yL/9ykEeXhUXLV/Q391M5 iPU21385fxvfA9qY6kl8pZ8cMY3mU8+YBv3u9ttvv36dmbnobW9725j/QptD gvfaFuXcVk6s9cHCMviq/S25RR7Rt3vo/OqDxqgYCwTwNdU/gs+Rvaif0vqx +hv+HjUb8ffZW1i0fNVCOcZ72sZ6gln9GcAf/dEfjfnQ5Vwid7VzBffsqKOO Gn3lK1/ZLe/DNPtUu7Zb2L5YNF9pn3A88NrO8/g1Mh+LofVB61irb5CLoG2r 49B8Sa3POMcfeOCB3XvWJ7/85S9vouf2HBvxle2Er9IPfk/011wDxVaXcYdy zC//8i/332eb+H37Wnn1nHPO6XxR+YzzOBfQ166feA/4Lp8nfw/O0sbY2tQL hWmYxlc8txlnmvaRtDW1z1v6zqRv1Ve/+tUxTuE9MhHrhhmHk7AtrG8xr8tD 1p1LvZK5/2Uve1lnRz7yyCP7seacr76i77exdCD1j0XmX52Fr5Bvcl6YNT+m fe090YeDGjNyj/0Hp9Dv3pu8j+eee+5Y37ERQ6U8Je/R9/iovOAFLxi98pWv 7GIanvGMZ+xm10/5dufOnV2cM0jZaW/aFAvrgWl8deWVV3bfD+W8NH5r0jgy 51X6PhMnwu+g38E/xCbyO7fffvtu49g1oZan2LSdsD3lKU8Z3Xbbbf1vYtvK mpnYTlL2Ms8N9ixkhqH+2Ft8ZYwB8TD2b2vD2Whr4XU885nP7GWhjG0itxXH YZfPa6ZflGtbO6NyFdzkb8KH/p4cSQ3fNo5b7kpuqnW/wqyYRb5q/Ywn+R/z nA49e8pLzNk8/64PMj55z5zd6iMg7S4+8+iNKSM97WlP6/yzATE9reznOcln Zx1zNnkSLjQnrz5Ei/bLmiZfsRFv3Orfs+QfyFhM7wd5YNTXvMfKWnJLe25i BW2L80v6xr/jHe/o9svcDtzDvH/o/uibqa9zD7h/xnnl72YcTqEwhGl8xXM1 q22hlbWQc/RrZi5u52t557rrrtttbKbPOu1q20b8NHEmgN+Qn3j+GbPKV2kD 2rFjRy8bwFe0g9fWD14sav1wI76ifbQLvmjjNX2/0dZeCzk75Rn6O/t/KD8M /cXvXnXVVWO5a5JP3/3ud+9mA2h1uZTVDj744O44uMq2wMd5bNU/KcyCaXx1 ww039LV2stabep41KvNcvGJT/cIXvtD5Q6l/YP9obRnocjkv+5o+6cpBvGYu O9qQnJLHmHNX3mI/NmSytjbUNddc083tcuui16KmyVe0j3WO9N9sfS03wvXX X9/lY1GGzOuVr5/61Kd2+2Yu/MyJwFpg5gxKuU/QZ/ZvxttkDkDimJHvMm7U 9Y/kPPhq1usrbF9M46u0uWpfRR8wdtYt89f6fdortI2nPsjn+PGkf2PWPgDa r/wdz5F5I4TPe5vXLb9PXwfOQ7vavE5Zf2MR2IivMq4y5ZtcX5i2Ice0a3Nw j5zPeen3STUoaZf29jwH90vuzHmqvS6hLQubfuZFMy9q/n7ZsAqzYBpf8Yw6 NzrWh9ap22eb55LjGCPuI08pb1HLAGRcjHpB8sxQjjrGU+Z+ELmGr29jzv3I LYz79C9lvSp12UX7+2zEV+bWlFtSPtLmt9GWx+lnLod575B5kd0yNrytX0Te syEubGOb1LnbekhDa7y55qHfl/e7fNcLs2AaX6WvjvqFW/rzmPNlUt5xuYox xD7EcMAzGz3n6nGZSz7zzyTaOn5tXA9gbGhHts20H/uZ+m7ry7gITNMHucbM pZq58r0fkzY5yXXA9OFku+OOO3q7dvqm2D9+bn5R85Tx2xdddNHUa0s7ZF5n +mrYzqG+KBQ2wjS+gl+G5CrHVet/mFyV+Y/lK+Jh5p1LPae/z+u89XrdHxtz yim812+7Peei1gmn+TPwv7WNk/dTzpy06e/vfVOOpP4MyHpqAF5v1zqG+Ir3 xVeFvY1Z7FfIVdqd1FlSP7EOTo4V7BXY15///Od3z3lrK6FG76zrb9uJr7Rf mS8/+R89dpo+yPbkJz+5y41MnWT8Mtt88bluClyXyPYZj6N+mv20EYqvCovE NL5iXRuucU0wc0Za10Y/H+0Yk+qWqH+0+Y2mYTvxldd39dVX7+ZHMsv62VA9 Z5D5Drhn6X/Q+iYkX2W7iq8KexvT+Oqss87q953HDyv9yz02c+5m/oBp2G58 xUY7jYNq8wlP829Pv12OxU44zdc0OavlK9uUsaSTUHxVWCRm8W8XacNmHrcu SeZQb8dPq/Pl2JvVR3A78ZV2K9bnlEf1dZvFv505IHW9jXzGuW9DfgR8bj8V XxVWCbPy1aQ1/nlyIu/pM7md+MprRb6ZdOws8lUrkylnuZ+x0MVXhXXCNL7S nzmfJ8fDpGeslbPasdPmYZuG7chX+F1ob5rHRyn3z/yr7XUN+Xp6XPFVYVUx ja/wTW71hrZW5xA/5dhv16c8dtb8IduJr7Yiv+hWtG+WfMhDKL4qLBLT+Gor 84vuKYqviq8KBVB8VXw11L7iq8Iqoviq+GqofcVXhVVE8VXx1VD7iq8Kq4ji q+KrofYVXxVWEcVXxVdD7Su+Kqwiiq+Kr4baV3xVWEUUXy2fr/RHM2bA8Ws+ Md4bj5NtWFZOO/zg8RPOfDbk3SCv8Sxo/ez43xxeWZuH77IvCoVZoN+mvJD5 QHNONQelWMaciM+1z7h8xdgBs45fxryx1tTJMl+Xuf+oWWYfEO8oRyyCr7LP PD9tMC+o1whfyFfLzr1JX2V+UXkLn/tpaJ8JfYs53nzOXitoYx8KhY1APKxz m7ndMkcoedKte9Dm8FwWsu6BHDNrjnX4J/3xka/kK/OLkjPHa5oUU7eVgIPT t5/roe8dx7QJfayVZ5cBYxUyD6vPwiz5+hJZZ9dzcY0+Z6Lq4xTmxa5du8bq 8/mcvvWtbx3Ljw4WVedqCNTZsVYquUppF+2cJVdBC3IXYBciJ17m8eSzrOkC jAdeBLKuBr+ROdeVa5ED5TQ4hBjAWfPvbBbcb/okdTf6bKjGR4uhuHba3tbK 4JqH6owUChshazEM5R6Bx8CQHrPMZ8ycgYA2Z+2ujcBYYdxnW5N/87rgYXTe RcqPeW45t+WhzFm8bFk2f4/+MAfjvFxJ+7k+ZdWhawQ571TNicKsyJwJPGNt LPJQPpll2Ejbui2ZP3MeHcJ5X1sW4JozJruN6d4TGW6WdojMiUB/K7e6j/Ww bN+y6vOljJTvZ+nvodwPPkt8zjX6f+qL/lahsBGGnpEhe8ky1s2mIWt9bVUb JtnWMxfqVoP+zRzRqXsmhyV/LsuGZXvS5pfz2Kwwl2OeQ77lWrPu2rz5hQrb F8lX5lX3+XFctWOa12WuPz/wwAP9+8w9Pst8P4l7W05IuSvH6FYjf0+0cpVc uVG990Wh5RjbM+v9buVHof7u92kDbfMOFQobwXHRPi/tmG25bRlox7JIDpsV 0+SV/GyR8lWhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQmF9 8f8AX55fDA== "], {{0, 241.}, {300., 0}}, {0, 255}, ColorFunction>RGBColor, ImageResolution>72], BoxForm`ImageTag["Byte", ColorSpace > "RGB", Interleaving > True], Selectable>False], DefaultBaseStyle>"ImageGraphics", ImageSize>{50.24609375, Automatic}, ImageSizeRaw>{300., 241.}, PlotRange>{{0, 300.}, {0, 241.}}]\), \!\(\* GraphicsBox[ TagBox[RasterBox[CompressedData[" 1:eJzt3Qm8beX4B/DbgKIoU2ggpUJEaTQ0q0SaLkLRPFHppoSkLs1FkwZCs1IK GUJxRUJlHlKaKaXRECrr3/f1f1m2fc7d57TPXuvd+/l9Puuee/a4zlrv+7zP 83t+z/Muvs3um+4w57Rp02bM88g/m269z5p77rn1vpst8Mgv03ebsfOOu22/ 3Qa77bX9jtvvuco2cz3y4FmPHPPMMW3a3I/8rAKBQCAQCAQCgUAgEAgEAoFA IBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAI BAKBQCAQCAQCgUAgEAgEAoFAIBAIBAJF4i9/+Uv1u9/9rrr77rubPpVAINAi 3HvvvdWFF15YzZgxo/rsZz9b/f3vf2/6lAKBQAvAFnzta1+rXv3qV1cLLrhg tf/++ydfIhAIBG6//fbqPe95T/XEJz6xWnbZZavPfOYz1cMPP9z0aQUCgRbg sssuq9ZZZ51qjjnmqLbccsvquuuua/qUAoFAC8B3+MAHPlA9/elPr5Zeeunq lFNOqf72t781fVqBQKBh4BjEEssvv3z1tKc9LcUYt9xyS9OnFQgEWoCf//zn 1dve9rZq3nnnrdZcc83qm9/8ZtOnVCT++Mc/Vtdcc011xx13NH0qgUBfcP/9 91cf+9jHqiWWWKJ61rOeVc2cOTPG9yQgL3zqqacm3ubkk08O7UigePzzn/9M +cxXvvKV1eMf//jq7W9/e/IlHnrooaZPrTj8/ve/r3bbbbfE7a6++urVpZde mq5vIFAqcJJ77LFH9djHPrZ64QtfWJ177rlNn1Kx+Otf/1p9/OMfrxZffPHq KU95SrXvvvum6xsIlAicJHvwspe9rFpkkUWq973vfdX111/f9GkVjd/+9rfV O97xjmq++earXvKSl1TnnXde+GKB4sDv/c53vlO97nWvq+aff/4UM//iF7+I sfwoQUsmXnvFK15RzTPPPInz/c1vftP0aQUCE8Kdd96Z/AW24dnPfnbi08I2 9Ad33XVX9ZGPfCRdV8fRRx8dGvURhDW48ygB1rivfvWr1WqrrZbWuLe+9a3V z372s6ZPa6jAF+OTPeYxj0l61O9+97tNn1JgQLAW/OpXv6q+/OUvV6effnpa ez/xiU9Un//85xP3b/1oc82jGHmXXXZJMTI91Pnnn189+OCDTZ/WUAFXKddJ h/rkJz85cZWRMx5u/OMf/0ixJHtgzV1ppZWq5z73udUznvGMpBvAR73pTW+q 9t5776RFpD/0njbhgQceSOdP64Bjf+973xsc+xThxhtvrHbfffdU6/bSl740 1cqHHR5OuK9ql7bffvtkE+acc850zD333MmHdMw111wp9+0xtY9y4XLgbRoT P/rRj6rNNtssnWPWSZYSF5WIWbNmVWuvvXbKH1tTfv3rXzd9ShNCSXFzk/jl L39Zbb311kl/zAYstNBC1YYbbljttddeqUeCg45ggw02SL7EtGnTqsc97nHV Flts0ZrYnvb3oIMOSv6OGqwDDjggxUKBqcOf//zn6kMf+lD1hCc8IflsJ510 Uqtr3tgCPqZxce2111aXX355Gr/GjsfDVvwv6GaPPPLIauGFF04+wote9KLq gx/8YHXllVf+Fy993333Vd///veTz87HYCO855hjjmk8znBfL7nkkupVr3pV Oi95zauuuqrRcxoVuO70qdaLN7zhDdVPfvKTpk/pfyB3pZ/gxRdfXH30ox+t 3v3ud1dbbbVVWu/e+MY3pnXQ4+zFn/70p6ZPt1W44oor0nUyr57znOdUhx56 6Lhck7gTH8XHYE9wEvyPJoFjkM9cYIEFUn3mUUcd1aq4Z5hhfTnssMOSz2a9 cO3xl20Bv8Ba9/73vz/ltJxnjpXz4XePv+Y1r6mOO+640HT8P+Qhjj322OqZ z3zmhNbdH/7wh+m13rPYYoslv7KpPkx8h6985SvVKquskngH/EP4DoPFD37w g2qTTTZJPIS1xprTBl/dObAN2267bVo3jFd1OGIhvMnGG2+cfE6/exznZjzj 4NWpjjr4XHKBbCgtERsrjpgd+GBiEj6E977rXe9qzC+7+eab0/c7/2WWWSbl 3ZqOd0YNeAjXHW9tHu65557VDTfc0PRpJV/XXH/qU5+a5j7/WI2eOhJ8/I9/ /OPEsct5vfnNb07cFRtCj8+Pvueee5r+ExoFnQOO0TVZcskl0z3uFd/4xjdS 3Om9r3/969O1HjT4LOecc04al2ILHKoxERg8rDViPHlluohPf/rTjWpW8aSf +tSnqqWWWiqNUef04Q9/OI35Tv2O3+W+rJVsiTVPLEJnN8qocw8rr7xy0kT1 ClyleM17l1tuuaRDGjRwz/JqdJJqAtzP6DfbHNS8rLfeeinOsO40yUupxdtu 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 EAgEAoFAoB/4PxA7QG8= "], {{0, 166.}, {264., 0}}, {0, 255}, ColorFunction>RGBColor, ImageResolution>72], BoxForm`ImageTag["Byte", ColorSpace > "RGB", Interleaving > True], Selectable>False], DefaultBaseStyle>"ImageGraphics", ImageSize>Automatic, ImageSizeRaw>{264., 166.}, PlotRange>{{0, 264.}, {0, 166.}}]\), \!\(\* GraphicsBox[ TagBox[RasterBox[CompressedData[" 1:eJztnQmYjWXYx7v6vuorJTshoexLKAllDW2EslQSSVJISiqSJUKJECJlS6Xs S7SQLcouCtkiChUVJS3P53ef65nrOM6MMTO8c8z/d10nMufMeZ/33P/nXt/z 5nvgsfoPnXvOOec88X/H/lO/eaeqHTo0f+bODMf+p0G7J1q3atfywVvaPdmy VcsO1z/wP8f+ccSxx3fHHv977OGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQggh hBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQggh hBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQggh hBBCCCGEEEIIIYSIEf7777+4R1o+BhEsQdvAmX5/3ufo0aPu999/dz/99JM9 Dhw44I4cOeL+/fffeF/3zz//uD///NP99ddfCT6Pn/Ecfh+vSegYfvvtt7hj OHjwoL1OWkwb8Dn//fff7tChQ+7nn3+Os0NsLD674fn8HNtJCF6P/SVkqwnZ YEL2nRx4T47rhx9+cF988YV76623XNeuXd0zzzzj+vfv7z766CO3ZcsWO6ZI HbD27777zs2ZM8ctW7bMnhMNjp21LF261M2bN89eE3kMhw8fdrt27XKff/65 GzFihOvcubN79tln3cCBA91nn33mvv/+eztOcXYSbofLly9348ePdz169DAb eOmll9ysWbPct99+a9oMt0P0snnzZjdjxgy3evVqs8looL/du3e7+fPnuyVL lrj9+/ef8P7omOdgp6NGjXLPPfecvf+AAQPcJ5984rZu3RpVB8ldN79z0aJF 7uGHH3a5cuVyl156qcuePbu77LLLXObMme1RuXJl0+aePXuO2ws4H2PHjnV5 8+Z19erVc19//XXU92EP4T3uuOMOV7p0aTdu3Li4n/H72O84h40aNXI5c+Z0 GTNmtPfPkSOHy5Qpkx3XfffdZ1r8448/Umz9InXg7XDx4sWuTZs2Ln/+/Pa5 8/ljB1myZHHZsmVzt912m/vggw/MXjz8vW/fvi59+vRmw/H5Afb4SZMmueuu u87VrFnTLViw4Lj3x9fhH1q0aGE26HXAMaABjuGmm24ye//xxx9TxCfyvr/+ +qvtLxwTdn/NNde4hx56yA0bNsyNHj3adevWzVWvXt3OQ758+VyXLl3s/T3J 1SDH8Msvv7i3337b3pt1onf2Hn4ve9ETTzzhrr76apc1a1ZXrVo188vxxSQi 9sAGyH+IpdAY9o5O2rVr59544w2zg+eff95VrFjRNIH9YBc+JkquBnl/Yt0p U6aYrfv3b926tRs+fLj5HvxhlSpVTI8FChQw/7x3795kr501sO/UrVvXfjfa W7t27XHPwdaJG/v06WN7U9GiRd2rr75qPhuSq0HOy9y5c23tl19+uXvqqafc zp07j3st70Xs0LhxY9Pogw8+aP5YnB1gGytWrHBNmzY1jd1///0WU4bHe8SX 2Fb79u3NVrEjXgPJ1SD2RXx6++23W7z16KOPuvXr1x/3WnRAHIr28EUlS5Z0 Q4cOjdNBUmB9+/btcy+//LL5OOx748aNUZ+LzyVG7tevn8uTJ4+75ZZbLG+E 5GiQdW3bts10x95DDEA+GA32yffee8+VLVvW1ahRw02dOjXJaxepB+yQOgH7 OnZYu3ZtqytEA3snJ+M5xEyvvfZaXB6TVA3yevbzXr162fuzD5BzRsP7oxde eMF0EL4PJAXyWPJetHfVVVdZzplQnomGyFPvuusud+WVV7pXXnnF/j1Sgxs2 bDiunusf+NyFCxe6OnXqxGmQc/rxxx9bfFmiRAmLL+KD9aNPtPfuu++ads92 0kJfBjtctWqV+T7ioO7du8dbd/N6IxfBVtjvo2mQ/CqaDWKr5JLs416DvBcx FnZdpEgR820JnXNvx8SOhQsXtn0gqWD/M2fOdOXLl7c4Fy0kBGtFA8TF5I3k zZy/cA3iH1kX+0rkY8eOHaafm2++OU6D7EvvvPOOreXWW291X375ZZLXczbB uebzwT9Qu+M8na1a9PtwrVq1zD8R65wqXoMXX3yx+TFqpNFskFhy5MiRZn9e g9hvuG+k5pcQ+ILt27e7Tp06WX3iySefjLcOezLCtVO/fn33zTffnPQ17C+v v/66xeP33HOP5W3+9xBHX3HFFe7OO+90DzzwwAmPZs2aWbxNLO01SMwwZMgQ d8kll7h7773Xeg9pGXRGvEFtnpiL3IP+0PTp060Oxh58tmkR+2EfLl68uO3P 1CdOFa/B8847z3wZOoxmg/ha6g7UPL0GsUF0ie0SE6Lfk0EN0cfO2HVS7Za1 v/nmm3Y8DRs2tD0isa9Bb7yGnqHXILq86KKL7Peha/9gbf5PnkO8EE2DnJ/I fk1awfeksSV6o+iO/OD888+3c8q5e+SRRyyfxjfy3LNFi16D5CLs0b7OcCp4 DZ577rlmS+RqnLPIB/+O78IGvQbxK/QAsNsmTZpYvHYyeA0x66m8Jhqsnd5D 7ty5LRZOjP7RDL1z9E8fD5/sNcj6brjhBtMoe7h/EGfw54cffmi9durLXoPU WVg/fSB6f4mpdQY9u5TSENvwmX711Ve2t5Kr+L2sQoUK1o/iM8JusNOePXta 7Zpe1tnQn8F+Jk6caDZBLkNudjIibcBrkPOGjokbsLvIB7kXPQ5q++EapP9A LkoslhhfRB9j8ODBcTWcyHmTxEKfm/yUz5UYIL5alMfXj7ABapj0B9iTk1MX Dc8HOXfk5gnhfQUxMOculuF8sn5iiTFjxpj9ZciQwc4texlzIdTnyMGJ/8nZ 6cuQi1eqVMn2LvbNyJmRWIN8kBoLmqA2MXny5ASfz77D/oMNoAX+Pzl1UfwA 8zjFihVLVJ2Tz433pi7CzAB1EWLTpIAmfG+Q/jf+K6F9Nbx+xb5MfRaSo0Hy G84/MXq5cuVsT4hv9sDXRQcNGuQaNGhgz41FP+BrxPR6mAvC/xMfMZNRqlQp 9/jjj1u9OlpvjPnBMmXKmA7RI+eS88DvitVc0dsVeVWhQoWs3o6tRIP1oTfs jdiN2ih6TI4G2QOYjcEHXHvttTYrkpBdcWzEy9RD6JfT20sq2Do+lM+VPA1t EVtGe39f/2VegN4kcyzElpDc/uCmTZus70rs1bZtW+tZRtqSryujV/wFnxWx QDS9plY79DkfsQPngXoa5yxdunQ2d0HNAJtIqMaGztinmR8pWLCg6ZYYqmXL ltZjJp/GplPrOYBony31Jvw+dQZyHPrj0T5b1o9e6SNjs9Qm8WPJ0aDvvT/9 9NNmg5xLdBGfDpiNIS4hfqRPTZ6VHFgTv4Ocg3olvXKOh2PlGPyMOXU69lv6 eJwnagZ+nSkxJ0P8wb/xIDZnnf5aDY6B96JvwewQPoM6bmQfw8d2xKipzSf4 nI88DlvD31144YV2LolD3n///ah2wxpYV/ha/Hwhc1133323aZA6BPE88RE2 mhpzRd9v4dgi5335vOgJ0DtmP2IekjoHz/N2yN+ZIWF2kjjsxhtvtNkySO6c DL979uzZFu/z/lwrQP85UgfEGxMmTLBcgBoPx8IekBz8jAI+nXjY56Uc55o1 a2w/wk9TI+e42XuIGfiZx2sQDaONU9Wgnz3gPchxsaWOHTva3kC/n5klekbY G/H39ddfb7WkcH/hr8lg5o08iRibzyXo+iHHxfkhbyPnoweG32MfIZagRhWt DhV+/QB7Iv4tci38bn7O72U/5tygRXIq+sa8J/YR9F7EcWLj5FDETtQTsYNw fIxJjwD/jn03b97caivsW+vWrbOZZmbIqP1hI8xO+poAr2WG61Q0yGfhNej9 G7ZDbwN/QlyIxrF16mXUdIgZiVfxl8x18u8pAevnM0YT1AL8jDh7DfGuv24B jRIzcj4i1+X7O8TI8c27oUHq7vRgqI0y6+Lx+Q5z2pwD3h87RdfsC35+Hj/M 5xSZAxN/ca6I54jPyJlefPFFO9aUvs4kMfhrYLA7Pkf6OORwPucjhqIfG1/u y/kgRscfsN8zO+JroZGv4bnUdVgvexvniveizsbnQg7NsQRxDvjM2WPw2WgD /bDP4q8jj4e9mPNFvo+ds6eQ8/IaNIE98P/UjZkrC59pxB6Y80Ib2GhCGpw2 bZr5O+KP8L2A80pMjD9iH2NuFTvE/rBDrwtyMXwE/iGlYd/F75ETU/NgrXym xKm8J/tQtFqk1xbPodcXX38BW2FvJo/Dh/OacPzsOn6XmBgbolaEnpilZ58j zoqWL3l/Tn0Lm+WzwhbxD+wtfF7sxafbDv21n+S0rIP8ls+Q+Q2f8/G5n+wa SK9BzgO2iHbZt8hD8IuRtVD+zvrIFanp8F7UWIl1qZ0TH2BfZ+I66PBeJ7ON xHUcD7E3tuyvP4vvtayNdfTu3TturpEHdTtyIHwXWgqH1xBL0kMlJotvjtrP hlPb57rYSH/hz6PPGZg3YT/wczW8P+cyPo2nJOwJ2BIP9qcg9lDeN/wYEgPP ZX/Cf+C3sUPfR2UvPp12yDGyh1DTpGZMXEC/ij2cOgM5L34ssfg9C1vEDthT 2FuwS3wrcWjkWvw1cNSuyBmIY4jPiO/QM/0nfMbp+kx93kv8Qa+TWvcFF1xg vo9aGj6GvTKxBG2HQb9/rOJrFsTv3g7xI9ghvho7RCsp9Z0EPufDb3GtG3ke fo9YhhiC/Cep11n5fZlaOD7V+zfW9Nhjj1neG21uxsdV1NmJIdAA54DYhjiH uJ+9PCXPAb6Jfib5KT6DvJfYDf9NvYRYRDactvB5NnUsej/eDtmbyTn8nF1S 7cLX+chhyPPpV5GzkIuR8zOPkVI5Q/j3DJBzE2Pi34jVyQOpDbDvRMsViV3p YZHjeF9KnE/MxrEnZx7c146Yl6R+QpxJ7Mw+Qd7UoUMHi+uSOtMszg78nDv7 PzVV/50E6JKeAPZzKjULX2vAz+Br8U/kOfg+6kmtWrWya1tOx3f/+LoFvpX6 OJrH3qkxMGNBPT+apjhe6stowsfo5KnECcxvRYtrT3YOfN5Lfkt84c8BNUt6 bJ9++qm+c0QcBzbDnsz3YjAviE+k9ku/F3uhNpxQzO9rDeRTxIb4OWYFfK2B OhY5X3Kuq04s4XMz+EJ8L3rEF1M7I/aNlivi96kVkR/7XJFjp5ZIjQxfm5hz QCxPbYP6pO91omn6w9S7+bkQ0fC1V2po9EGpl2CH+AZqtdSFo9X/sUt6bdg9 vTdyHOyOejW1BnzQqdQaUmotaIqckNkFrqtmX2FNzDCiqWj7iu+lEj9Tn6dm RV8RLdFzI36Oliv6c0Atkf4QdUpeR97L36nBJPX6AZH28PPnzN5RP0BLxGf0 NbAvX//335uKbTHbT60auyOvIr+i/sk8RdBzAMSEPif134tHPoafog8Zn6aI a9lT6Av7uBY9UVdhXX5OxZ8DYnf6uz7vpcaDL+Y9VG8RScHX/9ES30+CttjX 0Rr1f2yLeR36Tvw7+sNnkgOuXLkyVdUa0Ao6QVNVq1Y1nbAe9hjqUswiRct7 iVnx//TNWRvaoq7CXBLxQrRzQCxPzx0fnJrOgYhNwmM6YjhqCvgR6qjs88R4 9PnIm6hJ0qON7BGnJsI1RW/Za4pjp29I/SVyrjv8HFBTYq3+HNCb5Bz4vJcY nl5raj4HIjbxeRLfeUN9hfiU67Kpo5LzEbcS88UC/vs6mUeh5kSOiKbQEjUp 5t1Za7RckRySuJbZX3ypPwf0M8h7Y+UciNgFu6R3yMwX/g9bjO9amtSO79Uz N8qsvO+REnczi0V9JVqu6GN05gA4B8Tm9CBj8RyI2MN/7zd9bfpdzMeHX5/i 6/PkVrGSC/lePT1SX3/Bt3HtALM05IqRvTx/Dsj/OAex/r0FInY4mQbJt/CT 5FbMp8UK/loO5t65XpW6KbkidVSu06HXHr6nSIMiKBLSoL/mm/kwbJdrrWKN 8HlaruPg+9vor3Ntfvh9VKRBERQJaZB8iNk2ao7kVeRLsYrPFZlrYR3UnMJn fKRBERRpRYMnQxoUQSENhpAGRVBIgyGkQREU0mAIaVAEhTQYQhoUQSENhpAG RVBIgyGkQREU0mAIaVAEhTQYQhoUQSENhpAGRVBIgyGkQREU0mAIaVAEhTQY QhoUQSENhpAGRVBIgyGkQREU0mAIaVAEhTQYQhoUQSENhpAGRVBIgyGkQREU 0mAIaVAEhTQYQhoUQSENhpAGRVBIgyGkQREU0mAIaVAEhTQYQhoUQZHWNMia uNdU5D2VpEERFKeiwfbt2wd8tEmHtXCvpd27d9u9dlmX7vkiUgMn0yA2261b N5clSxa7n2aswfqOHDli9+PlHtcdO3a0+3tyP/ADBw7EPU8aFEFxsvsucf/a UaNGmd0OGTIk4KNNPP6+idxbifvwcu8o7nPNGgsVKuS6du1qa/NIgyIoIjXY smVLu1dt+M/xI/iM8PsUpWbI91jDhg0b3IgRI1zNmjVdhgwZ7L68NWrUcIMH D7ZYNBxpUARFpAa5PyZxWyzeB9rnfNxnd8qUKa5JkyYue/bsLlOmTK5cuXKu S5cudo/r8HvS+9ft2bPH9ejRQxoUgYCP477R3Iude0dzP/edO3eaPUfaa2qE Y+R+wXv37nXz5893nTp1ckWKFLE9hT9btWrlFixY4I4ePXrc69Aevn3Xrl2m 2bp161rtqXXr1tKgOKOQ/02YMMEVLVrUYjbuVct9aqlhcN9MbDc1atHnfPjx FStWmC8vX768S58+vbviiitcvXr13Pjx4+3nka9jTfv27TNtcn/h4sWLm2ZL lCjh+vbt6w4fPhzQqkRaBJukdoEvqF+/vtkv/qB06dKud+/eZt/YMXlWatEi x8LesXHjRrunbu3atV3mzJldjhw5XLVq1UyP27ZtO+54vWbx+6tXr3YDBw40 v0/8yf2x69SpY78rvFYjxJkEuyYGHTp0qKtatarVMLDr6tWru5EjR7pNmzaZ 3QeZK/r4keOcOnWq3WM+V65cLmPGjK5s2bIWh65atcrWEvm6Q4cOuc2bN7tx 48ZZ3MnasmXL5ipXruz69OnjtmzZEtCqhDge4rT169db/Z56Pr1B9NioUSM3 efJks390cCZ9Ynj8uGjRIosfCxYsGNdraNGihcXOkbXb8JxvxowZVvfNnTu3 abZMmTLW81y+fPkJmhUiaLB5cqLFixdbjaJw4cJmt/nz53dt27a12seZyBWj xY+VKlWyvJWYmdiZnO/gwYMnvC5cs507d7Y1eM02a9bMzZkzx+pOQqRm8CPk R+SKDRs2dHnz5rVcsVSpUq5Xr14W96GP05ErRsaP6I3YkUeVKlVc//79zSdH y/nQ5Jo1a0yzFStWdOnSpbOcjxh09OjRyvlEzOFzxeHDh1vNI2fOnOaLyBuZ o6E2gl5SIlf08SN99FmzZllvIU+ePHF1og4dOtjsS/i8p39duGapi/Iar1nq ndu3b081dSUhkgJ9OOZPunfvbvlU1qxZzcbxkdOmTXM7duywuZqk2Hl4/EgM TD5KzwAfVqBAAde0aVM3c+bME/oG0TRL/upzPjS7cuXKE/qDQsQqaAV/s2TJ EtemTRvLr7B38jP+f+HChaecK6Ij+uJr1651gwYNspyPmQHiR/oO+Fr6J5HH EZ7zMQfj6zT8Sc43d+5cO1YhzkbQzf79+61W2rhxY8sViU/JFbkugVwxMX1F Py+HjyPn43f4ngGz1vT5wmPcaHWaChUqWJ+PfYCcb8yYMaZNxZ0iLYAvIs8a NmyYzUTTr6Of4fuK5IoJ9RV5PfUTen34U3I+3zOINl+GX6NXOXbs2Lg+H715 ctN+/fpZPhiL865CJAf8DTkZWuJ6Q2ak8WXUbnxfkVlqnhOpD/zk1q1bbWaV eWn8YWT8GK3PR5yKZulhcl3gsmXLLBcVIi2DFrluiDlMcsNixYod11ecN2+e XZeR2FzR53zMY/M7yfno8xF3Mo/dvHlzN3v27OOutxJChPwW+dikSZPMD5Ir okVyxZ49e1qdkh5dfLlieM5HXjlgwACbx6bX4HM++nzoWQgRP2iMXJFr8GvV qmWxKf0MckXyR3JFfFh4fOrnscn5qK1QFyWu5VpAepPkfLxOCJF46CuuW7fO vh+KXJGaDbUb6qkTJ060XJG+H7NjzAJMnz7dcj7vP8n5qNMsXbpUs51CJBE/ g0ovjz461yuiL65X5HsTyeuYu2a2k9481wH62U5+FivfpSFEasfPoFIrbdCg gcuXL5/1BKnblCxZ0v7ObJrP+cgrhRApDzEls21cr0hfES0Se9LnY7aTPp96 7EKcfujpMYNKP5/vPIs2jy2EEEIIIYQQQgghhBBCCCGEEEIIIYQQZ5r/B8g5 hOY= "], {{0, 154.}, {225., 0}}, {0, 255}, ColorFunction>RGBColor, ImageResolution>72], BoxForm`ImageTag["Byte", ColorSpace > "RGB", Interleaving > True], Selectable>False], DefaultBaseStyle>"ImageGraphics", ImageSizeRaw>{225., 154.}, PlotRange>{{0, 225.}, {0, 154.}}]\), \!\(\* GraphicsBox[ TagBox[RasterBox[CompressedData[" 1:eJztnNlTVEcUxq0kD3nMv5AHK0+aKisPqbJSpcYYNSkDgwhIUso6IpuyCIiI IqKiiIiKiIAiKkgUBCSkBJXNpSRgAEXQAmRXFlcW15P+OlxqmEG8M1zmMkX/ qq7IDDCnv9vndN/Tp/trZ1+N+2ezZs3y/5L9o3EKWujn5xRi8xX7xtbH30Pr 4+a6zCfATevm973z5+xFe3bZsOsLdpFAIBAIBAKBwrx+/Zry8/PJb+NGcrCz o+CgILrEvu/v61PbNIvi2bNnFBYaSr8sX05RUVGUde4c7Y2Opp8WL6aonTup s6NDbRMthtTUVPrd0ZGKi4tpeGiI3r59y/tpSUkJaaytKfHoUa63YGJevnxJ rs7OtG/vXnry5MmY9969e8f7ZdCmTdTQ0KCShZbDw4cPyXblSjp75gzvi/qc OX2a3Fxc6ObNmypYZ1nU1daSxsqKcnJy6P379wbv5+XmktOaNVRWWqqCdZbF 8+fPaS3TKiU5mV69emXwfmpKCm0KCKDamhoVrLMsPnz4QNu3bSMvT0+6e/fu mPcw3qzTaili+3Zqb29XyULLorW1lWu2ccMGqqqqosHBQWpqauJjjgsblypv 3x7X/wWGoG82NjbyMfvHRYto7pw59MP8+eTj7U3V1dV8PBfIB/0O/bOrq4s6 Ozv5/Bx+PTAwoLZpFknkjh1Uyubn6Kfw62Q2Hj148EBtsyyS8LAwunr1Kv// rVu36FhiIjWKObpJCC2VQ2ipHEJL5RBaKofQUjmElsohtFQOoaVyCC2Vg2t5 5QoNDw/T9evXhZaTYHNICFmtWEE/L1lCfzg68rymWOcxDqyfpaWl0Ypff6WE I0eopbmZ59l/Y7rGxcZSd3e32iZOe5CXRHzUurnRrqgoarh/n6+fIU/05s0b 6ujooINxceTm6kp5Fy9yzQWG3Ge6IW8e4O9PN27c4Gs9+rlzaApta2tr+c/6 +/nRP5WVXGcBUW9PD8WzvubO+mJ2djb19vZ+Mm8OjZETLi4q4r+HPtzM4gC0 nolgbMa6rbOTEx0+dIhaHz3i9RnG6AHN+/r6KO3kSXJeu5Z/7ZuB9UaY4yQf P041NTVcV1P7lBRLsba2e9cuKiwspMEZto6BPgUNlFpPhKa4J8b2bTWA/2Rl ZfF4pgvqp9C/mlm/AMeTkuhQfDxf99KltLSUTp44weOaOZBrh9x2KQnGzR0R EdTW1jbm9ZSUFPL18eFrrcDLy4u+mT2bTjB7decs6enpFBgQQP/euaO4beMh 1w657VKSQDZXwXNHm959xr3zZnajJgCs9/Cgb+fOpWVLl1J5efmov51ic2/U pd6ZAtvGQ64dctulJMZoGbZlC9mvWsXvedOIj6ihpRw71NJy4YIFvMYUczrp Qq3uageHMVruj4nh9Wg21tY8NmHerYaWcuyQ2y4lwWfa2dpS9J49vC5XulDf 48Tmdrpaxu7fT48fP+ax397OjvsYYry5tZRjh9x2KQk+M3zrVu4rmMtIF/Jg qEnT1xLjIubN+B4+hto0NbT8lB1y26UkxsRLqQ2I9xUVFWSj0XCf0bq7q6Ll RHZM97FHagPAnDz+4EH6bt48XjuthpYT2WEpWr548YJ/RZ0a6ilX29urpiVs QB5U3w41tBwaGuLPaPrPfIgteE/K7eD/Us4RzxjI6eIZA6+jJtVctZO6dgDU zJVcu2Zgh9x2qQ3yunh+MNdz40TorsNZIkJL5RBaKofQUjmElsohtFQOoaVy CC2Vo6ioiJKSkkZzh2qCXCZqkywNvh+nspLvEfX09KT6+nq1TaINvr7k6OBA 11jfxPOMJYB1EzyvIV+1MzKSjiYkTIt+uZX5OM6ZwDP2ltBQunfv3rR5PtRH qqdycXLi+dburi6+L9mbaYr6Kv0zCswF6juwrx+1CMgPIN+CGgfYibwRch7T Bd16Kqz1P2hs5HkB+DnyBZcvX6aVGg1ZW1lRQUGB2fYz4rPLysp4rSHWz3Ky s0f3o2MNHff6yOHDPH9+/vx5vm9dTSaqp+pi9zt6927y0Gqp4NIlXqeBfHZQ YCBfT0V7pgqcMxG6eTPfM13O9LxSXEzr162jbeHhfP8vbJTqvOqZr+NnsX6L Nox3LsVUMlE9FfpdxtmzvE4IOUDU+UE3vD/AtP6L9U2clxGzbx+1661JT5an T5/y+Iy/j3N4epid+Fxc2Mf/Z1YWtyuB/QzWgQB0xViEM2Y8Rvb5415M9f50 aJKbm8v9AutRj3TqqfDZ6APItUZGRPCxWzd/qPs3EDsxV0LMyszImPT5OIgp 6PsuTMMDsbF8PjteLQxew77puAMH/q/hZG2R6hCgN+5FBrMHa2ZJx45NaYzv 7++n/Lw8qqurG1NPNepTbN6BtT7YN9F9leqp4G+YQ8O/Ktjv4W8aC+IF5jsh wcFUXVXF+9hE9UQGNZws7mA/tVTDia/IsaMOWf+MCiWBHbi3kk64j4nj+JRc JP9Cf/b08OBrBdgfLse/MP7uYfEYaxF/Fxbyvm2MX+rWcGLcxBkKmLuhjdK9 Nsc5FNDTwKdGxm5TkOJZZmbmqH/1fMS/PhaPTQWfjTPi0k+d4vMmnNmlX6dl CnLPo8O+ENQ/oG7pUz5lDJJ/YVxC3EUtpTSHkhuPTWKkH7a0tFBMTAw/+0jy eVPO6DPmPDq0a6p8QIpnuE/+I3Oo7AsXKJjFNrnxeLKfLcUpU8/om27n0fF4 NjKHQl+4wObTxsbjyWKKJtP5PDrYPzTSDnPW+5qqiTiPzhBTNRHn0Rliqibi PDpDTNVEnEdnyGQ0EefRGWKqJuI8OkMmowk0Rn4BuWc87yKXgfnITOuPuiih yXTfu6UGQhOBQCAQCAQCgcAy+Q8sueNT "], {{0, 88.}, {83., 0}}, {0, 255}, ColorFunction>RGBColor, ImageResolution>72], BoxForm`ImageTag["Byte", ColorSpace > "RGB", Interleaving > True], Selectable>False], DefaultBaseStyle>"ImageGraphics", ImageSize>{46.51171874999994, Automatic}, ImageSizeRaw>{83., 88.}, PlotRange>{{0, 83.}, {0, 88.}}]\), \!\(\* GraphicsBox[ TagBox[RasterBox[CompressedData[" 1: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 "], {{ 0, 72.}, {189., 0}}, {0, 255}, ColorFunction>RGBColor, ImageResolution>72], BoxForm`ImageTag["Byte", ColorSpace > "RGB", Interleaving > True], Selectable>False], DefaultBaseStyle>"ImageGraphics", ImageSize>Automatic, ImageSizeRaw>{189., 72.}, PlotRange>{{0, 189.}, {0, 72.}}]\), \!\(\* GraphicsBox[ TagBox[RasterBox[CompressedData[" 1:eJzt3WWUXFWzBmDWd++P+/P7xx/cJbhDcHcI7iQQgiaQBJcEd3d3hwDB3Z3g 7u7uvm+efdfm9tdrMpaZ6dM99a7VkMx0ZvY5vWtX1Vtv1Zl+yIhB2/1riimm GPU/E/8zaPCey44cOXjv9f498S8bDB+1w7DhQ7dddfjoocOGjlx0yH9N/OKQ ia+3Jr7+e+IrBQKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCLSBv//+O/3+ ++/phx9+SF9//XX68ssv01dffZW+//779Ntvv+XvBwKBnsEff/yR7WvChAnp sssuS0ceeWQaM2ZMOuSQQ9IFF1yQHn300fTZZ59lmwzbCwQmD3zYm2++mc47 77y01VZbpaWWWirNPffcafbZZ08DBgxIiy++eNpoo43Scccdl5599tn0888/ N3rJgUDT4s8//8z2dthhh6WBAwdmW9tggw2yjzvhhBPS4Ycfnrbeeuu04IIL pnnnnTftuuuu6emnn852GggEuo4vvvginXXWWWmRRRZJCy+8cDr44IPTI488 kj7//PP066+/pu+++y49//zz6bTTTkvLLbdc9n0HHHBAevfdd9Nff/3V6OUH Ak0FPu6JJ55IgwYNSnPOOWe2t7feeit/vRbyNzZ46qmnprnmmistueSSafz4 8enHH39s0MoDgeYEPvLSSy9N88wzT1phhRXSww8/nDmStsCnPffcc2mzzTZL c8wxRxo7dmz6+OOP+3jFgUBzg80ceuih2cdtu+22Oa9rD59++mk66qijss1t ueWWHb4/EAj8J95+++00YsSI7Of233//9NFHH7X7fnU7flFOt8oqq6SXX365 j1YaCLQGXn/99TRs2LDMR+It+bH2oEZwzTXXpNlmmy0ts8wy6cUXX+yjlQYC rQGx4U477ZT93EEHHdRhfib/u/jii7PNhZ8LBLoOsSSuEhe53XbbpTfeeKNd jcknn3ySjjjiiBxbqtnhOAOBQOeB67/22mtzXU6seOedd05SY0IbRheGt2Sj nYlFA4HAfwL//8ILL2Sfhbvcc889c47G7mr9nfrBe++9l0488cSc+6mN33bb bZXXgLkGZ4V1iou9nDOhGQ00Et9++23WNPNz9F377bdfuv/++9MHH3yQ6+By PFqv448/Pi299NJZG3bggQem999/P+9bdmtP06tUqfeAremLcIY4Hy655JKc i6rlP/PMM/naqrTeQP8Bm2FfJ510Ulp++eXTAgsskHUpo0aNyrzK3nvvnePJ RRddNNvkHnvskfds0VvyG7Riaghq5r/88ktDr4cNWcNLL72UdTN8+Oqrr559 sxfuR23RGfLkk0/msyLsLtDXoPX68MMP05VXXpm233773EfAn4kjcZpsbZNN NsmaS36DDrOAH1QnZ698pJpfI3WY7O2xxx5Lu+22W163mHmNNdZIO++8c9pl l13S+uuvn88Vr6FDh6Zbb7017C7QENhzfBabuu6667J9HXvssdn/sUW6THro n376KcdtBb52yimn5PoBnfRVV12V93Aj4Ox47bXX0ujRo/N66Nn0H9133325 FomX1QdI082XzzLLLNkPPv744/2iT8JZ6Dojn60eSo5Gd1JszOekl+DBBx/M db2yR33dnt1www3TtNNOm7bZZpvMy9TaZV/hm2++yf21/BsdtvxN3lbrd+01 OewNN9yQ40x+EAerH7dVUT5PObg8QJ9IbawSqCbMapCzbbHFFrmnrraXx/fO PffcHI+qI5xxxhnZ//X1WVp0NXwcDrbwPG2BjR199NFpxhlnTGuuuWbeh/X9 FK0AZ6L4/6677so9kfy7Xix1nvB11QYOkC3xC4sttliON0sMyfZwFurqfN26 666bz9O+jNfsH3kcnmT++edPV1xxRfbTk4K9aB+qTYqJ5XVVr310BeIMZyHO WXwtp51pppnSzDPPnHbfffd85oTNVRvshx2JIaebbrrch8DOim+wv9XX8Zvy JPEanUtffa722O23357PhCWWWCLHux3Ft3ybcx9XdPbZZ+eYs9nh/PNZvPrq qznOHjx4cI49pplmmnwe0R3JzftD/toKMKMI/yCGxGf6M/8HbOudd97JMd30 00+f+Qs20Fe+wx66/vrr0wwzzJDnudCCdmTvr7zySp7/Yk/ii1xfs8K1ytFo F+SqeFs+XNyx0EIL5b/fdNNNuS7UijF0q8JnxTfg2H2WePdazg9PL15bccUV s93hD/uqdmAN6t3iJ/wJHqej38tPb7rppvkMobERizUjxMm4Ij3Haqr8mftf dLHycHzupPqRA9UG/dTVV1+dczpcBc1zbQxJB61eJ74UZ/ZW7YD9q23gKtm6 /XTPPffkupvf68/tcXPW67zgj/0b+Wlt/icuxdlWWaviHoiHaRFOPvnkPDtq 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 t256TS/3LuyuffwvS0EfNg== "], {{0, 98.}, {221., 0}}, {0, 255}, ColorFunction>RGBColor, ImageResolution>72], BoxForm`ImageTag["Byte", ColorSpace > "RGB", Interleaving > True], Selectable>False], DefaultBaseStyle>"ImageGraphics", ImageSize>Automatic, ImageSizeRaw>{221., 98.}, PlotRange>{{0, 221.}, {0, 98.}}]\), \!\(\* GraphicsBox[ TagBox[RasterBox[CompressedData[" 1:eJzt3Qe8ZlV1Pn7/aoyJyScaiTQpAlIMHQSpglIEBASlE6oDiIB0EQlFAYNB kJIIOvSiIiUgbQQp0jvSERDpCIEgASkp++d357/wzOt9Zxi4c99z3lnP5/M6 OHdm7jn3nP3stZ71rLU/stVX1t3mne94xzt2e+8f/mfdLb+64q67bvm1z7// D/9nvZ12+9K2O4374mo77T5u23G7fmKrd/3hN//3D5/3/n/veMe7//BrSSQS iUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQi kUgkEolEIpFIJBKJRCKRSCQSrccrr7xSHnrooXLjjTeWxx57rPzP//zPoC8p kUgMGK+//nr59a9/XU466aSy9dZbl7XXXrvsvPPO5dxzzy3PPPPMoC8vkUgM AP/93/9dnn766fLTn/607LDDDmWxxRYr0003Xfmbv/mbMtNMM5VPfvKTZf/9 9y/XXHNN+c///M9BX24ikRgD/O///m/53e9+V6677rpywAEHVB748Ic/XOab b76y6aablj322KPGELPNNluZY445yjrrrFOOOuqoctddd5XXXntt0JefSCSm El599dVyzz33lKOPPrqsu+66Za655qrcsOaaa5Z/+Zd/Kbfcckt5+OGHy+WX X17222+/sswyy5Tpp5++/P3f/33ZYostyqmnnloeffTRyjGJRGI48F//9V91 XZ9xxhll3LhxZf755685xHLLLVdjiCuuuKL89re/rVqEvOP3v/995Ymzzz67 fPnLXy4LLrhg5Yklllii7L777uWSSy4pzz///KBvK5FIvA2oQfzHf/xHjQf2 3HPPstRSS9V4AT9Y9+edd1555JFHat7QGxPgCbrD3XffXY4//viyySab1Hhj lllmKausskr51re+VWsdL7/88oDuLpFIvFVYt7feemv59re/XVZfffU39ISN NtqonHDCCVVPeOmllyZZx8QZYo/nnnuu3HDDDeXQQw+t3CD2wBXrrbdeOeaY Y8p9991X/1wikWg35Ahyg5NPPrlsvPHGZZ555qkxw6c//elyyCGH1HUuN7Ce mzGDGMLf83W/ih8C/hzt4oknnigTJkwoX/3qV8uSSy5Zcw65x7bbbltzkaee eiq1iUSihbCeaQgXXHBB2XHHHcviiy9e93m/7rXXXnVdP/7445U/etew/29t 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 R+hdcG7ND3/4w1Gb9zhIDCs/uC96ln4Rve4+ZmC2LcenjfC986mJT+VBw7L3 vF14hvz85orI7fUFfO9732vl+4nvr7322rLJJpvUdURT0h/ZdQwrP3heYgXz MJ0f7v7MrmnTvgOux97j586jJoZ2LuEwPIO3C8/QPALPkDfHmjM3OUCXwPf2 gTczJ220IL4z80CvUnxfz1HOYw9yBoUzaPUrdP05DiM/iPc8O3mqfccMG2su zih0z+7Ru2bWLz1prD78qrypzVq5d8zew9MufzXzU49s27hsLOEZqkebkyiu 8gzNLYzcS+wuzhIf6jH0sx0L+P56m+US1ox5TPGcfM0etNNOO9U96Qtf+EJ9 rl3GMPKD+Xbnn39+1ZLl9WZ9m6/b/Lr3yUxdvan08LH6iA/WXXfdOtvTvhcQ RztTxExyZ5Idc8wxQ1Unm1J4B+Vdce4KjSa0W++snw0vhFnK5qv777EADrj1 1lvrfHf1MNzUzAfFM2eddVbtU/Du8UR0WXMeNn4Qc95///31bB6aJI7wnjW1 Inq4eVjmWfz1X/91+fM///Mx+/zlX/5lPUtMndzcreZ123s8BzGEM0PM+us3 N3SY4Z69k7QY85Y9Q+etRe2XZmmNmoVs/oDasJ/dWMA1eG7Ow5UP4ifcFO+X a3ee1b777lvfPx4Xe1VXY8Fh4wdzLMy2Eo+qGVqHzX0aPEucbv2ZdeH5jtXn 1FNPrV4oc8d7PZP2HucRqsWa0yU/EmNPa1CTpv9be+oBnmHoyqE7OyfK19SG xV2Tm4U2mvC9eKrxk9jGPDV8FbB+nBXBU4nrzWG0xrqIYeIHz01ub+6ms8Ht K3rPRvIcuW8fXxvEZ6T9xO+LVeVD6vyf+tSnKpeM5bs/aMQztPZokmrS6psB GhJe57FW79xhhx3qvNWxhGfH82D+wZJLLlk1Lt6VOA83tBMz3u1RckZnR42l hjpaGBZ+cB9iAnGfOph9RY4vl+gSvP/2npjr57yipmY/zPAM6bY0R7GBmrRn GHGWdadX5Zvf/GbV/8RZzpMfRA4mBhUD0kVci1zVcwvgAn5YsYUYg17R5Lmu YFj4wbq6/PLLq/ZnXdGQ6cxdy/tcr73HfkSnsPfISXpnjg8joibtGdIV6MdN 7Y+uLJ5ybqNnbOZZb+44lrD3uB4ag+sR94WmFFwn97FXeZb2rq7tV8PAD/YV 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 FPXOtu9NngMu4AsQG/FD2lciJ7W/0Fto/jEHw9yRtt9XP8S517xfYiH5IF5v iy9oaqB5jq93Uw7Z9jN/usYPEF4be4+1Yq5fU4uM/BZ3iDF4Ttq+N/XGBnKM pn8oZk7ymVtL+jG6MHNyUoizeeWDtEqzldqo4Y8GYjav2TC8sIsttljt5277 WusiP8RMEf0scojw2sReG/VOMQZ+UO90VlNb8/TwOtlX8J0aDV0lYqLm+fDy jjijt837zptBzI6hI+uxMcPCOaNtf//eCuIZmjtunek77kJ9rYv8AOG1sffQ +Z2LTOcPRH4b516LMdrqxeGTUcMUG8TsxYgNwke533771biC7qJ/e1g8AzFb Sf+t3gzPSx2769zXhP3KM3QGhv3KM9Sv1tb9qomu8kPMNNXT2TxLq+kTEJ9H vdOf0afRNn8anou+/zjPwpyQWB9ypXPPPbfmSnQJmn9ba2FvFZ4JDck9io/4 X9us2U0pPEO9yM7AoLWYV93WPpledJUfIHovaN94Wfx9xRVXTDQzXX6rr5Me pN6pV7ote1N4nQ466KDqJ1TnExs0Z5eKQd2fdaMHXz/+sGl47hPn0YnUpdV1 5YNt7SWZEsRZo+ZSewf1cNPOunJvXeYH6O29oDmI5QJ6EmgTdD9xhHpnW/am 0FHtK67dvtJ77WZamGnMK0nrjzPahg048corr6zzscwDMuu6+bPoKsSz5lHT yOwBZje2vU+mia7zQ8wWEJNaQ729F75+3333Vf3BHiy/pUsMmr/jPG7XJeYU G5hFHTmpGIGeIuahWZpxIRbqaj1zcgh/LH2fzsIjK3fsQo7eD3JHz4w2Zm15 hs3ZWV1A1/kBQouUX1hLvA/NOlnTd6R/C5cMOocPH5fYgG5vX4m+/9BOaPl8 5GZbmPEVXvJhBS7AidaTeqfZxG2atTsliH52+pfnS/9Sp+lKn0xgGPghZs3F elJbbvZeNPNbMYZcRE4yqH6YiA3U+2mS1oFaTMQ0rpvOIKYQ8zg3gQ7RFt1k aiFmkuNCz5C/EG+2TVN+M4hnGP2C6jNNL2xXMAz8AKFFWnNiiJg11zyjSX5r joo1R/Mb1DxbPhnz+9X8rQNep5jHGN4N88bEOjR99Ys29vZNDcgL5YN6TPiu zc6iOXeJG2OWvThV7mg/kvN2UVceFn6I2QLNmJ2epwYaX7cu1UB5DMTsYoyx 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 esc6azteffXV8vDDD5c77rij3ncg+SGRGBnWifWAH5ZZZpnyox/9qK6jyB/8 av1YU8ccc0xZd911y+yzz14/a6yxRo3T6RNd1Sbc33PPPVfOOOOMynvJD4nE H/H888+XE088sSy66KJ1zW+33XZVx8MbzbjAevF711xzTTnooIPK8ssvX2aY YYYaU9Am/BsPPvjgRNzSZrjG119/veqvEyZMKNtss03lhgUWWKDei7pNIjGt g253ww03lO23376uD5/VV1+9fOc736kxw8svvzzRXmpNPf744zV/32WXXcrC Cy9ceQK/7LjjjuWiiy4qzzzzTP1zbYX7kRfdeOONVY/4zGc+U7lx7rnnrvzo 97vAcYnE1IZ1QIe0JsQFK6ywQq3/fexjHyubbrppOemkk6quh0diT/V3/P8H HnignHbaaWXzzTeva2uWWWYpK664Ytl///1rnNE2bcL1y4PuueeeMn78+LL+ +uvX65511lnLSiutVDkxcqVEIvFHNOOC3XbbrSy22GJVi1x88cVrXKBm8eST T04UF1hvuOW2224rRx99dFl77bXLbLPNVuaYY47630ceeWS58847awwyyHg9 +OyRRx4pZ511Vhk3blytxeBB97fHHnuUn/3sZzXXyLwikRgZ1hEfkbjg9NNP L1tssUWZZ555alwgrhAXXHfdddUX0cw5xAjPPvtsufLKK+ufWXrppWvOQfP0 b/z4xz8ujz322JhrE6ExuLbLL7+87LXXXvXa3M98881X65yu7de//nW9tkQi MXnYQ3GAuEAMwHMoLuArWmeddWo99O677/6TuIAf4tFHHy3nnntu2WGHHcr8 889fZppppvKJT3yi7L777uWSSy6pa3UstAn89cILL5RbbrmlHH744bXWQmOg r3zuc58rxx57bLnrrrsyl0gk3iKsMVrjFVdcUeMC9T8xuXW/5ZZb1hiDn6C3 HioGue+++2odQG0Dr0SOT+Ogh1q7U6OGiK/4Iu+///6qnWy88ca1xuL700bo kddff32taaYGmUi8fYgL5O7igp122qksuOCCZcYZZyxLLrlk1SouvfTSWvvs 1SZwwM0331w9EjyY/g6u4HH+3ve+V3s6cMlo5PzWOp4Sv/B4qcfQUOQSoTGo Yz711FOpMSQSowzrTz5hTR9//PFlww03rGtd3rHKKqvUfqebbrppRG2CF1tu If9fYoklKk/gGJ4D3ky66FvVJkJjiDiHr1OcI14IjYH3KTWGRGLqw96rbilH UA/kHbAW1QnXW2+98v3vf7/mFuKCZs4R3uYzzzyz9nDQLuUqyy67bPna175W 9UMx/5TUQ0NjuPXWW2uMwrehdkJnoJnQSdRPUmNIJMYW1rFYXW6x995717hA zULdUFygr8vXmz1ceII2QBfUC8p/EOsZz9AR9YdOLo7AUWIZdRYaw0YbbVQ1 BnzD13nggQeWq6++umqhqTEkEoNBxAVidzE8X4G4gG9CXPD1r3+9xvzigl5t gq+bTigv0RcVNVSaZ7/6Rnw/tdLzzz+/fOUrX6nagu+3yCKLlJ133rn6N/SU tcmXlUhMywhfolheDxdvlJwjvNqHHnpozQF4qZraIB7gubr44ovLAQccUPbc c8+qU/TWNZo+hquuuqr+WbUIcYe4YbPNNqs+TvEEH1QikWgfoofLGhbjiwdo kdawOuMpp5xSNYjmfJmICez5+rvEFb3/Js1TLwiP5lprrVV1Udyz5pprVo2B Jxr3ZC6RSLQfTa/2rrvuWnu38IRcQH3U7/MyT8onJc6gceIMsYEYQU8IjUF9 4pvf/Gbt8cBHWa9MJLqF3h4uvV5zzjlnXd/iCvGFGohaSDOfaMYTF154YdUY +Bj8PTVRvkyzXPBPzmhIJLqN8GrzOX/3u9+tPmdapHqoWTNmseinpF+odcSM CRqDeVZ0DPmE/OTkk09+o3aaSCSGB+oJTa+2+oacwzwWHibahP6uo446quoK Yg3csNpqq1VeoW/yOqTGkEgML6KHiwfaLBaagh4uuQPO4HlUr1xqqaXKvvvu W2dc4pXUGBKJaQPh1ZZXHHfccWWDDTaoPu3pppuuxhOhMeCR9DEkEtMmwqtt dpV+LZqDPIPGkD6GRCIBYgS+B14pWmZqDIlEIpFIJBKJRCKRSCQSiUQikUgk Eoku4P8BJiQ4iQ== "], {{0, 254.}, {264., 0}}, {0, 255}, ColorFunction>RGBColor, ImageResolution>72], BoxForm`ImageTag["Byte", ColorSpace > "RGB", Interleaving > True], Selectable>False], DefaultBaseStyle>"ImageGraphics", ImageSize>{40.73046875, Automatic}, ImageSizeRaw>{264., 254.}, PlotRange>{{0, 264.}, {0, 254.}}]\), \!\(\* GraphicsBox[ TagBox[RasterBox[CompressedData[" 1:eJztnQm8jNX/x+vfoleWVCK7a8mSiCxRkjVl30WWm+6VfYuLyBoi+xKSJaFI EYok+xLZl8h6o5CU9r3z8/6+Xsf/MWbuOnOfmbnf9+t1izFz53nOOZ9zvst5 zjfi2a4Nov/vhhtu6Hnblf80iIyp1KNHZN+GGa/8pXGXnu3bdYl67skuL0S1 i+rx8LM3XXlxxpWf2Cs/N1/5MYqiKIqiKIqiKIqiKIqiKIqiKIqiKIqiKIqi KIqiKIqiKIqiKIqiKIqiKIqiKIqiKIqiKIqiKIqiKIrr/Pvvv+b33383ly5d Mt9884356quvzJkzZ8yFCxfMjz/+aP766y+3L1EJMP/995/0M/1Nv589e1bG wddffy3j4rfffpNxovgX2v2PP/4wsbGxZtGiRea5554zDz30kMmePbvJnz+/ qV69uhk2bJjZsmWLuXz5srxfCT/Q1g8//CD9TH/XqFFD+j9XrlwyHqKiosyC BQvM6dOnzZ9//un25YYN6OmXX34xmzZtMpGRkeaee+4xd955p7T7fffdZ/Ll y2fuvfdekzFjRlOsWDHz6quvmnPnzqkOw4x//vlHbJ4pU6aY4sWLm7Rp05qs WbNK/zMOcufObe666y4ZC08//bTZuHGjzNtK8sG2QH9NmzY1mTJlMpUqVTIT JkwwR44cEZsE+2P16tWmbdu2okvmxcGDB5uLFy+6femKn2D9w+YcM2aMKVCg gMmbN69p166d+fTTT2VdZBwwHkaPHm0efvhhGSd16tQRHapdmjyY+06ePGli YmJkfmvZsqXZu3fvdWsc78MnGDVqlGiQfli4cKG8roQ++H6LFy82jz76qKyB 06ZNM7/++ut17+O1NWvWmNq1a5ucOXOarl27yrhQkg426NKlS03FihVN6dKl xdb3BXo7deqU6du3r9go0dHR4j8qoY1zHs6RI4fp3Lmz2KS++Omnn8ySJUtk zJQpU8bMnz9f/ZJk8N1335mxY8eaPHnyiK2Jrx0XtD/rX9myZU21atXERlVC G+Lg69evN40aNTIlS5Y0c+fOjfP9aPbo0aOi1WzZspkBAwbIXK4kHux47Ih+ /fqJHco8iMbigv7asGGDadiwYYL6Swl+fv75Z1nXiAMkdF4lFjBy5EixR9u3 bx/nuqn4Bj97//79YlOyDuJvB+IzSnBDzOX111+XmHezZs3M7t27E/wZfEdi eQn5jHI9qkEFnBpMqJ6S8hnlev7++29z6NAhsSXI/YwYMSLeOCd52V27dpk2 bdpI3mjcuHEpdLVKoEBPs2bNMiVKlBCfcMeOHfF+5vvvvzdTp041hQsXNi1a tJB5WUk8xLLOnz9vhg4dKnHOLl26mG+//TbOz+B7f/DBB6ZKlSqmfPnyEs9W Qhv6dOXKlebJJ580FSpUMO+9916ccU7+jVwi8XHyhD169JDYnpI0yAvNmTNH 7PqaNWtKfMzXWmg1yz4Z1sAmTZqoDRIG4F+QE2YfGv3KHrW4YnPkCNetW2fq 168v+2fYz4FNpSQNbMvPP/9c9qjh3/Xs2VPyE546RH/o9aOPPjK1atUyERER YrsSJ1VCH/ZCkZcvVKiQqVy5suSM6Vvnemj3ch87dswMHDhQ9moQH9+2bZuL Vx4esAebPGupUqVknxI2xuHDh6VfiFujPWwPbFDanJwQ+wU/++wzty9d8RNo 68CBA6Zjx44mS5YsYpcuW7ZM7B76n3GAvblv3z5ZJ1n/7r//fjNx4kSdh/0A eULamr26tGvmzJll/wN2/muvvSb70/C7sVPoH3S4du1a3RsRZqAl9g3T1/h5 7BklV0HsmzWyd+/eskeR8fHAAw+YV155Rf1AP4KeiHVhg9SrV09yrzw/wbMS PENBDp+42QsvvKAxsDCG9fDgwYOmf//+pmjRotLvPCvBGECX+CDs1WavVHz7 OZSkwZqIbYqPOHPmTDNkyBCZB999913ZK6p7tMMf+ywp/c2cTAzu5Zdflnwg /oc+P6ooiqIoiqIo4YsvW5/X1Q9IHcTV1zoOAgfxFvYO8jwTMVLbztZHZx8b Z2vps2LhDfs2yDmQr3Lm/ojX2VwxuWM9w8K/oDOeCZs8ebKcZ8BzvfbcLLtP u3v37rKnl70ySnjCnjPOjeG8oGefffaaPTB2bzd7hcnTM08r/gMNssaRF7r7 7rtNr1695Kwn4P/sD2zQoIGcbzdv3jyXr1YJFMy3PDfB2ZZVq1Y1H3744dV/ s8/tct4F+2k4f1bxH6pBBVSD7qEaVEA16B6qQQVUg+6hGlRANegeqkEFVIPu oRpUQDXoHqpBBVSD7qEaVEA16B6qQQVUg+6hGlRANegeqkEFVIPuoRpUQDXo HqpBBVSD7qEaVEA16B6qQQVUg+6hGlRANegeqkEFVIPuoRpUQDXoHr40yOup XYOp6Rwxbxq0968aDCyeGqQGGmf48HPu3DmzZs0aqTeXmjTIOXOcIcfYo7ZC ajjn36lBzm6i1hZnqXF+E+epUe9ONRgYnBqkzgtnaq1atUrOVxs+fLjUeaQe VmrQIGf2ob0vv/xSasK9+OKLcp4YdfeofxnOa6LVYNu2bU25cuWkthK1t1j/ Fi1aJPYRte9Ug/6HcXfmzBnTr18/c/PNN0u9HWrU33TTTSZNmjRSe4f5r2TJ klK3NxzPlkRbnKdJO7z//vtS94vaU7feequ0B+c6UieauYrzVsNRi9z/1q1b pb4ktZaoc3bLLbfIGODPjAHapH379tJO4dgGboCNRS2d7du3iw1y4403Xm3z IkWKSE1C+oPXChYsKGdLcg5wuIxDW1+WM4zxezlHlRqzadOmldrEzDvURr3j jjukBiNrADXDOeeWz4VDGzCnor+TJ09KvS3WQOZi+p3avNQbZDwwBmiHpk2b ytmjqcVGDxTW5jp69Ki0O7Ym6x115h577DGpeUbdVepd4R9Se5X2z549u9gq jNcLFy6E9Di08w9nGGN3YWvffvvtUn+RGNTbb78t8w01afk760CGDBnMgw8+ KHPR7t27xV8K1XFo5x/68ZNPPjEdOnSQe0yXLp0pXLiw6dSpk9m8ebM5dOiQ GTdunKlQoYKMD2IGxGwYN8ePHw97G93foD1inbGxsWJbNWnSRLTFj63zSf1B 51n3jNPVq1ebZ555Rvooffr0Mj/iPzIOid2E0jikDRg3+HizZ8+W8cS4w86q VKmSmTRpksSiLNwbMYkZM2aYihUryvtor8cffzwkxyHXyZnaxFp27twpdSax d5h/WPtZ56g56ayzi92zZ88eqZVevHjxq7VhGzduLLY7tqlnDXvlWmzdCHxp 4i1RUVEma9asV/XE3zds2CDzojdszWxiMk888YTYJqwJ1EemjjYxDOqWB7Ov aH0+1jbGTfPmza/WG2YNJP5y+PBhn5+nbTgLnjFbrFgxGYd8njWStTIUfEX6 h3764osvJN5CbQPsbsZCjRo1pNYn/ewL5potW7aIT2htdOI0rVq1knmazwZ7 G6Q01t4gxr5x40apK46dYf0dYg/Lly9PcG1jfhd6w1ZFf9gl2Cc1a9YU2y0Y 50OnzbV27Vrx6RhzrH3MP+3atZO28Zx/bG7M816wI4hdYLvhOzIXYR9go/P7 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 "], {{0, 154.}, { 225., 0}}, {0, 255}, ColorFunction>RGBColor, ImageResolution>72], BoxForm`ImageTag["Byte", ColorSpace > "RGB", Interleaving > True], Selectable>False], DefaultBaseStyle>"ImageGraphics", ImageSizeRaw>{225., 154.}, PlotRange>{{0, 225.}, {0, 154.}}]\), \!\(\* GraphicsBox[ TagBox[RasterBox[CompressedData[" 1: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 WdPef/99zpACQIBSUlJcXcYKFSq4uItqealWIwAgLIqXf/PNN9azZ09XD+DG G290+6QAgLD480WTJk1y54tKlChhTz31FLXTASBAyl387LPPrG3btm6N3rFj R9u+fXvUwwIApJLW6MpreeKJJyxv3rxWqVIlV1tX50gBAGH5/vvvXS+jOnXq WK5cuaxXr1526NChqIcFAEglrcUVYxk0aJCr6dKoUSNbtmwZuYsAECBf0+WK K66wQoUK2fDhw6npAgABUu7iV199ZV27dnX10Vu2bOl+DgAIi2IrR48etYkT J9qll15q5cuXdzVdlP8CAAiL8s4VN2/atKmLo99xxx22Z8+eqIcFAEgl1XTZ t2+fjRw50tXo8jVdyF0EgPBoD1RzePXq1S1Pnjx27733ujOkAICwaC2+ZcsW N4/rvOj1119vq1atIncRAAKkGovTpk2zUqVKna7pQu4iAITH13Rp166dZcmS xW655Ra3ZgcAhEWxlcOHD9v48eMtX758VrlyZVfThX50ABAe9aNbtGiRNWzY 0OW6dOvWjX50ABAg5S7u3bvXHn74YcuRI4fVrVvX5s+f734dABCWU6dO2dtv v+1q6OrMqGq60I8OAMLja7rcddddrqZLs2bNXD86chcBICy+H92UKVOsWLFi rvbic88952LrAICwqKbLypUrrVWrVm6Nftttt9mOHTuiHhYAIJW0/6maXKrp on501apVszfffJOaLgAQIN+PTvW5lI/ev39/+tEBQIBicxdV06VBgwb28ccf sy8KAAHSnL5//343p2fKlMnq1atnCxcujHpYAIA4KSf9gw8+sNq1a1uBAgVc D2nq6QJAmHz85bHHHrNcuXLZVVddZUlJScRfACBQykP/5JNPrHnz5q4/3Z13 3mm7du2KelgAgDhoTX7kyBF3zkg1AcqWLWsvvPACtRgBIFCav7/88kvXQ1rn jm6++Wb3cwBAeLRWV72umTNnWsWKFe2yyy5z55DobQQAYdJ+qWoCKPfF56t/ 9NFHUQ8LABAnrcvnzZtn11xzjeXOndv69Onj+h4BAMLjzyE98cQTrlZAlSpV bPr06eQ2AkCg1GN6zZo1duutt7oYTKdOnWzbtm1RDwsAEAdfT/3ll1+2EiVK uJrqWreHUqtR47/Q3yu4BlwDIJbm740bN1qvXr0sS5Ys1rRpU1u9enXUw/qP NGbVlPz000/de4b2Bi60e9pfg88++8zWrl17QV8D9QRYsWKFpaSkRD0kIF3Q vaD+pKqprlowQ4YMSZf3h/YAjh075urW3HLLLa5PU9WqVe2+++6zzz///II4 OxV7Ddq2bXvWa5DR53Zdg+PHj9uSJUtcD8Yrr7zS2rRp434O4F/3iGoEDBs2 zNUMqFOnjpsz0gvNUar/rvcHvU+UKVPGLr74Yvvd735nf/jDHyxnzpxWt25d Gz9+vB04cMB9PhmNroFqO2jeHjBgwE9egyeffNK2b9+eYa+BenWpn+6DDz5o FSpUcN+vefLksa5du9qmTZuiHiKQbmjOXLp0qes5rfnh7rvvdnkxUdM+ru5V 1R5Tbo7uYZ9TP3bsWFc/uHz58vbHP/7RChUqZC1btnT9m3SuKqOsV7X21t71 U0895dbkl1xyyf+5Bo888ohbq2pu13uWvobTpk1zdSAy0jXQmQrVsrj22mtd HTqdg7766qttwoQJ7jmm+R7Av/haMM8884wVLFjQ1YJ58cUXI5sTdA/v3r3b Jk+e7O5hrcW0LtW8rrlN9QwUgzh48KCrBa/8etWwUX34UqVKuXWb3sW1tg11 XlO8WO8dr7/+ul1//fWWP3/+09dA6/GzXYMiRYrYRRddZJdffrnLY9IZhNCv gWLms2fPdrEmfW9qLlfMSWv1devWuWsQ6ucHpCWtiXWPdOzY0d03illv2LDh vI5BMQM9W9577z2XY6k5SvOY8nIUM1ZdSd3DPrbgYxJaw2l9rjHrDJXWsZr7 tDewfv36YHJ5RJ+b3jMWLFhg7du3d/UbdA1Kliz5X6/BW2+95eY+XQN9DStV qmSDBw92839I10Cf08mTJ2358uXWs2dP95zW56N3sS5dutiiRYvcXJ8RY0zA uXJmLZiiRYvaqFGjzsveo4+ZK16sXqmlS5d297BiCZrX3n//fbdm1XPnp/68 +n5888039vzzz1utWrVcPEZzW/369d37uXpsp+c5wF8D5bEoZq53JeUi6XNo 3bq1e8793GugGIViM/7P+2ugd5/0fg30fPr6669dXE3P5Rw5crh4oGpE67mt r+NPXQMA/5fWclu2bHHzquYDzQVpXQtG96f+TeXGq1eH4sX6uO6661zuvGKl mut+7vi1htV+qvZ89WzwsfabbrrJzQla/6W3d3V/DRRTUYxYn7+uv/Y9p0yZ 4n4vNddA5w6U56l9CMXaFY9J79dAawft1b/00kvueaRnka6B9hAUb9u8ebN7 ZgFIHd03H374oTVs2NDFZbUPlxb8e4HWn40bN3Y1CrQ21z08evRoFzOJd+7R /KA1reLJ3bt3d3FYxdo1x/fo0cPlM2tPLep5TWtm1dlRzKRJkyaWN29eN07N w3pHSk5O/kXXQLF2xXCUL6QYjt9v6Ny5s4tfpJdroHibcq30Tla4cOHT8bYH HnjAPZuImQPx8/OM9qU0rygWkBY05ygvTXOs5nLFi/V+oBjq0aNHf3H817/H a52vWjbKidH6V7kz1atXt4ceesidt4oiFuHjxdrHVb8pneHNnDmz+//evXu7 Xz+X12Dnzp3uuaEYTux+g2Lt2kPRv3O+50z9ezoHsWrVKvd1176nj7clJiba /Pnz3TMppH0AIL3SPKf7TXO75oS0+jf097/zzjs2fPhwt05T/uS5jpX6uUPP D+X1KNau9apyaRo1auTyezR3nI85zcfMtWep/VvlYWp+1fpc+7u6FuobmxbX QO9feoYp1q4zCLGxdl0X7bGej+ebf85oLHof8/E2xcz1vvbaa6+5Z1Bafd8B ODd0L585Z8Q+O35uvDheWu9p7av3gIEDB7q4kmLtyq3x82lanrHXe4neGTR/ ak7VHKYYQ40aNdxz5dtvv03zM/663oq1q6bAo48+auXKlXPXQHmgWsMr1q5r lFZj0Ndg37599uqrr7r8TD3L9H6id4Zx48a5/V19PxBnAdIv3Z+KhypGP2nS JPfjKGkNrHlF7wXq4ac4vuYVvfvrrNWyZcvO6Rl7zWN6D9B8eeONN57OM1de i+I/im2d7zNSPtaur4ly+TWna0zab+jWrZstXrzYrevP1Zh8TQP9e7fddpvb r9W/p1hTv379XPyFmDkQBt3Pyj9TXovmUMUWouZjIFu3bnVnLlW7TLFcxdoV C1C+iH7vl8QifMxH7wXap/Uxc82fqlOiPUq9n0QVLz5zv0HPG7076Br43P4v vvjiF8WBfMxH7wWKmWvfU9dZ63OdP1COquJtF0KtHiBq/p7Xu7g+fio24udH 5S6otlLsHKXf0/2q+Kje9du1a+d+rLkyPeRJawzaq9Tcpfwe5RH+6U9/cmt3 xXaVR5jaWIS/borfjxgxwp370Typ2LWvXaCcvfRylt0/e5QT/uyzz1rNmjXd fkNsrF3jTe3XS88CxZMUU9Eehq9poHyqqVOnpipHFcAvp/tNuektWrRw+cK6 t892D2odlpSU5Prg3XvvvafPteicn961tQ+mNZ/mSJ1l0pluzZ/6M4qBpAd6 DumZpLiL8ucUg1BOt9bWyq+bM2fOzzpj73OsFR/XfOhzTGrXru3mS+0LnsuY xrnk4yOKgwwdOtRdAz3fFCdp1aqVzZo162fFR3xNgxkzZrjaMz62pZpbY8aM cc+O9JgfD2R02q/TvOvvba2vlOt85r2o+1NzmN6nb775Zhez0H2tulM6Q6Pc Eu0Jak9S97d+rFiH8ug0x6UXvu6fnjOaw5VPp7w6zUcJCQmunorOMmnuO/Ma +Bzrd999181/+nPKK1HMXGeflGOtvcn08G7y3/jcfuUSKkakz0XrdsVNlNeu 2gRn28v1+6+KKSnGpjxzXTudR77nnnvctdM7TwjXAMiIYuf0X//61+7dWftn WofGOtuc7uMPmh+1Lvv444/dfa25XD/WXK6/Jz2+e2vs+tx9rF01xDSn6Yy6 clRGjhzpYgp+bte6W/Ocro3mPc1jOuOkvHM9A/W+ElqOdWwNGdWK0PlTvW8o Fl65cmUbNGiQqwXk89p1vZTnrnwi1QHWf+trGiifSN8HoV2DC4HPRTvbOuVC cSFdg9g5/be//a2r5ao5S3GT2Nzhs83psXStFI/RvqP2xfTjEPhaWspLefzx x935Vr2vKG9FzybFhPV7OpelPUXNY9pj1O+plqLmw9BzrH2sXfO3Ym/ab1BM SvO1ajc899xz7kyuYuY6x+VrGuhdTGf8VdNA30dIX2L3fNR3QB9+nXIh0Xu5 ak7oXlZs1Ne6y6hzu5/TFXfQeXLFy/25ENVa937OnK68F8VSb7/9dvfjkCgW obW28vv0rqEYktbtyl9RbEVnl7R+Vb6M5jbNfxktx9rH2tUvUOfD9GzXNdDz TdfD1zTQ9dC+sO6NjFTDPiPx5ySefvpptx+ur52+jnpGKydAuVgZ/eumeVvz kGp5K6as+KI+VF9J93A8OQEh8HO6ao8ob0F18lSTRHOYYsvKb5b/NqeLciAU o9XaNcSaej7Wru8D1UxQ/o7Wqnp30fNOewOKF8fWwM2IfF679s6Vn6lroF5L ip2rxoPyNrWvkJGvQaj8OQnd04qJ6X7VO5diivo6+vN3+t6eO3duhluXiO97 qO9fxQwUI9U10PulfqxroP9XrFE5ARltLz92TlcOh+KiEydOdHteWo/pjLnm 558zp2cUPnas91T1cFX9WvWj0L1yoeRY++ebclJVf03rPeWZ69zBhXINQuL3 fNSLW8/h4sWLu/iY8pm0B646d7q3O3To4PpH+Rwl1epXbDE91Hn7pfx9q89H uXna89E10PuJPm/dy3qO6cyhrouvdafro72yjHANJHZO1/uJYg/a29QaXc81 xY0VS72Q5nRPz3tdHz3z00ue+fnmY7LKdUmPe9341/uxYoF6x9Z+h85JKH6q dajmMT2H9f2r72XtfbzyyisuJ0BnfPXfKQdXuWvnqxZQWvDnY7QfpPio3ks0 n9erV899vsrP0/evPhSTUg6uzt9pXtcemfbR1B9Svxf6Pv+Zc7pi6Po1vbfo 6645XOe6dU0utDkdSM9i+x4qTu77t1arVs29V+kePXPv2ucEKH9J+Qy+FpDv 86v8p7SsBXSu+RqBmsO0/lQeteIs2h9UXoP2fM6MrcTW+9M7uHICfv/737u5 TddRtU1CugZnOtucruukOIOeearHra+78mAUk2FOB6KluSY2Xqz5WLEU7Wlr z0fnpf/bubHYnAC9k2uvJLbPr87lpefcED8vK4agWIrvU6w4ufKNf04tb99b R+fvdAZRf4ffb1BvT53BSK9nB0Xj8h+xzjani77misGozrfe5ZQHo689czoQ DV+fQ3O2zgioHl1svFj7Hanp3+r3TJR3rPW5YhG+toPW+qo9p5hOeorH+Fig xqXcK9Wx1vykWIvOwiu3QTkOqdnz0X/rzyAqZ0/XQM9I/d2qX+TrIaWnuV3j UaxJY9acHZuT8lNzuugZpf0xncHRNdOzXF9v5nTg/NK8o/inz030ddh0z6r3 4y852xd7PkFnEXwtIOW+6e9X71/F5KOe03xuovLMFRdWrEl7Anr++Nz7X3IN 9Ge136DcR+V065yK5nf9WDEaX8MqSr6Ota9JqHNFeg7FntX/T3O6xq8/r5xz 5UH95je/cbEq5nTg/NA9qBiC1lba8/S16JWzorPOPl58rv4t3+c3thaQYhFt 27Z1a8IockPOrOGsHHPN5crtUcxEPeu1h38uxuXzILXfoOurd6Ezcx/P1b+V Gj6vSfOz6pkoJu7jbTorqTF7/2lOF63p9e6h2h46Z6qvMXM6kLb8Pax4seLD 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 AAAAAAAAAAAAAACcX/8L6YKfvQ== "], {{0, 347.}, {373., 0}}, {0, 255}, ColorFunction>RGBColor, ImageResolution>72], BoxForm`ImageTag["Byte", ColorSpace > "RGB", Interleaving > True], Selectable>False], DefaultBaseStyle>"ImageGraphics", ImageSize>{57.40625, Automatic}, ImageSizeRaw>{373., 347.}, PlotRange>{{0, 373.}, {0, 347.}}]\), CloudGet["https://wolfr.am/KR7FBcsM"]}], MoleculeEquivalentQ]] 
Something else that’s new in 12.1—and a first sign of something big to come—is the ability to import data about molecular orbitals:
✕
Import["ExampleData/Pyridinecarbonitrile_MO_25_29.cub", "Graphics3D"] 
We launched the Wolfram Function Repository in June 2019, and there are already 1146 functions published in it. One of the innovations in the Function Repository is a very streamlined process for submitting new functions, applicable both for the public Function Repository, and for individual deployment on a single machine, or in the cloud.
In Version 12.1 we’re introducing a new, streamlined submission mechanism for the Data Repository. File > New > Repository Item > Data Repository Item gives you:
Then if you’ve got, say, a Dataset, you just insert it in the notebook, then add examples (using the Insert ResourceObject button to insert references to the object you’re creating). When you’re done, press Deploy, and you can deploy locally, or privately or publicly to the cloud. Lots of checking just happens automatically (and if there’s something wrong you’ll usually get a suggestion about how to fix it).
My goal was to make it so that a simple Data Repository entry could be created in just a few minutes, and I think we’ve streamlined and automated things to the point where that’s now possible.
We want the Wolfram Language to provide a consistent computational representation of as much as possible. And that means that in addition to things like the molecules we just discussed, we want our language to be able to represent—and seamlessly interact with—all the other kinds of computational systems that exist in the world, whether they be programs, languages, databases or whatever. The list of kinds of things we can deal with is very long—but in Version 12.1 we’ve made some significant additions.
The Wolfram Language has been able to call programs in other languages through what’s now WSTP since 1989, but in recent years we’ve been working to make it ever easier and more automatic to do this. And for example in Version 11.2 we introduced ExternalEvaluate, which provides a highlevel way to directly evaluate code in external languages, and, whenever possible, to get results back in a symbolic form that can be seamlessly used in the Wolfram Language.
In Version 12.1 we’ve added Julia, Ruby and R to our collection of external languages. There are all sorts of practical issues, of course. We have to make sure that an appropriate installation exists on a user’s computer, and that the data types used in programs can be meaningfully converted to Wolfram Language.
But in the end it’s very convenient. In a notebook, just type > at the beginning of a line, select your language, and enter the code, and evaluate:
✕
> [1,2,3+3] 
But this doesn’t only work interactively. It’s also very convenient programmatically. For example, you can create a function in the external language, that is then represented symbolically in the Wolfram Language as an ExternalFunction object, and which, when called, runs code in the external language:
✕
> def square(x) x * x end 
✕
% /@ {45, 135, 678, 34} 
For each different language, however, one’s dealing with a whole new world of structures. But since we have builtin support for ZeroMQ (as well as having a connection to Jupyter available), we at least have the plumbing to deal with a very wide range of languages.
But particularly for languages like Python where we have full builtin connectivity, one of the significant things that becomes possible is to have functions that work just like standard Wolfram Language functions but are fully or partly implemented in a completely different language. Of course, to have this work seamlessly requires quite a bit of system support, for automated installation, sandboxing, etc. And for example, one of the things that’s coming is the ability to call functions containing Python code even in the Wolfram Cloud.
In addition to external languages, another area of expansion is external storage systems of all kinds. We’ve already got extensive support for the Bitcoin and Ethereum blockchains; in Version 12.1 we added support for the ARK blockchain. In addition, we introduced support for two external file storage systems: IPFS and Dropbox.
This is all it takes to put a Spikey into the globally accessible IPFS file system:
✕
ExternalStoragePut[CloudGet["https://wolfr.am/L9rTMCn6"], ExternalStorageBase > "IPFS"] 
Here’s the content identifier:
✕
%["CID"] 
And now we can get our Spikey back:
✕
ExternalStorageGet["QmcNotbm3RZLv7caaPasU8LiHjNCCuuEemrCgbLAsN49TZ"] 
You can do the same kind of thing with Dropbox, and after authentication (either through a browser, or through our new SystemCredential mechanism, discussed below) you can put expressions or upload files, and they’ll immediately show up in your Dropbox filesystem.
Given the framework that’s been introduced in 12.1, we’re now in a position to add connections to other external file storage systems, and those will be coming in future versions.
In addition to plain files, we also have a sophisticated framework for dealing with relational databases. Much of this was introduced in Version 12.0, but there are some additions in 12.1. For example, you can now also connect directly to Oracle databases. In addition, there are new functions for representing relational set operations: UnionedEntityClass, IntersectedEntityClass, ComplementedEntityClass.
And, of course, these work not only on external databases but also on our own builtin knowledgebase:
✕
SortedEntityClass[UnionedEntityClass[ \!\(\* NamespaceBox["LinguisticAssistant", DynamicModuleBox[{Typeset`query$$ = "EU", Typeset`boxes$$ = TemplateBox[{"\"European Union\"", RowBox[{"EntityClass", "[", RowBox[{"\"Country\"", ",", "\"EuropeanUnion\""}], "]"}], "\"EntityClass[\\\"Country\\\", \\\"EuropeanUnion\\\"]\"", "\"countries\""}, "EntityClass"], Typeset`allassumptions$$ = {{ "type" > "Clash", "word" > "EU", "template" > "Assuming \"${word}\" is ${desc1}. Use as \ ${desc2} instead", "count" > "2", "Values" > {{ "name" > "CountryClass", "desc" > "a class of countries", "input" > "*C.EU_*CountryClass"}, { "name" > "Unit", "desc" > "a unit", "input" > "*C.EU_*Unit"}}}}, Typeset`assumptions$$ = {}, Typeset`open$$ = {1, 2}, Typeset`querystate$$ = { "Online" > True, "Allowed" > True, "mparse.jsp" > 0.363881`6.012504373043238, "Messages" > {}}}, DynamicBox[ToBoxes[ AlphaIntegration`LinguisticAssistantBoxes["", 4, Automatic, Dynamic[Typeset`query$$], Dynamic[Typeset`boxes$$], Dynamic[Typeset`allassumptions$$], Dynamic[Typeset`assumptions$$], Dynamic[Typeset`open$$], Dynamic[Typeset`querystate$$]], StandardForm], ImageSizeCache>{232., {7., 15.}}, TrackedSymbols:>{ Typeset`query$$, Typeset`boxes$$, Typeset`allassumptions$$, Typeset`assumptions$$, Typeset`open$$, Typeset`querystate$$}], DynamicModuleValues:>{}, UndoTrackedVariables:>{Typeset`open$$}], BaseStyle>{"Deploy"}, DeleteWithContents>True, Editable>False, SelectWithContents>True]\), EntityClass["AdministrativeDivision", "AllUSStatesPlusDC"]], "Population" > "Descending"][{"Name", "Population"}] // Dataset 
We’ve been very active over the years in supporting as many file formats as possible. In Version 12.1 we’ve added the popular new HEIF image format. We’ve also updated our DICOM importer, so you can take those CT scans and MRIs and immediately start analyzing them with Image3D and our 3D image processing.
Like, this is part of our director of R&D’s knee:
✕
knee = Import["knee_mr/DICOMDIR", {"Image3D", 1, 1, 1}]; Image3D[knee, ColorFunction > (Blend[{{0., RGBColor[0.05635, 0.081, 0.07687, 0.]}, {0.0777045, RGBColor[0.702347, 0.222888, 0.0171385, 0.0230167]}, {0.3, RGBColor[1., 0.6036, 0., 0.303215]}, {0.66, RGBColor[1., 0.9658, 0.4926, 0.661561]}, {1., RGBColor[1., 0.6436, 0.03622, 1.]}}, #]& )] // ImageAdjust // Blur[#, 3] & 
In Version 11.3, we added MailServerConnect for connecting directly to mail servers. In 12.1, we’ve added a layer of caching, as well as a variety of new capabilities, that make the Wolfram Language uniquely powerful for programmatic mail processing. In addition, in Version 12.1 we’ve upgraded our capabilities for importing mail messages from EML and MBOX, in particular adding more controls for attachments.
Yet another new feature of 12.1 is stronger support for ZIP and TAR files, both their creation through CreateArchive, and their extraction through ExtractArchive—so you can now routinely handle tens of thousands of files, and gigabytes of data.
Whenever one is connecting to external sites or services, there are often issues of authentication. We’d had some nice symbolic ways to represent authentication for some time, like SecuredAuthenticationKey (that stores OAuth credentials). But for example in cases where you’ve got to give a username and password, there’s always been the issue of where you store those. In the end, you want to give them as part of the value for an Authentication option. But you don’t want to have them lying around in plaintext.
And in Version 12.1 there’s a nice solution to this: SystemCredential. SystemCredential ties into your system keychain—the encrypted storage that’s provided by your operating system, and secured by the login on your computer.
It’s as easy as this to store things in your system keychain:
✕
SystemCredential["secret"] = "it's a secret" 
✕
SystemCredential["secret"] 
✕
Length[PacletFind[]] 
In my Wolfram Language system right now, I have 467 paclets installed. What is a paclet? It’s a modular package of code and other resources that gets installed into a Wolfram Language system to deliver pretty much any kind of functionality.
We first invented paclets in 2006, and we’ve been increasingly using them to do incremental distribution of a great many pieces of Wolfram Language functionality. Paclets are versioned, and can be set to automatically update themselves. Up until now, paclets have basically been something that (at least officially) only we create and distribute, from our central paclet server.
But as of Version 12.1, we’re opening up our paclet system so anyone can use it, and we’re making it a fully documented and supported part of the Wolfram Language. Ultimately, a paclet is a file structure that contains assets or resources of various kinds, together with a special PacletInfo.wl file that defines how the paclet should integrate itself into a Wolfram Language system.
A paclet can set up code to execute at startup time. It can set up symbols whose definitions will be autoloaded. It can install documentation. It can put items into menus. And in general it can set up assets to be used in almost any part of the fairly complex structure that is a deployed Wolfram Language system.
Typically a paclet is distributed as a single archive file, and there are many ways someone can get such a paclet file. We maintain a central paclet server that’s used by the Wolfram Language system to get automatic downloads. But in the near future, we’re also going to have a full paclet repository through which users will be able to distribute paclets. (We’re also going to make it possible for Wolfram Enterprise Private Clouds to have their own paclet repositories.)
I might mention how I see the Wolfram Paclet Repository relating to our Wolfram Function Repository. The Function Repository is built to extend the functionality of the Wolfram Language one function at a time, always maintaining the overall structure and consistency of the language. The Paclet Repository will let people distribute complete environments that may serve some particular purpose, but may not maintain the structure and consistency of the overall language. Paclets will be extremely useful, and we intend them to be as freely used as possible. So whereas the Wolfram Function Repository has a curation process to ensure a certain level of design consistency, we plan to make the Wolfram Paclet Repository basically completely open.
The goal is to allow a rich ecosystem of usercontributed paclets to develop. The Paclet Repository will serve as a smooth distribution channel for Wolfram Language material. (And by the way, I think it will be quite common for functions in the Function Repository to actually be based on code that’s distributed through the Paclet Repository—with the Function Repository serving as a streamlined and structured presentation mechanism for the functions.)
In Version 12.1 there are a variety of functions for creating and managing paclets. With the Wolfram Language, PacletObject is the symbolic representation of a paclet. Here’s a trivial example of what a paclet might be like:
✕
PacletObject[<"Name" > "TrivialPaclet", "Version" > "1.0", "Extensions" > {{"Kernel", "Context" > "TrivialPackage`"}}>] 
This can then be packaged into a .paclet file using CreatePacletArchive—and this file can then be distributed just as a file, or can be put on a paclet server. Once someone has the file, it’s just a question of using PacletInstall, and the paclet will come to life, inserting the necessary hooks into a Wolfram Language system so that its contents are appropriately used or exposed.
Well, that’s already a lot. But there’s even more too. FaceAlign. FindImageText. Around in Classify and ListPlot3D. SubsetCount. GenerateFileSignature. RSA digital signatures. Much faster MailSearch. Initialization tied to notebooks or cells. And so on. Here’s the whole list. Check it out!
To comment, please visit the copy of this post at Stephen Wolfram’s Writings »
]]>Professionally, a large part of what I do at Wolfram involves working with educators, students and organizations, and empowering them with the technology to think computationally. I know of several parents with older kids who are now at home, enrolled in schools that are not completely prepared to provide online instruction. While the internet is awash with curricula, it can be a challenging task to assess the quality, relevance and usefulness of each course, given the amount of what is out there.
For decades now at Wolfram, we’ve been committed to the creation of cuttingedge technology and resources for classrooms. Let’s take a look at our wealth of free online resources for quality education while at home.
Peruse the following, or jump directly to the type of projects you need:
Intermediate Wolfram Language Programmers ↓
Parents and Programmers of All Ages ↓
For anyone who is yet unfamiliar with our products, let’s begin with an overview.
The Wolfram Language is a humanreadable computer programming language, one that is very high level and contains a massive amount of builtin data about the world. On a practical level, this means that a student trying to write code about something that interests them (planets, for instance) can directly begin formulating their ideas directly as opposed to focusing on the lowlevel programming aspects found in other languages.
WolframAlpha is a computational knowledge engine that provides answers to objective queries. WolframAlpha is not a search engine; it doesn’t search the web or scan a database. This is a product that dynamically computes knowledge and solutions based on a vast repository of builtin data and algorithms. The domains powered by WolframAlpha are constantly expanding.
(Time: One hour or less per Exploration. Guidance is not strictly necessary. Ideal for middleschool students.)
If you’re looking for interesting activities to fill 30–60 minutes, I love the Explorations in Wolfram Programming Lab. This is our immersive programming environment, accessible entirely within a browser so you don’t have to download anything, and filled with what we term “Explorations.” Explorations are just that—small coding activities that allow you to explore your topic of choice, be it visualizing what one can see from the tops of skyscrapers around the world, to analyzing a famous speech like the Gettysburg Address, to generating mathematical art using the digits of pi or many other things. These do not require a background in programming—just a curious mind ready for adventure. Each activity comes with prewritten steps of code that can be modified, for guided learning.
I’ve found that initially students just run the code asis, or make slight modifications. As they run through more activities and their confidence grows, students make larger changes to the provided code and even begin writing entirely new lines of code independently. These Explorations can be led by a parent/teacher or can be selfguided—another plus for a busy parent!
(Time: One hour or less per project. Guidance may be necessary. Ideal for middle and highschool students.)
If your kids have and love Raspberry Pis (the tiny, singleboard computers that are quite popular in maker communities), you may enjoy our curated projects that use the Wolfram Language on the Raspberry Pi. There are great independent activities that are sure to keep students engaged and curious while teaching them important computer science concepts like classification, machine learning, image processing and more.
(Time: Multiple structured lessons; 1–3 weeks. Guidance is not strictly necessary. Ideal for middle and highschool students.)
If you’re looking for a more structured learning plan that spans a few weeks, I suggest our Wolfram U course based on Stephen Wolfram’s book, An Elementary Introduction to the Wolfram Language, including full book text, video lectures, exercises and a scratch pad for coding. Both the course and the book are fully online and completely free, and offer a systematic, thorough introduction to developing a computational thinking mindset. Each chapter in An Elementary Introduction to the Wolfram Language is accompanied by autograded exercises.
Students can pick whichever learning style suits them best. With more than 40 chapters ranging over many capabilities of our easytouse language, both the course and the book are great resources for incremental learning over a few weeks. When they finish the course, brought to you by Wolfram U, students will have mastered a highlevel programming language that is ubiquitous in colleges and universities—and they’ll receive a downloadable certification to prove it!
(Time: Multiple structured lessons over a few weeks. Guidance is not strictly necessary. Ideal for highschool students.)
At Wolfram, we love math—so much so that we created a comprehensive introduction to calculus geared toward preparing students for AP Calculus AB courses at school. Brought to you for free through Wolfram U, the course is fully online and includes video lectures, interactive notebooks and practice quizzes. This material is designed for selfstudy, and is perfect for unexpected breaks from school.
(Time: 60–90 minutes per Adventure. Guidance is recommended. Ideal for middle or highschool students.)
If your students are already familiar with the Wolfram Language, they might enjoy exploring further through AI Adventures. Each Adventure is a 60–90 minute session that introduces students to computational thinking using a lesson guideline. All kinds of topics are covered, like cryptography, map comparison or automated guitar playing. By the end of an Adventure, students will have their own unique notebook that catalogs their exploration of the lesson topic. Typically, we find these lessons work best with an educator/instructor to guide students.
Computational Thinking Initiatives, a program of the Wolfram Foundation, works with educators and parents as they work with groups of students using material and resources we provide. Interested in starting a club or learning more? Write to info@computationinitiative.org or comment on this post, and we will get in touch with you.
(No guidance required. Ideal for middle or highschool students.)
Do your kids enjoy puzzles? A really fun resource we host is Wolfram Challenges, which is filled with puzzles that test your programming skills and computational thinking acumen. As an example, Country Chains is an especially apt problem to consider during today’s time of social distancing, where entire nations are separating themselves—not just within cities, but on country borders as well.
(Guidance may or may not be necessary. Ideal for highschool students.)
Since terms like “data science” and “machine learning” abound these days, your time at home is the perfect opportunity to take advantage of our fantastic primers available for data science and machine learning, presented as free video courses. If you or your students are already familiar with the resources listed so far, you’ll enjoy putting some of the foundational concepts you already know into action by delving into these popular topics.
We love data here at Wolfram, and our brightest minds have been looking at the data coming in from across the globe regarding COVID19. Interesting analyses and discussions about the risk factors, modeling the spread in different regions, forecasting growth—in short, realtime data analysis can be found on Wolfram Community. As this is a rapidly evolving situation, the Wolfram Community post and our dedicated COVID19 dashboard are updated daily. If you have advanced students interested in viewing this pandemic from a datadriven perspective, these resources are for you.
WolframAlpha is a fantastic tool to encourage curiosity and to help answer the (seemingly endless) questions kids can have about any and every topic. WolframAlpha is geared to do way more than math—take a look at some of the lighthearted facts, topics and features available for exploration. Given the continually growing list of travel restrictions, some of us at Wolfram have considered slightly unusual methods of travel, and WolframAlpha has helped us figure out how long travel times would be if we traveled at light speed! Regardless of your area of interest, WolframAlpha will have data that you can turn into an interesting exercise.
When I was a middleschool student years ago, I vividly recall being provided handwritten problem sets created by my dedicated older brother. Today, parents and dedicated older siblings alike can use Wolfram’s technology to generate unlimited, unique problem sets ideal for middle and highschool math topics at the click of a button using the Wolfram Problem Generator. Students can practice online using the Wolfram Problem Generator too.
To support those working or taking classes from home, Wolfram is offering free Mathematica Online access to users of desktop Mathematica through August 15. Organizations and individuals using Mathematica 12 have been contacted and offered free subscriptions. If you have Mathematica through your organization, or have a license you use for work, and haven’t already received a free cloud license to use through the summer, please contact us so we can set that up for you.
We’re hopeful that this time spent at home with your children can be as educational as possible, and we’re glad to be able to provide resources to help you through. If you have followup questions or would like to discuss Wolfram tech in education, please reach out to me at ishwarya_vardhani@wolfram.com, or comment on this post.
]]>
The ability to work from home, a coffee shop or a lodge near the Swiss Alps is a benefit employees at Wolfram Research take advantage of. Our geographically distributed workforce (with an increasing number of remote workers) spans 33 countries and 6 continents, with nearly 50% of our workforce working in locations that are not corporate offices. In addition, nearly 30% of our management team works remotely. Even our incredibly handson founder and CEO Stephen Wolfram has been working remotely for 29 years. And we get an awful lot of work done. Of course, we largely use our own technology to operate as such, but working from home also involves a collection of habits and communication tools.
The main selling point of working at home may seem obvious: you don’t have to leave the house. For most employees, that level of comfort and autonomy is reason enough. But the remote work option provides several other advantages.
Many employees treasure the ability to really go all in and focus on a project without office interruptions or socializing. As one of our directors puts it, “I really enjoy my mix of two days onsite and three days remote. I pack my two days onsite with facetoface meetings, and try to keep one remote day mostly open for headsdown project work.”
Perhaps most important right now is the physical isolation: staying at home lowers your risk of contracting airborne illnesses. While this is particularly sensitive with the recent COVID19 outbreak, it’s something worth keeping in mind during regular cold and flu seasons too. Healthy employees are happier and more productive!
In a recent podcast with Automattic CEO Matt Mullenweg (who happens to also have a very remote workforce), Stephen Wolfram discussed some benefits of being a remote CEO and having a distributed workforce. Stephen has written extensively about his habits and personal infrastructure, which is an excellent guide to maintaining immense productivity and capitalizing on the benefits of working remotely (including ways in which it can benefit your heart health!).
In theory, most computeroriented work should be doable from a home office setup. Online learning has been around for over a decade. So how, practically, do we do it?
In many cases, employees use the same equipment they’d use in the office. A computer and a decent internet connection are usually the bare minimum requirements. Those who alternate between remote and onsite work might also have a secondary keyboard, mouse, monitor and headset for their athome days.
Similarly, you’ll need basic apps like a browser, chat program and conferencing app (we use Zoom). Once you have established communication channels and ensured everyone has access to the applications and software required to do their jobs, it’s mostly the same as being in the office for most nonserviceindustry workers. Of course, every office, organization, school and university will have its own unique circumstances and needs, but with the right tools in place it can be done.
Here are some tips for managing your own remote work:
One drawback to the remote option is the lack of facetoface interaction. Communication and accountability can fall to the wayside without proper planning. I asked some of our remote managers and staff what they feel is the most important advice for successfully navigating a remote situation.
When trying to manage people remotely, keeping in touch is key. One manager brought up an important point to keep in mind: “Working remotely doesn’t have to be dehumanizing or imply a lack of meaningful personal and working relationships with your colleagues.” She uses small group meetings held over Zoom and frequent checkins via chat apps to keep people engaged and accountable.
While working remotely as a manager, you obviously can’t physically check on your employees. Video conferencing, personal and group chat rooms, and phone calls can make a huge difference—don’t simply rely on email to check in with your team! Using these alternative communication mediums can give a good sense of their activities and level of productivity.
Dashboards and Kanban boards, available through project management and productivity tools like Jira, can help keep your teams aware of current and future priorities. Shared storage and documents through services like Dropbox allow for instant collaboration on specific tasks.
Keep your calendar up to date, and make sure to share it with key colleagues. This is a must for remote work, per one of our managers. Ensure that team members explicitly give updates on their availability. This lets everyone know what to expect in terms of workload and project statuses, especially during a time when taking unexpected sick leave might happen more often than not.
If you’re worried about losing the facetoface element of meeting in person, use your computer’s webcam during oneonone meetings to maintain the connection. This can help your employees relax during touchpoints, which enables a more honest conversation. You can also use cameras during group meetings! If your meeting includes a mix of onsite employees in a conference room and offsite employees joining via Zoom, conference room camera systems and webcams can be used together to ensure presence equality.
Any company, government lab, university or school considering going remote might be concerned as to how they will remain productive. A typical day at Wolfram includes focusing on remote tools and technology to bring our workforce together, so we have a bit of an advantage in that we’re used to focusing on keeping our productivity stable even if our places of work aren’t. Zoom ensures we remain face to face even when we’re hundreds of miles apart. Sugar and Oracle give us the cloud infrastructure we need to access all of our CRM tools so that everyone around the company knows who is working with whom, which next steps need to be taken, etc. Chat systems provide us with a consistent and fast means of answering questions or invoking a group conversation regarding a specific topic. Many parts of our company rely on our own technology to program, build and consume reports, etc., and while we all have desktop access to Wolfram software at the office, not everyone necessarily has the same technology on their family computer at home. With Mathematica Online and Wolfram Cloud technology, our employees can access our tech (and all the associated files) through the cloud on their home machines, as well as from any device—whether that’s a phone, tablet, a computer at the girlfriend’s or grandparents’ house, etc. If you’re taking care of a sick relative, the Wolfram Cloud offers you the flexibility to continue working wherever you are.
Recently, we emailed all organizations and individuals who use the latest version of Mathematica at work to provide them with a free subscription to Mathematica Online so they can access our cloud technology as well. Coupled with some of the screensharing and chat tools that all these organizations and individuals likely already have access to, online education or remote work for the company/lab can be as seamless as being on location itself. If you have Mathematica through your organization, or have a license you use for work, and haven’t already received a free cloud license to use through the summer, please contact us so we can set that up for you.
We also have a large group of academic experts who work daily with educational organizations, assisting them with using our cloud technology via online courses. They would be more than happy to help you set up your courses online to essentially mirror the experience you and your students would have on campus as well. In addition, we have a wealth of free resources available to assist with the actual content and teaching process as well, should you be looking to replace some lessons or experiences that are difficult to replicate without being on campus together.
We hope this post has given you some insights about how we handle remote work here at Wolfram, and how to deal with situations requiring longdistance collaboration at your organization.
Wolfram U is replete with online training classes and courses for a variety of skills and levels, which you can benefit from without leaving the house! With specialized online events, a complete calculus course, an introduction to image processing and more, you’ll be able to keep your mind busy and your skills sharp from the comfort of your couch.
Specific to the novel coronavirus, we’ve been incredibly active. We’ve made a free and public COVID19 dashboard, provided genetic sequences, epidemic data and patient medical data Data Repository datasets, facilitated robust conversations and analysis on our Wolfram Community hub and conducted livestreamed data explorations on Twitch and YouTube. Stay informed, stay healthy and stay productive—no matter where you are.
The Wolfram Cloud, powering multiple Wolfram products, combines a stateoftheart notebook interface with the world’s most productive programming language. 
One of the most enigmatic stars in our galaxy is η Carinae (Eta Carinae). However, in its first recorded observation several hundred years ago, Eta Carinae was a star of little note. Since then, it has become a source of astronomical interest due to dramatic brightness variations, which at one time made it the secondbrightest star in the sky. In this post, we’ll investigate the star using the Wolfram Language and the Wolfram Function Repository to discover why it’s changed in such a relatively short period of time, both in its appearance and in our interest in it.
Being a star only observable in the Southern Hemisphere, its discovery didn’t originate in antiquity. The first official record of Eta Carinae came from Edmund Halley, of Halley’s Comet fame, in 1677 when he mentioned the star in a new constellation of his own creation called Robur Carolinum. At that time, the modern constellations had not yet been standardized, and the star system was described as being in the large, ancient Greek constellation of Argo Navis (the ship). In the second century, Ptolemy detailed specific stars within the constellation, portions of which appear to skirt the southern skies about the Mediterranean Ocean as observed from Greece.
Johannes Bayer’s system for cataloging stars labeled the brightest star in a constellation using the Greek letter α (alpha), the second brightest β (beta) and so on. Since this newly mentioned star was the seventh brightest in Argo Navis, it earned various labels such as Eta Roboris Caroli, Eta Argus or Eta Navis. Argo Navis was eventually broken up into three official constellations, Carina (the keel), Puppis (the poop deck) and Vela (the sails) due to the original constellation’s large size. Its old name slowly fell out of favor until, in 1930, the International Astronomical Union (IAU) officially defined the modern 88 constellations. Because the star system in question fell into the Carina portion of the old constellation, it became known as η (Eta) Carinae.
We can pull in data from WolframAlpha to visualize some star charts showing the modern constellations of Vela and Puppis, which are the northernmost parts of the obsolete constellation Argo Navis, skirting above the southern horizon as observed from Athens, Greece, in early spring. Some of the bright stars in those constellations are labeled. The modern constellation of Carina is below the horizon.
✕
GraphicsGrid[{{WolframAlpha[ "Vela star chart Athens, Greece April 1, 9 PM Eastern European \ Time", {{"ConstellationChartPod:ConstellationData", 1}, "Image"}], WolframAlpha[ "Puppis star chart Athens, Greece April 1, 9 PM Eastern European \ Time", {{"ConstellationChartPod:ConstellationData", 1}, "Image"}]}}, ImageSize > 525] 
The modern constellation of Carina can be seen from the Southern Hemisphere.
✕
Entity["Constellation", "Carina"][ EntityProperty["Constellation", "ConstellationGraphic"]] 
Eta Carinae is best observed in late April—during autumn in the Southern Hemisphere—shown here as it appears from Johannesburg, South Africa.
✕
WolframAlpha["Eta Carinae star chart Johannesburg April 30, 10 PM Eastern European Time", {{"SkyMap:StarData", 1}, "Image"}] 
Eta Carinae is likely a member of the Trumpler 16 star cluster, which is composed of a number of the most massive stars known. The star cluster itself is embedded in the larger Carina Nebula. Eta Carinae has been widely accepted to lie at a distance of 7,800 ±330 light years. Recent measurements by the Gaia mission indicated a possibility that it lies even further than previously thought, but these measurements were made using other stars in Trumpler 16 that were not obscured by nebulosity. Methods to determine the distance based on aspects of the Homunculus Nebula support the earlier value more.
The American Association of Variable Star Observers (AAVSO) maintains a large collection of variable star data, including light curves. This data can be requested via a form and then returned in a variety of formats, including comma‐separated value (CSV) files.
✕
SetDirectory[NotebookDirectory[]]; 
✕
aavsoraw = Import["aavsodata_5e3fa24cbf211.txt", "CSV"]; 
✕
properties = aavsoraw[[1]] 
✕
lightcurve = {FromJulianDate[#[[1]]], #[[2]]} & /@ (Most /@ Select[aavsoraw[[2 ;;]][[All, {1, 2, 5}]], #[[3]] === "Vis." &]); 
✕
DateListPlot[lightcurve, Sequence[ ScalingFunctions > {None, "Reverse"}, PlotTheme > "Detailed", PlotRange > All, ImageSize > 525]] 
This data is extremely useful for showing past behavior of the Eta Carinae star system, behavior that shows why Eta Carinae is one of the most enigmatic star systems in our galaxy. For about one hundred years after its discovery, it was just a typical star with an apparent magnitude of roughly 3.3, which made it slightly fainter than the wellknown star Albireo in the constellation Cygnus—but as this is not one of the brightest stars in the sky, nothing drew special attention to it at the time. This began to change in 1827 when it was observed to have brightened to first magnitude, putting it on par with wellknown bright stars like Antares, Spica and Capella. Then, on December 16, 1837, astronomer Sir John Frederick William Herschel (son of William Herschel), observing from a trip to South Africa, recorded that it had brightened to slightly outshine Rigel, which has an apparent magnitude of about .18. This began an event referred to as the Great Eruption. At its peak brightness, in 1845, it approached a magnitude of –1, making it the secondbrightest star in the sky besides the Sun, just behind Sirius. After this event, it began to steadily dim, eventually far below its original brightness. Then, in 1887, there was another brief, but less intense, brightening before fading then resumed, reaching a minimum around eighth magnitude. Then, in 1953, the star was observed to be steadily increasing in brightness with regular variation, leading to today. In 1996 the regular variations were discovered and later found to have a 5.54year period.
With such odd behavior, we needed a better view of Eta Carinae to give us some direction. In 1995, the Hubble Space Telescope imaged Eta Carinae and this is what it saw (along with a new version taken in 2019):
✕
GraphicsGrid[{{Import[ "https://upload.wikimedia.org/wikipedia/commons/f/fc/Eta_Carinae.\ jpg"], Import[ "https://cdn.spacetelescope.org/archives/images/screen/heic1912a.\ jpg"]}}, Sequence[ImageSize > 525, Spacings > 0]] 
Left image: Jon Morse (University of Colorado) and NASA . Right image: NASA, ESA, N. Smith (University of Arizona, Tucson) and J. Morse (BoldlyGo Institute, New York)
These images were taken to highlight ultraviolet wavelengths. The more recent image shows magnesium‐rich (Mg II) regions in blue and nitrogen‐rich (N II) areas in red. The images look almost like something you would see in a modern science fiction movie with digital special effects. It looks like something blew up and we are staring at the resulting fireball! This glowing gas surrounding Eta Carinae is known as the Homunculus Nebula. This nebula almost totally obscures our view of the star from Earth, making it very difficult to obtain detailed information about the things going on inside. It’s estimated that the Homunculus Nebula may contains tens of solar masses, perhaps as many as 40. It’s hard to imagine an eruption powerful enough to shed that much mass.
For stars, classification can often be summarized using the spectral class or spectral type. For example, the Sun is a G2V star.
✕
Entity["Star", "Sun"]["SpectralClass"] 
The spectral class encodes a variety of information, including temperature and often luminosity, or the kind of star. For the Sun, G2 corresponds to a Gclass star with subtype 2; along with the Roman numeral V, this means that it corresponds to a 5,800 K main sequence star with a luminosity approximately equivalent to the Sun.
✕
ResourceFunction[ "StellarSpectralClassData"]["G2V", {"EffectiveTemperature", "StarType", "Luminosity"}] 
Cooler stars use different letters, like M. These spectral class strings can also include additional annotations:
✕
ResourceFunction[ "StellarSpectralClassData"]["M6Ve", {"EffectiveTemperature", "StarType", "Luminosity", "Peculiarities"}] 
Stars can also be hotter and larger:
✕
ResourceFunction[ "StellarSpectralClassData"]["F8III", {"EffectiveTemperature", "StarType", "Luminosity"}] 
So what is the spectral class of Eta Carinae?
✕
Entity["Star", "EtaCarinae"]["SpectralClass"] 
I’ve combed the literature trying to find a reliable source that says more about this star than this vague result. About the best I can find is the following, which doesn’t say much more.
✕
ResourceFunction[ "StellarSpectralClassData"]["OBepec", {"EffectiveTemperature", "StarType", "Luminosity", "Peculiarities"}] 
The temperature class portion of the spectral class string can typically range over the letters O, B, A, F, G, K and M, with more recent additional letters to cover faint brown dwarfs: L, T and Y. Within this range, O stars are the hottest and Y are the coolest. Since “OBepec” mentions “OB,” we can at least infer that there are characteristics of O or B stars, but there is no temperature subclass to allow us to quantify a temperature, nor is there a Roman numeral to indicate if we are dealing with a dwarf, giant or supergiant. All we can infer is that it’s “hot” and shows emission lines in the spectrum. How hot? Without more information, it’s hard to be sure. We can provide some broad ranges if we assume full temperature and luminosity class specifications. The coolest B stars are B9 dwarfs, and the hottest known O stars are near O3 (for now we’ll just assume a main sequence dwarf, luminosity class V).
✕
ResourceFunction["StellarSpectralClassData"][{"B9V", "O3V"}, "EffectiveTemperature"] 
So it appears we are talking temperatures that range anywhere from 11,000 K to 41,000 K, which is a very wide range, so all we can say is that we are looking at much hotter temperatures than the Sun’s 5,770 K.
From the literature, the spectrum of Eta Carinae shows a number of features that can infer properties of what is inside the nebula. There are many emission lines seen on top of a continuum spectrum, along with some peculiarities. Some of the emission lines observed come from doubly ionized neon, iron and argon. We can obtain some of the known lines using SpectralLineData to obtain about 247 lines to simulate.
✕
lines = Join[ SpectralLineData[ EntityClass[ "AtomicLine", {"Neon", 3}], {Quantity[350, "Nanometers"], Quantity[750, "Nanometers"]}], SpectralLineData[ EntityClass[ "AtomicLine", {"Iron", 3}], {Quantity[350, "Nanometers"], Quantity[750, "Nanometers"]}], SpectralLineData[ EntityClass[ "AtomicLine", {"Argon", 3}], {Quantity[350, "Nanometers"], Quantity[750, "Nanometers"]}]]; 
✕
linevalues = QuantityMagnitude[SpectralLineData[lines, "Wavelength"], "Nanometers"]; 
✕
lineintensity = SpectralLineData[lines, "Intensity"]; Length[linevalues] 
The spectral lines observed in the spectrum of Eta Carinae don’t follow a Gaussian distribution, as you might expect, but instead follow a profile that has an absorption peak preceding the emission peak.
✕
pm[x_] := 7 x Exp[(If[x > 0, 8 x, 16 x])/2] 
✕
Plot[pm[x], {x, 1, 1}] 
We can offset each line by its wavelength, λ, and perform some scaling and cropping to get the effect needed.
✕
lineprofile[\[Lambda]_, x_, nlines_] := With[{center = x  \[Lambda] + .07}, Piecewise[ { {pm[center] + .45/nlines, .4  center <= center <= .6  center}, {.15/nlines, True} } ] ] 
✕
lineprofile[lst_List, x_] := Plus @@ (lineprofile[#, x, Length[lst]] & /@ lst) 
Plotting all of the requested lines in the visible spectrum shows a fair number of lines to examine:
✕
DensityPlot[x, {x, 400, 700}, {y, 0, 1}, ColorFunction > (Darker[ColorData["VisibleSpectrum", #], 1  3 Total[lineprofile[linevalues, #]]] &), ColorFunctionScaling > False, AspectRatio > .1, Background > Black, FrameStyle > White, FrameTicks > {True, False}, FrameTicksStyle > White, PlotPoints > {2000, 3}, PlotRangePadding > None, ImageSize > 650] 
Zooming into the blue part of the spectrum, we can see some of the individual lines and that there is a dark absorption feature on the blue side of each line:
✕
DensityPlot[x, {x, 450, 500}, {y, 0, 1}, ColorFunction > (Darker[ColorData["VisibleSpectrum", #], 1  3 Total[lineprofile[linevalues, #]]] &), ColorFunctionScaling > False, AspectRatio > .1, Background > Black, FrameStyle > White, FrameTicks > {True, False}, FrameTicksStyle > White, PlotPoints > {2000, 3}, PlotRangePadding > None, ImageSize > 650] 
Stars like the Sun are typically seen as a continuum with absorption lines overlaid. Emission lines are typical of diffuse, ionized gas. In addition, the spectrum of Eta Carinae exhibits shallow absorption features, just to the blue side of each emission line in the previous image.
Although the inner regions of the Homunculus Nebula are obscured from view, the composition of the ejecta from the Great Eruption seems to suggest a mix of approximately 60% hydrogen and 40% helium, with traces of nitrogen being detected in the neighborhood of 10 times what is seen in the solar spectrum.
Eta Carinae is the only known instance of naturally formed UV lasers. Lymanalpha emission, originating in blobs of gas within the system, is able to pump some ionized iron ions into pseudo‐metastable states and results in stimulated emission of radiation within the UV range.
As early as 1972, x‐rays were detected from Eta Carinae from rocket‐based observations. There are a number of different x‐ray sources found at Eta Carinae, ranging from soft to hard. Soft x‐rays are found in various locations within the surrounding nebulosity. Hard x‐rays appear to originate closer to the star itself. Every 5.54 years, the x‐ray spectrum appears to rise, collapse and disappear for about three months, and then recover.
So what else can we look at to try to come up with some idea of what is going on at Eta Carinae? We can investigate nuclear reactions. Stars that are the temperature of our Sun undergo fusion in their cores via the proton‐proton chain, where hydrogen is converted to helium with deuterium and helium3 as intermediate reactants. This is the most dominant reaction in the Sun. With lower frequency, other heliumgenerating reactions happen in the Sun that involve beryllium, lithium and boron.
✕
GraphicsGrid[{{Graph[{ {1, Entity["Isotope", "Hydrogen1"]} > {2, Entity["Isotope", "Hydrogen1"]}, {2, Entity["Isotope", "Hydrogen1"]} > {1, Entity["Isotope", "Hydrogen2"]}, {3, Entity["Isotope", "Hydrogen1"]} > {1, Entity["Isotope", "Hydrogen2"]}, {1, Entity["Isotope", "Hydrogen2"]} > {1, Entity["Isotope", "Helium3"]}, {4, Entity["Isotope", "Hydrogen1"]} > {5, Entity["Isotope", "Hydrogen1"]}, {5, Entity["Isotope", "Hydrogen1"]} > {2, Entity["Isotope", "Hydrogen2"]}, {6, Entity["Isotope", "Hydrogen1"]} > {2, Entity["Isotope", "Hydrogen2"]}, {2, Entity["Isotope", "Hydrogen2"]} > {2, Entity["Isotope", "Helium3"]}, {1, Entity["Isotope", "Helium3"]} > {2, Entity["Isotope", "Helium3"]}, {2, Entity["Isotope", "Helium3"]} > {1, Entity["Isotope", "Helium4"]}, {1, Entity["Isotope", "Helium4"]} > {7, Entity["Isotope", "Hydrogen1"]}, {1, Entity["Isotope", "Helium4"]} > {8, Entity["Isotope", "Hydrogen1"]} }, VertexLabels > {{ Blank[], Pattern[e, Blank[Entity]]} :> Style[ e["FullSymbol"], 12]}], Graph[{{1, Entity["Isotope", "Helium3"]} > {1, Entity["Isotope", "Helium4"]}, {1, Entity["Isotope", "Helium4"]} > {1, Entity["Isotope", "Beryllium7"]}, {1, Entity["Isotope", "Beryllium7"]} > {1, Entity["Isotope", "Lithium7"]}, {1, Entity["Isotope", "Hydrogen1"]} > {1, Entity["Isotope", "Lithium7"]}, {1, Entity["Isotope", "Lithium7"]} > {2, Entity["Isotope", "Helium4"]}, {1, Entity["Isotope", "Lithium7"]} > {3, Entity["Isotope", "Helium4"]}}, VertexLabels > {{ Blank[], Pattern[e, Blank[Entity]]} :> Style[ e["FullSymbol"], 12]}], Graph[{ {1, Entity["Isotope", "Helium3"]} > {1, Entity["Isotope", "Helium4"]}, {1, Entity["Isotope", "Helium4"]} > {1, Entity["Isotope", "Beryllium7"]}, {1, Entity["Isotope", "Hydrogen1"]} > {1, Entity["Isotope", "Beryllium7"]}, {1, Entity["Isotope", "Beryllium7"]} > {1, Entity["Isotope", "Boron8"]}, {1, Entity["Isotope", "Boron8"]} > {1, Entity["Isotope", "Beryllium8"]}, {1, Entity["Isotope", "Beryllium8"]} > {2, Entity["Isotope", "Helium4"]}, {1, Entity["Isotope", "Beryllium8"]} > {3, Entity["Isotope", "Helium4"]} }, VertexLabels > {{ Blank[], Pattern[e, Blank[Entity]]} :> Style[ e["FullSymbol"], 12]}]}}, Sequence[ImageSize > 600, Spacings > 0]] 
As the core of a star gets hotter, other reactions become more probable, including one called the carbon–nitrogen–oxygen (CNO) cycle, which is dominant at core temperatures exceeding 17 million Kelvins. The Sun currently only obtains 1.7% of its helium production from the CNO cycle. The CNO cycle uses the trace elements carbon, nitrogen and oxygen as catalysts in the production of helium and results in an enrichment of nitrogen at the sacrifice of the carbon and oxygen. This alters the abundance ratios of these trace elements and deep convection stirs this higher nitrogen ratio toward the surface. So the relatively high levels of nitrogen observed in the ejecta of the Great Eruption could be indicating that the origin of the ejecta came from a star undergoing hydrogen fusion via the CNO cycle. The following graph shows the three primary CNO cycle variants that appear in stars of varying masses and temperatures. Gamma rays, positrons and neutrinos as byproducts are ignored in this graph. There are additional CNO cycles that can occur under particularly energetic environments, like novae and x‐ray bursts, but those are ignored here.
✕
cno1 = With[{isotopes = {Entity["Isotope", "Carbon12"], Entity["Isotope", "Nitrogen13"], Entity["Isotope", "Carbon13"], Entity["Isotope", "Nitrogen14"], Entity["Isotope", "Oxygen15"], Entity["Isotope", "Nitrogen15"], Entity["Isotope", "Carbon12"]}}, Graph[Join[ Rule @@@ (Partition[isotopes, 2, 1]), {{1, Entity["Isotope", "Hydrogen1"]} > Entity["Isotope", "Carbon12"], {2, Entity["Isotope", "Hydrogen1"]} > Entity["Isotope", "Carbon13"], {3, Entity["Isotope", "Hydrogen1"]} > Entity["Isotope", "Nitrogen14"], {4, Entity["Isotope", "Hydrogen1"]} > Entity["Isotope", "Nitrogen15"], Entity["Isotope", "Carbon12"] > {1, Entity["Isotope", "Helium4"]}}], VertexLabels > {Entity["Isotope", "Carbon12"] :> Style[ Grid[{{ Style[12, Smaller], "C"}, { Style[6, Smaller], SpanFromAbove}}, Alignment > {{Right, Center}, {Center}}, Spacings > {0, 0}], 10], Entity["Isotope", "Nitrogen13"] :> Style[ Grid[{{ Style[13, Smaller], "N"}, { Style[7, Smaller], SpanFromAbove}}, Alignment > {{Right, Center}, {Center}}, Spacings > {0, 0}], 10], Entity["Isotope", "Carbon13"] :> Style[ Grid[{{ Style[13, Smaller], "C"}, { Style[6, Smaller], SpanFromAbove}}, Alignment > {{Right, Center}, {Center}}, Spacings > {0, 0}], 10], Entity["Isotope", "Nitrogen14"] :> Style[ Grid[{{ Style[14, Smaller], "N"}, { Style[7, Smaller], SpanFromAbove}}, Alignment > {{Right, Center}, {Center}}, Spacings > {0, 0}], 10], Entity["Isotope", "Oxygen15"] :> Style[ Grid[{{ Style[15, Smaller], "O"}, { Style[8, Smaller], SpanFromAbove}}, Alignment > {{Right, Center}, {Center}}, Spacings > {0, 0}], 10], Entity["Isotope", "Nitrogen15"] :> Style[ Grid[{{ Style[15, Smaller], "N"}, { Style[7, Smaller], SpanFromAbove}}, Alignment > {{Right, Center}, {Center}}, Spacings > {0, 0}], 10], Entity["Isotope", "Carbon12"] :> Style[ Grid[{{ Style[12, Smaller], "C"}, { Style[6, Smaller], SpanFromAbove}}, Alignment > {{Right, Center}, {Center}}, Spacings > {0, 0}], 10], { Blank[], Pattern[e, Blank[Entity]]} :> Style[ e["FullSymbol"], 10]}]]; 
✕
cno2 = With[{isotopes = {Entity["Isotope", "Nitrogen15"], Entity["Isotope", "Oxygen16"], Entity["Isotope", "Fluorine17"], Entity["Isotope", "Oxygen17"], Entity["Isotope", "Nitrogen14"], Entity["Isotope", "Oxygen15"], Entity["Isotope", "Nitrogen15"]}}, Graph[Join[ Rule @@@ (Partition[isotopes, 2, 1]), {{1, Entity["Isotope", "Hydrogen1"]} > Entity["Isotope", "Nitrogen15"], {2, Entity["Isotope", "Hydrogen1"]} > Entity["Isotope", "Oxygen16"], {3, Entity["Isotope", "Hydrogen1"]} > Entity["Isotope", "Oxygen17"], {4, Entity["Isotope", "Hydrogen1"]} > Entity["Isotope", "Nitrogen14"], Entity["Isotope", "Nitrogen14"] > {1, Entity["Isotope", "Helium4"]}}], VertexLabels > {Entity["Isotope", "Nitrogen15"] :> Style[ Grid[{{ Style[15, Smaller], "N"}, { Style[7, Smaller], SpanFromAbove}}, Alignment > {{Right, Center}, {Center}}, Spacings > {0, 0}], 10], Entity["Isotope", "Oxygen16"] :> Style[ Grid[{{ Style[16, Smaller], "O"}, { Style[8, Smaller], SpanFromAbove}}, Alignment > {{Right, Center}, {Center}}, Spacings > {0, 0}], 10], Entity["Isotope", "Fluorine17"] :> Style[ Grid[{{ Style[17, Smaller], "F"}, { Style[9, Smaller], SpanFromAbove}}, Alignment > {{Right, Center}, {Center}}, Spacings > {0, 0}], 10], Entity["Isotope", "Oxygen17"] :> Style[ Grid[{{ Style[17, Smaller], "O"}, { Style[8, Smaller], SpanFromAbove}}, Alignment > {{Right, Center}, {Center}}, Spacings > {0, 0}], 10], Entity["Isotope", "Nitrogen14"] :> Style[ Grid[{{ Style[14, Smaller], "N"}, { Style[7, Smaller], SpanFromAbove}}, Alignment > {{Right, Center}, {Center}}, Spacings > {0, 0}], 10], Entity["Isotope", "Oxygen15"] :> Style[ Grid[{{ Style[15, Smaller], "O"}, { Style[8, Smaller], SpanFromAbove}}, Alignment > {{Right, Center}, {Center}}, Spacings > {0, 0}], 10], Entity["Isotope", "Nitrogen15"] :> Style[ Grid[{{ Style[15, Smaller], "N"}, { Style[7, Smaller], SpanFromAbove}}, Alignment > {{Right, Center}, {Center}}, Spacings > {0, 0}], 10], { Blank[], Pattern[e, Blank[Entity]]} :> Style[ e["FullSymbol"], 10]}]]; 
✕
cno3 = With[{isotopes = {Entity["Isotope", "Oxygen17"], Entity["Isotope", "Fluorine18"], Entity["Isotope", "Oxygen18"], Entity["Isotope", "Nitrogen15"], Entity["Isotope", "Oxygen16"], Entity["Isotope", "Fluorine17"], Entity["Isotope", "Oxygen17"]}}, Graph[Join[ Rule @@@ (Partition[isotopes, 2, 1]), {{1, Entity["Isotope", "Hydrogen1"]} > Entity["Isotope", "Oxygen17"], {2, Entity["Isotope", "Hydrogen1"]} > Entity["Isotope", "Oxygen18"], {3, Entity["Isotope", "Hydrogen1"]} > Entity["Isotope", "Nitrogen15"], {4, Entity["Isotope", "Hydrogen1"]} > Entity["Isotope", "Oxygen16"], Entity["Isotope", "Nitrogen15"] > {1, Entity["Isotope", "Helium4"]}}], VertexLabels > {Entity["Isotope", "Oxygen17"] :> Style[ Grid[{{ Style[17, Smaller], "O"}, { Style[8, Smaller], SpanFromAbove}}, Alignment > {{Right, Center}, {Center}}, Spacings > {0, 0}], 10], Entity["Isotope", "Fluorine18"] :> Style[ Grid[{{ Style[18, Smaller], "F"}, { Style[9, Smaller], SpanFromAbove}}, Alignment > {{Right, Center}, {Center}}, Spacings > {0, 0}], 10], Entity["Isotope", "Oxygen18"] :> Style[ Grid[{{ Style[18, Smaller], "O"}, { Style[8, Smaller], SpanFromAbove}}, Alignment > {{Right, Center}, {Center}}, Spacings > {0, 0}], 10], Entity["Isotope", "Nitrogen15"] :> Style[ Grid[{{ Style[15, Smaller], "N"}, { Style[7, Smaller], SpanFromAbove}}, Alignment > {{Right, Center}, {Center}}, Spacings > {0, 0}], 10], Entity["Isotope", "Oxygen16"] :> Style[ Grid[{{ Style[16, Smaller], "O"}, { Style[8, Smaller], SpanFromAbove}}, Alignment > {{Right, Center}, {Center}}, Spacings > {0, 0}], 10], Entity["Isotope", "Fluorine17"] :> Style[ Grid[{{ Style[17, Smaller], "F"}, { Style[9, Smaller], SpanFromAbove}}, Alignment > {{Right, Center}, {Center}}, Spacings > {0, 0}], 10], Entity["Isotope", "Oxygen17"] :> Style[ Grid[{{ Style[17, Smaller], "O"}, { Style[8, Smaller], SpanFromAbove}}, Alignment > {{Right, Center}, {Center}}, Spacings > {0, 0}], 10], { Blank[], Pattern[e, Blank[Entity]]} :> Style[ e["FullSymbol"], 10]}]]; 
✕
GraphicsGrid[{{cno1, cno2, cno3}}, ImageSize > 500] 
Because the Homunculus Nebula seems to show an enrichment of nitrogen compared to solar values, this seems to suggest that the source of the Homunculus Nebula was undergoing the CNO cycle.
As discussed earlier, there are a number of lines seen in the spectrum of the star, many of which come from doubly ionized neon, iron and argon, among other elements. To ionize these elements to this level requires some very high temperatures, supporting the notion that we are dealing with a very hot environment. The ionization levels seen in the spectrum require a source that is at least 37,000 K, which is very hot for a star!
Concerning the strange shape of the observed spectral lines, this is known as a P Cygni profile, named for the star P Cygni, which was the prototype. This observation implies the star is surrounded by an ionized shell of diffuse gas that is expanding outward, creating the emission lines. The blue‐shifted absorption feature is caused by the shell’s absorption of the star’s light along our line of sight. The line‐of‐sight absorption from the shell is blue‐shifted relative to the general emission because it’s only on the side moving toward the Earth.
✕
Graphics[{LightGray, Annulus[{0, 0}, {2, 2.5}], Black, {Dashed, Line[{{{.2, 0}, {.2, 2}}, {{.2, 0}, {.2, 2}}}]}, Annulus[{0, 0}, {2, 2.5}, {3 Pi/2  .1, 3 Pi/2 + .1}], ColorData["BlackBodySpectrum"][11000], Disk[{0, 0}, .2], Gray, Arrowheads[.02], Arrow@Table[{2.8 {Cos[t], Sin[t]}, 3.1 {Cos[t], Sin[t]}}, {t, 0, 2 Pi, .1}], Text["To Earth", {0, 3.3}], Text["star", {0, 0}, {0, 3}], Text["expanding shell", {0, 1.7}], Text["absorption along line of sight", {2.5, 3}], Arrow[{{1.2, 3}, {0, 2.6}}]}] 
In 1996, it was suggested that observed brightness variations had a period, eventually narrowed down to 5.54 years. This suggested the possibility that the variations were caused by a binary star system with an orbital period of 5.54 years. Followup spectral observations supported this theory, showing radial velocity variations. Xray emissions were found to disappear during a relatively brief interval during the predicted time when the stars in the system would be at their closest approach.
Following is an illustration of how the theoretical binary star system could be arranged. Each star has a stellar wind, with the secondary star having a thin and fast wind, while the primary star is nearly obscured by an optically thick and relatively slow wind.
✕
With[{e = .9, a = 15.5, i = 41 Degree}, With[{b = Sqrt[a^2  a^2 e^2], wind1 = DensityPlot3D[ Exp[(x^2 + y^2 + z^2)/2], {x, y, z} \[Element] Ball[{0, 0, 0}, 8], Sequence[ColorFunction > (GrayLevel[ Rescale[#, {0, 1}, {1, 0}]]& ), OpacityFunction > "Image3D"]]}, Show[{ParametricPlot3D[{a Cos[t]  (a  a (1  e)), b Sin[t], 0}, {t, 0, 2 Pi}, PlotStyle > Directive[ GrayLevel[0.5], Thickness[0.002]]], Graphics3D[{Gray, Arrowheads[.02], Arrow[Table[{a Cos[t  Pi/1.9]  (a  a (1  e)), b Sin[t  Pi/1.9], 0}, {t, 0, 2 Pi, 2 Pi/200}]], RGBColor[ 0.6998692810457516, 0.7757734204793029, 1.], Lighting > {{"Ambient", GrayLevel[.3]}, {"Directional", White, ImageScaled[{0, 0, 1}]}}, Sphere[{0, 0, 0}, .279], Opacity[.75], RGBColor[ 0.6998692810457516, 0.7757734204793029, 1.], wind1[[1]], Opacity[1], RGBColor[ 0.6998692810457516, 0.7757734204793029, 1.], Sphere[Table[{a Cos[t]  (a  a (1  e)), b Sin[t], 0}, {t, Pi/2, Pi/2, Pi/10}], .11], , Opacity[.075], Sphere[Table[{a Cos[t]  (a  a (1  e)), b Sin[t], 0}, {t, Pi/2, Pi/2, Pi/10}], 1.25], White, Opacity[1], Text[\!\(\* StyleBox["\"\<\[Eta] Carinae A\>\"", StripOnInput>False, FontSize>20, FontWeight>Bold]\), {0, 0, 0}, {0, 7}], Text[\!\(\* StyleBox["\"\<orbit of \[Eta] Carinae B\>\"", StripOnInput>False, FontSize>14, FontWeight>Bold]\), {16, 10, 0}, {0, 2}], Text[\!\(\* StyleBox["\"\<optically thin, fast stellar wind\>\"", StripOnInput>False, FontSize>14, FontWeight>Bold]\), {10, 10, 0}, {.2, 2}], Text[\!\(\* StyleBox["\"\<optically thick stellar wind\>\"", StripOnInput>False, FontSize>14, FontWeight>Bold]\), {5, 0, 0}, {0, 2}], Black, Arrow[{{1, 0, 2}, {0, 0, .5}}], Red, Arrowheads[.01], Arrow[{{10, 10, 0}, {10, 8, 0}}], Arrow[{{5, 0, 0}, {2, 0, 0}}], Arrow[{{16, 10, 0}, {16, 7.5, 0}}]}]}, Sequence[ ViewPoint > {0, (2) Cos[41 Degree], (2) Sin[41 Degree]}, ImageSize > 650, Background > GrayLevel[0], Boxed > False, Axes > False, SphericalRegion > True, ViewAngle > Rational[1, 8] Pi, ViewVertical > {0.3, 0, 1}, PlotRange > All]]]] 
Eta Carinae A is most likely an atypical and extreme luminous blue variable star (LBV) undergoing tremendous mass loss due to its intense stellar wind. Little is known about these types of stars because they are so rare. Eta Carinae B is likely less massive than the primary star, but it may be more evolved. Such a hot star could indicate that it is what is known as a Wolf–Rayet star. Its outer hydrogen envelope has been stripped away, revealing its hotter, heliumrich inner layers. Details of the exact nature of the component stars are difficult to pin down due to surrounding dust, nebulosity and stellar winds, but the primary star may be 120 solar masses, give or take. The secondary is probably in the 30–90 solar mass range. Given that the Homunculus Nebula surrounding the system has tens of solar masses locked up and expanding outward, the original mass of the system must have been extremely large if the remnant component stars still have such high masses.
Based on all the observed evidence and the success of models to reproduce observed phenomena, it’s likely that both stars are massive and that the secondary star is the hotter of the two. As mentioned previously, the primary star appears to be an extreme LBV star, although atypical and more luminous than any other known LBV in our galaxy, so this means it’s likely an early typeB star. The estimated luminosity is millions of times the luminosity of the Sun. On the Hertzsprung–Russell (HR) diagram, this places the primary star near the upper left among the hottest and most luminous stars known, but its exact placement is subject to revision as additional evidence comes in. The secondary is harder to classify, but given its likely smaller radius, even a higher temperature of 37,000 K, making it a rare O‐type star, would place it below Eta Carinae A and slightly to the left using HertzsprungRussellDiagram.
✕
ResourceFunction["HertzsprungRussellDiagram"][ Entity["Star", "EtaCarinae"], ImageSize > 500] 
The origin of the hard x‐ray emission in the Eta Carinae system is likely due to the collision between the stellar winds of the binary star components. As the secondary star approaches periastron (closest approach to the primary star), its fast and thin stellar wind plows through the optically thick and slowmoving stellar wind of the primary star. This creates a bow shock, like a boat moving through water, of superheated gas in a hyperbolic cone region (shown in purple in the image below). The gas in this region can be heated to tens of millions of degrees. As the secondary nears periastron, it goes deeper into the primary star’s stellar wind and becomes obscured from view, causing an eclipse of the x‐ray emission. After the secondary star passes periastron, the x‐rays eventually become visible again before trailing off until the next periastron approach, and the cycle repeats.
Here is a sequence of snapshots of the simulation of the bow shock (purple cone) moving through the primary star’s stellar wind. This is mainly an artistic rendering since the actual orientation of the bow shock would be subject to magnetohydrodynamic effects not considered here. These effects, predicted by supercomputer simulations, have shown that the secondary star’s motion through the thick stellar wind of the primary star carves out a cavity that spirals outward.
First, the stellar wind for both stars can be modified as radially symmetric clouds using DensityPlot3D.
✕
wind1 = DensityPlot3D[ Exp[(x^2 + y^2 + z^2)/12], {x, y, z} \[Element] Ball[{0, 0, 0}, 8], Sequence[ColorFunction > (GrayLevel[ Rescale[#, {0, 1}, {1, 0}]]& ), OpacityFunction > "Image3D"]]; wind2 = DensityPlot3D[ Exp[(x^2 + y^2 + z^2)/12], {x, y, z} \[Element] Ball[{0, 0, 0}, .9], Sequence[ColorFunction > (GrayLevel[ Rescale[#, {0, 1}, {0.5, 0}]]& ), OpacityFunction > "Image3D"]]; 
Next, some fixed constants are defined, including some positions and orbital parameters, as well as the shape and initial orientation of the bow shock.
✕
primarystar = {0, 0, 0}; a = 15.5; e = .9; b = Sqrt[a^2  a^2 e^2]; i = 41 Degree; ha = 1.5; hb = 1.5; hc = 1.5; dirX = {0, 0, 1}; 
Most of the remainder of the task at hand is to assemble the graphics scene by defining a simulation that is dependent on the phase angle of the secondary star as it orbits the primary star.
✕
simulation[angle_] := Module[{secondarystar, dirZ, dirY}, secondarystar = {a Cos[angle]  (a  a (1  e)), b Sin[angle], 0}; dirZ = Normalize[primarystar  secondarystar]; dirY = Cross[dirZ, dirX]; Graphics3D[{ ParametricPlot3D[{a Cos[t]  (a  a (1  e)), b Sin[t], 0}, {t, 0, 2 Pi}, PlotStyle > Directive[ GrayLevel[0.5], Thickness[0.002]]][[1]], ParametricPlot3D[ Evaluate[ secondarystar + ha dirX Sinh[v] Cos[\[Theta]] + ha dirY Sinh[v] Sin[\[Theta]]  hb dirZ Cosh[v]] + 2.5 Normalize[(primarystar  secondarystar)], {\[Theta], 0, 2 Pi}, {v, 0, 2}, Sequence[ Mesh > None, PlotStyle > Directive[ Specularity[ GrayLevel[1], 50], RGBColor[0.5, 0, 0.5]], Lighting > {{"Ambient", GrayLevel[0.7]}, {"Directional", GrayLevel[1], 0.9 secondarystar}}]][[1]], RGBColor[ 0.6998692810457516, 0.7757734204793029, 1.], Lighting > {{"Ambient", GrayLevel[0.7`]}, {"Directional", White, ImageScaled[{0, 0, 1}]}}, Sphere[primarystar, .279], Opacity[.2], RGBColor[ 0.6998692810457516, 0.7757734204793029, 1.], wind1[[1]], Opacity[1], RGBColor[0.6998692810457516, 0.7757734204793029, 1.], Sphere[secondarystar, .11], Opacity[.8], wind2[[1]]}, Sequence[ ViewPoint > {0, (2) Cos[i], 2 Sin[i]}, ViewVertical > {0.7, 0, 1}, Boxed > False, Axes > None, SphericalRegion > True, ViewAngle > Rational[1, 15] Pi, PlotRange > 35, Lighting > {{"Ambient", GrayLevel[0.7]}, {"Directional", GrayLevel[1], primarystar}}, Background > GrayLevel[0], ViewCenter > {0.35, 0.5, 0.5}]] ] 
Several static snapshots of the simulation can be seen using the following.
✕
GraphicsGrid[ Partition[simulation /@ {(\[Pi]/3), (\[Pi]/9), \[Pi]/9, \[Pi]/3}, 2], ImageSize > 500] 
Time can be iterated and the frames exported, and then combined in post‐processing to make an animation:
✕
Do[ Module[{gr}, gr = simulation[angle]; Export[ToString[ PaddedForm[Rescale[angle, {Pi/3, Pi/3}, {0, 400}], 3, NumberPadding > "0", NumberSigns > {"", ""}]] <> ".png", gr]; ], {angle, Pi/3, Pi/3, Pi/3/200}] 
Some models of the Eta Carinae system show the possibility that within days of periastron passage, the secondary star may actually accrete matter from blobs formed by the shock zone. Highermass models of the secondary star favor more accretion than lowermass models. A higher mass for the secondary star increases the likelihood that gas will be attracted to it and accumulate on its surface, and so slowly increase the mass of the secondary star with possible secondary effects due to the presence of an accretion disk.
To this day, neither the Great Eruption observed in the mid‐1800s nor the other smaller eruptions that have been observed are well understood. A number of theories exist to explain the eruptions, but a lack of detail concerning the inner regions of the system makes it difficult to confirm any one of these theories. Obviously, the high mass and instability that comes along with the system likely had something to do with it. One theory suggests that there may have been a triple star system and the third member merged with one of the other stars, causing an outburst. Another is that mass transfer between the primary and secondary stars caused a nova‐like outburst. A third possibility is that due to the large amount of mass involved in the primary star, gamma rays in the core were energetic enough to spontaneously generate electronpositron pairs in significant number. This last theory would have it that the energy created in the core of the primary star, which normally provides radiation pressure to support the star against gravitational collapse, was converted into matter pairs instead. The production of matter pairs results in a pulsational pairinstability supernova, or “supernova impostor.”
As with any star, the end state is primarily massdependent. It is widely accepted that Eta Carinae involves at least one very massive star, and it is very likely it contains two of them. In all cases, the masses of the star or stars involved are well above the threshold needed to result in a supernova explosion at some point in the future. The mysteries of the system make it impossible to say exactly when this might happen, especially since there may already have been one failed attempt at a supernova during the Great Eruption. Hopefully, as time progresses, the Homunculus Nebula will expand enough to allow us to have a clear view of the inner regions, and Eta Carinae will finally reveal its secrets.
Get full access to the latest Wolfram Language functionality with a Mathematica 12 or WolframOne trial. 
In June 2019, Stephen Wolfram announced the Wolfram Function Repository, a curated repository of functions that can be employed immediately in the Wolfram Language. Since then, the Repository has grown to include more than 1,000 functions in over 20 categories.
Functions included in the Repository range from those that are more general and utilitarian in nature to others with very specific applications. As with all Wolfram Language functions, Repository documentation pages contain examples showing how to use the functions. We’re featuring a few of the functions submitted to the Repository so far that showcase the variety of functions our users have built.
Like many functions in the Repository, DropWhile was created by a user to streamline his workflow. It works by taking a userset condition to examine the elements of a list, starting with the first element, to see if it meets the given condition; if so, it is dropped and the next element is then evaluated. This continues as long as the condition is met and remains true. Once the condition is no longer true, it no longer applies and no additional elements are dropped.
This is an example of a simple yet useful idiom. If you look at its source notebook, you can see that the function definition is simple but was used often enough by the author to be written into a ResourceFunction. Viewing the source code from within the Wolfram Language is very simple:
✕
ResourceFunction["DropWhile", "DefinitionNotebook"] 
As shown in the examples on the resource page, the function can be set so that all odd elements starting from the beginning of a given list of numbers are dropped until the condition is no longer met:
✕
ResourceFunction["DropWhile"][{1, 3, 5, 9, 10, 11, 12, 15}, OddQ] 
DropWhile can be configured to exclude all elements in a given list that are less than 14, starting from the first element, until an element no longer meets the condition:
✕
ResourceFunction["DropWhile"][{0, 1, 3, 7, 13, 14, 23, 27, 44, 53}, # < 14 &] 
Similarly, it can be utilized to drop leading zeros in a list:
✕
ResourceFunction["DropWhile"][{0, 0, 0, 0, 7, 11, 0, 3.14, 24}, EqualTo[0.]] 
Using Characters lets it work on strings:
✕
ResourceFunction["DropWhile"][ Characters["jenny:8675309"], ! DigitQ[#] &] 
There’s also a ResourceFunction for that:
✕
ResourceFunction["StringFunction"][ ResourceFunction["DropWhile"]]["jenny:8675309", Not@*DigitQ] 
MaximizeOverPermutations was introduced in the Mathematica forum on Stack Exchange. It takes a Method option that accepts either "Enumerate" or "MonteCarlo". While the bruteforce "Enumerate" option is good for n≤12, the really excellent part is the "MonteCarlo" method, which uses a simulated annealing (Metropolis–Hastings) approach. This scales nicely to larger problems and, as shown in the documentation, it does a really good job on some notoriously difficult benchmark tests. One function curator liked it so much that he offered 250 Stack Exchange points in the hope of having it become a Repository contributed function. Said points were awarded on receipt of the function. There was no quid pro quo. Definitely not. Well, actually, there was. It was kind of brazen, really. But we got the function and it is quite good.
✕
x = RandomReal[{0, 1}, 100]; ResourceFunction["MaximizeOverPermutations"][#.x &, 100, Method > {"MonteCarlo", "Iterations" > 10^5, "AnnealingParameter" > 10}] 
Here, you can see the function maximize the value in the third place of permutations for the set {1,2,3,4}:
✕
ResourceFunction["MaximizeOverPermutations"][#[[3]] &, 4] 
In the following illustration, MaximizeOverPermutations determines the maximum function value for the given function for permutations of the numbers {1,2,3}, with two function values yielding the maximal value :
✕
f[{1, 2, 3}] = 0; 
✕
f[{1, 3, 2}] = 2; 
✕
f[{2, 1, 3}] = 4; 
✕
f[{2, 3, 1}] = 8; 
✕
f[{3, 1, 2}] = 1; 
✕
f[{3, 2, 1}] = 8; 
✕
ResourceFunction["MaximizeOverPermutations"][f, 3] 
The number of permutations of n objects scales very quickly with n; this can impact the time and space needed to perform such computations. Learn more by reading the documentation page for this function.
This function helps users solve Sudoku number puzzles. SudokuSolve treats a 9×9 matrix of data as a partially solved Sudoku puzzle, filling in the entries so that every row, every column and the nine 3×3 subgrids contain the digits 1 through 9.
It also notifies users if a given puzzle cannot be solved. An option can also be set to show when an entry was a guess rather than determined with certainty using logic:
✕
ResourceFunction["SudokuSolve"][\!\(\* TagBox[ RowBox[{"(", "", GridBox[{ {"\[Placeholder]", "\[Placeholder]", "8", "1", "7", "6", "\[Placeholder]", "2", "\[Placeholder]"}, {"\[Placeholder]", "4", "\[Placeholder]", "\[Placeholder]", "\[Placeholder]", "9", "7", "\[Placeholder]", "\[Placeholder]"}, {"\[Placeholder]", "\[Placeholder]", "\[Placeholder]", "\[Placeholder]", "\[Placeholder]", "\[Placeholder]", "\[Placeholder]", "\[Placeholder]", "\[Placeholder]"}, {"\[Placeholder]", "7", "1", "8", "\[Placeholder]", "\[Placeholder]", "\[Placeholder]", "\[Placeholder]", "\[Placeholder]"}, {"\[Placeholder]", "\[Placeholder]", "\[Placeholder]", "\[Placeholder]", "\[Placeholder]", "\[Placeholder]", "6", "7", "9"}, {"\[Placeholder]", "\[Placeholder]", "\[Placeholder]", "5", "9", "7", "\[Placeholder]", "8", "1"}, {"\[Placeholder]", "\[Placeholder]", "\[Placeholder]", "\[Placeholder]", "2", "\[Placeholder]", "\[Placeholder]", "\[Placeholder]", "\[Placeholder]"}, {"\[Placeholder]", "5", "9", "\[Placeholder]", "\[Placeholder]", "\[Placeholder]", "\[Placeholder]", "1", "\[Placeholder]"}, {"\[Placeholder]", "1", "4", "6", "5", "\[Placeholder]", "3", "\[Placeholder]", "\[Placeholder]"} }, GridBoxAlignment>{"Columns" > {{Center}}, "Rows" > {{Baseline}}}, GridBoxSpacings>{"Columns" > { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "Rows" > { Offset[0.2], { Offset[0.4]}, Offset[0.2]}}], "", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]\)] 
The next highlighted function yields a visual representation of the territory of a country for a given period of years. HistoricalCountryAnimate accesses Wolfram Knowledgebase resources in performing its calculations. This is a great example of building complex functions with a language that has builtin access to realworld knowledge. Here, we can use Canada:
✕
ResourceFunction["HistoricalCountryAnimate"][ Entity["HistoricalCountry", "Canada"]] 
This function returns an interactive animation with tooltips. Depending on system specs, generating the animated image may take a few minutes.
There are several options users can set, one of which is the option to include a map showing the borders of modern countries overlapping the historical country.
For users who want another option for visual representation of data, ChordDiagram provides an alternative means of doing so.
This function requires an edgeweighted graph as input. That data is used to draw each vertex of a weighted graph as a wedge, with width proportional to the WeightedAdjacencyMatrix row total:
✕
gr = Graph[{1 \[UndirectedEdge] 2, 2 \[UndirectedEdge] 3, 3 \[UndirectedEdge] 4, 4 \[UndirectedEdge] 1}, EdgeWeight > RandomReal[{1, 6}, 4]] 
Now we can apply ChordDiagram to the graph (with randomized edge weights):
✕
ResourceFunction["ChordDiagram"][gr] 
Our final function definitely puts the “fun” in “function” with BirdSay, which gives the user a desired output in a speech bubble, as stated by a funloving parrot:
✕
ResourceFunction["BirdSay"]["Bird is the word!"] 
BirdSay works by creating a Panel with ninepatch images for the Appearance option. Ninepatch images are a great tool for customizing design in Panel as well as many other formatting constructs such as Button, Framed, Notebook and so on. The following code returns the raw ninepatch image from a symbol within the BirdSay ResourceFunction definition:
✕
ninePatch = Symbol[Context[ ResourceFunction["BirdSay"]] <> "$data"] 
This image can be used as the value of Appearance in Button:
✕
Button[Style["Yo! Wolfie!", 25], CreateDialog[ResourceFunction["WolfieSay"]["Greetings"]], Appearance > ninePatch] 
You can see the full definition of how ninepatch images are used within BirdSay by downloading the definition notebook.
Users can make many other modifications to adjust parrot placement, nest several references within a single statement and much more. Check out its documentation page to explore additional features.
Users are regularly contributing to the Wolfram Function Repository. To browse our newest additions, visit our Recent Functions page or subscribe to our email updates for a convenient weekly digest. If you have a great idea for a function, please submit your notebook for consideration! Just follow the File > New > Repository Item > Function Repository Item path to get a Definition Notebook where you’ll document the source code and uses. Whether you’re an advanced user of the Wolfram Language or just starting out, there’s a function in the Repository to help enhance and inspire your computational explorations. And if you haven’t found the perfect function yet—submit it!
]]>We all know WolframAlpha is great for solving calculations and math problems, but not everyone knows about the full breadth of useful data it provides. I entered college as a biology major and was quickly overwhelmed with the amount of information I had to memorize. Class lectures moved at a fast pace, and often my notes had gaps in them where I hadn’t finished writing down what the professor was saying before she moved on. I was up late at night making flashcards for tests and searching desperately through Yahoo! Answers, trying to find information like what exactly the alimentary system does (hint: it “functions in food ingestion and digestion; absorption of water and nutrients; secretion of water, acids, enzymes, buffers and salts; waste excretion; and energy storage”—thanks, WolframAlpha!).
Thinking back on those latenight study sessions, I would have saved a lot of time if I had properly used WolframAlpha as a study tool. Because I was a biology major, many of the areas in which I most frequently sought information were related to scientific fields such as chemistry, but WolframAlpha can be a valuable resource in so many more areas. Here are 15 applications of WolframAlpha in topics beyond mathematics. I hope you will find these to be useful both inside and outside the classroom!
Stoichiometry was for me one of the hardest parts of chemistry classes, and I’m sure I’m not alone. Thankfully, WolframAlpha can also calculate stoichiometric problems—finding the amount of a substance needed to complete a reaction as well as the theoretical yields. To calculate a reaction’s stoichiometry, enter the reaction as well as the amounts you know.
For example, let’s use the reaction B_{2}H_{6} + O_{2} → B_{2}O_{3} + H_{2}O. I have 36.1g B_{2}H_{6} and I need to calculate how many grams of O_{2} would be necessary to burn all 36.1g of B_{2}H_{6}. In this case, I just enter the following:
36.1 g B2H6 + O2 > B2O3 + H2O
WolframAlpha balances the equation and calculates the answer, which is displayed conveniently in a table. From this, I now know that I would need 3.914 moles of O_{2}, or 125.2 grams, to burn all of the B_{2}H_{6}:
A great place to find basic information about a significant historical figure or event is WolframAlpha. One thing I find especially helpful is information about specific battles or conflicts. Often, when reading about these events, the scale of them seems so large that I get lost and can’t fully comprehend the important details.
However, WolframAlpha provides only the most important information in easytounderstand charts that compare both sides, so I’m able to get the full picture succinctly, without spending hours combing through long Wikipedia articles.
For example, I queried “Spanish Conquest of Peru”, the decadeslong war between the Kingdom of Spain and the Inca Empire in the 16th century.
WolframAlpha first provides information such as the dates and location, then delves into more specific data, such as the two factions in the conflict, the commanders of both factions, the casualties and losses of both sides, and the major outcomes of the battle.
With this, I can easily understand the basics of what happened without getting bogged down by details.
Taxonomical information for all manner of organisms is available in WolframAlpha. You can type in a specific organism to find information about it, or you can try a whole species, family, genus or more.
If I enter in something broad and basic, for example “cnidaria”, I come up with a broad range of information, including biological properties, metabolism, other members of the kingdom and phylum, and more.
However, if I don’t want to go through all that data, I can narrow the scope. For example, if I specifically query “planarian taxonomy”, I get a table with the kingdom, phylum, class, order and family all classified:
The breadth of biological data WolframAlpha has available isn’t limited simply to animals. In addition to taxonomical and basic information, WolframAlpha can generate growth curves for plants for specific locations and compare them to the American national average. For example, if I query “maple tree growth curve in Illinois”, I get a graph of the growth curve of maple trees in Illinois, a graph of the growth curve for the entire USA and a chart detailing the taxonomical information of a maple tree:
WolframAlpha can balance chemical equations as well. For example, I used the query “C4H6O3+H2O > C2H4O2”. WolframAlpha first shows you the answer, then the structure of the equation. What’s particularly helpful about this is you can toggle the type of structure you want to look at—you can switch from a skeletal structure to a Lewis structure, or display all the atoms.
Scroll down further and you’ll find WolframAlpha displays the chemical names and formulas of the components involved, as well as other relevant information such as their molar masses, densities, melting points and more.
Similarly, converting mass or volume to moles and vice versa with WolframAlpha is really simple. Just type in the amount of a substance in moles or mass along with the unit to which you want it converted (for example, 7 moles of acetic acid to kilograms), and WolframAlpha computes the answer along with other possible unit conversions and corresponding quantities:
WolframAlpha has extensive anatomical and medical information available freely at your fingertips. For example, if you query “human heart arteries”, the results interpret this query correctly as the left and right coronary arteries, then display their Latin names, alternate names and a brief description of the function of each artery:
If you scroll further down, models of the morphologies, regional locations and body locations are also displayed:
Beneath that are the physical characteristics, constitutional parts and connections (how the arteries function as part of the circulatory system):
You can also contrast and compare more specific aspects of two different structures—for example, “function of gallbladder vs liver”:
The range of information available isn’t limited to only humans. All creatures great and small are represented in a similar way as the human data. Try the query “horse femur”, for example. The first thing displayed is the hierarchical relationships of the left and right femurs, followed by models of the morphology, regional location and body location:
Finally, even the articulations and homologous structures are shown:
I found that you can even analyze a gene with WolframAlpha—and not just from the human genome. WolframAlpha has data from the fully sequenced genomes of the mouse, the fruit fly and more.
Let’s take a look at the results for the query “human gene gfra1”. First, WolframAlpha interprets the query, then provides the standard and alternate names, and then the location of the gene via a table chart as well as a visual representation of its location on chromosome 10:
WolframAlpha also displays other relevant information such as the reference sequence, other nearby genes, visual representations of genesplicing structures, protein names and more. It also provides gene ontology characteristics such as functions and processes.
Apart from genes, information on proteins and biomolecules is also available. In the case of proteins, such as hemoglobin, WolframAlpha provides the sequence, molecular weight and models of the ribbon and atomic structures. For biomolecules like serotonin, the chemical names and formula are displayed, as well as a structure diagram:
If you’re working with atomic spectra, WolframAlpha is a great resource to have. If you enter in “atomic spectrum of” plus whatever element you’re working with, WolframAlpha will display a visualization of the atomic spectrum and the visible regions. It also includes the spectral lines. What’s particularly handy is that for the visualization of the atomic spectrum, you can toggle among wavelength, frequency and energy. Next to the toggle is the option to show or hide additional views, like oscillator strength and color.
When not bogged down by schoolwork (which is admittedly rare), I like to read and write, and have found WolframAlpha to be a surprisingly helpful resource. In addition to providing definitions and translations of words, WolframAlpha can give synonyms, antonyms, words that rhyme with a specific word and more.
The main reason I prefer using WolframAlpha to find definitions rather than the more popular dictionary or thesaurus sites is because there’s so much more interesting information provided on WolframAlpha. For example, if I query the word “fugue”, I get not only three different definitions, but also the word’s first known usage in English, its roots, a timeline of its usage, a list of translations into other languages, a list of broader terms with the same or similar meanings and more.
You can also discover synonyms or antonyms of a word with WolframAlpha. If I type in the query “incite synonym”, WolframAlpha generates a list of synonyms, and also provides definitions below.
In addition to synonyms and antonyms, WolframAlpha can also list words that rhyme with a certain word. For example, if I enter in “words that rhyme with sublime”, I get a list of words such as lime, dime, prime, etc. This feature could be especially useful to poets, songwriters and other creative writers.
Another feature writers and readers alike can appreciate is that WolframAlpha can provide relevant quantitative data relative to the number or words or pages of a document. For example, if I type in “12,000 words”, WolframAlpha can tell me how many pages that document would be; how long it would take to read, write or speak it; and more.
Got a secret message you need to pass on? WolframAlpha can help with that too. Apart from translating words and phrases from one language to another, WolframAlpha can also convert words and phrases into Morse code. Just type what you want to translate and let WolframAlpha do the rest.
When working with kinematics, WolframAlpha is a great tool to have in your figurative belt. If you’re doing a twobody collision problem, for example an elastic collision, WolframAlpha can compute the final speeds of the two bodies as well as generate a useful schematic that visualizes the collision. Simply type in “elastic collision” plus the values for the initial mass and velocities of the two bodies and press Enter. The first thing WolframAlpha does is interpret the input information, displaying it in a chart. It then calculates the result for the two final speeds, then generates a schematic visualizing the collision.
In addition to having detailed information on brain anatomy, as in previously shown examples, WolframAlpha also carries a good deal of information on cognitive tasks and related areas such as memory, language, attention, reasoning and perception tests.
You can also find information on individual types of neurons in the nervous system. Along with the location and description of a neuron, WolframAlpha also includes useful data such as its synaptic properties and electrophysiological measurements:
Similarly, you can also look for brain areas by criteria like their functions. For example, querying “brain area associated with memory” brings up a list of associated brain areas, with each result listed linking to a separate page for that specific brain area.
Researching countryspecific socioeconomic data is very simple. Type in what you want to know, followed by the country. If you are comparing several countries, separate the names with a comma. For example, try querying “GDP of Mozambique, Namibia, Mali” or like in this example, “unemployment rate Vietnam, Cambodia, Laos”.
The first thing WolframAlpha displays is the interpretation of your input, followed by the direct results:
It then displays other relevant information, such as the unemployment rates for the three countries over time, the longterm unemployment rate (separated by sex), the unemployment rate by education, labor force by education and more:
If you want to check the data associated with a particular region of the US, WolframAlpha can be especially helpful. You can find data like income, for example the highest per capita income by county:
WolframAlpha has a great tool for calculating titrations. It can compute for the volume of base, volume of acid, base concentration or acid concentration. All you need to do is plug in the corresponding variables, such as volume or concentration of base, etc. WolframAlpha then computes the answer.
WolframAlpha can be a helpful resource for looking up and comparing equations. For example, if you enter in “particle in a box”, a model fundamental to the field of quantum mechanics, the input results first show an interpretation of your query, followed by all the relevant equations for both classic and quantum mechanics. WolframAlpha also displays a diagram of the potential energy.
Hybridization, or the mixing of atomic orbitals on an atomic center, is pretty hard to get the hang of. WolframAlpha comes through as a great resource in this regard. Simply enter the name of the chemical compound plus “hybridization” and WolframAlpha will display the hybridization on each atom in the molecule, the electron count and a diagram with the orbitals labeled:
Similarly, WolframAlpha also has information about each of the bonds in a compound. If you type in the compound name plus “bonds” or “bond information”, WolframAlpha will provide you with a convenient chart with each of the bonds, their bond count, bond length and energy in kJ/mol (although you can adjust the units if need be):
Calculating thermodynamics problems such as isothermal processes is made simple with WolframAlpha. If you query “isothermal process”, a calculator tool with input tools for initial pressure, initial volume, initial temperature and final volume appears. Input the values corresponding to your needed calculation, press Compute and a table with the results for final pressure, entropy change, heat transferred to the system, final temperature and work done on the system is generated. WolframAlpha also generates graphs of pressure vs. volume and temperature vs. entropy.
While I found these 15 applications of WolframAlpha technology useful, my list only scratches the surface; WolframAlpha has so much information and functionality to offer on subjects ranging from radioactive decay to classical mythology, to comparing nutrition information in a meal, calculating Bose–Einstein distributions, estimating how many of an object would fill a container, computing the luminosity of a star and many more. Whether you’re a student preparing for an upcoming exam or just a curious individual interested in researching a particular topic (perhaps the physics of running in the rain!), I highly recommend WolframAlpha as an informational resource. It has a lot more to offer than just mathrelated information and solutions!
]]>The sparse ruler problem has been famously worked on by Paul Erdős, Marcel J. E. Golay, John Leech, Alfréd Rényi, László Rédei and Solomon W. Golomb, among many others. The problem is this: what is the smallest subset of so that the unsigned pairwise differences of give all values from 1 to ? One way to look at this is to imagine a blank yardstick. At what positions on the yardstick would you add 10 marks, so that you can measure any number of inches up to 36?
Another simple example is of size 3, which has differences , and . The sets of size 2 have only one difference. The minimal subset is not unique; the differences of also give .
Part of what makes the sparse ruler problem so compelling is its embodiment in an object inside every schoolchild’s desk—and its enduring appeal lies in its deceptive simplicity. Read on to see precisely just how complicated rulers, marks and recipes can be.
First, let’s review the rules and terminology used in the sparse ruler problem. A subset of a set covers if .
For example, what is the smallest subset of that covers the set ? The greatest number of differences for a subset of size 5 is , which is not enough to get 13 values. But a subset of size 6, with differences, is large enough. In this case, the subset covers , and so the size of the smallest covering subset of is at most 6.
Here are the differences using only :
✕
{1, 13, 9, 13, 6, 6, 13, 9, 9, 11, 11, 13, 13}  {0, 11, 6, 9, 1, 0, 6, 1, 0, 1, 0, 1, 0} 
Of the 15 differences, two are achieved twice: and . Here is a way to list the pairs explicitly:
✕
Column[SplitBy[ SortBy[Subsets[{0, 1, 6, 9, 11, 13}, {2}], Differences], Differences]] 
Let’s try another way to calculate the set of differences:
✕
Union@Abs@ Flatten@Outer[Subtract, {0, 1, 6, 9, 11, 13}, {0, 1, 6, 9, 11, 13}] 
Of the subsets that cover , let be the size of a smallest subset (there may be more than one).
The following table summarizes the values of for . Both and of size 3 cover ; note that after sorting:
✕
Text@Grid[Prepend[Table[With[{ruler = SplitToRuler[sparsedata[[n]]]}, {ruler, Row[{"[", n, "]"}], Length[ruler]}], {n, 1, 12}], {"a smallest\n subset\n", "differences [n]", Row[{" the smallest\nsubset size ", Style[Subscript["M", "n"], Italic], "\n"}]}]] 
In 1956, John Leech wrote “On the Representation of 1, 2, …, n by Differences,” which proved the bounds .
There are a few terms and “rules” to keep in mind when discussing the sparse ruler problem:
This length135 sparse ruler is nonperfect:
✕
Length@{0, 1, 2, 3, 4, 5, 6, 65, 68, 71, 74, 81, 88, 95, 102, 109, 116, 123, 127, 131, 135} 
This length138 sparse ruler is optimal:
✕
Length@{0, 1, 2, 3, 7, 14, 21, 28, 43, 58, 73, 88, 103, 111, 119, 127, 135, 136, 137, 138} 
Here is an optimal length50 sparse ruler with 12 marks (i.e. ). The list of positions of the marks is the ruler form:
✕
ruler50 = {0, 1, 3, 6, 13, 20, 27, 34, 41, 45, 49, 50}; 
This visualizes the marks:
✕
Graphics[{ Thickness[.005], Line[{{#, 1}, {#, 1.5}}] & /@ Range@50, Line[{{#, 1}, {#, 5}}] & /@ ruler50 }, Axes > {True, False}, Ticks > {ruler50, None}, ImageSize > 520] 
Let the differences between the marks be the diff form. Here is the diff form for ruler50:
✕
Differences[ruler50] 
In 1963, B. Wichmann wrote “A Note on Restricted Difference Bases,” in which he constructed many sparse rulers. The following code has his original recipe and a function to read the recipe:
✕
originalwichmannrecipe = { {1, 1 + r, 1 + 2 r, 3 + 4 r, 2 + 2 r, 1}, {r, 1, r, s, 1 + r, r}}; 
✕
WichmannRuler[recipe_, {x_, y_}] := Transpose[ Select[Transpose[recipe /. Thread[{r, s} > {x, y}]], Min[#] > 0 &]] 
With that, we can set up function for Wichmann recipe #1:
✕
Subscript[W, 1][r_, s_] := WichmannRuler[originalwichmannrecipe, {r, s}]; 
There are thousands of Wichmann recipes. Here’s the second:
✕
WichmannRecipes[[2]] 
Here’s a function for Wichmann recipe #2:
✕
Subscript[W, 2][r_, s_] := WichmannRuler[WichmannRecipes[[2]], {r, s}]; 
Here, and in the recipes are replaced by 1 and 5, respectively. These representations are examples of the split form of a sparse ruler:
✕
Column[{Subscript[W, 1][1, 5], Subscript[W, 2][1, 5]}] 
We can use these functions to convert among the three forms of sparse ruler:
✕
DiffToRuler[diff_] := FoldList[Plus, 0, diff] 
✕
DiffToSplit[diff_] := {First /@ Split[diff], Length /@ Split[diff]} 
✕
SplitToDiff[split_] := Flatten[Table[#[[1]], {#[[2]]}] & /@ Transpose[split]] 
✕
SplitToRuler[split_] := DiffToRuler[SplitToDiff[split]] 
✕
RulerToSplit[ruler_] := DiffToSplit[Differences[ruler]] 
Here are the diff forms for both and ruler50 from above; we can see from their identical outputs that they are in fact the same ruler:
✕
SplitToDiff[Subscript[W, 1][1, 5]] 
✕
Differences[ruler50] 
The diff form can be used to remake the ruler:
✕
DiffToRuler[%] 
Here is the split form again:
✕
Subscript[W, 1][1, 5] 
The split form can be written compactly and compared to Wichmann’s recipe with :
✕
TraditionalForm@ Grid[{HoldForm[#1^#2] & @@@ First@*Tally /@ Split@Differences[ruler50], HoldForm[#1^#2] & @@@ Transpose[originalwichmannrecipe]}, Frame > All] 
This Wichmann ruler is one of an infinite list of Wichmann rulers. The length57 sparse rulers show two examples for :
✕
Text@Grid[{{"length", "marks", "recipe", Style["r", Italic], Style["s", Italic]}, {50, 12, "\!\(\*SuperscriptBox[\(1\), \(1\)]\) \!\(\*SuperscriptBox[\(2\), \ \(1\)]\) \!\(\*SuperscriptBox[\(3\), \(1\)]\) \ \!\(\*SuperscriptBox[\(7\), \(5\)]\) \!\(\*SuperscriptBox[\(4\), \ \(2\)]\) \!\(\*SuperscriptBox[\(1\), \(1\)]\)", 1, 5}, {57, 13, "\!\(\*SuperscriptBox[\(1\), \(1\)]\) \!\(\*SuperscriptBox[\(2\), \ \(1\)]\) \!\(\*SuperscriptBox[\(3\), \(1\)]\) \ \!\(\*SuperscriptBox[\(7\), \(6\)]\) \!\(\*SuperscriptBox[\(4\), \ \(2\)]\) \!\(\*SuperscriptBox[\(1\), \(1\)]\)", 1, 6}, {57, 13, "\!\(\*SuperscriptBox[\(1\), \(2\)]\) \!\(\*SuperscriptBox[\(3\), \ \(1\)]\) \!\(\*SuperscriptBox[\(5\), \(2\)]\) \ \!\(\*SuperscriptBox[\(11\), \(2\)]\) \!\(\*SuperscriptBox[\(6\), \(3\ \)]\) \!\(\*SuperscriptBox[\(1\), \(2\)]\)", 2, 2}, {90, 16, "\!\(\*SuperscriptBox[\(1\), \(2\)]\) \!\(\*SuperscriptBox[\(3\), \ \(1\)]\) \!\(\*SuperscriptBox[\(5\), \(2\)]\) \ \!\(\*SuperscriptBox[\(11\), \(5\)]\) \!\(\*SuperscriptBox[\(6\), \(3\ \)]\) \!\(\*SuperscriptBox[\(1\), \(2\)]\)", 2, 5}, {93, 17, "\!\(\*SuperscriptBox[\(1\), \(3\)]\) \!\(\*SuperscriptBox[\(4\), \ \(1\)]\) \!\(\*SuperscriptBox[\(7\), \(3\)]\) \ \!\(\*SuperscriptBox[\(15\), \(2\)]\) \!\(\*SuperscriptBox[\(8\), \(4\ \)]\) \!\(\*SuperscriptBox[\(1\), \(3\)]\)", 3, 2}, {101, 17, "\!\(\*SuperscriptBox[\(1\), \(2\)]\) \!\(\*SuperscriptBox[\(3\), \ \(1\)]\) \!\(\*SuperscriptBox[\(5\), \(2\)]\) \ \!\(\*SuperscriptBox[\(11\), \(6\)]\) \!\(\*SuperscriptBox[\(6\), \(3\ \)]\) \!\(\*SuperscriptBox[\(1\), \(2\)]\)", 2, 6}, {108, 18, "\!\(\*SuperscriptBox[\(1\), \(3\)]\) \!\(\*SuperscriptBox[\(4\), \ \(1\)]\) \!\(\*SuperscriptBox[\(7\), \(3\)]\) \ \!\(\*SuperscriptBox[\(15\), \(3\)]\) \!\(\*SuperscriptBox[\(8\), \(4\ \)]\) \!\(\*SuperscriptBox[\(1\), \(3\)]\)", 3, 3}, {112, 18, "\!\(\*SuperscriptBox[\(1\), \(2\)]\) \!\(\*SuperscriptBox[\(3\), \ \(1\)]\) \!\(\*SuperscriptBox[\(5\), \(2\)]\) \ \!\(\*SuperscriptBox[\(11\), \(7\)]\) \!\(\*SuperscriptBox[\(6\), \(3\ \)]\) \!\(\*SuperscriptBox[\(1\), \(2\)]\)", 2, 7}, {123, 19, "\!\(\*SuperscriptBox[\(1\), \(2\)]\) \!\(\*SuperscriptBox[\(3\), \ \(1\)]\) \!\(\*SuperscriptBox[\(5\), \(2\)]\) \ \!\(\*SuperscriptBox[\(11\), \(8\)]\) \!\(\*SuperscriptBox[\(6\), \(3\ \)]\) \!\(\*SuperscriptBox[\(1\), \(2\)]\)", 2, 8}, {123, 19, "\!\(\*SuperscriptBox[\(1\), \(3\)]\) \!\(\*SuperscriptBox[\(4\), \ \(1\)]\) \!\(\*SuperscriptBox[\(7\), \(3\)]\) \ \!\(\*SuperscriptBox[\(15\), \(4\)]\) \!\(\*SuperscriptBox[\(8\), \(4\ \)]\) \!\(\*SuperscriptBox[\(1\), \(3\)]\)", 3, 4}, {138, 20, "\!\(\*SuperscriptBox[\(1\), \(3\)]\) \!\(\*SuperscriptBox[\(4\), \ \(1\)]\) \!\(\*SuperscriptBox[\(7\), \(3\)]\) \ \!\(\*SuperscriptBox[\(15\), \(5\)]\) \!\(\*SuperscriptBox[\(8\), \(4\ \)]\) \!\(\*SuperscriptBox[\(1\), \(3\)]\)", 3, 5}, {153, 21, "\!\(\*SuperscriptBox[\(1\), \(3\)]\) \!\(\*SuperscriptBox[\(4\), \ \(1\)]\) \!\(\*SuperscriptBox[\(7\), \(3\)]\) \ \!\(\*SuperscriptBox[\(15\), \(6\)]\) \!\(\*SuperscriptBox[\(8\), \(4\ \)]\) \!\(\*SuperscriptBox[\(1\), \(3\)]\)", 3, 6}, {168, 22, "\!\(\*SuperscriptBox[\(1\), \(3\)]\) \!\(\*SuperscriptBox[\(4\), \ \(1\)]\) \!\(\*SuperscriptBox[\(7\), \(3\)]\) \ \!\(\*SuperscriptBox[\(15\), \(7\)]\) \!\(\*SuperscriptBox[\(8\), \(4\ \)]\) \!\(\*SuperscriptBox[\(1\), \(3\)]\)", 3, 7}, {183, 23, "\!\(\*SuperscriptBox[\(1\), \(3\)]\) \!\(\*SuperscriptBox[\(4\), \ \(1\)]\) \!\(\*SuperscriptBox[\(7\), \(3\)]\) \ \!\(\*SuperscriptBox[\(15\), \(8\)]\) \!\(\*SuperscriptBox[\(8\), \(4\ \)]\) \!\(\*SuperscriptBox[\(1\), \(3\)]\)", 3, 8}, {198, 24, "\!\(\*SuperscriptBox[\(1\), \(3\)]\) \!\(\*SuperscriptBox[\(4\), \ \(1\)]\) \!\(\*SuperscriptBox[\(7\), \(3\)]\) \ \!\(\*SuperscriptBox[\(15\), \(9\)]\) \!\(\*SuperscriptBox[\(8\), \(4\ \)]\) \!\(\*SuperscriptBox[\(1\), \(3\)]\)", 3, 9}, {213, 25, "\!\(\*SuperscriptBox[\(1\), \(4\)]\) \!\(\*SuperscriptBox[\(5\), \ \(1\)]\) \!\(\*SuperscriptBox[\(9\), \(4\)]\) \ \!\(\*SuperscriptBox[\(19\), \(6\)]\) \!\(\*SuperscriptBox[\(10\), \ \(5\)]\) \!\(\*SuperscriptBox[\(1\), \(4\)]\)", 4, 6}}] 
Next is the length58 optimal ruler showing that . Using brute force, is provable. In 2011, Peter Luschny conjectured that the optimal ruler is the largest optimal ruler that does not use Wichmann’s recipe.
✕
Text@Grid[Transpose[{{"split", "diff", "ruler", "\!\(\* StyleBox[SubscriptBox[\"M\", \"n\"],\nFontSlant>\"Italic\"]\)"}, {#, SplitToDiff[#], SplitToRuler[#], Length[SplitToRuler[#]]} &@sparsedata[[58]]}], Frame > All] 
In 2014, Arch D. Robison wrote “Parallel Computation of Sparse Rulers,” where months of computer time was spent on 256 Intel cores to calculate 106,535 sparse rulers up to length 213. Part of this run proved the existence of a length135 nonperfect ruler.
So while we have identified all the sparse rulers up to length 213, we only have candidates beyond length 213. For the rest of this blog post, “conjectured sparse ruler” means a complete ruler with length greater than 213 and the minimal known number of marks. Above length 213, no sparse rulers have been proven minimal. Length 214 has the first conjectured sparse ruler:
✕
Text@Grid[{{"minimal?", "length", "marks", "compact split form"}, {"proven", 213, 25, "\!\(\*SuperscriptBox[\(1\), \(4\)]\) \!\(\*SuperscriptBox[\(5\), \ \(1\)]\) \!\(\*SuperscriptBox[\(9\), \(4\)]\) \ \!\(\*SuperscriptBox[\(19\), \(6\)]\) \!\(\*SuperscriptBox[\(10\), \ \(5\)]\) \!\(\*SuperscriptBox[\(1\), \(4\)]\)"}, {"conjectured", 214, 26, "\!\(\*SuperscriptBox[\(1\), \(5\)]\) \ \!\(\*SuperscriptBox[\(5\), \(1\)]\) \!\(\*SuperscriptBox[\(9\), \ \(4\)]\) \!\(\*SuperscriptBox[\(19\), \(6\)]\) \ \!\(\*SuperscriptBox[\(10\), \(5\)]\) \!\(\*SuperscriptBox[\(1\), \(4\ \)]\)"}}, Frame > All] 
Robison’s run required 1.5 computer years to verify . Computationally verifying would require 3 computer years using current methods. Adding a single mark doubles the computational difficulty of verifying minimality with currently known methods.
You may have heard of sparse rulers, Golomb rulers and difference sets. How do these relate to each other?
In 2019, I devised a formula that expresses the excess of a complete ruler in terms of the length and the number of minimal marks ; here, is the rounding function:
.
For the first 50 lengths, . Then , so .
✕
{12  Round[Sqrt[3 50 + 9/4]], 13  Round[Sqrt[3 51 + 9/4]]} 
The excess formula produces the exact number of minimal marks for sparse rulers up to length 213, with two lines of code. In the OnLine Encyclopedia of Integer Sequences (OEIS), this list of the number of minimal marks for a sparse ruler is sequence A046693:
✕
A308766[n_] := If[MemberQ[{51, 59, 69, 113, 124, 125, 135, 136, 139, 149, 150, 151, 164, 165, 166, 179, 180, 181, 195, 196, 199, 209, 210, 211}, n], 1, 0]; A046693 = Table[Round[Sqrt[3 n + 9/4]] + A308766[n], {n, 213}] 
Based on the sparse rulers and conjectured sparse rulers to length 2020, the excess seems to be a chaotic sequence of 0s and 1s:
✕
ListPlot[Take[rulerexcess, 2020], Joined > True, AspectRatio > 1/30, Axes > False, ImageSize > 520] 
If Luschny’s conjecture is correct, then the lowest possible excess is 0 and all conjectured sparse rulers are minimal.
Without rounding, a plot of the bestknown number of minimal marks minus shows some distinct patterns up to length 2020. Some points, such as seem to float above and break the pattern, which makes their minimality questionable:
✕
unroundedexcess = Table[{n, Round[Sqrt[3 n + 9/4]] + rulerexcess[[n]]  Sqrt[3 n + 9/4]}, {n, 1, 2020}]; ListPlot[unroundedexcess, AspectRatio > 1/4, ImageSize > {520, 130}] 
Here are lengths of currently conjectured sparse rulers that break the pattern:
✕
First /@ Select[unroundedexcess, #[[2]] > 1 &] 
Here is a plot of the verified number of minimal marks to :
✕
ListPlot[A046693, AspectRatio > 1/4, ImageSize > 520] 
Robison discovered that the sequence is not strictly increasing, as seen by the dips. Where do these dips occur?
✕
Flatten[Position[Differences[A046693], 1]] 
How are they spaced?
✕
Differences[%] 
In the previous table, the last six listed Wichmann rulers had these lengths:
✕
{138, 153, 168, 183, 198, 213}; 
These coincide with the positions of the dips:
✕
{136, 151, 166, 181, 196, 211} + 2 
We can plot and compare Leech’s bounds for the number of minimal marks to the actual number of minimal marks:
✕
ListPlot[{Table[Sqrt[2.434 n], {n, 1, 213}], Table[A046693[[n]], {n, 1, 213}], Table[Sqrt[3.348 n], {n, 1, 213}]}, AspectRatio > 1/5] 
The furthest values in the lines of dots are almost always lengths of optimal Wichmann rulers, with the last known exception being . We saw that some of the lengths of optimal Wichmann rulers were . Let us call these Wichmann values. These lengths (A289761) are given by:
✕
WichmannValues = Table[(n^2  (Mod[n, 6]  3)^2)/3 + n, {n, 1, 24}] 
Here I arrange numbers to 213 so that the bottom of each column is a Wichmann value. Under the blue line is the number of marks associated with the column. This is a numeric representation of the excess pattern:
values are gray.
values are bold black.
✕
Grid[Append[ Transpose[Table[PadLeft[Take[Style[If[rulerexcess[[#]] == 1, Style[#, Black, Bold, 16], Style[#, Gray, 14]]] & /@ Range[213], {WichmannValues[[n]] + 1, WichmannValues[[n + 1]]}], 15, ""], {n, 24  1}]], Range[3, 25]], Spacings > {.2, .2}, Dividers > {False, 2 > Blue}] 
For convenience, I’ll use various terms relating to the excess pattern:
A few sample values for rulers in columns 19 and 25:
✕
Text@Grid[ Transpose[ Prepend[Flatten[{#, ExcessCoordinates[#]}] & /@ {114, 116, 120, 122, 200, 202, 204, 206, 208, 210, 212, 213}, {"length", "column", "height", "fraction", "rise"}]], Frame > All] 
Here is the excess pattern of the bestknown excess values for lengths up to 10501. is gray, is black. This is a pixel representation of the excess pattern:
✕
ArrayPlot[Transpose[Table[ PadLeft[ First /@ Take[Transpose[{Take[rulerexcess, 10501], Range[10501]}], {WichmannValues[[n]] + 1, WichmannValues[[n + 1]]}], 119, 2], {n, 1, 175}]], ColorRules > {0 > LightGray, 1 > Black, 2 > White}, PixelConstrained > 3, Frame > False] 
The creator of OEIS, N. J. A. Sloane, describes this pattern as “Dark Satanic Mills on a Cloudy Day.” This unique description refers to the solid black part of the pattern with many windows, dark mills and the irregular patches above, the clouds.
We calculate these coordinates for various lengths:
✕
coordinated = Table[ xy = ExcessCoordinates[n]; col = Switch[xy[[2]], 1/ 2, {RGBColor[0, 1, 1], RGBColor[0.5, 0, 0.5]}, 1/ 4, {RGBColor[1, 1, 0], RGBColor[0, 1, 0]}, 3/ 4, {RGBColor[1, 0, 0], RGBColor[0, 0, 1]}, _, {GrayLevel[0.9], GrayLevel[0]} ]; {col[[rulerexcess[[n]] + 1]], xy[[1]], {xy[[1, 1]]/120, 1  xy[[2]]}, xy[[3]]}, {n, 1, 10501}]; 
Here is the excess pattern of the bestknown excess values for lengths up to 10501.
.
Some colors have exact excess fractions: :
✕
Row[{Graphics[{{#[[1]], Rectangle[#[[2]]]} & /@ coordinated}, ImageSize > {480, 318}, PlotRange > {{3, 159}, {0, 106}}]}] 
This plots the excess fractions. The excess fractions , and occur in each column; they are the colored horizontal lines:
✕
Graphics[{{#[[1]], Point[#[[3]]]} & /@ coordinated}, ImageSize > {480, 318}] 
Here’s a version of the excess pattern where the excess fraction 1/2 makes a horizontal line. A crushed version of the normalized excess fraction pattern is shown on the right.
Some colors have exact excess fractions as before: :
✕
Row[{Graphics[{{#[[1]], Rectangle[#[[2]] + {0, 53  Round[#[[4]]/2]}]} & /@ coordinated}, ImageSize > {480, 318}, PlotRange > {{3, 159}, {0, 106}}], Graphics[{AbsolutePointSize[.1], {#[[1]], Point[#[[3]]/{10, 1}]} & /@ coordinated}, ImageSize > {Automatic, 320}]}] 
For the following diagram, on the left are columns C_{68} to C_{73} with cells representing lengths 1516 to 1797.
On the right is the normalized excess fraction:
✕
farey = Select[FareySequence[24], MemberQ[{1, 2, 3, 4, 6, 8, 12, 24}, Denominator[#]] &]; took = Take[coordinated, 8479]; Row[{Graphics[{EdgeForm[Black], Table[ Tooltip[{coordinated[[k, 1]], Rectangle[coordinated[[k, 2]]]}, {k, coordinated[[k, 2]], sparsedata[[k]]}], {k, 1516, 1797}], Arrowheads[Medium], Arrow[{{73, 46} + {5, 1/2}, {73, 46} + {1/2, 1/2}}], Text[Row[{"Top of column ", Subscript[Style["C", Italic], "73"], " with 73 marks, length 1751"}], {73, 46} + {5, 1/2}, {Left, Center}], Arrow[{{73, 0} + {5, 1/2}, {73, 0} + {1/2, 1/2}}], Text[Row[{"Bottom of column ", Subscript[Style["C", Italic], "73"], " with 73 marks, length 1797"}], {73, 0} + {5, 1/2}, {Left, Center}], Arrow[{{71, 17} + {5, 1/2}, {71, 17} + {1/2, 1/2}}], Text[Row[{"Window in column ", Subscript[Style["C", Italic], "71"], ", 1686 and 1687"}], {71, 17} + {5, 1/2}, {Left, Center}], Line[{{73, 24} + {3, 1/2}, {73, 24} + {5, 1/2}}], Arrow[{{73, 24} + {3, 1/2}, {73, 27} + {1/2, 1/2}}], Arrow[{{73, 24} + {3, 1/2}, {73, 21} + {1/2, 1/2}}], Text[Row[{"Window in column ", Subscript[Style["C", Italic], "73"], ", 1770 to 1776"}], {73, 24} + {5, 1/2}, {Left, Center}], Line[{{73, 12} + {3, 1/2}, {73, 12} + {5, 1/2}}], Arrow[{{73, 12} + {3, 1/2}, {73, 20} + {1/2, 1/2}}], Arrow[{{73, 12} + {3, 1/2}, {73, 2} + {1/2, 1/2}}], Text[Row[{"Mullion in column ", Subscript[Style["C", Italic], "73"], ", 1777 to 1795"}], {73, 12} + {5, 1/2}, {Left, Center}] }, ImageSize > {380, 420}], Graphics[{AbsolutePointSize[.01], {#[[1]], Point[#[[3]]/{10, 1}]} & /@ coordinated, Style[ Text[Row[{Numerator[#], "/", Denominator[#]}], {.03, 1  #}], 10] & /@ farey}, AspectRatio > 4, ImageSize > {115, 420}]}, Alignment > {Bottom, Bottom}] 
In the normalized excess pattern:
Various sequences from OEIS:
A004137: maximal number of edges in a graceful graph on nodes
A046693: minimal marks for a sparse ruler of length
A103300: number of perfect rulers with length
A289761: maximum length of an optimal Wichmann ruler with marks
A308766: lengths of sparse rulers with excess 1
A309407: round(sqrt(3* + 9/4))
A326499: excess of a length sparse ruler
You can also check out the “Sparse Rulers” Demonstration, which has thousands of these sparse rulers:
Producing two million sparse rulers required over two thousand Wichmannlike rulers, construction recipes that all work with arbitrarily large values. Substituting and values into a Wichmann recipe is computationally easy:
The excess of a length sparse ruler with minimal number of marks is .
Sparse ruler conjecture: E = 0 or 1 for all sparse rulers.
Finding sparse rulers satisfying for all lengths under 257992 is difficult and likely couldn’t have been done without currentera computers. Finding longerlength sparse rulers turns out to be easy and could have been done back in 1963 with the following simple proof.
is the split form of Wichmann recipe 1, or .
is , , : or in the diff form.
is an extension. A sparse ruler starting with 1s in the diff form can be extended by up to 1s with an extra mark at the end. This new ruler looks like . The new lengths above are handled by differences , and . Note that is not a sparse ruler since the length cannot be expressed as a difference.
The “Wichmann Columns” Demonstration generates a column in the excess pattern by using only sparse rulers made by the first two Wichmann recipes, W_{1} and W_{2}, and extensions of these rulers.
indicates that a sparse ruler cannot be generated by W_{1}, W_{2} or by extending them.
indicates a generated sparse ruler with excess 0.
indicates a generated sparse ruler with excess 1.
We can see in the following Manipulate that length cannot be covered by this method in the excess pattern column representing sparse rulers with 236 marks. Adjust the slider or hover over a value to get a Tooltip with the generated sparse ruler:
Red pixels show where extensions don’t solve in the excess pattern:
✕
pixels = Table[ Reverse[PadRight[Switch[#[[2]], RGBColor[0, 0, 1], 1, RGBColor[0, Rational[2, 3], 0], 2, RGBColor[1, 0, 0], 3] & /@ Reverse[First /@ WichmannColumn[k][[1, 1, 1]]], 600]], {k, 2, 895}]; ArrayPlot[Transpose[Drop[pixels, 363]], PixelConstrained > 1, Frame > False, ColorRules > {0 > White, 1 > LightGray, 2 > Gray, 3 > Red}] 
Lengths of sparse rulers generated by and are generated by order2 polynomials differing by 1. The behavior of values generated by these polynomials is completely predictable and ultimately generates two weird sequences: sixsev and sixfiv:
✕
Text@Grid[Prepend[{Subscript[Style["W", Italic], #], WichmannLength[WichmannRecipes[[#]]], WichmannMarks[WichmannRecipes[[#]]]} & /@ {1, 2}, {"recipe", "length", "marks"}], Frame > All] 
Sequence sixsev consists of infinite 6s and 7s. Similarly, the sequence sixfiv consists entirely of 6s and 5s:
✕
cutoff = 15; (*raise the cutoff to go farther*) sixsev = Drop[ Flatten[Table[Table[{Table[6, {n}], 7}, {6}], {n, 0, cutoff}]], 1]; sixfiv = Drop[ Flatten[Table[Table[{Table[6, {n}], 5}, {6}], {n, 0, cutoff}]], 2]; 
✕
Column[{Take[sixsev, 80], Take[sixfiv, 80]}] 
What are the values for the and recipe in column 236 with ? What are the Wichmann recipe column zeros (WRCZ)? Code for WRCZ, based on sixsev and sixfiv, is shown in the initialization section in the downloadable notebook. Column 236 in the excess pattern has seven sets of values. The height of a column is roughly (2/3)*column, 159 in this case. The average possible extension is roughly a quarter of the column height:
✕
WRCZ[236] 
In the excess pattern, each column divides into quarter sections with the same size as the extension lengths of and . If we can show that eventually there are at least four reasonably spaced and zeros in each column, we’re done:
✕
Row[{Graphics[{{#[[1]], Rectangle[#[[2]]]} & /@ coordinated}, ImageSize > {480, 318}, PlotRange > {{3, 159}, {0, 106}}]}] 
The last column in the excess pattern without four reasonably spaced and zeros is column 880:
✕
WRCZ[880] 
Here are the lengths generated by these pairs:
✕
zero880 = (3 + 8 r + 4 r^2 + 3 s + 4 r s) /. {r > #[[1]], s > #[[2]]} & /@ WRCZ[880] 
Notice how the generated lengths for this column are palindromic, a worstcase scenario. Length 257992 isn’t covered by the zeros here and is out of reach of the last zero in the previous column, .
The acceleration of change between values generated by is a constant –24. The spacing between zeros is predictable:
✕
Differences[Differences[zero880]] 
Only four reasonably spaced zeros are needed per column. The polynomial inexorably offers more and more zeros. Column 880 is the last column where extensions can fail:
✕
ListPlot[Table[Length[WRCZ[n]], {n, 50, 3000}]] 
Another plot showing that extensions overwhelm the differences:
✕
ListPlot[Table[(WRCZ[k][[1, 1]] + 2)  Max[ Differences[ Union[3 + 8 r + 4 r^2 + 3 s + 4 r s /. Thread[{r, s} > #] & /@ WRCZ[k]]]] , {k, 50, 2050}], Joined > True] 
All integer lengths greater than 257992 (corresponding to 880 marks) are excess01 rulers made by extensions to Wichmann recipe 1.
All integer lengths greater than 119206 (corresponding to 598 marks) are excess01 rulers made by extensions and double extensions to Wichmann recipe 1. Here’s an example double extension that covers length 257992:
✕
SplitExtensions[ Last[SplitExtensions[ WichmannRuler[WichmannRecipes[[1]], {146, 292}]]]][[6]] 
✕
Dot @@ % 
We can programmatically verify the conjecture with precalculated rulers to length 2020, or to length 257992 with more running time. This tallies the number of 0s and 1s for the excess, up to length 2020:
✕
Tally[Sparseness[SplitToRuler[#]] & /@ Take[sparsedata, 2020]] 
I knew Robison found rulers to length 213, so I wanted to show samples. But except for the counts, all the ruler data was lost. I rebuilt it, but without access to the Intel superclusters. This search started with trying to make an image showing a row of columnpresented sparse rulers from length 1 to length 213.
First, here are sparse rulers up to length 36 with the mark positions converted into pixel positions. The gray rows indicate that the sparse ruler for that length is unique:
✕
Row[{Style[ Column[Table[SplitToRuler[sparsedata[[n]]], {n, 1, 36}], Alignment > Right], 8], ArrayPlot[Table[PadRight[ReplacePart[Table[0, {n + 1}], ({# + 1} & /@ SplitToRuler[sparsedata[[n]]]) > 1], 37] + If[counts[[n]] == 1, 2, 0], {n, 1, 36}], PixelConstrained > 11, ColorRules > {0 > White, 1 > Black, 2 > GrayLevel[.9], 3 > Black }, Frame > False]}] 
The following plot is a transpose of the previous plot, extended to a length of 213. Each column represents a sparse ruler, with gray columns indicating uniqueness. These columns line up with the log plot after the next paragraph:
✕
Row[{Spacer[20], ArrayPlot[ Transpose[Reverse /@ Table[PadRight[ReplacePart[Table[0, {n + 1}], ({# + 1} & /@ SplitToRuler[sparsedata[[n]]]) > 1], 215] + If[counts[[n]] == 1, 2, 0], {n, 1, 213}]], PixelConstrained > 2, ColorRules > {0 > White, 1 > Black, 2 > GrayLevel[.9], 3 > Black }, Frame > False]}] 
And here is a log plot of the number of distinct sparse rulers of length to length 213, which shows that there are usually fewer (blue) rulers and more (brown) rulers. Points on the bottom correspond to unique rulers (and a gray column in the previous image):
✕
ListPlot[Take[#, 2] & /@ # & /@ GatherBy[Transpose[{Range[213], Log /@ Take[counts, 213], Take[rulerexcess, 213]}], Last], ImageSize > 450] 
Length has 15990 distinct sparse rulers. These counts are sequence A103300. Out of the first 213 lengths, 31 of them have a unique sparse ruler. I suspect many lengths above 213 have unique or hardtofind minimal representations.
The following log plot shows the number of distinct sparse rulers and conjectured sparse rulers of length to length 10501, found in the search that produced 2,016,735 sparse rulers and conjectured sparse rulers:
✕
ListPlot[Take[#, 2] & /@ # & /@ GatherBy[Transpose[{Range[10501], Log /@ Take[counts, 10501], Take[rulerexcess, 10501]}], Last]] 
In the downloadable notebook I show many ways to use a sparse ruler to generate new sparse rulers, which can in turn make more sparse rulers. I call this process recursion. Processing shorterlength rulers gave better results and needed less time, so rulers of a length above 4000 were initially not used to produce more rulers. After cracking the particularly hard length 1792, I extended the new ruler processing to length 7000 in hopes of finding an example of length 5657. After checking to 10501, I temporarily stopped the search.
Various regularities and patterns can be seen, but part of the change in pattern is due to arbitrary cutoffs in processing at 4000 and 7000. One curious case is , with 363 rulers. Nearby is , with 3619 rulers. If an sparse ruler exists, the first clue will likely be an length with an unusually high count of examples.
An infinite number of complete rulers with can be made using all 2069 Wichmannlike recipes. How well does the catalog of Wichmann recipes work? To find out, I tried the following overnight run:
✕
addedrulers=Table[With[{wich=FindWichmann[hh][[1,1]]}, WichmannRuler[WichmannRecipes[[wich[[1]]]], wich[[3]]]], {hh,10520,17553}] 
How do these 7033 new complete rulers match up with the pattern? About 6448 rulers match the previous pattern well. About 587 rulers appear to be violations:
✕
ArrayPlot[ Transpose[Drop[Table[PadLeft[Take[Take[oldrulerexcess, 17553], {WichmannValues[[n]] + 1, WichmannValues[[n + 1]]}], 151, 6], {n, 1, 227}], 92]], ColorRules > {0 > LightGray, 1 > Black, 6 > White, 2 > Green, 3 > Brown, 4 > Red, 5 > Yellow }, PixelConstrained > 4, Frame > False] 
Adding an extension is the simplest way to make new complete rulers. Let us try that. This code (which will also require a long running time) finds 586 lengths that can be improved this simple way:
✕
oldsparsedata=CloudGet["https://wolfr.am/KeKbjOBs"]; rulerexcess = oldrulerexcess; newrulers = First /@ SplitBy[ Sort[{Last[#], Length[#], RulerToSplit[#]} & /@ Complement[Union[SparseCheckImprove /@ Flatten[ Table[With[{ruler = SplitToRuler[#]}, Append[ruler, Last[ruler] + n]], {n, 1, 40}] & /@ Drop[oldsparsedata, 10501], 1]], {False}]], First]; Do[length = newrulers[[index, 1]]; rulerexcess[[length]] = newrulers[[index, 2]]  Round[Sqrt[3 length + 9/4]]; sparsedata[[length]] = newrulers[[index, 3]], {index, 1, Length[newrulers]}]; 
After that trial, a single exception to the sparse ruler conjecture remains in this range, at . The pattern cleaned up nicely:
✕
ArrayPlot[ Transpose[ Drop[Table[ PadLeft[Take[ReplacePart[Take[rulerexcess, 17553], 16617 > 2], {WichmannValues[[n]] + 1, WichmannValues[[n + 1]]}], 151, 6], {n, 1, 227}], 92]], ColorRules > {0 > LightGray, 1 > Black, 6 > White, 2 > Green, 3 > Brown, 4 > Red, 5 > Yellow }, PixelConstrained > 4, Frame > False] 
I did not expect this trial to work so well.
I had to find an example for . The tools in this notebook gave me an example in a few hours. The sparse ruler conjecture is true to at least 17553:
✕
sparse16617 = {{1, 75, 1, 75, 149, 74, 42, 1, 19, 1}, {32, 1, 4, 37, 73, 37, 1, 32, 2, 4}}; temp = SplitToRuler[sparse16617]; {Last[temp], Length[temp], Sparseness[temp]} 
Length 16617 is the final difficult value for . All lengths 16618 to 257992 can be solved with the 2069 known Wichmann recipes or extensions.
After the initialization section in the notebook is ReasonableRuler, which will find a ruler with excess 0 or 1 for any given positive integer length. Here’s a ruler for length 100000:
✕
ReasonableRuler[100000] 
The function generates example sparse rulers with E = 0 or 1 for all lengths up to 257992 within a few minutes.
QED.
The Leech bounds can be improved. The Leech upper and lower bounds drift far away from the bestknown values for minimal marks :
✕
ListPlot[{Table[Sqrt[2.434 n]  (Sqrt[3 n + 9/4]), {n, 1, 17553}], Table[rulerexcess[[n]] + Round[Sqrt[3 n + 9/4]]  Sqrt[3 n + 9/4], {n, 1, 17553}], Table[Sqrt[3.348 n]  (Sqrt[3 n + 9/4]), {n, 1, 17553}]}, AspectRatio > 1/5] 
I know of 11 rulers with the following properties:
✕
highzero = {{{1, 3, 2, 8, 17, 1, 9, 1}, {3, 1, 1, 3, 9, 1, 4, 3}}, {{1, 4, 8, 17, 9, 6, 3, 9, 1}, {4, 1, 2, 9, 1, 1, 1, 3, 3}}, {{1, 2, 7, 9, 1, 9, 17, 8, 5, 1}, {3, 1, 1, 2, 1, 1, 9, 3, 1, 3}}, {{1, 3, 5, 3, 8, 17, 9, 2, 7, 2, 9, 1}, {2, 2, 1, 1, 2, 9, 1, 1, 1, 1, 2, 2}}, {{1, 3, 10, 21, 11, 1, 11, 1}, {4, 2, 4, 10, 1, 1, 4, 4}}, {{1, 2, 9, 11, 1, 11, 21, 10, 6, 1}, {4, 1, 1, 2, 1, 2, 10, 4, 1, 4}}, {{1, 3, 10, 21, 11, 1, 11, 1}, {4, 2, 4, 11, 1, 1, 4, 4}}, {{1, 2, 9, 11, 1, 11, 21, 10, 6, 1}, {4, 1, 1, 2, 1, 2, 11, 4, 1, 4}}, {{1, 3, 4, 12, 25, 13, 1, 13, 1}, {5, 1, 1, 5, 12, 2, 1, 4, 5}}, {{1, 3, 4, 12, 25, 13, 1, 13, 1}, {5, 1, 1, 5, 13, 2, 1, 4, 5}}, {{1, 3, 5, 14, 29, 15, 1, 15, 1}, {6, 1, 1, 6, 14, 3, 1, 4, 6}}}; Text@Grid[Prepend[{Dot @@ #, Row[{ToString[Numerator[#]], "/", ToString[Denominator[#]]}] &@ ExcessCoordinates[Dot @@ #][[2]], #} & /@ highzero, {"length", "excess fraction", "ruler"}], Frame > All] 
I’ve shown how approaching the problem computationally with the Wolfram Language can help not only to solve but also construct a proof for the sparse rulers problem that has historically fascinated so many. Make your own mark—to continue exploring, be sure to download this post’s notebook, which features lots of additional code, the connection between sparse rulers and graceful graphs, and a longer discussion for finding sparse rulers. Can any of the current excess values be improved? Are there more excellent Wichmannlike recipes? I would love to know—submit your recipes in the comments or to Wolfram Community!
Many thanks to T. Sirgedas, A. Robison, G. Beck and N. J. A. Sloane for help with this search.
Leech, J. “On the Representation of 1, 2, …, n by Differences.” Journal of the London Mathematical
Society s1–31.2 (1956): 160–169.
Luschny, P. “The Optimal Ruler Conjecture.” The OnLine Encyclopedia of Integer Sequences.
Pegg, E. “Sparse Ruler Conjecture.” Wolfram Community.
Rédei, L. and A. Rényi. “On the Representation of the Numbers 1, 2, …, n by Means of Differences.”
Matematicheskii Sbornik 24(66), no. 3 (1949): 385–389.
Robison, A. D. “Parallel Computation of Sparse Rulers.” Intel Developer Zone.
Rokicki, T. and G. Dogon. “Golomb Rulers: Pushing the Limits.” cube20.org.
Wichmann, B. “A Note on Restricted Difference Bases.” Journal of the London Mathematical Society
s1–38.1 (1963): 465–466. doi:10.1112/jlms/s138.1.465.
Wikipedia Contributors. “Sparse Ruler.” Wikipedia, the Free Encyclopedia.
]]>