Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

first commit

  • Loading branch information...
commit aba4347092761dfdcaa5605b807c23fa458da41b 0 parents
@drcode authored
Showing with 21,835 additions and 0 deletions.
  1. +11 −0 README
  2. +66 −0 info.txt
  3. BIN  lib/clojure-1.3.0.jar
  4. +40 −0 pom.xml
  5. +3 −0  project.clj
  6. +63 −0 src/webfui/core.cljs
  7. +11 −0 src/webfui/dom.cljs
  8. +23 −0 src/webfui/dom_manipulation.cljs
  9. +51 −0 src/webfui/framework.cljs
  10. +11 −0 src/webfui/framework/macros.clj
  11. +145 −0 src/webfui/html.cljs
  12. +15 −0 src/webfui/macros.clj
  13. +10 −0 src/webfui/plugin/core.cljs
  14. +25 −0 src/webfui/plugin/form_values.cljs
  15. +121 −0 src/webfui/plugin/mouse.cljs
  16. +41 −0 src/webfui/plugin/scrolling.cljs
  17. +22 −0 src/webfui/state_patches.cljs
  18. +11 −0 src/webfui/utilities.cljs
  19. +6 −0 test/webfui/test/core.clj
  20. +5 −0 webfui-examples/.gitignore
  21. +1 −0  webfui-examples/.lein-plugins/checksum
  22. +17 −0 webfui-examples/README.md
  23. +42 −0 webfui-examples/project.clj
  24. BIN  webfui-examples/resources/public/css/POCKC___.eot
  25. +603 −0 webfui-examples/resources/public/css/POCKC___.svg
  26. BIN  webfui-examples/resources/public/css/POCKC___.ttf
  27. BIN  webfui-examples/resources/public/css/POCKC___.woff
  28. +9 −0 webfui-examples/resources/public/css/add_two_numbers.css
  29. +10 −0 webfui-examples/resources/public/css/add_two_numbers_low_level.css
  30. +43 −0 webfui-examples/resources/public/css/calculator.css
  31. +43 −0 webfui-examples/resources/public/css/calculator_ajax.css
  32. +43 −0 webfui-examples/resources/public/css/calculator_many.css
  33. +22 −0 webfui-examples/resources/public/css/inverse_kinematics.css
  34. +31 −0 webfui-examples/resources/public/css/mouse_tracking.css
  35. 0  webfui-examples/resources/public/css/scrolling.css
  36. +9 −0 webfui-examples/resources/public/css/webfui_examples.css
  37. +16 −0 webfui-examples/resources/public/index.html
  38. +19,235 −0 webfui-examples/resources/public/js/core.js
  39. +25 −0 webfui-examples/src-clj/webfui_examples/server.clj
  40. +8 −0 webfui-examples/src-clj/webfui_examples/views/add_two_numbers.clj
  41. +8 −0 webfui-examples/src-clj/webfui_examples/views/add_two_numbers_low_level.clj
  42. +8 −0 webfui-examples/src-clj/webfui_examples/views/calculator.clj
  43. +8 −0 webfui-examples/src-clj/webfui_examples/views/calculator_ajax.clj
  44. +8 −0 webfui-examples/src-clj/webfui_examples/views/calculator_many.clj
  45. +13 −0 webfui-examples/src-clj/webfui_examples/views/common.clj
  46. +8 −0 webfui-examples/src-clj/webfui_examples/views/inverse_kinematics.clj
  47. +8 −0 webfui-examples/src-clj/webfui_examples/views/mouse_tracking.clj
  48. +8 −0 webfui-examples/src-clj/webfui_examples/views/scrolling.clj
  49. +9 −0 webfui-examples/src-clj/webfui_examples/views/welcome.clj
  50. +23 −0 webfui-examples/src-cljs/add_two_numbers/core.cljs
  51. +40 −0 webfui-examples/src-cljs/add_two_numbers_low_level/core.cljs
  52. +92 −0 webfui-examples/src-cljs/calculator/core.cljs
  53. +124 −0 webfui-examples/src-cljs/calculator_ajax/core.cljs
  54. +108 −0 webfui-examples/src-cljs/calculator_many/core.cljs
  55. +449 −0 webfui-examples/src-cljs/inverse_kinematics/core.cljs
  56. +51 −0 webfui-examples/src-cljs/mouse_tracking/core.cljs
  57. +33 −0 webfui-examples/src-cljs/scrolling/core.cljs
11 README
@@ -0,0 +1,11 @@
+# webfui
+
+Client Side Web Development Framework For ClojureScript
+
+## Usage
+
+Documentation is still pending (expect it by November 2012). At this time, your best guide is to run the code in the "webfui-examples" directory- Just run "lein deps;lein run" and fire up your Safari, Chrome, or iOS browser to "localhost:8080"
+
+## License
+
+Distributed under the Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php), the same as Clojure.
66 info.txt
@@ -0,0 +1,66 @@
+*presentation notes
+
+What is the DOM?
+
+Problems with the DOM
+ - It changes
+ - Changing it is slow
+
+What is EDN?
+
+What is AJAX?
+
+How to build a web framework:
+ - Should do things the Clojure Way
+ - Code should be in the functional style
+ - The browser DOM should be EDN data stored in an atom
+
+DOM is not a complete representation of browser state
+ - Can't set button as pushed
+ - Can't set scrollbar position
+ - Can't set text selection
+
+Problem: AJAX requires side effects. Reframed problem: Our state atom no longer contains the whole world
+
+Original sin: Our state is _always_ corrupt in a program that uses AJAX.
+
+We have to contain the corruption (Can be done with FP)
+We have to repair the corruption (Requires imperative programming)
+
+"State Corruption" Design Pattern
+
+AJAX=Corruption of state
+
+Corruption is implicit- Make it explicit
+
+GET: State item has value of nil
+ or selection variable has id that points to nonexistent item
+
+POST: Create new item in state with id=nil
+
+PUT: Have "holding area" in state, set source of truth=nil. Move from holding area back to final area
+
+DELETE: Just delete item
+
+*todos
+item insert/deletion in delta system
+text selection
+full IK artwork
+"preview" in calculator
+
+*Hello World
+(ns my-app.core
+ (:use [webfui.framework :only [launch-app]]))
+
+(defn render-all []
+ "hello world!")
+
+(launch-app (atom nil) render-all)
+
+
+
+*timing
+~250 for mouseup
+~150 for webfui code
+~90 for parsing html
+~90 for delta detection
BIN  lib/clojure-1.3.0.jar
Binary file not shown
40 pom.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>webfui</groupId>
+ <artifactId>webfui</artifactId>
+ <version>0.2</version>
+ <name>webfui</name>
+ <description>Alpha release of Webfui- All Webfui source included in this repository release under Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)</description>
+ <url>http://lisperati.com</url>
+ <build>
+ <sourceDirectory>src</sourceDirectory>
+ <testSourceDirectory>test</testSourceDirectory>
+ <resources>
+ <resource>
+ <directory>resources</directory>
+ </resource>
+ </resources>
+ <testResources>
+ <testResource>
+ <directory>test-resources</directory>
+ </testResource>
+ </testResources>
+ </build>
+ <repositories>
+ <repository>
+ <id>central</id>
+ <url>http://repo1.maven.org/maven2</url>
+ </repository>
+ <repository>
+ <id>clojars</id>
+ <url>http://clojars.org/repo/</url>
+ </repository>
+ </repositories>
+</project>
+
+<!-- This file was autogenerated by Leiningen.
+ Please do not edit it directly; instead edit project.clj and regenerate it.
+ It should not be considered canonical data. For more information see
+ https://github.com/technomancy/leiningen -->
3  project.clj
@@ -0,0 +1,3 @@
+(defproject webfui "0.2"
+ :description "Alpha release of Webfui- All Webfui source included in this repository release under Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)"
+ :url "http://lisperati.com")
63 src/webfui/core.cljs
@@ -0,0 +1,63 @@
+(ns webfui.core
+ (:use [webfui.html :only [html parse-html parsed-html render-attribute-value html-delta]]
+ [webfui.plugin.core :only [active-plugins Plugin declare-events fix-dom]]
+ [cljs.reader :only [read-string]]))
+
+;; This file contains the core engine for webfui. You usually don't want to load this file directly, instead load webfui.dom or webfui.framework.
+
+(defn body []
+ (.-body js/document))
+
+(defn select-path-dom [node path]
+ (if-let [[cur & more] (seq path)]
+ (recur (.item (.-childNodes node) cur) more)
+ node))
+
+(defn dom-ready? []
+ (= (.-readyState js/document) "complete"))
+
+(defn dom-ready [fun]
+ (set! (.-onload js/window) fun))
+
+(defn parsed-html-watcher [key a old new]
+ (let [delta (html-delta (.-children old) (.-children new) [])]
+ (doseq [[typ path a b] delta]
+ (let [node (select-path-dom (body) path)]
+ (case typ
+ :att (if (= a :value)
+ (set! (.-value node) (str b))
+ (.setAttribute node (name a) (render-attribute-value a b)))
+ :rem-att (.removeAttribute node (name a))
+ :html (set! (.-innerHTML node) (apply str (map html a))))))
+ (doseq [plugin @active-plugins]
+ (fix-dom plugin))))
+
+(def parsed-html-atom (atom (parsed-html. :body {} nil)))
+
+(defn update-parsed-html-atom [new old]
+ (parsed-html. :body
+ {}
+ (if (or (seq? new) (list? new))
+ (parse-html new)
+ (parse-html (list new)))))
+
+(defn html-watcher [key a old new]
+ (swap! parsed-html-atom (partial update-parsed-html-atom new)))
+
+(def dom-watchers (atom {}))
+
+(defn core-add-dom-watch [id fun]
+ (swap! dom-watchers assoc id fun))
+
+(defn init-dom [html]
+ (let [b (body)]
+ (doseq [plugin @active-plugins]
+ (declare-events plugin (body) dom-watchers parsed-html-atom))
+ (add-watch html :dom-watcher html-watcher)
+ (add-watch parsed-html-atom :parsed-html-watcher parsed-html-watcher)
+ (swap! html identity)))
+
+(defn core-defdom [clj-dom]
+ (if (dom-ready?)
+ (init-dom clj-dom)
+ (dom-ready (partial init-dom clj-dom))))
11 src/webfui/dom.cljs
@@ -0,0 +1,11 @@
+(ns webfui.dom
+ (:use [webfui.core :only [core-add-dom-watch core-defdom]]
+ [webfui.plugin.core :only [register-plugin]]
+ [webfui.plugin.form-values :only [form-values]]))
+
+(def add-dom-watch core-add-dom-watch)
+
+(def defdom core-defdom)
+
+(register-plugin (form-values.))
+
23 src/webfui/dom_manipulation.cljs
@@ -0,0 +1,23 @@
+(ns webfui.dom-manipulation
+ (:use [webfui.html :only [unparse-html]]))
+
+;; This file is for DOM manipulation functions used by both the core of webfui as well as plugins.
+
+(defn path-dom [node]
+ (drop 3
+ (reverse ((fn f [node]
+ (lazy-seq (when node
+ (cons (dec (count (take-while identity (iterate #(.-previousSibling %) node)))) (f (.-parentNode node))))))
+ node))))
+
+(defn select-path-html [html path]
+ (if-let [[cur & more] (seq path)]
+ (recur (nth (.-children html) cur) more)
+ html))
+
+(defn resolve-target [parsed-html target]
+ (let [path (path-dom target)
+ parsed-element (select-path-html parsed-html path)]
+ (unparse-html parsed-element)))
+
+
51 src/webfui/framework.cljs
@@ -0,0 +1,51 @@
+(ns webfui.framework
+ (:use [webfui.dom :only [defdom add-dom-watch]]
+ [webfui.plugin.core :only [register-plugin]]
+ [webfui.plugin.mouse :only [mouse add-mouse-watch]]
+ [webfui.state-patches :only [patch]]
+ [webfui.utilities :only [get-attribute]]))
+
+(register-plugin (mouse.))
+
+(defn state-watcher [dom renderer key state old new]
+ (swap! dom (constantly (renderer new))))
+
+(declare cur-state)
+
+(defn launch-app [state renderer]
+ (let [dom (atom (renderer @state))]
+ (defdom dom)
+ (add-watch state :state-watcher (partial state-watcher dom renderer)))
+ (def cur-state state))
+
+(defn add-dom-watch-helper [id fun]
+ (add-dom-watch id
+ (fn [_ element-new]
+ (swap! cur-state
+ (fn [state]
+ (let [diff (fun state element-new)]
+ (patch state diff)))))))
+
+(def mouse-down-state (atom nil))
+
+(defn add-mouse-watch-helper [id fun optimization]
+ (add-mouse-watch id
+ (fn [element-old element-new points]
+ (swap! mouse-down-state
+ (fn [old]
+ (or old @cur-state)))
+ (reset! cur-state
+ (if (= optimization :incremental)
+ (let [mds @mouse-down-state
+ diff (fun mds element-old element-new (subvec points (max 0 (- (count points) 2))))
+ new-state (patch mds diff)]
+ (reset! mouse-down-state
+ (when (get-attribute element-old :active)
+ new-state))
+ new-state)
+ (let [mds @mouse-down-state
+ diff (fun mds element-old element-new points)]
+ (when-not (get-attribute element-old :active)
+ (reset! mouse-down-state nil))
+ (patch mds diff)))))))
+
11 src/webfui/framework/macros.clj
@@ -0,0 +1,11 @@
+;*CLJSBUILD-MACRO-FILE*;
+
+(ns webfui.framework.macros)
+
+(defmacro add-dom-watch [id vars & more]
+ `(webfui.framework/add-dom-watch-helper ~id (fn ~vars ~@more)))
+
+(defmacro add-mouse-watch [id vars & more]
+ (if (vector? id)
+ `(webfui.framework/add-mouse-watch-helper ~(first id) (fn ~vars ~@more) ~(second id))
+ `(webfui.framework/add-mouse-watch-helper ~id (fn ~vars ~@more) :full)))
145 src/webfui/html.cljs
@@ -0,0 +1,145 @@
+(ns webfui.html
+ (:use [clojure.set :only [union]]))
+
+(deftype parsed-tagname [tagname id classes])
+(deftype parsed-html [tagname attributes children])
+
+(defn parse-tagname [tagname]
+ (let [[_ name _ id classes] (re-matches #"^([^.^#]+)(#([^.]+))?(\..+)?" tagname)]
+ (parsed-tagname. (keyword name)
+ (when id
+ (keyword id))
+ (when classes
+ (map second (re-seq #"\.([^.]+)" classes))))))
+
+(let [cache (atom {})]
+ (defn parse-tagname-memoized [tagname]
+ (or (@cache tagname)
+ (let [val (parse-tagname tagname)]
+ (swap! cache assoc tagname val)
+ val))))
+
+(declare parse-html)
+
+(defn parse-element [element]
+ (let [[tagname & more] element
+ parsed (parse-tagname-memoized tagname)
+ classes (.-classes parsed)
+ id (.-id parsed)
+ tagname (.-tagname parsed)
+ attributes {}
+ attributes (if classes
+ (assoc attributes
+ :class
+ (apply str (interpose \ classes)))
+ attributes)
+ attributes (if id
+ (assoc attributes :id id)
+ attributes)
+ [a & b] more
+ [attributes children] (if (map? a)
+ [(merge attributes a) b]
+ [attributes more])]
+ (parsed-html. tagname attributes (parse-html children))))
+
+(defn merge-strings [lst]
+ (if-let [[x & more] lst]
+ (if-let [[y & more] more]
+ (if (and (string? x) (string? y))
+ (merge-strings (cons (str x y) more))
+ (cons x (merge-strings (cons y more))))
+ lst)
+ lst))
+
+(defn parse-html [html]
+ (mapcat (fn [x]
+ (cond (vector? x) [(parse-element x)]
+ (and (coll? x) (not (string? x))) (parse-html x)
+ :else [x]))
+ (merge-strings html)))
+
+(defn tag [tagname atts s]
+ (if (#{:br} tagname)
+ (str "<" (name tagname) atts ">")
+ (str "<" (name tagname) atts ">" (apply str s) "</" (name tagname) ">")))
+
+(defn pixels [k]
+ (str (.toFixed k 3) "px"))
+
+(defn render-css [css]
+ (apply str
+ (interpose \;
+ (for [[k v] css]
+ (str (name k)
+ ":"
+ (cond (keyword? v) (name v)
+ (and (number? v) (#{:line-height :top :bottom :left :right :width :height} k)) (pixels v)
+ :else v))))))
+
+(defn render-attribute-value [key value]
+ (cond (keyword? value) (name value)
+ (= key :data) (print-str value)
+ (= key :style) (render-css value)
+ :else value))
+
+(defn render-attributes [atts]
+ (apply str
+ (for [[key value] atts]
+ (str " "
+ (name key)
+ "=\""
+ (render-attribute-value key value)
+ \"))))
+
+(defn html [content]
+ (cond (instance? parsed-html content) (let [tagname (.-tagname content)
+ attributes (.-attributes content)
+ children (.-children content)]
+ (if tagname
+ (tag tagname (when attributes
+ (render-attributes attributes))
+ (map html children))
+ ""))
+ :else (str content)))
+
+(defn html-delta [old-html new-html path]
+ (if (= (count old-html) (count new-html))
+ (let [pairs (map vector old-html new-html)
+ fixable (every? (fn [[old-child new-child]]
+ (if (and (instance? parsed-html old-child) (instance? parsed-html new-child))
+ (= (.-tagname old-child) (.-tagname new-child))
+ (= old-child new-child)))
+ pairs)]
+ (if fixable
+ (apply concat
+ (map-indexed (fn [i [old-element new-element]]
+ (when (instance? parsed-html old-element)
+ (let [old-tagname (.-tagname old-element)
+ old-attributes (.-attributes old-element)
+ old-children (.-children old-element)
+ new-tagname (.-tagname new-element)
+ new-attributes (.-attributes new-element)
+ new-children (.-children new-element)
+ path (conj path i)
+ att-delta (when (not= old-attributes new-attributes)
+ (mapcat (fn [key]
+ (let [old-val (old-attributes key)
+ new-val (new-attributes key)]
+ (cond (not new-val) [[:rem-att path key]]
+ (not= old-val new-val) [[:att path key new-val]]
+ :else [])))
+ (union (set (keys old-attributes)) (set (keys new-attributes)))))
+ child-delta (html-delta old-children new-children path)]
+ (concat att-delta child-delta))))
+ pairs))
+ [[:html path new-html]]))
+ [[:html path new-html]]))
+
+(defn unparse-html [html]
+ (if (or (string? html) (number? html))
+ html
+ (let [tagname (.-tagname html)
+ attributes (.-attributes html)
+ children (.-children html)]
+ (vec (concat [tagname attributes] (map unparse-html children))))))
+
15 src/webfui/macros.clj
@@ -0,0 +1,15 @@
+;*CLJSBUILD-MACRO-FILE*;
+
+(ns webfui.macros)
+
+(defmacro dbg [cur & more]
+ `(do (.log js/console (print-str '~cur "-->"))
+ (let [x# (~cur ~@more)]
+ (.log js/console (print-str '~cur "-->" (pr-str x#)))
+ x#)))
+
+(defmacro dbgv [& vars]
+ `(do ~@(map (fn [var]
+ `(do (.log js/console (print-str '~var "==>" (pr-str ~var)))
+ ~var))
+ vars)))
10 src/webfui/plugin/core.cljs
@@ -0,0 +1,10 @@
+(ns webfui.plugin.core)
+
+(def active-plugins (atom []))
+
+(defprotocol Plugin
+ (declare-events [this body dom-watchers parsed-html])
+ (fix-dom [this]))
+
+(defn register-plugin [plugin]
+ (swap! active-plugins conj plugin))
25 src/webfui/plugin/form_values.cljs
@@ -0,0 +1,25 @@
+(ns webfui.plugin.form-values
+ (:use [webfui.plugin.core :only [Plugin]]
+ [webfui.dom-manipulation :only [select-path-html parsed-html unparse-html path-dom resolve-target]]))
+
+(defn input [dom-watchers parsed-html event]
+ (let [target (.-target event)
+ [tagname attributes :as element] (resolve-target @parsed-html target)
+ event (@dom-watchers (keyword (:watch attributes)))]
+ (when (and event (contains? #{:input :textarea} tagname))
+ (let [value (.-value target)
+ new-element (update-in element
+ [1 :value]
+ (fn [old]
+ (set! (.-value target) old)
+ value))]
+ (event element new-element)))))
+
+(deftype form-values []
+ Plugin
+ (declare-events [this body dom-watchers parsed-html]
+ (.addEventListener body "input" (partial input dom-watchers parsed-html)))
+ (fix-dom [this]
+ nil))
+
+
121 src/webfui/plugin/mouse.cljs
@@ -0,0 +1,121 @@
+(ns webfui.plugin.mouse
+ (:use [webfui.plugin.core :only [Plugin]]
+ [webfui.utilities :only [body]]
+ [webfui.dom-manipulation :only [resolve-target]]
+ [cljs.reader :only [read-string]]))
+
+(def mouse-watchers (atom {}))
+
+(declare mouse-down-element)
+
+(defn nodelist-to-seq [nl]
+ (let [result-seq (map #(.item nl %) (range (.-length nl)))]
+ result-seq))
+
+(defn offset [node]
+ (let [op (.-offsetParent node)]
+ (if op
+ (let [[x y] (offset op)]
+ [(+ x (.-offsetLeft node)) (+ y (.-offsetTop node))])
+ [0 0])))
+
+(defn all-elements-at-point [client-point]
+ ((fn f [element]
+ (let [[x y] client-point
+ chi (mapcat f (nodelist-to-seq (.-childNodes element)))]
+ (if (and (.-getBoundingClientRect element)
+ (let [rect (.getBoundingClientRect element)]
+ (and (<= (.-left rect) x) (<= (.-top rect) y) (> (.-right rect) x) (> (.-bottom rect) y))))
+ (cons element chi)
+ chi)))
+ (body)))
+
+(defn merge-data [acc lst]
+ (if-let [[k & more] lst]
+ (cond (not k) (recur acc more)
+ (not acc) (recur k more)
+ (and (map? k) (map? acc)) (recur (merge acc k) more)
+ :else (recur k more))
+ acc))
+
+(defn mouse-element [parsed-html ev]
+ (let [target (.-target ev)
+ typ (.-type ev)
+ point (cond (#{"touchstart"} typ) (let [touch (.item (.-touches ev) 0)]
+ [(.-clientX touch) (.-clientY touch)])
+ (#{"touchmove"} typ) (let [touch (.item (.-touches ev) 0)]
+ [(.-clientX touch) (.-clientY touch)])
+ (= "touchend" typ) (let [touch (.item (.-changedTouches ev) 0)]
+ [(.-clientX touch) (.-clientY touch)])
+ :else [(.-clientX ev) (.-clientY ev)])
+ elements (all-elements-at-point point)
+ data (merge-data nil
+ (for [element elements]
+ (when-let [s (.getAttribute element "data")]
+ (read-string s))))]
+ [(update-in (resolve-target @parsed-html target) [1] assoc :offset (offset target) :data data) [(.-pageX ev) (.-pageY ev)]]))
+
+(defn update-offset [element target]
+ (update-in element
+ [1]
+ (fn [attr]
+ (assoc attr :offset (offset target)
+ :data (if-let [data (.getAttribute target "data")]
+ (read-string data)
+ (:data attr))))))
+
+(defn mouse-event [element]
+ (@mouse-watchers (get-in element [1 :mouse])))
+
+(defn add-mouse-watch [id fun]
+ (swap! mouse-watchers assoc id fun))
+
+(defn mouse-down [parsed-html ev]
+ (.preventDefault ev)
+ (let [target (.-target ev)
+ [new-element point] (mouse-element parsed-html ev)
+ event (mouse-event new-element)]
+ (when event
+ (let [new-element (assoc-in new-element [1 :active] true)]
+ (def mouse-down-element new-element)
+ (def mouse-down-target target)
+ (def points [point])
+ (event new-element new-element points)))))
+
+(defn mouse-move [parsed-html ev]
+ (.preventDefault ev)
+ (when mouse-down-element
+ (let [target (.-target ev)
+ [new-element point] (mouse-element parsed-html ev)
+ event (mouse-event mouse-down-element)]
+ (def points (conj points point))
+ (event (update-offset mouse-down-element mouse-down-target) new-element points))))
+
+(defn mouse-up [parsed-html ev]
+ (let [target (.-target ev)
+ [new-element point] (mouse-element parsed-html ev)]
+ (when mouse-down-element
+ (let [event (mouse-event mouse-down-element)
+ first-element (update-in mouse-down-element [1] #(dissoc % :active))]
+ (event (update-offset first-element mouse-down-target) new-element points)
+ (def points nil)
+ (def mouse-down-element nil)
+ (def mouse-down-target nil)))))
+
+(deftype mouse []
+ Plugin
+ (declare-events [this body dom-watchers parsed-html]
+ (.setTimeout js/window
+ (fn []
+ (.scrollTo js/window 0 1))
+ 100)
+ (.addEventListener body "mousedown" (partial mouse-down parsed-html))
+ (.addEventListener body "mousemove" (partial mouse-move parsed-html))
+ (.addEventListener body "mouseup" (partial mouse-up parsed-html))
+ (.addEventListener js/window "touchstart" (partial mouse-down parsed-html))
+ (.addEventListener js/window "touchmove" (partial mouse-move parsed-html))
+ (.addEventListener js/window "touchend" (partial mouse-up parsed-html)))
+ (fix-dom [this]
+ nil))
+
+
41 src/webfui/plugin/scrolling.cljs
@@ -0,0 +1,41 @@
+(ns webfui.plugin.scrolling
+ (:use [webfui.plugin.core :only [Plugin]]
+ [webfui.dom-manipulation :only [select-path-html parsed-html unparse-html path-dom resolve-target]]))
+
+(def dom-watchers-atom (atom nil))
+(def parsed-html-atom (atom nil))
+
+(defn scroll [event]
+ (let [target (.-target event)
+ [tagname attributes :as element] (resolve-target @@parsed-html-atom target)
+ scroll-top (.-scrollTop target)
+ scroll-left (.-scrollLeft target)
+ event (@@dom-watchers-atom (keyword (:watch attributes)))
+ new-element (update-in element [1] assoc :scroll-top scroll-top :scroll-left scroll-left)]
+ (event element new-element)))
+
+(defn check-for-scroll [event]
+ (let [target (.-target event)]
+ (.addEventListener target "scroll" scroll)))
+
+(defn xpath [s]
+ (let [res (.evaluate js/document s js/document nil (.-ORDERED_NODE_ITERATOR_TYPE js/XPathResult) nil)]
+ (doall (take-while identity (repeatedly (fn [] (.iterateNext res)))))))
+
+(deftype scrolling []
+ Plugin
+ (declare-events [this body dom-watchers parsed-html]
+ (reset! dom-watchers-atom dom-watchers)
+ (reset! parsed-html-atom parsed-html)
+ (.addEventListener body "mousedown" check-for-scroll)
+ (.addEventListener body "keydown" check-for-scroll))
+
+ (fix-dom [this]
+ (doseq [element (xpath "//*[@scroll-top]")]
+ (let [scroll-top (js/parseInt (.getAttribute element "scroll-top"))]
+ (when (> (js/Math.abs (- (.-scrollTop element) scroll-top)) 1)
+ (set! (.-scrollTop element) scroll-top)
+ (.addEventListener element "scroll" scroll)
+ (.removeAttribute element "scroll-top"))))))
+
+
22 src/webfui/state_patches.cljs
@@ -0,0 +1,22 @@
+(ns webfui.state-patches
+ (:use [clojure.set :only [union]]))
+
+(defn patch [state diff]
+ (if diff
+ (cond (map? state) (into {}
+ (for [key (union (set (keys state)) (set (keys diff)))]
+ [key (let [val1 (state key)
+ val2 (diff key)]
+ (cond (and val1 val2) (patch val1 val2)
+ (contains? diff key) val2
+ :else val1))]))
+ (vector? state) (if (map? diff)
+ (vec (map-indexed (fn [index item]
+ (if-let [d (diff index)]
+ (patch item d)
+ item))
+ state))
+ diff)
+ :else diff)
+ state))
+
11 src/webfui/utilities.cljs
@@ -0,0 +1,11 @@
+(ns webfui.utilities)
+
+(defn body []
+ (.-body js/document))
+
+(defn get-attribute [element key]
+ (get-in element [1 key]))
+
+(defn clicked [first-element last-element]
+ (and (= first-element last-element) (not (get-attribute first-element :active))))
+
6 test/webfui/test/core.clj
@@ -0,0 +1,6 @@
+(ns webfui.test.core
+ (:use [webfui.core])
+ (:use [clojure.test]))
+
+(deftest replace-me ;; FIXME: write
+ (is false "No tests have been written."))
5 webfui-examples/.gitignore
@@ -0,0 +1,5 @@
+pom.xml
+*jar
+/lib/
+/classes/
+.lein-deps-sum
1  webfui-examples/.lein-plugins/checksum
@@ -0,0 +1 @@
+b0bea0f2cf6c59e422426393bfdfae292119cbec
17 webfui-examples/README.md
@@ -0,0 +1,17 @@
+# webfui-examples
+
+A website written in noir.
+
+## Usage
+
+```bash
+lein deps
+lein run
+```
+
+## License
+
+Copyright (C) 2011 FIXME
+
+Distributed under the Eclipse Public License, the same as Clojure.
+
42 webfui-examples/project.clj
@@ -0,0 +1,42 @@
+(defproject webfui-examples "0.2"
+ :description "Examples for Webfui"
+ :source-path "src-clj"
+ :dependencies [[org.clojure/clojure "1.4.0"]
+ [webfui "0.2"]
+ [noir "1.3.0-beta10"]
+ [hiccup "1.0.1"]]
+ :main webfui-examples.server
+ :plugins [[lein-cljsbuild "0.2.7"]]
+ :cljsbuild {:builds {:add_two_numbers {:source-path "src-cljs/add_two_numbers"
+ :compiler {:output-to "resources/public/js/add_two_numbers.js"
+ :optimizations :whitespace
+ :pretty-print true}}
+ :add_two_numbers_low_level {:source-path "src-cljs/add_two_numbers_low_level"
+ :compiler {:output-to "resources/public/js/add_two_numbers_low_level.js"
+ :optimizations :whitespace
+ :pretty-print true}}
+ :calculator {:source-path "src-cljs/calculator"
+ :compiler {:output-to "resources/public/js/calculator.js"
+ :optimizations :whitespace
+ :pretty-print true}}
+ :calculator_many {:source-path "src-cljs/calculator_many"
+ :compiler {:output-to "resources/public/js/calculator_many.js"
+ :optimizations :advanced
+ :pretty-print false}}
+ :calculator_ajax {:source-path "src-cljs/calculator_ajax"
+ :compiler {:output-to "resources/public/js/calculator_ajax.js"
+ :optimizations :whitespace
+ :pretty-print true}}
+ :scrolling {:source-path "src-cljs/scrolling"
+ :compiler {:output-to "resources/public/js/scrolling.js"
+ :optimizations :whitespace
+ :pretty-print true}}
+ :mouse_tracking {:source-path "src-cljs/mouse_tracking"
+ :compiler {:output-to "resources/public/js/mouse_tracking.js"
+ :optimizations :whitespace
+ :pretty-print true}}
+ :inverse_kinematics {:source-path "src-cljs/inverse_kinematics"
+ :compiler {:output-to "resources/public/js/inverse_kinematics.js"
+ :optimizations :advanced
+ :pretty-print false}}}})
+
BIN  webfui-examples/resources/public/css/POCKC___.eot
Binary file not shown
603 webfui-examples/resources/public/css/POCKC___.svg
@@ -0,0 +1,603 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg>
+<metadata>
+Created by FontForge 20110222 at Mon Mar 7 11:34:23 2011
+ By www-data
+Copyright 1999 Blue Vinyl Fonts email: bluevinyl@aol.com
+</metadata>
+<defs>
+<font id="PocketCalculator" horiz-adv-x="445" >
+ <font-face
+ font-family="Pocket Calculator"
+ font-weight="400"
+ font-stretch="normal"
+ units-per-em="1000"
+ panose-1="2 0 5 3 0 0 0 0 0 0"
+ ascent="800"
+ descent="-200"
+ x-height="439"
+ cap-height="632"
+ bbox="-6 -185 841 794"
+ underline-thickness="20"
+ underline-position="-143"
+ unicode-range="U+0020-2122"
+ />
+ <missing-glyph />
+ <glyph glyph-name="space" unicode=" " horiz-adv-x="218"
+ />
+ <glyph glyph-name="Thorn" unicode="&#xde;" horiz-adv-x="440"
+d="M126 379h162l47 47l-47 47h-162c0 -2 -16 -17 -46 -47zM346 415l-47 -47v-108l47 -47l46 46v110zM114 259v110c-5 2 -43 42 -46 46c-1 -1 -16 -17 -47 -47v-109c15 -15 30 -30 47 -46zM68 0c3 4 18 19 46 47v96l-46 47l-47 -46v-98c4 -3 19 -18 47 -46zM126 154h161
+l47 47l-46 46h-162l-47 -47zM68 437c1 0 16 16 47 47v96c-15 15 -30 30 -46 47l-47 -47v-97z" />
+ <glyph glyph-name="thorn" unicode="&#xfe;" horiz-adv-x="422"
+d="M134 348h135l48 48l-48 48h-135l-49 -48zM278 339v-63l48 -48l48 47v64l-48 48zM278 161v-55l48 -48l48 48v56l-48 47zM124 276v63l-48 48l-48 -49v-63l48 -48zM124 107v54l-48 48l-48 -48v-55l48 -47zM269 97h-137l-47 -47l49 -49h135l48 48zM124 451v125l-48 48
+l-49 -48v-125l48 -48zM120 -131v125l-47 48l-49 -48v-125l48 -48z" />
+ <glyph glyph-name="Scaron" unicode="&#x160;" horiz-adv-x="454"
+d="M143 528h201l47 47l-46 47h-202l-47 -47zM364 300l-47 -47v-150c9 -9 24 -25 47 -47l46 46l-1 153zM131 369v149c-5 2 -43 42 -46 46l-47 -47v-148l47 -47zM306 91h-205l-46 -46c11 -11 27 -26 47 -48h204l46 47c-22 23 -37 38 -46 47zM143 263h162l47 47l-46 46h-163
+c-4 -3 -19 -18 -47 -46zM169 777l23 -23v-32c-7 -8 -15 -16 -23 -24l-23 23v33c0 1 8 8 23 23zM265 698c0 1 -8 9 -23 24v32l23 23l23 -23v-32c0 -1 -8 -9 -23 -24zM198 716h38l23 -23c-1 -2 -9 -10 -23 -24h-38l-23 23c1 1 9 8 23 24z" />
+ <glyph glyph-name="scaron" unicode="&#x161;" horiz-adv-x="414"
+d="M296 349h-158l-49 48l48 48h158l48 -48zM128 340v-63l-48 -48l-48 48v63l48 48zM281 109v54l48 48l48 -48v-55l-47 -47zM104 99h169l48 -47l-49 -49h-168l-48 48zM273 172h-135l-48 48l47 48h136l48 -48zM150 610l24 -23v-32c-8 -7 -16 -15 -24 -24l-23 24v33
+c2 1 9 8 23 22zM246 532l-23 23v32l23 23c8 -7 16 -15 24 -23v-32c-1 0 -9 -8 -24 -23zM179 549h39l23 -23l-24 -24h-38l-23 24z" />
+ <glyph glyph-name="brokenbar" unicode="&#xa6;" horiz-adv-x="191"
+d="M137 346v229l-48 48l-48 -48v-229l48 -48zM138 -103h1l-1 285l-49 48l-48 -48l2 -286l47 -47z" />
+ <glyph glyph-name="Eth" unicode="&#xd0;" horiz-adv-x="542"
+d="M230 532h162c16 14 31 30 48 47l-47 46h-163c-2 -3 -17 -18 -46 -47zM125 625v-82l83 82h-83zM451 567l-47 -46v-148l47 -47l46 46v149zM451 303l-47 -47v-150l47 -47l46 47l-1 152zM219 373l-2 150c-1 0 -12 11 -45 44l-47 -47v-148c9 -9 24 -24 47 -46zM171 60
+c1 0 17 16 48 47v149c-16 15 -32 31 -47 47l-47 -47v-150zM393 94h-164l-46 -46l47 -47h163c15 15 30 30 46 47zM125 83v-82h83c-27 27 -55 55 -83 82zM112 363l-49 -1l-48 -48l49 -49l48 1l48 48zM284 360h-49l-48 -48l49 -49h48l48 49z" />
+ <glyph glyph-name="multiply" unicode="&#xd7;" horiz-adv-x="405"
+d="M190 347l-82 81h-68v-68l81 -82h69v69zM351 180l-81 82h-68v-69l81 -81h68v68zM289 431l-82 -82v-68h69l81 81v69h-68zM116 260l-82 -81v-68h69l81 81v68h-68z" />
+ <glyph glyph-name="onesuperior" unicode="&#xb9;" horiz-adv-x="183"
+d="M139 496v83l-24 24l-25 -24v-83l24 -25zM138 342h-1l1 96l-24 24l-24 -24l-1 -96l24 -24zM58 583h29l25 24l-24 24h-30l-24 -24z" />
+ <glyph glyph-name="twosuperior" unicode="&#xb2;" horiz-adv-x="257"
+d="M167 582h-100c-15 14 -23 22 -24 23l23 23h101l23 -23zM57 467l23 -23v-75c-13 -14 -21 -22 -23 -24l-24 24l1 75c0 1 8 8 23 23zM173 502l1 75l22 22c1 0 9 -8 24 -23v-74c-14 -14 -22 -22 -24 -23zM86 363h102l23 -23l-24 -24h-101l-24 24c8 7 16 15 24 23zM167 449
+h-81l-23 23l23 24h81l24 -24z" />
+ <glyph glyph-name="eth" unicode="&#xf0;" horiz-adv-x="455"
+d="M296 529h-161c-15 15 -31 30 -47 47l46 46h162l47 -47zM76 343l47 -47v-191l-47 -47l-46 46l1 194zM308 412v106c3 1 43 41 46 46l47 -47v-105c-8 -9 -24 -24 -47 -47c-14 16 -30 31 -46 47zM355 58l-47 47v191l46 46c9 -8 24 -23 47 -46v-191c-3 -4 -18 -19 -46 -47z
+M134 93h163l46 -46l-47 -47h-162l-46 46zM296 306h-161l-47 47l46 46h162l47 -47zM225 514l-39 -39v-65h66l39 38v66h-66z" />
+ <glyph glyph-name="Yacute" unicode="&#xdd;" horiz-adv-x="444"
+d="M362 625l-47 -47v-148l48 -46l46 46v148zM221 358c-1 -1 -43 -41 -47 -47v-264l46 -46l47 46l-1 266c0 1 -15 16 -45 45zM130 430l-1 149l-45 45l-48 -47v-147l47 -47zM276 325h25l47 47l-46 47h-26c-9 -10 -25 -26 -46 -47zM141 325h25c2 3 18 18 47 47l-46 47h-26
+c-10 -11 -26 -26 -47 -47zM273 778v-33l-39 -39h-33v33c13 13 26 26 40 39h32z" />
+ <glyph glyph-name="macron" unicode="&#xaf;" horiz-adv-x="399"
+d="M323 357h-240l-48 -48l49 -49h239l48 48z" />
+ <glyph glyph-name="periodcentered" unicode="&#xb7;" horiz-adv-x="223"
+d="M193 290l-47 -47h-64c-1 0 -16 16 -47 47l46 46l67 -1z" />
+ <glyph glyph-name="onehalf" unicode="&#xbd;" horiz-adv-x="611"
+d="M120 516v83l-24 24l-25 -24v-83l25 -24zM119 362h-1l1 96l-23 25l-25 -25l-1 -96l24 -24zM39 603h29l25 24l-24 24h-30l-24 -24zM283 465v142l46 46c1 -1 17 -16 47 -47v-141c-3 -4 -19 -20 -46 -47zM233 255l2 147l45 45c1 -1 16 -17 47 -47v-145c-4 -3 -19 -18 -47 -46
+zM178 52l1 142l46 45l47 -47v-141c-6 -5 -22 -21 -47 -46zM527 267h-101c-14 15 -22 23 -23 24l23 23h101c14 -14 22 -22 23 -24zM416 153l24 -24v-75l-23 -23l-24 23v76c1 0 8 8 23 23zM533 187l1 75c18 18 21 21 22 23c1 -1 9 -8 23 -24v-74l-23 -23zM446 48h102l23 -23
+l-24 -23h-101c-14 13 -22 21 -24 23c8 7 16 15 24 23zM527 134h-81c-7 8 -15 16 -24 24l24 23h81l23 -23z" />
+ <glyph glyph-name="threequarters" unicode="&#xbe;" horiz-adv-x="627"
+d="M290 465v142l46 46c1 -1 17 -16 47 -47v-141c-3 -4 -19 -20 -46 -47zM240 255l2 147l45 45c1 -1 16 -17 47 -47v-145c-4 -3 -19 -18 -47 -46zM185 52l1 142l46 45l47 -47v-141c-6 -5 -22 -21 -47 -46zM553 311l-23 -24v-105l24 -23l23 23v105zM553 147l-23 -23v-106
+l23 -23l24 23l-1 107zM437 182l-1 106l-22 22c-1 0 -8 -8 -23 -23v-105c12 -14 20 -21 23 -24c1 2 9 10 23 24zM443 129h81c7 7 15 15 24 23l-24 23h-81l-23 -23zM144 598h-104l-23 23l23 24h104c14 -15 22 -23 23 -24zM150 518l1 75l22 22l23 -23v-74
+c-13 -14 -21 -22 -23 -23zM173 362l-23 23v75l23 23c3 -2 10 -10 23 -23v-75zM40 379h104l23 -23l-23 -24h-104c-14 14 -22 22 -23 24zM144 465h-65l-24 24l24 23h65l23 -24z" />
+ <glyph glyph-name="onequarter" unicode="&#xbc;" horiz-adv-x="620"
+d="M120 516v83l-24 24l-24 -24v-83l24 -24zM119 362l1 96l-24 25l-24 -25l-2 -96l24 -24zM40 603h29l25 24l-24 24h-30l-24 -24zM283 465l1 142l46 46l47 -47v-141l-47 -47zM234 255l2 147c15 15 30 29 44 45c1 -1 17 -17 48 -47v-145c-1 0 -16 -15 -47 -46zM179 52v142
+l46 45l47 -47v-141l-46 -46c-7 7 -23 22 -47 47zM547 311l-23 -24v-105l23 -23l23 23v105zM547 147l-23 -23v-106l23 -23l23 23v107zM431 182l-1 106l-22 22c-1 0 -9 -8 -24 -23v-105c13 -13 21 -21 23 -24zM437 129h81l23 23l-23 23h-81c-8 -7 -16 -15 -24 -23z" />
+ <glyph glyph-name="yacute" unicode="&#xfd;" horiz-adv-x="434"
+d="M282 98h-135l-49 -49l48 -48h136l48 49zM137 107v80l-48 49l-48 -48v-82l48 -48zM137 303v95l-48 49l-48 -49v-96l48 -48zM292 187v-80l48 -48l48 48v81l-48 48zM292 398v-95l48 -49l48 48v96l-48 48zM293 -6v-62l49 -49l48 48v64l-48 48zM287 -79h-137l-48 -48l49 -49
+h136l49 49zM260 591v-33l-39 -39h-33v33l40 39h32z" />
+ <glyph glyph-name="threesuperior" unicode="&#xb3;" horiz-adv-x="254"
+d="M162 588h-104c-14 14 -22 22 -23 24l23 23h104c14 -14 22 -22 23 -24zM168 508l1 75c18 18 21 21 22 23c1 -1 9 -8 23 -24v-74l-23 -23zM191 352l-23 23v75c9 10 17 18 23 24c3 -3 11 -10 23 -24v-75zM58 369h104l23 -23l-23 -23h-104c-14 13 -22 21 -23 23zM162 455h-65
+c-7 8 -15 16 -24 24l24 23h65l23 -23z" />
+ <glyph glyph-name="exclam" unicode="!" horiz-adv-x="213"
+d="M62 450v130l48 48l48 -48v-130l-48 -48zM158 345v-112l-48 -48l-48 48v113l48 48zM189 49l-47 -47h-64c-1 0 -16 16 -47 47l46 46l67 -1z" />
+ <glyph glyph-name="quotedbl" unicode="&#x22;" horiz-adv-x="414"
+d="M66 470v130l48 49l49 -49v-130l-49 -48zM271 470v130l49 49l48 -49v-130l-48 -48z" />
+ <glyph glyph-name="numbersign" unicode="#" horiz-adv-x="648"
+d="M382 584v-100l49 -48l48 48v100l-48 48zM382 369v-89l49 -49l48 48v91l-48 48zM251 484v100l-48 48l-48 -49v-99l48 -48zM251 280v89l-48 48l-48 -48v-89l48 -48zM373 270h-113l-48 -47l49 -49h112l48 48zM260 378h112l49 49l-48 48h-113l-48 -48zM382 165v-113l48 -48
+l48 48v113l-48 48zM251 52v113l-48 48l-49 -49v-112l49 -49zM74 377h74l48 48l-48 49h-75l-48 -49zM490 377h74l48 48l-48 49h-74l-48 -49zM71 173h74l48 48l-48 48h-74l-48 -48zM488 173h74l48 48l-48 48h-74l-49 -48z" />
+ <glyph glyph-name="dollar" unicode="$" horiz-adv-x="434"
+d="M121 438h101l47 47l-46 46h-102c-15 -15 -30 -30 -47 -46zM342 256l-47 -46v-103c15 -15 30 -31 47 -47l46 46l-1 106zM109 326l-1 102l-45 45c-1 -1 -17 -16 -47 -47v-100l47 -47zM284 95h-108l-46 -46c10 -11 26 -27 47 -48h106l47 47zM121 220h162l47 47l-46 46h-163
+l-47 -47zM327 541v58l-49 49l-48 -48v-59l49 -49zM168 -68v59l-48 48l-48 -47v-59l48 -49z" />
+ <glyph glyph-name="percent" unicode="%" horiz-adv-x="682"
+d="M324 445v142l46 46l47 -47v-141c-3 -4 -19 -20 -47 -47c-15 15 -31 31 -46 47zM274 235l2 147l45 45c0 -2 16 -17 47 -48v-144l-47 -47zM219 31l1 142l46 46l47 -47v-141c-6 -5 -22 -21 -47 -46c-7 7 -22 22 -47 46zM67 580h81l24 24l-23 23h-82c-14 -15 -22 -22 -23 -23
+zM177 598l-23 -23v-74l24 -24l23 24v74zM177 466c-16 -18 -22 -23 -23 -24v-75l23 -23l24 23l-1 76zM61 501l-1 75l-22 22l-24 -24v-73l24 -24zM38 344c1 2 9 10 23 24v74c-6 8 -14 15 -23 24c-3 -2 -11 -10 -24 -24v-75c1 0 9 -8 24 -23zM148 361h-82l-23 -23
+c2 -1 10 -9 24 -23h81c13 13 21 21 24 23c-4 3 -12 11 -24 23zM501 267h81c12 12 20 20 23 24l-23 23h-81c-15 -14 -23 -22 -24 -23zM611 285l-23 -23v-74l23 -23l23 23v74zM611 153l-23 -23v-75c13 -14 21 -22 23 -24l23 23v76c-7 8 -15 16 -23 23zM495 188l-1 75l-22 22
+l-24 -23v-74l24 -24zM471 31l24 24v75l-23 23c-3 -2 -11 -10 -24 -23v-75c1 -2 9 -10 23 -24zM582 49h-82l-23 -23l24 -24h81l23 23c-3 4 -11 12 -23 24z" />
+ <glyph glyph-name="ampersand" unicode="&#x26;" horiz-adv-x="502"
+d="M289 329v116l-48 48l-49 -49v-115l49 -48zM286 97v115l-48 48l-49 -48v-115l49 -49zM419 318h-116l-48 -48l49 -49h115l48 49zM176 320h-116l-48 -48l49 -49h115l48 49z" />
+ <glyph glyph-name="quotesingle" unicode="'" horiz-adv-x="208"
+d="M66 470v130l48 49l49 -49v-130l-49 -48z" />
+ <glyph glyph-name="parenleft" unicode="(" horiz-adv-x="220"
+d="M84 439l2 143c1 0 42 41 45 45c1 -1 16 -17 47 -47v-141l-47 -47zM35 72l-1 302c27 27 43 42 48 46l47 -47v-301l-47 -47zM88 -131v142l46 46l47 -47v-141c0 -1 -15 -16 -46 -47z" />
+ <glyph glyph-name="parenright" unicode=")" horiz-adv-x="232"
+d="M131 439l-2 143l-45 45c-1 -1 -16 -17 -47 -47v-141l47 -47zM180 72l1 302c-27 26 -42 41 -47 46c-1 -1 -17 -16 -47 -47v-301l46 -47zM127 -131v142l-46 46l-47 -47v-141l47 -47z" />
+ <glyph glyph-name="asterisk" unicode="*" horiz-adv-x="300"
+d="M195 637l-23 -23v-36l23 -24l23 23v37zM195 488l-23 -23v-32l23 -23l23 23v33c-2 1 -9 8 -23 22zM126 578l-1 37c-18 18 -21 21 -23 22c0 -1 -8 -9 -23 -24v-36l23 -23zM102 410c2 1 10 9 24 23v32c-9 9 -16 17 -24 23l-23 -23v-32zM131 525h35l23 23l-23 23h-35l-23 -23
+zM131 470h35l23 23l-23 24h-35c-7 -8 -15 -16 -23 -24zM172 521l24 -23h45l24 23l-23 23h-46zM33 521l23 -23h46l23 23l-23 23h-46z" />
+ <glyph glyph-name="plus" unicode="+" horiz-adv-x="502"
+d="M289 329v116l-48 48l-49 -49v-115l49 -48zM286 97v115l-48 48l-49 -48v-115l49 -49zM419 318h-116l-48 -48l49 -49h115l48 49zM176 320h-116l-48 -48l49 -49h115l48 49z" />
+ <glyph glyph-name="comma" unicode="," horiz-adv-x="224"
+d="M186 50l-47 -47h-64c-1 0 -16 16 -47 47l46 46h65c2 -1 11 -10 47 -46zM240 -6v-77l-46 -46c-3 4 -19 20 -47 48v75c15 15 30 30 47 46z" />
+ <glyph glyph-name="hyphen" unicode="-" horiz-adv-x="399"
+d="M323 357h-240l-48 -48l49 -49h239l48 48z" />
+ <glyph glyph-name="period" unicode="." horiz-adv-x="211"
+d="M193 50l-47 -47h-64c-1 0 -16 16 -47 47l46 46l67 -1z" />
+ <glyph glyph-name="slash" unicode="/" horiz-adv-x="260"
+d="M131 445v142l46 46l47 -47v-141c-3 -4 -19 -20 -46 -47zM81 235l2 147l45 45c0 -2 16 -17 47 -48v-144l-47 -47zM26 31l1 142l46 46l47 -47v-141c-6 -5 -22 -21 -47 -46c-7 7 -22 22 -47 46z" />
+ <glyph glyph-name="zero" unicode="0" horiz-adv-x="458"
+d="M149 528h162l47 47l-46 47h-163l-47 -47zM370 564l-47 -47v-147l47 -47l46 46v149zM370 300l-47 -47v-150c9 -9 24 -25 47 -47l46 46v151c-1 2 -10 11 -46 47zM137 369l-1 149c-32 32 -44 43 -45 46l-47 -47v-148c11 -12 27 -28 46 -47zM90 56c0 1 16 16 47 47v150
+l-47 47c-19 -20 -35 -36 -46 -47v-150c3 -4 18 -19 46 -47zM311 91h-163l-47 -46l48 -48h162l47 47z" />
+ <glyph glyph-name="one" unicode="1" horiz-adv-x="290"
+d="M236 354v167l-48 48l-49 -49v-166l49 -48zM233 47c0 21 2 172 3 192l-48 48l-49 -48l-3 -192l48 -48zM75 528h58l49 49l-48 48h-59l-48 -48z" />
+ <glyph glyph-name="two" unicode="2" horiz-adv-x="442"
+d="M295 532h-201c-17 17 -32 33 -47 47l46 47h202l47 -47zM74 304l47 -47v-150c-9 -10 -25 -26 -47 -47l-46 46l1 153zM307 373l1 149c32 32 44 44 45 46c1 -1 17 -17 47 -48v-147c-11 -11 -26 -26 -46 -47zM132 95h205l46 -46l-47 -48h-203l-47 47c15 15 31 31 46 47z
+M295 267h-162l-47 47l46 46h163l47 -46z" />
+ <glyph glyph-name="three" unicode="3" horiz-adv-x="434"
+d="M284 532h-207c-14 13 -30 29 -48 47l47 47h208l47 -47zM296 373v149c5 2 43 42 46 46c0 -2 16 -17 47 -48v-147l-47 -47c-17 17 -32 32 -46 47zM343 60c-1 0 -16 16 -47 47v150c1 1 16 16 46 47l47 -47v-150c-3 -4 -18 -19 -46 -47zM76 95h209l46 -46l-47 -48h-208
+c-11 11 -27 27 -46 47c14 16 30 31 46 47zM284 267h-130l-47 47l46 46h131l47 -46z" />
+ <glyph glyph-name="four" unicode="4" horiz-adv-x="451"
+d="M351 629l-47 -47v-211l47 -46l46 46v211zM351 301l-47 -47v-210l47 -47l46 47l-1 212zM118 371l-1 212l-45 45c-1 -1 -17 -16 -47 -47v-210c9 -9 24 -25 47 -47c16 18 32 33 46 47zM130 265h162l47 47l-46 46h-163c-15 -15 -31 -30 -47 -47z" />
+ <glyph glyph-name="five" unicode="5"
+d="M134 528h201l47 47l-46 47h-202c-1 -1 -16 -17 -47 -47zM355 300l-47 -47v-151c15 -15 30 -30 47 -46l46 46l-1 152c0 1 -14 16 -45 46zM122 369v149c-2 0 -13 12 -46 45l-47 -47v-147l47 -47zM297 91h-205l-46 -46l47 -48h204c14 16 30 31 46 47c-20 22 -36 37 -46 47z
+M134 263h162c13 13 29 28 47 47l-46 46h-163l-47 -47zM31 621v-82l82 82h-82z" />
+ <glyph glyph-name="six" unicode="6" horiz-adv-x="447"
+d="M135 530h162c15 15 30 31 47 47l-46 47h-163c-8 -9 -24 -24 -47 -47zM355 302l-47 -47v-151l47 -46l47 46l-2 152c-3 3 -18 18 -45 46zM123 371l-1 149c-32 32 -43 44 -46 45l-47 -47v-147l47 -47zM76 58l47 47v150c-1 0 -16 15 -47 46c-1 -1 -17 -17 -47 -46v-150z
+M297 93h-164l-46 -46l48 -48h162l47 47zM134 265h162c8 7 24 23 48 47l-47 46h-163c-1 -1 -17 -17 -46 -47z" />
+ <glyph glyph-name="seven" unicode="7" horiz-adv-x="409"
+d="M213 278l1 -235l46 -46c1 1 16 17 47 47v234c-9 9 -25 25 -47 46c-21 -21 -37 -37 -47 -46zM316 569l-47 -47v-188l47 -47l47 47v189c-1 0 -16 15 -47 46zM63 534h196l46 46l-48 48h-194l-47 -47z" />
+ <glyph glyph-name="eight" unicode="8" horiz-adv-x="461"
+d="M140 526h162c3 3 19 19 47 48l-46 46h-163l-47 -47zM361 562l-47 -47v-147l47 -47l46 46v149zM361 298l-47 -47v-150c14 -16 30 -31 46 -47l47 46l-1 153zM128 367l-1 149c-32 32 -44 43 -45 46l-47 -47v-148l46 -46c22 21 38 37 47 46zM81 54c0 1 16 16 47 47v150
+l-47 47c-21 -21 -37 -37 -46 -47v-150c3 -4 18 -19 46 -47zM302 89h-163l-47 -46l48 -47h162c1 1 16 16 47 46zM139 261h163c8 9 24 24 47 47l-46 47h-163l-47 -47z" />
+ <glyph glyph-name="nine" unicode="9"
+d="M298 93h-162c-15 -15 -31 -31 -48 -47l47 -47h163c3 4 18 19 46 47zM77 321l47 47v151c-1 1 -17 17 -47 46l-47 -46v-151zM309 252l1 -149c32 -32 43 -44 46 -45l47 47v147l-47 47zM356 565l-47 -47v-150c9 -8 24 -23 47 -46l47 46v150c0 1 -16 16 -47 47zM135 530h164
+l46 46l-47 48h-163l-47 -47zM298 358h-162c-15 -15 -31 -30 -47 -47l46 -46h163l47 47z" />
+ <glyph glyph-name="colon" unicode=":" horiz-adv-x="234"
+d="M193 50l-47 -47h-64c-1 0 -16 16 -47 47l46 46l67 -1zM193 395l-47 -47h-64l-47 46l46 47h66z" />
+ <glyph glyph-name="semicolon" unicode=";" horiz-adv-x="240"
+d="M186 50l-47 -47h-64c-1 0 -16 16 -47 47l46 46l67 -1zM240 -6v-77l-46 -46c-3 4 -19 20 -47 48v75c15 15 30 30 47 46zM186 395l-47 -47h-64l-47 46l46 47h66z" />
+ <glyph glyph-name="less" unicode="&#x3c;" horiz-adv-x="533"
+d="M489 466l-46 -47h-158l-47 47l46 46h159zM273 410c-1 -1 -41 -43 -47 -47h-103c-3 4 -18 19 -46 47l46 46l105 -1zM280 207h159c1 -3 41 -43 46 -46l-47 -47h-158c-8 8 -24 23 -46 47c15 15 31 30 46 46zM77 218c1 0 16 16 47 47h102l47 -47l-46 -46h-103
+c-1 0 -16 15 -47 46zM112 352v-76l-46 -46l-47 47v75c15 15 30 30 46 47z" />
+ <glyph glyph-name="equal" unicode="=" horiz-adv-x="417"
+d="M323 357h-239l-48 -48l48 -49h239l49 48zM323 207h-240l-48 -48l49 -49h239l48 48z" />
+ <glyph glyph-name="greater" unicode="&#x3e;" horiz-adv-x="536"
+d="M19 466l46 -47h158l47 47l-46 46h-159zM235 410l47 -47h103c3 4 18 19 46 47l-46 46l-105 -1zM228 207h-159c-2 -5 -42 -43 -46 -46l47 -47h158c8 8 24 23 46 47zM431 218l-47 47h-102l-47 -47l47 -46h103zM396 352v-76l46 -46l47 47v75c-15 15 -30 30 -46 47z" />
+ <glyph glyph-name="question" unicode="?" horiz-adv-x="386"
+d="M243 535h-157l-47 47l46 46h158c16 -16 32 -31 46 -47zM100 307c39 -38 45 -44 47 -47v-82l-47 -47l-46 47l1 84zM255 376v149c2 1 13 12 46 45l47 -47v-147c-9 -9 -25 -25 -47 -46zM243 270h-84l-47 47l46 47h85l47 -47zM178 52c-38 -38 -44 -44 -47 -46h-64
+c-5 5 -20 20 -47 46l47 47h65c1 -2 10 -11 46 -47z" />
+ <glyph glyph-name="at" unicode="@" horiz-adv-x="738"
+d="M253 447h135l49 48l-48 48h-136l-49 -48zM398 438v-63l48 -49l48 48v64l-48 48zM398 259v-54l48 -49l48 48v56l-48 48zM243 205v54l-48 49l-48 -49v-54l48 -48zM389 195h-137l-48 -47l49 -50h135l49 49zM252 269h136l49 49l-48 47h-137l-48 -48zM638 672l-47 -47v-160
+l47 -47l46 46v162zM638 395l-47 -47v-150c14 -16 30 -31 46 -47l47 46l-1 153zM579 192h-80l-46 -46c11 -11 26 -27 48 -47h78c15 15 31 30 47 47c-15 15 -31 31 -47 46zM366 676l47 -47h166c15 15 31 30 47 47l-46 46l-169 -1zM83 677l47 -47h166l47 47l-47 47h-167
+c-1 -2 -27 -28 -46 -47zM74 390l47 -47v-311c-15 -15 -30 -31 -47 -47l-46 46l1 314zM132 20h303l46 -46c-11 -11 -27 -26 -47 -48h-301l-47 47c15 15 31 31 46 47zM75 669l47 -47v-160l-47 -47l-46 46v161z" />
+ <glyph glyph-name="A" unicode="A" horiz-adv-x="456"
+d="M135 530h163c20 21 36 36 47 47l-46 46h-163l-47 -46zM356 566l-47 -47v-148l48 -46l46 46v148zM356 301l-47 -47v-212l47 -47l47 47v213c-2 1 -11 10 -47 46zM124 371l-1 148c-2 5 -42 43 -46 46l-47 -47v-147l47 -47zM77 -4l47 47v211l-47 47l-47 -46v-213
+c4 -3 19 -18 47 -46zM135 265h162c16 14 31 30 48 47l-47 46h-163l-47 -47z" />
+ <glyph glyph-name="B" unicode="B" horiz-adv-x="458"
+d="M147 530h163c14 16 30 31 47 48l-46 46h-163c-15 -15 -31 -30 -47 -47zM42 624v-83l83 83h-83zM368 566l-47 -47v-147l48 -47l46 46v149zM368 302l-47 -47v-150l47 -47l47 46v151zM136 371l-2 150l-45 45l-47 -47v-148c9 -9 25 -24 47 -47zM89 58c0 1 16 16 47 47v150
+c-13 13 -29 28 -47 47l-47 -47v-150zM310 93h-164l-46 -46l48 -47h162l47 46zM42 82v-82h83c-27 27 -55 55 -83 82zM147 265h162c16 14 31 30 48 47l-47 46h-163l-46 -46z" />
+ <glyph glyph-name="C" unicode="C" horiz-adv-x="438"
+d="M142 529h207l47 47l-46 46h-208c-15 -15 -31 -30 -47 -47zM130 370v148l-46 46l-47 -47v-148l46 -46zM83 57l47 47v149c-15 16 -31 32 -47 47c-21 -21 -37 -37 -46 -47v-150zM349 91h-208l-47 -46l48 -47h207c15 15 31 30 47 47c-19 19 -34 34 -47 46z" />
+ <glyph glyph-name="D" unicode="D" horiz-adv-x="458"
+d="M147 530h163l47 47l-47 46h-163c-2 -3 -17 -18 -46 -47zM42 623v-82l83 82h-83zM368 566l-47 -47v-148l47 -47l47 46v149zM368 301l-47 -47v-150l47 -47l47 47v151c-2 1 -28 27 -47 46zM136 371l-1 148c-2 5 -42 43 -46 46l-47 -47v-148c9 -9 24 -24 47 -46zM89 58l47 47
+v149l-47 47l-47 -47v-150c4 -3 19 -18 47 -46zM310 92h-164l-46 -46l47 -47h163l47 47c-22 21 -38 37 -47 46zM42 81v-82h83c-27 27 -55 55 -83 82z" />
+ <glyph glyph-name="E" unicode="E"
+d="M147 530h207c16 14 31 30 48 47l-47 46h-208l-47 -47zM42 623v-82l82 82h-82zM135 371v148l-46 46l-47 -47v-148l47 -46zM88 58c1 0 16 16 47 47v149c-9 9 -25 25 -46 47c-23 -22 -38 -38 -47 -47v-150zM355 92h-209l-46 -46l47 -47h208c15 15 30 30 46 47
+c-21 22 -37 37 -46 46zM42 81v-82h82c-11 12 -39 39 -82 82zM147 264h130c10 11 26 26 47 47l-46 47h-131c0 -1 -16 -16 -47 -47z" />
+ <glyph glyph-name="F" unicode="F" horiz-adv-x="423"
+d="M139 527h207c15 15 31 31 48 47l-47 47h-208l-47 -47zM34 621v-83l82 83h-82zM127 368v149c-5 2 -43 42 -46 46l-47 -48v-147l47 -47c21 22 37 38 46 47zM80 -7c1 0 16 16 47 47v212l-46 46l-47 -46v-213zM139 262h130l47 47l-46 46h-131l-47 -47z" />
+ <glyph glyph-name="G" unicode="G" horiz-adv-x="458"
+d="M146 530h207c16 14 31 30 48 47l-47 46h-208l-47 -47zM367 301l-47 -47v-150l47 -47l46 47l-1 152zM134 371v149c-2 0 -13 12 -46 45c-1 -1 -17 -16 -47 -47v-148c10 -8 25 -24 47 -46zM87 58c1 0 16 16 47 47v149c-14 16 -30 31 -46 47l-47 -47v-150zM309 92h-164
+l-46 -46l47 -47h163c15 15 30 30 46 47zM258 264h50l47 47l-46 47h-51l-47 -47z" />
+ <glyph glyph-name="H" unicode="H" horiz-adv-x="464"
+d="M372 631l-47 -47v-207l47 -47l46 46v209zM372 307l-47 -47v-211l47 -47l46 47l-1 213zM140 376l-1 209l-46 46l-47 -47v-208l47 -47zM92 3c1 0 17 16 48 47v210c-15 15 -31 30 -47 47l-47 -47v-211zM151 270h162c15 15 31 30 47 47l-46 46h-163l-47 -46z" />
+ <glyph glyph-name="I" unicode="I" horiz-adv-x="193"
+d="M93 632l-47 -47v-207l48 -47l46 46v209zM93 308l-47 -47v-211c16 -14 31 -30 47 -46l47 46l-2 213c-3 3 -17 18 -45 45z" />
+ <glyph glyph-name="J" unicode="J" horiz-adv-x="463"
+d="M363 632l-47 -47v-209l47 -47l46 46v211zM363 306l-47 -47v-150c8 -9 23 -24 46 -47l47 46v151c-1 2 -10 11 -46 47zM83 62c0 1 16 16 47 47v150l-47 47c-20 -21 -35 -36 -46 -47v-150c3 -4 18 -19 46 -47zM304 97h-163l-47 -46l48 -48h162l47 47c-23 24 -39 40 -47 47z
+" />
+ <glyph glyph-name="K" unicode="K" horiz-adv-x="451"
+d="M363 598l-67 -1l-145 -148l1 -67l65 1c31 32 80 82 146 149v66zM367 312l-47 -47v-212c15 -15 30 -31 47 -47l46 47l-1 214zM134 382v211c-2 0 -13 12 -46 45l-47 -47v-209c11 -11 26 -27 47 -47zM87 7c1 0 16 15 47 46v212c0 1 -15 16 -46 47l-47 -47v-212zM146 275h162
+c14 16 30 31 47 48l-46 46h-163c-1 0 -16 -16 -47 -47z" />
+ <glyph glyph-name="L" unicode="L" horiz-adv-x="356"
+d="M117 374l-1 211l-46 46l-47 -47v-210c1 -1 16 -16 47 -46zM70 61c0 1 16 16 47 47v150l-47 47l-47 -47v-150zM291 96h-164l-46 -46l47 -47h163c15 15 30 30 47 46zM23 85v-82h83z" />
+ <glyph glyph-name="M" unicode="M" horiz-adv-x="740"
+d="M147 539h163l47 47l-47 46h-163c-9 -9 -24 -24 -46 -47zM368 574l-47 -46v-148l47 -47l47 46v149zM368 310l-47 -47v-212l47 -47l47 46v214c-2 1 -11 10 -47 46zM136 380l-1 148c-2 5 -42 43 -46 46c-1 -1 -16 -17 -47 -47v-148l47 -46zM89 4c0 1 16 16 47 47v212l-47 47
+l-47 -47v-212zM428 539h162l47 47l-46 46h-163c-2 -1 -18 -17 -47 -47zM648 574l-47 -47v-147l48 -47l46 46v149zM648 310l-47 -47v-212l47 -47l47 46l-1 215c-3 3 -18 18 -46 45z" />
+ <glyph glyph-name="N" unicode="N" horiz-adv-x="464"
+d="M148 543h163c8 9 24 24 47 47l-46 46h-163c-2 0 -17 -16 -47 -46zM369 579l-47 -47v-148l48 -46l46 46v148zM369 314l-47 -47v-212c15 -15 31 -30 47 -47l47 47v213c-2 1 -11 10 -47 46zM137 384l-1 148c-2 5 -42 43 -46 46l-47 -47v-147l47 -47zM90 9l47 47v211l-47 47
+c-15 -15 -31 -31 -47 -46v-213c4 -3 19 -18 47 -46z" />
+ <glyph glyph-name="O" unicode="O" horiz-adv-x="458"
+d="M149 528h162l47 47l-46 47h-163l-47 -47zM370 564l-47 -47v-147l47 -47l46 46v149zM370 300l-47 -47v-150c9 -9 24 -25 47 -47l46 46v151c-1 2 -10 11 -46 47zM137 369l-1 149c-32 32 -44 43 -45 46l-47 -47v-148c11 -12 27 -28 46 -47zM90 56c0 1 16 16 47 47v150
+l-47 47c-19 -20 -35 -36 -46 -47v-150c3 -4 18 -19 46 -47zM311 91h-163l-47 -46l48 -48h162l47 47z" />
+ <glyph glyph-name="P" unicode="P" horiz-adv-x="446"
+d="M139 533h162c15 15 31 31 48 47l-47 47h-163c-15 -15 -30 -31 -47 -47zM34 627v-83l82 83h-82zM360 569l-47 -47v-147l47 -47l46 46v149zM127 374v149c-5 2 -43 42 -46 46l-47 -47v-148l47 -47zM80 1c1 0 16 16 47 47v210c-15 15 -30 30 -46 47l-47 -47v-211zM139 268
+h162l47 47l-46 46h-163c-4 -3 -19 -18 -47 -46z" />
+ <glyph glyph-name="Q" unicode="Q" horiz-adv-x="467"
+d="M146 528h162l47 47l-46 47h-163c-13 -13 -28 -29 -47 -47zM331 -3h82v83zM367 564l-47 -47v-147l47 -47l46 46v149zM367 300l-47 -47v-150l47 -47l46 46l-1 153zM134 369v149c-5 2 -43 42 -46 46l-47 -47v-148l47 -47zM87 56l47 47v150c-3 4 -18 19 -46 47l-47 -47v-150
+c3 -4 18 -19 46 -47zM309 91h-164l-46 -46c10 -11 26 -27 47 -48h162l47 47c-15 15 -31 31 -46 47zM333 -99v82h83c-48 -47 -76 -75 -83 -82z" />
+ <glyph glyph-name="R" unicode="R" horiz-adv-x="471"
+d="M150 528h162c5 4 21 20 48 47l-47 47h-163c-15 -15 -30 -30 -46 -47zM45 622v-83l83 83h-83zM371 564l-47 -47v-148l47 -46l47 46v149zM371 300l-47 -47v-211l47 -47l47 47v211zM139 369l-1 149l-46 45l-47 -47v-147l47 -47zM92 -4l47 47v210c-16 14 -31 30 -47 46
+c-22 -21 -38 -37 -47 -46v-211c4 -3 19 -18 47 -46zM150 263h162c15 15 31 30 47 47l-46 46h-163l-47 -47z" />
+ <glyph glyph-name="S" unicode="S" horiz-adv-x="454"
+d="M143 528h201l47 47l-46 47h-202l-47 -47zM364 300l-47 -47v-150c9 -9 24 -25 47 -47l46 46l-1 153zM131 369v149c-5 2 -43 42 -46 46l-47 -47v-148l47 -47zM306 91h-205l-46 -46c11 -11 27 -26 47 -48h204l46 47c-22 23 -37 38 -46 47zM143 263h162l47 47l-46 46h-163
+c-4 -3 -19 -18 -47 -46z" />
+ <glyph glyph-name="T" unicode="T" horiz-adv-x="457"
+d="M279 528h89c4 4 20 20 47 48l-46 46h-90l-47 -47zM267 369l-1 149l-46 46l-47 -47v-148c1 -1 16 -16 47 -46zM220 -6l47 47v212c-7 7 -23 22 -47 47l-47 -47v-212zM74 529h89c3 3 19 19 47 48l-46 46h-90l-47 -47z" />
+ <glyph glyph-name="U" unicode="U" horiz-adv-x="465"
+d="M371 622l-47 -47v-208l47 -46l47 46v208zM371 297l-47 -47v-150l47 -47l47 47l-2 152zM139 367l-2 210c-1 0 -12 11 -45 44l-47 -47v-207l47 -47zM92 54l47 47v149l-47 47l-47 -46v-151c4 -3 19 -18 47 -46zM313 89h-164l-46 -46l47 -48h163c15 15 30 31 47 47
+c-5 5 -21 20 -47 47z" />
+ <glyph glyph-name="V" unicode="V" horiz-adv-x="483"
+d="M391 624l-47 -47v-208l47 -47l47 47v209zM335 358l-47 -47v-211c15 -15 31 -30 47 -47l47 47v211zM132 365l-1 209c-32 32 -44 44 -46 45l-47 -47v-207l47 -47zM143 54l47 47v210c-1 1 -16 16 -47 46l-47 -46v-211c1 0 16 -15 47 -46zM277 89h-77l-46 -46l48 -48h75
+c15 15 30 31 47 47z" />
+ <glyph glyph-name="W" unicode="W" horiz-adv-x="746"
+d="M359 631l-47 -47v-208l47 -46l47 46v208zM303 364c-1 -1 -43 -41 -47 -47v-210c15 -15 31 -30 47 -47l47 47l-2 212zM100 372l-1 208c-2 5 -42 43 -46 46l-47 -47v-208l47 -46zM111 61l47 47v209l-47 47l-47 -46v-211c4 -3 19 -18 47 -46zM244 98h-77l-46 -46l47 -48h75
+l47 47zM658 628l-47 -47v-208l47 -47l46 47v208zM602 361c-1 -1 -43 -41 -47 -47v-210l47 -47l46 47l-1 212zM409 58c1 0 16 16 47 47v209c-6 8 -22 23 -46 47l-47 -46v-211zM544 92h-77l-46 -46l47 -47h75c15 15 31 30 47 47z" />
+ <glyph glyph-name="X" unicode="X" horiz-adv-x="462"
+d="M368 626l-47 -47v-159l48 -46l46 46v159zM368 241l-47 -47v-150l47 -47l47 47l-2 152zM136 420l-1 159c-2 5 -42 43 -46 46l-47 -47v-158l47 -47c16 17 32 32 47 47zM89 -2c4 3 19 18 47 46v150l-47 47l-47 -47v-150c4 -3 19 -18 47 -46zM147 314h162c15 15 30 31 48 47
+l-47 46h-163c-15 -15 -30 -30 -46 -47zM147 204h162c15 15 31 31 48 47l-47 47h-163c-14 -16 -30 -31 -46 -47z" />
+ <glyph glyph-name="Y" unicode="Y" horiz-adv-x="444"
+d="M362 625l-47 -47v-148l48 -46l46 46v148zM221 358c-1 -1 -43 -41 -47 -47v-264l46 -46l47 46l-1 266c0 1 -15 16 -45 45zM130 430l-1 149l-45 45l-48 -47v-147l47 -47zM276 325h25l47 47l-46 47h-26c-9 -10 -25 -26 -46 -47zM141 325h25c2 3 18 18 47 47l-46 47h-26
+c-10 -11 -26 -26 -47 -47z" />
+ <glyph glyph-name="Z" unicode="Z"
+d="M228 534h-162l-47 47l46 46h163c10 -11 25 -26 46 -47zM176 232l47 -47v-80l-47 -47l-46 46v83c9 9 24 24 46 45zM239 452l2 72l45 45l47 -47v-71c-10 -10 -25 -26 -47 -46zM234 93h149l47 -46l-48 -48h-148l-47 47zM190 242l2 147l44 44c2 0 17 -16 48 -47v-144l-47 -47
+z" />
+ <glyph glyph-name="bracketleft" unicode="[" horiz-adv-x="292"
+d="M75 323l47 -47v-82l-47 -47l-46 47l1 84zM122 388l-3 144l-45 45c-2 0 -17 -16 -47 -46l2 -144l46 -46zM82 584c1 0 16 16 47 47h70l47 -47l-47 -46h-70c-1 0 -16 15 -47 46zM121 82l-2 -153c-32 -32 -43 -44 -46 -45c-1 1 -16 16 -46 47v151l47 46zM82 -123l47 -47h70
+c4 5 20 20 47 47l-47 46h-71zM27 -88v-83h82c-36 37 -63 64 -82 83zM27 548v82h82z" />
+ <glyph glyph-name="backslash" unicode="\" horiz-adv-x="268"
+d="M120 445l-1 142c-1 2 -12 13 -45 46c-1 -1 -17 -17 -48 -47v-141l47 -47zM169 235l-2 147c-15 15 -30 29 -44 45c-1 -1 -17 -17 -47 -48v-144c3 -4 18 -19 46 -47zM224 31v142l-46 46l-47 -47v-141l46 -46c8 6 23 22 47 46z" />
+ <glyph glyph-name="bracketright" unicode="]" horiz-adv-x="292"
+d="M198 323l-47 -47v-82c10 -10 26 -25 46 -47l47 47v83zM151 388l2 144l45 45c2 0 17 -16 47 -46l-1 -144c-1 -1 -17 -17 -47 -46zM190 584l-47 47h-70l-47 -47l47 -46h71zM151 82l3 -153l45 -45c1 1 17 16 46 47v151l-47 46zM190 -123c-3 -4 -18 -19 -46 -47h-71
+c-4 5 -19 20 -46 47l46 46h71zM245 -88v-83h-82c37 37 64 64 82 83zM245 548v82h-82z" />
+ <glyph glyph-name="asciicircum" unicode="^" horiz-adv-x="213"
+d="M156 531l-23 24v32l23 23l24 -23l-1 -33c0 -1 -8 -8 -23 -23zM60 610l24 -24v-31l-24 -24c-7 8 -15 16 -23 24v32zM127 592h-38l-23 23l24 24h37l24 -23z" />
+ <glyph glyph-name="underscore" unicode="_" horiz-adv-x="484"
+d="M40 1h476v-35h-476v35z" />
+ <glyph glyph-name="grave" unicode="`" horiz-adv-x="103"
+d="M38 641v-34l40 -38h33v32l-41 40h-32z" />
+ <glyph glyph-name="a" unicode="a" horiz-adv-x="431"
+d="M141 344h135l49 49l-48 48h-136l-48 -48zM382 84l-87 -87h87v87zM286 336v-63l48 -49l48 48v64l-48 48zM286 158v-55l48 -48l48 48v55l-48 48zM132 104v54l-49 48l-48 -48v-55l48 -48zM277 94h-137l-48 -48l49 -49h136l48 48zM141 167h135l49 49l-48 47h-136l-49 -48z
+" />
+ <glyph glyph-name="b" unicode="b" horiz-adv-x="431"
+d="M142 348h135l49 49l-48 48h-136l-48 -48zM286 340v-63l49 -49l48 48v64l-48 48zM286 161v-54l49 -49l48 49v55l-48 48zM133 276v64l-48 47l-49 -48v-63l48 -48zM133 107v54l-49 49l-48 -48v-55l48 -48zM278 97h-137l-48 -47l49 -49h135l49 48zM36 1h88l-88 88v-88z
+M132 452v125l-48 48l-48 -48v-125l48 -48z" />
+ <glyph glyph-name="c" unicode="c" horiz-adv-x="366"
+d="M141 344h135l49 49l-48 48h-136l-48 -48zM132 272v64l-48 48l-49 -49v-63l48 -48zM132 104v54l-49 48l-48 -48v-55l48 -48zM277 94h-137l-48 -48l49 -49h135l49 48z" />
+ <glyph glyph-name="d" unicode="d" horiz-adv-x="430"
+d="M276 348h-135l-49 49l48 48h136l48 -48zM132 340v-63l-49 -49l-48 48v64l48 48zM132 161v-54l-49 -49l-48 49v55l48 48zM285 276v64l48 47l49 -48v-63l-48 -48zM285 107v54l49 49l48 -48v-55l-48 -48zM140 97h137l48 -47l-49 -49h-135l-49 48zM382 1h-88l88 88v-88z
+M286 452v125l48 48l48 -48v-125l-48 -48z" />
+ <glyph glyph-name="e" unicode="e" horiz-adv-x="429"
+d="M140 344h136l48 49l-47 48h-136l-49 -48zM285 336v-63l48 -49l48 48v64l-48 48zM131 272v64l-48 48l-48 -49v-63l48 -48zM131 104v54l-48 48l-48 -48v-55l47 -48zM276 94h-137l-47 -48l49 -49h135l48 48zM140 167h135l49 49l-48 48h-136l-48 -49z" />
+ <glyph glyph-name="f" unicode="f" horiz-adv-x="326"
+d="M126 533h136l48 48l-48 48h-136l-48 -48zM20 141v-95l48 -49l49 48v96l-48 48zM117 461v63l-48 48l-48 -49v-63l48 -48zM117 254v92l-48 48l-48 -48v-92l47 -48zM223 451h-98l-48 -47l49 -49h97l48 48z" />
+ <glyph glyph-name="g" unicode="g" horiz-adv-x="433"
+d="M142 347h135l49 48l-48 48h-136l-48 -48zM287 338v-63l48 -49l48 48v64l-48 48zM287 160v-55l48 -48l48 48v55l-48 48zM133 275v63l-48 48l-49 -49v-63l49 -48zM133 106v54l-48 48l-49 -48v-55l48 -48zM278 96h-137l-48 -48l49 -49h136l48 49zM287 -8v-63l48 -48l48 48
+v64l-48 48zM281 -81h-137l-48 -48l49 -49h136l48 49z" />
+ <glyph glyph-name="h" unicode="h" horiz-adv-x="430"
+d="M142 345h135l49 49l-48 48h-136l-49 -49zM286 336v-80l49 -48l48 48v81l-48 48zM286 141v-95l49 -49l48 48v97l-48 48zM132 256v80l-48 48l-48 -48v-80l48 -48zM132 46v95l-48 48l-48 -48v-95l48 -48zM35 574v-123l49 -49l48 48v124l-48 48z" />
+ <glyph glyph-name="i" unicode="i" horiz-adv-x="226"
+d="M73 176v-129l49 -48l48 47v131l-48 48zM170 281v112l-48 48l-49 -48v-113l48 -48zM193 580l-47 -47h-65c-3 4 -18 19 -46 47l46 46h65c2 -1 11 -10 47 -46z" />
+ <glyph glyph-name="j" unicode="j" horiz-adv-x="239"
+d="M86 127v-192l48 -48l48 48v193l-48 48zM183 232v182l-49 49l-48 -48v-184l48 -48zM86 -84h-7l-48 -48l48 -48h7l48 48zM212 580l-47 -47h-64c-15 15 -31 30 -47 47l46 46l66 -1c1 -1 16 -16 46 -45z" />
+ <glyph glyph-name="k" unicode="k" horiz-adv-x="425"
+d="M130 45v113l-48 48l-48 -48v-114l48 -48zM139 167h134l49 49l-48 47h-135l-48 -48zM381 48v114l-48 48l-48 -48v-114l48 -48zM130 274v114l-48 48l-48 -48v-114l47 -48zM292 356l-80 -80h-68v68l81 80h67v-68zM130 489v88l-48 48l-48 -48v-88l47 -48z" />
+ <glyph glyph-name="l" unicode="l" horiz-adv-x="185"
+d="M42 283v-233l48 -48l47 48v233l-47 48zM138 387v188l-48 48l-48 -48v-189l48 -48z" />
+ <glyph glyph-name="m" unicode="m" horiz-adv-x="686"
+d="M150 347h135l48 48l-47 48h-136l-48 -48zM294 338v-85l48 -48l48 47v86l-48 48zM294 138v-89l48 -48l48 48v90l-48 48zM141 253v85l-48 48l-48 -49v-85l48 -47zM141 49v89l-48 48l-48 -47v-90l47 -48zM399 351h134l49 48l-48 48h-135l-48 -48zM542 342v-85l49 -48l47 48
+v86l-47 47zM542 143v-90l49 -48l47 48v90l-47 48zM43 356l87 87h-87v-87z" />
+ <glyph glyph-name="n" unicode="n" horiz-adv-x="435"
+d="M147 349h135l48 48l-48 48h-135l-48 -48zM291 340v-85l48 -48l48 48v85l-48 48zM291 141v-90l48 -48l48 48v90l-48 48zM138 255v85l-48 48l-48 -49v-84l48 -48zM138 52v89l-48 48l-48 -48v-90l47 -48zM40 357l87 87h-87v-87z" />
+ <glyph glyph-name="o" unicode="o" horiz-adv-x="431"
+d="M143 349h135l48 48l-47 48h-136l-48 -48zM287 340v-63l48 -48l48 48v63l-48 48zM287 163v-55l48 -48l48 48v55l-48 48zM134 277v63l-48 48l-48 -49v-62l48 -48zM134 109v54l-48 48l-48 -48v-55l48 -47zM278 99h-136l-47 -47l48 -49h135l48 48z" />
+ <glyph glyph-name="p" unicode="p" horiz-adv-x="427"
+d="M139 90h135l49 -48l-48 -48h-135l-48 48zM283 99v62l49 49l47 -48v-64l-47 -47zM283 276v54l48 49l48 -48v-56l-47 -47zM130 162v-63l-48 -48l-48 49v62l48 48zM130 330v-54l-48 -48l-48 48v54l48 48zM275 340h-137l-47 47l49 49h134l48 -48zM34 436h87l-87 -88v88z
+M130 -13v-125l-48 -47l-48 48v124l48 48z" />
+ <glyph glyph-name="q" unicode="q" horiz-adv-x="438"
+d="M279 90h-134l-49 -48l48 -48h135l48 48zM135 99v62l-48 49l-48 -48v-64l48 -47zM135 276v54l-48 49l-48 -48v-56l48 -47zM289 162v-63l47 -48l49 49v62l-48 48zM289 330v-54l48 -48l48 48v54l-48 48zM144 340h136l48 47l-49 49h-135l-48 -48zM385 436h-88l88 -88v88z
+M289 -13v-125l48 -47l48 48v124l-48 48z" />
+ <glyph glyph-name="r" unicode="r" horiz-adv-x="296"
+d="M15 142v-94l49 -49l47 48v96l-47 48zM112 255v91l-48 48l-48 -48v-92l47 -47zM217 451h-97l-47 -47l48 -49h96l48 48z" />
+ <glyph glyph-name="s" unicode="s" horiz-adv-x="414"
+d="M296 349h-158l-49 48l48 48h158l48 -48zM128 340v-63l-48 -48l-48 48v63l48 48zM281 109v54l48 48l48 -48v-55l-47 -47zM104 99h169l48 -47l-49 -49h-168l-48 48zM273 172h-135l-48 48l47 48h136l48 -48z" />
+ <glyph glyph-name="t" unicode="t" horiz-adv-x="317"
+d="M30 340v-238l49 -48l48 48v238l-48 48zM127 445v125l-48 48l-48 -48v-126l48 -48zM236 438h-98l-48 -47l49 -49h97l48 48zM224 95h-88l-48 -48l49 -49h88l48 48z" />
+ <glyph glyph-name="u" unicode="u"
+d="M284 92h-135l-49 -49l48 -48h136l48 49zM139 101v85l-48 49l-48 -48v-87l48 -48zM139 302v90l-48 49l-48 -48v-92l48 -48zM293 187v-86l49 -48l48 49v85l-48 48zM293 392v-90l49 -48l48 48v90l-48 48zM392 84l-88 -88h88v88z" />
+ <glyph glyph-name="v" unicode="v" horiz-adv-x="463"
+d="M368 456l-47 -47v-121l47 -47l46 46v122zM312 276l-47 -47v-124l47 -47l47 47v124zM132 283v122l-46 46l-47 -47v-121c3 -4 18 -19 46 -47zM143 59l47 47v123l-47 47l-46 -47v-124zM254 93h-53l-46 -46c11 -10 26 -26 47 -47h52l47 47z" />
+ <glyph glyph-name="w" unicode="w" horiz-adv-x="741"
+d="M368 456l-47 -47v-121l47 -47l46 46v122zM312 276l-47 -47v-124l47 -47l47 47v124zM132 283v122l-46 46l-47 -47v-121l46 -47zM143 59l47 47v123l-47 47l-46 -47v-124zM254 93h-53l-46 -46l47 -47h52l47 47zM646 456l-47 -47v-121l47 -47l46 46v122zM590 276l-47 -47
+v-124l47 -47l46 47v124zM421 59l47 47v123l-47 47l-47 -47v-124c1 0 16 -15 47 -46zM532 93h-54l-46 -46c4 -3 20 -19 48 -47h51c15 15 31 30 47 47z" />
+ <glyph glyph-name="x" unicode="x" horiz-adv-x="430"
+d="M336 456l-47 -47v-72l47 -47l46 46v73zM336 158l-47 -47v-64c2 -3 18 -18 47 -47l46 47v64c-1 1 -36 35 -46 47zM135 337l-1 72c-1 3 -41 43 -46 46l-47 -47v-72c15 -15 30 -30 47 -46zM88 1c4 3 19 18 47 46v64c-2 0 -17 16 -47 46l-47 -46v-64c4 -3 19 -18 47 -46z
+M146 230h131l47 47l-46 47h-132c-5 -6 -21 -22 -47 -47zM146 121h131l47 47l-46 46h-132l-47 -47z" />
+ <glyph glyph-name="y" unicode="y" horiz-adv-x="434"
+d="M282 98h-135l-49 -49l48 -48h136l48 49zM137 107v80l-48 49l-48 -48v-82l48 -48zM137 303v95l-48 49l-48 -49v-96l48 -48zM292 187v-80l48 -48l48 48v81l-48 48zM292 398v-95l48 -49l48 48v96l-48 48zM293 -6v-62l49 -49l48 48v64l-48 48zM287 -79h-137l-48 -48l49 -49
+h136l49 49z" />
+ <glyph glyph-name="z" unicode="z" horiz-adv-x="400"
+d="M68 342h104l49 49l-48 48h-105l-48 -49zM181 333v-89l49 -48l48 48v89l-48 49zM336 96h-105l-48 -49l47 -48h105l49 49zM222 105v76l-49 48l-48 -48v-77l48 -48z" />
+ <glyph glyph-name="braceleft" unicode="{" horiz-adv-x="487"
+d="M261 332l-47 -47h-103l-47 47l47 46l104 -1c1 0 16 -15 46 -45zM65 140l47 47h102l47 -47l-47 -46h-103zM99 274v-77l-45 -46l-48 48v75l47 46zM317 388l-2 144l-46 46l-46 -47v-143l47 -47zM278 584c0 1 15 16 46 47h70c11 -10 26 -25 47 -46l-46 -47h-71zM316 82
+l-2 -152c-1 -2 -12 -13 -45 -46l-46 47v151c2 3 18 18 47 46zM277 -123c1 0 16 -16 47 -47h70l47 47l-47 47h-71c0 -1 -15 -16 -46 -47z" />
+ <glyph glyph-name="bar" unicode="|" horiz-adv-x="192"
+d="M41 317h-1l1 -154l49 -49l48 48l-2 156l-47 48zM137 421v154l-48 48l-48 -48v-154l47 -48zM139 -103v158l-48 49l-48 -48v-160l48 -47z" />
+ <glyph glyph-name="braceright" unicode="}" horiz-adv-x="479"
+d="M187 332c33 -34 45 -46 46 -47h103c15 15 31 30 47 47l-46 46h-104zM382 140c-3 4 -18 19 -46 47h-103l-46 -47l46 -46h103zM348 274v-77l46 -46l47 48v75l-47 46zM130 388l2 144c3 1 43 41 46 46l47 -47v-143c-10 -9 -26 -25 -48 -47c-5 6 -21 22 -47 47zM170 584
+c0 1 -16 16 -47 47h-70c-10 -10 -25 -26 -47 -46l47 -47h71zM131 82l2 -152l46 -46l46 47v151c-2 3 -18 18 -47 46zM170 -123l-47 -47h-70c-8 8 -24 23 -46 47l46 47h71c0 -1 15 -16 46 -47z" />
+ <glyph glyph-name="asciitilde" unicode="~" horiz-adv-x="269"
+d="M125 551c-1 0 -7 -6 -24 -23h-16c-15 14 -23 22 -24 23l23 24h17zM152 523v-22l-23 -23l-24 23v22l24 24c3 -3 11 -10 23 -24zM201 475l-23 -23h-17l-23 23l23 23h18c1 -2 8 -9 22 -23zM228 526v-23l-23 -23c-5 5 -13 13 -24 23v22l24 24zM79 522v-23l-23 -23l-24 24v21
+c7 8 15 16 24 24z" />
+ <glyph glyph-name="Adieresis" unicode="&#xc4;" horiz-adv-x="456"
+d="M135 530h163c20 21 36 36 47 47l-46 46h-163l-47 -46zM356 566l-47 -47v-148l48 -46l46 46v148zM356 301l-47 -47v-212l47 -47l47 47v213c-2 1 -11 10 -47 46zM124 371l-1 148c-2 5 -42 43 -46 46l-47 -47v-147l47 -47zM77 -4l47 47v211l-47 47l-47 -46v-213
+c4 -3 19 -18 47 -46zM135 265h162c16 14 31 30 48 47l-47 46h-163l-47 -47zM300 743c-19 -19 -22 -22 -23 -24h-33c-14 15 -22 23 -23 24l23 23h34c0 -1 7 -8 22 -23zM183 743l-24 -24h-32l-24 24l24 23l32 -1c1 0 9 -7 24 -22z" />
+ <glyph glyph-name="Aring" unicode="&#xc5;" horiz-adv-x="456"
+d="M135 530h163c20 21 36 36 47 47l-46 46h-163l-47 -46zM356 566l-47 -47v-148l48 -46l46 46v148zM356 301l-47 -47v-212l47 -47l47 47v213c-2 1 -11 10 -47 46zM124 371l-1 148c-2 5 -42 43 -46 46l-47 -47v-147l47 -47zM77 -4l47 47v211l-47 47l-47 -46v-213
+c4 -3 19 -18 47 -46zM135 265h162c16 14 31 30 48 47l-47 46h-163l-47 -47zM273 766c-20 -19 -23 -22 -24 -24l-1 -50c8 -7 16 -15 24 -24l23 24v51c-1 2 -8 9 -22 23zM166 669c2 1 10 9 24 23v50c-6 8 -14 15 -23 24l-24 -23v-51zM243 686h-48l-23 -23c5 -5 13 -13 23 -24
+h48l23 24zM196 747h47l24 24l-23 23h-48c-1 0 -9 -8 -24 -23z" />
+ <glyph glyph-name="Ccedilla" unicode="&#xc7;" horiz-adv-x="438"
+d="M142 529h207l47 47l-46 46h-208c-15 -15 -31 -30 -47 -47zM130 370v148l-46 46l-47 -47v-148l46 -46zM83 57l47 47v149c-15 16 -31 32 -47 47c-21 -21 -37 -37 -46 -47v-150zM349 91h-208l-47 -46l48 -47h207c15 15 31 30 47 47c-19 19 -34 34 -47 46zM250 -43h-25
+l-12 12l12 12h25l12 -12zM252 -61v16l12 12l12 -12v-16l-12 -12zM252 -103v14l12 12l12 -12v-14l-12 -12zM216 -105h34l12 -12l-12 -13h-34l-12 12z" />
+ <glyph glyph-name="Eacute" unicode="&#xc9;"
+d="M147 530h207c16 14 31 30 48 47l-47 46h-208l-47 -47zM42 623v-82l82 82h-82zM135 371v148l-46 46l-47 -47v-148l47 -46zM88 58c1 0 16 16 47 47v149c-9 9 -25 25 -46 47c-23 -22 -38 -38 -47 -47v-150zM355 92h-209l-46 -46l47 -47h208c15 15 30 30 46 47
+c-21 22 -37 37 -46 46zM42 81v-82h82c-11 12 -39 39 -82 82zM147 264h130c10 11 26 26 47 47l-46 47h-131c0 -1 -16 -16 -47 -47zM255 769v-34l-39 -38h-33v32l40 40h32z" />
+ <glyph glyph-name="Ntilde" unicode="&#xd1;" horiz-adv-x="464"
+d="M148 543h163c8 9 24 24 47 47l-46 46h-163c-2 0 -17 -16 -47 -46zM369 579l-47 -47v-148l48 -46l46 46v148zM369 314l-47 -47v-212c15 -15 31 -30 47 -47l47 47v213c-2 1 -11 10 -47 46zM137 384l-1 148c-2 5 -42 43 -46 46l-47 -47v-147l47 -47zM90 9l47 47v211l-47 47
+c-15 -15 -31 -31 -47 -46v-213c4 -3 19 -18 47 -46zM214 761c-16 -17 -22 -23 -23 -24h-17c-14 14 -22 22 -23 24l23 23l17 -1c1 0 8 -7 23 -22zM241 733v-23l-23 -23l-23 24v21l23 24zM291 684c-1 0 -7 -6 -24 -23h-16c-15 14 -23 22 -24 23l24 24l17 -1zM318 735v-23
+l-23 -23l-24 24v22l23 23c1 -1 8 -9 24 -23zM168 731v-23l-23 -23c-4 6 -12 13 -23 24v22l23 23z" />
+ <glyph glyph-name="Odieresis" unicode="&#xd6;" horiz-adv-x="458"
+d="M149 528h162l47 47l-46 47h-163l-47 -47zM370 564l-47 -47v-147l47 -47l46 46v149zM370 300l-47 -47v-150c9 -9 24 -25 47 -47l46 46v151c-1 2 -10 11 -46 47zM137 369l-1 149c-32 32 -44 43 -45 46l-47 -47v-148c11 -12 27 -28 46 -47zM90 56c0 1 16 16 47 47v150
+l-47 47c-19 -20 -35 -36 -46 -47v-150c3 -4 18 -19 46 -47zM311 91h-163l-47 -46l48 -48h162l47 47zM336 750c-18 -16 -23 -22 -24 -23h-32l-23 23l23 24l33 -1zM218 750l-23 -23h-33l-23 23l23 23h34c0 -1 7 -8 22 -23z" />
+ <glyph glyph-name="Udieresis" unicode="&#xdc;" horiz-adv-x="465"
+d="M371 622l-47 -47v-208l47 -46l47 46v208zM371 297l-47 -47v-150l47 -47l47 47l-2 152zM139 367l-2 210c-1 0 -12 11 -45 44l-47 -47v-207l47 -47zM92 54l47 47v149l-47 47l-47 -46v-151c4 -3 19 -18 47 -46zM313 89h-164l-46 -46l47 -48h163c15 15 30 31 47 47
+c-5 5 -21 20 -47 47zM336 750c-18 -16 -23 -22 -24 -23h-32c-15 14 -23 22 -24 23l24 24l32 -1c1 0 9 -8 24 -23zM218 750c-17 -16 -23 -22 -24 -23h-32l-23 23l23 23h33z" />
+ <glyph glyph-name="aacute" unicode="&#xe1;" horiz-adv-x="430"
+d="M141 344h135l49 49l-48 48h-136l-48 -48zM382 84l-87 -87h87v87zM286 336v-63l48 -49l48 48v64l-48 48zM286 158v-55l48 -48l48 48v55l-48 48zM132 104v54l-49 48l-48 -48v-55l48 -48zM277 94h-137l-48 -48l49 -49h136l48 48zM141 167h135l49 49l-48 47h-136l-49 -48z
+M261 573v-33l-39 -38h-33v32l41 39h31z" />
+ <glyph glyph-name="agrave" unicode="&#xe0;" horiz-adv-x="430"
+d="M141 344h135l49 49l-48 48h-136l-48 -48zM382 84l-87 -87h87v87zM286 336v-63l48 -49l48 48v64l-48 48zM286 158v-55l48 -48l48 48v55l-48 48zM132 104v54l-49 48l-48 -48v-55l48 -48zM277 94h-137l-48 -48l49 -49h136l48 48zM141 167h135l49 49l-48 47h-136l-49 -48z
+M170 573v-33l39 -38h33v32l-41 39h-31z" />
+ <glyph glyph-name="acircumflex" unicode="&#xe2;" horiz-adv-x="430"
+d="M141 344h135l49 49l-48 48h-136l-48 -48zM382 84l-87 -87h87v87zM286 336v-63l48 -49l48 48v64l-48 48zM286 158v-55l48 -48l48 48v55l-48 48zM132 104v54l-49 48l-48 -48v-55l48 -48zM277 94h-137l-48 -48l49 -49h136l48 48zM141 167h135l49 49l-48 47h-136l-49 -48z
+M260 513l-24 24v32l23 23l24 -23l-1 -33c0 -1 -7 -8 -22 -23zM163 592l24 -24v-31l-24 -24c-7 8 -15 16 -23 24v32zM230 574h-38l-23 23l24 24h37l24 -23z" />
+ <glyph glyph-name="adieresis" unicode="&#xe4;" horiz-adv-x="430"
+d="M141 344h135l49 49l-48 48h-136l-48 -48zM382 84l-87 -87h87v87zM286 336v-63l48 -49l48 48v64l-48 48zM286 158v-55l48 -48l48 48v55l-48 48zM132 104v54l-49 48l-48 -48v-55l48 -48zM277 94h-137l-48 -48l49 -49h136l48 48zM141 167h135l49 49l-48 47h-136l-49 -48z
+M305 553c-16 -17 -22 -23 -23 -24h-33c-14 15 -22 23 -23 24l23 23l33 -1c2 -1 9 -8 23 -22zM187 553c-16 -17 -22 -23 -23 -24h-32c-15 14 -23 22 -24 23l23 24l33 -1c1 0 8 -7 23 -22z" />
+ <glyph glyph-name="atilde" unicode="&#xe3;" horiz-adv-x="430"
+d="M141 344h135l49 49l-48 48h-136l-48 -48zM382 84l-87 -87h87v87zM286 336v-63l48 -49l48 48v64l-48 48zM286 158v-55l48 -48l48 48v55l-48 48zM132 104v54l-49 48l-48 -48v-55l48 -48zM277 94h-137l-48 -48l49 -49h136l48 48zM141 167h135l49 49l-48 47h-136l-49 -48z
+M206 590l-24 -24h-16c-15 14 -23 22 -24 24l23 23l18 -1c2 -1 9 -8 23 -22zM233 562v-23l-23 -23l-24 24v22l24 23zM282 513l-23 -23h-17l-23 23l23 24l17 -1c1 0 8 -8 23 -23zM309 564v-23l-23 -23l-24 24v22l24 23zM160 560v-23l-23 -23l-24 24v22c7 7 15 15 24 23z" />
+ <glyph glyph-name="aring" unicode="&#xe5;" horiz-adv-x="430"
+d="M141 344h135l49 49l-48 48h-136l-48 -48zM382 84l-87 -87h87v87zM286 336v-63l48 -49l48 48v64l-48 48zM286 158v-55l48 -48l48 48v55l-48 48zM132 104v54l-49 48l-48 -48v-55l48 -48zM277 94h-137l-48 -48l49 -49h136l48 48zM141 167h135l49 49l-48 47h-136l-49 -48z
+M269 605c-20 -19 -23 -22 -24 -24v-50c7 -7 15 -15 23 -24l23 24v51c-1 2 -8 9 -22 23zM162 508c2 1 10 9 24 23v50c-6 8 -14 15 -23 24l-23 -23l-1 -51zM239 525h-48l-23 -23l24 -24h47l23 24zM192 586h47l24 24l-23 23h-48l-23 -23z" />
+ <glyph glyph-name="ccedilla" unicode="&#xe7;" horiz-adv-x="366"
+d="M141 344h135l49 49l-48 48h-136l-48 -48zM132 272v64l-48 48l-49 -49v-63l48 -48zM132 104v54l-49 48l-48 -48v-55l48 -48zM277 94h-137l-48 -48l49 -49h135l49 48zM209 -40h-25l-12 12l12 12h25l12 -12zM211 -58v16l12 12l12 -12v-16l-12 -12zM211 -100v13l12 12l12 -12
+v-13l-12 -12zM175 -103h34l12 -12l-12 -12h-34l-12 12z" />
+ <glyph glyph-name="eacute" unicode="&#xe9;" horiz-adv-x="429"
+d="M140 344h136l48 49l-47 48h-136l-49 -48zM285 336v-63l48 -49l48 48v64l-48 48zM131 272v64l-48 48l-48 -49v-63l48 -48zM131 104v54l-48 48l-48 -48v-55l47 -48zM276 94h-137l-47 -48l49 -49h135l48 48zM140 167h135l49 49l-48 48h-136l-48 -49zM256 585v-33l-39 -39
+h-33v33l40 39h32z" />
+ <glyph glyph-name="egrave" unicode="&#xe8;" horiz-adv-x="429"
+d="M140 344h136l48 49l-47 48h-136l-49 -48zM285 336v-63l48 -49l48 48v64l-48 48zM131 272v64l-48 48l-48 -49v-63l48 -48zM131 104v54l-48 48l-48 -48v-55l47 -48zM276 94h-137l-47 -48l49 -49h135l48 48zM140 167h135l49 49l-48 48h-136l-48 -49zM164 591v-33l40 -39h33
+v33l-41 39h-32z" />
+ <glyph glyph-name="ecircumflex" unicode="&#xea;" horiz-adv-x="429"
+d="M140 344h136l48 49l-47 48h-136l-49 -48zM285 336v-63l48 -49l48 48v64l-48 48zM131 272v64l-48 48l-48 -49v-63l48 -48zM131 104v54l-48 48l-48 -48v-55l47 -48zM276 94h-137l-47 -48l49 -49h135l48 48zM140 167h135l49 49l-48 48h-136l-48 -49zM260 530l-23 24v32
+l23 23l23 -23v-33zM164 609l23 -23v-32c-14 -15 -22 -22 -23 -23c-8 7 -16 15 -23 23v32zM231 592h-38l-24 23l24 24h38l23 -24z" />
+ <glyph glyph-name="edieresis" unicode="&#xeb;" horiz-adv-x="429"
+d="M140 344h136l48 49l-47 48h-136l-49 -48zM285 336v-63l48 -49l48 48v64l-48 48zM131 272v64l-48 48l-48 -49v-63l48 -48zM131 104v54l-48 48l-48 -48v-55l47 -48zM276 94h-137l-47 -48l49 -49h135l48 48zM140 167h135l49 49l-48 48h-136l-48 -49zM310 574
+c-18 -16 -23 -22 -24 -23h-32c-14 14 -22 22 -24 23l24 23h33zM192 574l-24 -24h-32c-14 15 -22 23 -23 24l23 23l33 -1c2 -1 9 -8 23 -22z" />
+ <glyph glyph-name="iacute" unicode="&#xed;" horiz-adv-x="213"
+d="M65 176v-129l49 -48l48 47v131l-48 48zM162 281v112l-48 48l-48 -48v-113l48 -48zM157 581v-33l-39 -39h-33v33l40 39h32z" />
+ <glyph glyph-name="igrave" unicode="&#xec;" horiz-adv-x="219"
+d="M68 176v-129l49 -48l47 47v131l-47 48zM165 281v112l-48 48l-49 -48v-113l48 -48zM62 598v-33l40 -38h33v32l-41 39h-32z" />
+ <glyph glyph-name="icircumflex" unicode="&#xee;" horiz-adv-x="219"
+d="M66 176v-129l49 -48l48 47v131l-48 48zM163 281v112l-48 48l-48 -48v-113l47 -48zM162 532l-24 24v32c7 7 15 15 24 23l23 -23l-1 -33c0 -1 -7 -9 -22 -23zM65 611c1 0 9 -8 24 -24v-31c-15 -15 -23 -22 -23 -24l-24 24v32zM133 593h-39l-23 23l24 24h38l23 -23
+c-1 -1 -9 -8 -23 -24z" />
+ <glyph glyph-name="idieresis" unicode="&#xef;" horiz-adv-x="221"
+d="M68 176v-129l48 -48l48 47v131l-48 48zM165 281v112l-48 48l-49 -48v-113l48 -48zM212 546l-23 -23h-33l-23 23l23 23h34c0 -1 7 -8 22 -23zM94 546c-16 -18 -22 -23 -23 -24h-32c-15 14 -23 22 -24 24l23 23l33 -1c1 0 8 -7 23 -22z" />
+ <glyph glyph-name="ntilde" unicode="&#xf1;" horiz-adv-x="435"
+d="M147 349h135l48 48l-48 48h-135l-48 -48zM291 340v-85l48 -48l48 48v85l-48 48zM291 141v-90l48 -48l48 48v90l-48 48zM138 255v85l-48 48l-48 -49v-84l48 -48zM138 52v89l-48 48l-48 -48v-90l47 -48zM40 357l87 87h-87v-87zM208 595l-23 -23h-17l-23 23l23 23h18
+c1 -2 8 -9 22 -23zM236 567v-22l-23 -24l-24 24v22l23 23c3 -2 11 -10 24 -23zM285 519l-24 -24h-16c-14 15 -22 23 -24 24l24 23h17c0 -1 8 -8 23 -23zM312 569v-22l-23 -23c-6 4 -13 12 -24 23v22l24 24c1 -1 9 -8 23 -24zM162 565v-22l-23 -23c-5 5 -12 13 -23 23v22
+c7 8 15 16 23 24c3 -3 11 -11 23 -24z" />
+ <glyph glyph-name="oacute" unicode="&#xf3;" horiz-adv-x="431"
+d="M143 349h135l48 48l-47 48h-136l-48 -48zM287 340v-63l48 -48l48 48v63l-48 48zM287 163v-55l48 -48l48 48v55l-48 48zM134 277v63l-48 48l-48 -49v-62l48 -48zM134 109v54l-48 48l-48 -48v-55l48 -47zM278 99h-136l-47 -47l48 -49h135l48 48zM258 597v-33l-39 -39h-33
+v33c13 13 26 26 40 39h32z" />
+ <glyph glyph-name="ograve" unicode="&#xf2;" horiz-adv-x="431"
+d="M143 349h135l48 48l-47 48h-136l-48 -48zM287 340v-63l48 -48l48 48v63l-48 48zM287 163v-55l48 -48l48 48v55l-48 48zM134 277v63l-48 48l-48 -49v-62l48 -48zM134 109v54l-48 48l-48 -48v-55l48 -47zM278 99h-136l-47 -47l48 -49h135l48 48zM158 612v-33l39 -39h33v33
+l-40 39h-32z" />
+ <glyph glyph-name="ocircumflex" unicode="&#xf4;" horiz-adv-x="431"
+d="M143 349h135l48 48l-47 48h-136l-48 -48zM287 340v-63l48 -48l48 48v63l-48 48zM287 163v-55l48 -48l48 48v55l-48 48zM134 277v63l-48 48l-48 -49v-62l48 -48zM134 109v54l-48 48l-48 -48v-55l48 -47zM278 99h-136l-47 -47l48 -49h135l48 48zM262 528l-23 24v32l23 23
+l23 -23v-33zM166 607c1 -2 9 -10 23 -24v-31c-14 -15 -22 -23 -23 -24c-8 8 -16 16 -23 24v32zM233 590h-38l-24 23c2 1 10 9 24 23h38l23 -23z" />
+ <glyph glyph-name="odieresis" unicode="&#xf6;" horiz-adv-x="431"
+d="M143 349h135l48 48l-47 48h-136l-48 -48zM287 340v-63l48 -48l48 48v63l-48 48zM287 163v-55l48 -48l48 48v55l-48 48zM134 277v63l-48 48l-48 -49v-62l48 -48zM134 109v54l-48 48l-48 -48v-55l48 -47zM278 99h-136l-47 -47l48 -49h135l48 48zM314 572
+c-19 -19 -22 -22 -23 -24h-32l-24 24l23 23h34c0 -1 7 -8 22 -23zM197 572l-24 -24h-32l-24 24l24 23l33 -1c2 -1 9 -8 23 -22z" />
+ <glyph glyph-name="otilde" unicode="&#xf5;" horiz-adv-x="431"
+d="M143 349h135l48 48l-47 48h-136l-48 -48zM287 340v-63l48 -48l48 48v63l-48 48zM287 163v-55l48 -48l48 48v55l-48 48zM134 277v63l-48 48l-48 -49v-62l48 -48zM134 109v54l-48 48l-48 -48v-55l48 -47zM278 99h-136l-47 -47l48 -49h135l48 48zM205 588
+c0 -1 -6 -7 -23 -24h-17c-14 14 -22 22 -23 24l23 23l17 -1c1 0 8 -7 23 -22zM233 560v-23l-23 -23l-24 24v22l23 23c3 -3 10 -11 24 -23zM282 511c-1 0 -7 -6 -24 -23h-16c-14 14 -22 22 -24 23l24 24l17 -1zM309 562v-23l-23 -23l-24 24v22l24 23zM160 558v-23l-23 -23
+l-24 24v22l23 23c4 -2 11 -10 24 -23z" />
+ <glyph glyph-name="uacute" unicode="&#xfa;"
+d="M284 92h-135l-49 -49l48 -48h136l48 49zM139 101v85l-48 49l-48 -48v-87l48 -48zM139 302v90l-48 49l-48 -48v-92l48 -48zM293 187v-86l49 -48l48 49v85l-48 48zM293 392v-90l49 -48l48 48v90l-48 48zM392 84l-88 -88h88v88zM257 575v-33l-40 -39h-33v33l41 39h32z" />
+ <glyph glyph-name="ugrave" unicode="&#xf9;"
+d="M284 92h-135l-49 -49l48 -48h136l48 49zM139 101v85l-48 49l-48 -48v-87l48 -48zM139 302v90l-48 49l-48 -48v-92l48 -48zM293 187v-86l49 -48l48 49v85l-48 48zM293 392v-90l49 -48l48 48v90l-48 48zM392 84l-88 -88h88v88zM171 610v-34l39 -38h33v32l-40 40h-32z" />
+ <glyph glyph-name="ucircumflex" unicode="&#xfb;"
+d="M284 92h-135l-49 -49l48 -48h136l48 49zM139 101v85l-48 49l-48 -48v-87l48 -48zM139 302v90l-48 49l-48 -48v-92l48 -48zM293 187v-86l49 -48l48 49v85l-48 48zM293 392v-90l49 -48l48 48v90l-48 48zM392 84l-88 -88h88v88zM261 529l-24 23v32c7 8 15 16 24 24l23 -23
+v-34c-2 -1 -9 -8 -23 -22zM164 608l24 -24v-32c-15 -14 -22 -22 -23 -23c-8 7 -16 15 -24 23v32c1 2 9 10 23 24zM232 590h-39l-23 23l24 24h38l23 -23c-1 -1 -9 -8 -23 -24z" />
+ <glyph glyph-name="udieresis" unicode="&#xfc;"
+d="M284 92h-135l-49 -49l48 -48h136l48 49zM139 101v85l-48 49l-48 -48v-87l48 -48zM139 302v90l-48 49l-48 -48v-92l48 -48zM293 187v-86l49 -48l48 49v85l-48 48zM293 392v-90l49 -48l48 48v90l-48 48zM392 84l-88 -88h88v88zM312 531l-23 -23h-33l-23 23l23 23h34
+c0 -1 7 -8 22 -23zM194 531c-16 -17 -22 -23 -23 -24h-32c-15 14 -23 22 -24 24l24 23l32 -1c1 0 8 -7 23 -22z" />
+ <glyph glyph-name="dagger" unicode="&#x2020;" horiz-adv-x="493"
+d="M278 470v115l-47 48l-49 -48v-115l48 -48zM275 294v60l-48 48l-48 -49v-60l48 -48zM407 459h-115l-47 -48l48 -48h115l48 48zM166 461h-116l-47 -48l48 -48h115l48 48zM278 110v68l-47 48l-49 -49v-67l48 -49zM275 -122v116l-48 47l-48 -48v-115l48 -48z" />
+ <glyph glyph-name="degree" unicode="&#xb0;" horiz-adv-x="225"
+d="M166 617c-18 -16 -23 -22 -24 -23l-1 -51c8 -7 16 -15 24 -24l23 24v51c-1 2 -8 9 -22 23zM59 520c2 1 10 9 24 23v51l-23 23l-24 -23v-51zM136 537h-48l-23 -23l24 -24h47l23 24zM89 599h47c14 13 22 21 24 23l-23 23h-48c-1 0 -8 -8 -23 -23z" />
+ <glyph glyph-name="cent" unicode="&#xa2;" horiz-adv-x="370"
+d="M123 346h104l49 49l-48 48h-105l-48 -48zM114 274v63l-48 48l-49 -48v-63l48 -48zM114 105v54l-49 48l-48 -48v-55l48 -48zM228 95h-106l-48 -48l49 -49h104l49 49zM240 511v-63l48 -48l48 48v64l-48 48zM232 -15v-63l48 -49l48 48v64l-48 48z" />
+ <glyph glyph-name="sterling" unicode="&#xa3;" horiz-adv-x="576"
+d="M251 528h136l48 48l-47 48h-137l-48 -48zM242 353v166l-48 48l-49 -49v-165l48 -48zM242 107v131l-49 49l-48 -49v-132l48 -48zM348 344h-98l-48 -48l49 -49h97l48 48zM399 520v-63l49 -49l48 48v64l-48 48zM253 0h175l49 49l-48 48h-175l-49 -49zM27 41
+c0 -1 16 -16 47 -47h70c4 3 20 19 47 46l-46 47h-71c-1 0 -16 -15 -47 -46zM446 143v-40l48 -48l49 48v40l-48 48zM19 292c1 0 16 -16 47 -47h71c15 15 30 30 46 47l-46 47h-71z" />
+ <glyph glyph-name="section" unicode="&#xa7;" horiz-adv-x="438"
+d="M135 533h200c11 11 44 46 47 47l-46 46h-201c-15 -15 -31 -30 -47 -47zM354 314c-33 -34 -44 -45 -46 -47v-89l46 -46l47 46v89zM123 383l-2 141l-44 44l-47 -47v-138c15 -15 30 -30 46 -47zM134 277h162l47 47l-46 46h-163l-46 -46zM358 112l-47 -47v-141
+c9 -10 25 -26 47 -47l46 46v142c-1 2 -10 11 -46 47zM126 181l-1 87l-45 45l-47 -46v-86c10 -10 26 -25 46 -47zM300 -88h-204l-46 -46l47 -47h203c7 7 23 23 46 47zM137 75h162l47 47l-46 46h-162l-47 -47z" />
+ <glyph glyph-name="bullet" unicode="&#x2022;" horiz-adv-x="391"
+d="M40 482h303v-303h-303v303z" />
+ <glyph glyph-name="germandbls" unicode="&#xdf;" horiz-adv-x="451"
+d="M139 533h162l47 47l-46 46h-163c-15 -15 -30 -30 -46 -47zM359 568l-47 -46v-147l48 -47l45 46v148zM360 305l-48 -47v-171l47 -46l46 46l-1 173zM128 374l-1 149c-32 32 -44 44 -46 45c0 -2 -16 -17 -46 -47v-147l46 -46zM81 2c4 3 19 18 47 46v210l-47 47l-46 -46v-211
+zM304 73h-82l-46 -46l47 -47l81 -1l47 47zM139 268h161c16 16 32 32 48 47l-47 47h-162l-47 -47z" />
+ <glyph glyph-name="registered" unicode="&#xae;" horiz-adv-x="594"
+d="M494 503l-47 -47v-350c15 -15 30 -31 47 -47l46 47l-1 352zM82 60c4 3 19 18 47 46v350c-1 1 -16 17 -47 47l-46 -47v-350zM436 94h-296l-47 -46c11 -10 27 -26 48 -47h295l46 47zM141 466h294l47 47l-46 47h-295l-47 -47zM249 385h81l24 24l-23 23h-82l-23 -23zM197 432
+v-41l41 41h-41zM360 403l-24 -23v-74l24 -23l23 23v74zM360 271c-18 -16 -23 -22 -24 -23v-106c7 -7 15 -15 24 -23l23 23l-1 106c0 1 -7 8 -22 23zM243 306l-1 75l-22 22l-23 -24v-73c13 -14 21 -22 23 -24zM220 119c1 2 9 10 23 24v105l-23 23l-23 -23v-106zM249 253h81
+c7 7 15 15 24 23l-23 23h-82l-23 -23z" />
+ <glyph glyph-name="copyright" unicode="&#xa9;" horiz-adv-x="594"
+d="M494 503l-47 -47v-350c15 -15 30 -31 47 -47l46 47l-1 352zM82 60c4 3 19 18 47 46v350c-1 1 -16 17 -47 47l-46 -47v-350zM436 94h-296l-47 -46c11 -10 27 -26 48 -47h295l46 47zM141 466h294l47 47l-46 47h-295l-47 -47zM244 387h103c8 7 16 15 24 23l-23 24h-104
+c-1 -2 -9 -10 -23 -24zM238 307l-1 75c-18 18 -21 21 -22 23l-24 -24v-74c13 -13 21 -21 24 -23zM214 151c1 0 9 8 24 23v75c-14 15 -22 22 -23 23c-3 -2 -11 -10 -24 -23v-75zM348 168h-105l-23 -23l24 -24h104c7 8 15 16 23 24z" />
+ <glyph glyph-name="trademark" unicode="&#x2122;" horiz-adv-x="352"
+d="M100 610l23 -1l11 12l-11 11h-23l-11 -11zM97 569v38l-11 11l-12 -12v-37l12 -11zM86 475c1 2 4 5 11 12v53l-11 12l-12 -12v-53zM49 610l22 -1l12 12l-11 12h-23l-12 -12zM168 611l42 -1l11 12l-11 11h-41l-12 -11zM224 619l-12 -12v-37l12 -11l12 11v37zM224 553
+l-12 -12v-53l12 -12l12 12l-1 54zM166 570v38c-2 1 -5 4 -12 11c-2 -2 -6 -6 -11 -12v-37l11 -11c3 2 7 6 12 11zM154 476c0 1 4 5 12 12v53l-12 12l-11 -12v-53c1 -2 4 -5 11 -12zM239 611l41 -1l11 12l-11 11h-41l-12 -11zM294 619l-12 -12v-37l12 -11c9 7 11 10 12 11v37
+zM294 553l-12 -12v-53l12 -12l12 12v54c-2 1 -5 4 -12 11z" />
+ <glyph glyph-name="acute" unicode="&#xb4;" horiz-adv-x="148"
+d="M158 636v-33l-39 -39h-33v33l41 39h31z" />
+ <glyph glyph-name="dieresis" unicode="&#xa8;" horiz-adv-x="268"
+d="M235 607l-24 -24h-32c-14 15 -22 23 -23 24l23 23l33 -1c2 -1 9 -8 23 -22zM117 607c-16 -18 -22 -23 -23 -24h-33l-23 23l23 24l33 -1c2 -1 9 -8 23 -22z" />
+ <glyph glyph-name="AE" unicode="&#xc6;" horiz-adv-x="691"
+d="M136 537h162c15 15 30 31 47 47l-46 47h-163l-47 -47zM124 378v149c-5 2 -43 42 -46 46l-47 -47v-148c15 -15 30 -30 46 -47zM77 3l47 47v212l-47 47c-22 -23 -37 -38 -46 -47v-213zM135 272h162c16 14 31 30 48 47l-47 46h-163l-46 -46zM417 535h207c15 15 31 31 48 47
+l-47 47h-208l-47 -47zM405 376l-1 150c-1 0 -42 41 -45 45l-47 -47v-148l47 -47zM358 63l47 47v150c-15 15 -30 30 -46 47l-47 -47v-150c3 -4 18 -19 46 -47zM625 98h-209l-46 -46l47 -48h208l47 47zM417 270h130l47 47l-46 46h-131c-4 -3 -19 -18 -47 -46z" />
+ <glyph glyph-name="Oslash" unicode="&#xd8;" horiz-adv-x="482"
+d="M363 575l-47 47h-163l-46 -47l47 -47h162zM95 564l-46 -46v-149l46 -46l47 47v147zM375 56l46 47v150l-46 47l-47 -47v-150zM154 91l-47 -47l47 -47h162l48 48l-47 46h-163zM463 518l-22 22l-22 -21l-45 45l-46 -47v-89l-186 -186v11l-47 46l-46 -46v-104l-52 -53l22 -22
+l30 30l47 -48l46 47v94l186 186v-14l47 -47l46 47v107z" />
+ <glyph glyph-name="plusminus" unicode="&#xb1;" horiz-adv-x="496"
+d="M291 409v116l-48 48l-49 -49v-115l48 -48zM288 177v116l-49 48l-48 -49v-115l48 -48zM420 398h-115l-48 -48l48 -48h115l49 48zM177 400h-115l-48 -48l49 -48h115l48 48zM351 92h-239l-48 -48l48 -49h240l48 49z" />
+ <glyph glyph-name="yen" unicode="&#xa5;" horiz-adv-x="442"
+d="M350 629l-47 -47v-147l47 -46l46 46v148zM118 435v148c-3 1 -43 41 -46 46l-47 -47v-147l46 -47zM129 329h162l47 47l-46 46h-162c-15 -15 -31 -30 -47 -47zM257 221v53l-48 47l-48 -48v-52l48 -48zM260 45v60l-48 48l-48 -48v-60l48 -48zM38 161l47 -47h70
+c15 15 30 30 46 47l-46 46h-71zM221 164l47 -47h70l47 47l-47 46h-71z" />
+ <glyph glyph-name="mu1" unicode="&#xb5;"
+d="M285 92h-136l-49 -49l48 -48h136l49 49zM140 101v85l-49 49l-48 -48v-87l48 -48zM140 302v90l-49 49l-48 -48v-92l48 -48zM294 187v-86l48 -48l49 49v85l-49 48zM294 392v-90l48 -48l49 48v90l-48 48zM392 84l-87 -88h87v88zM139 -107v91l-49 48l-48 -48v-91l48 -48z" />
+ <glyph glyph-name="ordfeminine" unicode="&#xaa;" horiz-adv-x="250"
+d="M88 590h68l24 24l-24 24h-68l-24 -24zM209 460l-44 -44h44v44zM160 585v-31l25 -25l24 24v32l-24 24zM160 496v-27l24 -24l25 24v27l-24 24zM83 469v27l-24 24l-24 -24v-27l24 -24zM156 464h-69l-23 -24l24 -24h68l24 24zM88 501h67l25 24l-24 24h-68l-24 -24z" />
+ <glyph glyph-name="ordmasculine" unicode="&#xba;" horiz-adv-x="254"
+d="M89 589h68l24 24l-24 24h-68l-24 -24zM161 584v-31l24 -24l24 24v31l-24 24zM161 496v-27l24 -25l24 24v28l-24 24zM85 553v31l-24 24l-24 -24v-31l24 -24zM85 469v27l-24 24l-24 -24v-27l23 -24zM157 464h-68l-24 -24l24 -24h68l24 24z" />
+ <glyph glyph-name="ae" unicode="&#xe6;" horiz-adv-x="668"
+d="M130 348h135l49 49l-48 48h-136l-49 -49zM120 106v55l-48 48l-49 -48v-55l48 -48zM266 96h-138l-47 -47l49 -49h135l49 48zM129 170h135l49 49l-48 48h-136l-48 -49zM381 348h136l48 49l-47 48h-137l-48 -49zM526 339v-63l49 -48l48 48v64l-48 48zM372 276v63l-48 48
+l-49 -48v-63l48 -49zM372 106v55l-49 48l-48 -48v-55l48 -48zM517 96h-137l-48 -47l49 -49h136l48 48zM380 170h136l49 49l-48 48h-136l-49 -49z" />
+ <glyph glyph-name="oslash" unicode="&#xf8;" horiz-adv-x="463"
+d="M168 349l-48 48l48 48h136l47 -48l-48 -48h-135zM312 340l48 48l48 -48v-63l-48 -48l-48 48v63zM159 311l153 -154v6l48 48l48 -48v-55l-23 -23l40 -41l-22 -23l-41 41l-2 -2l-48 48v4l-158 160l-43 -43l-48 48v62l12 12l-40 40l22 23l40 -40l14 14l48 -48v-29zM159 109
+l-48 -48l-48 47v55l48 48l48 -48v-54zM303 99l48 -48l-48 -48h-135l-48 49l47 47h136z" />
+ <glyph glyph-name="questiondown" unicode="&#xbf;" horiz-adv-x="376"
+d="M127 -83h157l47 -47l-46 -46h-158l-47 47zM270 145l-47 47v82l47 47l46 -47l-1 -84zM115 76l-1 -149l-45 -45l-47 47v147c9 9 25 25 47 46c17 -16 32 -31 46 -46zM127 182h84l47 -47l-46 -46h-85c-4 3 -19 18 -47 46zM191 400c1 1 43 41 47 47h65c4 -6 20 -21 46 -47
+l-46 -47h-65z" />
+ <glyph glyph-name="exclamdown" unicode="&#xa1;" horiz-adv-x="220"
+d="M158 4v-129l-48 -49l-48 48v131l48 48zM62 109v112l48 48l48 -48v-113l-48 -48zM31 406c39 38 45 44 47 47h64l47 -47l-46 -47h-66c-1 2 -27 28 -46 47z" />
+ <glyph glyph-name="logicalnot" unicode="&#xac;" horiz-adv-x="382"
+d="M291 309c-2 -1 -13 -12 -47 -46v-89c15 -15 30 -30 46 -47l47 47l-1 90zM70 273h162c12 11 28 27 47 47l-46 46h-163c-15 -15 -30 -30 -46 -47z" />
+ <glyph glyph-name="florin" unicode="&#x192;" horiz-adv-x="438"
+d="M259 536h97l48 49l-47 48h-98l-48 -49zM250 464v64l-48 47l-48 -48v-63l48 -48zM250 195v155l-48 48l-48 -48v-155l47 -48zM343 455h-85l-48 -48l49 -48h84l48 48zM141 -80h-79l-49 -49l48 -47h80l48 48zM151 78v-149l47 -48l49 48v149l-48 48zM71 362h71l48 47l-49 49
+h-70l-49 -48z" />
+ <glyph glyph-name="guillemotleft" unicode="&#xab;" horiz-adv-x="518"
+d="M406 416c-2 -1 -13 -12 -47 -46l-36 -1c-4 3 -19 18 -47 46l46 48h38c1 -2 10 -11 46 -47zM277 224c3 4 18 19 46 47h36c2 -2 17 -18 47 -46l-47 -47h-36zM311 358v-77l-46 -46l-47 47v75c15 15 30 31 47 47zM421 -4c-18 16 -33 32 -47 46v129l47 47l46 -46v-130z
+M416 427l-47 47v129l47 47l46 -46v-130zM212 411l-47 -47l-37 -1c-3 4 -18 19 -46 47l46 47h37c2 -1 11 -10 47 -46zM82 218c1 0 16 16 47 47l36 1l47 -47l-47 -46h-36c-1 0 -16 15 -47 45zM117 352v-77l-46 -46c-3 4 -19 20 -47 48v75l46 46zM227 -10c-17 17 -33 32 -47 47
+v129l47 46l46 -46v-130zM222 422c-18 16 -33 32 -47 46v129l47 47c1 0 35 -35 46 -46v-130z" />
+ <glyph glyph-name="guillemotright" unicode="&#xbb;" horiz-adv-x="514"
+d="M85 416c2 -1 13 -12 47 -46l36 -1c4 3 19 18 47 46l-46 48h-38c-1 -2 -10 -11 -46 -47zM214 224c-3 4 -18 19 -46 47h-36c-2 -2 -17 -18 -47 -46l47 -47h36zM180 358v-77l46 -46l47 47v75c-15 15 -30 31 -47 47zM70 -4c18 16 33 32 47 46v129l-47 47l-46 -46v-130z
+M75 427l47 47v129l-47 47l-46 -46v-130zM279 411l47 -47l37 -1c3 4 18 19 46 47l-46 47h-37c-2 -1 -11 -10 -47 -46zM409 218c-1 0 -16 16 -47 47l-36 1l-47 -47l47 -46h36c1 0 16 15 47 45zM374 352v-77l46 -46c3 4 19 20 47 48v75l-46 46zM264 -10c17 17 33 32 47 47v129
+l-47 46l-46 -46v-130zM269 422c18 16 33 32 47 46v129l-47 47l-46 -46v-130z" />
+ <glyph glyph-name="ellipsis" unicode="&#x2026;" horiz-adv-x="767"
+d="M238 46l-47 -47h-64l-47 47l46 47h66c1 -2 10 -11 46 -47zM504 46l-46 -47h-65c0 1 -16 16 -47 47l47 47h65c1 -2 10 -11 46 -47zM752 46l-46 -47h-65c0 1 -15 16 -46 47l46 47h65c2 -2 36 -35 46 -47z" />
+ <glyph glyph-name="Agrave" unicode="&#xc0;" horiz-adv-x="456"
+d="M135 530h163c20 21 36 36 47 47l-46 46h-163l-47 -46zM356 566l-47 -47v-148l48 -46l46 46v148zM356 301l-47 -47v-212l47 -47l47 47v213c-2 1 -11 10 -47 46zM124 371l-1 148c-2 5 -42 43 -46 46l-47 -47v-147l47 -47zM77 -4l47 47v211l-47 47l-47 -46v-213
+c4 -3 19 -18 47 -46zM135 265h162c16 14 31 30 48 47l-47 46h-163l-47 -47zM190 769v-34l39 -38h33v32l-41 40h-31z" />
+ <glyph glyph-name="Atilde" unicode="&#xc3;" horiz-adv-x="456"
+d="M135 530h163c20 21 36 36 47 47l-46 46h-163l-47 -46zM356 566l-47 -47v-148l48 -46l46 46v148zM356 301l-47 -47v-212l47 -47l47 47v213c-2 1 -11 10 -47 46zM124 371l-1 148c-2 5 -42 43 -46 46l-47 -47v-147l47 -47zM77 -4l47 47v211l-47 47l-47 -46v-213
+c4 -3 19 -18 47 -46zM135 265h162c16 14 31 30 48 47l-47 46h-163l-47 -47zM225 761l-24 -24h-16l-24 24l24 23l17 -1c2 -1 9 -8 23 -22zM252 733v-23l-23 -23l-24 24v21l24 24zM301 684l-23 -23h-17l-23 23l23 24l17 -1c1 0 8 -8 23 -23zM328 735v-23l-23 -23
+c-5 5 -13 13 -23 24v22l23 23zM179 731v-23l-23 -23l-24 24v22c7 7 15 15 24 23z" />
+ <glyph glyph-name="Otilde" unicode="&#xd5;" horiz-adv-x="458"
+d="M149 528h162l47 47l-46 47h-163l-47 -47zM370 564l-47 -47v-147l47 -47l46 46v149zM370 300l-47 -47v-150c9 -9 24 -25 47 -47l46 46v151c-1 2 -10 11 -46 47zM137 369l-1 149c-32 32 -44 43 -45 46l-47 -47v-148c11 -12 27 -28 46 -47zM90 56c0 1 16 16 47 47v150
+l-47 47c-19 -20 -35 -36 -46 -47v-150c3 -4 18 -19 46 -47zM311 91h-163l-47 -46l48 -48h162l47 47zM217 761l-24 -24h-17c-14 14 -22 22 -23 24l23 23l17 -1c1 0 9 -7 24 -22zM244 733v-23l-23 -23l-24 24v21l23 24c3 -3 10 -11 24 -23zM293 684l-23 -23h-17l-23 23l23 24
+l17 -1zM320 735v-23l-23 -23l-24 24v22l24 23zM171 731v-23l-23 -23l-24 24v22l23 23c4 -2 11 -10 24 -23z" />
+ <glyph glyph-name="OE" unicode="&#x152;" horiz-adv-x="712"
+d="M134 535h162l47 47l-46 46h-163c-4 -3 -19 -18 -47 -46zM122 376l-1 148c-1 2 -12 13 -45 46l-48 -47v-147l47 -47zM75 63l47 47v149l-47 47l-47 -47v-150c1 0 16 -15 47 -46zM296 97h-164l-46 -46c11 -11 26 -27 48 -47h162l47 47c-15 15 -31 31 -47 46zM415 535h207
+c16 14 31 30 48 47l-47 46h-208l-47 -46zM403 376v149c-2 0 -13 12 -46 45l-47 -47v-147c15 -15 30 -31 47 -47zM356 63c1 0 16 16 47 47v149c-14 16 -30 31 -46 47l-47 -47v-150zM623 97h-209l-46 -46l47 -47h208l47 47c-15 15 -31 31 -47 46zM415 269h130
+c14 16 30 31 47 48l-46 46h-131l-47 -47z" />
+ <glyph glyph-name="oe" unicode="&#x153;" horiz-adv-x="672"
+d="M134 348h136l49 49l-48 48h-137l-48 -49zM125 276v63l-48 48l-49 -48v-63l48 -49zM125 106v55l-49 48l-48 -48v-55l48 -48zM270 96h-137l-48 -47l49 -49h136l48 48zM386 348h135l49 49l-48 48h-136l-49 -49zM531 339v-63l48 -48l48 48v64l-48 48zM376 276v63l-48 48
+l-48 -48v-63l48 -49zM376 106v55l-48 48l-48 -48v-55l48 -48zM522 96h-137l-48 -47l49 -49h136l48 48zM385 170h136l49 49l-48 48h-137l-48 -49z" />
+ <glyph glyph-name="endash" unicode="&#x2013;" horiz-adv-x="438"
+d="M363 358l-280 -1l-48 -48l49 -49l279 1l48 48z" />
+ <glyph glyph-name="emdash" unicode="&#x2014;" horiz-adv-x="527"
+d="M452 358l-369 -1l-48 -48l49 -49l368 1l48 48z" />
+ <glyph glyph-name="quotedblleft" unicode="&#x201c;" horiz-adv-x="487"
+d="M291 448l47 47h64l47 -47l-46 -46h-65c-2 1 -11 10 -47 46zM237 504v77l46 46c3 -4 19 -20 47 -48v-75c-15 -15 -30 -30 -47 -46zM82 452l47 47h64l47 -47l-46 -47h-66c-1 2 -10 11 -46 47zM28 508v76l46 46l47 -47v-75l-47 -47z" />
+ <glyph glyph-name="quotedblright" unicode="&#x201d;" horiz-adv-x="488"
+d="M187 593l-47 -47h-65c-3 4 -18 19 -46 47l46 46h65c2 -1 28 -27 47 -46zM241 537v-77l-46 -46c-3 4 -19 20 -47 48v75l46 46zM396 589l-47 -47h-64l-47 47l46 47h65zM450 533v-76l-46 -46l-47 47v75l47 47z" />
+ <glyph glyph-name="quoteleft" unicode="&#x2018;" horiz-adv-x="285"
+d="M83 456l47 47h64c1 0 16 -15 47 -46l-46 -47l-67 1c0 1 -15 16 -45 45zM29 512v77l46 46l47 -47v-75c-15 -15 -30 -31 -47 -47z" />
+ <glyph glyph-name="quoteright" unicode="&#x2019;" horiz-adv-x="278"
+d="M187 592l-47 -46h-65l-46 46l46 47h65zM241 536v-76l-46 -46l-47 47v75c14 16 30 31 46 47z" />
+ <glyph glyph-name="divide" unicode="&#xf7;" horiz-adv-x="400"
+d="M308 237h-239l-49 -48l49 -49h239l49 49zM269 330l-47 -47h-64l-47 47l47 46l66 -1zM266 49l-47 -47h-64c-1 0 -16 16 -47 47l47 46l66 -1z" />
+ <glyph glyph-name="ydieresis" unicode="&#xff;" horiz-adv-x="434"
+d="M282 98h-135l-49 -49l48 -48h136l48 49zM137 107v80l-48 49l-48 -48v-82l48 -48zM137 303v95l-48 49l-48 -49v-96l48 -48zM292 187v-80l48 -48l48 48v81l-48 48zM292 398v-95l48 -49l48 48v96l-48 48zM293 -6v-62l49 -49l48 48v64l-48 48zM287 -79h-137l-48 -48l49 -49
+h136l49 49zM314 553l-23 -23h-32c-15 14 -23 22 -24 23l23 23h34c1 -2 8 -9 22 -23zM197 553l-24 -24h-32c-14 14 -22 22 -23 24l23 23l33 -1c2 -1 9 -8 23 -22z" />
+ <glyph glyph-name="Ydieresis" unicode="&#x178;" horiz-adv-x="444"
+d="M362 625l-47 -47v-148l48 -46l46 46v148zM221 358c-1 -1 -43 -41 -47 -47v-264l46 -46l47 46l-1 266c0 1 -15 16 -45 45zM130 430l-1 149l-45 45l-48 -47v-147l47 -47zM276 325h25l47 47l-46 47h-26c-9 -10 -25 -26 -46 -47zM141 325h25c2 3 18 18 47 47l-46 47h-26
+c-10 -11 -26 -26 -47 -47zM328 736c-18 -16 -23 -22 -24 -23h-32l-23 23l23 24l33 -1zM210 736c-19 -19 -22 -22 -23 -24h-33c-14 15 -22 23 -23 24l23 23l33 -1c1 0 8 -7 23 -22z" />
+ <glyph glyph-name="currency" unicode="&#xa4;" horiz-adv-x="498"
+d="M182 383h135l48 48l-47 48h-136l-48 -48zM319 226h-136l-48 -47l49 -49h135l48 48zM117 515v-82h-82zM123 92v82h-82zM378 513v-82h82c-43 44 -71 71 -82 82zM378 94v82h82c-27 -27 -54 -55 -82 -82zM423 236v135l-49 49l-48 -48v-136l49 -48zM174 236v135l-48 49
+l-48 -48v-136l48 -48z" />
+ <glyph glyph-name="guilsinglleft" unicode="&#x2039;" horiz-adv-x="324"
+d="M213 416c-2 -1 -13 -12 -47 -46l-37 -1l-46 46l46 48h37zM83 224l47 47h36l46 -46l-46 -47h-37zM118 358v-77l-46 -46l-47 47v75c14 16 30 31 46 47zM181 42v129l47 47l46 -46v-130h-93zM222 427c-17 17 -33 33 -46 47v129l47 47l46 -46v-130z" />
+ <glyph glyph-name="guilsinglright" unicode="&#x203a;" horiz-adv-x="321"
+d="M86 416c2 -1 13 -12 47 -46l36 -1c4 3 19 18 47 46l-47 48h-37c-1 -2 -10 -11 -46 -47zM215 224c-3 4 -18 19 -46 47h-36c-2 -2 -17 -18 -47 -46l47 -47h36zM181 358v-77l46 -46l47 47v75c-15 15 -30 31 -47 47zM118 42v129l-47 47l-46 -46v-130h93zM76 427l47 47v129
+l-47 47l-46 -46v-130z" />
+ <glyph glyph-name="daggerdbl" unicode="&#x2021;" horiz-adv-x="507"
+d="M289 470v115l-48 48l-49 -48v-115l48 -48zM285 294v60l-47 48l-49 -49v-60l48 -48zM418 459h-115l-48 -48l48 -48h115l48 48zM176 461h-115l-48 -48l48 -48h115l48 48zM289 110v68l-48 48l-49 -49v-67l48 -49zM285 -122v116l-47 47l-49 -48v-115l48 -48zM418 99h-115
+l-48 -48l48 -49h115l48 49zM176 101h-115l-48 -48l48 -48h115l48 48z" />
+ <glyph glyph-name="quotesinglbase" unicode="&#x201a;" horiz-adv-x="225"
+d="M187 46l-47 -47h-65c0 1 -15 16 -46 47l46 46h65c2 -1 28 -27 47 -46zM241 -10v-76l-46 -46l-47 47v75c15 15 30 30 46 47z" />
+ <glyph glyph-name="quotedblbase" unicode="&#x201e;" horiz-adv-x="418"
+d="M184 50l-47 -47h-64c-1 0 -16 16 -47 47l47 46l66 -1zM238 -6v-77l-45 -46l-48 48v75c16 14 31 30 47 46zM393 46l-47 -47h-64c0 1 -16 16 -47 47l47 46l66 -1zM448 -10v-76l-46 -46c-4 3 -20 19 -48 47v75c15 15 31 30 47 47z" />
+ <glyph glyph-name="perthousand" unicode="&#x2030;" horiz-adv-x="883"
+d="M315 445l1 142c2 5 42 43 46 46c1 -1 16 -17 47 -47v-141l-47 -47zM266 235l2 147c15 15 30 29 44 45c1 -1 17 -17 47 -48v-144c-3 -4 -18 -19 -46 -47zM211 31v142l46 46l47 -47v-141l-46 -46c-8 6 -23 22 -47 46zM59 580h81c12 12 20 20 23 24l-23 23h-81
+c-15 -15 -22 -23 -24 -23zM169 598l-23 -23v-74l23 -24l23 24v74zM169 466c-16 -17 -22 -23 -23 -24v-75l23 -23l23 23v76zM53 501l-1 75l-22 22l-24 -24v-73l24 -24zM29 344c1 0 9 8 24 24v74c-6 8 -14 15 -23 24c-3 -2 -11 -10 -24 -24v-75zM140 361h-82l-23 -23
+c2 -1 10 -9 24 -23h81l23 23zM493 267h81c12 12 20 20 23 24l-23 23h-81c-15 -14 -23 -22 -24 -23zM603 285l-24 -23v-74l24 -23l23 23v74zM603 153c-18 -16 -23 -22 -24 -23v-75l24 -24l23 23v76c0 1 -8 8 -23 23zM487 188l-1 75c-18 18 -21 21 -23 22l-23 -23v-74
+c14 -14 22 -22 23 -24zM463 31c0 1 8 9 24 24v75c-8 6 -15 14 -24 23l-23 -23v-75c1 -2 9 -10 23 -24zM574 49h-82l-23 -23l24 -24h81l23 23c-3 4 -11 12 -23 24zM707 262h81l24 24l-23 23h-82c-14 -15 -22 -22 -23 -23zM818 280l-24 -23v-74l24 -24l23 24v74zM818 148
+c-2 -1 -22 -21 -24 -24v-75l23 -23l24 23l-1 76c-1 2 -8 9 -22 23zM701 183l-1 75l-22 22l-23 -24v-73c13 -14 21 -22 23 -24zM678 26c1 2 9 10 23 24v74c-6 8 -14 15 -23 24c-2 -2 -10 -10 -23 -24v-75zM788 43h-81l-24 -23c2 -1 10 -9 24 -23h81c14 13 22 21 24 23
+c-4 3 -12 11 -24 23z" />
+ <glyph glyph-name="Acircumflex" unicode="&#xc2;" horiz-adv-x="456"
+d="M135 530h163c20 21 36 36 47 47l-46 46h-163l-47 -46zM356 566l-47 -47v-148l48 -46l46 46v148zM356 301l-47 -47v-212l47 -47l47 47v213c-2 1 -11 10 -47 46zM124 371l-1 148c-2 5 -42 43 -46 46l-47 -47v-147l47 -47zM77 -4l47 47v211l-47 47l-47 -46v-213
+c4 -3 19 -18 47 -46zM135 265h162c16 14 31 30 48 47l-47 46h-163l-47 -47zM265 666l-23 24v32l23 23l24 -23l-1 -33zM169 745l24 -24v-31l-24 -24c-7 8 -15 16 -23 24v32zM236 728h-38l-23 23c2 1 10 9 24 23h37l24 -23c-1 -1 -8 -9 -24 -23z" />
+ <glyph glyph-name="Ecircumflex" unicode="&#xca;"
+d="M147 530h207c16 14 31 30 48 47l-47 46h-208l-47 -47zM42 623v-82l82 82h-82zM135 371v148l-46 46l-47 -47v-148l47 -46zM88 58c1 0 16 16 47 47v149c-9 9 -25 25 -46 47c-23 -22 -38 -38 -47 -47v-150zM355 92h-209l-46 -46l47 -47h208c15 15 30 30 46 47
+c-21 22 -37 37 -46 46zM42 81v-82h82c-11 12 -39 39 -82 82zM147 264h130c10 11 26 26 47 47l-46 47h-131c0 -1 -16 -16 -47 -47zM264 667l-23 24v32l23 23l23 -23v-33zM168 746c1 -2 9 -10 23 -24v-31c-14 -15 -22 -23 -23 -24c-7 8 -15 16 -23 24v32zM235 729h-38l-23 23
+l23 23h38l23 -23z" />
+ <glyph glyph-name="Aacute" unicode="&#xc1;" horiz-adv-x="456"
+d="M135 530h163c20 21 36 36 47 47l-46 46h-163l-47 -46zM356 566l-47 -47v-148l48 -46l46 46v148zM356 301l-47 -47v-212l47 -47l47 47v213c-2 1 -11 10 -47 46zM124 371l-1 148c-2 5 -42 43 -46 46l-47 -47v-147l47 -47zM77 -4l47 47v211l-47 47l-47 -46v-213
+c4 -3 19 -18 47 -46zM135 265h162c16 14 31 30 48 47l-47 46h-163l-47 -47zM263 768v-33l-39 -39h-33v33l41 39h31z" />
+ <glyph glyph-name="Edieresis" unicode="&#xcb;"
+d="M147 530h207c16 14 31 30 48 47l-47 46h-208l-47 -47zM42 623v-82l82 82h-82zM135 371v148l-46 46l-47 -47v-148l47 -46zM88 58c1 0 16 16 47 47v149c-9 9 -25 25 -46 47c-23 -22 -38 -38 -47 -47v-150zM355 92h-209l-46 -46l47 -47h208c15 15 30 30 46 47
+c-21 22 -37 37 -46 46zM42 81v-82h82c-11 12 -39 39 -82 82zM147 264h130c10 11 26 26 47 47l-46 47h-131c0 -1 -16 -16 -47 -47zM293 743c-19 -19 -22 -22 -23 -24h-33c-14 15 -22 23 -23 24l23 23h33c0 -1 8 -8 23 -23zM175 743c-16 -17 -22 -23 -23 -24h-32
+c-15 14 -23 22 -24 24l23 23l33 -1c1 0 8 -7 23 -22z" />
+ <glyph glyph-name="Egrave" unicode="&#xc8;"
+d="M147 530h207c16 14 31 30 48 47l-47 46h-208l-47 -47zM42 623v-82l82 82h-82zM135 371v148l-46 46l-47 -47v-148l47 -46zM88 58c1 0 16 16 47 47v149c-9 9 -25 25 -46 47c-23 -22 -38 -38 -47 -47v-150zM355 92h-209l-46 -46l47 -47h208c15 15 30 30 46 47
+c-21 22 -37 37 -46 46zM42 81v-82h82c-11 12 -39 39 -82 82zM147 264h130c10 11 26 26 47 47l-46 47h-131c0 -1 -16 -16 -47 -47zM183 769v-34l39 -38h33v32l-41 40h-31z" />
+ <glyph glyph-name="Iacute" unicode="&#xcd;" horiz-adv-x="193"
+d="M93 632l-47 -47v-207l48 -47l46 46v209zM93 308l-47 -47v-211c16 -14 31 -30 47 -46l47 46l-2 213c-3 3 -17 18 -45 45zM132 778v-33l-39 -39h-33v33c13 13 26 26 40 39h32z" />
+ <glyph glyph-name="Icircumflex" unicode="&#xce;" horiz-adv-x="185"
+d="M85 632l-47 -47v-207l47 -47l46 46v209zM85 308l-47 -47v-211c15 -15 30 -30 47 -46l46 46l-1 213zM141 669l-23 23v32l23 23l23 -23v-33c-2 -1 -9 -8 -23 -22zM45 747l23 -23v-32c-14 -15 -22 -22 -23 -23c-8 7 -16 15 -23 23v32zM112 730h-38l-24 23l24 24h38l23 -24z
+" />
+ <glyph glyph-name="Idieresis" unicode="&#xcf;" horiz-adv-x="184"
+d="M84 632l-47 -47v-207l47 -47l46 46v209zM84 308l-47 -47v-211c15 -15 30 -30 47 -46l46 46l-1 213zM191 741c-19 -19 -22 -22 -23 -24h-32l-24 24l23 23h34c0 -1 7 -8 22 -23zM74 741l-24 -24h-32l-24 24l24 23l33 -1c2 -1 9 -8 23 -22z" />
+ <glyph glyph-name="Igrave" unicode="&#xcc;" horiz-adv-x="193"
+d="M93 632l-47 -47v-207l48 -47l46 46v209zM93 308l-47 -47v-211c16 -14 31 -30 47 -46l47 46l-2 213c-3 3 -17 18 -45 45zM60 770v-33l39 -39h33v33c-13 13 -26 26 -40 39h-32z" />
+ <glyph glyph-name="Oacute" unicode="&#xd3;" horiz-adv-x="458"
+d="M149 528h162l47 47l-46 47h-163l-47 -47zM370 564l-47 -47v-147l47 -47l46 46v149zM370 300l-47 -47v-150c9 -9 24 -25 47 -47l46 46v151c-1 2 -10 11 -46 47zM137 369l-1 149c-32 32 -44 43 -45 46l-47 -47v-148c11 -12 27 -28 46 -47zM90 56c0 1 16 16 47 47v150
+l-47 47c-19 -20 -35 -36 -46 -47v-150c3 -4 18 -19 46 -47zM311 91h-163l-47 -46l48 -48h162l47 47zM275 767v-33l-40 -39h-33v33l41 39h32z" />
+ <glyph glyph-name="Ocircumflex" unicode="&#xd4;" horiz-adv-x="458"
+d="M149 528h162l47 47l-46 47h-163l-47 -47zM370 564l-47 -47v-147l47 -47l46 46v149zM370 300l-47 -47v-150c9 -9 24 -25 47 -47l46 46v151c-1 2 -10 11 -46 47zM137 369l-1 149c-32 32 -44 43 -45 46l-47 -47v-148c11 -12 27 -28 46 -47zM90 56c0 1 16 16 47 47v150
+l-47 47c-19 -20 -35 -36 -46 -47v-150c3 -4 18 -19 46 -47zM311 91h-163l-47 -46l48 -48h162l47 47zM278 666l-24 23v32c8 7 16 15 24 24l23 -24v-33c-2 -1 -9 -8 -23 -22zM182 744l23 -23v-32l-23 -23c-8 7 -16 15 -23 23v32zM249 727h-38l-24 23l24 24h38l23 -24
+c-1 0 -8 -8 -23 -23z" />
+ <glyph glyph-name="Ograve" unicode="&#xd2;" horiz-adv-x="458"
+d="M149 528h162l47 47l-46 47h-163l-47 -47zM370 564l-47 -47v-147l47 -47l46 46v149zM370 300l-47 -47v-150c9 -9 24 -25 47 -47l46 46v151c-1 2 -10 11 -46 47zM137 369l-1 149c-32 32 -44 43 -45 46l-47 -47v-148c11 -12 27 -28 46 -47zM90 56c0 1 16 16 47 47v150
+l-47 47c-19 -20 -35 -36 -46 -47v-150c3 -4 18 -19 46 -47zM311 91h-163l-47 -46l48 -48h162l47 47zM181 769v-34l40 -38h33v32l-41 40h-32z" />
+ <glyph glyph-name="Uacute" unicode="&#xda;" horiz-adv-x="465"
+d="M371 622l-47 -47v-208l47 -46l47 46v208zM371 297l-47 -47v-150l47 -47l47 47l-2 152zM139 367l-2 210c-1 0 -12 11 -45 44l-47 -47v-207l47 -47zM92 54l47 47v149l-47 47l-47 -46v-151c4 -3 19 -18 47 -46zM313 89h-164l-46 -46l47 -48h163c15 15 30 31 47 47
+c-5 5 -21 20 -47 47zM268 764v-33l-40 -39h-33v33l41 39h32z" />
+ <glyph glyph-name="Ucircumflex" unicode="&#xdb;" horiz-adv-x="465"
+d="M371 622l-47 -47v-208l47 -46l47 46v208zM371 297l-47 -47v-150l47 -47l47 47l-2 152zM139 367l-2 210c-1 0 -12 11 -45 44l-47 -47v-207l47 -47zM92 54l47 47v149l-47 47l-47 -46v-151c4 -3 19 -18 47 -46zM313 89h-164l-46 -46l47 -48h163c15 15 30 31 47 47
+c-5 5 -21 20 -47 47zM283 659l-24 24v32c7 7 15 15 24 23l23 -23v-33zM187 738l23 -23v-32c-15 -15 -23 -22 -23 -24l-24 24v32c2 1 10 9 24 23zM254 721h-39l-23 23c2 1 10 9 24 23h38l23 -23z" />
+ <glyph glyph-name="Ugrave" unicode="&#xd9;" horiz-adv-x="465"
+d="M371 622l-47 -47v-208l47 -46l47 46v208zM371 297l-47 -47v-150l47 -47l47 47l-2 152zM139 367l-2 210c-1 0 -12 11 -45 44l-47 -47v-207l47 -47zM92 54l47 47v149l-47 47l-47 -46v-151c4 -3 19 -18 47 -46zM313 89h-164l-46 -46l47 -48h163c15 15 30 31 47 47
+c-5 5 -21 20 -47 47zM181 769v-34l40 -38h33v32l-41 40h-32z" />
+ <glyph glyph-name="circumflex" unicode="&#x2c6;" horiz-adv-x="213"
+d="M60 537l23 23v32c-14 16 -22 23 -23 24l-24 -24l1 -33c2 -1 9 -8 23 -22zM156 615c-2 -1 -10 -9 -24 -23v-32c15 -14 23 -22 24 -23l23 23v32zM89 598h38l23 23c-1 2 -9 10 -23 24h-38l-24 -24c1 0 9 -8 24 -23z" />
+ <glyph glyph-name="tilde" unicode="&#x2dc;" horiz-adv-x="261"
+d="M124 611l-24 -24h-16c-15 14 -23 22 -24 24l24 23l17 -1c2 -1 9 -8 23 -22zM151 583v-23l-23 -23l-24 24v22l24 23zM200 535c0 -1 -6 -7 -23 -24h-17l-23 23l23 24l17 -1c1 0 8 -7 23 -22zM227 585v-23l-23 -23c-5 5 -13 13 -23 24v22l23 23zM78 581v-23l-23 -23l-24 24
+v22c7 7 15 15 24 23z" />
+ <glyph glyph-name="cedilla" unicode="&#xb8;" horiz-adv-x="102"
+d="M83 -43h-25l-12 12l12 12h25l12 -12zM85 -61v16l12 12l12 -12v-16l-12 -12zM85 -103v13l12 12l12 -12v-13l-12 -12zM49 -106h34l12 -11l-12 -13h-34l-12 12z" />
+ </font>
+</defs></svg>
BIN  webfui-examples/resources/public/css/POCKC___.ttf
Binary file not shown
BIN  webfui-examples/resources/public/css/POCKC___.woff
Binary file not shown
9 webfui-examples/resources/public/css/add_two_numbers.css
@@ -0,0 +1,9 @@
+body{background-color:dodgerblue;
+ text-align:center;
+ font-size:3em}
+div{padding:2em}
+input{font-size:1em;
+ background-color:lightblue;
+ width:5em}
+span{background-color:lightblue;
+ padding:0.1em}
10 webfui-examples/resources/public/css/add_two_numbers_low_level.css
@@ -0,0 +1,10 @@
+body{background-color:dodgerblue;
+ text-align:center;
+ font-family:sans-serif;
+ font-size:3em}
+div{padding:2em}
+input{font-size:1em;
+ background-color:lightblue;
+ width:5em}
+span{background-color:lightblue;
+ padding:0.1em}
43 webfui-examples/resources/public/css/calculator.css
@@ -0,0 +1,43 @@
+@font-face {font-family:"Pocket Calculator";src:url("POCKC___.eot?") format("eot"),url("POCKC___.woff") format("woff"),url("POCKC___.ttf") format("truetype"),url("POCKC___.svg#PocketCalculator") format("svg");font-weight:normal;font-style:normal;}
+html, body, div, span, object,form,input,text,h1,h2,button,label,a,img{-moz-user-select:none;
+ -webkit-user-select:none;
+ -webkit-user-drag:none}
+textarea,input[type='text']{-webkit-user-select:text;
+ -moz-user-select:text}
+body{background-color:grey;
+ text-align:center;
+ font-weight:bold;
+ font-family:sans-serif;
+ font-size:3em}
+table{margin-top:1em;
+ background-color:black;
+ margin-left:auto;
+ margin-right:auto;
+ padding:0.2em;
+ -webkit-border-radius:0.5em;
+ border-radius:0.5em}
+div{text-align:center;
+ margin:0.2em;
+ width:2em;
+ padding-top:0.4em;
+ padding-bottom:0.35em;
+ -webkit-border-radius:0.3em;
+ border-radius:0.3em;
+ background-color:silver}
+#ms,#mr,#ac{background-color:crimson}
+#mult,#div,#plus,#minus,#period{background-color:tan}
+#eq{width:4.5em;background-color:orange}
+#display{background-color:turquoise;
+ width:6.5em;
+ -webkit-border-radius:0.2em;
+ border-radius:0.2em;
+ padding-top:0.1em;
+ padding-bottom:0.0em;
+ padding-right:0.35em;
+ font-family:"Pocket Calculator";
+ font-size:1.4em;
+ text-align:right}
+div{cursor:pointer}
+div:active{-webkit-transform:scale(0.9);
+ -moz-transform:scale(0.9);
+ opacity:0.7}
43 webfui-examples/resources/public/css/calculator_ajax.css
@@ -0,0 +1,43 @@
+@font-face {font-family:"Pocket Calculator";src:url("POCKC___.eot?") format("eot"),url("POCKC___.woff") format("woff"),url("POCKC___.ttf") format("truetype"),url("POCKC___.svg#PocketCalculator") format("svg");font-weight:normal;font-style:normal;}
+html, body, div, span, object,form,input,text,h1,h2,button,label,a,img{-moz-user-select:none;
+ -webkit-user-select:none;
+ -webkit-user-drag:none}
+textarea,input[type='text']{-webkit-user-select:text;
+ -moz-user-select:text}
+body{background-color:grey;
+ text-align:center;
+ font-weight:bold;
+ font-family:sans-serif;
+ font-size:3em}
+table{margin-top:1em;
+ background-color:black;
+ margin-left:auto;
+ margin-right:auto;
+ padding:0.2em;
+ -webkit-border-radius:0.5em;
+ border-radius:0.5em}
+div{text-align:center;
+ margin:0.2em;
+ width:2em;
+ padding-top:0.4em;
+ padding-bottom:0.35em;
+ -webkit-border-radius:0.3em;
+ border-radius:0.3em;
+ background-color:silver}
+#ms,#mr,#ac{background-color:crimson}
+#mult,#div,#plus,#minus,#period{background-color:tan}
+#eq{width:4.5em;background-color:orange}
+#display{background-color:turquoise;
+ width:6.5em;
+ -webkit-border-radius:0.2em;
+ border-radius:0.2em;
+ padding-top:0.1em;
+ padding-bottom:0.0em;
+ padding-right:0.35em;
+ font-family:"Pocket Calculator";
+ font-size:1.4em;
+ text-align:right}
+div{cursor:pointer}
+div:active{-webkit-transform:scale(0.9);
+ -moz-transform:scale(0.9);
+ opacity:0.7}
43 webfui-examples/resources/public/css/calculator_many.css
@@ -0,0 +1,43 @@
+@font-face {font-family:"Pocket Calculator";src:url("POCKC___.eot?") format("eot"),url("POCKC___.woff") format("woff"),url("POCKC___.ttf") format("truetype"),url("POCKC___.svg#PocketCalculator") format("svg");font-weight:normal;font-style:normal;}
+html, body, div, span, object,form,input,text,h1,h2,button,label,a,img{-moz-user-select:none;
+ -webkit-user-select:none;
+ -webkit-user-drag:none}
+textarea,input[type='text']{-webkit-user-select:text;
+ -moz-user-select:text}
+body{background-color:grey;
+ text-align:center;
+ font-weight:bold;
+ font-family:sans-serif;
+ font-size:0.4em}
+table.calc{margin-top:1em;
+ background-color:black;
+ margin-left:auto;
+ margin-right:auto;
+ padding:0.2em;
+ -webkit-border-radius:0.5em;
+ border-radius:0.5em}
+div{text-align:center;
+ margin:0.2em;
+ width:2em;
+ padding-top:0.4em;
+ padding-bottom:0.35em;
+ -webkit-border-radius:0.3em;
+ border-radius:0.3em;
+ background-color:silver}
+#ms,#mr,#ac{background-color:crimson}
+#mult,#div,#plus,#minus,#period{background-color:tan}
+#eq{width:4.5em;background-color:orange}
+#display{background-color:turquoise;
+ width:6.5em;
+ -webkit-border-radius:0.2em;
+ border-radius:0.2em;
+ padding-top:0.1em;
+ padding-bottom:0.0em;
+ padding-right:0.35em;
+ font-family:"Pocket Calculator";
+ font-size:1.4em;
+ text-align:right}
+div{cursor:pointer}
+div:active{-webkit-transform:scale(0.9);
+ -moz-transform:scale(0.9);
+ opacity:0.7}
22 webfui-examples/resources/public/css/inverse_kinematics.css
@@ -0,0 +1,22 @@
+html, body, div, span, object,form,input,text,h1,h2,button,label,a,img{-moz-user-select:none;
+ -webkit-user-select:none;
+ -webkit-user-drag:none}
+body{margin:0;
+ padding:0;
+ position:absolute;
+ bottom:0px;
+ top:0px;
+ left:0px;
+ right:0px;
+ overflow:hidden}
+.node{opacity:0.5;
+ position:absolute;
+ color:white;
+ padding:5px;
+ font-weight:bold;
+ background-color:red}
+.destination{background-color:blue}
+.box{opacity:0.5;
+ position:absolute;
+ background-color:black;
+ -webkit-transform-origin:0% 0%}
31 webfui-examples/resources/public/css/mouse_tracking.css
@@ -0,0 +1,31 @@
+html, body, div, span, object,form,input,text,h1,h2,button,label,a,img{-moz-user-select:none;
+ -webkit-user-select:none;
+ -webkit-user-drag:none;
+}
+body{bottom:0px;
+ top:0px;
+ left:0px;
+ right:0px;
+ padding:0px;
+ margin:0px;
+ position:absolute;
+ font-size:3em;
+ overflow:hidden;
+ color:white}
+div.layer{
+background-color:blue;
+ position:absolute;
+top:0;
+left:0;
+}
+div{background-color:blue;
+ text-align:center;
+ position:absolute;
+ font-size:1em;
+ padding:0px;
+ margin:0px;
+ -webkit-border-radius:0.6em;
+ cursor:pointer}
+.dragged{position:absolute;
+ opacity:0.5;
+ background-color:black}
0  webfui-examples/resources/public/css/scrolling.css
No changes.
9 webfui-examples/resources/public/css/webfui_examples.css
@@ -0,0 +1,9 @@
+body{background-color:dodgerblue;
+ text-align:center;
+ font-size:3em}
+div{padding:2em}
+input{font-size:1em;
+ background-color:lightblue;
+ width:5em}
+span{background-color:lightblue;
+ padding:0.1em}
16 webfui-examples/resources/public/index.html
@@ -0,0 +1,16 @@
+<body>
+ <h1>Webfui Examples</h1>
+<p>(Right now Chrome & Safari work 100%, Firefox will be ready shortly.)</p>
+ <p>
+ <ol>
+ <li><a href="add_two_numbers_low_level">Add Two Numbers (low level version)</a></li>
+ <li><a href="add_two_numbers">Add Two Numbers (version with elegant code)</a></li>
+ <li><a href="scrolling">Scrollbar Plugin Example</a></li>
+ <li><a href="mouse_tracking">Mouse Plugin Example</a></li>
+ <li><a href="calculator">Calculator</a></li>
+ <li><a href="calculator_many">Many Calculators</a></li>
+ <li><a href="calculator_ajax">Calculator with Serve-side Memory</a></li>
+ <li><a href="inverse_kinematics">Inverse Kinematics</a></li>
+ </ol>
+ </p>
+</body>
19,235 webfui-examples/resources/public/js/core.js
19,235 additions, 0 deletions not shown
25 webfui-examples/src-clj/webfui_examples/server.clj
@@ -0,0 +1,25 @@
+(ns webfui-examples.server
+ (:use [noir.core :only [defpage]]
+ [noir.response :only [redirect]])
+ (:require [noir.server :as server]))
+
+(server/load-views "src-clj/webfui_examples/views/")
+
+(defpage "/" []
+ (redirect "/index.html"))
+
+(def memory (atom 0))
+
+(defpage [:get "/memory"] []
+ (str @memory))
+
+(defpage [:put "/memory/:value"] {:keys [value]}
+ (reset! memory value)
+ (pr-str value))
+
+(defn -main [& m]
+ (let [mode (keyword (or (first m) :dev))
+ port (Integer. (get (System/getenv) "PORT" "8080"))]
+ (server/start port {:mode mode
+ :ns 'webfui-examples})))
+
8 webfui-examples/src-clj/webfui_examples/views/add_two_numbers.clj
@@ -0,0 +1,8 @@
+(ns webfui-examples.views.add-two-numbers
+ (:require [webfui-examples.views.common :as common]
+ [noir.content.getting-started])
+ (:use [noir.core :only [defpage]]
+ [hiccup.core :only [html]]))
+
+(defpage "/add_two_numbers" []
+ (common/layout "add_two_numbers"))
8 webfui-examples/src-clj/webfui_examples/views/add_two_numbers_low_level.clj
@@ -0,0 +1,8 @@
+(ns webfui-examples.views.add-two-numbers-low-level
+ (:require [webfui-examples.views.common :as common]
+ [noir.content.getting-started])
+ (:use [noir.core :only [defpage]]
+ [hiccup.core :only [html]]))
+
+(defpage "/add_two_numbers_low_level" []
+ (common/layout "add_two_numbers_low_level"))
8 webfui-examples/src-clj/webfui_examples/views/calculator.clj
@@ -0,0 +1,8 @@
+(ns webfui-examples.views.calculator
+ (:require [webfui-examples.views.common :as common]
+ [noir.content.getting-started])
+ (:use [noir.core :only [defpage]]
+ [hiccup.core :only [html]]))
+
+(defpage "/calculator" []
+ (common/layout "calculator"))
8 webfui-examples/src-clj/webfui_examples/views/calculator_ajax.clj
@@ -0,0 +1,8 @@
+(ns webfui-examples.views.calculator-ajax
+ (:require [webfui-examples.views.common :as common]
+ [noir.content.getting-started])
+ (:use [noir.core :only [defpage]]
+ [hiccup.core :only [html]]))
+
+(defpage "/calculator_ajax" []
+ (common/layout "calculator_ajax"))
8 webfui-examples/src-clj/webfui_examples/views/calculator_many.clj
@@ -0,0 +1,8 @@
+(ns webfui-examples.views.calculator-many
+ (:require [webfui-examples.views.common :as common]
+ [noir.content.getting-started])
+ (:use [noir.core :only [defpage]]
+ [hiccup.core :only [html]]))
+
+(defpage "/calculator_many" []
+ (common/layout "calculator_many"))
13 webfui-examples/src-clj/webfui_examples/views/common.clj
@@ -0,0 +1,13 @@
+(ns webfui-examples.views.common
+ (:use [noir.core :only [defpartial]]
+ [hiccup.page :only [include-css include-js html5]]
+ [hiccup.element :only [javascript-tag]]))
+
+(defpartial layout [name]
+ (html5
+ [:head
+ [:title "webfui-examples"]
+ (include-css (str "/css/" name ".css"))
+ (javascript-tag "var CLOSURE_NO_DEPS = true;")
+ (include-js (str "/js/" name ".js"))]
+ [:body]))
8 webfui-examples/src-clj/webfui_examples/views/inverse_kinematics.clj
@@ -0,0 +1,8 @@
+(ns webfui-examples.views.inverse-kinematics
+ (:require [webfui-examples.views.common :as common]
+ [noir.content.getting-started])
+ (:use [noir.core :only [defpage]]
+ [hiccup.core :only [html]]))
+
+(defpage "/inverse_kinematics" []
+ (common/layout "inverse_kinematics"))
8 webfui-examples/src-clj/webfui_examples/views/mouse_tracking.clj
@@ -0,0 +1,8 @@
+(ns webfui-examples.views.mouse-tracking
+ (:require [webfui-examples.views.common :as common]
+ [noir.content.getting-started])
+ (:use [noir.core :only [defpage]]
+ [hiccup.core :only [html]]))
+
+(defpage "/mouse_tracking" []
+ (common/layout "mouse_tracking"))
8 webfui-examples/src-clj/webfui_examples/views/scrolling.clj
@@ -0,0 +1,8 @@
+(ns webfui-examples.views.scrolling
+ (:require [webfui-examples.views.common :as common]
+ [noir.content.getting-started])
+ (:use [noir.core :only [defpage]]
+ [hiccup.core :only [html]]))
+
+(defpage "/scrolling" []
+ (common/layout "scrolling"))
9 webfui-examples/src-clj/webfui_examples/views/welcome.clj
@@ -0,0 +1,9 @@
+(ns webfui-examples.views.welcome
+ (:require [webfui-examples.views.common :as common]
+ [noir.content.getting-started])
+ (:use [noir.core :only [defpage]]
+ [hiccup.core :only [html]]))
+
+(defpage "/welcome" []
+ (common/layout
+ [:p "Welcome to webfui-examples"]))
23 webfui-examples/src-cljs/add_two_numbers/core.cljs
@@ -0,0 +1,23 @@
+(ns webfui-examples.add-two-numbers.core
+ (:use [webfui.framework :only [launch-app]])
+ (:use-macros [webfui.framework.macros :only [add-dom-watch]]))
+
+(defn render-all [state]
+ (let [{:keys [a b]} state]
+ [:div [:input#a {:watch :watch :value a}]
+ " plus "
+ [:input#b {:watch :watch :value b}]
+ [:p " equals "]
+ [:span (+ a b)]]))
+
+(defn valid-integer [s]
+ (and (< (count s) 15) (re-matches #"^[0-9]+$" s)))
+
+(add-dom-watch :watch [state new-element]
+ (let [{:keys [value id]} (second new-element)]
+ (when (valid-integer value)
+ {id (js/parseInt value)})))
+
+(launch-app (atom {:a 0 :b 0}) render-all)
+
+
40 webfui-examples/src-cljs/add_two_numbers_low_level/core.cljs
@@ -0,0 +1,40 @@
+(ns webfui-examples.add-two-numbers-low-level.core
+ (:use [webfui.dom :only [defdom add-dom-watch]]
+ [webfui.state-patches :only [patch]]))
+
+(def my-dom (atom nil))
+
+(defdom my-dom)
+
+(def a 0)
+(def b 0)
+
+(defn render-all [old-dom]
+ [:div [:input {:type :text :watch :a-watch :value a}]
+ " plus "
+ [:input {:type :text :watch :b-watch :value b}]
+ [:p " equals "]
+ [:span (+ a b)]])
+
+(defn update-dom []
+ (swap! my-dom render-all))
+
+(update-dom)
+
+(defn valid-integer [s]
+ (and (< (count s) 15) (re-matches #"^[0-9]+$" s)))
+
+(add-dom-watch :a-watch
+ (fn [old-element new-element]
+ (let [new-a (get-in new-element [1 :value])]
+ (when (valid-integer new-a)
+ (def a (js/parseInt new-a))))
+ (update-dom)))
+
+(add-dom-watch :b-watch
+ (fn [old-element new-element]
+ (let [new-b (get-in new-element [1 :value])]
+ (when (valid-integer new-b)
+ (def b (js/parseInt new-b))))
+ (update-dom)))
+
92 webfui-examples/src-cljs/calculator/core.cljs
@@ -0,0 +1,92 @@
+(ns webfui-examples.calculator.core
+ (:use [webfui.framework :only [launch-app]]
+ [webfui.utilities :only [get-attribute clicked]])
+ (:use-macros [webfui.framework.macros :only [add-mouse-watch]]))
+
+(def initial-state {:amount nil
+ :amount-decimal nil
+ :accumulator 0
+ :operation nil
+ :memory 0})
+
+(def calculator-keys [[[:ac "AC" :ac] [:ms "MS" :ms] [:mr "MR" :mr] [:div "÷" :op]]
+ [[:7 "7" :num] [:8 "8" :num] [:9 "9" :num] [:mult "×" :op]]
+ [[:4 "4" :num] [:5 "5" :num] [:6 "6" :num] [:minus "-" :op]]
+ [[:1 "1" :num] [:2 "2" :num] [:3 "3" :num] [:plus "+" :op]]
+ [[:period "." :period] [:0 "0" :num] [:eq "=" :op]]])
+
+(def operations {:div /
+ :mult *
+ :minus -
+ :plus +
+ :eq identity})
+
+(defn right-shorten [s]
+ (subs s 0 (dec (count s))))
+
+(defn format-accumulator [accumulator]
+ (loop [s (.toFixed accumulator 12)]
+ (case (last s)
+ \0 (recur (right-shorten s))
+ \. (right-shorten s)
+ s)))
+
+(defn check-overflow [s]
+ (cond (and (<= (count s) 12) (not= (last s) \.)) s
+ (some (partial = \.) s) (recur (right-shorten s))
+ :else "OVERFLOW"))
+
+(defn render-display [{:keys [amount amount-decimal accumulator]}]
+ (check-overflow (cond (not amount) (format-accumulator accumulator)
+ amount-decimal (.toFixed amount amount-decimal)
+ :else (str amount))))
+
+(defn render-all [state]
+ [:table [:tbody [:tr [:td {:colspan 4}
+ [:div#display (render-display state)]]]
+ (for [row calculator-keys]