Repository: brunchboy/afterglow Branch: main Commit: bb5dfd1042f7 Files: 169 Total size: 223.1 MB Directory structure: gitextract_k9q7365g/ ├── .gitattributes ├── .github/ │ ├── scripts/ │ │ ├── build.sh │ │ └── build_guide.sh │ └── workflows/ │ └── uberjar.yml ├── .gitignore ├── .htmltest.yml ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── doc/ │ ├── README.md │ ├── antora.yml │ ├── ds.yml │ ├── embedded.yml │ ├── github-actions.yml │ ├── modules/ │ │ └── ROOT/ │ │ ├── assets/ │ │ │ └── source/ │ │ │ ├── Afterglow logo.ai │ │ │ ├── Blade.psd │ │ │ ├── Clojure Beam.psd │ │ │ ├── ColorPalette.psd │ │ │ ├── ColorPalette2.psd │ │ │ ├── F3.psd │ │ │ ├── Launchpad Mini.psd │ │ │ ├── Novation.psd │ │ │ ├── OLA Logo.ai │ │ │ ├── Push-2-Stopped.psd │ │ │ ├── Push2NoEffects.psd │ │ │ ├── PushNoEffects.psd │ │ │ ├── Show Space.psd │ │ │ └── WeatherSystem.psd │ │ ├── nav.adoc │ │ └── pages/ │ │ ├── README.adoc │ │ ├── color.adoc │ │ ├── cues.adoc │ │ ├── effects.adoc │ │ ├── fixture_definitions.adoc │ │ ├── launchpad.adoc │ │ ├── mapping_sync.adoc │ │ ├── metronomes.adoc │ │ ├── oscillators.adoc │ │ ├── parameters.adoc │ │ ├── push.adoc │ │ ├── push2.adoc │ │ ├── rendering_loop.adoc │ │ ├── show_space.adoc │ │ └── videos.adoc │ └── primes.md ├── logs/ │ └── README.txt ├── package.json ├── project.clj ├── resources/ │ ├── afterglow/ │ │ └── readme.txt │ ├── docs/ │ │ └── docs.md │ ├── public/ │ │ ├── css/ │ │ │ ├── bootstrap-cyborg.css │ │ │ ├── bootstrap-slider.css │ │ │ ├── bootstrap-switch.css │ │ │ ├── bootstrap-theme.css │ │ │ ├── bootstrap.css │ │ │ ├── jquery.minicolors.css │ │ │ ├── screen.css │ │ │ ├── show.css │ │ │ └── web-repl.css │ │ ├── epl-v10.html │ │ ├── font-awesome-4.5.0/ │ │ │ ├── HELP-US-OUT.txt │ │ │ ├── css/ │ │ │ │ └── font-awesome.css │ │ │ ├── fonts/ │ │ │ │ └── FontAwesome.otf │ │ │ ├── less/ │ │ │ │ ├── animated.less │ │ │ │ ├── bordered-pulled.less │ │ │ │ ├── core.less │ │ │ │ ├── fixed-width.less │ │ │ │ ├── font-awesome.less │ │ │ │ ├── icons.less │ │ │ │ ├── larger.less │ │ │ │ ├── list.less │ │ │ │ ├── mixins.less │ │ │ │ ├── path.less │ │ │ │ ├── rotated-flipped.less │ │ │ │ ├── stacked.less │ │ │ │ └── variables.less │ │ │ └── scss/ │ │ │ ├── _animated.scss │ │ │ ├── _bordered-pulled.scss │ │ │ ├── _core.scss │ │ │ ├── _fixed-width.scss │ │ │ ├── _icons.scss │ │ │ ├── _larger.scss │ │ │ ├── _list.scss │ │ │ ├── _mixins.scss │ │ │ ├── _path.scss │ │ │ ├── _rotated-flipped.scss │ │ │ ├── _stacked.scss │ │ │ ├── _variables.scss │ │ │ └── font-awesome.scss │ │ ├── fonts/ │ │ │ ├── Lekton/ │ │ │ │ └── SIL Open Font License.txt │ │ │ ├── Open_Sans_Condensed/ │ │ │ │ └── LICENSE.txt │ │ │ └── Roboto/ │ │ │ └── LICENSE.txt │ │ ├── js/ │ │ │ ├── BootstrapMenu.js │ │ │ ├── bootstrap.js │ │ │ ├── jquery-2.1.4.js │ │ │ ├── jquery.console.js │ │ │ ├── jquery.websocket-0.0.1.js │ │ │ ├── npm.js │ │ │ ├── show_updates.js │ │ │ └── web-repl.js │ │ └── shaders/ │ │ └── vertex.glsl │ └── templates/ │ ├── about.html │ ├── base.html │ ├── console.html │ ├── cue_grid.html │ ├── current-scene-fragment.js │ ├── current-scene.json │ ├── error.html │ ├── fixture-definition.clj.template │ ├── fragment.glsl │ ├── home.html │ ├── link_menu.html │ ├── show.html │ ├── sync_menu.html │ └── visualizer.html ├── src/ │ └── afterglow/ │ ├── beyond.clj │ ├── carabiner.clj │ ├── channels.clj │ ├── controllers/ │ │ ├── ableton_push.clj │ │ ├── ableton_push_2.clj │ │ ├── color.clj │ │ ├── launchpad_mini.clj │ │ ├── launchpad_mk2.clj │ │ ├── launchpad_pro.clj │ │ └── tempo.clj │ ├── controllers.clj │ ├── core.clj │ ├── coremidi4j.clj │ ├── dj_link.clj │ ├── effects/ │ │ ├── channel.clj │ │ ├── color.clj │ │ ├── cues.clj │ │ ├── dimmer.clj │ │ ├── fun.clj │ │ ├── movement.clj │ │ ├── oscillators.clj │ │ ├── params.clj │ │ └── show_variable.clj │ ├── effects.clj │ ├── examples.clj │ ├── fixtures/ │ │ ├── american_dj.clj │ │ ├── blizzard.clj │ │ ├── chauvet.clj │ │ └── qxf.clj │ ├── fixtures.clj │ ├── init.clj │ ├── midi.clj │ ├── rhythm.clj │ ├── show.clj │ ├── show_context.clj │ ├── shows/ │ │ ├── chris.clj │ │ ├── sallie.clj │ │ └── wedding.clj │ ├── transform.clj │ ├── util.clj │ ├── version.clj │ └── web/ │ ├── handler.clj │ ├── layout.clj │ ├── middleware.clj │ ├── routes/ │ │ ├── home.clj │ │ ├── show_control.clj │ │ ├── visualizer.clj │ │ └── web_repl.clj │ └── session.clj └── test/ └── afterglow/ ├── core_test.clj ├── effects/ │ └── color_test.clj └── effects_test.clj ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitattributes ================================================ api-doc/* -diff linguist-vendored ================================================ FILE: .github/scripts/build.sh ================================================ #!/bin/bash # This script is run by GitHub Actions to build the cross-platform uberjar. # If this is a full release, tweak the project to generate the correct API doc source links. if [[ $release_snapshot == "false" ]] then # Update codox source link prefix="\/github.com\/Deep-Symmetry\/afterglow\/blob\/" sourceswap="s/${prefix}main/${prefix}${git_version}/g" mv project.clj project.clj.old sed "${sourceswap}" project.clj.old > project.clj rm -f project.clj.old fi # Make sure Antora is installed npm install # Now that the project has been tweaked if needed, do the actual build lein uberjar # Rename the output jar to where we want it. mv target/afterglow.jar "./$uberjar_name" ================================================ FILE: .github/scripts/build_guide.sh ================================================ #!/usr/bin/env bash # This script is run by GitHub Actions to build the # Antora site hosting the developer guide. set -e # Exit if any command fails. # There is no point in doing this if we lack the SSH key to publish the guide. if [ "$GUIDE_SSH_KEY" != "" ]; then # Set up node dependencies; probably redundant thanks to main workflow, but just in case... npm install # Build the cloud version of the documentation site. Note that the API docs are already # built in, from the stage of building the uberjar. npm run hosted-docs # Make sure there are no broken links in the versions we care about. curl https://htmltest.wjdp.uk | bash bin/htmltest # Publish the user guide to the right place on the Deep Symmetry web server. rsync -avz doc/build/site/ guides@deepsymmetry.org:/var/www/guides/afterglow/ else echo "No SSH key present, not building user guide." fi ================================================ FILE: .github/workflows/uberjar.yml ================================================ name: Create überjar on: push: branches: - main env: initial_description: | :construction: This is pre-release code for people who want to help test [what is going into the next release](https://github.com/Deep-Symmetry/afterglow/blob/master/CHANGELOG.md). > Don’t download this if you aren’t comfortable testing code while it is under active development! Instead, look at the [latest release](https:///github.com/Deep-Symmetry/afterglow/releases/latest). :calendar: **Ignore the “release date” above!** Because this is a snapshot release, the executables below (you may need to click to expand the Assets) will change frequently—whenever new code is pushed to the project—so you will want to _download the latest version every time you work with one_. The date you see _on each asset row_ shows you when it was last updated. Source code archive assets are not useful for snapshot releases, they will always reflect the state of the project when the snapshots began. jobs: build_uberjar: name: Build cross-platform überjar runs-on: ubuntu-latest if: "!contains(github.event.head_commit.message, '[skip ci]')" steps: - name: Check out main branch uses: actions/checkout@v3 - name: Install SSH Key uses: shimataro/ssh-key-action@v2 with: key: ${{ secrets.GUIDE_SSH_KEY }} known_hosts: 'deepsymmetry.org ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINfnL8k99MCOHLciHb7czxFCCvF3lbmY2ase2VhdvCTN' - name: Prepare Java uses: actions/setup-java@v3 with: java-version: '17' distribution: 'corretto' - name: Install clojure tools uses: DeLaGuardo/setup-clojure@13.0 with: lein: 2.11.2 - name: Determine version being built uses: Deep-Symmetry/github-version-action@v1 with: tag-var-name: release_tag - name: Determine überjar name from git version, and snapshot status run: | echo "uberjar_name=afterglow-$git_version.jar" >> $GITHUB_ENV if [[ $release_tag =~ .*-SNAPSHOT ]] then echo "release_snapshot=true" >> $GITHUB_ENV else echo "release_snapshot=false" >> $GITHUB_ENV fi - name: Cache Leiningen dependencies uses: actions/cache@v3 with: path: ~/.m2/repository key: ${{ runner.os }}-lein-${{ hashFiles('**/project.clj') }} restore-keys: | ${{ runner.os }}-lein- - name: Install dependencies, forcing updates of snapshots run: lein -U deps - name: Install antora for building user guide run: npm install - name: Build überjar run: bash .github/scripts/build.sh - name: Upload überjar if: success() uses: Xotl/cool-github-releases@v1 with: mode: update tag_name: ${{ env.release_tag }} isPrerelease: ${{ env.release_snapshot }} replace_assets: ${{ env.release_snapshot }} assets: ${{ env.uberjar_name }} github_token: ${{ github.token }} initial_mrkdwn: ${{ env.initial_description }} - name: Cache htmltest results uses: actions/cache@v3 with: path: tmp/.htmltest key: ${{ runner.os }}-htmltest - name: Build and publish user guide env: GUIDE_SSH_KEY: ${{ secrets.GUIDE_SSH_KEY }} run: bash .github/scripts/build_guide.sh ================================================ FILE: .gitignore ================================================ *.class *.jar .hg/ .hgignore /.cider_history /.dir-locals.el /.env /.lein-* /.nrepl-port /checkouts /classes /doc/build /gh-pages /node_modules /pom.xml /pom.xml.asc /research /target /resources/afterglow/version.edn logs/*.log* .idea/ *.iml *.ipr *.iws # Local Netlify folder .netlify ================================================ FILE: .htmltest.yml ================================================ DirectoryPath: "doc/build/site" IgnoreURLs: - "github.com/Deep-Symmetry/afterglow/blob/" - "support.native-instruments.com/hc/" - "help.ableton.com/hc/" - "^http://localhost:9090" ================================================ FILE: CHANGELOG.md ================================================ # Change Log All notable changes to this project will be documented in this file. This change log follows the conventions of [keepachangelog.com](http://keepachangelog.com/). ## [Unreleased][unreleased] ### Fixed - Afterglow would crash when told to convert a QLC+ fixture definition in the current working directory (with no path component), [#72](https://github.com/Deep-Symmetry/afterglow/issues/72). - External links were not being checked in the developer guide, but even so the link checker plugin ended up failing. Switched to htmltest, which is used on other Deep Symmetry projects, enabled external link checking (although not yet for GitHub source links because they are hitting rate limits, there are so many of them), and fixed a great many broken/stale links. ### Added - A new effect builder, `wrap-fade-in-out`, to make it easy to build effects that fade in when you start them, and out when you tell them to end. - When resolving dynamic parameters, resolution will be repeated if the result was still a dynamic parameter. This allows, for example, oscillated parameters to be stored in show variable parameters and swapped out during the lifetime of a cue. Resolving the variable parameter will first obtain the oscillated parameter, which will be resolved again for the appropriate number based on the show metronome snapshot. - The `variable-effect` function now takes optional keyword arguments which allow a more meaningful effect name to be specified, and can suppress the resolution of dynamic parameters, allowing the raw parameter itself to be set into a show variable while the effect is active, so that it can be used by other effects. ## [0.2.5] - 2022-01-12 ### Fixed - The built-in converter for QLC+ fixture definitions (`.qxf` files) now supports the new XML schema used by QLC+. - There were some off-by-one errors in the metronome, which canceled each other out in the places they were used, but would have caused problems in new situations. They were discovered while porting the logic to Java for the [electro](https://github.com/Deep-Symmetry/electro) library. - Abrupt tempo changes could cause the metronome to jump to the wrong place, even the wrong beat. This is now prevented, leaving you at the exact same place in the beat grid before and after any tempo change. - The metronome better handles negative time, and has some improved documentation. ### Added - The detailed documentation has been reorganized as a Developer Guide and is now built by [Antora](http://antora.org) to provide easier navigation and a more readable presentation. - The Developer Guide is now available through the built-in web server even if you do not have a connection to the internet. ### Changed - Upgraded to version 2.0 of the Eclipse Publice License. ## [0.2.4] - 2017-04-18 ### Fixed - The pixels of the Blizzard Pixellicious were flipped over the X axis. - The web interface needed to have the Beat Link `DeviceFinder` started before trying to render the UI, or it would only partially render because of an exception when trying to use it. - Calling `show/patch-fixture!` returned a huge recursive data structure which would cause the REPL to choke trying to print it, especially in an editor. Now it just returns the key identifying the fixture that was patched. ### Added - A new command-line argument, `-n`, tells afterglow not to try to launch a web browser when it is invoked from the command-line. This is to enable headless operation on small servers which lack a windowing environment. ## [0.2.3] - 2016-06-09 ### Fixed - Rich controller bindings (Ableton Push and Novation Launchpad families) were not being successfully auto-bound under Windows because of significant differences in the way their port names were assigned on that platform. Fixing that was surprisingly tricky, but it has been done. I look forward to someone being able to help test this under Linux now. - The graphical display on the Ableton Push 2 could not be connected under Windows due to an issue in the Wayang library. That library has been fixed, and the new version is embedded in this release. ## [0.2.2] - 2016-05-30 ### Added - The CoreMIDI4J library is now embedded within Afterglow, so it does not need to be separately installed by the user for MIDI to work properly on Mac OS X. If you have a separate installation of CoreMIDI4J in `/Library/Java/Extensions`, you should remove it to avoid version conflicts with newer versions shipped with Afterglow. - Afterglow now uses the new beat-link library to synchronize with Pioneer DJ Link equipment, which enables several new features such as tracking the master player, synching to bars as well as beats, and having the metronome reflect the current track position. - Holding down Shift while pressing a scroll arrow on the Launchpad family of controllers now moves you as far as possible in that direction, as it did on the Push 2. - Head information is now available to channel effects (which include dimmer effects), so they can use dynamic parameters with spatial components, just like all the other kinds of effects can. ### Fixed - When updating large sections of the cue grid colors, we no longer send all of them at once, because this was overflowing buffers on the Push 2 and losing some updates. Instead we send them in batches, ending each batch with a query, and wait for the response so we know the controller has caught up. - Updated to the latest release of the Wayang library for drawing on the Push 2 display, which solves an issue that prevented the display from working under Window. ### Changed - The hue and saturation gauges on the Push 2 are now drawn using a masking image so they can be anti-aliased to the same outline shape as the other gauges, and look much cleaner. - Boolean gauges on the Push 2 are drawn in red or green for No and Yes values, and the transition between values is animated, to make it easier to see what is happening, and to relate it to the encoder rotation. - Assigner target IDs can now have arbitrary structure appropriate to the needs of the assigner implementation, rather than being forced into keywords as they used to be. For the most part, they are integers (head IDs), some are tuples (universe ID and channel pairs for channel assigners, head ID and function keywords for head function assigners, other things for extensions like Beyond laser show assigners). ## [0.2.1] - 2016-04-03 ### Added - The web and Push interfaces now offer a way to save adjusted cue variable values, so the next time the cue is launched the saved values are used. - Show operators can also create "Macros" by selecting a group of running cues and choosing an unused cue grid cell. This will create a new compound cue in the cell which will re-run all of the cues they specified, with the same parameters they had when the macro was created, whenever it is run. The compound cue will end all of its component cues when you end it, and will end itself if they end independently. - You can now right-click on cues in the web interface to bring up a menu of actions. The menu so far offers just the ability to delete the cue if there is one there (this can clean up macros you no longer want, for example). - The Ableton Push 2 is now supported as a rich grid control interface, taking full advantage of its color graphic display. - Support for other members of the Novation Launchpad family of grid controllers has been implemented: - Launchpad Mini - Launchpad S (untested, but the Mini, which works, is based on the S) - Launchpad Mk2 - The identity of grid controllers is verified before binding to them, by sending a MIDI Device Inquiry message and inspecting the response. - The auto-bind mechanism has been improved so much that the sample show can now simply turn it on to fully automate the process of detecting and binding to any compatible grid controllers that appear in the MIDI environment, with no user or configuration effort. - Direction and aim parameters can now be transformed by a dynamic Java3D `Transform3D` parameter to create kaleidoscopic looks with groups of lights. - A new `confetti` effect which assigns random colors (and optionally aim points) to groups of lights at intervals. - A new `pinstripes` effect which can alternate stripes of color across fixtures. - Incoming MIDI System Exclusive messages can now be received and delivered to handlers. - Cue variables can now be Booleans, to support cues which want to be able to adjust the direction of a sawtooth oscillator while running. - The dimmer oscillator cues created in the sample show now include Min and Max variables so the range over which the dimmer oscillates can be adjusted. - The Ableton Push mapping now lets you scroll through all variables assigned to a cue so you can see and adjust more than the first two. - You can now use the touch strip on the Ableton Push to immediately jump to any part of the legal value range when adjusting a numeric, boolean, or color cue variable, BPM, or the Dimmer Grand Master. The LEDs on the touch strip also reflect the current value of the variable being adjusted. - You can use the keyboard arrow keys to navigate around the cue grid when using the web UI, as long as no input element is focused. - You can use the space bar to tap tempo when using the web UI, as long as no input element is focused. - Cues can have visualizer creation functions assigned to them, so they can provide animated visualizer displays on the Push 2. ### Fixed - Fixtures which had no channels assigned to the fixture itself, but only to heads (like Blizzard's Pixellicious pixel grids) could not be patched properly to shows, because the code checking for address conflicts was not able to figure out the universe assigned to them. - Chases containing only scenes would end instantly rather than running, because of some assumptions they were making about how the effect protocol was implemented, which scenes violated. Chases are now more robust. - The low-level tempo tap handler was already more useful than I was giving it credit for, suitable for both aligning to the current beat as well as adjusting the tempo if you hit it three or more times, so the shift key can be used to adjust the down beat even on unsynchronized shows. This makes it much easier to keep the lights in sync manually! - The color wheel is only applied when a color has sufficient saturation for it to make sense. The threshold can be adjusted by setting the show variable `:color-wheel-min-saturation`. - Floating-point cue variables now stay rounded to the specified resolution when adjusting them on the Push. - Effects with Unicode characters in them were crashing the Ableton Push display code, since it only handles single byte ASCII plus a handful of special symbols used for drawing interface elements. Now unprintable characters are substituted with an ellipsis symbol rather than crashing. - The entire Push display was being redrawn on each frame of user-interface updates, and all text-labeled button states were being set, even if they had not changed from the previous frame. These redundant messages are no longer sent, and MIDI messages are sent to the Push only when text and button states actually need to change. - The slider tooltips for cue variables in the web UI were getting in the way of adjusting the sliders because they would appear when the mouse was over the tooltip, not just the slider track. They could also not be seen on mobile devices. So they have been turned off entirely in favor of always-visible value labels. - The documentation link in the web interface now takes you to the proper version-specific tag of the documentation if it is a release build. Snapshot builds take you to `master`. - The nav bar in the show control web page is now compressed to better fit mobile devices, since it can be used on the iPad Pro. - Extraneous errors were being logged in the browser console because we were sometimes returning spurious error responses for cue variable updates, saves, and clears. - The end effect buttons and cue variable scroll buttons under the text area on the Ableton Push were not affecting the proper effects when the effect view was scrolled back from the most recent. - The effect overflow indicators in the Push text area were not properly disappearing when enough effects ended to render them no longer needed until the user pressed Shift to try to scroll. - Under some circumstances the Push mapping could crash when there was no cue associated with an effect. - All MIDI event handler functions are now called in a context which properly recovers from exceptions at the level of that individual handler, so other handlers will not be affected. - Everywhere that Afterglow was checking whether an argument was callable as a function has been fixed to use the `ifn?` predicate rather than `fn?` since the latter is too restrictive, and only returns `true` for functions explicitly created using `(fn ...)`. That precluded, for example, the idiomatic Clojure approach of using `:x` as a function to extract the _x_ coordinate of a head when defining a spatial parameter. ### Changed - You no longer need to specify what kind of grid controller you are trying to bind to in advance; the controller manager in `afterglow.controllers` can recognize the supported controllers from their responses to the MIDI Device Inquiry message, and instantiate the appropriate binding. New controller implementations can register themselves when their namespaces are loaded so the controller manager will dispatch to them as needed. - The code to gracefully shut down active controller bindings, which was becoming duplicated with every new controller mapping created, has been pulled up into the shared controllers namespace. - The code to watch for and automatically bind to a controller when it appears in the MIDI environment has similarly been generalized and pulled into the shared controllers namespace. - The ability to register an interest in all events from a specific MIDI device was added, and the controller mapping implementations were updated to take advantage of this, so they no longer need to receive and filter out all the events from other devices. - The sample show is becoming a much more practical example of how to layer flexible color and dimmer cues, with good cue variables to add even more dimensions. - A lot of repetitive code in the examples namespace was consolidated using helper functions. - The `controllers/IOverlay` protocol was expanded to include the ability for an overlay to handle and absorb pitch-bend messages, in preparation for supporting the touch strip on the Ableton Push. - The floating-point format for cue variables was changed from `float` to `double` since that is what Clojure actually natively uses. - All other `float` values which were created throughout Afterglow were changed to `double` values, since that is what Clojure actually natively uses, and they were getting promoted when used anyway. ## [0.2.0] - 2016-02-02 ### Added - Running effects are now listed on the Show Control page of the Web UI, in descending priority order, with buttons to end them, and controls to adjust cue parameters, including colors. - The show's dimmer grand master is now visible and controllable below the cue grid in the web UI. - A rich grid controller mapping for the [Novation Launchpad Pro](https://us.novationmusic.com/launch/launchpad-pro#). - A rich color picker interface on the Ableton Push for cues with color variables. - You can now map sliders and encoders on any MIDI controller to adjust components of a color stored in a show variable (that is, adjust its red, green, and blue values, or its hue, saturation, and lightness). - The example global color and strobe cues have been upgraded to take advantage of the new color cue parameters, so their colors can be adjusted on the fly using the web or Push interfaces. - The Shift button can be used with Tap Tempo buttons on controllers and the web UI to set the start of a beat, bar, or phrase, depending on the synchronization level of the metronome. - Buttons or pads on any MIDI controller can now easily be mapped to act like the smart Tap Tempo and Shift buttons on the Ableton Push and Novation Launchpad. - Cues can have animated colors on grid controllers including the web interface, to help remind operators about the effects they launch, or reflect the current value of a color variable on which they are based. - When binding a generic MIDI controller to launch a cue, if that controller does not have velocity-sensitive pads, you can assign an explicit velocity to use in the binding, for the purpose of setting any velocity-sensitive cue variables. - An explanation of how to bind a MIDI controller to a dimmer master has been added to the mapping documentation. - Animated GIFs in the documentation illustrate how the cue user interface works. ### Fixed - Using dynamic color variables to as inputs for other dynamic color parameters could cause crashes when trying to adjust the incoming color values due to a longstanding subtle bug, which has been fixed. - Ordinary MIDI control surfaces were sometimes being mistakenly identified as candidate sources of Tratktor beat phase information, leading to exceptions in the log file. Now only devices sending clock pulses are considered beat phase candidates. - Cue colors were improved in the web interface and on the Push to make it easier to see which cues are active, as well as to make the colors more faithful to the cue's intent. - The text labels on cues in the web interface are now more legible because they use a contrasting color based on the cell's perceived brightness. - Incompatible cues are now identified not just from matching effect keys, but also from their `:end-keys` lists, so the web and controller interfaces provide even more guidance. - Launching cues from the web interface was not setting any value for cue variables configured to be velocity sensitive, which was sometimes causing issues. Now the assignment of velocity-adjustable variables happens in the process of launching any cue from the grid, and a default velocity of 127 is assumed if none is specified. - The entire frame of a user interface being rendered on a grid controller or the web interface now uses the same metronome snapshot, to represent a consistent point in time. - Some testing in a Windows virtual machine revealed issues when working with standard Java Midi implementations (as opposed to CoreMidi4J on the Mac). These were addressed. ### Changed - Updated to newly-released Clojure 1.8 for improved performance. - Deprecated functions were removed: - `afterglow.effects.color/find-rgb-heads` (instead use `afterglow.channels/find-rgb-heads`) - `afterglow.effects.color/has-rgb-heads?` (instead use `afterglow.channels/has-rgb-heads`) - `afterglow.effects.oscillators/sawtooth-beat` (instead use `sawtooth`) - `afterglow.effects.oscillators/sawtooth-bar` (instead use `sawtooth` with `:interval :bar`) - `afterglow.effects.oscillators/sawtooth-phrase` (instead use `sawtooth` with `:interval :phrase`) - `afterglow.effects.oscillators/triangle-beat` (instead use `triangle`) - `afterglow.effects.oscillators/triangle-bar` (instead use `triangle` with `:interval :bar`) - `afterglow.effects.oscillators/triangle-phrase` (instead use `triangle` with `:interval :phrase`) - `afterglow.effects.oscillators/square-beat` (instead use `square`) - `afterglow.effects.oscillators/square-bar` (instead use `square` with `:interval :bar`) - `afterglow.effects.oscillators/square-phrase` (instead use `square` with `:interval :phrase`) - `afterglow.effects.oscillators/sine-beat` (instead use `sine`) - `afterglow.effects.oscillators/sine-bar` (instead use `sine` with `:interval :bar`) - `afterglow.effects.oscillators/sine-phrase` (instead use `sine` with `:interval :phrase`) - `afterglow.effects.params/build-oscillated-param` (instead use `afterglow.effects.oscillators/build-oscillated-param`) - `afterglow.show/add-midi-control-to-cue-mapping` (instead use `afterglow.effects.cues/add-midi-to-cue-mapping`) - `afterglow.show/remove-midi-control-to-cue-mapping` (instead use `afterglow.effects.cues/remove-midi-to-cue-mapping`) - The detailed documentation was updated to use attributes to link to the API documentation so it could be linked to its release-specific version. - The API documentation was moved into a github-pages branch so versioned snapshots can be kept around. - A few functions were newly deprecated to improve the consistency of the API: - `afterglow.effects.cues/add-midi-control-to-cue-mapping` (instead use the more accurately named `add-midi-to-cue-mapping`) - `afterglow.effects.cues/remove-midi-control-to-cue-mapping` (instead use the more accurately named `remove-midi-to-cue-mapping`) - `afterglow.show/remove-midi-control-to-var-mapping`, `afterglow.show/remove-midi-control-to-master-mapping`, and `afterglow.show/remove-midi-control-metronome-mapping` (they are no longer needed, the general-purpose function `afterglow.midi/remove-control-mapping` works instead of each) ## [0.1.6] - 2016-01-11 ### Added - Support for [CoreMIDI4J](https://github.com/DerekCook/CoreMidi4J), to preferentially use MIDI devices returned by this new lightweight open-source Java MIDI service provider implementation for Mac OS X. CoreMIDI4J is compatible with current Java and OS versions, and addresses long-standing defects in the standard Java MIDI implementation, such as support for System Exclusive messages, and reconfiguration of the MIDI environment as devices are connected and disconnected. Afterglow's MIDI implementation now gracefully handles changes in the MIDI environment, cleaning up bindings, synced metronomes, grid controllers, and cue feedback functions associated with devices which no longer exist, and making new devices available for use. - MIDI device watchers, which can set up bindings whenever a specified device is connected. These also allow effortless recovery from a temporary disconnection from a device during a show. - Code cues, making it easy to trigger arbitrary activity from a cue grid, [issue 34](https://github.com/Deep-Symmetry/afterglow/issues/34). - Links to graphs and expanded discussion in the oscillator API docs. - Dimmer effects can now work with dimmer function ranges on multipurpose channels as well as full dedicated dimmer channels. - Dimmer effects can now also create virtual dimmers for RGB-mixing fixtures that don't have any actual dimmer channels, allowing them to participate as if they did, by modifying the color effects being sent to them. - Step parameters can now have interval ratios, like oscillators. - When building step parameters, you can now use dynamic parameters as inputs. - When mapping a MIDI control to a show variable, you can now supply a custom function to transform the incoming value into whatever you need it to be, [issue 32](https://github.com/Deep-Symmetry/afterglow/issues/32). - When mapping a midi control to launch a cue, if your controller supports velocity (and perhaps also aftertouch, or polyphonic key pressure), you can have those values affect cue variables which have been defined as velocity sensitive, in the same way that Ableton Push pads do. - A variation of the sparkle effect which uses dimmer channels, [issue 35](https://github.com/Deep-Symmetry/afterglow/issues/35). - Some more examples of how to get started working with Afterglow. - A variety of other documentation improvements. ### Changed - Oscillators have been completely redesigned in order to be more flexible and easy to create and work with, and to support dynamic parameters so their configuration can vary over time or location, [issue 9](https://github.com/Deep-Symmetry/afterglow/issues/9). The old oscillator and oscillated parameter functions have been deprecated, and are now stubs wich delegate to the new implementation. They will be removed in an upcoming release. - The functions `add-midi-control-to-cue-mapping` and `remove-midi-control-to-cue-mapping` have been moved from the `afterglow.show` namespace to `afterglow.effects.cues`, to solve a circular dependency conflict which arose in implementing velocity and aftertouch support. There are stubs in the old location which delegate to the new ones, but they are less efficient than calling them in the new location directly, and are deprecated. The stubs will be removed in an upcoming release. - The former `IHeadParam` interface has been eliminated, folding its semantics into the `IParam` interface, and simplifying the implementation of dynamic parameters, [issue 20](https://github.com/Deep-Symmetry/afterglow/issues/20). - The `:adjust-fn` parameter to `build-variable-param` has been renamed `:transform-fn` to be consistent with the equivalent mechanism added for MIDI control mappings in [issue 32](https://github.com/Deep-Symmetry/afterglow/issues/32). The documentation has been improved a bit as well. - The maps which track MIDI bindings now use the underlying Java `MidiDevice` object for their keys, which allows for more efficent lookup than the `overtone.midi` `:midi-device` map which was previously used. - The functions which add and remove bindings to MIDI control, note, and aftertouch messages have been simplified so they no longer require you to come up with a unique keyword to use when later removing the binding. Instead, you simply pass the same function that was used when establishing the binding to remove it. - All functions which allow you to select a MIDI device have been made consistent, and now allow you to filter devices by a variety of criteria, not just the name and description. - Various maps used to manage Afterglow state, such as shows, cue grids, Push controllers and auto-binding watchers, are now tagged with type metadata to make it easier to recognize them. ### Fixed - Clicking on the BPM slider in the web interface now updates the BPM (previously you had to actually drag it), [issue 18](https://github.com/Deep-Symmetry/afterglow/issues/18). - Launching `:held` cues from generic MIDI controllers, the Ableton Push, and the web interface, would not succeed if the previous effect created by the cue was still in the process of ending, [issue 33](https://github.com/Deep-Symmetry/afterglow/issues/33). - Make sure MIDI inputs are connected when `sync-to-midi-clock` is called, [issue 10](https://github.com/Deep-Symmetry/afterglow/issues/10). - Also make sure the MIDI inputs are opened when rendering the web UI, so that the sync button will be able to list available sources of MIDI clock messages. - Clarified that syncing to Traktor beat phase still requires Traktor to be configured to send MIDI clock, [issue 37](https://github.com/Deep-Symmetry/afterglow/issues/37). - Added more detail about how to safely import and configure the Afterglow Traktor device mapping. - A variety of issues ranging from questionable style through misplaced documentation, unused or inaccessible code, preconditions that would not take effect, and actual problems, were identified by Kibit and Eastwood (after discovering how to work around a crash in Eastwood caused by the protocol definitions in `rhythm.clj`), were cleaned up. ## [0.1.5] - 2015-11-25 ### Added - Chases, which support sequences of effects with a variety of timing, fade, and looping options. - Step parameters, which provide flexible control of chases. - Pan/Tilt effects, which work at a lower level than direction effects, but since they are closer to the physical capabilities of the lights, can be helpful in creating natural and intuitive movements. They also help avoid issues with geometric singularities when fading between different directions. - Graphs to visually illustrate the available oscillators and the parameters that tune their behavior. ### Changed - Fades now delegate their notion of ending to the underlying effects which are being faded between, and pass end requests along to them. - Stopped embedding `cider-nrepl` because it added too much bloat and complexity for an unlikely use case. If you want to work with CIDER for live-coding with Afterglow, launch it from a project, rather than as an überjar. ### Fixed - Some MIDI controllers (perhaps those which sent messages on channels other than 0?) were causing Overtone's [midi-clj](https://github.com/overtone/midi-clj) library to create message maps with `nil` values for the `:status` key when sending control-change or note messages, which was preventing them from being detected or processed correctly. Afterglow now always looks for command-like messages via the `:command` key instead, [issue 8](https://github.com/Deep-Symmetry/afterglow/issues/8). - Fading colors in and out from nothing, as represented by a `nil` assignment value, was fading to a desaturated version of black, which does not lead to the kind of results people generally expect and want. In this situation, the color is now faded to or from a darkened version of itself. - The phases of the square-bar and square-phrase oscillators were flipped from what they should be according to the documentation, and compared with square-beat. This was discovered and corrected when graphing them. - Calculation of white LED channel for colors with lightness less than 50 was wrong, leading to slight unintentional desaturation of colors. - It was a little too hard to see the difference between the "ready" and "active" states for some colors on the Ableton Push after introducing full RGB button color support; they are once again more visually distinct. - Preconditions in channel-creation functions for fixture definitions were mal-formed, and so were not actually validating the function arguments. - Parts of the introductory walk-through in `README.md` had become stale and needed to be updated. - The API documentation for `patch-fixture!` was fleshed out. ## [0.1.4] - 2015-09-27 ### Added - Support for inverted dimmers (where lower DMX values are brighter). - Scenes, which allow multiple effects to be grouped into one. - A framework for fading between effect elements, with sensible semantics for colors, aim, directions, and functions, and defaults when fading in or out of nothing. - Fading between entire effects, including complex effects and scenes, which do not necessarily affect all the same fixtures and channels. - A new mechanism for extending the rendering loop to support effects which do not result in DMX values to send to the show universes. - Support for (and examples of) integration with laser shows being run by Pangolin Beyond software, using the extension mechanism. - New conditional effects and variable-setting effects, using the extension mechanism. - A composable effect which can transform the colors being created by other effects to build layered looks. The default transformation causes the colors to range from fully saturated at the start of each beat to pure gray by the end of the beat, but it is very easy to swap in other transformations using oscillated parameters. - Holding down the Shift key while turning the encoder allows the BPM to be changed more rapidly (in whole beat increments, rather than tenths) on the Ableton Push. - Fixture definitions for Chauvet LED Techno Strobe, LED Techno Strobe RGB, ColorStrip, Spot LED 150, Kinta X, Scorpion Storm FX RGB, Scorpion Storm RGX, Q-Spot 160, Intimidator Scan LED 300, Geyser RGB fogger, and Hurricane 1800 Flex fogger. - Example effect which desaturates a rainbow over the course of a beat. ### Changed - Improved readability and parallelism of core rendering loop. - The default frame rate was raised from 30Hz to 40Hz. - Ableton Push now uses SysEx message to specify the exact RGB color to light up a pad, rather than choosing from the limited set available through MIDI velocity. - Ableton Push now makes sure the pads are put in poly-pressure mode, and sets the sensitivity level to reduce the chance of stuck pads. - The stability of MIDI clock sync was greatly improved, in order to facilitate the Beyond integration. - The refresh rates of the Push and web interfaces were reduced to put less load on the CPU. - The tempo buttons on the Push and web interfaces are now always flashed at least once per beat, even if the reduced refresh rate causes the normal "on" window to be missed. - Improved content and format of command-line usage help. ### Fixed - The Ableton Push binding now ends cues when it receives an afertouch value of 0, since the hardware is not reliably sending a note-end message, especially when multiple pads are being pressed at once. - Fail gracefully when trying to bind to an Ableton Push when none can be found. - Some small errors in the documentation were corrected. ## [0.1.3] - 2015-08-16 ### Added - Ability to [translate](https://github.com/Deep-Symmetry/afterglow/blob/master/doc/fixture_definitions.adoc#translating-qlc-fixture-definitions) fixture definitions from the format used by [QLC+](http://www.qlcplus.org/) to help people get started on defining fixtures. ### Changed - Separated OLA communication into its own project, [ola-clojure](https://github.com/Deep-Symmetry/ola-clojure#ola-clojure). ## [0.1.2] - 2015-08-09 ### Added - Allow configuration of an alternate host for the OLA daemon (primarily for Windows users, since there is not yet a Windows port of OLA). - Flesh out the command-line arguments when running as an executable jar. - Allow a list of files to be loaded at startup when running as an executable jar, in order to configure fixtures, shows, effects, and cues. - Support syncing to Traktor’s beat grid with the help of a new custom controller mapping. ### Changed - MIDI sync sources are now always watched for, and can be offered to the user without pausing first. ## [0.1.1] - 2015-08-02 ### Added - Ability to register for notification about changes in status of cues and values of show variables. - Creating a show can optionally register it with the web interface by passing a description with `:description`. - Now cleans up thread-local bindings stored by the web REPL when sessions time out. ### Changed - Forked Protobuf related libraries to make them build Java 6 compatible clases, so [afterglow-max](https://github.com/Deep-Symmetry/afterglow-max) can run inside the Java environment provided by [Cycling ‘74’s Max](https://cycling74.com/). - Made the meaning of the `:start` attribute of cue variables simpler and more consistent. - Cue variables which respond to aftertouch now also respond to initial velocity, and the related configuration attributes have been renamed to `:velocity` to reflect this increased generality. - Improved the detection of project name and version number so they work for afterglow-max builds too. ### Fixed - Eliminated crashes in the Ableton Push interface when trying to adjust the value of a cue variable which had not yet been set to anything. ## 0.1.0 - 2015-07-19 ### Added - Initial Public Release [unreleased]: https://github.com/Deep-Symmetry/afterglow/compare/v0.2.5...HEAD [0.2.5]: https://github.com/Deep-Symmetry/afterglow/compare/v0.2.4...v0.2.5 [0.2.4]: https://github.com/Deep-Symmetry/afterglow/compare/v0.2.3...v0.2.4 [0.2.3]: https://github.com/Deep-Symmetry/afterglow/compare/v0.2.2...v0.2.3 [0.2.2]: https://github.com/Deep-Symmetry/afterglow/compare/v0.2.1...v0.2.2 [0.2.1]: https://github.com/Deep-Symmetry/afterglow/compare/v0.2.0...v0.2.1 [0.2.0]: https://github.com/Deep-Symmetry/afterglow/compare/v0.1.6...v0.2.0 [0.1.6]: https://github.com/Deep-Symmetry/afterglow/compare/v0.1.5...v0.1.6 [0.1.5]: https://github.com/Deep-Symmetry/afterglow/compare/v0.1.4...v0.1.5 [0.1.4]: https://github.com/Deep-Symmetry/afterglow/compare/v0.1.3...v0.1.4 [0.1.3]: https://github.com/Deep-Symmetry/afterglow/compare/v0.1.2...v0.1.3 [0.1.2]: https://github.com/Deep-Symmetry/afterglow/compare/v0.1.1...v0.1.2 [0.1.1]: https://github.com/Deep-Symmetry/afterglow/compare/v0.1.0...v0.1.1 ================================================ FILE: CODE_OF_CONDUCT.md ================================================ # Contributor Covenant Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at james@deepsymmetry.org. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] [homepage]: http://contributor-covenant.org [version]: http://contributor-covenant.org/version/1/4/ ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing Hi there! We're delighted that you'd like to contribute to this project. It has been generous collaboration from people all over the world that has made it possible so far, and your help is key to keeping it great. Contributions to this project are [released][contributions-released] to the public under the [project's open source license](LICENSE). This project adheres to the [Contributor Covenant Code of Conduct][covenant]. By participating, you are expected to uphold this code. ## Getting started Before you can start contributing to Afterglow, you'll need to set up your environment. Fork and clone the repo and install [Clojure][clojure] (for compiling and running the code) and [Leiningen](https://leiningen.org) (to manage the project dependencies and builds). Both of these rely on having a working Java runtime; if the mechanism you used to install them did not automatically include one, I recommend installing a current version of the [OpenJDK](http://openjdk.java.net). > Starting with version 0.2.5, you also need to have > [Antora](https://antora.org) installed because it is used to build > the embedded copy of the User Guide when building and running from > source. Assuming you have a current version of `node` installed, > simply running `npm i` inside the top level directory of the > afterglow project will install Antora for you. If you don't have a > node environment and are impatient to get started without getting > one, you can temporarily comment out the section of `project.clj` > that builds the user guide. Add `#_` to the `:prep-tasks` > line so that it looks like this: > > ` :prep-tasks [#_["shell" "npx" "antora" "--fetch" "doc/embedded.yml"` > > But keep in mind that if you do this, the built-in user guide will > not work, and you will not be able to create a release-worthy build > until you install Antora and restore the line to its un-commented > state. Once you have those in place, you can run Afterglow from source by opening a terminal window inside your clone of the project, and typing `lein repl`. You will see a bunch of output as the embedded copy of the User Guide is generated by Antora and the images are copied in, and then Clojure will start, with output similar to this: REPL-y 0.5.1, nREPL 0.8.3 Clojure 1.10.3 OpenJDK 64-Bit Server VM 11.0.10+9-LTS afterglow loaded. afterglow.examples=> At that point you can follow along with the example flow on the main project page, and start diving into exploring and changing the source code. > :wrench: If you are just building Afterglow to work around the > current [issue](https://github.com/clojars/clojars-web/issues/195) > preventing current versions from being available through Clojars, at > this point you can run `lein install`, which will build and install > the library in your local Maven repository, so other projects can > depend on the version that you just built without needing to find it > on Clojars. Of course to do any serious work, you will want some sort of editor with embedded REPL support, and ideally structural editing support for Lisp s-expressions. We find [GNU Emacs][emacs] with [CIDER][cider] to be an incredibly productive environment for Clojure work, but some of our colleagues swear by [IntelliJ IDEA][idea] (even the free Community Edition) with [Cursive][cursive], so use whatever IDE or editor works best for you. For testing you are going to want to install OLA (as described on the main project page) and have some lighting (and possibly MIDI) hardware to attach. ## Giving back Once you have something working you’d like to share, you can open a [pull request][pulls]. Or if you simply have an idea, or something that you wish worked differently, feel free to open an [issue][issues] if it seems like nobody already has. ## Maintainers Afterglow is primarily maintained by [@brunchboy][brunchboy]. ## License Deep Symmetry Copyright © 2016–2022 [Deep Symmetry, LLC](http://deepsymmetry.org) Distributed under the [Eclipse Public License 2.0](https://opensource.org/licenses/EPL-2.0) By using this software in any fashion, you are agreeing to be bound by the terms of this license. You must not remove this notice, or any other, from this software. [contributions-released]: https://help.github.com/articles/github-terms-of-service/#6-contributions-under-repository-license [covenant]: http://contributor-covenant.org/ [clojure]: https://clojure.org [leiningen]: https://leiningen.org [emacs]: https://www.gnu.org/software/emacs/ [cider]: http://www.cider.mx/en/latest/ [idea]: https://www.jetbrains.com/idea/ [cursive]: https://cursive-ide.com [pulls]: https://github.com/Deep-Symmetry/afterglow/pulls [issues]: https://github.com/Deep-Symmetry/afterglow/issues [brunchboy]: https://github.com/brunchboy ================================================ FILE: LICENSE ================================================ Eclipse Public License - v 2.0 THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 1. DEFINITIONS "Contribution" means: a) in the case of the initial Contributor, the initial content Distributed under this Agreement, and b) in the case of each subsequent Contributor: i) changes to the Program, and ii) additions to the Program; where such changes and/or additions to the Program originate from and are Distributed by that particular Contributor. A Contribution "originates" from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include changes or additions to the Program that are not Modified Works. "Contributor" means any person or entity that Distributes the Program. "Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. "Program" means the Contributions Distributed in accordance with this Agreement. "Recipient" means anyone who receives the Program under this Agreement or any Secondary License (as applicable), including Contributors. "Derivative Works" shall mean any work, whether in Source Code or other form, that is based on (or derived from) the Program and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. "Modified Works" shall mean any work in Source Code or other form that results from an addition to, deletion from, or modification of the contents of the Program, including, for purposes of clarity any new file in Source Code form that contains any contents of the Program. Modified Works shall not include works that contain only declarations, interfaces, types, classes, structures, or files of the Program solely in each case in order to link to, bind by name, or subclass the Program or Modified Works thereof. "Distribute" means the acts of a) distributing or b) making available in any manner that enables the transfer of a copy. "Source Code" means the form of a Program preferred for making modifications, including but not limited to software source code, documentation source, and configuration files. "Secondary License" means either the GNU General Public License, Version 2.0, or any later versions of that license, including any exceptions or additional permissions as identified by the initial Contributor. 2. GRANT OF RIGHTS a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, Distribute and sublicense the Contribution of such Contributor, if any, and such Derivative Works. b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in Source Code or other form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to Distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. e) Notwithstanding the terms of any Secondary License, no Contributor makes additional grants to any Recipient (other than those set forth in this Agreement) as a result of such Recipient's receipt of the Program under the terms of a Secondary License (if permitted under the terms of Section 3). 3. REQUIREMENTS 3.1 If a Contributor Distributes the Program in any form, then: a) the Program must also be made available as Source Code, in accordance with section 3.2, and the Contributor must accompany the Program with a statement that the Source Code for the Program is available under this Agreement, and informs Recipients how to obtain it in a reasonable manner on or through a medium customarily used for software exchange; and b) the Contributor may Distribute the Program under a license different than this Agreement, provided that such license: i) effectively disclaims on behalf of all other Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; ii) effectively excludes on behalf of all other Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; iii) does not attempt to limit or alter the recipients' rights in the Source Code under section 3.2; and iv) requires any subsequent distribution of the Program by any party to be under a license that satisfies the requirements of this section 3. 3.2 When the Program is Distributed as Source Code: a) it must be made available under this Agreement, or if the Program (i) is combined with other material in a separate file or files made available under a Secondary License, and (ii) the initial Contributor attached to the Source Code the notice described in Exhibit A of this Agreement, then the Program may be made available under the terms of such Secondary Licenses, and b) a copy of this Agreement must be included with each copy of the Program. 3.3 Contributors may not remove or alter any copyright, patent, trademark, attribution notices, disclaimers of warranty, or limitations of liability ("notices") contained within the Program from any copy of the Program which they Distribute, provided that Contributors may add their own appropriate notices. 4. COMMERCIAL DISTRIBUTION Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. 5. NO WARRANTY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 6. DISCLAIMER OF LIABILITY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. GENERAL If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be Distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to Distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. Nothing in this Agreement is intended to be enforceable by any entity that is not a Contributor or Recipient. No third-party beneficiary rights are created under this Agreement. Exhibit A - Form of Secondary Licenses Notice "This Source Code may also be made available under the following Secondary Licenses when the conditions for such availability set forth in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), version(s), and exceptions or additional permissions here}." Simply including a copy of this Agreement, including this Exhibit A is not sufficient to license the Source Code under Secondary Licenses. If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. You may add additional accurate notices of copyright ownership. ================================================ FILE: README.md ================================================ # Afterglow [![project chat](https://img.shields.io/badge/chat-on%20zulip-brightgreen)](https://deep-symmetry.zulipchat.com/#narrow/stream/318697-afterglow)

An environment supporting [live coding](https://en.wikipedia.org/wiki/Live_coding) for the creation of algorithmic light shows in [Clojure](http://clojure.org), leveraging the [Open Lighting Architecture](https://www.openlighting.org/ola/) with the help of [ola-clojure](https://github.com/Deep-Symmetry/ola-clojure#ola-clojure), [wayang](https://github.com/Deep-Symmetry/wayang#wayang), [beat-link](https://github.com/Deep-Symmetry/beat-link), and pieces of the [Overtone](http://overtone.github.io) toolkit. Beyond building on pieces of Overtone, the entire Afterglow project was [inspired](https://vimeo.com/22798433) by it. [![License](https://img.shields.io/badge/License-Eclipse%20Public%20License%202.0-blue.svg)](#license) ### Documentation Overview This page provides an introduction in how to install and use Afterglow. The [Developer Guide](https://afterglow-guide.deepsymmetry.org) goes much deeper, and there is also [API documentation](http://afterglow-guide.deepsymmetry.org/api/). For more interactive help, the [Afterglow stream on Zulip](https://deep-symmetry.zulipchat.com/#narrow/stream/318697-afterglow) is the place to start, and if you want to see (or contribute to) more structured and lasting community-driven documentation, there is also a project [wiki](https://github.com/Deep-Symmetry/afterglow/wiki). ## Why Explore Afterglow? > tl;dr—show me? Check out the > [Show Control pics](https://afterglow-guide.deepsymmetry.org/afterglow/README.html#show-control) > and [performance video](https://afterglow-guide.deepsymmetry.org/afterglow/videos.html). As suggested by the live-coding orientation mentioned above, which is designed to let you inject your own code right into the frame rendering process, Afterglow takes a very different approach to controlling light shows than other software. It won’t be right for everyone, but will be extremely compelling to a particular niche. The early stages of its [rendering loop](https://afterglow-guide.deepsymmetry.org/afterglow/rendering_loop.html#the-rendering-loop) can offer higher levels of abstraction than the usual DMX [channel value](https://afterglow-guide.deepsymmetry.org/afterglow/effects.html#channel-effects) or [fixture function](https://afterglow-guide.deepsymmetry.org/afterglow/effects.html#function-effects) (although those are fully supported too): * You can express your desired results in terms of an abstract [color](https://afterglow-guide.deepsymmetry.org/afterglow/effects.html#color-effects), including support for the hue-saturation-lightness model, which is great for algorithmic looks, and have it translated to whatever color channels (or color wheel) your fixture supports. * Groups of moving heads can be told to face particular [directions](https://afterglow-guide.deepsymmetry.org/afterglow/effects.html#direction-effects) by specifying parameterized vectors, or to [aim](https://afterglow-guide.deepsymmetry.org/afterglow/effects.html#aim-effects) at a particular point in space, and Afterglow figures out how to translate that into DMX control values given its understanding of the [fixture](https://afterglow-guide.deepsymmetry.org/afterglow/fixture_definitions.html) and [where](https://afterglow-guide.deepsymmetry.org/afterglow/show_space.html), and at what angle, you hung it. * There are a variety of [oscillators](https://afterglow-guide.deepsymmetry.org/afterglow/oscillators.html) which can efficiently drive effect parameters. * You can also create [complex effects](https://afterglow-guide.deepsymmetry.org/afterglow/effects.html#complex-effects), with [adjustable parameters](https://afterglow-guide.deepsymmetry.org/afterglow/parameters.html) that can be controlled through a rich binding to an [Ableton Push](https://afterglow-guide.deepsymmetry.org/afterglow/push2.html) or [Novation Launchpad family](https://afterglow-guide.deepsymmetry.org/afterglow/launchpad.html) controller, or via [Open Sound Control](https://afterglow-guide.deepsymmetry.org/afterglow/mapping_sync.html#open-sound-control) (OSC)—even wirelessly from a tablet or smartphone. * The timing of effects is pervasively influenced by a deep notion of [musical time](https://afterglow-guide.deepsymmetry.org/afterglow/metronomes.html), with support for synchronization via [MIDI clock](https://afterglow-guide.deepsymmetry.org/afterglow/mapping_sync.html#syncing-to-midi-clock), [Traktor Beat Phase](https://afterglow-guide.deepsymmetry.org/afterglow/mapping_sync.html#syncing-to-traktor-beat-phase), or Pioneer [Pro DJ Link](https://afterglow-guide.deepsymmetry.org/afterglow/mapping_sync.html#syncing-to-pro-dj-link) beat grids. * You can even host Afterglow within [Cycling ‘74’s Max](https://cycling74.com/) visual interactive environment. If any of this sounds interesting to you, read on to see how to get started! ## Table of Contents * [Why Explore Afterglow?](#why-explore-afterglow) * [Installation](#installation) * [Status](#status) * [Getting Help](#getting-help) * [Usage](#usage) * [Troubleshooting](#troubleshooting) * [Bugs](#bugs) * [What Next?](#what-next) * [Release Checklist](#release-checklist) * [Tasks](#tasks) * [License](#license) ## Installation 1. [Install OLA](https://www.openlighting.org/ola/getting-started/downloads/). (On the Mac I recommend using [Homebrew](http://brew.sh) which lets you simply `brew install ola`). Once you launch the `olad` server you can interact with its embedded [web server](http://localhost:9090/ola.html), which is very helpful in seeing whether anything is working; you can even watch live DMX values changing. > :wrench: If you are installing Afterglow on Windows, see the > [Wiki discussion](https://github.com/Deep-Symmetry/afterglow/wiki/Questions#ola-and-windows) > about OLA options. 2. For now set up a Clojure project using [Leiningen](http://leiningen.org). 3. Add this project as a dependency: [![Clojars Project](https://img.shields.io/clojars/v/afterglow.svg)](http://clojars.org/afterglow) > :wrench: If you were using older releases of Afterglow and installed > [CoreMIDI4J](https://github.com/DerekCook/CoreMidi4J) in > `/Library/Java/Extensions`, you need to remove it, because Afterglow > now embeds an improved version and uses it when necessary. If you want to run Afterglow as a standalone executable, you can download the executable überjar from the [releases](https://github.com/Deep-Symmetry/afterglow/releases) page. [![überjar](https://img.shields.io/github/downloads/Deep-Symmetry/afterglow/total.svg)](https://github.com/Deep-Symmetry/afterglow/releases) For an example of a project which uses Afterglow as a dependency, as described above, see [afterglow-max](https://github.com/Deep-Symmetry/afterglow-max#afterglow-max), which hosts Afterglow inside [Cycling ‘74’s Max](https://cycling74.com/). ## Status Although Afterglow is far from finished, it’s ready for the world to start exploring, and helping decide directions in which to grow next (as well as identifying areas where the documentation needs clarification or reinforcement). Most of the crazy ideas have panned out and been implemented, and I am fleshing out the basic details needed for everyday use. The examples are starting to be intriguing and informative, and the [Developer Guide](https://afterglow-guide.deepsymmetry.org) is getting substantial. The modeling of fixtures, channels, etc. is coming together nicely, though there may be a few more changes. There is now an embedded web application, which is growing into a show control interface for people who are not Clojure hackers, and a useful adjunct to the Ableton Push and Launchpad family control surface interfaces. Each is explained in the documentation link above. Afterglow also includes the beginnings of a show visualizer for designing and working on effects without having to physically hook up lights (a proof of concept, really, at this point). This is implemented in WebGL using a volumetric ray tracer and looks quite promising, at least for a small number of fixtures; it will probably overwhelm the graphics processor on most systems once you add too many lights. However, the framework can be used by someone who actually knows OpenGL programming to build a more scalable preview (albeit one that probably doesn’t look quite so photo-realistic with beams impacting drifting fog). This is an area where I would love some help if it sounds interesting! ## Getting Help Zulip logo Deep Symmetry’s projects are generously sponsored with hosting by Zulip, an open-source modern team chat app designed to keep both live and asynchronous conversations organized. Thanks to them, you can chat with our community, ask questions, get inspiration, and share your own ideas. ## Usage > The rest of this document primarily provides an introduction to the > configuration of Afterglow from the command line and text files. The > show control interface is explained in the > [web](https://afterglow-guide.deepsymmetry.org/afterglow/README.html#web-ui) > and > [Push](https://afterglow-guide.deepsymmetry.org/afterglow/push2.html) > sections. Although you will often want to use Afterglow from a Clojure repl, you can also bring it up as an executable jar, and run it using `java -jar` with command-line arguments: ``` > java -jar afterglow.jar --help afterglow 0.2.4, a live-coding environment for light shows. Usage: afterglow [options] [init-file ...] Any init-files specified as arguments will be loaded at startup, in the order they are given, before creating any embedded servers. Options: -w, --web-port PORT 16000 Port number for web UI -n, --no-browser Don't launch web browser -o, --osc-port PORT 16001 Port number for OSC server -r, --repl-port PORT Port number for REPL, if desired -l, --log-file PATH logs/afterglow.log File into which log is written -H, --olad-host HOST localhost Host name or address of OLA daemon -P, --olad-port PORT 9010 Port number OLA daemon listens on -q, --convert-qxf PATH Convert QLC+ fixture file and exit -h, --help Display help information and exit If you translate a QLC+ fixture definition file, Afterglow will try to write its version in the same directory, but won't overwrite an existing file. If you do not explicitly specify a log file, and Afterglow cannot write to the default log file path, logging will be silently suppressed. Please see https://github.com/Deep-Symmetry/afterglow for more information. ``` As noted, you can pass a list of init-files when you run Afterglow this way, which gives you the opportunity to set up the actual universes, fixtures, effects, and cues that you want to use in your show. As a starting point, you could put something like the following in a file `my-show.clj` and then invoke Afterglow as `java -jar afterglow.jar my-show.clj`: ```clojure (ns my-show "Set up the fixtures, effects, and cues I actually want to use." ;; TODO: Your list of required namespaces will differ from this, depending on ;; what fixtures you actually use, and what effects and cues you create. (:require [afterglow.core :as core] [afterglow.transform :as tf] [afterglow.effects.color :refer [color-effect]] [afterglow.effects.cues :as cues] [afterglow.effects.dimmer :refer [dimmer-effect]] [afterglow.effects.fun :as fun] [afterglow.effects.movement :as move] [afterglow.effects.oscillators :as oscillators] [afterglow.effects.params :as params] [afterglow.fixtures.blizzard :as blizzard] [afterglow.rhythm :as rhythm] [afterglow.show :as show] [afterglow.show-context :refer :all] [com.evocomputing.colors :refer [create-color hue adjust-hue]] [taoensso.timbre :as timbre])) (defonce ^{:doc "Holds my show if it has been created, so it can be unregistered if it is being re-created."} my-show (atom nil)) (defn use-my-show "Set up the show on the OLA universes it actually needs." [] ;; Create, or re-create the show. Make it the default show so we don't ;; need to wrap everything below in a (with-show sample-show ...) binding. (set-default-show! (swap! my-show (fn [s] (when s (show/unregister-show s) (with-show s (show/stop!))) ;; TODO: Edit this to list the actual OLA universe(s) that ;; your show needs to use if they are different than ;; just universe 1, as below, and change the description ;; to something descriptive and in your own style: (show/show :universes [1] :description "My Show")))) ;; TODO: Replace this to patch in an actual fixture in your show, at its actual ;; universe, DMX address, physical location and orientation, then add all ;; your other fixtures one by one. (show/patch-fixture! :torrent-1 (blizzard/torrent-f3) 1 1 :x (tf/inches 44) :y (tf/inches 51.75) :z (tf/inches -4.75) :y-rotation (tf/degrees 0)) ;; Return the show's symbol, rather than the actual map, which gets huge with ;; all the expanded, patched fixtures in it. '*show*) (core/init-logging) ; Log at :info level to rotating files in logs/ subdirectory. (use-my-show) ; Set up my show as the default show, using the function above. ;; TODO: Add your custom effects, then assign them to cues with sensible colors ;; See afterglow.examples for examples. ``` As noted, you will want to look at the [afterglow.examples](src/afterglow/examples.clj) namespace for some examples of how to populate this file; the rest of this section gives an overview and walk-through of how pieces of that namespace work. The `:require` section at the top of `my-show.clj` is set up to make it easy to cut and paste from these examples, although it is not complete, and you will eventually need to learn how to adjust and optimize it yourself. > The example code above configures Afterglow to log to a set of > rotating log files in a `logs/` subdirectory of your project. > Afterglow will attempt to create that directory if it does not > exist. If you want to see any logging information, which can be > quite useful when troubleshooting, you will need to ensure that the > path to the logs directory is writeable (or that the logs directory > exists and is writable), otherwise the logging mechanism will > silently do nothing. The logs will stay out of your way until you > are interested in them, and take up a limited amount of space, but > whenever you do want to watch what Afterglow is doing, you can look > at them, or `tail -f logs/afterglow.log` to watch it live. As your show gets more complex, you may want to split this into multiple files, which you can either load by listing them all on the command line, or by using Clojure’s `load-file` function from within the first file. Or, once you are comfortable with idomatic Clojure development, by organizing them into a hierarchy of namespaces, and using the normal `:require` mechanism that is used to pull in Afterglow’s own namespaces. > :heavy_exclamation_mark: At this early stage of development, using > Afterglow as an executable jar is less-tested territory, and you may > find surprising bugs... though this is becoming less of an issue > since the advent of > [afterglow-max](https://github.com/Deep-Symmetry/afterglow-max#afterglow-max), > which is putting Afterglow through its paces as an embedded jar. In > any case, although the project will gradually evolve into a system > that non-Clojure hackers can use, for now you are probably best off > playing with it inside a Clojure development environment, or within > Max, likely with a Clojure environment connected via nREPL. Assuming you are using it from within a REPL, there is a namespace `afterglow.examples` which is intended to help you get started quickly in exploring the environment, as well as serving as an example of how to configure your own shows, fixtures, effects, and cues. > The next two lines are not needed if you are using a checkout of the > Afterglow source code rather than the library version described > above, since the project is configured to start you in this > namespace for convenience. ```clojure (require 'afterglow.examples) (in-ns 'afterglow.examples) ``` When you run Afterglow as an executable jar, it will automatically open a web browser window on its embedded web interface. If you are using it in another way, you can bring up the web interface, and open a browser window on it, with a one-liner like this (the first argument specifies the port on which to run the web interface, and the second controls whether a browser window should be automatically opened): ```clojure (core/start-web-server 16000 true) ``` Web Interface As noted at the bottom, the web interface provides a minimal console as well, so if you are running Afterglow from a jar and just want to tweak something quickly, you can use that: Web Console > However, this does not offer the valuable support you would have > from a dedicated REPL like > [Cider](https://github.com/clojure-emacs/cider) (in Emacs) or > [Cursive](https://cursiveclojure.com) (in IntelliJ): things like > symbol completion, popup documentation, and command-line recall, > which make for a vastly more productive exploration session. So even > when you are running from a jar rather than launching from a REPL, > you will often want to access a real REPL. You can accomplish that > with command-line arguments or by using the web console to invoke > [core/start-nrepl](http://deepsymmetry.org/afterglow/api-doc/afterglow.core.html#var-start-nrepl) > and then connecting your favorite REPL environment to the network > REPL port you created. The web interface does provide a nice show control page, though, with access to a scrollable grid of cues, and the ability to track the cues displayed on a physical cue grid control surface like the Ableton Push or a current member of the Novation Launchpad family, so you can control them from either place, and see the names that go with the colored buttons on the control surface. This animated GIF shows how cues respond to clicks, lightening while they run, and darkening any cues which cannot run at the same time. It also shows how you can scroll around a larger grid than fits on the screen at one time (although it has reduced colors, frame rate, and quality when compared to the actual web interface): Show Control Here is the Ableton Push interface tied to the same cue grid. This physical control surface lets you trigger more than one cue at the same time, and also gives you niceties unavailable with a mouse, like pressure sensitivity so your effect intensity, speed, color, or other parameters can be varied as you alter the pressure which you are applying to the pads: Push Interface You can adjust running effects, scroll around the cue grid, and adjust or sync the show metronome from either interface. Other MIDI controllers can be mapped to provide similar functionality, and hopefully such mappings will make their way into Afterglow soon (indeed, the current Novation Launchpad family is now supported too). The Afterglow mappings are done entirely on the User layer as well, so they coexist gracefully with Ableton Live, and you can switch back and forth by pressing the User button if you want to perform with both. But, getting back to our REPL-based example: We next start the sample show, which runs on DMX universe 1. You will want to have OLA configured to at least have an dummy universe with that ID so you can watch the DMX values using its web interface. It would be even better if you had an actual DMX interface hooked up, and changed the show to include some real lights you have connected. Either way, here is how you start the show sending control signals to lights: ```clojure (use-sample-show) ; Create the sample show that uses universe 1. (show/start!) ; Start sending its DMX frames. ``` The `afterglow.examples` namespace includes a helper function, `fiat-lux`, to assign a nice cool blue color to all lights in the sample show, set their dimmers to full, and open the shutters of the Torrent moving-head spots, which can be called like this: ```clojure (fiat-lux) ``` So if you happened to have the same fixtures hooked up, assigned the same DMX addresses as I did when I wrote this, you would see a bunch of blue light. More realistically, you can navigate to the `olad` embedded [web server](http://localhost:9090/new/) and see the non-zero DMX values in the blue and dimmer channels, assuming you have set up a Universe with ID 1. > In an environment where you are running multiple shows, the more > general way of working with one would look like: ```clojure (def another-show (some-function-that-creates-a-show)) (with-show another-show (show/start!) (fiat-lux)) ``` > However, the `examples` namespace assumes you are just using one, > and has set it up as the default show, like this: ```clojure (set-default-show! sample-show) ``` > That saves us the trouble of wrapping all our show manipulation > functions inside of `(with-show ...)` to establish a context. You > will likely want to do something similar in setting up your own > shows, since a single show is the most common scenario. See the > `afterglow.show-context` > [API documentation](http://deepsymmetry.org/afterglow/api-doc/afterglow.show-context.html) > for more details. The `show-context` namespace also defines the > dynamic variable `*show*` which you can use to refer to the current > default show when you need to mention it explicitly, as you will see > in some of the examples below. The actual content of `fiat-lux` is quite simple, creating three effects to achieve the goals mentioned above: ```clojure (defn fiat-lux "Start simple with a cool blue color from all the lights." [] (show/add-effect! :color (global-color-effect "slateblue" :include-color-wheels? true)) (show/add-effect! :dimmers (global-dimmer-effect 255)) (show/add-effect! :torrent-shutter (afterglow.effects.channel/function-effect "Torrents Open" :shutter-open 50 (show/fixtures-named "torrent")))) ``` We can make the lights a little dimmer... ```clojure (show/add-effect! :dimmers (global-dimmer-effect 200)) ``` > Adding a function with the same keyword as an existing function > replaces the old one. The dimmer channels drop from 255 to 200. But for dimmer channels, there is an even better way of doing that: ```clojure (master-set-level (:grand-master *show*) 80) ``` All cues which set dimmer levels are tied to a dimmer master chain. If none is specified when creating the cue, they are tied directly to the show’s dimmer grand master. Setting this to a value less than 100 scales the dimmer values sent to the lights down by that amount. So the above command dims the lights to 80% of their possible brightness, no matter what else the cues are trying to do. See the [dimmer effects API documentation](http://deepsymmetry.org/afterglow/api-doc/afterglow.effects.dimmer.html) for more details. Here is an example of what I call right away when testing effects in my office with the little Korg nanoKONTROL 2 plugged in: ```clojure (show/add-midi-control-to-master-mapping "slider" 0 7) ``` And then the last fader acts as my grand master dimmer, and I can quickly get relief from overly bright lights. (In a real performance context, you would want to use [this alternate approach](https://afterglow-guide.deepsymmetry.org/afterglow/mapping_sync.html#automatic-bindings) to automatically set up your bindings whenever the controller is connected. That way, if someone trips over the controller cable, as soon as you plug it back in, you are good to go again.) > If you have an Ableton Push, it is even easier to have [intutive > control](https://afterglow-guide.deepsymmetry.org/afterglow/push2.html#show-control) > over your show’s grand master dimmer. As soon as you bind the Push > to your show, the Push Master encoder is automatically tied to the > show master dimmer, with nice graphical feedback in the text area. > Plus you get deep control over the show metronome as well, as shown > in the photo above. If you called `(use-sample-show)` as discussed > above, as soon as you connect and power on your Push, Afterglow will > activate its show control interface. Moving on, though... we can change the global color to orange: ```clojure (show/add-effect! :color (global-color-effect :orange)) ``` > The color channel values change. Let’s get a little fancy and ramp the dimmers up on a sawtooth curve each beat: ```clojure (show/add-effect! :dimmers (global-dimmer-effect (oscillators/build-oscillated-param (oscillators/sawtooth)))) ``` Slow that down a little: ```clojure (afterglow.rhythm/metro-bpm (:metronome *show*) 70) ``` > If you have a web browser open on > [your OLA daemon](http://localhost:9090/ola.html)’s DMX monitor for > Universe 1, you will see the values for channels changing, then > ramping up quickly, then a little more slowly after you change the > BPM. OLA 0.9.5 introduced a new, beta web UI based on AngularJS > which you can access through a small > [New UI (Beta)](http://localhost:9090/new/) link at the bottom of > the page. In my experience, it has been completely stable, looks a > lot better, and is *far* more dynamic and responsive at monitoring > changing DMX values, and presenting them in an intuitive at-a-glance > way. If you can, alter the example to use a universe and channels that you will actually be able to see with a connected fixture, and watch Clojure seize control of your lights! ### Further Experiments If you have DJ software or a mixer sending you MIDI clock data, you can sync the show’s BPM to it (see the [Developer Guide](https://afterglow-guide.deepsymmetry.org/afterglow/mapping_sync.html#syncing-to-midi-clock) for details, and for a Traktor controller mapping file that lets you sync to its beat phase information as well): ```clojure (show/sync-to-external-clock (afterglow.midi/sync-to-midi-clock "traktor")) ``` How about a nice cycling rainbow color fade? ```clojure (def hue-param (oscillators/build-oscillated-param (oscillators/sawtooth :interval :bar) :max 360)) (show/add-effect! :color (global-color-effect (params/build-color-param :s 100 :l 50 :h hue-param))) ``` Or, if you need to be woken up a bit, ```clojure (show/add-effect! :strobe (afterglow.effects.channel/function-cue "Fast blast!" :strobe 100 (show/all-fixtures))) ``` > The [Developer Guide](https://afterglow-guide.deepsymmetry.org) has > more examples of [building > effects](https://afterglow-guide.deepsymmetry.org/afterglow/effects.html#effect-examples), > and [mapping > parameters](https://afterglow-guide.deepsymmetry.org/afterglow/mapping_sync.html) > to MIDI controllers. There is also low-level [API > documentation](http://deepsymmetry.org/afterglow/api-doc), but the > project documentation is the best starting point for a conceptual > overview and introduction. When you are all done, you can terminate the effect handler thread... ```clojure (show/stop!) ``` And darken the universe you were playing with. ```clojure (show/blackout-show) ``` > An alternate way of accomplishing those last two steps would have > been to call `(show/clear-effects!)` before `(show/stop!)` because > once there were were no active effects, all the DMX values would > settle back at zero and stay there until you stopped the show. ## Troubleshooting When afterglow has important events to report, or encounters problems, it writes log entries. In its default configuration, it tries to write to a `logs` directory located in the current working directory from which it was run. If that directory does not exist, and you have not explicitly configured a path to a log file, it assumes you are not interested in the logs, and silently suppresses them. So if things are not going right, the first step is to enable logging. You can either do this by creating a `logs` folder for Afterglow to use, or by running it with the `-l` command-line argument to set an explicit log file path, as described in the [Usage](#usage) section above. If you do that, afterglow will create any missing directories in the log file path, and fail with a clear error message if it is unable to log to the place you asked it to. The Open Lighting Architecture’s [web interface](http://localhost:9090/new/#/), which you can find on port 9090 of the machine running afterglow if you installed it in the normal way, can be useful in troubleshooting as well. You can see if the universes that afterglow is expecting to interact with actually exist, are configured to talk to the lighting interfaces you expect, and are sending DMX channel values that seem reasonable. ## Bugs Although there are none known as of the time of this release, I am sure some will be found, especially if you are tracking the master branch to keep up with the current rapid pace of development. Please feel free to log [issues](https://github.com/Deep-Symmetry/afterglow/issues) as you encounter them! ## What Next? Everything beyond this point in this document is written for people who are working on enhancing Afterglow itself. If you are trying to learn how to use it, jump to the main [Developer Guide](https://afterglow-guide.deepsymmetry.org) page now! ## Release Checklist Here is the set of tasks needed to cut a new release: ### Prerelease Steps - [ ] Check over the documentation. If any moving screen captures are needed, see this [gist](https://gist.github.com/dergachev/4627207). The command I have used so far is: `ffmpeg -i ~/Desktop/Cues.mov -pix_fmt rgb24 -r 10 -f gif - | gifsicle --optimize=3 --delay=10 > ~/Desktop/Cues.gif` - [ ] Update [`CHANGELOG.md`](CHANGELOG.md) to reflect the release: make sure nothing is missing, and rename the sections to reflect the fact that the unreleased code is now released, and there is nothing unreleased. - [ ] Tag the repository with a non -SNAPSHOT version. ### Release Steps - [ ] Commit everything including the rebuilt API docs, tag the commit with the tag name used above, and push including the tag. `git commit -a`, `git tag -a v0.2.0 -m "Release 0.2.0"`, `git push --tags`. - [ ] Deploy the release to Clojars: `lein deploy clojars`. ### Postrelease Steps - [ ] Update [`CHANGELOG.md`](CHANGELOG.md) to include a new unreleased section. - [ ] Tag the repository with a new -SNAPSHOT version. - [ ] Commit and push. ## Tasks To a large extent, this is now historical, and issue and enhancement tracking has moved to the [issues](https://github.com/Deep-Symmetry/afterglow/issues) system. There are still some interesting ideas here for longer-term consideration, though. - [x] Sync metronomes to MIDI - [x] Add metronome chase for clear sync testing - [x] Allow parameterized effects functions - [x] Start wiki - [x] Allow metronomes to be show variables - [x] Improve Oscillators - [x] Use keyword parameters - [x] Add phrase oscillators - [x] Finish wiki page - [x] Migrate wiki documentation into project documentation. - [x] Have metronome cue take metronome parameter and support dynamic parameters. - [x] Consider having patched fixture hold a reference to the show. That way we could stop having to pass it so many places, though it would make printing fixtures less useful. (Not needed; dynamic binding works better.) - [x] Add support for named fixture functions which exist as a value range subset of a channel, and effects which set them to particular values. - [x] Allow scaling of named fixture functions, for example to allow a strobe effect to be set to a rough Hz value despite differences in fixture implementation. - [x] Add color wheel support. - [x] Review existing fixture definitions for consistency of function names, start a style guide in the docs for others creating fixture definitions. - [x] Add configuration support for running OLA on a different machine. - [ ] Make pass over all source, flesh out API doc and preconditions. - [ ] Sparkle effect, essentially a particle generator with configurable maximum brightness, fade time, distribution. - [x] Get basic effect working until spatial features are available. - [ ] Work both with arbitrary head list, and with spatially mapped origin/density. - [ ] Work as single intensity, or spatially mapped hue/saturation patterns. - [x] Implement a grand master dimmer in the show which imposes a ceiling on all dimmer cues. - [x] Also allow custom sub-master dimmer variables, chained off each other and ultimately the grand master, assigned to cues. Each step can scale the output. - [x] All dimmer cues are assigned a master chain, defaulting to the grand master if none supplied. - [x] Consider implementing virtual dimmer effects to allow fixtures which lack actual dimmer channels to simulate them and participate in the dimmer master chain, as proposed [here](https://github.com/Deep-Symmetry/afterglow/issues/43). - [x] Get geometry engine and head-movement cues working. - [x] Named cues: Define cues with a unique name so they can have parameters saved for them, to be reloaded on future runs, once we have a database. Also useful for compound cues, see below. - [x] This requires cues to have a mechanism for reporting their current variable values for saving, and to look them up when saved. - [ ] Compound cues: - [x] Unflattened compound cues trigger multiple cues’ effects: - [x] Each effect gets its own priority, parameters. - [x] The compound finishes when all triggered effects do. - [x] Implement by having the outer cue’s effect call `show/add-effect-from-cue-grid!` to launch all the nested effects, recording their IDs. The effect will never return any assigners, but will report that it has ended when all of the nested effects have ended. Telling this effect to end will, in turn, call `show/end-effect!` on all nested cues (passing their recorded id values as `:when-id`, to avoid inadvertently killing later effects run under the same key). - [x] Add a `:variable-overrides` parameter to `show/add-effect-from-cue-grid!` so compound cues can use it to customize the values of parameters introduced by nested cues. - [ ] Flattened compound cues flatten their nested cues’ effects into a single new effect: - [ ] This effect gets assigned a new priority. - [ ] The compound cue aggregates nested cue variables into one big list, and passes them down to the nested effects. (Renaming with numeric suffixes as needed to avoid name clashes? No, they might be shared.) - [ ] Compound cues created from solely named cues can be saved and restored, so they can be built using the web (and rich controller) interface out of existing cues, and current parameter values for running cues. - [ ] When creating a compound cue this way, will need to check for and prevent circular definitions, as well as reporting sensible errors when constituent cues can no longer be found. - [x] Compound effects: - [x] Simplest compound effect just delegates to nested effects, returning concatenated assigners. But implement as a fade with time zero? - [x] Fade compound effect: fade in at start, out at end. - [x] Cue list compound effect: Move through list of embedded effects, with optional fades. Loops, driven by metronome, or a variable parameter (knob controls where in the list we are). Maybe different implementations? - [x] Have effects pass a context map to children with show, snapshot, own stuff? For example, so the children can be aware of build, duration, a shared palette, other things? Or better, since snapshot is already passed, just add a usually-nil section which contains information about context, with at least information about when overall effect started; current fade level of this effect, fading in or out, when effect will end. Even better: This can be assoc-ed on to the snapshot, without changing the definition in rhythm.clj, since Clojure records are also maps! _This seems to be unnecessary given how fades and chases ended up being actually implemented._ - [x] Effects which can do their own blending implement an additional interface. Otherwise the fade and chase effects (if they are different), handle it. To fade between direction effects, convert them to pan/tilt numbers, scale between those, then convert back to a direction. _This was implemented as a multimethod for each of the effect assigner types._ - [ ] Provide a mechanism for creating and controlling/monitoring effects via OSC messages. Probably essentially a special-purpose OSC REPL. - [x] Add web page for viewing/adjusting cue variables; associate metadata with the variables so the page can provide appropriate editing tools and validation. Values live-update when controllers change them. - [ ] When it comes time to save data and settings, the luminus approach looks good, including [yesql](https://yobriefca.se/blog/2014/11/25/yesql-sql-in-sql-in-clojure/) and h2 as the database. Need to figure out where it would be stored, though. - [x] See if I can get Traktor to just send beat notes for master track; if so, add mode for MIDI sync to ride them like DJ link. - [x] See example on page 166 of Traktor Bible; it is close, but I want to add a condition that makes sure these pulses are sent only for the deck which is currently the tempo master. Write to the author for advice? Alternately, send separate messages when each deck is set as the tempo master, and use those to keep track of which beat pulses to pay attention to? - [ ] See if I can detect which Pro DJ Link device is the current master, and if so, add an option for down beat tracking using that. - [x] Add tap tempo support for really low-end sync. - [x] Add machine-readable metronome sync status flag, so Push can color code it; detect stalled clocks even without stop signals. - [x] See how Afterglow works as a hosted Max package, with an Inlet to send Clojure code to be evaluated, and an outlet for the results. This could be a quick way to add beat detection, sound spectrum analysis, etc. https://pcm.peabody.jhu.edu/~gwright/stdmp/docs/writingmaxexternalsinjava.pdf https://docs.cycling74.com/max7/tutorials/jitterchapter51 https://docs.cycling74.com/max7/vignettes/packages - [ ] Consider creating a [Processing Library](https://github.com/processing/processing/wiki/Library-Overview) for Afterglow. They are far more invested in the Java ecosystem than Max is, anyway. - [x] Provide a way to import QLC+ fixture definitions to help people get started. - [ ] Consider importing [Avolites](http://personalities.avolites.com) personalities/fixture definitions (D4 files); they seem fairly straightforward too. - [x] Separate, or at least document clearly, how to use the low-level OLA communication tools, for the benefit of people interested in their own implementations. - [x] Support Push version 2 if possible. As of March, 2016 this is looking possible! Ableton has published [detailed documentation](https://github.com/Ableton/push-interface) of the MIDI and USB interfaces of the Push 2 and display. - [x] For the display, I will need [Libusb](http://libusb.info/), and there is a promising-looking Java wrapper, [usb4Java](http://usb4java.org). Although there is a start at [Clojure bindings](https://github.com/aamedina/tools.usb), it does not seem to have gotten far. - [x] Embed some [fonts](https://www.google.com/fonts#ReviewPlace:refine/Collection:Roboto|Open+Sans+Condensed:300|Source+Sans+Pro:400,200italic). - [x] Support the Novation Launchpad series. The Pro has pressure sensitivity, so start there. They also provide excellent programmer documentation, so it will even be straightforward. For example, [Launchpad Pro Programmers Reference Guide](http://global.novationmusic.com/sites/default/files/novation/downloads/10598/launchpad-pro-programmers-reference-guide_0.pdf), found on their [Downloads Page](http://global.novationmusic.com/support/product-downloads?product=Launchpad+Pro). Having someone loan me one would speed this up! - [x] Novation is loaning me a Launchpad Mini! It [seems](http://www.soundonsound.com/sos/jan14/articles/novation-launchpad.htm) to use the same control messages as the Launchpad S, so refer to that guide in trying to set it up. Has only red/green 2 bit LEDs, so don’t try to replicate colors from the cue grid. - [x] Novation Launchpad Mk2 support added with the testing help of [Benjamin Gudehus](https://github.com/hastebrot). ### Ideas - [x] Model moving head location and position, so they can be panned and aimed in a coordinated way. - [x] [Wikipedia](http://en.wikipedia.org/wiki/Rotation_formalisms_in_three_dimensions) has the most promising overview of what I need to do. - [ ] Use iOS device to help determine orientation of fixture: Hold phone upright facing stage from audience perspective to set reference attitude; move to match a landmark on the fixture (documented in the fixture definition), and have phone use [CoreMotion](https://developer.apple.com/library/ios/documentation/CoreMotion/Reference/CMAttitude_Class/index.html#//apple_ref/occ/instm/CMAttitude/multiplyByInverseOfAttitude:) `CMAttitude` `multiplyByInverseOfAttitude` to determine the difference. - [x] The more I investigate, the more it looks like [Java3D’s](http://docs.oracle.com/cd/E17802_01/j2se/javase/technologies/desktop/java3d/forDevelopers/J3D_1_3_API/j3dapi/) [Transform3D](http://docs.oracle.com/cd/E17802_01/j2se/javase/technologies/desktop/java3d/forDevelopers/J3D_1_3_API/j3dapi/javax/media/j3d/Transform3D.html) object is going to handle it for me, which is very convenient, as it is already available in Clojure. To combine transformations, just multiply them together (with the `mul` method). - [x] Use `setEuler` to set a `Transform3D` to a specific set of rotation angles. - [x] If this leads to accuracy issues or loss of a degree of freedom, consider Quaternions, as recommended in this [article](http://java.sys-con.com/node/99792). - [x] Wow, this may be exactly what I need: Java code for converting Quaternions to Euler Angles: http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/ The site is in general an amazing reference for the kind of geometry I need to learn. - [x] This seems to be the formula I need to figure out the angles to send a light to make it face a particular direction (the selected, top answer): http://stackoverflow.com/questions/1251828/calculate-rotations-to-look-at-a-3d-point and transform.clj has an implementation in invert-direction. Now I just need to test it with an actual light! - [x] Remember that Vector3d has nice methods like angle (calculate angle to another Vector3d), length, cross, dot... - [ ] Render preview animations of a light show using WebGL. - [x] This [shader](https://www.shadertoy.com/view/Mlj3W1) looks nearly perfect, if I can figure out how to adopt it. - [x] Looks like a nice intro to 3D, linear algebra, shaders: [Making WebGL Dance](http://acko.net/files/fullfrontal/fullfrontal/webglmath/online.html). Has interesting references too, such as [Interactive 3D Graphics Course](https://www.udacity.com/course/interactive-3d-graphics--cs291), Eric Haines, Udacity.com. And the [Aerotwist tutorials](https://aerotwist.com/tutorials/), in particular Three.js and shaders. - [x] Fix the transform of lights into the WebGL shader space; currently inconsistent. - [ ] See if someone can come up with a more bare bones but scalable preview, probably building a geometry of the light cones instead of ray marching through them. - [ ] Add a Focus effect type, which is resolved after direction and aim effects are; this will allow, for example, fixtures to be annotated with functions that map from focal distance to DMX value (the Torrents would have two such functions, one for each gobo wheel), and those functions could be used by an auto-focus effect which would be given geometry information about the planes in the room (floor, ceiling, walls, screens), could figure out the distance to the nearest one the fixture is pointing at, and automatically generate a focus channel value to focus at that distance. A fade could be used with an oscillator to bounce back and forth between focus on each gobo wheel. - [x] Use [claypoole](https://clojars.org/com.climate/claypoole) for parallelism. - [ ] Change to core.async for all parallelism, since we are already using it anyway. - [ ] Add OSC support (probably using [Overtone’s implementation](https://github.com/rosejn/osc-clj)) for controller support, and MIDI as well. - [x] Serious references for color manipulation, but in [Julia](https://github.com/timholy/Color.jl). - [ ] Absolutely amazing reference on [color vision](http://handprint.com/LS/CVS/color.html)! Send him a note asking if he knows where I can find an algorithm for using arbitrary LEDs to make an HSL color! - [ ] Consider an alternate HSI color implementation. It could yield more pure/accurate results, but perhaps with less intuitive semantics, and definitely lower peak output. Most likely a configurable option? See the discussion and code on the [SaikoLED blog](http://blog.saikoled.com/post/44677718712/how-to-convert-from-hsi-to-rgb-white). And [related discussion](http://blog.saikoled.com/post/43693602826/why-every-led-light-should-be-using-hsi), with links to color correction. - [ ] When it is time to optimize performance, study the [type hints](http://clojure.org/java_interop#Java%20Interop-Type%20Hints) interop information looks very informative and helpful. - [ ] satisfies? seems to take twice as long as instance? so change the preconditions to use instance? where possible - [ ] Do a pass through all files with *warn-on-reflection* set to true, see what hinting can help. `(set! *warn-on-reflection* true)` at top of file. - [ ] Eventually create a leiningen task that can build a standalone jar with Afterglow and a custom show definition file and its supporting resources, so developers can easily deploy and share shows with non-Clojurists. - [ ] Consider adding support for metronome synchronization with [EspGrid](https://github.com/d0kt0r0/EspGrid). - [ ] Investigate whether [Vamp](https://code.soundsoftware.ac.uk/projects/vamp) (and jVamp) would be worthwhile for audio analysis. But adding native components is likely to be a hassle. - [ ] See if [thi-ng/color](https://github.com/thi-ng/color) is a better fit. - [x] Once I release the first version, answer this StackOverflow [question](http://stackoverflow.com/questions/9582192/dmx-software-to-control-lights-with-programmable-interface). - [x] Also submit a link to [TOPLAP](http://toplap.org/contact-page/). - [ ] Also post a followup to this [article](http://radar.oreilly.com/2015/05/creative-computing-with-clojure.html) and reach out to some of the artists themselves. (Sadly too late to post a comment on the thread, but I should try contacting the artists!) ### References * Clojure implementation of Protocol Buffers via [lein-protobuf](https://github.com/flatland/lein-protobuf) and [clojure-protobuf](https://github.com/flatland/clojure-protobuf). * The incomplete [Java OLA client](https://github.com/OpenLightingProject/ola/tree/master/java). * Making [Animated GIF Screencasts](https://gist.github.com/dergachev/4627207). ### Related Work - [x] Rich controller support for [Ableton Push](https://forum.ableton.com/viewtopic.php?f=55&t=193744)! - [x] [Color chart](https://forum.ableton.com/viewtopic.php?f=55&t=192920), post a followup if my hue theory pans out. - [x] Nice [breakdown](http://tai-studio.org/index.php/projects/sound-programming/accessing-abletons-push-device/) of button sections. - [x] It looks like I can actually specify an RGB color for the buttons using another SysEx: [PushPix](https://cycling74.com/wiki/index.php?title=Push_Programming_Oct13_03) - [ ] Could add basic grid control using the [Livid Ohm RGB](http://wiki.lividinstruments.com/wiki/OhmRGB), alhough it supports only 7 colors, no pressure sensitivity, and has been discontinued, so this is a low priority even though we own one, unless/until someone requests it. - [x] Add a user interface using [Luminus](http://www.luminusweb.net/docs). - [x] Separate [ola-clojure](https://github.com/Deep-Symmetry/ola-clojure#ola-clojure) into its own project. ## License Deep Symmetry Copyright © 2015-2023 [Deep Symmetry, LLC](http://deepsymmetry.org) Distributed under the [Eclipse Public License 2.0](https://opensource.org/licenses/EPL-2.0). By using this software in any fashion, you are agreeing to be bound by the terms of this license. You must not remove this notice, or any other, from this software. A copy of the license can be found in [LICENSE](https://github.com/Deep-Symmetry/afterglow/blob/master/LICENSE) within this project. ### [Antora](https://antora.org) Antora is used to build the [Developer Guide](https://afterglow-guide.deepsymmetry.org), for embedding inside the application, and hosting on [Netlify](https://www.netlify.com). Antora is licensed under the [Mozilla Public License Version 2.0](https://www.mozilla.org/en-US/MPL/2.0/) (MPL-2.0). ================================================ FILE: doc/README.md ================================================ # Developer Guide Module > :mag_right: If you are looking for the online documentation, it has > [moved](https://afterglow-guide.deepsymmetry.org/) off of > GitHub to become easier to read and navigate. Afterglow now uses [Antora](https://antora.org) to build its Developer Guide. this folder hosts the documentation module and playbooks used to build it. `embedded.yml` is used to create the self-hosted version which is served out of Afterglow itself, so it can be used even without an Internet connection, and `github-actions.yml` is used to build the [online version](https://afterglow-guide.deepsymmetry.org/) that is built by GitHub Actions. The Leiningen project in the root of this repository automatically invokes Antora to build the embedded version as an early build step. The online version, which will grow to support multiple released versions of Afterglow, is built automatically whenever changes are pushed to the relevant branches on GitHub. ================================================ FILE: doc/antora.yml ================================================ name: afterglow title: Afterglow version: ~ display_version: 'main' prerelease: true start_page: ROOT:README.adoc asciidoc: attributes: icons: font experimental: '' page-copyright: 2015–2022 page-pagination: '' nav: - modules/ROOT/nav.adoc ================================================ FILE: doc/ds.yml ================================================ site: title: Afterglow Developer Guide url: https://deepsymmetry.org/afterglow/guide start_page: afterglow::README.adoc content: sources: - url: https://github.com/Deep-Symmetry/afterglow.git branches: [main, guide*] tags: va* start_path: doc antora: extensions: - require: '@antora/lunr-extension' index_latest_only: true asciidoc: attributes: api-doc: http://deepsymmetry.org/afterglow/api-doc/ icons: font experimental: '' ui: bundle: url: https://deepsymmetry.org/media/antora/ui-bundle-3.zip snapshot: true ================================================ FILE: doc/embedded.yml ================================================ site: title: Afterglow Developer Guide url: http:/guide start_page: afterglow::README.adoc content: edit_url: false sources: - url: ./.. branches: HEAD start_path: doc antora: extensions: - '@antora/lunr-extension' asciidoc: attributes: api-doc: link:../../api-doc/ icons: font experimental: '' ui: bundle: url: https://deepsymmetry.org/media/antora/ui-bundle-3-self.zip snapshot: true output: dir: ./../target/classes/developer_guide ================================================ FILE: doc/github-actions.yml ================================================ site: title: Afterglow Developer Guide url: https://afterglow-guide.deepsymmetry.org/ start_page: afterglow::README.adoc robots: allow keys: google_analytics: G-ZNLRY347Y7 urls: redirect_facility: httpd content: sources: - url: https://github.com/Deep-Symmetry/afterglow.git branches: [main, guide*] start_path: doc antora: extensions: - require: '@antora/lunr-extension' index_latest_only: true asciidoc: attributes: api-doc: https://afterglow-guide.deepsymmetry.org/api/ icons: font experimental: '' ui: bundle: url: https://deepsymmetry.org/media/antora/ui-bundle-3-self.zip snapshot: true ================================================ FILE: doc/modules/ROOT/assets/source/Afterglow logo.ai ================================================ %PDF-1.5 % 1 0 obj <>/OCGs[5 0 R 31 0 R 81 0 R 131 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream application/pdf OLA Logo RGB CS6 2015-07-20T14:20:46-05:00 2015-07-20T14:20:46-05:00 2015-07-20T12:06:36-05:00 Adobe Illustrator CC 2015 (Macintosh) 256 136 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAiAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FVk88EELzT yLFDGC0krkKqqOpLHYDFXknnL/nKf8pfLbvBBfSa9eJUGLS1EsYPvOzJCR/qM3yxV5Fr3/ObvmKV 2XQPLdpaJ0V76WS5Y+5WL6uB8qnFWHXn/OXP5zzvyivbO0H8kNpGR/yV9U/jiqEj/wCcrPzwVnLa 5E4Y1VWsrOi+w4xA/fXFU203/nMb83LVl+sppmoKKBhPbMhNOprBJFucVZ/5b/5zesndI/MvlqSF f27rTphL/wAkJhH/AMncVe1eR/zq/LXzqUi0TWoTfv0025/0e6r4LHJTn/sOQxVnGKuxV2KuxV2K uxVLPM3/ABwb3/jGf1jJQ5uVov76PveUXH90cyC9ZDmxfVP2sw8rtcDFb3+9HzzUah2+LkmOnds1 OVxszKtN7ZrcrqszKdN7ZrsrqszIF/uRmH1dXlSvUv7psysPN1uo5PPte/azpNG8lrmIf7ub551O jecyJhbds6zROJNf+1mVld92ejYvsDMGXN6vF9L6cznnJdirsVeV/nB/zkL5R/LuN7Ef7lvMrLWP SoWAEdRUNcyb+mKbgULHwpvir41/MT84vPvn65Ztd1FhYcuUOlW5MVpHQ1H7oE8yP5nJb3xVhOKt gEmg3JxVMbby35hugGttMupVPRkhkK7+4FMujp8kuUT8mByRHMhE/wCCvN3/AFZ7v/kU39Ml+Uy/ zT8mPjQ7wgLvRtYsxW8sbi2A7zROnv8AtAZXLFOPMEfBmJxPIoPK2TYJBBBoRuCOtcVe1flb/wA5 TeefKLw2OuO/mLQVopiuHJu4l6fubhqk0/lkqOwK4q+xvIn5heVPPWirq/ly8W5g2W4gb4Z4HIrw mj6q34HsSMVZHirsVdirsVSzzN/xwb3/AIxn9YyUOblaL++j73lFx/dHMgvWQ5sX1T9rMPK7XAxW 9/vR881Godvi5Jjp3bNTlcbMyrTe2a3K6rMynTe2a7K6rMyBf7kZh9XV5Ur1L+6bMrDzdbqOTz7X v2s6TRvJa5iH+7m+edTo3nMiYW3bOs0TiTX/ALWZWV33Z6Ni+wMwZc3q8X0vpzOecl2Kvnn/AJyK /wCckF8rev5T8oTq/mMjjf6ivF0sgesaVqGn8aiif63RV8a3FxcXM8lxcyvNcTMXlmkYu7uxqzMx qSSepOKq+maTqOqXa2mn273Nw37CCtB4seij3OWY8UpmoiyxlMRFl6f5d/JeFQs+vXBkfr9UtzRR 7PIRU/7Gnzzc4OyRzyH4Bwcmt/ms/wBL8uaDpShdPsIbcj/diqC/0uaufpObTHp4Q+kAOHLJKXMp llzB2KuxVItY8j+VtWVvrWnxrK3+74R6UlfHklK/7KuYuXR4p8w2wzzjyLzXzP8Ak/qdir3OjSG/ t13NuwAuAPanwv8ARQ+2ajUdlSjvD1D7XOxawHaWzz10dHZHUq6khlIoQR1BGakhzE98keevMvkr Xodb8v3ZtruP4ZENTFNHUFopkqOaNTp9IoaHFX3t+T35w+X/AMyvL4vLMi11i1CrqulM1Xhc/tp/ NE37LfQd8VZ/irsVdiqWeZv+ODe/8Yz+sZKHNytF/fR97yi4/ujmQXrIc2L6p+1mHldrgYre/wB6 Pnmo1Dt8XJMdO7ZqcrjZmVab2zW5XVZmU6b2zXZXVZmQL/cjMPq6vKlepf3TZlYebrdRyefa9+1n SaN5LXMQ/wB3N886nRvOZEwtu2dZonEmv/azKyu+7PRsX2BmDLm9Xi+l9OZzzkvFv+clPzt/wFoK 6LosoHmrVo29BxQm0tz8LXBH85NRH71PahVfC0kkksjSSMXkclndiSxYmpJJ6k4qn3k/ydqHmXUP RhrFaREG6uyKqgPYeLHsMytLpZZpUOXUtObMIDze8aB5d0nQrIWmnQiNf92SHeSRv5nbvnT4MEMU aiHU5MhmbKZ5cwdiq2SSONGkkYJGgLO7GgAHUknATSpXZebPLV7dfVLTU7ea4JosayCrHwX+b6Mp hqccjQkLbJYpAWQm2XtbsVdirEPPH5eaf5hha5twttqyj4JwKLJQbLLT/iXUZgazQxyixtL8c3Iw agw2PJ4Xf2F5YXktneRNDcwtxkjbqD/TwOczOBiaOxDtoyBFhN/IvnfXvJXmW08waJN6d3bGjxtX 05oiRzhlUEckem/3jcA5FL9Evy9896L568qWfmPSG/cXK8Z7diC8E6/3kL0/aU/eKHocVZHirsVS zzN/xwb3/jGf1jJQ5uVov76PveUXH90cyC9ZDmxfVP2sw8rtcDFb3+9HzzUah2+LkmOnds1OVxsz KtN7ZrcrqszKdN7ZrsrqszIF/uRmH1dXlSvUv7psysPN1uo5PPte/azpNG8lrmIf7ub551OjecyJ hbds6zROJNf+1mVld92ejYvsDMGXN6vF9L6I80+ZNM8s+XdR1/VH4WOmwPPMRTkeI2Ra0qztRVHi c55yX5t+d/N+recPNOo+Y9Vfld6hKZOANVjjG0cSf5MaAKPliqt5A8kax5382WHlzSl/0i8f95OR VIYV3kmf/JRd/c7dTir9CPJH5ZeTfJmj2mm6Np8QNqATeSqHuJJKAPK0hFQzkVPGg8ABlniy4eG/ T3MeAXdbsqytkgNT0HRdUUjULGG5JUoHkRS4B68X+0v0HLceacPpJDCWOMuYYTc/kpokmo+tDezw WBqXtAFZwSTskrdFG32lY++bGPa8xGiAZd/7HFOijfPZ41/zlt5bsfLHk/QoNHt5I4b66kj1C8aR 2Z/SjDRxuK8PiJZtlH2cxM2ty5BRO3c349PCO4G75WVmVgykqymqsNiCO4zEbn3v5J/LXR/MX5de XNUufWsdWvdLtp7mVGLK80kKt6jxycvtE8qKVzZYu1MsefqcWejgeWzHvNP5ba/oKvcBRfaetSbq EGqqKmske5TYbndR45t9N2hjy7cpdzhZdNKG/MMTzOcd2KsN/MfyTHr+nG7tEA1a0UmIjrKg3MR/ 419/nmv1+j8WNj6h+KcnTZ+A0eTwcgqSCKEbEHrXOYds9q/5xZ/NKTyj56j0O+l46D5idLaYMfhi ujtbzb9KsfTb2NT9nFX3TirsVSzzN/xwb3/jGf1jJQ5uVov76PveUXH90cyC9ZDmxfVP2sw8rtcD Fb3+9HzzUah2+LkmOnds1OVxszKtN7ZrcrqszKdN7ZrsrqszIF/uRmH1dXlSvUv7psysPN1uo5PP te/azpNG8lrmIf7ub551OjecyJhbds6zROJNf+1mVld92ejYvsDMGXN6vF9K7/nNTzy9ro+keS7W Ti+osdQ1JR19CFuECn/JeXk3zQZzzkvkXFX2V/ziv5O0jyb5Ak8764y29/5h2tnkHxrZRn92iKKs TKymQ06rx8Mry5YwFyNBjOYiLLN9Y/OG8eTjpFosUQr+9ufidgV/kUgLQ/5RzT5e1j/APm4E9af4 Q8e/ND/nIjzx5ceGy0++DaldJ6rM8acIoqlQQqqKsxBpv2y7QzzZblKXp9w/U2aeU57k7IH8qv8A nLnzenmO003zs0GoaRezJC9+sSQTWxc8RIfTCo8ak/ECvKm4PY7XkHMfWGk+YNO1QutsxWSPcxSA KxX+YUJqMxNLrsea+HmOha8eaM+TBvzf8gaV5h02QajCbixueKzgV5xSKKRyxtvxPb+vLOh0U45I +FL4OPqImJ4w8M0r/nHDyfaaitzdXd1f28bcltJCiK1DsJGQAsPlTMiHZkAbJJa5auRD2PTtV1DT gq2U7QRrssS/3fSn2DVfwzMyYIT+oNEcko8inesfm/pPl/ytqOta1EVbT4TIscX2Z3JCxxKTXgzu wXfb9WabV6E4xxA3Fz8Oo4tjzfGes/nn5kv9bmv7awsbC0lcsunQo5jVSenItWv+rQeAHTHH2nli ALv3rLSQL03yv5htvMGjQalAvp+pVZYSalJF2Za7V8R7Z0GmzjLASDrcuMwlSbZe1vD/AM2/LS6Z ro1G3Tja6lV2AGyzj+8H+yqG+/Ob7T0/BPiHKX3u00mTijR6MFBIIINCNwR1rmsct+jX5J+dz50/ LPRdbmfnf+l9W1Enr9Ztz6cjH/jJxEnybFWc4qlnmb/jg3v/ABjP6xkoc3K0X99H3vKLj+6OZBes hzYvqn7WYeV2uBit7/ej55qNQ7fFyTHTu2anK42ZlWm9s1uV1WZlOm9s12V1WZkC/wByMw+rq8qV 6l/dNmVh5ut1HJ59r37WdJo3ktcxD/dzfPOp0bzmRMLbtnWaJxJr/wBrMrK77s9GxfYGYMub1eL6 Xi3/ADkp5jfXfzl19w/KDTpF023WteItVCSKP+e3qH6c55yXnmj6e2patZaepKm7njg5AVI9Rwta e1a5GcxGJkeQRKVC315qeqy3wtoQogsbCGO10+zQnhDBEoRFWvU0UVPf5UGcrqdTLLKz8A6bLlMz ZQWY7Uwf82vyU85a5pdn500Gxl1KMq1rc2NuvqTiOJjwnSNSzuC7OjKBUcQehrnRdlxIxb9S7TRg 8DzjyF+VPm3XPMFqlxp1xY6dDKj3l3cxvCoRSGZU5gcnI2AH07ZLV6/HjgaIMugDZlzxiOe767tr me2nSeBzHNGao47HOSx5JQkJRNEOrjIg2HpVjcWuvaJWVQVnUxzoKfC460+1Sh+Jfozt9BrOOMck ef6fx9jtoSGSDzG5t5La5lt5KepC7I9OlVNDTOyhISAI6uqkKNKeTYsa/MbyvN5o8m6jo1u4S6mV XtmY0X1InEihj4Nx4/TmPqcXiQMQ24p8MgXytH+XvnqTVf0TFoF/LqJbiLeO3kcnenIFQV4/5Vae +c3PHKP1CnaxmDyL3ry/+XWueQtFtNJ1tUTULlBeyxowcIZtvTLLUFk4cWptXpUb50XZVeFt3us1 l8aYZsnFYp+Z+kjUfJ94QtZbOl1GfD0/t/8AJMtmD2ji48J8t3I00+GY83z/AJyzt31j/wA4Q+ZG ey8y+WpG+GGSHUbZP+MqmGc/8k4sVfUeKpZ5m/44N7/xjP6xkoc3K0X99H3vKLj+6OZBeshzYvqn 7WYeV2uBit7/AHo+eajUO3xckx07tmpyuNmZVpvbNbldVmZTpvbNdldVmZAv9yMw+rq8qV6l/dNm Vh5ut1HJ59r37WdJo3ktcxD/AHc3zzqdG85kTC27Z1micSa/9rMrK77s9GxfYGYMub1eL6Xyz5k1 JtU8xapqTNya+u57ktWtTNKz1rQfzeGc85Kf/lLZi5896eWFVgEsxHusbBf+GIzB7RlWE+bj6o1j L6KzmXUOxV7/AHqjQ/KpggYn6pbpbxyCitWgjD7d6nlnTaqXg6c10Ffot3GT0Y9ugeb5xrqnYqyj yJqJivpLFz8FwOUY32dBU07brWvyGbrsXUcMzA8pfeP2fc5mknR4e9D+erIwawLgA8LpA3I9OafC QPoCn6c9E7NyXjr+ax1calfexzNi4rsVTTyxevaa5aupPGVxC4rQFZPh3+RofozF1mPixHy3+Tdg lUwivzs09JNGsL/f1Le4MNB04TIWJP0xCnzzB7InUzHvH3f2uTrY+kF47nQOtUb22S6s57Z/sTxv E3ydSp/XkZx4gR3pBo2+W2UqxVhQg0IPiM4p3z3X/nDbUHtvzamthXhfaXcRMO1UkilB/wCSdPpx V9vYqlnmb/jg3v8AxjP6xkoc3K0X99H3vKLj+6OZBeshzYvqn7WYeV2uBit7/ej55qNQ7fFyTHTu 2anK42ZlWm9s1uV1WZlOm9s12V1WZkC/3IzD6urypXqX902ZWHm63Ucnn2vftZ0mjeS1zEP93N88 6nRvOZEwtu2dZonEmv8A2sysrvuz0bF9gZgy5vV4vpfI+c85L0D8kQD5zckVpaSkf8EgzW9qf3Xx cTWfR8Xvec66tJfNfnW08n2EWrT24vJRMi29mTxWVweXFjvRaLvtmXosByZB5bt+nxmUmLP/AM5f efr+4WLWNP0+XS2kDS29rHLFKFB/YkeSQbf5Q3zf6zTeNj4bp2mXHxxp7jpmo2mp6dbajZv6lrdx JPA/SqSKGXbtsc4ucDGRieYdQRRoonIoZX5H01ec2qz0WKAFImOwrT426/srt9Ptm77IwAXmlyj+ Cfk52jxWb+SO86Qw32hW+pW5DpGVkSTpWKYAVA9zxztey8w466SDPUgSgJBgeb91zsVYr+Yn5hWn kfRU1J4/rF7LJ6djbA8eUgHLkzb0Ve/3Zi6rOMcbO9t2HGZl5hff85bedNbgm0/XtL099MuHRj9U SaOaLgwNUZ5ZFbYbhhv4jNFpc/hZBJ2ObHxxIZjbXENzbRXMDc4Z0WSJx0KuOSn6Qc62MgRY5F0x FGlTJIfLd7x+u3HGpX1H4k9acjnFT5l30eT1n/nE/wD8nbo//GC8/wCoaTIpfemKpZ5m/wCODe/8 Yz+sZKHNytF/fR97yi4/ujmQXrIc2L6p+1mHldrgYre/3o+eajUO3xckx07tmpyuNmZVpvbNbldV mZTpvbNdldVmZAv9yMw+rq8qV6l/dNmVh5ut1HJ59r37WdJo3ktcxD/dzfPOp0bzmRMLbtnWaJxJ r/2sysrvuz0bF9gZgy5vV4vpfKOqWTWOp3di1eVrNJC1etY3K9vlnPOSyz8nboQ+erRCafWIpout P91l/wDjTMDtKN4T5U42rFwL6FzmnUsH/NvyvqOu+X4m05DNdWMvq/Vx9qRGXiwXxYbGn8c2HZ2o jjn6uRcnS5BGW/V41o3kTzlrWoDT9N0a8nuurqIXAjWleUjEBUWndjTOilMCPF05u1JFW+vvKWhn QvLOmaOz+o9jbxwySCtGcD4yK9uVaZw+oy+JkMu8unnLikSndrbS3VxHbwjlLKwVR7nx9shjxmch EcyxjEk0GWea76PRtP0nQbUkSX0oUncH0YSHmao7s7KCO4Y50HapGDSGEe6v1/N67sfRg8U/4ccf tPL9J96K8oXC6t5bubCdizWs1xYStQCig8ouP+rFIg+jNl2VnPg45jmAPsdHiPEJRP8ADKUf1fYQ wW5t5Le4lt5RSSJijgeKmhzuISEgCOrrpCjSnkmLzP8APTyJr3mrQrOXQ7Z7290ySSVrKIcpHidB zKKN2ZeAPEdRXvmt7Tx3AS7nL0kqlXe+b7Tyzr93erZQ6fP9ZZuPBo2TiQaHkWA4gd65pseKUzUR bnzmIiy+i9F079G6RZafy5m1gjhL+JRQCfpzr8OPggI9wdJOXFIlE3M6W9tLcP8AYhRpG+Sip/Vk pSoWgCzT5ad2d2djVmJJPuc4ol3z3H/nDmwe5/N15wPhsdMuZmNP5njhH/J3FX3DiqWeZv8Ajg3v /GM/rGShzcrRf30fe8ouP7o5kF6yHNi+qftZh5Xa4GK3v96Pnmo1Dt8XJMdO7ZqcrjZmVab2zW5X VZmU6b2zXZXVZmQL/cjMPq6vKlepf3TZlYebrdRyefa9+1nSaN5LXMQ/3c3zzqdG85kTC27Z1mic Sa/9rMrK77s9GxfYGYMub1eL6Xgn58aA+hfm95psmXikt895FQUHp3tLlQPYCWn0ZzzksV8tap+i tf0/UT9m2nR5PdA3xj6VrlWfHxwMe8MMkeKJD6nVlZQykFSKgjcEHOQdG3ir2H8qvMK3ujHS5nrd af8A3YJ+JoGPwnc1PA/DsKAcc6HszPxQ4Tzj9ztNJkuNdQlfmTRm0vUGRR/o01XtzvSld137rmg7 Q0ng5KH0nl+r4OJnxcEvJOPIemB5ZdRkFRH+6h/1iKsfoUgfTmw7F09k5D02H6W/SY/4mI6tqp1j 8z7llNbfTONlDsR8UZJlr7+ozCvgBmL7Q5rFdz6FpsHg6Ad8/V8+X2Jp5F1UWPn/AFXSJDSPU41n gqT/AH0INQB0+KMkk/5ObP2fnxaav5r5wMnh62cD/GL+I/Z9yb+fNHZZl1SJSUkolzTsw2Vj8xt9 HvnZdm57HAfg26vHvxBiObZwmdeRNIaG3k1GZSsk44QA7fu9iW6/tHxHb3zSdpZ7IgOnP3uw0mOh xF5d+ZvmRNa8yOtu/OxsR9XtypqrMDWSQbkfE21R1AGbTs7T+Hj3+qW7ianJxS25BiWZ7jpJ+YDz 2fkDV9S+xAVWyR2NOctyePpp4t6fN/kp9s1/aOoEMZH8UnJ02IylfQPm/OYds+rP+cIPLzBPM/mO RfhJg062encVmmFfpixV9UYqlnmb/jg3v/GM/rGShzcrRf30fe8ouP7o5kF6yHNi+qftZh5Xa4GK 3v8Aej55qNQ7fFyTHTu2anK42ZlWm9s1uV1WZlOm9s12V1WZkC/3IzD6urypXqX902ZWHm63Ucnn 2vftZ0mjeS1zEP8AdzfPOp0bzmRMLbtnWaJxJr/2sysrvuz0bF9gZgy5vV4vpST/AJzX8mPDq+i+ cYI/3N3EdNvmA2EsRMkJb3dGcf7DOecl8xYq+h/yo8yrrPlWGCR63umgW04PUoo/dP8ASu3zBzme 0MHBkJ6S3dTqsfDLyLNMwXGR2i6zfaNqMV/ZPxmjO6ndXU/aRh3B/tG+W4c0schIM8czE2Htmm6r oPm/SGCHlTj68J2lhkIqCKj50YbHf3GdFeLVY6P7QXaiUMsU00rT007T4bNG5iIGrkUqWJYmnzOX abAMWMQG9NmOHDGnhnkH1ri+e8nJae4kaaVj1LO3In7znEdr5OIl9F7VqMOEcgKW+c7q50rzTZar anjPA6uh3pVTWhpSoNKEZuvZTKPpPIvjftDxY8wyR5h7PoWuaR5p0T6xEA8MoMdzbMatG/dWp94P 051eSEsM/MO402ohqMYkOR6JfbeQbKK99WWdprZTVYCtCfAMwO4+QGZk+05GNAUe9EdIAbvZW86j zO+kNY+XLXlPMOElwHjj9OPoRHyZfiPSvbtv0o0nh8fFkOzZm4+Goh5bZ/lF5znaksUFoP5ppVI/ 5Jeqc3U+1MI5En4frpwRpJlP9E/JOUSh9bvkMan+4tKksKd5JFXjv24n55i5u1xXoHzbYaL+cXgX /OW3nLTZdd07yFoYSPSvLqmW8ji+yb2YfZY1PJo4urHfkzV3zTZMkpm5Gy50YiIoPn7IMn6If84/ +Sm8oflXo2nTxmO/uozqGoK2zCa6o/Fh4pHwQ/6uKvRMVSzzN/xwb3/jGf1jJQ5uVov76PveUXH9 0cyC9ZDmxfVP2sw8rtcDFb3+9HzzUah2+LkmOnds1OVxszKtN7ZrcrqszKdN7ZrsrqszIF/uRmH1 dXlSvUv7psysPN1uo5PPte/azpNG8lrmIf7ub551OjecyJhbds6zROJNf+1mVld92ejYvsDMGXN6 vF9L3D80/Ilp568i6p5cn4rNcx87GZv91XUfxQvXrTkKNT9kkZzzkvzg1LTr3TdQudOvomgvbOV4 LmB9mSSNirKfkRiqceRvNk/lnXY71avaSfur2EftRE9R/lL1GY2r04ywrr0as2LjjT6Us7y2vbSK 7tZBLbzoJIpF6MrCoOcrKJiaPN0xBBoq2BCvZ6peaXOt9Zztbzw7rIhodt6EHYg+B2OW4JTExwGi 3aeM5TEYfUWf+XPz002dkttftmtJyafW7cGSE9TVk3kTsNuX0Z0p1UY/U9x/IGWceLHv5HY/q+5m 1pP5N1Qi6tmtJZZ/jMi8UmY+LfZkr88xcsdHm2lwG/gf0F1+SOpxemXEAPl+pR1byr5IkK3eqwQc YviEk8zKgp4hnC/fl2m0Wnwb4xXxP6S6jVYsWTfLW3el9556/LXyxau1vcWqK45+jpsayeoVFACY Rw5f67DNt4WWY4jZHeWjFqtNA8EDH3R/Yl9n+dOhXBaRrG5W1YK1vIpjd2B680LKEI9mbNLPtOMJ mMgdmf5yINEFPI/zL8luqk35RmAJRoZqgnsaIR+OWjtHCf4vsLYNVj717fmN5MUVOpL9EUx/UmE6 /CP4vvSdTj72D/mp/wA5D+V/KPlu4n00te6zOrR6XEUKxmYj7b8+LcI61NBv02rXJ4tXDIajuyhm jI0HwdfXt3f3s97eStPd3UjTXE7mrPJISzMx8STXMltel/8AOOn5Zt56/MS1S6h9TQtHK32rFhVG VD+6gPj6rihH8obwxV+gWKuxVLPM3/HBvf8AjGf1jJQ5uVov76PveUXH90cyC9ZDmxfVP2sw8rtc DFb3+9HzzUah2+LkmOnds1OVxszKtN7ZrcrqszKdN7ZrsrqszIF/uRmH1dXlSvUv7psysPN1uo5P Pte/azpNG8lrmIf7ub551OjecyJhbds6zROJNf8AtZlZXfdno2L7AzBlzerxfS+nM55yXy7/AM5a /kpLciT8xNAgLyxoq+YbWMVLIgCpdqo/kUcZPajdmOKvk3FWdflx+ZE3lub6hfcptGlapA3eFj1d PFT+0v0jfrr9bohlFj6vvcXUafj3HN71Y31nfWkV3ZzLPbTDlHKhqpGc7OBiaOxdWYkGihtTuKAR A+7/AMBmfoMW5kXouwNJxSOQ+4fp/HvSyxT1b1fAZZrJ7PqeCHBies+UI+PD6M5HWl53tA3aj5/g 9S0O3jmV2ROpvn/bsLg8w4etZPGeq7j6M9c7Nnx4uF4LFPgyAr/Ld2aSWTndPjj+RPxD785DtzS8 E+Mddj+j8eT1hPEBJPM0LBI/NnnDR/LNgbm+flM4P1a0Qj1JWHgOw8W7ZkafTSymh823FiMzQfOv mXzJqXmLVZNRv2q7fDFEv2I4x0RR4DOmwYI4o8MXbY8YgKCF0rS9R1bUrbTNNt3ur+8kWG2t4xVn kc0VRlzY/Qz8lvytsvy58l2+kLxl1W4pcaxdrv6lwwAKqaA+nGPhT7+pOKs9xV2KoHXLae60i6t4 F5zSJxRagVNfE0GGJ3b9LMRyAnkHn03kzzK0ZAs6n/jJF/zXlxmHoo9o4Afq+w/qSG//AC585y19 PT+Vf+LoB+t8x8gvk5+LtjTDnL7JfqY/dflJ+YLyArpVRX/lotv+qua3Np5nkHYw7f0YH1/7GX6k bZflb57jpz0yn/Pe3P6pM1+TQZjyj9o/W05O3dIeU/8AYy/Un9l5B82xU52FP+esJ/U+YOTsrUHl H7R+t1+TtbTnlL7D+pP7Hyrr0VOdrT/npGf1NmFk7F1R/g+2P63X5NfhPKX2H9ScDRNT9Lj6O/8A rJ/XMb+QdZf0f7KP63AyamB6oC+8ta1LGQltUn/LjH62zIxdiaoHeH2x/W4WaYkNmHav+XfnG4r6 On8q/wDF0A/W+bvTaDNHnH7R+t53V6PLPkPuY5/yqX8wfULforYn/lotv+qub/TRMebpZ9kak/w/ bH9aMg/Kzz4tOWmU/wCe9v8A9VM6HTazFHmfvceXYuq/mfbH9a//AJVd575V/Rn/ACXt/wDqpmRk 1+E8pfYf1O20fZ2aH1R+0frRMf5aedgoB03f/jNB/wBVMwzqsff970GOBAe65p29bJHHLG0cih43 BV0YAqykUIIPUHFXxj/zkV/zjld+WLm682eU7b1fLEh9S9sIgS9izH4iq94K9KfY6HbfFXz3iqfe VvOuveWpy+nzVt3NZrSSrRP78aih9xvmPqNLDKPVz72rLhjPm9P0n80NB1gAXT/o+8f7Ucx/d1/y ZNh/wVMpGnOONDo9L2PnwwEYE8Nd7NPL6LJKJFIZW3BG4IzSayT3WYgQFPWPK6U4Zy+rLy2tLvOE XOzb6cu7OlU3jO1o3B5PF+7uZEPSp/HPVOxM3J841EaKTajeQaPeC8mlSGONqlnYKCOhFT4jbMnt bSicSD1ei7MyeJj4Ug81fnbYwK9t5di+tTEU+uzArEp/yUNGY/Og+echp+yid57eTtsWjJ3k8g1P VNQ1S8kvdQuHubqT7crmp9gOwA7AbZuoY4wFRFBz4xERQWWVjeX95DZWUElzeXLrFb28Sl5HdjRV VVqSScmyfbn/ADjp/wA4/ReRLRfMXmBEm823cdEi2ZbGJxvGjb1lYGkjD/VG1Syr3HFXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWmVWUqwDKwoyncEHscVfNH5z/wDOJNrqUlxrv5fL HZ3rVkn0BiI7eRjuTbOfhiY/yH4PAqNsVfKOtaHrOh6jLpmsWU2n38BpLbXCNG48DRgNj2I2OKoH FUy0nzJr+juG0y/ntaGvCNyEJ90Pwn6RlWXBCf1AFyMOqy4/okQzzRv+civzM0wAfWLW7p0NxbrX /kl6WavN2Dpp9CPcf123S7Ryy5m0w1L/AJye8/38LRSWOlx8v244bio/4Kdh+GV4fZ7BjNgz+Y/U 4Wc+IKLDL/8AM/zjdyM/1tbfn1EEaL9xIZvxzd4I+F9LrP5J092Y37yxy91C+vpjNe3ElzKf92Su zt97E5ZKcpGybc7HijAVEADyQ+RbGX/l7+VPnfz9f/VfL2ntLAjBbnUZax2sNf8AfkpFK9+K1Y9h ir7S/Jz/AJx+8qflzAt6aap5mkSk+qyqAI6j4ktkNfTXxP2m7mmwVep4q7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUg83+QfJ3nGx+p+ZNKg1GIAiOSRaSx16mKZeMkf+xYY q+fvOf8AzhPYzO9x5O11rWtSthqamRKnsLiIB1X5xsffFXkOv/8AOMH5z6OzEaH+koF6T2E0UwPy jLJN/wAJirDL78tvzDsCwvfLGrW/Hq0ljcKtK0ryKUIr3xVA/wCE/NP/AFZr7/pGm/5pxVNtO/Kj 8zdSYLZ+VNWlBoBJ9TnVN6dXZVQdfHFWf+W/+cR/ze1Z0N/bWuh253Ml5Ojvx9o7f1jX2bjir27y L/zh55B0Vo7rzJcTeY7xaEwsDb2gb/jGjF3of5nof5cVe6afp2n6bZxWOnW0VnZQLxhtoEWONF8F RQFGKojFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX//2Q== uuid:179f7641-5b82-f94b-aee1-41c2d263a77c xmp.did:3f5bc854-b7f3-4530-a63b-4e8e84ed7795 uuid:5D20892493BFDB11914A8590D31508C8 proof:pdf uuid:4b8d80fb-79e0-e648-b7e5-561a697a3c5f xmp.did:78407A0809206811822AB037A4F90ED9 uuid:5D20892493BFDB11914A8590D31508C8 proof:pdf saved xmp.iid:0180117407206811822AB037A4F90ED9 2012-08-26T15:46:21+10:00 Adobe Illustrator CS6 (Macintosh) / saved xmp.iid:3f5bc854-b7f3-4530-a63b-4e8e84ed7795 2015-07-20T12:06:36-05:00 Adobe Illustrator CC 2015 (Macintosh) / EmbedByReference /Users/jim/Desktop/Beam.png 0 0 EmbedByReference /Users/jim/Desktop/Clojure Beam.png 0 0 EmbedByReference /Users/jim/Desktop/Clojure-Logo.png 0 0 /Users/jim/Desktop/Beam.png 0 0 /Users/jim/Desktop/Clojure Beam.png 0 0 /Users/jim/Desktop/Clojure-Logo.png 0 0 Document Print False True 1 296.999935 210.001661 Millimeters Cyan Magenta Yellow Black Default Swatch Group 0 White RGB PROCESS 255 255 255 Black RGB PROCESS 29 29 27 CMYK Red RGB PROCESS 226 6 19 CMYK Yellow RGB PROCESS 255 236 0 CMYK Green RGB PROCESS 0 149 64 CMYK Cyan RGB PROCESS 0 158 226 CMYK Blue RGB PROCESS 49 39 130 CMYK Magenta RGB PROCESS 229 0 126 C=15 M=100 Y=90 K=10 RGB PROCESS 189 22 34 C=0 M=90 Y=85 K=0 RGB PROCESS 229 51 42 C=0 M=80 Y=95 K=0 RGB PROCESS 232 78 27 C=0 M=50 Y=100 K=0 RGB PROCESS 242 145 0 C=0 M=35 Y=85 K=0 RGB PROCESS 248 177 51 C=5 M=0 Y=90 K=0 RGB PROCESS 252 234 13 C=20 M=0 Y=100 K=0 RGB PROCESS 221 219 0 C=50 M=0 Y=100 K=0 RGB PROCESS 147 192 31 C=75 M=0 Y=100 K=0 RGB PROCESS 57 169 53 C=85 M=10 Y=100 K=10 RGB PROCESS 0 141 54 C=90 M=30 Y=95 K=30 RGB PROCESS 0 102 51 C=75 M=0 Y=75 K=0 RGB PROCESS 45 171 102 C=80 M=10 Y=45 K=0 RGB PROCESS 0 160 153 C=70 M=15 Y=0 K=0 RGB PROCESS 53 168 224 C=85 M=50 Y=0 K=0 RGB PROCESS 29 112 183 C=100 M=95 Y=5 K=0 RGB PROCESS 45 46 130 C=100 M=100 Y=25 K=25 RGB PROCESS 41 35 92 C=75 M=100 Y=0 K=0 RGB PROCESS 102 36 130 C=50 M=100 Y=0 K=0 RGB PROCESS 148 27 128 C=35 M=100 Y=35 K=10 RGB PROCESS 162 25 91 C=10 M=100 Y=50 K=0 RGB PROCESS 214 11 81 C=0 M=95 Y=20 K=0 RGB PROCESS 230 27 114 C=25 M=25 Y=40 K=0 RGB PROCESS 202 186 159 C=40 M=45 Y=50 K=5 RGB PROCESS 163 137 122 C=50 M=50 Y=60 K=25 RGB PROCESS 122 106 88 C=55 M=60 Y=65 K=40 RGB PROCESS 99 78 66 C=25 M=40 Y=65 K=0 RGB PROCESS 201 157 102 C=30 M=50 Y=75 K=10 RGB PROCESS 177 127 73 C=35 M=60 Y=80 K=25 RGB PROCESS 146 95 54 C=40 M=65 Y=90 K=35 RGB PROCESS 126 78 36 C=40 M=70 Y=100 K=50 RGB PROCESS 104 59 17 C=50 M=70 Y=80 K=70 RGB PROCESS 66 41 24 Grays 1 C=0 M=0 Y=0 K=100 RGB PROCESS 29 29 27 C=0 M=0 Y=0 K=90 RGB PROCESS 60 60 59 C=0 M=0 Y=0 K=80 RGB PROCESS 87 87 86 C=0 M=0 Y=0 K=70 RGB PROCESS 111 111 110 C=0 M=0 Y=0 K=60 RGB PROCESS 134 134 134 C=0 M=0 Y=0 K=50 RGB PROCESS 156 155 155 C=0 M=0 Y=0 K=40 RGB PROCESS 177 177 177 C=0 M=0 Y=0 K=30 RGB PROCESS 198 198 197 C=0 M=0 Y=0 K=20 RGB PROCESS 217 217 217 C=0 M=0 Y=0 K=10 RGB PROCESS 236 236 236 C=0 M=0 Y=0 K=5 RGB PROCESS 245 245 245 Brights 1 C=0 M=100 Y=100 K=0 RGB PROCESS 226 6 19 C=0 M=75 Y=100 K=0 RGB PROCESS 233 90 12 C=0 M=10 Y=95 K=0 RGB PROCESS 255 221 0 C=85 M=10 Y=100 K=0 RGB PROCESS 0 151 58 C=100 M=90 Y=0 K=0 RGB PROCESS 40 52 138 C=60 M=90 Y=0 K=0 RGB PROCESS 129 53 138 Adobe PDF library 10.01 endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/ExtGState<>/ProcSet[/PDF/ImageC]/Properties<>/Shading<>/XObject<>>>/Thumb 142 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 133 0 obj <>stream H|VɎ1 W*;+Bq{2a_9K"C~:}zLJHo>)ʉ.5ҟo3#xnUF_J PլĵhOSGmYmւTnĒ%H 89X}n/v$z9:Pέ'%ugJ@r@/3ZME/))5WySoTx_ FME]0~U4l} 9&G-HHa>`b*hahzsN5CCwdM.2kNUwiݫ)!b~)>Ez6f^T7NH4m; 7QI#X(pWe:DÖ2& }T$ [q[|Qdk02 ZEQEDkz"ϱ'p%F=1<!Ī.3> endobj 142 0 obj <>stream 8;Z]!9krEJ'Z]AHr]#]?fMWl8:D(FY#cU>X/k[,i#/&&Mfsk0%$7bELP`;2e69sDW oNeBdV:!?r'ROA(@@f31,;[+4o\Nq2!3TS;EokH/X+-f!=?X>[(KjmAeY,1ha!@3/ `np??:[ZM8%dA9EH=EDbkDYP3eZQ(@4NEAB2t Hoi7=C"+[Q"sHk4;c7C1^@E=NA7W1eY:f),S".'1bDc50'1T&nrY\1G`IJ)"kM79j OX%En%fi@#dreP2q]'a*+[;o#)4(QKdE*B/:PP'AAE( e$-qoUL]o?Yn6NC.;Y/A\k/9OHi`_!Bom1ljIM2_#%0W/U:WhSjCs]mNjKBbap=s0 &t9,t-.Bpb7u`Xu\S/m?etPh&l.7euaH9RQ_Qa(q-R_9(8W6qo@UtTGe4^kfnYt8k k&X&hNGNYMM&aVI*Tj@pD2u1s2E;CG"p!MRU5ENK!-F7rfBi7,Af>,R!ltk.cUfZV H;=SZ@R!c>+IrMT>s=PjR*Vd\Zk'PdM(WdGH-@)RmPX$-B>5OF/n*O^$!JRcEui\( pK:Yt#+0YP0?,>PJ9)aZ:1(<.Wq3b[R0c*11X*C)OlH8AftKN0l$,3eq\*_*>=4qH oDp]t[d:H\`Pe7:E/(BIKIUjrqPZUh%JorFs15!VE;ED__7W-@&*(ft.p&lY\b^g@ cN*$l'-.~> endstream endobj 144 0 obj [/Indexed/DeviceRGB 255 145 0 R] endobj 145 0 obj <>stream 8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn 6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 140 0 obj <>/Filter/FlateDecode/Height 500/Intent/RelativeColorimetric/Length 23780/Name/X/SMask 146 0 R/Subtype/Image/Type/XObject/Width 500>>stream HSTgv5ZŴMLkXD3 ZQ3^(H enS#sO~*B@/! z !,Z]A!=V}+BY@% !N}aBS@sA_b7ЫFN! :#k*q!TY"&BsA"٠G1< B* zQHu#!@Ov %f+N+!d#A :ŠWt ! t q"N:!NuDЩ'ΠM t!Md犓?R{S$N]|~&٩vr[7/o[=wt ȑ#FgWCBj8u}[W@@"WImtL{>s;ti5ʢl[azcw_թ‘n!V]hx0\?lKX?<ßҾHN{tK辚HAd̉c.&wGg)M+yэ!Aw4=·67)S>8"8/p!Ab5Gf[6;zWfϡk'?ϦEaG7j `LS458W~6-禆)aѭ" G15S!m{Sɴf<[`@7o4LQ[/OԸZrsoї "t6TF3^<ϝcQ*>mBL]b,F ^mnR;FWƭVyt $>d'Z[LɛQ,aG7 dk&5s-&to<ЙZt/ 8BI/?Hֵ jǣ;JȺAf%Bհ ?T͗BXU@5.ʲ44*-oseA@cYbۗaP&|yt`B]%_1ZUֵ{Fg@t)=& 6,AIm-ЪuKxR+úNRuÞgo] 頖ЈʩNb&Ȩ#3HJC-&N@mh@w8t0 ̏:&yt߀nxd䉞Xgw$J/,O/kSF*KTj,\mJ 8aQ ۇeU"Bs{;EOP`[SqEFV|Jw|XcpQQ K#ڧ:K KNttۘ֔pŧlwV>vyH,;lK'FG p9YX6 @w";3b=ms'7%-baɜ;[۠ \-ΨloB^ܝq{6P~|%< taK46RRfl I=U!F j1jsna{4+u'T:e6 y2;bsZnoMAV1 jCs:Nmm=C|?sG&O -̅ SzmX$bU0/lfpEGnܺѲgof`3?2Jݶѱ*Uv=֨pyz s{{U>,4hxL^:2U;RkJ}N4hVL:v鵎,~jswVx/є]{Iw\[ jI7Z5zv슮oovx]Ňr cSt V`ϩ>Ӕ:$)sZZ;+;K~n;^ x ug4~ii|Ƈ^^lbTR' M10ڣ-6ѯΫZ%>prt~3ъo#K ` zRJ۾&ʬKh#lϛ:1 9wm 6أCtljmY?е ŀ?>1S @5v6we}|O:-tTF_0~,OC@%g_\w*ussnHO3<:^G7 P]VjHrrҗdN!t6 &R0dO ZWjn󒲤'CM@|l+X0: 5MJ/hR%Nvy j bI%?VH-tT:+E>)fdMMs6j%|ٺu9:ۻՍe$VjtZ,n'}a*p+O~xCN MlQ.#I$r%f4BV FOq ftdb)GlP" 5SqQ&19K$Ʒ)bT"#%Zl2lfqh@`Gm5+VEkV0P Vhe}9So PY !ÖaeVDA ,j>̦|UN& D { `0& {]y*t+fM.5[!:m]Q cI^WPۄi0LsD1IZW4Kr{='MyzޑQ}"\/$ cZZ1:ut+fMD= q`t Szڸul]WrK?ytϐ s #$wWeV̎\KN|lOKI̵vaxi7z@4zOmOE a&et\~ݍY{=Nazg@T#BœQ& }2:{H[2l^D$NȂFހB^`zvF *%HE:Ȃy( )霽mh Sb팬d-,1RX?DF+]Y#_֡R1:?D-%8@^']Y%wW )|wIG}6fFb 5AV'p1rz]2lIJ7ó~ћmm}YF,qr˚[Xp:X_[J݃Ac˫;^Sg2Ea짆e"7=R$1o/(U{RDw[!jI(f~mP7ܛ+?~f@vC|Sʿ {SغX3jn7 *Ecd_L}8vhWjU);ߟEJg=[V=ɞ;͉?y4_9a5/+7͹I牟C'W]RLvǶ戾L& /8Z^懎?GۨOdcf7|ߦ?WD1I>c{ftUJ.D7A5f D &r]柦tk.]]Zj:edՏV$Onm)Xq{򍈾!'ޭ4[رX2]=$;7mo p~2Fr z]. ?~:@1yA5)|抂"9zd”V*lK4s %hL$%M$W;G$"*/H^ gsS.O9=W&.ƪ'jsH"@i|W֖8 G-Ķ $"_3Oqy_aiD.t'p7ΐMLb뮗Şм\~.+g dȬ b 3䙳iDw'άلdrZ<:֥K?Ǿ{} !B8r/3y'G2YGKKHzǩՈ=Iu@3S4.LStrNy+BaiZw붠 ui!]e?z(㭤]/OB^ Ƿ(fD&=&KU f8$/3ݜٻ'nhX0=J"q _SHF(4 SnwZwzbڛ5u= ipƦs%S29UAX΂_U-'9g"De;iA2H ]Űjx`1lbywbO u3=m2(<7Zֳ}c+VtC7-抬*%fB+&M bOBd陓ͦW5Цc؇gM"[#vQ=̂ V7.0gd뙞F"|g1BX {܏.R>تht t>AJnS;`wd}m4Qb8trȿ= fAn[v- {ﱻB2UTa{$&.7}i<.l5=r{r{791fre-A>Nyc9UNB70#4U7P*w -~vס·h1%tƧצaKNI؏7g~FՙT=Iu;>F/^C$+,Ny#KN=Ky+̚M\ YUXInJF"D.Wybf4ٱƈS|-9{>o#Q:rQu^cف"$SFcO8j(5=:gM/q{\ڏ_vmm0cQ]PX1>ؓZ{R5PD4QB?l85.HK}9eʀIu$Va;.v }8x6wͦWurxCLb]=mD7*? WۉLJ˔W8n*"XSe(tO1\B7*?9ezbt2%.u73KR B:g%q]0n|#Z̚MeJ6Vtb|I Q! ^oEw/SZw^;>i ^ db, ;T9a)(B>v_I˚1G'xuU05/R\k&0\Ftr¨)ح.|oxYs7E{t{=_bR!^cR/Jg`Ui?+D/kj7Ftu?;i!o>܃1W9A UG5˚|2\lݍUb7@wΒGzT5Z2 >iЃ.UNx{#F/kr|17luD{L9!E`K7Ql%\D){,Vb'2ԗ.^1\ooJrx\ףi!|G*'"dݺ pWD:ob׊Ʋ# `wc `uυYѽY+n 붠W#採z}4;C!Ϻdt1<&qx4t`<]"}UC o~j21#l!ȥmnLt|4/FW+:3˧iUj,󆠏NhL-_Qħ]!{NVt*Gm8^Ot9oP7l-LH;cǯZՊN/`bo6ufCZ-ȠbL Fa'#ՊΧ k:t*Cvݖ` XD At-CCѭ7hr4H/튎"JSSg?Ngӝθ^:UXٖeRU.EZ("@#4Hȅ IN٠;ty;-]]1UN` 7Ap|èf𯪆%:,pRU~w\a9BSV3ъt[eO_EmT,/EWKH[rָT={c}MS^Rbx7Hr+UL Fӽu+私{Ctr5NN-ޡSFBMf~WB 4XnDJ`ѽogd ^ۻNt֛ioF/>}aNrGrִܓn36IuJ*NϜ=|5StOK:>8ܓk{]+2zb/tG3l<ݑ}QnrKIKފ왧 WFW@ d>a;{ȧ۟M=3G@VXZΤPEr:b ݲc>Z^rAXCo8&vȪG/{+;΃6ZLȧ{e: ځcRldV"ͨ$9U1>\Mc#+m#q(iǙi~SRl7-tӱ1MD: (p[$j \n,1(Zb]toE8U\u6Ԁ|wmrZB]=Kp6x؂tl7F]b3˩w/=X.(4XVeؔm:THVd[/әtn\ f{Ȩɞ 5N\i{ P "m.F۶Йe5A-h FQ<э%&˰/JDVp!zcaXbIr+1X01ii+ԒlOJ[ޤc+O[jzw!XnȒٗQE;C-TӍe56C(~g []v^,TjLו[s?jQG]RӍeU(tl7nGgZӪ<1Ȟs>=ܧqN@ͨyȲ2jtWՐ{Q=RW H:v`F|q~oGL9騪r;q)YPce :7YV) (߶gd-:ż0g(xzʮYQjJzSn,+o 1߶ ti݁u.za@VJY C-U. $XVs3bm8]Zy)\ZGUUͮ @m0=Xf־ gRm3bmOJOIVp'D{閪cmM Ce@nfqљt y~l Ҋf5`tKVus4}`tvp9{yy :>dCm2aw6۷-UaȾUzZYN 7LRvj 'ؾҊ [Ug?8vgr_Xo{,ܯegRJJ?y}NgV|3C+ڜ]Tj1K+tf)"iԆy_ҥ߹Qz Umm_pZRZj>ךtf)MQvYh]ZՌ6ڮ~̬>r*iSWn0Hg޴Y0?V:!FKt?U9ܜs C5Z΄},*"fp:YJdh/OW:,_ډ%:qÎY0?ҙަפ itݧ^*9nUjQ̳Oҙ *hۗn:+dnuBb2 ۑ=؞Ltf)Y Ȁ Yy))Bw\/s yEDTم={>JV|QԀX}tiwXjJv%g|nOf*i Zk bCjK+[!$Rs3T$j^.׹Ҋv3v&]ZA eҊqHΦwYc*t5Sr)s.>-UE랫ISٓL+|Q c-FV|{/@Sжy.z:!u˩݅~j |QYO.>`m/x.}NTy2O4_EmTӇ}q9EV|lW^ZCV|0dzt<\eՕRc||FcIJ"q\TL=1* (ʦC EEYzivriF6o=_9RO+*.ηѴॅ@boa۾]xicثu|吏qFGHˀM4m <Oq$*>'TҾ0*<3i3 AHZs 'W_~B@Uu叜inkzxE KTvø 4 xi#=vF ?">LJqi; )vIIeJI.e<e@8NOf43̐;o]޸2ҧt'sogAi쩤m{xi#D\$J9 W@vsˀoc#]<љ]mK˟^T.o53>tjfھ8Z?Ib&xNDl̨ATdq%{s[o\ݵp| /-v[iQQxiSr=GdV,MCA]D'e%/:ÙkadS9/-TiQq^ZNbϗp9mz+_>m4pq#5wL;nFϦ /-iQ/-uDb/.uRd^5xx×l9¸qk+& /-J~nK˟-XlY o,\GWx,&F|-ӋȢ[f?n 4g8ZNxc!15&5ST_;50na_4\(|q60K˟~*mzॅ ZI͞g=o6cPk.0nVL#zi.JJ~|i3bTCBq3˟bڸ_/_srcFdE-n73]hDv\YvODJvIN3 RG"?>ܱןg̊Jݣf CfF1,_P1HvEUP7G"ЗpK˙:QxWi9ǂ?2.PLMۀY͇J֯?g&'+R=xoy2*$ Uo<=^.u㳙#첟LU,<dӷ}gϷTc-7mdEGhPG[d\Kf$ :o]ltf!d1\ agBD/Wm͖ۖj*<:6ˮL#BhqLM=BͣrXlY ooU^]Q[>.+$1.EQԒv|?L4ٴ :1 xf!Jk/q>nOUuw2suU*:4R<% 3Bxl S9LEb YZVۛRj;5 IBi>޵}/׀>{lBpyTSvEQE18tE gf9=B'HJ}5uÑ xfoL~Sh<$U>k^quf$E,\[x}56 9ՠ(<:c1tRn ,GǨ6G85dcZ5?SH-U.MwBjry> ,]9TG7N ,Z[4?ܶd5EdY[ʡw[3 aƥ(Ð8SLKBܦى+j`|ob}5߈ϩp ^ͦFxfѡqQ"}KCu; , J㥩MEH!LꇢfE&ʒۛg¿k4NNEQ?~J^cBM+Ӛm$!y;\M‹.]Br튢|vxf!Kٓ,6z P`z/!GHsU0)g?!Lb*۞mk{cED Qi`d L[YJ ycjX2W'6+"Q`?{l4|h<(:4 Y&SzVq$DV8C 䘧Bhr0/0}&xcQT<8Hћói8)|2vGic5\5,E2O'mwmƢJ*ɩoǙ,'ߴ}aB|]iQ$_OMgjvJwΎ;VM/kT. R.DXV\ȍ\='99ۣ Fs'[{&<|ScF7-{J` +v^L;[H䨿 ]r(7n~9 aGT}_L&\R`M˞T(v)Ew,zV yO(^ ;RyǡV/E,"vTtx6Y>%^>/g;Olw@Wd &n>Vb0wauc߱(\;ڥ޶=-Sa tbWI 7n1T'swF|`9[zO-@UH㼸ݴZ8zxFH|-T:^tQ)bD2lVbAo#ZՋoZƔ#U! k=GM` c|]jRxߔǾ2~kPn4R&Lo`@'?vtӲga*kRݱ#V&bܸ]׹sQB$,|܄%ǡ[-K!(whM˘=guVr]ECW Xf]q]>Űm % GK; P-"e"խNң}JiYZ`f;N' 0pU)Iיb)~d O€% Gk$ncRA-Kz=:vWԊ|@ybcQ|h0T_=.i: uuݷ8^iAw;uZFbSy.e/zKዟ,@jͻ^cNz_<SMݷ{v>e}n{#^toE./r{p: 23E{ +7 QF'u;j7@=VaBW.i&# fɺvoݫy=}`2C3 ^6m?Ԡ )Ԯs e$K;G̈́Еˌx̒_"vXJ.a;zW"Wf(m!;%&%S6W{+\!ф"kv ū4ۋ4ó!E{]RjƿE7jPغm8j+.)eVtpkf&.Ъ^|Kug@]>~){E؇7 a65(6GlNgƠf$ _+7 =]s6E#[ݫ(O&E!buCcܟ:8Glwӝ;[n n vSio (/ *D!2PĠ!'9!BH!䞜=n; b.ϛl>}O޴nTYP sLDw禷go\_!&]qdMFhݽTSxhi՗rv{ NemuYؒ3k+cݠ"4 ||.f"6]7 ?a#~eI^Vx]rˁK~!>}i_9=Jye1$ G.q_z]z|qz%a.Qڿ]rˍ ؒ_Sg7 O4}S/2'eT!B];_z9u K}GwRɛ ۮ)BV/4;<^zYb8@ⴾvOt)t ^Z% ]=|~t-9[E!5A}u ۉDͮ !I&~Q{'{t 'iꯁ$vXKt/TQK`{~I)xɾv;н`\#K}bO.Q9.a)%RE*ܛ[ː6k\'rӟХ` qY$hi؟0l q`lbk)Az?Ի]2̎oت_+kEtc' ̀㿎PT^̓y_o?Ơ6 6i.UA#lKY.Z.])EN!qx+`k89't-olzYdLn –UmtYza;_JT:EhL[].*ocebqq(uHLƂnSFA)82vpWK*3j$I?D?ϟ;cЅh\$v(;xކ .|zM((O|+Lq5ARY?}~N+gv1,n?I~yɄ-CmEWt ٫ho tS4re=uZ's1̓VZ1 M~r.ehf'Dru!Yb {N'Zvsd._KRq&Gو[´RaZ O`C`[|y -md1?]fIbwC`[Ozc]J̞5~ qOjZs`לC`{%U;~~"i"]Sk`7Cy` ;Т{R)/J:lB/԰is( lsSZIrH6ྷN-6T{ϳPlICUݘ[S(Eq%84]+f]Gjv};cC\tbw#t*71kKόgj=Sq;S-\GqTl 0ւV]KV%a l>=̱SE}s?{7L!$ ͮv{qݫ‘4^yq?f瘷PJR[ei==ű?|{z@";VT;>.͓ _;" bv~ފJo__B, 9nE1f>Tϳ}b_A? Cmz*T1ľ <*r2TY1x v+ ᘆJkP4td|3#C ЈV~^ 6AY%_bDd!bD>gf)z*TӐ1 bi`7qTh zE+67Zu,ȀHv4,S"zEiV푘솔Q W@ )^{[EMM$9#Pw2E?Bδg? بÂx7e_\s@;p<VJ9V\cV~r׸u0/T[Gk-hnGtw'w;NOr?ޣt[QGkI߶w sL UoNB~wE4:AzLQg⛬_#1el^ԋߏ>ra@ßHs)'gl?3/58[%%ݻެϱȻ iRƜ@+V$!\b#ſL7nW[:Y uZK )Q Kl1ݸBaUo$?tClgZ!mf4OVt]ǿzR_ߌڗWsںp&|bwhȹtת44nnw4%i/Y;:Ɲ `-8S鮖ey[gH)[o]pok%O&'CJ<˔d,ָ|3BUQsYzP1>{^ /&3}4蔜^{ɪ\߸XZݲhw%\)x5/.Ou0 ,nPɢ#5G+:mܝ|??<;-~yF~#ڒK{펌O]hHɬyfۑ,Ĩ=@WLFw_9{_nJ5 hF$g5\e~xavɹmV%_li54dd\kkH~T@6}m{@}GTWNp]n 'k_I**6$ R~$)ktȳn)b ֦Ҭ@?KE"2->GJo/$eޒ^GDi]) cRV},̨X@ؕ<PG$Y]mCSRעI U!'@ ĂF ;"ɰ)!{p'cz"ItcTA!!>Z;eA,D4bӬ)qf:(Q"eNɲ8c*p7]1sq!$s ʠ /AA nK2@mϽ ?9VU$+01NjJeY}KC?3Ō,>5Yr붻7` 4 x)pI^CvÃ\'z0Qm~wu=Ά$x F(IkQ!;͇CQ۳}dUriWtڄ^(A*OmUdiJ3,z?HӀ)O2L)~D`}A:OGp^UYa-;'֠7{)as2 D2MIV۔‡X9$79~KX 0? JAlG A:=](KO0u[WtaBgR3wGtfWg9\,)3as.tf_? ^v 9PȲ>Y >9K'5oËqLZBX}szZ#Y>6oC%􁿄n<ȲlȮ &rzǕYb}!o-n;|H[rH[r2./48ݼ>S+rB7HsS=mMsz׺t۰QW]QFSIXs34B1"еX:nO !srˣA9šLt?^i aboڳ|-tkV]H3ڐgI dWo \}[ DA7f“+_èԊK]9#-Q:1$G?EъI&tVJ]u{,c[xE7j€."Э w ?kx`̂ץXfg DхnX؄obь7fؤV$kMv|sDn[$dY~|~9>uA+g\D?H{Fݪ%{kGu(ߏ;Z_~Ϋn*.eJOdWoNnJ<ߞ2tWj[E.F){-)x,>W9jM""t/U&ҸqBǑ[[ OfՆmYF$!:tGEzownqQӾtS"|l<ˎ-C71~tcX|#C?NiPIpFuތC2:tK XSP|NҞƽYU*U w}yiaJO. )Eq&Ov)Zc|-j nگ$ݔ[C-',; ~ɚ[vXbuZSq#%^ŗnQAwZg/RP(_Q$K/~D o2"dK'2"t)8&9>/Filter/FlateDecode/Height 500/Intent/RelativeColorimetric/Length 62605/Name/X/SMask 147 0 R/Subtype/Image/Type/XObject/Width 500>>stream HSTgv5ZŴMLkXD3 ZQ3^(H enS#sO~*B@/! z !,Z]A!=V}+BY@% !N}aBS@sA_b7ЫFN! :#k*q!TY"&BsA"٠G1< B* zQHu#!@Ov %f+N+!d#A :ŠWt ! t q"N:!NuDЩ'ΠM t!Md犓?R{S$N]|~&٩vr[7/o[=wt ȑ#FgWCBj8u}[W@@"WImtL{>s;ti5ʢl[azcw_թ‘n!V]hx0\?lKX?<ßҾHN{tK辚HAd̉c.&wGg)M+yэ!Aw4=·67)S>8"8/p!Ab5Gf[6;zWfϡk'?ϦEaG7j `LS458W~6-禆)aѭ" G15S!m{Sɴf<[`@7o4LQ[/OԸZrsoї "t6TF3^<ϝcQ*>mBL]b,F ^mnR;FWƭVyt $>d'Z[LɛQ,aG7 dk&5s-&to<ЙZt/ 8BI/?Hֵ jǣ;JȺAf%Bհ ?T͗BXU@5.ʲ44*-oseA@cYbۗaP&|yt`B]%_1ZUֵ{Fg@t)=& 6,AIm-ЪuKxR+úNRuÞgo] 頖ЈʩNb&Ȩ#3HJC-&N@mh@w8t0 ̏:&yt߀nxd䉞Xgw$J/(4 -cbtbdc 䌉 *Ko{ݚqF#!@}uu? t_Uu2M@łmMi:vLqN{pEmĸ8qn [W3f===sĶ+=9U}ji,D h;ҶKutg[P_gb{ %vjNW>wc-i / KzsmС7mK+.˟Z z;K'=o}poY+6̥qQio3."2GЊWl{uLz).ί#csr ~R'ŵCȢ10]6^RU? 7'>;zTη%GBFz]zP?ì2+^";"VXVG6ݓ[ztșz-mY[|ZYIb@7K_^_; '5I>BpmN}SC7 fhخ*@@E1E"EzNV)<M,21K,wOzU)ibTQxC. ہy},0sr#2Ex@L jT]a`0v [Umb^n>0=4p4}ORNaa@`0&"GEJt+MuZ!&mQ4/'l²NQ5ҷHi>FF2DlG>׻ccj;n2$oY[G䘖U xi݊y#1&lO .aI'PwmF+~菥?sY! jAA$G2Mqʰg؞7W(H5vajkA4y豟ڞn+f&cִ\qݍy.az@4(a ^&m2;I{l>8щH8ĂFހ"1^`z쌼'VaxK Gפl/9{ %!% wvv@<;#/ E=G,VNYq 5u-!%C!S3XR3bJ c%!.]q߄nHkZBğ _~a_й?Ak.]h-Öt3}( ?oH\U;Є{XhXh5mzEe6B.;"x:aٲNH"1S T{RBO{!JH"H߯j{VU7VMo~Wڽ0kף0Sƌ_L(YP $v`Njk5誔b!!I%,F_(f3?HGRVDhܜsxGQ1_?.yizk˓$l$]5vz`IK9;_4&lAg+%=I|>)fQ`lkryrx{|dt\ %iPZ89.u~r R2r1EJ'sjq2S\"'/=;?F,ׂܭAiX󏯊=޾}dA G!W(lܮAW3ja#ʙ[?hYv!viLaC{n-}zy)w9ƙΚ `'W(S2lZvr,Ezײ LzKʩG=GshTO@P)?9 pFPnk]-\3 .Mz&F[viq18?',x1˓v2_,㻪-'j3` 63C%-&j'jӀf1}?Oۮ-.B9n/}B'Qj?mC?ArrK( m;3H|mv8I1ڛ3>rŞCiQ\ؼBnβ@gdNܳP7y-'1VfWwiA2ޚ$joXE%=c>>:m.>7g0`}%g"哧ltW&Ʉ Y]o"6D9ru/n]+NE!lըHX?]/U>ףV7iٷlNFf^zgӌa ~`F )D"lx΁dnM so(g 5!XzW8eWF$dn񒋔CO;sDV8=oMڬ^oL୐K0 =.=Ya;Gr%$Z=Ҏ_:U=w{Qc\ cMbu'ZESޘa{% `I cG3 rr[zvG|o5,;MzӳJRl恝lmgl>U=G`fiKy+Wbһ$ou X2vg+.*R\y`XmŞk_J"ŘKrLZfI+NIdXVh7݈MCΗ2;HĞ8jj,˕{XNb)K V>:ٿvD0W'{`NսޓHuQEWWȍfWa@NUhD9{~ .fӆRK7]E}8n՘\{\d8ʡ8'F凓7;Ua 8 01Ry}ȭND=EIQE2E}QEi vz8RAoZ۬&1 ֑%W06U3ld` 9IgOrÌ"y ʨ d~aQ9Enױ͛7V.K|a2aa-?GTGEꂙEc_O{WV1MoEgdcQN5zȥ [$ T3tϴ: w&VrC5;?O ܫ0ev['2 }T؜:r{oN$!˚LW6?T9_uݖ Iz(`%Ww>5jlսT-r%'*'H2d(r<2r'שN 8%vXb wz,ktF~2JX\, ƄR~ wH:[S䛞Οڅd$l jFz,wut\$}w{,h0>Onrmr]Z=xѤ7idGL *'HdYp7汣 V&V.U;!wu;b 5ݸpEIU _Ypͳܷ@,!uqt@ ?>ahf^}/`ʼnpM"3DXrDVmYrE6 [cJ]7&~4_,N`-B_$ rqsINԌ*WwtF>_*WD␏BEM{0,gK/o\:Zz܍[^&^KNr4 j"Fa ;7tâE\qr-pS@ (FŸ5Z=g*BVr Yk.Fr?İ(e€Ljt'2h`9jK 5,<QbJ"_D(I1'Rrm[fBkkOVR.Ӌqkm~UJ͓4~tܞRXK˱ Y "5[qk7`h)6rәvnawǺlGתe]bud,"ł\ @B.BBn$$93uXQ93=ʬ_Ea|+[ $K,!|E׽i3To hw=uu6:Ӌn**!ZHTu* .XƉFb^i/\ې_Ћ+ׇ nM '9͏wQ=~b$I)}W;ջ%p>Oo޸>q;c(ylY 0?; ;;X%\RQnMsw~.ٵRe+ʡ϶W>gAG+ȟRmOoC=V%:g¾ӳ/K1V]sG!}zE2 &=ywDzTZ9xn^Z I gkPlɪ+w"CCnqs7U1IXN陥Qv ̾{%ĝJCyzBuK %C=([ӄzʬrWo.A9'T\:).H*)Э}8H,`~ [Xun~"0^SL[s<{(܏esӶuzf)Զ{1Uʝ=4 S489-|Dzh\g?o02gr'ɘ_VZ"Ӱdw[ STjA T#8˩2_U&=X/ࠗJQ?_ST-^VrU=D _3KAalPOSX!#i=K̘V{(U1F,N.))ncYA-]xCxlnl>F,1n{,&>f*I.DstRR*q"^LBۑ4>=V虥0H@/ge-)m@6-s ⼪Da=OK=3QlPO rJ`m?G|}Da(kU$r,;1C}m,ezB쥕$=&!3v$Z s.W]jϝnF[RVjb/rӛ[pE#1RK/T61m3qZYήCSf n( v̡4՞3^Cf+nf)7@Yb/N( CCi7՞W1m0ZYZf C-l&[g$ CC 9D^ZKN^b,fޥF-z9ҞY2(m1ziK {*gfnn߷r&W1D5U!L zi!Tt۹em7`=:Ǖ޾9~Š~vZ^Z9|vEz7kr}Aߥ=3g@WQ 1mKRBs5hktSϸϯWak혶oھQzz?uKs>/4\}i{23KA{6gW =%FUzu"ھQ_1Qy7&llI3}4[JFֵ5c=Z[QD"(2(r 0030= e]}?ߌ7ϋ|O0;KvBw_Z 7}3Y/^P {ѥn8CAֻ*AWϣeza|;hƘA w*љXt߀Z0~6h;QBe6ME:# ۾z*m $u{`cGoӂwKR.S-1zxb3d{/2+@K؉n_5Ȱ!ncm0*d9q]\8Un!9DJ9>+049:(4ԏZ8tÆN(u~4.|!J`l:&$h;Yz@|.4oީ䰡Vc$Xt!/!2F٠9]ZHtM k'->a@x^^%QyPAr |$+`lҍ3̢d } 6iW6:Ф5Fa@QnꝵϹF[v#ͮ]u3Y8jw2*CjCE# hĦ9& E^&̢#oE<'YB̢&zs]EHkzk -E^d9ҫ Vv^iBKB~ .(8^YN+z+u\~hRWh32@Si([a:kg#O꘰]* OjX$ourO)9ƭA۹cdS9.-6]34Ldr~/zF+nGop%zQ pu ,thզ>\c8AV@7d:MnSN3a2L9P9'lE3Sc=/-@dm,bcdC6:7Y'ʹGilv2J2D͒y}{P-%&(-o]3Dg*d@v5+eztiozLi?([&{6-Vu:[8`Ռ;1'Gw(}&#ۗ}tfQj0`zqJNW"ȀF.-MQĹ\*LxBAڒ@ٳ(XNخQ5κPƢ͈'<Ģ(U틨ـ,J ?>,|r0zR$|Xm+Sivt&RlY}P\:jӢ޺gI_b|6FҾdFЙE09Q 5=^toykrPHS|^(}?>ҲphEhvTH_U=GiK`.K,|uj&uEŨRw\*1d.3liIzRځP, >^>_n8>QlN6O?0&K%954A}S"Fe (1Or@!6g( ʑ'`j} v"ZUlYwb % O?o}/9=̢ ̂S`B+nUE  Rm"gx42l|+m:@[)-OS'p /lW"ZtMwңPM" xy#ҫ3%0 N=,]qӕa|:ݻ=,GoƢ m9G(P4ܲ ۇUyj~CR];2M)ӟkg7El@gec0 NzIa8]8ͦڸ6-)Q(`}B𒎹W{]ȭ >koWpiRC̢Snp*MPtXjƱNk8c|_jDw棔eKf{Xp͌;1!is4+ꟕםnYnqKPϾUi֔ e=e>eGǷ/h)zߣgN*SvϺ޼hV&=:$uǞL(u,~؋B)uŕS{|j6_vkwR[85!Q.+FW%k0nl5l2WY,Qmh5۫yXhu0F$튋b=`$vo2zB>TPj@80| WS17sFSCإ[NjUŁ0w/Q`SLӉM,]cEyP=O>N.Ռck#^\0HM*C C: xglNzH@+dDH ?Ԓ1D,(ؙғh.zެcU'IQ7fQkgCGv)̣ XD*àzl}ans,-Ӷ+pPXh%>yofE+*Eu ]8+[5ؙҊf5 i8:INlF5㈩;[K`j$1)WRO"zNt`*0UK.qO-70B=Ёt2nGIkI,]s[C"q6m_,43$1MFҳ˴w0URwߒy>\|}T$Mf2VPgAvroRUXQ? YTa9ˠt4,Y& zRدQJ?ŚZV-iw|̩3%6 ]BbEuA5iL9f߳Wĭ5|^巶$7" "}w$GBblZ-'/.-MD+6J1EJ.Rm%Uqv)pè?IL4䞤b z7BͿn/Oy`LsͤdP6i{MGFo,]ג2))l,Ɩ#av.-hVp*/CW)D5BNݭ|}j }He0Tu} KT2G"n]{vwB☛K C >!FJΐ܊X)8Z̲kdPB;1lrTIZpɢ؉H֑o%%Ps(RK*AjwA!@ c.0r̵Kl6_j:VhKׂv1ׂ(1`[ӹPX,ͪBvievioZ0 2+MN-^jACvk"Ñ7׵J)ܝT0-PuG |`L78:j탤^^Iuns2lo"w{Cu:]&F5dpgЀlħyJ^M5ՒVx$;?i1ڑVR,ܓT,!UPjBnH3 ƫtsÃdЭ+Q׃./mV$_G~yL(Br6coKrSJ$M;wW+PB fQghTKҬn=e#l.zQ R7B6 ҉@2106N<]$?{oA|WCw!!ۉ#NeൻjG-.ɰK~U7ʫQbE?< m1RDع=?s&SLG—TBjOn/} 0dS>)9Nд1ϵ3aJ@?儿[IyNv~o٬\j<4.,wӱ^#3lħyH_t^;:gɗmT:۾p{ ?RBf u}Ӏ! 8Lsb1ߵc}U}xci@a_ eevSL**sa.\$UQi6e]AQQct4#h0.;ʨ;" ݍ{ߐ 2`tS%w!8\KiԶ1[%&ɣC9㦵}Kv_m$nuƢ]ז,6$vc\< CZK5z=0rϢ$4+<)!: )PuYk,7EXzcoϺ9Sf pt>":DֵMcR`F7㦵qVk2_R"5 @NRe)OYn*R,LQbJHыl5oDHUG fB]>K_1nt. 5> >I[8+w / .#T42o]$.EǸlmӗp4?k$R& 9%U^t3qu;CjK456Fc;orċC$[1H)Ԝ,_gg.VceKzZkABw>.܍{j>RԚ w#'U *ŌY'֓,1qUωfPE+OsKfᎆچis O .ėG2$[䛐b'R}ՉPsjd[ǺMX~W~K~cFGŀ G:变wU^Ih7M19KьGGvpΉN(`tt?%\RZӔۻaDgQJ($_["Cup6 YWnyn k[s܎ޚ_TqŐ?gE|]8v?5 lR}q8QqV9M6w{\IO3bwR#Ip;C]cW2lgbJAI)zW"H5RP 5\̓a#num?>pKQ黪dnyӳçn+~ xSsO>%.#\}^Hl7a\6Ω$0N#7d|nUsN fR}^t?)aR򂒁i \%$s)i$l=oFHUG{9?Rn1]~T8s#' B1w!ܭNlGSȼ >᣽͸lmhtDjd0'A5J4gDWHNB~tl'N؉xQ`D/DUH)BXCɀ,][)b7v:5{Rῴ8b_çn_oHK ȶG֙w2(4$1M[ّ֖""q,"sm0'e i3n|C]wAJI|)i#j$FH-TD9 Pw7fIX^~~+J.ϛ۴ u9~xW z-_a4-kH̋mVq2Qq>-."8a kr1d|NUi(g3bO }#LLQb7JOI F؆T'A9͂ne 6vq7kv{YX~o*V ræG%v}RW`:U¼-Lj0Hӷ3[[&Ow""8Z?*'5O jF% Bu{aD>1)'%KI#"y RlG=Pu&j.V -Bĺ;|ז 7,w%dYo1;&laD$R3.[[fS@g"\O?\_AMy;ۙ3awv#"yURAEZZ/X^.bUG"X (xArQFHdet33> a,@Y(31q]=/k+ t:t'|HN2&!G(ZkPw SA0F_)ta16yuTÊ)* {9wR#'p> 8iyϺm?NJn{tϾ_J Z}k9ܣ7?? '7̯OnS`)HH9\dܗH)RF/ u.OAfCUFM n1v6&lNρo+[^5/ ,ՀArcʰ\dEQ ~$_(ˎd1ʵO440/8Xc6E&5Nz [}I)5nb?%4S~Lk/I"BIY")#rREHiPNCCv{و[.v{U[ȓWs2ϯg\{ p^3wl? ]D!~˴>HCr햜[ aAQ8}I^.;B$&g3$Ýt&d^ܟP"Zz "m<Dh8 "4WFQ[Q,A{es\4;iAGF  3,wYQj]oZ &3%v'G?ÿh!MR*cq كqA쉭lKcyV!t#IJ2&!G( 忐j%RGى{'Or{9he}nW.|'u mǀ.Fӭ$/X@I+7n];dO/} el3e8TqW+L; T5U. g%g~D2)W*kJk6,ZsWC|/!ۊ-bG+^hqʃEdm/||T=Suc](`{/u #(|E0BBZkflCڽPwꓠ41v϶}5.Mn:5>qKG{q2#>G:F G(/IGIjӗ?8r[dʎOm6X^UMd9olի X=CÃ/`:cGF(ebg#v1R-CHi#>; '!Vۥ܁+V^T{ϥMPX㳽oՕ9y?I~˛ x1vab o%tnn*ۙGFEmn/⻶Fɿw셟羮:IJv^W.tb0r0r/F(g"v.b r_!7H@Ih8 hhkzf{wն߸Rxgu?) _x)!{_"?[l_k?89:Zk*m {}Z7ln/YqH|Y|v+H'[=Odb G< W"zي;64h́o7\L4x$zw]Y⢠PYKH8.UQ :Y@RJj߱6\Z~)vpvKo߃(]o!nMW~>l"xѹfrYS> }v=0t܍Q2`FHԫz|OCC\e\S5Tl~:u8յ9u͸q^{Ɩ,) !djdD|,oo]@xq:Hbic1)E `$B7qgՃ7l#Uii9EȣS)?K`x`)}v30gw ;1rF(CEH FCPuG?t܁vdžvf[oxTsyF4='B'vab䁴Ԏn[Mgq; e*KoNinܡ!ن]l3=mwsom{*`-<OAȽE 9]TːKل4ېvPИv۝˚d7uwUe%#޹aD?>@/ $ EvٻLڣ%w3س̓b\`{EJZ{P`CRɉIC/|dxOHnwl.a䮌‡Q`ም%H"fَ{~xWeUlop-s<%Mτiq+J兢?E}()@9 v-򶦜ˍCmɝ6GƬ=*k2:;d{ UINΣcIڞ۳`SMI30ۻce23Zf @}Pwꓠ>V܁vwdN-SRyg[ߪ+ /:fkzG u!@ N|V_V)\lGrӅ-]94^q0!۳PONͣ~1Ҿod{ZJ@n9bgF(eRF!vR *^4[v'#PA3amoyvlӡZ˔n:~_,, u8E:~,| @t @ Үڬ$2x3т=.2"[#L|Vjx UvV2jۉn_*>=Nؓd!!0'O\W #b2 ш]TKz5R"H j.OBC,헹\u(;dvNȴ3ʹ35nwni#u{><8JoW#`~$7xA1o%o!;Œ1.% {qea09ϞԾ˾ws!`0Xi>@pi L6ٛDӋ|h;9юĝR@J3k1l'XXu!u Ҝ7.ll{L?lpwjq)ލ;7K Pܕo #1!8$ҀA@$j*ylƌd`4^mQ:Uq O6XKytkOOYl="{kwvn4v)'%dX|o7H Mf!^F"u/]2e{vqKn;ny'5oXUWpi殂u}9d>W@XFsdwxY&ER=6`UrLO>s3f#lgq:h:5|zz2;gp{[{v^+)+%,3QY囱bVOsJDH4"-kb{̶}{sKFch;čPelfVaf=oŊh؃CX%R@HsihTFL^o?v~mtpwjr6f>}}!W);Y ػ}8=t APjQW'dט=Rcfσ=0XB=+,_{E"ԆlI5/(2O~R]8{Մ55v4r)%l%f`foÊX+cajtl4zJק>olo\ٹ8GF׉>kvU/ . voWk#^y Q;wʆTd?si^ zjtc.>s>"+kCVTI?aO9vI”Ĵ7m3%~4cf-f6m߅V}TIH5Ҝf{3ڎM :?|n՝Wzdxs/*``vo "YYW`pwx,灠 u [:J;`0LLZɤx"{>l;~SlDLcemȖW+_p9#4X5mLg&~qUq mIۻИRoJ@B,3`&,ߎ`e,VcUREHsi3Fs.^W1>_۵/lOlw5݃u撄:Uʗ䇢K+/ d{$"s@P5G ⳼bhgK ]V*YDħ?j~qXi&>5X?Š8gj\ri8^IlmA#gځQRJLfaf؁1XRCSHsi/"-m/W\ZiJmZr7kȒ Ǽ?"FX[I)] a:@Q!T_gQ[ vkɯ\uv00@M!}6yk<,q/΍Ǝ%񠤾t9% j|["+vcX9V%"u2R yDZ)f}t0TZm<#5W,[]/v=(PuL8S'3Lt:-\DC!Q>"Q(EPh`ݗ  daY@hr#Ʀ %~ gezE;oZ @lb'#d2p^>+A BNhk^Hi efzkwL93a1J3htZp.θbA DH i!.݇tQ>'`ӣg`C͇P7vswtl鴬[_={dct].nKs\y~SE  B#@&nr_F'Ⱥžz.5VjgW.+gC :C ] bBUлq~~f%q .w)}j)Rlߌ4!Ht؈G1W 6 l*{([b[M1UNe.ܖ]s{x~؋ m9_;8 @x9/AZ@ ڶNk }7T}GLiLb4ipC}G0K.sp<\TH RFHiw m8}1}fHlga|R?6eZ #N{ʜ7{]piK@ p\._*a!,ezc^[!(qß?I)'Řqz5NdBTҾ^L Y,qpqR-BH4HcLOٞ ( Q7v-eQ%]3Zֶ[ئ7۝mpv[YW== ? |s'+@v$pL.L O"%SRZ>L-/V31=0=TWBF_V]1yMB^Ӫ57?ӴDP}Z)3RinVmp#pŕHTK*"Fن; ;c#ؔY)k}?eaUjs]j9+憔~z}nZ]P>o X+ D;8 @.x_@iF&މo8YZ1Ay7J]!P!*ˌƟM'LDxɺg~PLoog9@1*Nxtv?YmvQ u /TǴ+Ϣ}LdJͥ ƨ{Q!Wn)j)Rl߄4ۑvC?NQsA!6xJ^>j{ eٮ;۬/X Z%y9 mvc@. ,M lLIiyD{15yLM*EwpLLoa, v WǕ^HTːz5RC-HaH0},e{2656@b{˲cVIuȎXQTܝ.n\sG~p/ Hy ,f*KApNNmnlkR%ӫ}ĉiN~*_L&V~'I-^_..wθWz#bZAH}(|(9ۛ~olMɬ6ˢٜ&Us\6-u'w:RZV ρ#@& \!r_Z@iFX2 o!!hPngz&+SOrG\+=jRA H҆"nۏ1}jv.6kGm`{߈XXH)ۛ%ʿι=ip2EW==-2?7XXNg^6 _ &EJe!Y ~Ǵ"/62=|#ѓ!:jL8Uvԩ㴝i;vΜ} ʦ[ RԵ,7a/BEV"VʌcK5k|9給2W}b6R,Bˑr%REHvLsӞĴg1]Th]Y}l|Z̫,ujkNMDݡ"5BS}NIq?fcہ p`EvŴc۫Z[Xq6$vG BDN.2^򴌟h1ÈG|90#P`ַ @xW1FT.lgwSxf_P{MZt]FOG :/r5RGH0ALiOcHLt$/鴮lZ߶'7okylj6Nr\ JswKNWGLQ_ U .`I`]68I@ nDּ{|?iKև_HQҦ/xV!՛{%kj˜2w)f"|Աu@/rR!UR407g=*F:BP9in6 ^ᅭ#~fDyXf;8@+n̓/;-~fۅO8)՛x7rQ s2V!՛&?=?+ו/et'",X:!ecUjRb11L-;ucd>%|9[_i6/jyeb\夋eNJ&]vܒ:/+cr=S(;Lb/0Áu `dp[ AUKF+0 I*2wS/Tρ[C:&@[: _i!,,82ĆdnQ̦#xcuT2$YqT]{/ei jRbOlt1 =WaW7.i L,9]bw0!8ieITT)<'OgχLQ_ J`l"<sf;8i@kĨQ5x3!ؓ]"jj/jQ)mx ]_K!BW@gu"mnڻ\5G1IL{E=={mϥu翨ż"R5Lݡ"uB3LswKNw_HߑL, @Gu `'H!,Er*LeTr $7DR=-JȀ=*z"MMyb֕k{io>^h[k\mͩ9[jw+ӆ)<=lXOX~3_x0ca< 8"eXV[T)j^~x7=6==F҃ۢ"m !A2[V-g׷W4Y, sŎsS榻yxLN=k/^`nj#My~0DRCYoO/5Vzy=y$'m[emKwwۨghB\gZcœڜ؆ڇ7:f.'#P ޲(Ns.V%V/󠦲433euL(@ =mq[iwm ĭenf\PQT\ŞVMPP6Y[d^BHXmYvC;%Jջ|;9!C! +3=I+PGT͉͉MIMMI 7טkU'ȊErQM#\W芐j,}/ѩǰ888:8 )eD<:R+q̋㷐x-Ö+IOʓZqpp ]8lQ_؅nr ҋ5piiYOӾ".98E&,w$Lx3_]liK3L肐^t-âfU#iYzocgT8& Q9I d2 < Tb#GcWH+ =/2Dmh}S"Lh<|4H߅!aW,nx;V&_`uǞUy8~Myo;!Dym楆D|&ǪI+m oJy cw@ fA,nL4֦֮̋'8,tiL}u6ƥ%wʮfz4: ӳ0/1y0v#*vD21Ӭu|Vy߽-n^pM?Xji}q4fQLo; ϓ˘nu~0AZ~A=|y cwJr.  j2Xgle d$24-eCitnJBeRffSL='G-?pw(r>܇JUCRQ^[YB{&jˁCɫ][[!y!Lg谴 'ⱥ}׃2. '9B Sj"ceXalF0C>ӗ eCi(Z>HU8 *ݿ.&DB>Xq%bi-+W{l; 5ħC|.|6$g/iU2% ZF5*523q?h1C wZ02` y#vd7 [WK|X,gx:Vьpv0#c(GҲa|4-k&Q5),J@!~%~ӪT[r6U6^+ۑggr I[G \Xs^3/L>+wcv~>SfzJOEg'*Exu#^}U|εcay|J^'iw\Zj_0E,uuv/NdĖmt-\l99[hg%j{='66YpuWWs¬345:tdJQHAi7dKd2+9B Sj"X}Xذ>314-eChHZ>kP53(J1]Ԗ+5TUN{P A}U7[Kt&#*.oHM, <] |?}D_?~=n寻erb՞ D=oQ;;zɌ^ :=NJG/2B<ddV :B-g-lO`zcG36۲ݎ2}iZ6hf*R5ۗRuT_};#i-i+i<$y/9ٷ*ltթMjiY ݉(ϊ( +ڑ9)x݂5d{DT?w [OQei_,1 "hHsHPA 80a꘳"t`6&f3=4AL̶/~hs{}Kz(EaYb9,cr#d!B?9zkɬWDٮbr%z:.\ģGmq*m6э2b'!> #h‰$VZg{ `l}1(Εtc+]rV*?!H4Ӑ&5B PBd];lE5ZS-ǩLUHJW9T9S_[v/zQR{IU;.'(KATp?b9H΁*Hod x=W}}Οo)6ZwsӤ+/pfZM&C>'FK<.׉#7i0tNOÞ1уVӦ%{bO,t$b 'XN!VaZ7?c؎f< C923NXU^XUXԡH4Q!5FQq1.GԴ5mӨ:l?/_ɨWg>ޖm}྾}S}S}[m;Vz?yYE,SrFf7jZojU(ZZM- mHTDko֩Ԑw fkRf܌S'^5oaIⰯݲ"yO VC 9 / nG=2kz^ߦ5ZSd|}sbXEmCE܀,}H_ t1tNcu|th+=pmŽ,'!> #h‰$VZg{k/c;dʙAV`V*_H35dmO`m_+Y7RM[ty7|d/q_u8>q|jreJ]s{I.K$I7)\/~2ւ` wN 9k RU<^@y?Zl Ypq<˨l@>wȃ]55̟]"z9|>iZz*vh_H\b1 %(b9XbHl[;ΕGtJOU~X=Cf2LE15&!2]kQ&emQb\k{l߶W=r*uQrMVQ6@WZu/s- yAg塦E@V4f?@Tpbς H dY wQpEe txbkfC眳ɱن)L<愓.zE:uzyѾ6֍ nME< O,f3g:L#VJ7ڃz3#t3ܑ `8aVya7Vcu R"MLCX0 5cm_ɬX۷Q;=TfP|^a{m~vΊ:Wz w| ^ <~ gdI&CVf/A= :S 8$ -] Ȭy{}vm]7M ']k5U>>8Qc" H=?J&eŊ( XEņb]Tb R,r- ,&^[f;GƬ;37B+|5!y"KB})/Qϼm{^egۛ߶O]nG/;-+XϽ.Dz.IUܖVxzYNE>ƹEcmR`Np67; ?@xD qBNF;d=:1qz)ɷ4˦-P?20Dd˥/,lN ۮogS+?>+=D6fDsJqX;º%Xo!Ax?6FvE36 fRkZjG˜h-}Qw}}% y<'o%&gO/P+!:~migbssزO6:d;uNr嶼#ӷ|겯in8P]42";K x$w;p/ǀ\a@T n9'?4iݯwժXWޒ|c1{~¢̔ ?u>CѾW2eD#U2uDs3k%`X<}5YubHb@l臍X,wؕ1QnǘY3Ԇ:2gZNwP? F='.#%o@}Q6 տO 2'Yԫv^Fl&7mKb{]Blle̲U#SGKRm 2Oo_<)  aJg#p7 x  ,-q!/>sm|fă }GmGF ̈́R3/d,4P/vc̘8204-si#-set7=ؾؾ c|=ؾ~@鶿 ?!/?؟p=wV$v[u}ag@Uo: '@S%/sv(d/r`zw'p(O a1n ~9 >x넌IVrk2bEfyfݩa=SꏴV}]D"ړ%V"*l_b0lgc#ol1N=c:1dlf6-l-s%z%w9&'o NlKl?B |Gsm\fC _SQ5eM̈́kX^(0Ddǣ/Ng-#WlCT}P'*}v47m$7ihkvEGh!xf6F^̬ cȘ2f e4cAKmh-sen#EHHP_ =OQG߶=^_/A]E]Uc6[a&9sNqXrR/V1˩In8PM<2"; ؋ 8qmMe4A e&jA6QHv['dܟ^?ygS7k~85c1A!s&HDADPwQE" *, `APU3ٙز=ɝM&ƒ?k޵ 猣+L"x|${r5pOt>Q{#dZdۙhϖǺX/Dl cQ4c;xFfa7.#c5fӶ˭Ip"n“T!eR!UR-F+۳%忲y1.j;ն'TmU=SUnݓ=b_?Vg{&=#B{"^koޑ5cO*sOeSh"ӡ}Lw-[Wa bLGb0lg`5kvLh+ %)%sI ޤ2)C*"4 ,Ghp5c4}tca^F8^m{޷ێ_g{C>ۚ^7 :hulqOio\p;׳Ͼt i8t l,7J'8Mn6o A q#@h΃E_ߞގo_դ^oU*%gLBf~\4SH:^R\ 4Xu+?;ed:eShOz~2.clNG{(YMخ#c E̦H"sH#p%H DPTR4*4֢L4 =؞CU\OXڏ{`[4dw+?9tolftit``96X h_ m{YEihw(sk YPܚۑ 'RF*%x8žGn}}sv--S2]O>o8$RrGcMﲜָ?i近h+ڥlzZD l b&#I6 30ˇI(SI&6ܞT8 wRE*2‘* Xh0= e͌{ն#P.&^/*ն7^o~eg>s*n9u9u8[zNJ[r;Ƿ圿`#I0t?3N.NpLm '@gAT&Hz@ǣ9~{Bn7{;&oonYW?- 8r2V4Gx.EVv#4|/_<ڙ1W~13ѾCMG&T:348lh30˟vWԉ2m)햤ܖ%.ƒTxm@H؞۳d<~e;WטtևSg1X.EGGATbla;E`DDI.7w}~.M4ɜw?6=9a|5oe}~/eleo?0+lȾkɫ:YkRc}5ueQW^v .ti:-,  `{9pV' K~:3@ A6/D@| y'ù?;4*)u*J%|R\ښQ"r2ug~|{r8ed}|(߾/e+?}GwN`_{V)=QMJGFzk`X=O[1жc]])&me`C̤X2H2!,6RfOʜI;)FFX#PR:VXk{vԕDt%ѓmb\>ۛ׶^{`Vhsג_ou&ۯ9/w~uNOc ^(WG7EG~Hm<`/Rnn𒁗4 b naG#6~otjz{+cգ 41d̕Lxr3 C&Pc?%=ѽ}o{D{teoRF{,V_X3ki >b?筌vH1gQ֔EжRd)fIlI)s!Hg{(j_eJWus#BNDw >31,??;Ozm|`Vh{RptvT:ĕ;\qZ\:ͷ墧/,s~" QasKu Da)pAp ,U]q-upv_ms5vVl)S]_PsiCƁ>Õ@+QԹDk7ѝLt"L<=Y\K^Kl ~׷\o1+i2ϻg)n:[Gnsng W|1+${y?-DA^plvWg p※ wxO~ a>.D7@\f<ш͟Z?{qm⦫.h.c,9$%\Βv'-$ }'ys[mONܩtoSbUX#O]5#msN z޽ѮB1),2IL)dD$eBYm6̞92wRH1)!|=JiZԹunB ~xz9CpL{m7z@&fJ2꬏ݲ9T3+~sګNJ}aempޗ!W`AFÁ 8[d? g@A&@X2UA:Lx8e/69\;n_̈́*[T7."ZDvXn7pg#S6MͿ]l99070O\+}=}tRTuTRx +F\5cE6Xy>ݙb:P3hۭ( m7 6Sْ͒2RB=")Bb%#Zi{,Sھ u$Dwm/`=/fTgw;L[L4ߟy]gvpͬU[*b˜:/,v .tiq_։Sgј* 0B-}˭"#&"&^c[vMEr;S\q;pcG׆JW}˦+*^s6ة 5;/-"D/x@-*4o!!D$ I5H@?nhCFَ_lM+R2~E&/0ɝ) r k#v{O{e/۴}h? r]&7~%[gU`kbl/'ƳI6b0<=69>4vW҉bݚ&IږT8 WRI*}Ie*jjŨcHBQg* um"];=D f;ϬOh{徳+;2%XO86A#3-^"P+J~:`fH<e\M=$nkz#~Q:*ƬAbB|(E2BSOGm3g|C/G>?-}Vc`6&`؈9x6a=I!៍۸~wlixm;]E='Ѿcx"c{ 6Ʀ،`l@[/z;mL[9Є-HښTؓ gRN*Il@sQD3Emf{նam!zV/JԶWem;նŮɾѱYxDۡj]U{V,/]Ts) b` 3!vYNJ#>p"!g/@=?A  @$Q!/$ iH@Mm~?yk:믎M)[Qt`of~ޜmھן;:cchOL/x <<1&QؔM$ lOs=n4ag p .҃TJPնǫm_:נ4Թum!&woXۏ}m>mn]Rca%7=\Zw'7/rb` 3!Y冚ܡc{4RJ&>1@$Q>σ$ һ mA?μ?@?zCgcŘWV^2XZdxni̜+B~٤q+ݿJ3Z۷i7`V*\?DV=/Vc}eKlؾ1>&LG`P<)~4LJxЖmeG#k$i[RH*\I'em]E(Aq}!jO@KQ ԑ:ײ>{#$KY _ ?y[۟0V;*Y48\NֺfָW5U律L{9`Fq`pQ`i(/L/-"D/x*Rv+|0 sMGڵkߵJ)ɾe˾طٗЂJJ(BwΙ{s逸 sqFs1Gs=O||^ O@pAxD *q@A뇞7P{o+(w,y!S&vIG"g<8w]W{h*zwӫhW}T5˰bh̊šX+ж t{c=j"펔m e8"hۍ)cRfNʬHH5Fږؾ}+ѱCtgl?;2u]6*'=W=6/}h]|&xݾ e;-/qYpuV{eO\/lo,)z%A7Hl`/n^"O t%ķA\ y:Ԇ;rwwFTi}ʪB%h9=#SgdbЛC!NY+^ {>hwda}tfF:jh_5b8:Xs֚CNǺ^XϝҧmLQ֔%EQLH)&}QKOE0$Z翳}j_ףMDzl?~xqx!^RW7ϺmvNCL=(Xg-I=QiaGN+Jc\ ܧ]r1ɜ( GBZ8Y cObd0D [ < |:hHʃajxoʔYS,_}akEYtSF锉mg {nx{JpO['7HU2Ѿ/v5ftG`0MG{ u}'5эwh (# 0ݔY2فlv LA-Hӑ|&jؾ-BmKQJc6Dl/3 Gm7+{dQXo]g^kîMcwagN+K.pmw,sA8@E84 ia<gpwpwo?i   Q A\:4iqI9TQ;n~bc_b֌:qvBXߟoF&RmT<.=~?Qysd٫hW%*tch_m̊㣰LBm{@G7&RNm e8")dB$eF&2[y2c;Z<ɧ!yxsQ[l7Dvs{ /RcQWQmwӆ&Ӛf,[ܷʨ&߱;Xᰫq Uל\ ¯xyzx;\1?k- P =3=8 8Mva'  ^Q@\ Z?I@RN?U1zk҆kcV-;>LP^K"Sdg7o(mz/GGBOSKwݶ+o5WKV`u8a<>kZӱv :X S.#e`OZSFaF!cʘ2+RfG6;.dZ<CmoZym!c2}#cDAl/l7|#m=?1ȼ2[cRewrͥNk9/*v[t+9_⬟_]84< m#=رY mKA)p@ y恨D7@t 5 ɓ§؏<vv{n\)r||f,:gah/&QΔ>vaJ!2!e̚lglw%=_S#Pk$jFm1QrԾ=wDۓ>޳a]Vy56o'ORyI˼BS/yzz9]!kAù!a^j?0 ƜR*H{U;t!B.$&w$EITNI%b9e߻wΰLλ_g:gY3:?xz"qN6$'GLీ/ Q# DOFdq龎Z kkKtVM,3'7a36SO *ol{$$IItc-*`CE{BپXze{ 6݇ݍ4vm#MgfLAZҙԖ92BNtx9#= QgmJԵuš퉨{I`0>Kf?+m4{Y߶?x_۟wX>bVAԚ2GvuӶ"$_:#iW5J7mg'm>FF}Yl`{k_̢Z7l؝}qOSb Uݖy+/v/8?87`(P] 7x;r€Xˁ IA)e \AxDu j}?&hz42ut1G;PmmUkl,ZsE7pjD|υJۯ}-umJA;vkRU9op)w(_PQc_ky47@O8I4<2,g+ X1^MIQ,?AXJւD@m#h֏W3a- kq%1D][|`(X`axd#Ls '?U{Q-E;ړ%To}Ds#k1Xex ebEؐv_Hcg؁4#MgfV$Ba9!"6l6m!":PG |KP2ԹuҶG Q.~w-C^5)mn{؎_mL~ݲYjamv#{tp-w]vcUb/"Vr Z x8ZH`v 8I X< AP VD ~_pF5=Mj_Ւ*7OZ_:9Xw% ssMX5kӖ'?t?Quk?^zh}T|Q$xhWK念}dfڀ')]vH

ȓNEiBnKZfLAZҙԖ92gBNtx#H>Ð|\:Pg4mZԵ}Fo*mQF }lyJۯnwmGom;lhhc|hUj}Ft6TZo;P鲺5«AW.Z<Cq0p?x ' V(,VI.a^~.. Ax Du j}g=::c}r{Ϊ[ohėi-YY45@?<`xzԇp&3-lO1X7=P~쥇FEzŸپ_a"wI4$%%Xmbhuhl_°>AOyƔ펤=ijC$3IH !s$d.̃}BPpk%Z}m{K~{J ,`?m̢1C3)wmYv hwrTka>0lQc[#R/pߗ.Hh {F,, ^HR\DV Jfg\.آfVGƙ-$qf/8g|#/y^)vcSkZ`8ROARE/@m*{GAp_0D|<+:Ѝ vguLvǸ̻N:vk>Syuj UZ:q,3 s&9S3ֿt]ÏO>SA/!+]8SѮF;kZG{,҉FQh GAJ }Yۙy Džnmb A2fvJ=>_/P`ۗ(?۾۞DhO}3D4k#\}5ҎC1HeJ!d#Cdcݙ1bm_0&l)m7'{^[R@ʝH)¶b EѿG $눁 mģ>9m>=m^lo2yml7添-껬tX[Zӛn:~^reC+n/yWzWx؝5/7ԓOBG/xK* - ? YH _q%е@ׁ$w@ ҇#DG>ɺ7tۄnO: POZ#rvBNl^dbaȏ!ϙgZZg|+#|7U{x*J[/3!ڏF.[ehV iD+.k{[hFsXhG ݉1rPF|nʐ$cm_@rgRNy}~D_# 2l{,37+mzv[۟(m|o=xc{]V56mZE:ם7]u]s-Jπ o2E~ҠYtTa8>k"-^ V}? Ha&D .q@ $ n{FQdwͼizcnlڮkӷ^XXA/X?"n dӝGeg-l>tuka戮W]djl)G&"5H;i"hvpd,,_J "!3 A4KXx&0DAĩ 2$'Ar +@ ; ;ht/U3b[7*UW-V)DhDjQ\?ma>"ݷT=|ܫɮٷ?֔ ٵyw>r;>yK>namCOEk)]3fmu|艞3ə:0\[Fϊ7gMCv#A &e s@%@ZnavhS@, @R:@vdw ̸58];|Ǖ6WlǦ{ Ni ;" y \21FV|S{?+>_gOōrG{H@z@]fDc74}~خk#N|c9É*И,Oy.lOJPk>rj[W==E{b*;ƬP[ݡK/F>氶Ϧ'̢5Pڬ~=ѓuc&9#m=kEOa 6q4;q5.NTlua#D!c=XJd{<}3};d{ =N"s^5ۛ?VfS 5}WW&TU8Ė9.(u(q )r-ts=a{㣓;NB T> 3A0@,bAd~8H1 9 BiHnnѝ{jՖ+F]DmIѸ"Ojמ( 1:gӽR`or_쳟U;$;ѮC5cFqlw-GѾM94f(9 hm_ZǛ@;1\FvSƐ`F)x.]^X/=랁ucg#c=1e8d&d6dndAdQd> _loiv޵;Mf z˴ZWw\M[[a1g]θr42P~pQ "2C@HD \ M L.q )Rd.HNe P@>@p!rg͈$Tė*U=3/_#"W+4G'=Ct.me ;u'O(|m}??SUw'5uE΅sw]tP **.coߋ(ҔtQ BPC\|ϽlvfFތfnt|y;m{qb]e'9j"RK@jq8ڗ#Mň"6AH#}IBѶSlؒ21]fm'Nܕ߇`l$Bhl b(ZC %b7aw`m?m?m?mQ؞e*l{n֊m*dlܳpPӞm.oW-Xx+۷ǥ׶ϴ0% TMO|E]X^'Ap_/" @| ARz]$x?p';5yzZRj̔js֔k-Š*Љr sΚ[ضihcy1\ھwھ/};M}*IhkZwml}#tc%c~{p)o뛝D pF꫐F Ҡ=!V$C:Ht/c;eJ:QFۖb[Q&s)Icܑ;rwRE0b "`WC ۓ6Clw]mowm{ȼDz۪ӦVm?uH󼽍Ωu.ɷ\TX|+ۿ㚯?\$h(x?d7rw pW/x끷ہ qa6 + .IHn א'oq{>?/;&}6i{V֬MUPM(XuMkivTNxAȏoM~꣤~f6A-̢E{:h7{kf*v8i,Ѿ"VҦ=rm hw Ql{vcKĜ}.ݚّy܅{rol;ƶ//%cU cSacۏ*l?mb%lM{w۪Mabc{f};]6rMq[Y}3+dz&5I(x d@\jԁ6HrSuN<դ)Z7Urrʺ+XK I l_G6|ԞNE## G`h83Z~M)ehO뛵vўl@H-Ft H+!V$C:Hthm <(CWЉ2r`mMXP)E)$eF=D 1J D0F+lö'*lߢ}+:k)l/y~~?{ݴov[Ӷ߷ٟp1iwZ7ܗVxF^ ,.q.)[op) /Eq5.&D2t#9Ga`P*ńazRHPH%pe NνY=K=ryWCaa#"8um6~:AB!AT k A { y8B={̉_k2w7OL49~jJ+i/+Ս+fDGJ8" Ocei+̇Z5^M>=0`~i<4q'M\Hv3eI"r-Qv3*smA{`7}.E۾_ @Vm\ nmOEe d mzz8{lmoH{c{ݖʹ핷mK:%kYW8ӶonpO\Q;{QJ9_r?E L I(g,/l$77KKl-`)K^8N ,Q9 m t3 "ZV7uz75M0eEjV,)a,87/pn0t?#e?]>e/[?{ɴhפ} xB{sy;X 4֗Bx~hnE7Հ%o3oAp'@ *9ko }<!Ž?/ m껛'5MNVc]Uf./YT̈)ԟ{0 7 3l*ݳ-t/mW=e}j>e?{>n$B+Цl#t1hgDJ Cvȇ4M&.ɴ'6$ˊDf(JZRkTjJh=Q7mAHo>m{ev)l?@~Ta{Oa{m{m~.{wlJ;;N;e:kv达ce*~e.%6gY3)Я1X؈F7[:6ov?Ap  ,Q9Հ~m ]t{Fa]_Q{_iIl\R+\{YB* !BfEOr:nthe葲SO)ދ_6?OGv,CE{v 0 0&=mg:m7&Y$bN%*AѶHo͡mB(l_ $Ҷ'!i۷"CYöfжYK޶|?e#·r/ݳcSvˮ=1iݶ5{a*> _2גۢ@ 4[[! Us䶇C^pcX"`I/xo0y @TE/A|$] 0:Z\U+w\n Ӓf$Vh/+Ս+fDGJ8" o♃d[}1RccT{ǔ؋V_IH#t)^8!لiBF:LiGY, A)ۥVԖ?WTwǒDkE^zGz@ , v,{C{̝{)wE5gx3 5gXY]jsf|^YIm1&uPgR$[} @7l߇*l?{y2J*ll/lT)]n{~lo4^84L~s6m,R<+%os4M/iV,k{g$;p7N y@A0@@@%..  v?B=EdӗG={GK'(7oޘ6{m ZBׁ6ѳ24}{h\E_ZZ~Tm'U/X~ϕp֟{ڽyvݵKә]jٱZ֬i1ay,ғۮI0)&֘:rnO$Qؾsozg{%ۏs_|kpޫH% IﳽmvVml1Mn2oYD>6m*,pX2;˅j⦟X;sk=A3/<@ vd(ǀ<  !T"@ t%@WSL0m ~2Dt[FD7 o}vNWN8^Z49$ΜA37ߝ.eΪ;sPBxdkm`u_\:u9UW{S:]zk/-CHC=QfپSa{(;~ZkJsӃmzlO+^nTfbd&j0zhyUnrRAr}\2\S $z{N5(//|  v qȣ@\a8AR@\z`ZAӡd7[FF4Zեg>Qqd)sgؒ>kC5IsW$<:|pѷܴ'&OI{URb~7o꺣NRVӑ݆ݜ1e<knI0vWԽu{!$[d~]o/ۏ xWlQ.l{% ۫?a{'g{;g{]EmFY&fty|EtVOmSlTh1qul =WT7dwybD{swH2W@@Ap߂0 "bJ=]t ~:z2o<Ȧ/׏sSGK',7o?f ;?e_⼥/Jۍ^u /mxެV]?:UO)y^Þzi1a<}a&1$&0-&uX@ W ۷mw;g{;d^y%#x8x?J'g|JW؞jl4u7k,?Xe}PbmK]<2N鮋܌ϙ$XK!uo"]@0'<0\a$cA%@t>%@WS L0m "F<֣#F]szܙ 4O ɟ+g̙Z:gM?zWĽZ_>שNMpoJm 3dqaSLbI1&uĤ.HdKl 'nl߁zw1˓J뿮=v퉃mSjm폞sp͉zZoXUY9\fRb\h)qMӲlgLtW47w$ )"qBP|x ;2@E\ac@T"P :b+yL0 Pcx\ۈ-##G]ñg>Yqd){mϚ57,ETA[ézzO՛~/ tYLbI0v'ݕl_dQ?g&zC}Qa%/ཊVf۞d{} 6%4VTL8nVd'1glI(U eBb-"YE 6[Ν]Бޤ7CSP8ZPw3\L%q'XW5޸ ƚ,VΈhUQ"TU,GWkhaw*F:"'m@"]UlGz1G؞:M Tl*ΪIЍ=X,4bg,tS$ΆDU1V(.;jlu 3ca) 1`sl[ > qS@z K  * :T@Tnn"^=ɷ|[](u:yukru+ӟeczwcza/UHZ,jC6{TU,}O*C#DG~c{(bi_l{lWV;Z'R7|n-Ƕ~;dLt}ɜMf-Z:XYGq97T/D*2+05:;dɑtTrΚeq oXFs-"yìh=gObDwAۿl`kvǀ< '΃2"ZtdNB։f雿bL/L:&@ՃbzR7x-ױ>N7;8ujW?m m{ګ|~N;oѥz!%"ei]:@d9gm8E7,<0kPϒ >(rJ'b 9m|@@zD@@@MD/˚[kԩ{+{ޗObz@|8' Ono9Vʃ#Ot_D/F ؞4d{Ym{Ӱ퍃~bakt2tCEX<#lc&G3XL9WY Ώysm !|FL9L#p!/l`[w A q3@3.44ɚ2}7cRmi__Wԟq2y_^":]3Hhۯ#=8#z i{dzmb{iv~N1ed%xk] Cۭ#;_ z>mvmϯ,woiwμ },O(l;x)skeC5M}m~-&zukͰ/C|%^nՉѠr惖H@994ۺxfg{_M^QNwG9/f.U:&רzc4 ְo[P!RDuvuPu\#u!ҌڍJSnR+bkvѝm >/Filter/FlateDecode/Height 500/Intent/RelativeColorimetric/Length 13535/Name/X/Subtype/Image/Type/XObject/Width 500>>stream HytTW3HBYbK)Bs Z!REJ=88X8KV*m9PAFTT2k&m ,,,L&<46y}7}~gžS|oh-rw5_û^ɲ'GAʡa9m{soMGn_X9L}R Q5,v44>lR!\h 3BOsPei7[%@ȹG#i8t b KݭRA=4:b{ CA+,кXao<Ѹ=:`g䫍ЖXӹ~TqH=p0ˤ7Z[[;JI-b9;'A'$sͺne]'x;+.{:`$aY]˙zݶNtƈژD+5f1;V2䳺N9fL}eFs.1J|z}tBܦ4s2:襠pdR?}:wC h˱he(ӛ)m}yt̲$ؕcP=nvAg˸Є/_&CG/e? sM7(Rg ]=oCg3NMT++|6G3fÛkjwfလ\Ƭ _zrL^O%B[Pr$,#U#񄌀nʸJ5ZWe\ .TMx/u*Qlt_4Z 10C;6)ji *z~m|/nvmT(_ w<SC(AeW" ga [VcC 7\^/k1l#?'M ྫྷne'<)j^pVKʝ Snbv9VHoڶFل-^:-l،qh;ZhϽ/\G:nЦKY7?aP,¿&jSPJ=OA۾KJTUN6?͒оoPT6DݒALhQ+̕|s>CKhxX,үqHJ \ l ĂXH{(ڇ8i3J!0Km{/hM`Ba:)O@%\bAđF@'Uے~SЅ(^nJ0 )tI+לAĕӒ'Lg=rJKf]^U d=ME19^^9#s~݊+gĆyaZn$_!@.|iy;Ñ#w^a*GW#lb92Yn 5#{hd90֭v'\\vr sT\T鴜]Paq2XlUL8A(HvKG>hi *su:~aŔk#o`;&7MumR"219.#o(<ٍ+áƈ* Q>0u"/ 9}@nΡJ8߈e}#8}qo)|BbqQ fcT7:q%Ϗ(ڙW"{AU7of<G?If$B֣qĨ@X* UsqQu Vk$(IQm"5yfʧT#I1m)#jp0@UİqBi88V&ʇ8U[> e<ɥ(L|tz'K)n*%7 R&[18k!tW6bN|HzSp0\hoVo⵷)kPo!zx_Qo)]l#ZTCN17Q*!$^:&SyBzsdP%ZO7*ϑN'YLj՞:/}ۦu+~z oqVUᇧJH|"mjvtbgy/q2ͺAp8g;\<6ъ0!iOm[0 LS+b֗Vx5ΘE+B2i;=kos)F7>1ć6hH_%<*,do`Ѝ2GE2h "EmE{zMlQ NSr>//+'#ZI./ت2 kV0 A5q"lP l DlH% Dd!$HXS6OT.6 : oJRP~r[zϽs{PvϟcFRR09NOU2nQ2M~E-hݐ[”dS@4nJ-ѷ9Fd;(tIh®LӊxvdῚ.:0)7˓nVd=hm*򧉡sٌn?˸N u(xހQRYy[\e3*8 +PP w=/#J} (ǟut6dޮ J}Qp:1|;O](i4rRp O FUWi` n>h?S(ߺ[YOOkȆwHn$RQ0|LC%m`~$(]`~mC:tLvC*ќA폵(؝O)RBF ؕe2XԐ']vS"TPa'?00$TPa3 X 7ؕ+?C"yΟ*İDkKTbB"΋ *1\@A;'zk`՘L$TOp̿bL/;$UOp <[ba7O";ϕXs#nJS,l΋)6Jc@49 SlYٕP;601 0k[ |T;Q0/7f+:;#NqDaw>Yb ͍9`O=z(0rT;F- 3 vJBd:_o~л@Rv WISsu|T9J9yT9A0HSg v~8_.NWK)6Y_/kظ by9n=b`fW\rJB$ΟYAKlQGv)6Ny1oaB+ܘ P9~0gL!;*N^5fƳ;O'v20Ә ܐP;v0/2;/X@dyΗKS,6f";GE`1*~瓥)i<~#)c@DXAƤܴG#~J,u`޽i{Dҋ *T A@֋~J,rHě |TA%G!@s}q`vH 3 z$ _ —*İ <| J5t].s $v,owwAcw\\w-vp5`%8$*M͚ғH4*fW<%<)EEݛ5,'< }=Vkܛ56^ߑsQ*^}2{Sf}Bxk[25W&۰ ,t1Z}uEպ.I-6^R@ܟs+r`8,EHi *ݛ5l:PBx&by>pSUkpB*ߵ>cy. )TЉUɰm h{F} # ֶ# σ1 PܽY*sQ"B];B\& ҉DܳQ~*~dEGhP685ּUv)E:=L]bKWj+G٥D$|klxo%^@B~N^7U>}]lޓ_h^UuY`dg\"ƃ%9\s/xpJb0srJ(fk, DꦭQ)+z|ڥAH΄N}>c+a T^wAgU{S:‰e*Fr~'GBeasyDKvN0קR3.|%I$QzXi^A8\);92Lf䦽,wq#CG~Yr|f֝bukui"5)@œL^RRdR2%D#{c)p7=*i[LFͫ6$kb(b*r`,A{<-ks<-V;ݏ'###|׫w$s$z[B5i[8mt/j .Yz|;+kԍ-؞Tf'G> @F#M2u:,Xm .5%4z殮τ()\cҜUփ#ihƓJ9]vZ[Aɗ<]_vs]5.Nz湌c1\|oq[VKh=}H(%!$fN`Mpb \k3aȋr)iR}1aڬy.oϜx?@j3Ŕ#eo_ XSkjjZuS+c2YϦ6cj?WPrPr05m%'ͭJշ3FUuy7?v<9etG )%MBjfwϢfb WL^gyѡ(*ܺz4M9jH'p]Z#Xi9~=r Kk/)075Ss/-xx7N%5{.ڗ5+~&J^Bkl1=ZXo̭wSkm){&7%Ǚ׵) \c.bu4y` Z7uOphjE*m3fl8˺lh FMM nYL\Rډ^0njhg:^Vu'I5k1aUjTݳ_BM>\SLp'2lk5Mhg^Q{ um?NƦn荜T}Ǣ$='g.^an혛?2Mq=ohϰX >݄Qb DNH8{ڹM snnUeݼMqum'FQ/9 ^cc:8C$MЃMj5V#(JZ(Ui`c6L.{|6g`3N|S1>vL2r ԰8!f~ ?:BR{uV^Uj0/"NG,iy-cWLjH<J FJMդ*+z{5? 8kS9\SQ\׌ӍvkFb` j APtpqz3pB6wF/_bRÂps..wqlӍ65ij~b`j5 E.whL夆 07/hMZ4lb'mɂtpI&mξ ՟s GFZ;-M^l`WjG#NG'S97!԰㚉O fžmTv(O*JGŠ\jho䒚91rLI|\16.hQ}*ןSW2Ul9"ǯspj.Nk*K m9ԭ+Sn:\,F{I {[Cu)rqb\;?ήgM9Vz~@%RUלwp)6{ 5xyt4TeIqI•_]bqwZ}C)=K?n5q-us|PK` V. oʂrpf;4IRCBpsW.Nkl9C%8$-$? 7w{pD j$rkԐx7֔s.Nk ?`4J T,V*Wyr h(!!t6UNwqf)&B3]ϱ/:=E϶C\hoh*!pok.+.NkM+KQ+OA)!bgb kԐ8ڛjKEe9MwlV&08wI\z<9v_B=GoxVI ⠫tq)I1gV[8{ʹ/q̓B±3Z2s J;{QR6(81fl*1^ȬoAxٖWġwxLä בjn'f"pI!V7_mN~,,(iOqpj]\L,&OhSS~, S(9ea9=QԴ|aHppop.qv) 6`}:AyҚs. ҳ1!ڇMjHW ;gI= s$aKeA :3ahIM|{ ½sqB\nv/ x;╋d%ۚ{-z1齚ܻVrq#pZ_[!4=~Txgm(i|2Agŵ^ퟀ\;{}D<ҚCwtd\R5͑{G{Nj>Pwx7.$-z3[ ȕ#2.NdH:eÐכm’J5MjH]uǵNW~O@ᐭq "wPt6PoW+lR\<ǀg'W)1_GCgho1'FM5u(@.zW6ޤةp~)lhopvK㤆$½wqB\~GקRFN=A-26hIua 9>g4/Pw~䢙]7o ԰3"QR}Rpno,]tT)T/i Nx ֲJA}dZP><眇`OgK}UYQvq⢧8}hu:ѷm4? ྆. :8b\Rs>5usq =)Wٕ_Q/zBΞy@Bk>HjXܛ.b'52|2յn3[,@F 09ý88i?:% c~+*k ӷl͡;fGI {wqfzb.J(هU?M@ׄl2,aph]"Bf:7v1jjy5()Jk;8%UB{wDֆrBz_<8_SnTA?9,_s&[Zf.Nv%5$ >g{Sm%dq-|(8VrTӮ۔?i(!ҳhYRC>h..՜,8Ot5zњYGY6KudhIWϹޮƚʼnq-vIlw h "^t假cl3s hiRCBpnoP\kq'ó@˚^z4~rKd. 0ڛG&`Rs~mbtR/a66yQ_ -V О;t/) ζl2e)ԝ=_:ZJm-iܚs.:8]8MrWrix`s,jtlN7d.LHn%FHH%t6@(D4<̨R`- -V{{yt[kom'wꪐguww86 |mT*fc9,^^U܎F{RCpWI<ŕ^-9w>a!bͥ"fbrjJؖhoY1h_ w "j>^Zo.DC¡T¶48z&h/]j(X)n^ε̵c! 8dXc]'a/5,GT.ՠ-\Iqt rQVla0665zYX wHmkqZn W9xFIl{Yʚz,QK  IЀ\koFZV7 Df7qLOEM,")إ9 wimqs7o: R- hѮB.590Z!wsk\pNc? ټ&)ĄovZcvjIvŕKsY9Ks%i ƺ4)q~{ld_*wXZ ^.RបcVyvvrhԦ/5 hOhJ$ymX+qϑalj :$ڑKWP{?}p$D^4/5,2ڣ'2킣@MHmJrB"2a83vq>f =oL') yAOg6:@MFJBGp V0NGg pfrSSRrN[pq#Zmj-.s}׫^֚"0 ОK}Ԕt(}!73I}rh}Zg*s:/2.]7WVRYYt)-#=1@L1/XysBSb-@T7[@6h%7Nw=Et:88:h=Z;'&0Q m ^iUsv<m,]?KUZ+ⱸNhG ə@h\]v}GD (;⚨XÌLG=p3f&2eVc"|8<}67>Z ߔ={ zʦqq=]qohNԱMܨYsٽ${hnc/F,o!7jۓm TРusQJlDC!]Ǭ)uw7٨UvՕ^Na{_7?`goP@-~ endstream endobj 148 0 obj <>stream HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 N')].uJr  wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 146 0 obj <>/Filter/FlateDecode/Height 500/Intent/RelativeColorimetric/Length 8281/Name/X/Subtype/Image/Type/XObject/Width 500>>stream HypH\3"RiaR[PKRZZFTKKQEA{-V2؂X,3c >wKVLMxg/fgywĈg\饃GN5U_Nu-C;2@*aaO)[ƒضsRP2[Q]F04o]=6i$hR}|C- =d/[bmnhZhyy.tr1C_쑾 Z0Xt/߬<}W@`_$F#9 ,.q>`tvKN8ژb7hUf.JMo s[f@MY{j5w4+)IG i϶SW.49:h@D[&}*pms'ʒ`Q[\1ۙvAg \YNT_?3s#ȁ"9ph[cd&3ʋ`SmO'Cy(2wk{hw(%( Yk⟧A[ʣZì,>էᱎu1혆.jxJ,hx:N&/3gGBgdz=LyF"MFڷ8PiP>ܕ m%d(1S>N/A{\ﲙ|Ktv$CN%ᲆBv"2w-ejF%HwFsS (#BLT #d9)Wq`f%6P^6zDs' mSPT\IlTSk8wBɇv9Czk;smq>≛c xi:ha̤xN_K@Dzz"3F2CS1B?& K[Iuo1JCǠiG9D8eS c GWid Fcpa:=MWvIc1H+? D6\Iќ`,bk&[ AjrF3^#ٗ<!%?&f;u)%ң=XƧ{;$1%誝%ئh~KBcd -Nuם6sd^OUU-}E4J9\?h׹צO ,6>bj-"i/ŀ[z1M8`k*;AO A,(HtPL)v)Â)_iMBa]rgRq (e m:$YǗRHD1vS2fT1:R7 2sQ)#Η#<ӋT#aƄ**K#|JHc#|#[' U}-g#>0Py>04v";Սta)!Nw^IyQYvćtpMBu2:?jh5{EKOQ}\<U|q F@IM7&mDOsS ,l" JNuFaH@զqF4NDq c¦P|a$dv{"!$X^ /`w~L(RwwUy"n 1} r] 56M!1)$n g& M:qfP3;*n -Sf: RH1hT>G\ Bs9%ZЫѤ|HUK,- l^ z= ?׺D+Պ2AqK4SV-Z%VLZ/ [j0Cd9(k *n]K0V8_-g >/h[,aĨZ2\y%zUKO;W`f + w>IҮC&u[`*Onخua"ەZJ}JTH߮QHuIoשʓ*DNwV%0VnqSoZ?{lw/r,1Le&-1njbH\$D42&#d6'q ACm)ܺr (kmiO{1̌֡šN4(|t33V)o3Jhg:b@  }d#3 :'ο'%F;Qk|*~OERw>N\EE;N\s;f5hpTOaf'T͌&N/RuMGhbF/u`=1y`04XJ\;vJ\5{v}*/5_,f$qV {wcf$qր:f$voH||Ht%f q,'@.q Yj"qJz:E $û+wg1I4Nw狙q?8BP֟8BP ֫;?@#`Nj!؇Ӻ:I"-xAW iXe,±j(vu^H #e`pWGab7X|dF(N(ֿ(Br/Iv}j!&;955Wa+0W 9`&y%/ 5`lc`XF΢;o|y &,Q?k6 G-Xg0:EH%f hW5[%'#ffxBC^"yI09E2u`g{[^#g"yb/Xe{e#`άv8E`Y5"hݬкsh`V& y Fz48EKm<>$MPCjpIW!ScQ=XWCzRCWX·`ySaٮw|;oup`W!A_ W!Ac`REHCoqozEK̬LvRsHpdVF<ϡU:EC`l5`}_+pj~F1(B_6%ze-`}+pd~F^Yc3XwhW@̾ Fu^Yc'X_j6Al)p4ϙ ^a"?ef`+01wmq #z`XFv׀aS cm^i Mv kvp9`F΀%;jpJ#Ҽdt73Պӓ[=nv#`K4F: Z0.#NqW0BǮοM jaXh~F(n|Ì#;p(ӻ;ZGܵ|_=ۇ*`KHhO3IhOG}s; TP^ l:I$*{Un?EjS;v1#zw>&vR3;J5:٧r{; %6|!W %$o 3o;N%~-js1xz_S;v0c;`gL4^1hֆTn2f0qsǞ{hd-6W)*"f4q*UFO3:h{%3hߢz[SVns3mtaiG6 ʙAԝztE 38(ۭ|2Vt6f> o*.)evm1 3JRVL(݀;ZfB :r]ĈQy]V(A%֢_\J"+ !%;;/8.L)MVKcJ@/ R]@ឧ9XC67sJ0o "xqSY1h64U6x^obZ 15m<Wo Z3[vn/3WO#ĒҮ܆KΎKs ?ċ,9JE˸3RbfI|J&CNܗڌ*-Ԓ:'Q5ܒ3ܮósKiE .*ɸr+A.YyKܦow%+dӹ=ѢKv^ͪrd<(1d:egY}xxĬl;=mȺrh3>Vkwn+ x y>m9|p)$#s8vU9Un#kǚx!;3!mAᅴې ܝcf;y7"Ws[4͹r"v'M* ϻIGu!:#>bOn$ F|Fu3WD|HG~dpr,~$3=+u~و$RaĬ}FnJQ$BU"bpmX,ⓚߗ@OD kFܮmꨯ (=jŠ&@I+Q$mCwn:">з'5r !DZ%- avRΤ-jlfPD-XDm2CgEQ((ֲw_I6o a;Ivd7}kqwc9{>]9B۞lу*(G9># 8ppJj۠ԉU#,&-Z\JO7_%(3|I 7ڛs"{pCoIbnɵ)G;؅aJQQ9B>ƱKTbGTuxdN-ičߨr"-|8Gv1#[Gzx6kqBTW5`W^#-؉ߝR9i φ- pH=%7~؂ ~T [0_H9|MiEab*>@+O[DY"h\[EvC P-UYǍ.Yxݤ6+$k]~pe=(c>G6Jv0 !V5h/ei PFlC6fT%YZZ63nvS s4'd#Ʌ +kMTT4$U`] B32밠[SΡ#hZYv 橊bM!Z}ODuu5dM\hڳ`˸̜m2gr$Oؕ ? (7{}L\Nx̷ u tp|R~ap ˟eA(T}6dΖSO˸ Ԅ}&[kE/^ X'PEp)"Zg$nN[/Yr -wLNZO!)By{W]Bg;_o:eQpXrb^T%IA(NXlgHWy+}kӄzZvQ_>oS]Cp7trXY7>{'T0x?ZTNKQ%hJb_!tF`ɶSЦxڽ :M0oqh[~׽ogiBw`!Ϳs࿵@lD`{w{ݼzͻ>syyAO endstream endobj 139 0 obj <> endobj 149 0 obj <> endobj 150 0 obj <> endobj 151 0 obj <> endobj 152 0 obj <> endobj 153 0 obj <> endobj 154 0 obj <> endobj 155 0 obj <> endobj 156 0 obj <> endobj 157 0 obj <> endobj 158 0 obj <> endobj 131 0 obj <> endobj 159 0 obj [/View/Design] endobj 160 0 obj <>>> endobj 137 0 obj <> endobj 138 0 obj <> endobj 161 0 obj <> endobj 162 0 obj <>/Shading<>>>/Subtype/Form>>stream q 0 g /GS0 gs 224.4700623 0 0 -224.4700623 399.1927185 327.2288818 cm BX /Sh0 sh EX Q endstream endobj 163 0 obj <> endobj 164 0 obj <> endobj 165 0 obj <> endobj 166 0 obj <> endobj 167 0 obj <> endobj 168 0 obj <> endobj 169 0 obj <> endobj 170 0 obj <> endobj 135 0 obj <> endobj 171 0 obj <> endobj 172 0 obj <>stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 17.0 %%AI8_CreatorVersion: 19.0.1 %%For: (James Elliott) () %%Title: (Afterglow logo.ai) %%CreationDate: 7/20/15 14:20 %%Canvassize: 16383 %%BoundingBox: 78 -440 624 -151 %%HiResBoundingBox: 78.77249999999 -439.372100000157 623.66276550293 -151.135416666668 %%DocumentProcessColors: Cyan Magenta Yellow Black %%DocumentFiles:/Users/jim/Desktop/Beam.png %%+/Users/jim/Desktop/Clojure Beam.png %%+/Users/jim/Desktop/Clojure-Logo.png %AI5_FileFormat 13.0 %AI12_BuildNumber: 54 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -595.2803 841.88957873208 0 %AI3_TemplateBox: 421.5 -298.5 421.5 -298.5 %AI3_TileBox: 141.44478936604 -677.640149999999 700.44478936604 105.35985 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 1 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:17 1 %AI9_OpenToView: -92.0000000000009 -113.666666666668 3 2307 1254 18 0 0 46 133 0 0 0 1 0 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: -92.0000000000009 -113.666666666668 3 2307 1254 18 0 0 46 133 0 0 0 1 0 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %%PageOrigin:115 -694 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 173 0 obj <>stream %%BoundingBox: 78 -440 624 -151 %%HiResBoundingBox: 78.77249999999 -439.372100000157 623.66276550293 -151.135416666668 %AI7_Thumbnail: 128 68 8 %%BeginData: 13832 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD4BFFFD04C4BDC4BDBD94BCB6B693BCB5BBBBC2BBC1C1C8C1C8C7 %CDC7CDA5CDA5AC81825D5E333A1235123B133C143D365A5A7E5A7E54FD19 %FFA87D7D27522727F8FD042752527D7DFD22FFC49BC49BC49BBD9ABC94B6 %93B593BB93BB99C199C19FC7C1C7C7CDC7CCA5CDA5A57B82333411341235 %133613361436305A537E537EFD16FFA85227FD11F82752A8FD1EFFFD04C4 %BDC49BBDBCBC93B693BB93BBBBC199C1C1C7C1C8C7CDC7CDC7CDA5AC8182 %575E333412351235133C1436365A5A5A537E7EFD13FFA85227FD17F82752 %FD1CFFCA9BC49BC49BBD94BC94B693B593BB93BB99C199C19FC79FC7C7CC %A5CCFD04A5815D333A111212351335133614362F5A537E537EFD11FFA852 %FD1DF87DA8FD19FFFD04C4BDC4BDBDBCBC93B6B5BB93BCBBC1BBC2C1C8C1 %C8C7CDC7CDC7CDA5CD81825D5E343A123B133B133C1437365A5A7E547E7E %FD10FF52FD21F852FD18FFCA9BC49BC49BBD94BD94B693B593BB93BB99C1 %99C1C1C79FC7C7CCA5CDA5A5A5A6815D333A113412351335133C14362F5A %537E537EFD0EFFA8FD24F827A8FD16FFFD04C49BC4BDBD94BCB5B593BBB5 %BB99C1BBC1C1C8C1C7C7CDC7CDA5CDA5AC81825D5E333A1234123B133C14 %3D365A547E5A7E53FD0DFF52FD0EF80028282E282F282F062800FD0EF87D %FD15FFC49BC49BC49BBD94BC93B693B593BB93BB99C199C19FC79FC7A5CC %A5C7A5C7A581575E3334113412131236133614362F5A537E537EFD0BFFA8 %27FD0BF8272853305B5A5B5A5B5A5B5A5B5A5B54542827FD0BF852FD14FF %FD04C4BDC4BDBD94BCB6B693BCB5BBBBC2BBC1C1C8C1C8C7CDC7CDA5CDA5 %AC81825D5E333A1235123B133C143D365A5A7E5A7E54FD0AFFA8FD0BF805 %2F305B545A305A305A305A305A305A305A305B542F05FD0AF827A8FD12FF %C49BC49BC49BBD9ABC94B693B593BB93BB99C199C19FC7C1C7C7CDC7CCA5 %CDA5A57B82333411341235133613361436305A537E537EFD09FFA827FD09 %F8282F5B5A5B545B545A545B545A545B545A545B545A545B5A5B2F28FD09 %F827A8FD11FFFD04C4BDC49BBDBCBC93B693BB93BBBBC199C1C1C7C1C8C7 %CDC7CDC7CDA5AC8182575E333412351235133C1436365A5A5A537E7EFD08 %FFA8FD0AF853545A305A305A305A305A305A305A305A305A305A305A305A %305A302FFD09F827A8FD10FFCA9BC49BC49BBD94BC94B693B593BB93BB99 %C199C19FC79FC7C7CCA5CCFD04A5815D333A111212351335133614362F5A %537E537EFD07FFA827FD08F8285B5A5B545B5A5B545B5A5B545B5A5B545B %5A5B545B5A5B545B5A5B545B5A5A27FD08F827FD10FFFD04C4BDC4BDBDBC %BC93B6B5BB93BCBBC1BBC2C1C8C1C8C7CDC7CDC7CDA5CD81825D5E343A12 %3B133B133C1437365A5A7E547E7EFD07FF27FD08F82F5B305A305A305A30 %5A305A305A305A305A305A305A305A305A305A305A305A545B28FD08F852 %FD0FFFCA9BC49BC49BBD94BD94B693B593BB93BB99C199C1C1C79FC7C7CC %A5CDA5A5A5A6815D333A113412351335133C14362F5A537E537EFD06FF52 %FD07F8002F5B545A305B545A545B545A545B545A545B5A5B545B545A545B %545A545B545A545B5A5B29FD08F87DFD0EFFFD04C49BC4BDBD94BCB5B593 %BBB5BB99C1BBC1C1C8C1C7C7CDC7CDA5CDA5AC81825D5E333A1234123B13 %3C143D365A547E5A7E53FD05FF7DFD08F82F5B305A545A305A3054305A30 %5A305A302F00270554305A305A305A305A305A305A305A305B28FD08F8A8 %FD0DFFC49BC49BC49BBD94BC93B693B593BB93BB99C199C19FC79FC7A5CC %A5C7A5C7A581575E3334113412131236133614362F5A537E537EFD05FFFD %07F8005AA9A9FD05FFA9A97E5B305B305B5A5AFD05F85A5A5A305B5A5B54 %5B5A5B545B5A5B545B2FFD07F827FD0DFFFD04C4BDC4BDBD94BCB6B693BC %B5BBBBC2BBC1C1C8C1C8C7CDC7CDA5CDA5AC81825D5E333A1235123B133C %143D365A5A7E5A7E54FD04FF27FD07F87DFD0BFFA87F5485A8FF27FD05F8 %52FF847E305A305A305A305A305A305A305B28FD07F852FD0CFFC49BC49B %C49BBD9ABC94B693B593BB93BB99C199C19FC7C1C7C7CDC7CCA5CDA5A57B %82333411341235133613361436305A537E537EFFFFFFA8FD07F852FD12FF %27FD05F852FD04FF7E5B305A545B545A545B545A545B05FD06F827A8FD0B %FFFD04C4BDC49BBDBCBC93B693BB93BBBBC199C1C1C7C1C8C7CDC7CDC7CD %A5AC8182575E333412351235133C1436365A5A5A537E7EFFFFFF27FD07F8 %FD13FF27FD05F852FD05FFA85A305A305A305A305A305A3054FD07F852FD %0BFFCA9BC49BC49BBD94BC94B693B593BB93BB99C199C19FC79FC7C7CCA5 %CCFD04A5815D333A111212351335133614362F5A537E537EFFFFA8FD07F8 %A8FD06FFAEFFCFFD09FF857EFD05F88585FD06FFA95A5B5A5B545B5A5B54 %5B5B2FFD07F8FD0BFFFD04C4BDC4BDBDBCBC93B6B5BB93BCBBC1BBC2C1C8 %C1C8C7CDC7CDC7CDA5CD81825D5E343A123B133B133C1437365A5A7E547E %7EFFFF27FD06F852FD04FF8383575D3327F8277DFD06FFA95B7E2727287F %7F855B85A9FFFFFF7D27002E305A305A305A305B3005FD06F852FD0AFFCA %9BC49BC49BBD94BD94B693B593BB93BB99C199C1C1C79FC7C7CCA5CDA5A5 %A5A6815D333A113412351335133C14362F5A537E537EFFFF27FD06F8A8FF %FFA7575D335D5704FD04F87DCFAEFD04FF857F8585857F857F857F8585FF %7DFD04F8285A5B545B545A545B2FFD06F827FD0AFFFD04C49BC4BDBD94BC %B5B593BBB5BB99C1BBC1C1C8C1C7C7CDC7CDA5CDA5AC81825D5E333A1234 %123B133C143D365A547E5A7E53FF7DFD06F827FFA75E325D5757572DFD05 %F8275D82A8FFFFFFA97F5A857F855A855B855A855AFD06F82F545A305A30 %5A305AFD07F8A8FD09FFC49BC49BC49BBD94BC93B693B593BB93BB99C199 %C19FC79FC7A5CCA5C7A5C7A581575E3334113412131236133614362F5A53 %7E537EFF52FD06F8A8AE5D575E575D578226FD06F8888188AEFFFFFFFD04 %857F8585857F85857EFD06F8285B545B5A5B545B5B2FFD06F852FD09FFFD %04C4BDC4BDBD94BCB6B693BCB5BBBBC2BBC1C1C8C1C8C7CDC7CDA5CDA5AC %81825D5E333A1235123B133C143D365A5A7E5A7E54A827FD05F821835D57 %57575D5757572DFD05F82781888182A8FFFFFF5B857F855B857F855B855A %FD06F82F545A305A305A305B2FFD06F827FD09FFC49BC49BC49BBD9ABC94 %B693B593BB93BB99C199C19FC7C1C7C7CDC7CCA5CDA5A57B823334113412 %35133613361436305A537E537EA8FD06F8275E575E575D575E575D8352FD %04F85788818881ADFFFFFFA95B857F857F857F857F8553FD04F8525A5B54 %5A545B545A545B00FD06F8FD09FFFD04C4BDC49BBDBCBC93B693BB93BBBB %C199C1C1C7C1C8C7CDC7CDC7CDA5AC8182575E333412351235133C143636 %5A5A5A537E7E52FD06F82D5757575D5757575D57FFA87D262D578881825D %825DAEFFFFA97F5A855B855A855B855A855327277DFFA9305A305A305A30 %5A3028FD06F87DFD08FFCA9BC49BC49BBD94BC94B693B593BB93BB99C199 %C19FC79FC7C7CCA5CCFD04A5815D333A111212351335133614362F5A537E %537E52FD06F8335E575E575D575E5783FFFFFF88828882888188828882FF %FFFF7F8585857F8585857F8585857FAFFFFFFF5B545B545B5A5B545B2FFD %06F87DFD08FFFD04C4BDC4BDBDBCBC93B6B5BB93BCBBC1BBC2C1C8C1C8C7 %CDC7CDC7CDA5CD81825D5E343A123B133B133C1437365A5A7E547E7E27FD %06F8FD04575D5757575DA7FFFFAD5D825D8881825D888182A8FFFF855B85 %7F855B857F855B857F857FFFFFFF5A5A305A305A305A3054FD06F852FD08 %FFCA9BC49BC49BBD94BD94B693B593BB93BB99C199C1C1C79FC7C7CCA5CD %A5A5A5A6815D333A113412351335133C14362F5A537E537E27FD05F82657 %5E575D575E575D57FFFFFF8288828881888288818881ADFFFFA9857F857F %857F857F857F857F85A9FFFFA9305B545A545B545B3000FD05F852FD08FF %FD04C49BC4BDBD94BCB5B593BBB5BB99C1BBC1C1C8C1C7C7CDC7CDA5CDA5 %AC81825D5E333A1234123B133C143D365A547E5A7E53FD06F8045D575D57 %57575D5757A8FFAE825D8281825D8281825D8281FFFFFF5B855A855B855A %855B855A855BA9FFFF8454305A305A305A305AFD06F827FD08FFC49BC49B %C49BBD94BC93B693B593BB93BB99C199C19FC79FC7A5CCA5C7A5C7A58157 %5E3334113412131236133614362F5A537E537EFD06F82D575E575D575E57 %5D82FFFFFF818882888188828881888188FFFFFF857F8585857F8585857F %FD0485FFFFFF545B5A5B545B5A5B5427FD05F827FD08FFFD04C4BDC4BDBD %94BCB6B693BCB5BBBBC2BBC1C1C8C1C8C7CDC7CDA5CDA5AC81825D5E333A %1235123B133C143D365A5A7E5A7E54FD06F8265D575D5757575D57825252 %5181818281825D8881825D81A7FFFFFF857F5B857F855B857F855B857F7E %52527D5A305A305A305A545AFD06F827FD08FFC49BC49BC49BBD9ABC94B6 %93B593BB93BB99C199C19FC7C1C7C7CDC7CCA5CDA5A57B82333411341235 %133613361436305A537E537EFD06F82D5D5D575E575D5757FD05F8828188 %82888188828882FD05FF7F857F857F857F857F85857EFD04F8055A545B54 %5A545B5A27FD05F827FD08FFFD04C4BDC49BBDBCBC93B693BB93BBBBC199 %C1C1C7C1C8C7CDC7CDC7CDA5AC8182575E333412351235133C1436365A5A %5A537E7EFD06F8045D5757575D575D04FD05F82C885D8281825D825DAEFF %CFA7FFA9855B855A855B855A857F8505FD05F8285B305A305A305AFD07F8 %FD08FFCA9BC49BC49BBD94BC94B693B593BB93BB99C199C19FC79FC7C7CC %A5CCFD04A5815D333A111212351335133614362F5A537E537EFD06F82D5D %5E575E575E5727FD05F8278188828881888188FFFFC8ADFFFFA9857F8585 %857F8585857F27FD05F8285A5B5A5B545B5427FD05F852FD08FFFD04C4BD %C4BDBDBCBC93B6B5BB93BCBBC1BBC2C1C8C1C8C7CDC7CDC7CDA5CD81825D %5E343A123B133B133C1437365A5A7E547E7EFD07F85D5757575D575D04FD %05F82688818881825D82A7FFCAC15EFFFFFF5B855B857F855B857F8500FD %05F8285B305A305A305AFD06F827FD08FFCA9BC49BC49BBD94BD94B693B5 %93BB93BB99C199C1C1C79FC7C7CCA5CDA5A5A5A6815D333A113412351335 %133C14362F5A537E537E27FD05F826575E575D575E5D57FD05F882828881 %88828882FFFFC3C182A8FFFFA97F857F857F857F858559FD05F85A5A5A54 %5B545B2FFD06F852FD08FFFD04C49BC4BDBD94BCB5B593BBB5BB99C1BBC1 %C1C8C1C7C7CDC7CDA5CDA5AC81825D5E333A1234123B133C143D365A547E %5A7E5327FD06F857575D5757575D5733262727835D8281825D825DAEFFFF %93C75784FFFFA8855B855A855B855A85857D2627002F305A305A305A542F %FD06F852FD08FFC49BC49BC49BBD94BC93B693B593BB93BB99C199C19FC7 %9FC7A5CCA5C7A5C7A581575E3334113412131236133614362F5A537E537E %7DFD06F82D82575D575E575D5783FFFFFF888188818881ADFFFFC3BBC7AC %35FFFFFF85857F8585857F857FAFFFFFA95B5A5B5A5B545B5A5B28FD06F8 %A8FD08FFFD04C4BDC4BDBD94BCB6B693BCB5BBBBC2BBC1C1C8C1C8C7CDC7 %CDA5CDA5AC81825D5E333A1235123B133C143D365A5A7E5A7E5452FD06F8 %2D575D5757575D575733FFFFFFA78181825D82A8FFFFBC99C78134A8FFFF %AF5B855B857F855B85FFFFFF85305A305A305A305A3027FD06F8A8FD08FF %C49BC49BC49BBD9ABC94B693B593BB93BB99C199C19FC7C1C7C7CDC7CCA5 %CDA5A57B82333411341235133613361436305A537E537EA8FD06F8045D57 %5E575D575E575D82FFFFFF8288828882FFFFFF93C1C7CD3384FFFFFF857F %857F857F85A9FFFFFF305B545A545B545A307EFD06F827FD09FFFD04C4BD %C49BBDBCBC93B693BB93BBBBC199C1C1C7C1C8C7CDC7CDC7CDA5AC818257 %5E333412351235133C1436365A5A5A537E7EFF27FD06F8335D575D575757 %5D5757A8FFFFCF5D825DADFFFFA1B599C7A55712FFFFFFA8855B855A857F %FFFFFF5A54305A305A305A307F7DFD06F852FD09FFCA9BC49BC49BBD94BC %94B693B593BB93BB99C199C19FC79FC7C7CCA5CCFD04A5815D333A111212 %351335133614362F5A537E537EFF52FD06F82D5D5E575D575E575E5782FD %04FF8188FFFFFFC393C2C7CD571385FFFFFFA9857F8585FFFFFFA95A545B %5A5B545B3085FF52FD06F87DFD09FFFD04C4BDC4BDBDBCBC93B6B5BB93BC %BBC1BBC2C1C8C1C8C7CDC7CDC7CDA5CD81825D5E343A123B133B133C1437 %365A5A7E547E7EFF7DFD07F85D575D5757575D57573283FFFFFFCF82FFFF %FF93BB9FC7A581113CFD04FF85857FFFFFFFA85A305A305A305454A9FFA8 %FD07F8FD0AFFCA9BC49BC49BBD94BD94B693B593BB93BB99C199C1C1C79F %C7C7CCA5CDA5A5A5A6815D333A113412351335133C14362F5A537E537EFF %FF27FD06F82D5E575E575D575E575D33ADFD06FFCBBCBBC1C7CD81341385 %FD09FF85545B5A8584A9A9FFFFFF52FD06F852FD0AFFFD04C49BC4BDBD94 %BCB5B593BBB5BB99C1BBC1C1C8C1C7C7CDC7CDA5CDA5AC81825D5E333A12 %34123B133C143D365A547E5A7E53FFFF52FD06F826575D575D5757575D57 %573282FD06FF93BB9EC7A58133130D84FD08FFAFFFA8FD07FFA8FD07F87D %FD0AFFC49BC49BC49BBD94BC93B693B593BB93BB99C199C19FC79FC7A5CC %A5C7A5C7A581575E3334113412131236133614362F5A537E537EFFFFA8FD %07F8515D5E575D575E575D575E5782A8FD05FFC9C9C8CD815E358584FD12 %FF52FD06F827FD0BFFFD04C4BDC4BDBD94BCB6B693BCB5BBBBC2BBC1C1C8 %C1C8C7CDC7CDA5CDA5AC81825D5E333A1235123B133C143D365A5A7E5A7E %54FFFFFF52FD07F857575D5757575D5757575D3357A1FD07FFCFFD16FF7D %FD07F87DFD0BFFC49BC49BC49BBD9ABC94B693B593BB93BB99C199C19FC7 %C1C7C7CDC7CCA5CDA5A57B82333411341235133613361436305A537E537E %FFFFFFA8FD07F8045D575E575D575E575D575D57769AC3CAFD0BFFA88357 %A783FD09FFAEA8FD07F827FD0CFFFD04C4BDC49BBDBCBC93B693BB93BBBB %C199C1C1C7C1C8C7CDC7CDC7CDA5AC8182575E333412351235133C143636 %5A5A5A537E7EFD04FF52FD07F8265D575D5757575D5757337C70948CB599 %C9A7CFCFFFA8845F602F2E2D5D3257575D575E5782575D575DFD08F87DFD %0CFFCA9BC49BC49BBD94BC94B693B593BB93BB99C199C19FC79FC7C7CCA5 %CCFD04A5815D333A111212351335133614362F5A537E537EFD05FFFD08F8 %2D82575D575E575D5782769A93B6B5BBC1C7C7CDA582111213362F525782 %575D575E575D575D575D26FD07F852FD0DFFFD04C4BDC4BDBDBCBC93B6B5 %BB93BCBBC1BBC2C1C8C1C8C7CDC7CDC7CDA5CD81825D5E343A123B133B13 %3C1437365A5A7E547E7EFD05FF7DFD08F82C5D5757575D575D519A6F9393 %BB99C19FCCA5A5573A123514352E58575D5757575D5757575D26FD08F8FD %0EFFCA9BC49BC49BBD94BC94B693B593BB93BB99C199C1C1C79FC7C7CCA5 %CCFD04A5815D333A111212351313133614362F5A537E537EFD06FF52FD08 %F82C82575D575D5776709A93B599C1C1C7C7CDA5823334133C132F2E5D57 %5E575D575E5D5D26FD08F8A8FD0EFFFD04C49BC4BDBD9ABDB6B693BCBBBC %99C2C1C2C1C8C1C8C7CDC7CDA5CDA5AC81825E5E333A3435123B353C363D %365A5A7E7E7E5AFD07FF27FD08F8045D5757337C709A93B593BB99C1C1C7 %A5A5815D113513360C2E2D5D575DFD045704FD08F852FD10FFCAFFFFFFCA %FFCBFFCAFFCAFFCAFFCAFFCAFFCFFFCAFFCFFFCAFFCFFFCAFFCFFFA8FFAE %FFA8FFAEFFA8FFAFFFA8FFAFFFA8FD0BFF27FD08F804575D82769A94BC93 %BBBBC2C1C8C7CDA5A6573A123C14362E52575E575E5D57FD09F852FD4DFF %A827FD09F82D519A709493B593BB99C1C7C7A5CD815E113413360D2F2E58 %575D5727FD09F827FD4FFFA827FD09F8204B9A94B693BBBBC1C1C8C7CDA5 %A65D3A123B14362F532E572C26FD09F827FD51FFA827FD0BF84B69B5BBC1 %C1C19FCCA5A581823312123C14360627FD0BF852FD54FF52FD0CF8206F99 %C1C1CDCCCDCCCD815E12350C2E05FD0CF87DFD56FF7DFD0FF82626515051 %2C2D0404FD0FF87DFD58FFA827FD23F827FD5CFF5227FD1FF8277DFD5FFF %7DFD1CF827A8FD63FF7D52FD17F8527DFD68FF7D52FD11F8527DFD6EFFA8 %A85252FD072752527DA8FD56FFFF %%EndData endstream endobj 174 0 obj <>stream %AI12_CompressedDataxu5g~pc%> L}ȶ1A}.QUmg_#vy.ݧl)7-O&$Z/oͫ߬_zWwo޾;?EoƯ|~uW+I_.ûg^ot_N|ӝoͿˏo~?~opmOC||uGx=~~~xo߽.l޻/{UUs78N0M]wnbm_uw_?Zl:jv+axշ{^54ʖU7?w'p+;?O|OO߿~߿/_W~?Gr_UwxxM;85#a d?H0ңvkzhs=oܮ?+ʗowPߍj~n}︡g] >^ͨ^WQ[#΁x3H~O 6pWÛwM߽7[?_noa2O^ ??|WxOi?.X_݇?ǛoJ)?VS^WE,kyGsVoyp,驽{_77pl77~p>?IuNn}fypx0?wa{go珟0S=0_wç}e-[aa/mܿy-~|>=ﻯ_ v/[ޙ^:;)N/\YXǻ[eYVv^kzY[֑lZgeiΧ ̃Ԁ? `iq y Y3Z`QXhp&ac !~{ k?` 4q0Ә#quSd0j;0qAHqiҁyព6 fj~3Li5a0Zt5j5m<쵌3 q``vc C+$6+F8 0; *P6K?S?a0 p^*t6Vf$F 0_t0k4=ܳvden'[a:8+``Ya fić&љ&ԑ&מ&ږ&ݚA6iWa6|8Lp6oL ktN03@j`B&vi ;g>p{7_/sgTvk`>3-TB%̧ѹdeTzcXIu9Ӳ5"k0,eg\b<ļ? u9_q`\T/IlE#gqŋȣ@Eyo{=x yX3x)N#]F;]`V= ~hk`u0 3jx^G碧`}Z``:aT7umH`[($ȧIs@ftJKvK s1jX[&4hPđ`'gg[:xW>;9#pr,,g5m|Y>aOZ4l~~N!]d]>I .kx s:c8>'WO.S5ڨc00lAQ Dorİx1MG`z;t m%)[Y1FklN~{Jl;ヿc3v2ԟޝ #ӣvr=4se=^&_2޶3'dL|ڿxe7Pv!F\Hr[ <+ :W 8Gq[3+1W/9$S: )1#w6ƿ1?] ]?=wC3- XVpgrX;v1ޢ` |&Ğ|p&M84?lЬ^uT")Y Z%4NBmkX:Kl"g1,X!r-~u#(Y'581Hr$9ZTIvVI̩'@8p.n_Q"l$G:IpvVI΄ n,huzcC4w`Xq,ld24hmeK|{`D Fc1u´&D9ZWj!p<Q&G#y5 y3gJԔ (1Rtb1 IMЗ~5gMd_T&?9 Xaׅ -ȟ+x3ntt͸ [up[zHdIq)ȓl1/i蘌V;GK%4Fiw;yHh*,4tKpO iLgѴ^Z&g)MWgK9+9kOYGt&WVzhj+X͙nN?J[ݚϹݿ|aW7d󣴟nn2 IĦSkbCXǧPwt^o/:5^qY+.∮ :Iv O'˜@_=nWrc;гcgЛ(/4\ Qo\ GlR% s;[29avgY\{98ϕ ۶ffSd0gvgF|\`;7;kߛp I\쭘ƫZt]Fr!7nKr]\+2YIauϛ3f~nӑ=V,`G\c+DǨ WX6a 8';uko-ͥQMd`]p8~Dk >"fNa[LpM0Sq+ zOE=!䩁q=ކ@ƶFH N#o`bACnȦ >?5@MA64*0=k殿h MewF4 Ѽ& XCR>- !7qANOx9F3gP2ϒ=s#gqWzƮ(afUU{<8|B xJUեa>sٺ;x`PhrtHG8C8jތ<# s_zPrɫz?vl yn#y5G x33c8)f|`Mw&4< \j#c 7 Dx$UGd}]Oɪ8:/"' ]3Э75=qN;s08a7{n7+nGҍ๦{q hTp'S-j ^VA, UWb0iPG2egҴSŗn̈NIykvQ Զ0U7xAHZ>fGgݱIװ@՛9-\_aӝ:U0a9_y\nk!Pv &7|&;p$.pej :sXۺiaaF>ݍZŋ{[K! - W0yHXMSrf>sBӇu\Ll;AwoǏw GhGvkϺsvF_@ !&j%%IٌvkAr1eo)zw(x;ImzڜLjMHLF\{o?%x-(DEY9r]fNv(9{pzҦtw td9!,=ɡJaQ1rIʑ7d]9h+kEW4^{h̓FC“c[Ls]Jڑ)*VЅtH=ÊB>M" u+L_a-C"yuu`w*7{M^n: +5l)71,w+L9)KN)rMsz\ij&-qJE8tV•".f)uiqIK Ϻi6RnW|4]Nsc.H72`ӂWRsI*Pu͋ .vTzD.{-5l5#\n,3$W(.P >$ymMhP[["1[>~$>#'AhWLֻDb='hW?Eb_`ÅJޝY+.Kr[*aSƂ 0i+Xr ?؃O1Ms kOƦ0*5n)/R% 7L"T 2&M4:N\UusE6#/RG[CqJaÔcj:t(fahLNÊ)S o`.g`ek/8y+8oYr u4ͱgKU$/ bIt &ZMD +M Gj jLʊB;lV^3jK]4y$N1M}n$h>Vz*gOԩ0R>lEGh]()%@U<iҫeKNTѵ$7U+A!Sg'.fH]-dw43g8`1Nwfg0r4p >̌Hs؎9fqP1@0 4ALRZjMu"'91mϬufцi(V֕:?0;S\bͮ]s%˹.ŶWB/IkIYV𐚂CTt|9eb\;)ev5x%n#:uޗl~RlcnEZ fqp/ƐEdV'N&n<gbG:;6T82\CDG7˱w83qdtR“S7TTxtNo`}71JhPtVܥ>:Lbsvq3/"5BH/\ HK5R?!kC=6 3\۷Q.KJ;]< -o7Rbi`P {cK9P7v0V  ["m\7z/bɴsWtvg8VN3ږHnEg$sE"! atUzళnGĹB&sKVa#=0OQ\͒6$@Ac `P_[==-%e%x.1|?niS ƜyN bF=as{exl>DQ!09 F\}55Uy<¹Ipn"$# eϥrDlWp;q#\ɩm-fp+w9ҟu9a҄4#и'mpFptGw<ݍ&%aVQ7iBO _5xWv-T5=w0*XVk|˻/$Wܦ`!KDrcj r%H"e .~b41AOrBo x~PGxB)iuς9Q|E`"͚rDk*Q6=57Bdasȡ C|Y<0-X y%D^z6AEp|tf?YrSkI-f)h̑+&tecv=rBzdJ]fȬ ;=>BRb%.|{:@ cf]N}c; s`pf5cPhi32w6ڴ9P;p^uRgqآD'v*Q:in&crr Ӟ)nMƦ9U>hfMШ:!Yí_PʹĖ!.\K δ\6D6%g'w:Y%v2;gZY9ǡcAkf"kr8#Gd 6ټI/sH 3:wк~#|-4=v݇1x/!p$1Ӡ=ŀ=) -j,vK`TCն,A ;^GmIQ$6x. FF7ۆ0ʧm/E] yK7 xM H5 bǷ- l'/[ -~ZbR#JD{fށr=0I:StSiK˫t&V(A]+ZFZ,+8NLi PbxPo0F)tPxkL6i#2(1B Fl@2BRR=hqo>1ZNv JjJSjSsfm`b2V0L&ThX&,}eޓ˔mVS:G:c7Qj2NG8:PRE=.ꎮۄP7U nǨk.ir~\U qYVyK]Γtb%7mRMuR?]IrDVmpR\qNKgt>#Twk޵] ԍ5w-|wtFV"y-l1 WZe &r2\#n՟σJJ/1m l>Ib:$MhP+jˤhlrf%YYvNa$M(#q>Y〰< ulެ2FN ^H}]MYpzj)_LԅbX/FÞz_ t3V0u&sJ&#PwX pbh8M=v[3DWWvSXT85O \2{a66"0M= '8Q|0'uRoYԟiɒ.oݿܿ}Oݛw•͎3_Hƅ&M=OE|ͅ)(mhb! +z/:Z%ld KPH>ub}A֨:`<ע&*0aeeՑ6$O%( o^dqo3V17J|f􏕦|)w\Y!Ϩ7t䕀'*#Csq~p&ҡ;T6dhnvI+J(m>kW l3UF2i%2T2/wVP!Ύ g\ g‚S(pM3'aaaf)*=GNCm)߇/I5`rCJ#x~qsD[sM9ea?sDU6{\zǵu܅| KնolL)7H7t ]DGVR"ͪ ?z4aM%hE++ȗɳi h1YW@im=%3W>D\CX';Os}fؗR|,۽RKKWAe/5TLPٮN @br[ Q8Y%q8D~ªQ<rSKld+ukI^fph9'C'e*nZwAK9ͱLS[I(؊Vc=̭չcޔhc6PY~O}i8Q _.b WiHgc@CDƋr@EBLR4錜L#XZ2ݲʜsIJM4r+lȖlujY*B,SMJ<*'8Dyvxa Ep;S/FJ-Y6& ;ZINùPz5N.8S"lQ  Z%[DLf$Pl[C}+)xkO.QR]22FJ <.Y$cՀqГρ2fzZhk\jKy=U](p#Fن<}QIWB5zY:J-eњKTT.n~ T{]E=sO!0YR1nWV'9\g}ާv[xnۖ]-Om&&sȳN$[b+ʴlBc 5ccBrlhy] 5 =i'С:!m6oΐ]v;CS|͊ :%v~8+Oe3,8Q|dx11⟘ℳ.LYMҤDĵ%*rU5TP@-y$Kk2+vl<*<QzxJFB8ZyU!p}p mv [[/݁a]u ^#' s\dqG/ NQt'\@by-99~$q-ڎ)5^1cec"~o.:\6s<1O=R_3N椩v!кΆKh8Alvf =0M+p(`- r 4rаtqm Cb-mhٔMLׄ {Z[eZmK6#h+F"71rw^͓ğf2']NRDəe@-]brxd |RdL9a%ZmVZk.j<Ū3P,d8Eb3)IqV󒝙DR'ŊՔtlD3puY=z ) ;uFb>icR}6JB$fj" 8qJ%ۤ2+\݄?BY$+=iϓ\naWZ p^ z\\Sumыgm=sG%Uwe K@Pw37*p()(=1yJ2r 4r8CR'K,. 3*'g\RTK)w -RA2-Olyutreͼ9pϮ1yT#kZVd$^$? XPe78(@aOP %%  RP7Lx xܵ\)5?TsװCȀ~ȑĖ"],D.BuY:-l!6k(tqbEp<$ŃQ0$-=E|DķgQ clW4D!;y+C5L˄']Q ̂rY:3}VsJ1p&- YI@=)x~LCz7,}z|3晣=e~uşX0P'et[B Yܙ?Kf4D(Gw$؂_ 2odK62\sN8p#? 3F*oa`S|Z*)CQ#&1)dnń17ZF.xi+( FMcKjiJ0Kt ۿ_-yJsNQiR=@SX/'tPNj3u" pɬ&DS4 SR='t'ONXJj#wa7?5%uqGBRMjAd ")HNIBv,$<ܺiUvjVx_[WT8`q+8&(=dljSk @/u%ڈ w܏ Vkv Fv|G4z0Np,5UK:+FHE~ÛÝ〮 za'"/R6ޅCmƑ8yW*I-D2pyZq<| e&LkHqo|5 F?*z6Py G|I ܺT+O1ci}y -\¯iGrH=a4 Cp|VUIR$_d>P c kzpaN^7=MPH"!\+H;; 7AevwxŸ~dDftֻi+1D7AvTO}` qzW`޹š&R9CLnww(}ң4I&r@ zɃ ")h~ͻy?H@&*p[kLqCPD&4<%=F|.tIW'^n[9)w=^~oqN{f2n%S5UQ3(P6E5g#&3ehҢ1hBLT'&`3d[\kAC{( BK0%"v՝d)8GɢF8cBًYy 92^xsݜp7'5ݗ'\}1 oQ[b)!MZ.lRle'@Wp ̨B [{n&d&#` f5s[]BE 8 =kLe| RH41p-Va`qMaW3L}$ajYl[K;)*N”j5L&8?0l,1Ee?Gx\_v(S2l;xsb޴$ovSn2tH WH4q*vLu"vSs2W̕k6 3bW9b0,ihui2N'3I.IQz jS6!gsM),2E.@E`+^8xQkyB'ƌRc\.h *T=Ab[p3O](\3“zgm@IZj IR dکQc(M‚)si֒Vl DgsBI I.ԒPKu>{|Ƙ]uEA>AH~WכkL?N6d6J2n{{>&XXB*vй*PY^ (=MN0חEH M@ө,Д3LG'?o4vNysϟqByp>s: .сǵ\౯bCpP7I 9avlXq?> a/D\~s!hFB4rkpp,xcU*w|/Wl#èeGq7 .ڵ v=a|W77^5\zǤl\5`j"#-VwD'F"o-fU-kc0k?Cw?~4*$t#,3;L`QRӎsI,-T!G&rV*"}wʥ9S)qN׷TG4RN(E-.ir`լ%Y$*(:-\:'kXV$dڜɯ%R--@cȜb6{@,Vr[%0ςXIqKHg˼V)'a˓DlY8"iI[Hم"Ð5C\G[k}&Z.=Kho/>HAu{p׭Nޭ.iE1Mc8ǝw=]W:h@u2Ny갬E8TC3I&yIR|uea9 7r N腄z&h>I NV rĶ)B{;$5w;6Fc.5h@dž:!ql\/RL-{JkPI_҃l̯؃3خU1w94ə&X+yBVp羙ѷ}U} ?!%p;nbIž{ @!E[ 0@"l&{SH AY |vc |##ơ찂um0晔5W b}??ܿ~_'~}lt} Dnx-uM´gs0#xD@=9<}O䘮9ʘn^3i b܁ݕ3،)jr@GizMI$%'nGiJꦐݣ$h.-&P bZץEl[ƶa/GzU8h= 8(`,adCs,o]Y)x#R=? ,BRAO{lTՙnF9N&ځkŦXOj {o*u8zWSM.o8ۅ=v'ىw>8 OnW.P$عkް9ޕ"jܠ/oIj"iZMG`ou;y%UZS9Te@jކP`hDrj :ږcQ2FsAL. ^1]ʲSs N SH /L)k =ga= }sJO*?R*4"pQ}2YjM4cHȔߤN·./T4.*6Fg+'Z~ 85h.NٴN.@&$S |Vv ϖ71vIF6'2l0pXTSQv%]&`뜴L*vp :35ѣf%w6ɑv#5}[5kbp,A_&(}VMfV&_\Rw^0,"37DZGJXP* jr6K&lNb8J0Pq󫒯Y5%] p=,rToL/{nҋnqjPphQ>D]u{E!r'w(ػ'^Ͳ<'읣Vݲ-Vlp;0 vΦX攺kh0ƴڧX])UPgeuV<qfj`t9`I()GRIB&`UQ.7R0uUk8J'g[{GrX[ݼ] >gCy[g$֑]r˻+RoaEIgJHHU$5PuEg90YraGac=Tux*d .\p60da ERRXJ56@ ~g]fmn.8lMĖk(Fmr-.>j`ֻ|.43kKZD6p 6dBAaʅ{Mً64]X'tkPe|][uwt:|au&^0;Iw@|s -Ʀa[hZ괳Z;Kj H {|3pe%C8C{9on2%.{n׃乻??Ƞ[l 龜jiSk27fVf3IOm1fC6+rhx#N*V4tSJ9g!)3q+$,"ptP'9\M 6bAFLp3 3mibU6u0͇2pR~;l*.1 O%)oi׵Qnm vQ6 ㆀp.IsPop]Ls.1MLNmں6Me $ Viav&ﳯ;Li.0obH(H gR.h,ioJxLUR9}nT B`VVG%lmY\Y jԁeI߽^r .7χ%sa(z.t.ozkTi2:sk-f*aL^͙?R/5>.Jx6(wS`}C^upyâ5wn~t7E}k{_L70P]V]EXc:c`)!LBt`GRypc9UCtGegGpci&5Q] /om+4uS*>:C=ꡧsD65x.CUm;o?0;s46g\j[ֽ2?Kop0|VzCB18#AU?ӑRJ?>\+H=}PÑzv#’z D-jMK$i*j (VU5OD{0>/\"o)iT/5dL2w:& +j.9 "{ *(bVf}"CNeGb:z#b[V\]@)rs\S,Iʚ֭NuI?qo˴vwS1wPIu#EiZv&Jvl c\mZ o(b"MV1!L2̌jab¶k 4q-oOi!Jri!. WkϨ}Gg #~HQEEc>-ŒM@2<KjdPBoYxaNdrkqkf1eܼtj% ?.Zٲ>kq-$]Y ~pRLi͔$˺{Ik _фgυ0&bbrOk{i-V{=ŊA!l!P4J)TDxanȯd8j$ZdK3ޥƆR#CpbOrB&,B,К -d.cҧ:>ij:XG 6 GsP+.? k2/a;rDs|h7JE+_ {*Œ4"z-19 ̷7& E(#GLEIuE6yIkWMys9 Ԩ~Bn\t2'L^J-=춇wTWm¯J[TrT^MP5\un`#^wBb.rJ́TCm~_T='p’RG"pLxcU϶ŇT7?~||O&{=]_Icx"ua_R5w|}E9 ]_QkXEj c_؂K6Ӥbfڌd6.y{m.Uʆ̕;iH/'PGqZN]\iCL?OlY-zk^<5U Wք+1K7lm*໗ {k ҽ;u{Ml~N,< YwDpX+opO w) mSQwm7*j+t(YTk\g`z-3Y˕TRSV ޢD<fH2$45E.H&I)LI5B,Տ#uj*hJj)<ՅU-To3z)a~lv;zҾ'TX͖81?ht=Q<JҰdQӶ3]4eT)or?Cx#SL9a^, I` u`3d@pU"vPZmșDR^EF䲷[ZN>#'*Τ%x HyX $-sX]^Ml 71=!F/fn=iyz%.N@9D+);p-(J+6i&sv7-DlVhb}F3Ymar 9C{gI."ygp4x27gv( AglK~0Ҙ7̜Mdc:B\s*Ahި0OλߒcזPW\CoTr)-x MPR&b"o 3ysH~'+Ha~Rz] ,Q]Pyn3J\;jJ%K8.ԏ- $/nZ Լ|_!YjV9rKX&zmob85H -VaZ^lFm |k9PT/P_؛p-dG2{݋׆o(gQmZEs5nŌfʸq͗=% k>cKb50VklS7ii$L8d4'8 TH8Jp}G4| CEW&.Lm5aq4|glDYp't_TAŎ@+ C 1<d[0ht F\ jћjEPSlph O0 yܲ4Bq( ?NXrW޲ѝe&:ܩ>Kqa8C\JyOuXkuq|eRHda8zLnu L19w~KТ6LVl@::JOxVstt Ϟ)Y5gX2 F"Rcf!&b V#v2+4Dق"/h~"Gf$iMbMrY °; 5 s3qIJ(G>^*tnB`I),;mQĬ[C̯PY:i Y+oXF/):1Zȕ˜ųP`U IXYu=U.w1eЖEإ9t\ 6܂bI{Z`{vBQg4vUGM1pMy_sS'$ C3=$kq}H&7m[k#?WAgDY!ϜtGYDYYD18*%4WPгVd\x?GBR d*ۦMȳ$u SʘbU&'!fI[.g; fU)l;>Pb-yRÎqls8%G9RfjW"i|Y# -L:ޓ*H*n-궑*BmJ{]BHjJF\P'^= ;WQ= eX1'V7z s|P[RV%mѮWY-է0qυV,łSdVsRUÀzK,H9X+_g~.ڂ'd^UN0ͻn;kH=A5 ֝˔C2:m/K86& +1;`g ˠ"նދ -弘9`tv~6<4)Msbd]3(xwIfՉ$-¬kʄgHybDZSPJݔu>oL HSE0H&"ΨǏgI`kx:L8'b> s &TQ\8e"jYфiR;]!rE㎮~k&!O7˔n)]IiD-HqYhK+ՂG";tOa;^C4S Fdec7t{*b%֞=X= t{Ϫ#`)L<NL9@D^0`$,Wxg+PKv^Z8bGl㈍ ݡ]CUo? S*R+AR"[G ˸!?US%~ҩ=]'Ͱ[[gw)~fUFArr1%7$wR|eԼL/˨vI]Х JQ2UL5..[qK'V-mK\a)&6Q aqdNqq2%P((D&`E6o-]rD Ȭ@$)cLǗ&:}KW*$#Op}$oMΰ$}4cE5۹g[iz]rrVE$,0\mc[XTDV.4LFg2']P(O<D {#Z kU$r&^Bb)%J0\:6~i"I_%;uaLCoyO924%YdSBE<:qh,ġՁ7pD~,e-){uUU'tm4]>EFԥhӁhҕ}$ s`@=Ufq-2X8X\%4HSrJ:Q$&Is2YV2x5rY \\E4R\.jjj ڇzj_ÕDKXI{ .h'KZʀ(甎],kqx]*% +VG!GέqmyوD z""D}bwI'{J/r@o)`1>TJFq7JKю:gPݺ\ED.T$bnNv2:WxVʣ8MEX$_֋+4ux) κsq 5iV5CGiTO6`c,Wu69-% Ks\'164 GLö7!vȘۡ"9rwtԌUK+$#|?dg;B6i o70o2[ZUcO]ߴH#8`Dh>}UIoZ T{TvT{ǻXq@̴j8"@n=TpaF{U?bPƱڬEOr5.k(|;2 &L_]M2 3l 'D~KiFW5u`"e< ~^=u^#d_4gR ^2Ʋc:N٥}$v}!s%.JGE"h$ αYv2EΦeBֺGYLCG戎>.W7'UDZ}UB4dQV&hJT#VPi=91@ɬ+ Cʅ^JPMi&>Di/,ެSG]vL~@V#CapBc*!yK.%u[ODŽOnaN"y?^{|W,b.ޥDi"&xQeJ ߎ{ٌ#s~c NnhRkc uS1$^,ɟ9$[S9(ָkVJCLreR[N+M/cly{u•`eᦍ3|"+' ȟU&X{We8.hqYO=qNI?Cn>տhIm3torӇߝ4 +4#{y>PhH˳@kJdb4ܜmdyV6Tq4L!r@4E&K3ggD .u Q%X$i;scv!=g#gp4 Y;䯶a2Ov%u(`_c s`fo'޺2-$y̽ANNv?Hy1N,gsLBFvYixS3ùIv6r2: 0醾4"BK6VԻX<`~%rY ٦7~½_ =lk>|4o$^S} L `ǡ; ߋ gI|uw߾?ƿ/܅ijI_nTLN+xz/Y-5/G8ԳHa^"5'd»VB-iYLjnOH$;K&A61K7iK#m/ܥ@@trNM8sG)Cb/ʝigNA0?N+`9OQ ni3yV!`# yP:d Mtͱm`n?r ;R)`ch>gNKLܬկc 򓏼wK+uk5?} xs\~`>BwU.+CT3_3z۩dDf}OĖ%[]K<{)D:D0P*'s6c cQ2-4*5ōbWJ<`ϟ%h lT 7m)>%Yy,&\[L'T1=nJFk}D>"gf]&_F?  {Cq'Y`QlIKH͢a-=*EwK0R)R`HZIXӄ4bE,æMWbxJXBKDBS@bG,e@B}d[q]" ~GZa^ .gc!E|<L.CuгfL%=?j4a*F֓"Y=ję<6MĂ;&}FyLeCD 2mX:/`"0X Q!lS`-DdZ~vHhŕ~۵ ^YiK<,nŸvpvuCwvKW\ً=P^KF/Lk /%lw:Q+}@ʨʤEm[Ek1v*ؕ(>i9 !31Xa%eJyܝ\~*m>?sP?6B*׾-.y*#%sK48R"oQ(Ui~tD"gŠsY_BoWd|j'Sf} 'g3e|mK{Lg ,chXS-=k^`:oxo!5̟f1R'< é!D[ 6h 5 xD6lNfd22ڽ9- 'OZ ҖwQna\X=xqBʚTŐ1Mfc )Id#*;|H3Sp.? =U,vtHnRQ,.skZ諴U=,5÷RHJa5/96 .eKyuee] 3RE+-KEqrъx*"$^KI,1WRKvZUceB9pA,>6iE8((̭QSt|# D} 7ú* W܌y2ϴ'q%RzRQn nsU8QYy/|q! (,J%ًx(I%9(+(cdz% D޸$J4{NTL){|/AvJO<ծmp}ȳ.PyQ@bo 7.őTrG< E7 ٓޕ<_vYaz-٘<lkJH0~T> 00" =Pu5Y>wp#X3(!Yc;0J|NqmB\GkRиxMnޑr*o9l.pqA6+JIKK \Do =vH'&|TNة&:fu5%G8ژl;,wW(a]@VN`Z5#QGѹUpO ioCg*[ͦ34-#&G @iԚ2sʌ4h{ZjNjnp_}YM o]3`ŨR]#^fB5Oq:#i߲?э CF#Go_wJ^x G!dK7X*< no~8ʆQ9(F爣l#a{DUh/rAr>d dQ39Ei,hbf,PjX."`\('ܖ6uN}ѪlAr.̸WSnnbKj."|ԓGc񑨸(II2"D6p@s krM ܛ|\ǙbeX[)Z"ј>'Kt[+4?_-kh%HaeګȬ#82RxJ"'Gr"q$H"G!O7*(D̴H_Gj8}\ӹAd!'|M F [XQ@t9uՍ.iaǛje/âPZj_7)5jBC %q#pL}mKMl1|HFx=Њr!+lS+ |vX ŢRE!x^Q6*Fruo!HhD, =/=T!`Mq Dr!a( ɢ+IBvp3VrPzB L$v"EF Fj+tgXX CRFK=HgxãU}`>4T#˼wYv֥*%F Dw DI$ GiQߐMi^fvnɤ^Mi7ksI7EKd|%S{Oڗ_ݍWw=ooj Il|TdΠH-"pqIXx$h :Zj*=, <ɣj<5j=.F"Jr&\}G#gnKlZK(95:BxHT7 `)$I͚2n(1˪ì)H>aH{' %k⽛v,]_"茎/sTd|o/ʒe=965_L좗eA$ ]<)T >N/i/*=%ו/l{ˌ@G$A!u vb TIj9GD.d&*fE̮su`KJ-:+Jg٤46(IoiZζ%#HMك$=3̜G'qS-L1 L5cn.>1=71Nq%ľ^`.;Om%-*$ ⡸9b|՚h%Bح1xgFu73DqJ'KoるVDi \ A#&)+"#'iʿnewY@i%^>Vi;w uiVxYi:^p㵖M_3dIԠc P:bKJT* t !ӈw>3M`ӴWp PMJU䵕˖nM0Fn}}?kڍ8p<M>hԴp83Q]eUǪ |ʇ'Q`{7$dD)sTd팒`*ܝ,.cИ)f DlUVf>d`GK7s>=_fe̠rʉQID\Ym@5W{›+uq7d )#?G|I)TcFh왃5 >ҍhU%ɐ mX *yCQQ:_S][&rQBє\\$g'3K!43Iu)wћټMaS}={_OxP/ZR*<̜[s7 J9ߦƅXyZ[bb!5WSF\c{V\u8<щ/5qd,m/o;c_=.- ܂5Ky|4zόO^AB,'a.Oh^R)=v%DOgi-|0=m 3hMկ`&׌ rО&S&h>2>DIX5 ӹeIf[! -|aAO#=KA &#>&ī$RVSM0AwivgӴ,miz6%1Ӵ,mKvK|>M[1n'ZJVrfFM&ԿƏ8è:xz؏8T״: Tlj\tY'{nﶶSD\4՝3/52e.w=N9Vvtr]&C%{69/|ǜk,7 W\GNݒNMݹQH{%흒gB 6`KXX]x'Gcwnxe1Gճ=L/{; ߄yq۝ú{î\vⷴ疞;+= %g&`694nWȮ(}/Dg.۹I$Z]M$,NκWer6-١fo5^W ]*Ѐ6[bՔaw$cA>j@|ҏo\rU@4,%ѭM(/], c-i܂ rm&V"8!L8+$q6!m9j.ʉpb*yGO$%UUBYf)٫܏rSn%>1#Ow S]dt7:O L짩Sj)gb}LKn>tR3?JAb )U*c)6մJXX>W~ZdL|'\kRڥM"y2guV᭫p6%cè0*}MJ'I/5D!T~ڗ,t|K&d@#^|dqb$G|9Nd/ljG81R|J"WF\ r+A0&{L[V#S\3sŽ/GIࢄL_kbl3Jq%(F8ra2D!Kv\b}#[6(T$^CȆ\Al.T \!Qh!1*fSe̪X+1b@/XDZ,fٰV2 keªDX[Y#3>%lCl9"jl(6D$qͺDO'DH4ٞ6*}bj,sEGa2.CS ^TP G(>Ec~2[!jqP7>5SI{TjPRpoe3Rt=\|rosiьՃM dxc;u|H@9xNHB9h>Jؒ{0KtY(5w76)|LKHȢWv` vxSںR[L_PUy:Sk-F}Iom &$ȜNy5C|rVܷBV+Oxොr=˄g2 @UՅe>grlvpnʦ9=HG6 %,˥ w$DTǶ!NF^ySٖcֻbqE[+yO⒦ۅdYNlXt39J[Or>-&$j \2?~۟׿o~;\+gqg˺.%'X K`O@g "S/pP]Y:ǟt-,xo&oAŃu.ƻxPwQF/ [˾.a;.f5ٷ[1x7_ 䇰r]0={K+k஖=ΦQ]s޴6ѳAm= 6Ll* ̝ ' c~O[g3WBD^l#O6{'ЋT{$ZE%-0n͢TnY,`T[=cL3[{wt;L-)r z=((Vf1RkAV XF>nʑS ͝'MRļlRxE|\[\>Y!O$ܚeS٦^c>zLUonO63/)C]]t=e=9= d›O 3r V g s{LIM/ w w82)&V9ws/JrS%FwGvEH6?˾Z-.(i["w:3R_.{pǺY|&,1̒}qOwpX_5iҰIYZCWD-z{Ӆ`<<~=4nuD~5if\a ; vQ,Es,)o/Ř:;ZI_}Ic$W0{:Ix^mV߳x%uxJ(gYe,;Ytp&\0Mrp۱[:E$5霓M;0 }ظʧ@k Uh_X>wFHbazc_inSƥ{K#tKM:~5Jw {rg.޷Lt˙B_ GrxRY6w݋dkBIh :p쁌S&u PMCK3qrRꉶ$5)t#NuXO7JaufX,FyI.D)VŽ=?e%3xrkJG!R}.&Sob}஑\zs-:-tsn_zGͣɮр}^+$w{9NQ~?'LO|)e@Q}c_t4#qݕ_HOR3 wDgL3_|l wmm)k>=:U:Kbet_qZ["UkMJ[evKS= 1A:.xVeo:tԎ>ݳ앙N(i-#I>T~ [HSq[m~HȘziO@??%ó 7'If*ىkbxʩ/YMB[!5uu5gJbuJ(gc9]0}=hR\M9y*3'+)5=1Ys^|݈k# ω<]זq)\i?$QS@X!6Wlj \9dTꁰU,W uG8v`O_c:\] 8Z`,0'mAZtg٘9`28 ⯻ke"/T%:?JX켔,n9S?rߐr؎=Vpj^L4EśH0#C0ʦA;o6kB|к:OF-*;@r{!.;l7%\]? :p6 ɑGs~;6rwyӾt ~}7ntPLbxxO{׎7]μxA:@=' ?i>tu'ܻ~x5]IIseK+?|z+,Sc[a[s{aqYs% Ud@CW{yQgc>c@zS8fs*$r5l/Rv[s7ۖo ]I6yЂG=Z:g6p09y?J# J1fa^'.qIUϴȟ"Dek]RD`zMJfm3}Y걓]ZÌ]g,~o:ٱ܋?՜d^%E&Ak HNEh-HkGEA KC7üco? Oxa | |W$VfX.-dHn fgL8Z-"#`ĭa|4|d Vͅ\2dr aMf#A t橢 ZqЏ ]z[sY _ahm- [YZvlo{p~ Ar"oꋋ?~wsGc$>Xj]a󩶱UDiEto{o{o{o{o{o{o{o{o{o{o{o{o{o۽۽N풻3 bl7ص=u2sQ/׋WPKej八⻶]||3uhBrʁP:3ԋ+o L eBzpu'QA@ߥY?/'ɏo\=R\xLݜYzYr{l+ k~j%1f¥tZIy8pΆ'A'G%JQܔ v6fג9"I즮pp׷Mi+$6GeeağWyM!GyqTKHn=]hgOt(Ѱ#ײnzeU5G<)ڃ>?'Մ(GG80gUS+^l&wFȦ-d*YBS#r2R{$8/[QtF{;ղ^>җ3DD?#~v|_s>ҷYn%m˾"wNL\4:8>%°%PmrQvo>zyLB=N8?%/hrq8d9?ejzɐ'G}i#$$n+LXZڤR1~S`7V/Eȇ4R\, UI&p׉qw"w,QH [U6jr+F=$ʍ+ržYEf MmJ[o9 "2e5UVK=g 6m֐ol&*'·Q,RNSJ2'M}`ɧ*HxkMVk&M%yQ$%~ev4U&id 'cJ_2nñvG "SqJDSUĉ7%J7TDn6RmM7Mko0E;9 XCG?1-Erq;Dؼ#wݱV]ϱ{0͙w>_C{2:qmM/v7's낟UK@ԏ.uMqː2k9ӤopߪH*MF/-f{4=L2SsҊ*5 v 4̀|+#0 <0(Hè}7g4%Y2|$m]:%bcH aD>f͊YJƧ5,48)W$II*g$򔝖 v[dG3ɕ7dƖrVs&HzFV"H* BS ,4״dHqHOlLIsXWu\"G}k/c'_ʂߒ| Yp䙊U^S2+WDw$YypY0Ui}6t9rI O=b®a2,]X-JnyU\M?Xɭdm0tX_8b߿19aMy:qI dOפ|^QWij~oF^ˢ,#zǷ~ e6I)$I=V@e{cž{I]UG@wtwb Du=B5;û͚=B@w6(:,miVk.޺i8:IB~>02pS|K\.=WRzlWD%9Jmiu?PE?2j>R5@) 3(YXEAK|̷{FXkWsmd̓d,咊giꡳ:*gj7sS̽uu8pnjϝ́y1 /~~?>nٔ|d0uC+ Bkճ9A&R[-qg^2`OȜWf;q-!s=b79娥ױ:_ NCatK~յ\]௝]_REI/1eqK*~ѿY!H"_tE~U"N 1ߌ;o~C71&FscɃjݎ_bP4sMݐId7r?AqAOqZNщAm3#&aI5dP9I5Ԕ]g\H|MA W–\c) .0p˺>$1h؅D6.Cek;H:6mXָ[ڿ\0 cY~\:,Ba_Q]BmOt駪(\UQzOϢcw&4>ٿq#%dGF |oS7e6{_}[N|wͲ?6ȠRr3m420۴E=, 1aY[d~ע5~j{j f˶;ɜCeTĪ!"pCY sӷ.bǖ2ةBJ7ᴃ]s_7x~<{1 ]Z*< ',@®(eT*fK L G.`&v<"mMI;c_,[RmW|S"=:w)ǕzZ3XK$, <]>ao??Zܳ2S+e (ޚ,ZMsBk\;Vs]|hKMH7z-R,n^#Hov3(>&0n`.yw6=ǥ %@SNjC̺C98x"2$ p%ˍa&~_rFc{gdo~ؚؾځfތ1Sd}&X;fdt{qhfRL]faG|~Hqagc\ׯ ;e31fuvlG^ˡ\`b_ll! {~D&d A6IGjqu䛸Wŭp^zYqf:?.Z`6+#յ&?@꛿,oj+ESN#W16o(7لu*6ghUlEkf LwOwD{q bmyMs|G>}NXg@4!,/&ve˓D1wg|6En}&b0O!6KM>ѐߺD;CLhB6[Ss $hLfw~zԕܜ42_ȼ!ڰ<NT~}9*@#2GO\ dKJ窡<*bF秉XX:Ҡ?F܌PrrMFd]n~»4iq]˜GHR8Ո~ '{IJF8 @޼*km0u/Whh;SJ>wC_tyzm͝.~٫A7wy!y#-$3*W.4oJm-9Wsc`wb:6Y`n0OH 5SiV1g'?,6k% B,7Yɂ}+ؙ*C(rBbgM1>F}j 닿52z9ӟ K'\Vy !+в (!}CTsk)gД9f5ss35 GV$A{0-`i57F$!P`8[fgFItï)dhzIF?ZJRQ3ӧsoO}~Z`IiҜrcUGHi2fFWJس$ASt?K92LP *,wgME.˝,qOɽ'EGtϢ Y$鍔[[h[&Wi:1\$uts^hrSO"Sr[M[fGav?7p$ O=swZU(>اL,J㍆c3+۟yQG{Gw~'l5C 3NDAc)? 9*vhBm>lma^U;ʤo'iS2oOEVp"h&ZT:;S@}fA ? a>&Ox.xRRXDZNIP+cXcadܗu[Λve_:g 4حkES]f `=ۣr4_.aN͹\;㯛o>B%bߩt@,fTX~[R^#Kmk:r^RM-b1uB,f&Z=4OoӊA"Y;JT?TInKB{ͺ-R }\%1NNq.#U݇q]Z/{81si]LgU#3ubmw!F" .h +0M`6pw&Wu^1V_ß<\N5yԾЭޖtʤUu.3;4x^׸|}쪷iH[S5.{r'7ӬH6wWs=&a-&DjeXX|L49$>`kL66ϕnffcs5lFSӬt_>Gxcii N-Y*GUS35iUM{ÿMR㨻@fs^ss#7$]&LfrN:Ql0Udym2(j;sӌ8ze =_#l[/NF.^h.>O!Te9fzgWTJȝDoQI,[f~&W-ZG-ݵGxEO&/k@?2D;،?}L k^iD#JA/:=I!76T1f~xwD!$>؉cᎳ$Bܽ ]7o s킴ODcг}s?~D/1c#{Z#~hU)]\$%.ЀZi w̜Qf^0V;ojP0OXPkSC?(*Ebx3X oVkO;q(>nLmCf8V<[o, , Np`8߃MVɅV)'0U7,. [w-/asxT=B*Ǯoa{QZܝ 3kxj|#Ը08rp8,b[p5`JG.@L V/^^RҽXux|lV>L=W,eN,[CF$ˍ؍L{,iD.=#.^}zx $LƖdTS/9ǰa,c oFLؼ!,.\YdUy4p,TӰ($'P> fpby;evhi`,J< _wfo, LmIryO >p \xI?|''xtx.H<<ݳO} n  ~}%X:!@B#Y]2f;3(X-Efl_ٸ0KX;#ILohh ^~w/vQ8q/W!$n{ⱛ0L+ }F&#fͼmi&>9zw\;-.x^x_ WF"=ߊ|=?mOǟL_`.I109/7>G?/W5?{g_ẟx7(} ^-9o0g~8]Z?[FC=`l*x7, Vyˆ7Z; xmw6Ó}o _H+w%Rt<."`a!nt[N;/ x$<6m9v(9#7okf [ /+6~JGxͅ@7D:w<"I_=Pg\7"ХӍL/ܦ CfW!n *~p|$R<ʥ׆aDص3[JWV^ng%-:|l;O QLEai̮ \ʞ,O2p!k?OossVqzð 1 D#jwA\_La_OfgC8J&C9ғC}p`/Ά"^;6N4 =}–n3^l6-?d'<>2x?xG[dsZ ð:I\3/VzذY or4DsBc1NjgLf6 =84`WyS IY_KLNf# zʚ4L9|_L0mˋ#H: =F!_15#^>Z?1Z"1ݔENP:H^p} /nI{ ;|.I㈚= 3zr>o(L0f9 ,Xx0YT{*8"Οg{HX20`z1].| oaS#ÉQ~ק ˜]"hxGyXߛ[ ߸o7`z "^yD&ht gEH#!3 倩UBYJh| pRڅp԰Ʊ1%ډl+ dǁ|7t8^5ebnx4x>6teYh-x%2b!0W1Tӂ1%f s ƿ6NÐc{_9;`X׉ҍ-&}de _Dm rqxά7F.´1+Uz/i[w&{nĜTeJDAMrzAgz (NwqÇ`k2IMgFGŌʰEI>exh)]`GE4_.#)|+.;7&#BLܷ߶ >0qL)3X0M\.]4:>U8B`y)Sg >^4e)!u3,0l>`xYnyFЛzQAf㲀l9מ.fe"W\5/WCX p5R-ӞoT]1ZnBzLcN!9 5T? # a[#yx#όqyj܇ˇ-]XOx#%p /+]6i_wFlvH߉"j %VDW>j%pkp(#5>O7M6!5H`fe թdݝKel-76ۍetz<NKg 1$-2A,0teAzhâ ەq&9g,ZoM2V;cěj/qMa6bG:k91G5ލr7A2nW-9az!$i3Xgꈬ)dAdoe)pn9B x8nTkF?1R3$wtXgbx9•e :=3;atN6M1S&*OO /rpZ"QGd.p|t M8g:z- 5\ʱLAų74|\} ),Ö#b49F$g hyrDgM1/F\8 .p"103c0?1r4ЫQCA:$ĴֱšxV^0N0%_XCA  Sg'a0394„< *j'"#C A? =F[uu)59 tbglASpV:YAh$•4R,NI/MJܙ1B{, 1#,&/*Orv {MG81{𢗸J(3[Jfe~z՘/' M N *t!wxTFO%X^XX|9oգls6?@y}D]vB _tDynU0q;IO3y2Zlm˸- @@2j1 Hʗ!1+Qϑٗh5y{_XJ/NB\|h!tge)lR]LF䃝@y͌Ű46ވԋ厵;$20&E)fNT)|1WGy*ŠjI\*U!62+j=5O̜+S3; \ 09`܀4!o]04bA5tb|ݻ5\cC (2uCD3R cO 0L?Q~dASAz߫`HmgŤ{RBKRqBiXD1ˆHT|?1pT8BfSAy!V`CHiܯ`,#BR 4rH̒P N:Qi FAHU*GOU:W$Bɪ4N` i ܫ2r$<)TPTY:RK2SAUIrޭҸ >+DyI%tV&P**d뫔BjǢLP 0-U_ѽciFhJ<+}]L5,DJ^Ӥj2`\Xr.!֚UmcMCTɨxy!Ejj_/rӇd۳* [YgIf,-AǑ^U)6uO:V9ų96q|%z&56!.̼Vl1r8%hX#V0d_X8,n>XnsbVWSkYjrp6 HA/z ]ji!̼Wd'[њ +aܗ3L4U`p0p W M,Sf6`V"">7qw,KП W`$uÎ[:ٸx +:,70B Ӗu2(:b7,u'b[G;h璄jd9q&Snՠ..l?Rh)/TH3`2#4[}Up;5DfUN>łº,G?KQH[R'lE#Q9L' jv9~-_*RkcdNf:SzR:q\D"CEr FSEF TFS2y6؄d#`4If~#<ꭎX;v-Τwv'tVF⯕̲ߘZ[93Z|wO7nlԶ;*-ouw85fa.1sJ Y/%ú1HH/ { ѡR˞g*l00)X'sBƅ} 0'f4)y#b,q\' eU;: -~fJkTB u KJ8|j%$ D &:^iKRZ@@V0KȣXdLL1(.4~£C"!s6cQM pv@=r .@`W9)] gDC٘?m{+-E4x$B7g ւ) +3 {4U+w^f4ӛSv|6ek)f}zs@o00j6 7&i3Roq釞-U햌+Gs~zٴ+X. U,æn;O2[`YI d({8FZ߆&sؒ+wY/XI%9)e;! $Zkt[Z"O "h6-ŕּi,#[XCظ66Dž tX1{gJI %hINJxi,?bCv\tx!R(f2mLxn#*_w!Ka/.A'Ĭ%&tDfRwlHW$Gβ3Wz#XM=2+ yAD!9o~ Zf79oJiRŎBbar_$壕R?QF.._lbBF`%.QVrDf-)%l%,s p[!Nb"Ic[Q`}bړt\ט!pKhH ѱޕ ,ET]|H?==,/T ~66r5(g# GS( X3|OL%#ZfNF;m`;f<ǒM\mΗ@-] xvׇ]q"}65/km6td]MNc2`,'H,O#2VKj:jdOX)^0RP&_ށ \_Q;Em)2>9K_z~!"25tYB>a 2qqLtq<aqK=H~"4G: e| [%IOK" _b,.=VDYxl!!J'NyEe\g-~7QwUQR6O j(;wڎw k`7JN8Ѫ_?~I{p[/'r oM) JxBLхKu?%[-@gWo~9 /{ȧB&F 0j `Z /P cC@n r+;d 5)2T^صibY #=ٿZy5x^ ?iA{ |{ q)yS.g: .f ݴ̂H0|ij"{SL:#@SLz'I% .LI%Quio w;"(/[!^$WdePcoԟo *bRU+L E`M-8fوN``uF7>K}sXSpKkJгm2-@@p .?v?bOA66iZͱ'=jy&dcgclZMqkQ҅IQfIoNF7f3WE m.Ƥ"jiHр`+LєJcEҲ4cȦkcQk&g+i#flNĆ(5j9AŘȃ6 [l"+&C>*Gm6齵̢b3E=.. _3m6";yv'iUzZuVkB+D16X*xGWRlC%6 ǶծrnKn#>(8Z[`os |ظrGs3k4J5EB+eg5=;*fqzЅQx'V*dYCB?M7`;j.HVVȆd=Dǐ-6ШM%_V"[\<殘%"p|w2#ǮdIV&qfl#)@G?. SytniJa8e8"g;j#e,eD7 >){F$RqJ.~ N+;3!nO3%FP,΃!Ob|BCϭO2M}rKcrK>W{j~7YXR}+a ԭ="܉T.t#B!؝B/N$ ̦dfL g("8* W8/ާ$HtH4|8QvwrȻXHƑ/Z[nL.s_Ǎˤ}a SpMM߭EYQhyń aUѷdMٰݪbե;HtS ta.oÅB $1j;C: W &,q'y&yv ] G/\/ybaK YDIz9B  ,ɍ&UacrƉ_K.gK-aI~q`Q/B14a."-Ø!Dҥ4+oѱ;52Qn @`6JD N.WEs<+umOI@K kX)@\:[ !92r]Bg0+T˺Ų(m9x" %lI SL\%yXFd펅cƇt-“2vpįIIYֳ6NJDBتg+9BOhc (BiI\ud *oЗ;BsKJ(KW["Trbem)鬉(DiJBgq2E.;)3@!j}g-$q(' 2-%*_yխ/6 ձxSMXbv$I '"sue?_0q[Ӆt4tlHG b8x2Wvw`zcd<0_]$3ol uQFn׮D}ǠZ5c#Mk v HdI)q&h m-KGoxW9ߪ-Ǵv5z%1jBrкIDԙ䖼v%P+ij|UL'MԸH'/$}.&|G9ݻ.úy%olvn٫4l#ٝ4O'2*/f>"-&mC'.vIדaOCk265AQ>]%s0ǯ4p־UtiP+ѹm/GO6 #[B{>w/'Lt E:u;/o|;Χz)0"Uҍc )LvŻ3`Ͼ̕?3d[Y _?[L05wty3d=&j<52Nj1 d: 0YHRC["FFo'en&7 ] B1\1_ܩhc*]ʗ#jfV.Ag9t&a9;dIPlAMU=Ly0ZS$gR/m.#$=63ǝʕBS%h\|hn1Q͙xo [!T ꅵxE{i4򂴹@\H%SQbslfYQH(tX;[9,˞]3I$(mmcE䪜Oi[IZ{xѲU]vu"Uyش4U^H”/EX'%錓NsEi׃fC̋gNWb,KR8;%_ԑhl7\(bIf[fl3[JߙT*[TZL{vz.󔍺5-ֿ0bFZ6¹Z6UoU3ײ)ؼ*ٲgN9j(nՖhrް*@q󎮄UȔ&X1nX@:N3Rcn)rd)eM89b*'&ӓO !bp WLʁ9fTS#x7R*Q*JF:JNrTzU(ܣ?1ҟX%5mHDO%T[F%՝OLH}J1o3JCՠPfc,Q̧pu,>Vf,˨7tA?TO +_63b *)[_Jb,,T"˖}MW=mQKUU[mf=[svjSgA9QK*#REBۥiS)\TH 9bG ʠ|dy s. #tDliS~9FH#EY#lfp|bwO3!R#IgG^U #K#FX<1t~dˈkk4: 5SCk7M()G>YL tB&3Βv Y2} ?r#rY*/@*0,jAt³69ZUy]U)a&zWd\x_ QgxES/8Cwh:}"o vLԈ$qCJ`\.?2wwVR,?. V\o%+p>[F,+LNַQ=yAjPLb8ROaz\Ɖ% 3q."ԤeR'2LH=Dn= S6#UHZRU.QMEݘ,(ȒraGʅ`~Q WzG"DzԖIyN,凹F G7J0XJqMdrHA'C+?E H)IH!2D0H`?% 0 p+ k! 6E6! ,N^Sbo3]Y^䵐4Q⧤&&FR2N )YXc~鎌5Ne ˨c(T.uw( +z%Ia_'Kw|Щy7y:~bHD$fѓ &ՆSF7J)N R@-z@G2FٗqcÎ4j626jQ*8jMGg=8eWJ2K2jK=Qtz,q^FԘH ҦCmjUβ;O'"QZha V9,ju UZCȪDlhxWzW(9pc6j fwD[ZY2rSH ;Xa&r)JfjQ#J _]B%96'zR_ע`@h1.KDߑL*]az{7QqNv[hg1ϯoIqp C>ϛ,&;&/?@WΙXe81Gd v =Cf8XRY90&2%92dd$1 m/=@a/<1w92둘)T i9j'=/1qPKLf\VƵ>l Qe|2MǦ65&١lt)f㌿9PA˂EI^H0EG?>ND4oBO Φ8c4YrWyQ0p/!n'y,mL>O#WVG.nq&Ab O0ixm*%'yEN bR$Q:cXGWD/ó痦 x8'Lۥ(.Fbw2&/b(̛|{{2gv)<K'(Ihg ƠY\DȷJA {rvRҪ0ŠljB?)"{WI&Kaje %Q`˹OB݁[aEͲmś,p0b < ֣lc&_,H].`{ᦧS_z×Z2v˙ZBpίʾs}ʨ7̏]GSe]BKbF9A\Rd[Chyi7@/gПcΖۂ2O,Xj@"v0+4}b_}BH/T1jj)kLkq%+3.Y7Oس:3|c8^ZPUB}pd2`ۖK.¯nTc,7] >]ޭei)CIm[|: kH_%-*64eWS}3ceUmO0{U'1;AKM/`v>%l%BA?-F3\ڂĶm8C5plQa!ͩ|~ CȒQZ$ѰlʗL~$"K3/g,qN4l0me "J-269ߵ]kX8,?Yd||h32Edl!Vp:ˌP^ ۘڳTf,|酅|}}{ۗ2{Lތ+"DdjBGF%^|**I1s2LCy\z:@ 2Lm>}<.ƪCv= KUo6YDbG0"#ۘx2߅ MlQ}5TG$Y mۀeXڝ H}adȽ)H.Aqv%jk{֕nYXn?vKJ{z{@5YR|dZAWG3UW&V.Ӣ9RBFq\j ̘ tsk6C^RٺG{<ģ؍M4'4cg w5|Q d'G.$CPGV$.4אKc(n7͒(F.)\E7{mrBMTŨCy욫K]Γ&CM|[0-2Ŏ^*.ǧ cAbSc Mëz^!JF`3kQbb+GaN M7 (edi)*j/ɀ~# Wc- `{xI= -1ikӒ[P%Q]d}T*=j~)h6R*,K:ă~ME 3F-ؒlwLzZPu,7ީэ}!:DplZg~#GTq;NH TBKZ!F"hՓ>IH17їiNmA^fQQb-TV*Q++"ͶKBޟRRwjy9:iƣD\NfMAQ}]蜲H ]l5?7{,oE?+(gǔjn%qzxjneB\E^mN @g'sS aw IDuqZ]nlH>,ΎT =jn@qz\= #>-^EmwZ^%B] aQ''Ma l42Ӳ-_dtItك+.mQvDRM1!oX<2Yd));z=/K$<5Jѓ23q0 W{pݩv~ fGڴĘ5.j)=Lxt.d/Z=i}A4CYb3(ebC铕lGA1|,sy$Z5FqQ‰k _8+(z(i̓U;EIC!sh/N lg}]^P4Avĩ1'^wDREX+R 0nKbO}SCr:`^0 -R ;-MO|@;Q2\_+J:BAM䘿#Ny`0kzXSqv @

XS Jjʱ x?lN@!lF08[1'Ȯz2hTTZAe>C X~.djQPZ >|ܻXAݱ@Cї]u8)[V B^`fVF]Z%-IhGr ImyЁlӚ_ 1.Huث n!s>XbdJ! H[;NʔpYf`3IF;uDT0aüWHg|FO FL]I% < />>>&ڀu \ |m<dt.'E@zWNQnC xEt5 GM°t}4Cnɼ's=-Q_NOZ:Z -@`U<_H$] `_(~eXz"Q}$D 4A^e_tT:Rr [X-e\]}7M@vktA̷ǐ0b.`(/Ә}B6<ݭWapB v q0 $VMg٨&an7}}|M~Oxs4İӱDRol)?\Wf 6$4| 65QU ^ir1IcR3o3/Yv,hI?XOehE84b$ ]E=J!xR񶑈0"*X,fLԑsЌۍOI{==-@rj2YbPJשcZmyC=n! @(!6[GRkvBh%u0vDl{xϪ $Wih̄ºҖn4_M&AA Lm73f|g2o#{7o7O&ɛ@c6ee>xPiA3anaܙO|LC^3/!G칳~љkʢrpD!o!֠y>!0ђazvkJ}<0Vz,l`dI'OHD`-Y8vQ^,4x['9 ź^i'բf 51(cթ1shF?TOT`\IӮԙRW& (*rfG+{ .UoMxr<DhkSϤmqVA|u>*Ƚ^P,]9B݀@#o !Sso F`o d D{l.7WmaSnyln^ 6jꍁyRds> L$Y~h 4%(DnVTnMD\wjzbw78=);$;nX|Ѣ[#k8SKw-| K|+{G AHN:PF&lwZEƪnXP "ʌjZ[z\,trhYeElq`yZΧۓ>ޚĕNv;IC:{,)LKG\Ypjy<p{Ϸb.1 3b#m-p8=R<*5_q ؿg<+B,ŷa|qEE;R#ĀdG' F(n&˅9ڀ &;c0D>stream Cx I u3( '@j75,{}vO:7daS6ڳh|K?Crq)>2 A~z<ˎe?<O%J.,݄P{5pBɆ#B9, YiaX#TGS0̝Bc]KaX 4bpR3s? 0]t,)!PBq;Ka*S^2 ͂0rapظY}01Z&az |sO%naQx,BЖ۰a3 ay-@Qsl*¯یLP Wغ{hV/CsL`WT}u͍K7%ClTQٻ^Ntx^fh[q aȃ`z!mvDy;<ȯ,H -5wٌDd>Q6B?]d'E0?"#H9ͤBcBCBw98CƼ~n, X` 7pGtўOK&mپ$F_FBwo/1˷>/*.lZ@VA[ntn&Qևdq2X13oYh$C`K@R-y/%VLOV<29_Wy[~bg7C,˗1LQRrNGӣy=fq^ya/'w` %K(er#]H+h ֞ hi9%p_ L)Kc?F\wD RAfg\WeOrߓ4GjUJ`%Aq:*v&fBYɪB/jPQD#3U ix?vvZ"QLLS 6%5#$l>B]ܞL 2XETwUCC ) U v.+T=r^P3 EAp.ڶdɳiPZM(.7fOcw:X `pv #p= )n1FnXwկP' ,|E~J!O]֡_M: vQ=5KEDBsT R,yIqgY?,.Vfxwa7 8r|J` ^%xLs& _wBVx+=G?rG>ظo' %I|ϣ\}ݤE]/B;\ A|w:|S-(|FAmX%oݟTz!3LUZ3Za%Üˤ|[↠$l 6 -^l]|H62 3^lf4ԘsolTZ9sN#kγx+==>H!/>EO/N+(:}%F-袏׆ 㣞tTv7_߯N&s2,wcOFd_p~hYDU܋<TZͦ .L2'R 3%f[ uI;~YL5q;}w:&ZA?GuLn/\0c KD‹JgyN'4 ,*pvr5!usE"ϖR9jA!77Z>} abG~Q ˎ]O>oYcwZIaٕٛI .k>89]xQBx3qq9_4_X1<9 FO@q_+?cά$=XtWC\.-O`LZАLIgurU> z6ɥR-s 7Z4ƭ2,&頖q\EnvvXlU ahXQ\c[DHn>Ua|ߖ>?n%-M|:~` F3h|26|_?OO;}sq$;"贈] :]sAH*fPIWޝM ?IXv!!g$A۩79Ԡ} t CבuTY+#@d]uI k(h$7Up%(X2#~ g]^WBfPle#h !;idZd-̤'bDfBGrey FK~sˌ(&v> ϟDǨnS5Wlb{mPJ*1v4\}8*n|D ;8[ĥ upصx hu^Ϟ=3bYQERB Obƪ glDg$!BRu!'`灿/Xyu}1P;p,ߕ0e7/\mBe^Ƴ g[u3IiR s_颲4 ,jv ^ao{qI&'XJ`CRvvC[DM<\2FL3·on=< m3Ɵ?xŮ~Yir~P9"]/xm'\,e9=5M9^ R NMaпj}S/`Q[+\K[-4 KcC(2|j M4_T/m~г]lҩgg(L@ :ϳLO,Z.U4}.Daze2b6V(ۣ:h bB)x@~O`~vAYȺv{F } )ǝ߶tn v+Kwz !hƼ n`cE7e10o]Ўy.:؎/ Oh{oG[;:!/n?]O%RHG2 Z 2}Z oBrFͶ*5L`BJC8Ua,s<1^8$QIw4@)2+L޺#о;:R3K=?_5[1G3i}s/9ЈH, 2FW(,mlMr҅yB,R,IV:igjΐd22 &hF)!DUV1 j@eδo,sT",^[d`St b+!ZJ5Em- ;eS,'!pr4zhp}sSnsCeәK˷(fT&V+@R' yNl݄rɣ-) 8ew;f1 i.T*3]ҋ*f =#%Ӌ+1@Gsi"geʒ:3Rz9@IS5`@gY՘{2o8A|L(ZR&^LD+i1ە@"}[WKx'&E*p7S[W"P@ Y&zJ,.*I Wc*CtBi?P:-]AB?M\(08+ ZDt&X&+b(+.0ٛ"F?_f\x|w*wh)ĆtY9D`H=^OvS 'OR{.fF: + `*|C &'Tnc`ÝٓfTa͘@XAL~N PCJ.`B-V۱-h̘ {3[C@Fc3[v20,3+slf@ׄKkB& Q{ZDغ K[n!C5SH?Ȉ[gG7Q#5KdMʹu ފɝ A ޻n`5vbC^Q{lAv]xa7u]LVYkCULu%I2[Zap02+ 1L94(cgQ?JLzofvl,m E.6Р~<Ɓ^]6v|\G(spul̬?Zbt'3-{=ܫPYd f81("Eb&X{E "(P_!G|dC_aV C_|Phgf"F*s ?C j*^}fl u~ZzN3|u؃4Q{t!XT : X\bG{$+V\`09=H``W>æ\^LsYZO[>Kݸj+pdbF=.knYpdEl$ِ">%1.LDfB 1yZhDKvSEOcm/gbP!r|.grOSon_>D#?-|eyH!e< [3=(ѽ} UļFdl/6900[7S",!@|i[h:?YHhb _yہ+9a$cx%IVҩ)`GLd7_6}eHzQAfnGd[{5m 49\P(ӯ4zlMhjGV4T/`_e i{Z؄Hʚje,Kqo=˗JZ :h%k&k)H0,3.^Ҹyƫ@^]\<Gʫ,_] d7CM_ӺJeq[ EnA%!xpc w@#!JMr4ăyޫH~S-Օ5k$+m c+d *)ƞʖ9On_rHgH-<ҼG,ڮ#bU1ļMJ'n,wY (oV.LCC@#ұRu%'VsD83,>v}{wa3Z7@SjI0 {ԁE*֔H_ۛZL W%* * ._NbE}IA2Hq ?x-OD1= Ge+.ZMyPM _ Dv vڇg"2BNڅ`%1C\D0)uj0usGQ'kjY3\Er`K-m(׫ m2lj| 1b<#ܥu/.AdqXc$BdvI+˚\5t9,0JZp+~z؇Ež! 9kJ%N=X܌tX.ba4QuN@KZ(58.dwͷDUJ#[^].}61:YD'J Īb)&@F'ŒxJ!RbVEU5ˍ j+MS*V\q7,o&ʻd4ypj:淇-mhzApEaTד r2l,߷d*L8# N:t+FR冥\M/y4U>R>HN @F̄%(ҮfIV4E,ǍՙG"%$ '{yjo<Ҭi-**E;/,1(Ce4Z(! &$Ʋ'BC(4^m ɲLA"r"&uE!?!>o?2Dٺ;a dJT:`_>lYu8:UrN34s@T_HH)ڲk/3n/1 bmn@qV7n+Ձ#,`׳|zǘrGOsE" *Ҏ"jy7AV.] 4v%qH٫Gcꥢ KD;+B[3day2(7h:E4S~h֗-D?q*>28 tRb%AN`bcP<E;2#M+#7 01)f SfUdHoKX Ǯ6YӽZP UdDuY˔BYWtu}4Z¹ČRcZy8bۃ˃"j9QTbgY6;TOj:V BAoMv7$İxP;GhL9v_4AӯE8J{x^CSTcG($*vTBC^XE"K`LPR ƴ h8ڬEKOP`fz<8OӤ@CsJ֞hK[_썷B{V]2ay3atP&]@l꺟fX< + mn*I=_ wn`k+WJLJt:5&//Ejao2u?~lՌ'NO5؛&}Q9CUMG.WZĻ[B-B(iD 6Vogt,QPm.;z43DѰ lβ}qkxpEҸ`Ro4+*Lk[ o`Fxk!fE݇=d:Sl;v;oq33I}K0:mjnH?w' ƁGt(\룁(]}ysQ`n5[KN,ÆL/Rs@%,h{ -C~G |@ŏÇ\<|y4 U0u>`_5l^NKb 'F=_yPkC+;) I%6?3^y4އp '!*<%Vw:!|!TEP2"B rYZb.#(Rթ<_J.{$f܂c* hnRz EG\o1%B_rXǰJ[`{t *?'ݣ˩'czCsMffSƃ#| ƽH<< 4 (טJ2[G `m $Gu?Fȱ64Vh ÖU)@j_#{,p=CEAI{ya}XTO#~V!8gI)k0_ @R1TD[jsq (·^VPpyZDƭR+PjM%h)cUo\S:5?L>25H +ݫG㼖&gRPwG(<-9ϱlU5xE'g=|(qhCYXEB"gD8JN n( " ܴlZ\Y?9J`rr$>C7ytXtB鄨s3ByTr,`)+J|`%˰Uj9a'UPL8[7P,k D!YN,:ҫ!lq')ۊHUPlG{\&J/?ϱbq0Shw[m^[|AR[dR?5}Nø#FwRJ3ͱѫʪ!!,Afhi˱"OKFW^OGd,dErE˄]-]#Jf*|Oah9җ *hh6 Tŧ }WBE$[ NbSYUlr{G 14Uw2НČ|4Z%2HDEguYpK:>W^klu#ɟW~ǻ{~  FwZwyȃvB\;w0ED;}*d;$Pyot% nGfvvܿVƩ s 5~2Ľc"~a*O+퍤 Mt录3Mw-\殺2KQ7}쾲YIr"vILBB/Kbr ѕ]O ԕ"dFV^,w+xjsJADL ُuF"opo}_WsX5QB:(謙6tU-OLA0weW&7Y(McѡeUs% y"uQ~m׋|_V1A:u% FlId`z\zL'bҸzoum&:_r~/$`n5 ƻݡđ,.3gg#5AZV%DlLQT1uЅl<ZY7ϯwŠjRQ7N_׸"%Z_`TLs 63u~~㿜 W]<5z*g`T3m$*6HWDho,DC4@Q(| `U ^o%FN}ۨ^ %=\{ kЅ"fEAѫc_5`KBc4e|rWS;PeM_3CҾ0N] LETcF^Nn:^ltrɇ7` =I)5rIasA׾ {f+Ĺ3%~ N[ex<4փ%һ(6(y?C7|͎$51gtG4AV<;!"+[ܻv%[\p u\ԇ9₆L!2h)psvc"FD)-_`<;6 !.8~O{gQ.𸤂' K3x}u~$!8-aOz!7oZt (7WޯxGI] r$y,9 r$y,yWg $ϻJ]e'y,9hI6K y~YnoomdP1*xVj>qD}R;H[\]wE<+gʀؕ1xf YD.ގ9 hnFv3^R4O7*[>-1߈k1^;t)>;HA( ҕ,rRA>c@3ݫofRO͋YMestu2)nLA4O3c:tET<6C/fhXw_s^0c4]5Ǔ,o$L#2R42-X䔻_ @nI?^qmt@F<q ]b+j={p|XGKU9c8!XnǺ{'ܰ/JC2CP HV(e*cak0A8?`91\ c,*Q5e)0 2>Eh/7=Uv_z\7͈Yn䇠[T"$_H m13r(e Knb!??YQ%o0;+hE35" 3s04PjV,cBxKS'r',>39ߩ |̘rkoӤlރLD}Zxg_ J-dVY#&",9H @"7M<($<`f f~"`e« I 6Xΰ<~d4xa@)wz { |а-މW)p>J)谛.(!;Ws3r:UZ4M u0ljA2$%Y+};E(vOLLjj:Eu_Hb^v8z:-5yB+Rvp)b+$ T֓i.JO|o,hf(Uq vMN xP@u6!_S:kiRK>]@E9CE}^ٵЗ0  ]W?שr2q :>z*@2jXJ̦~?E4cKaJxä h.`Ul/K-"04iv:t\;7 )KuQ֘Ey`W$}Y_ 8Uf 8CC~̱Me\4_g;[}iO, kǾ`iK_Pp8ۧo{9йT!aP:e[~%g;tvxz[2`,!onٿ(B GNǧVlkoW~?}" J%.[>$xziq0,G 0$d5aA>Tzx(ދsv4jYS[|VA5sYB̀߭ьy\/䂃.bROX6r;n-fs~Q "4 ^$`7KLWͅVT^x LQQS$ő(*LEo]tvf|v qW܁lFPs|mn`#nW^)`LfȘ hYN}03 TuȹBaV`1eѸZQhʗ:ԐB NZ߼jY*egum<[2YᦳbLfmۿ|/tL*@~sQxA,\[dSR}_,nDa%$K%%(L %A[⁶{j!w)%=Փ$3l %n?A6&BC*l2BW$%0NPaJ/jg-pf:8\nK>ȣT;@;It͛ҒcX2K&#JyWbw% հ>TRAM4Mٶ3nK*d &ļX  ~~)F&+0p9;2~] Ae:}˵cfUK 2%l%eɨ:;%hg8=cܧr>">F8׊ug%1=3֚oMI@c4ؖ  M5R۪$!#OoqY Z^x@YN (HH`*׆_9^.`W> yQkWbO`X aKv_(*cU?`f27<ǖaIdrf5id.*I'F }/C*4R BZCM+i'C^',( pDM8&32.=ϫ"G).evc+߉+q`߳7PfV+e]J\E>a/EWE^Knkim`Zm"OĔDB݀"^,PtleI&z8}zeAnS>SXsI&Ӎ&Rq{Q\0LJ65B} CJ@c>"kOAUXZfI%7xL]X-8,KPCĐhj͒QJUI$np*uӷea-~QR3–Ow&&op-_LId4bUb ?\T7y]X%s\4IP'ͷON8$}ۜ,Z׳#f- Q4މX`oTR[h/߿=DgUx3*EpF*`ӣ}9t~/3»!Bapm$$E Ͼ2Vyb&TY*E`{3r\g( dqXTtuk\By*Iq#L k-ȸN?]M6fPqBr Jأ%YݰD-!26T́FLq-xSZe3ԶT-0ߟEųPh=TRn۝DCc\3໧Ro%݃`UWe?9dz/%GC CG>AC0JSGsv/==ORlQ-v -継 @1צ짣 - l9JM`RFܣjqDC@纎<YM!%mo8A":]wO+)z99;UWJC"}f\P #T8*b Y"C'gleH%u(&Jo ,<Ւ*CL׋ & #IK0?k'C|-J!2 S|.O_c 3 )Z3(xP9֖N(Yť Ŭdv &U"Z{, `gyy^F-n1qr.^u^iX"XIzh+jAu8TRE]Ֆt+ڢ {^\#ڵu3\y>%i&;ؗTƫ}i2}zJ9ןxyg~36N i?{3ewd⩡$](s]\yQ8 A7"Ee YhdfEe]  bvmAق$ek,N"ͲƑȊش.5Y+'cJz zF)uv6˜7WCX0m7j&>/ 89?eXj$Jۉ> w5գK*L@ut{aLPu_f2@!l+H=GĬ5u] UF?rM0k~*1Qbfy/yWg ,Ӄ%@bY'3S=_~h?*cպZ2[Kyv$]_;a"BMfɨ<;1 ЬвRt+*A~e8 k#lGbbadN"pؚERBϢz-2Ǝ `'uY6ѾFϚ[BTbTB}AX^f1AL{?f{`ٽg?Ɲ܂m>E(sy㡮-e 1ϞO$d,C&V>|O HY =-amqk68}4<^eg)lo{}€Fp#c`K϶-ŋ=M;!B"cye(ݯ I9kkd"#fI8s{1 >tlOq]S-cCsQᑞNԒ̢>=gj  {eEyO i֔V#oI^9"z?liKClp0b] JH0;SォD)#rQi^X95 j/|y@_@BY@4dXV2Q!U Eo!sc#)LY6I?>VדgC&BElO9vR}xuWX2]pBC^zYXs,Zx[E }_`t@FS@{{#(g~3?)E #ΐ <%Nb/ ּ']\ A>!]CЭbR'ս=';}WŪ[_?ͳ\H͡zƧ~{bKrW5 0-Y58MV%](8tRPԻ_+5]q*C$*\r`bCĞ:ˎx0>`b*C)Ŏ T =?DjdlG&#GxԞnϘ*sʽPyv kL TEqcscc!;V8U8fv³0{}(ciu b5~y^ c=0C91@?-)U {]4 a!eP *p50TDZTGB;L"yc9yVa 0vsl?@[!%⼝<*]G$Y{D!>'mWCۥ-bY{ӆzU|VtSVMf{EcjN"Oh;oRqykA4wPݯ-$-l>;vފ _wՁzk!꩝Z}?[{Wu{/Ow0;i^{5~S6`huͼ5`'KȌ@s%T< lZD+ĂC6&~7//}5`xdMP{r \ ]0 #0u!>gpo^ nMF ~]GHfU25u%5?Zx:^LeS#Tw-B+e#?I=Y!`:TcaOՖXO`k V2Xol@O8gx _~]|Mk!pauI01 w2Epf8AFV |+/wu߾>,>}/ZO,f 7`P$&"zGws7_/_a3=2-cjo7C .sGc=\O6m[uG9dJ[i/؂DBiT0"YF ՚HAzQ;wHa= >wR]"yA/_Dy̬*9$)9Zzȷ(6kiJ] ManRެR& n k+ID8K*"ffIwe5CiϨp/.Wˆ4DDN1y!W:/ C0tZ ڙy ' (mL@؟R8`ꇸ\mT$kHn=R  "ŮXmOWr&mRZxYP?.B3{n.f\.[(D}VU@@HЃ[ 5jU.,‡jO]-2D ! _4Cm+_Qi"wkC:\ʦ!3m`{< ߜ]I UaM{L ?9[3:Y-.E0pe:r5;*QwCב8>!-@h5Mk!Eܛ٥{y`]ˢ{e$h.R_2"mJX`•bu LEjw6d2Z`^s%;ݹx5~ޏ9Uah쟐gKtK:J7sCP~7qL<ԔNɞ%#K@I~ov>+مycSD+ Jc\bMrK>!W}sbG!!PX..{-}~eaOo)A !â 9hM_WTۿ_e_?W?wO o~UD|q7'lo/ֿo_ n1?li, D;~:4~z#2hr_o>8=~~?y|gJKqoNG7 ~Awg7?Y`{_5Ehb0&OH I]s"C oN4Ю[Z/#YU,3ot>!֏fI1qW?zdT?_tX *3 42/2!Q5+ Zl TlSQp\b6Ui*`(!auhz,p7mGx.k:?し46l ZyBwVؚqvtqZG@c>T=Td1ţfR4B䎊hhT1E)O#;jXұ :ao_D陘G' s{ҩ͈z+4ehP1_f ݔ0(.iѤG'ߞ܄s#IJY*zS}dPkr%Wp%#y.cgs&鲃~Ut t!Y5F(r@fv\Fj^&&igOȶ吺/1W묽i+iz %x_n\h>~HY]7\ƈĥƜq_q bPGT g~4#D%8ӛ <.f6/gBg5qQ?NqH@Rg͵`~VvYA0^|S$N= ![ƭі*u=*HaRM@Ҳk$ƗeOK^{rZte)~>iu#%Qag]ZP)] EyWk*ҭ_RUoi0 9r@< (@=qZ F6q 5BbDW4s u%'_yiҫA.sNPn/ޢ9}&t͠={ HS\8w!bZo;[ޢ;yElDӇvS'C[%mGͤ:L0Τ:Gqwh{8tk}~]HX;}+L˪ɉnNl2S;a 1~.0mlJ6ϙLK'F x%ۻ}Ѽ?^i|z b>k5jeDSVN^mfdaV{KqR$`&AlKAݪ7,)E?Y6e,P 7~]P-t?bbILgR5ǘuuQkvEtx0s$;҅ f`oJOe3:-Kjh/r7%ե&k%J dĴK\3%xٟO0rl$G05'\U׈m0LSQCP#ԉwvÝ{1\USfHT`MK<\C%g.DQZ-dέ%n;Ď4JLr%(J hz&o /Pl|";2O'À(4NenQs~讈ZE*}, g|\4Xxl3 ~S#Gj7'ѥ8ڀute>9 lLY&GD@N@Ry;Byf=tLk\WB c@ '4aQ;@ѴުWD m9?&riOٿ3`?vC@wG ?tlr-n;r(a<Ϟڕ`-nƶ+`g΋>~MnKaqZk2xt,Bg$z-~;=?Nw PgK7h8nl4=ʥ)@pMK@dn? S2LY=o[3[^?xn *,*xi*>QOh_3AZG*Юa+wfu\S/xwcYIo?Q6c:@@:k7A,Wi_*J+">ES!.vH=Wck:b Q˷ȵFl}GYRq QP%je/HN5MV>t%528 9ivj|*YMy~q$K⚣x|O{, H>m_ h& Rtk#6U؇jt<q@PSNW+f`Rnb٤4: `@07\]?,"AǬވM0=lLZuIh>^U̱T tżl1p^E&*y0ݯ!XnT@_e/CB3,f.7?2Q]< 6VWE_y^{!w"q؈c!;*P௾ :ϗ:HsqYj\aܶW-HZ{t]Ch뤔,5KJ`_%ȗ_L $q!MyߟGDѺ[zWv<Y}EA &wZ.fȟHs~~ M!)"satOs.CDm$}bf&Ԍ;''Ht`5{V{f~pKwɋ!t"Jq1~;mClez=U>^į)4 O6ҫzGԂvQuEN^p0)/PV}kw7:Z.G ce3hFM:P 1p<+79ƅg 1s N0#/>lM_ j_ @! wۍ׋Q?irJ.#u|$vYjDH6+o,S@fYX)HLZ| t WXxA*B! XGvDGLgL4==P1Qw΂#PEXWeztJ p7V<> xdx.k^9!m>[ J C{sn\T͟bv욫 oSFE7z?"m0 RaB*OZ'0OÒ/%)~4ATD#JSq%p6Kvl>%i z9Hl heEacݹ4|/-cCO.cbًXoׁ[S:X\<(DܻDT,mq` ^( N0ؒ5r 8p5!'^p+u\J)pE'LFO,;ba:M!JG#Bƈ+HŏpbvS:1PziZ'|lj y8%*лrD(p bǴLdWLawtjol2FYA)ZL'P bϬax&P06^:d ʧA(^mv).=E7YHy&9YXS̢WT/^d4G{ ^,,1UfF9|H_g; 7MB5=|B d-%!Nç.ZR"x:pWqщH0|ͷY[u(taotzXijw^/3N8#j]ǜoHl^ Ϯ5ێl]32Nc3YG:Ά %҂FjQXT%UV;y >(񤶴nƒIE>송>qn[mJ.I2g3eБ}N4cƀ +'P+)ϧf#}29s62!NLtS;+1]Kl0xby;;Ν}^ַYd7?^|u\5vl\ :,.J%okF kc8!Zh |Z٪iA>ϵS[loxO6Gܺиnԉlk2 P,sؕ >H: +mqȴ?3hl:{Dx3~8l,le D?)(!ƕ3.i!+ݦH(Dp4<,ƛ^W>oW of`t%ū7͊TͮFVncUȎ6Vad<r¢&wV}i)is݌!Ǯ(A `V M 'بgV @jTʙǡ^ӹI:2dP^Y~k\m+/#-X43!؂}kO:'2ji\y&cF:S.O}~YCĆǹQ*C)v ٵJC,Pmuy &x.,Y,Kw,uҎ>BcA =',;G*V ѽ,gm/<ҒĦ]K0'A~[Z=JGI;$`>ok=pY/ "@дmƕ.; Ѝu&vrKay' E@ !iڮpPŋͱw~c ե9uq_fd~=YbV736^Y&ڤ+Q\퉈ƚ~aUH^_ h%м9"g]OC|"0jkuZaGPSY9Rgllh yE C' 5_=1#3f,z@H3;[iȅ[-7 ]^3o/ЗAR]Ç$\W{oedxo>}%Ӂf%; ̌@CF Rdˬ:_ j̢?6%3CbVc\\F573YQ0Ϫίf]J"P!] %=EtIђPs}2 ^8Rs~uX9y V[+xKQ &2ΧBԶXgyQ++O3CBZqNo-.6<_daa}d4'.42Z\Hónju>m1m;[8$mn=̒6Ψ>, Q@ljYA5 +_B9'`ƽc`E6tc,mn=(\֩Ƞ+;x#Ce[ t% 8s%RAf 71xF_gӀh?េHby{ێPɄ]R:A(< Oht2C]w=Ξ^`t#&%0P Hc Лe'r2M,fIVJ cU}vBR0@$ |iZcvIr^`]j4`5YBJ\dj?@XS kE0Zml}i?ۊjm`7E1яLYa>u ;vy/g$ug(j+cCy88.V'w[g)Ő D-=?GpEB% leI,C=6Ti;7 {_S۝ݜ+ZPN.{UsWxg*dV + ? 7nj&E`OHp_/Pc'm?///o0W IK\1$x Oh>b'񠍁&X_N@"> %?(8P]jd|uKI|tm3|/& Cԓy0'k:$Ѓp: y"N[O*;._Ynd46Ot8†d[wp>0xjy9! ӛ?bIG 9ϚFbguhq_zvYsKN@\z&}M,SKY okp*2&gBLY,Ϛ0 ~$G ,pi;Ew'#,āZRţh+cm2*o\y {mf!FzXYkLůĆ4+l7&xۃ {ԃ`[ ,#V+ %uM\pxdF~bXXjE USk 3Ϣbf 9<\;2>M)=&a7DŐKI4dW>2c>;\6Psqϼ `V0zӔ lO0ttNZ2ECUF c"re1 :w&su% >=Jx%_i8~<\x pK,ՕGrfz\֢O:ow[R1 -6A?K |\4<墇KB̻^ꕹ9N^!Z z'HQӐxj${8j([ f3kۃ:gkw`5H>߲ɞ3Qhr DgȘmYRwtHkЌ*.ϲ5JG@'b{9 S[B>NAxhȰ%aǤ |h,$Gn!8({8YN.LyʬE)ymxRl XY;.P3( `?AIx?%G aQ N,׋̝8v@hUw…uͧPwB%љ-A'"iGGb2Jnl+n#e:${1?!s~,G~sN$$?nHI%. _@Q%@nQ{% z >l͕kQogUeFqv ^=x(.q!ne;gK՝kƽ̚A H,l*SJZNJAyd(<b)) аUTlTLB EhHه:)xsQ/9xA~Mfi~֤qN'g<#:Tӏ/pDqY7T2 ]n{ TPՈP7Vdi1H$n0`Hn(KH Liޓꧤxm6_P ZWl5,A=1Ŏݲ-1Bɲ$N<:W)t SV<6+{RvBQI2@|߷&B x:;q,JǛ\?eE\]'S 0 W^ W? ?Pk3ۿ--I 5 ՒKj1~mu5π\7)$ٳwc5|D\ pHU[kB==x!I%y]~]m"PJW> ƛՄeB:_xXHd7K_~$}hq Y?5.)  zFRԣĚ+?Q@S~YOͩtu`Grlh /L罟aH ".dnhT%ܱP˕i:H Fک88;v3-|vbWPlp1$` _ 7nṞu̟njG_ "<ܖ b0e U:(U@d]r[A 0@vzjjOAG^ʇ` 1c[ddC<T؏83oPUM@OWCVdg"D;^$ Fwl8=#PGV:uG铱/~:=Q+65U>1&o ZکRD0k`n),oZt7V0rԖn-">Ƥbb}d*1Kߺ˼pi˛AB8Dגcg~YYѫ4dןki\{! TOOOdHc:{Э'θ`Y0I㬹@r*LP5r eOFbE,S,UvVKןd hyd)TuT\8%D-2hɒPRT/V2 f#ܛQR{̝`;[݊b;g~sk}&v)9lǟ~HSQ*]?ǿE5(9C$?ky":P!!ݪ0wDh$J4İrF񱲞,~Ŏk'zt,te~ AJMe )d"(Xs3PºȬMY v{IfVeYXuXtᣊ旻MF;a #,zfXgY#H=c28THv r i$٦<|NYܑGWa%q7^ 5$V ߫'R;OL EhtiWIjLnsepSC>[_;Q`7."oJMao&w-Jʭ(iy(YA1 eӮP{cP)iS>0L.5gEŬ fwMaft$:şkx|2١6Q> rzyjhȨ`gdv=mfC u_ ѾG4ax ¶z9@:üaX+#RÜmXzڛqDsfrLX?Q&YDE 찑AW;N کB]G<9g=ہz~a r 2YHd}"^rEi)63% S]F;"oUіHV]ɻ֝`;qh.j-Q"DB@xӑz>^vF h=xR{St>`G;j<;YLR×f</-6V<6lj"$(0;ضKzkf=b.I bLs${M,n)"ëDƤ3pk'S`>3i1τϑ0m#lk \n$7H&x ɻ=ﲉҦk\yuP%ƣCoFd_y+9 1&y\,MyPr)*H8t k$Ȓ#Ï|O#^D2o#{ %$ӟhx $,,nȓnTezGdt{鱰#,%%$~P<*Bq<#;_L{9!Yy4gygu+$冂[sO"񉺏./X3ӜH*}p+'N "wj) j3"\ah3Nf[R6YѽLO<.پe1Nc|dD,iW$73UZ&PG#빋rّo\*He[JJ(fqS *7@ /LbD~-c԰!H"0'HB[vr;#Øє#bT}D ;BCTN(GHk_`4n2$Aa dM>`Cik(]Bw@D*Y>;S+rr:TP+=e.w:䞋אָ?,i~TQX~<-/s99q$\cQ~p08 QK%eAY.}^r[90w~E\q^ dݎGEc y_^R#WD|xw+Jط˨NīϴpEv \(DguYl(b?wxͪnZnl4h Yz130p4WñXEQ[J<ԪNxuU^НC*JC=JFwXgeD-lD&e̒:_eT^ *0T>w<|0?;jڞUmd7A.'??@iSZ,ikxʸ Y}jYRG\XPMFɲn7PO7t jjpнC˯g? ie4$DЊFOw ,a۠q:T~`PTPCQ{"p`l<:1C"Kͳ=R u5]Wb#ݯLld.6lYU@ؒU, #>^epJdC=h7Nf=䚩,$^p$sr0вb 4|ŀ4_BvnbGETb<2)59<ͭ;Gc{çv Y )kTk '^-J#$Z p.`=G  t"!&TtBnz@EOXsGx>4qi(A0Gy )G61 \P?)Xy  cF ^a0h%=M=dSR7Go$DP})L۱|{{x 2n7F6Ɣ ~ݔVs19ʭ˴O- 0qBn"˲mqS+Ag΃HC2 OUdA.THU u!S@-Q `vOPn4W`X{d]drYVKԟ֚b:?q¤H;Y b!6/~w|*ޑS|ɖw=1H$P`MkȌ*"#Sc'6:I+%@SN|¤a_8 \6 T1>3M袜c̙WXbcIۏU-t![ܼSiȤCzˣ=YCn$WxtZ؄/$9OCIw2̢,t=31IR@a0'` 2qS? p>\WG"^-ۺ9LϗEM5B}4fwPD) b0aBIp 'E%_.gZA#P),)T'a+ ״6cl% `TVo,˺bkrofII53 2̇w "-'dߧ΍pIC!zQ5{n,$zN0RU'Rd.YvO̰ ? g[UpB^!O,("]~9uuTs.v ʙ )yKX%8AŅ+Bo VFzsUmfMq?u֯!п4k? )w1FWQ16)_'bōv:des4hY=:ot[q0]}΃xwXGX/{EVN(Yq(.:JыzC;  @}4ED6̍>"s?? kvk@@- RgT4s!we[2-+\>5[3Rt bS.Tre;wJh=,J||:"WI9 JiA'AwXDʟVz 9Ɲ%l@ZƹICT.*X48I#GHgZ:Ip#qD"!2IV`<>PuP_8MBaC=}fQEYږ8mY[-bu/;O7'Bm cL@^&;COrLcQ*3cOS :}T{ΠwD[PE̲}-#ZPVkGT?tPժAxPBQ5|ɵp!> { c7~WE+eBCbel,p/b1ݥL]U{jxOs%䬱/J~=g̃>jFCn($R).uDfo&@B,[wK "({6yL 4\AIn&2W UbkͪfW`vlba 3f .ˡ#R tJ&Ho*zJhN"EKfBi0>5LWhl>b(c`^z%ufKjUJ y{7/giA3sì}&]yK#{~HLB3at8{Nu=\gZʩhS׋kMKVoɼ,>#/bnp+qJ%QGAWe]zYˠy#3{\N.i;2Mu g YAiTH)eQ { kغ""T5P/ծQ 윥C r]Bמ>DȞ3i6,:SuI4W:[>gʰ.51͛(r#yͦy?QqzmSEFB6Vc "{꺍^:Kɱct;b0k[ޔgZ;V^ 52&с `84z:NN%:|3>d.J{Q Mi,BgFi[U<, %k|s}ImDq2v|_& ;›B‘ 2r "-XjZ Y-HOtn_^`x{)#\AGQ vGV"K 0u9>IT2JsorjGY~,eAAR KX׺d/I=Sr`=8D' :e$^9Z0Hיr9c ATnj91Q^CU,RYwgzU+#IVPg`r] r4/[:Lh͊/qZ@*^[C{MKe)|bԱoHuk59J~55UE>k>[S~!:qh>Rߐ8 qY?O}@ 18pǽ a|7C` y[_>4/SEVJ,Ш9(FB&c{c_wW*PPƌl*()SA>ΘI֣tyeۺsRyRpBܥu'\L8WxI8K͇~!~=`jbxo7|:$hE^ Rtȝ?HE:TȲƑ NAF(%P>EO"f:xoqָTyn3'Y)6^);ɕ3?5$-S 2* -~m8-]i]ʝFx^ < a+͏ۋʶ+Ve>O^[ݤ@B9-OI8A˱WRb&3[ =++)|gh[j @C]"ep ƤBH_ņHj(|Zq1 Dmʻ(*~~#_RcXr?n{JMZ&"c4EDeJG tQnt*=(=2Ѐgt@un{7 G݌4hv deopL4\"zNO,>éc\l v _NkR @(Ngu]DXGc͛@$5ۣ^g -5j@h)~qO"9jɋ1-T %bpEY΄ؑ~ڹ)_p?XdO߅e! ;df^7b(n 0^t^v%Iw?O֝qsPIͯ霦@.=lETr iGz:ïVi>wME uެՎCp+Ԓ* 0KTɹ8Ox#q9BꋚDf uzj꧒2ϚrE0g}-̍ 1QL0' r\} i7I6\\HQ=NcZw[ Bʫ] 调dW'yC.``ACcޡÓG^hY?O?_??!>~?_} ]"Y 2_zsj@ ڂ}Šۏ*Ԋ2%TpuA#o"w$rA81((:4U^ (#r]?ɼg xAxQF%v$B*}HPM!&.Y\R$IQyV%nPŒYgD@1O@cͰy&c#1Nl!3.!q'{XŌJK(g13awRA eiGdհ1Ȏr)EآHe7 7JLc= =|>D*xWI;E}j_8Y"*RyUXa`yANnVVcڠJ8JUߨ)o3 s,5cUܷ͌I`}_wR%8tb F`"0 J?b'KPpBtcJ+>9;cqH}2A}Xꉬi~ǯʞAHKM =,=K .IC}ގ Z;Mz~%p-mŎT!J=?%&fuMB%e?У욘ܩEi3Ogf`J 9Π3'Y`B_6k&o)  _TpJDP%cԥc%_&L ԓ/HkN(wIR¯SzS1ZܡZsBk<}X[i8[9 ;΀qC1`0Ēy&ڰQNF 71f 1j; |fܹRCfρߡ?Wjjcd{!sǴH) 4EW,i譡sxSOJj *,2S5 f  G1COdr bևn]xyDH'zdqS**, _Đܦ-3@s=z觯ڡ?(vhJPԔbޥVEb$PV$љ \]|/e ~00 jVAbH)<">Pg@237[/φ,UDr7q"|h4@#Źáq{Ofd&^<'HBNvX_/SE,m c/|IkF}tۗ1a,@~JSs5(?]66qOkʡr4l$F ?l=Ekխw԰:Sq 9*%{=c8x4jTɑ?rB:t0oO۠F~:Gƨi3ED;Nρ-!r'EFk0!7]C07bWΣũ4[>xqǢsb^CӖ VSţr!m+7RPUjxK#O=ι~1X >2\E[I08Csd_` DϤ?!ȱ܀qPMHQ{Qt@ˁuCkhh*^~H@RkIAU,5 6Ўpbf0 z$_Ff]ut秴1it i;v e vKw↿k@Gל01?,Ukw,wE"ӊ$ǴhEfD|&J2{Y+[) x Yj&IjRh4ld1"?E10h 1L]X .+W>qU>of ;! Å(aϕo^d/cPkғݦOoai3<1c &ϩ +5.j'놚A db`OÔ5el$YйVŠ ɍ@"P×Ⱦwê8oǁT훪xu>O< ?@Tj>ha(@?qWm d` ?Scӿa_i*mTmtx:plتUk5,d~j-QJJ]bnҾGc/*2z2jN/ 6)zC܀Kwb%J(3bm.[co)yED1ھ{x* lnDߋg \RRSC[n4Ff|mKJ0vS,E!; 0 \.ٗA$׀tȏ+. f&џ1uyg&cCmƭ,-%lIA5y{wBc]? C@XS{,6u tK?MNxëyґ*|uύ>_b TZٴFb ~}q'Z:烨\(z)DplB :IϿsra3 Âő"elRGuENxq:桿}{~܃/"c`S[5$WRp}- A,z4TA9 $X<``= 7Ew*#g8q05,9#:`Bx0 .jSkh]_?  h5H\W'^>VJdŢkHJT":OAd~yv[ ցD+H#D rmWAD`aCq=6Dո״>dSe pZZPѠHģȵP2"VenvI"W^BtltT[{B9Uۇ7 ztD-CYX&vYGP 2 FH3Q L&-1~IhTi%)$E^70$lQRAcqr]ii1#͌ uͰ zmQc͇fd|g aa \!6EUIgfش' L$s7hhkeFKe;B~xx"tofH"h|3 .[+G렩fȖ{븸dQ6y eEY)|Q8vb' Df$@Vt3t4:@Cʯs)w_./3(X"}s\ 'm_LY{Uߙq@QoۗwÅǩR$5Kp;/O7Uy[ǹ7,rZ|+6Q)C3^u_~AX3v:@4Of . 2R-+Gھ٨!ւi++ 09R9'|Ef1v]tYz=i͠~*_Rt<Jp&Ό ގ'3*A6rzLT[YRHMr[L ?Z9v'%lA 4];͔xX,l *prѷ7ЯXl: P;.4ލn]%?zur";7/k&6 Ѐ}Q,z<6Wz+2ex0px2%t|Z8욚q-łD<+5KO,HZ{G^Y7 lYf1xv 3@5'V0s" D;~(ݧUf`RRQ 'v n4MhL-ޫĺ4AͮB_&\.UۿVv݇~Yee&o!HY묿:bEsŒD`?eqj!+1M[t5fZa-r?P"!uw,6bq*uHϒH]Ko\d)GW _wܬ~,d;apG$a9(#RR> `.x;8p6Fr^P?G}B&de!6)Yo)퐦vZW3Sȱ}\J! 7;feuc s)4>R/?nBrQjwV3#/WaHGh#ďmBl0[Ĥ4AaS{Ygbm\Β,(I8Ϟz"|~c*#=9^*6Z6q8q:6M=)m]EJԅiGRf$픡,RAUY'nzy93k< A..LLh<0~0*4|;mb6'w!#m6ݰAC^E>SuZM^k o4Ewd,xyaoC$Qd/+[gt=sԏ0(r<$tSK^($h x;>1K8kaNZDi .Y%Q@E+]hYufibǚFLPidŠҠ5uKbIpBZvtaP8Uz]Rs~l8ۊbr*rj)L:b}aH.N\B6Pd"iq{VB|4,`;FPXWSL? G4}+9e 4?\?yƲyMe~J_A;5%;@N8v TfPbMHfTWcM<ʜ@R4">$jzv;cHd!rfp XV#<~6C̚?^\Q')xoHf%rgЋ2Unm5ly"z "ҌB݊'jK odeqyj>=v x dS#n%'Etq! bTF T߰St`5Y^mi-V,_fΩM$ UGZ6u+GF2ME3>eDD,9[z 3kz O$#A3ZtFXs6K?*@/ٹ~`:0DШo:8 =<\q3,3FhHK/ ߘCeC⩣Ě_k8S{o P`q$n CҕX鷚\ңehuIi .tcOCӜ=gfZDt%a cֵnu /hGJL6[Jѯp[^U [1lTBe9\m XӐ^Lo1;nVJS;c!'5Hq`YWi X]OteV`~SydRiN$q:X{aHdwS⵮. &w^ޞJ7%<>NCHt^3E"( ȘI*HW»VgV\ev]ZBvjcAu"${y̲.RYrz̪q"CP'GoyBέ9 W> /uRẮ'="c?kwy&i8*I&rPN$T@~ߣ3Zpޏ*_cGu֫ ")Z@PY'p$!3ɩ3a㚃¸;f*=5Qnlَ 31#rƭ& af o,Sy&#QD(ZsKrR=5'NOw^:ɴ LY3Ec7]nq{ }*y3Z<\b n`O/hkSN# B&s K+Jߎ=B H#hHL όKK&9tO<FMsg{i,u1h#3!|lrtﳡP V5`#!-SOaMf鈇Av:SUύv2E<2QO겜_D5$Pյ):B"~B\,$GKy:<&›cwdE xtUCWx~^;2dwU AUbF;-LO3ǭOCB,xd7Fu=H6uaxv&28S_wNJ)z#!5vig&N -1$2noJ8!F6iwt#i ~&\7tALW"%A+7Re@,? xw6ʋQ72,g&~Xdb:^U}YE%]Qѿƀ5/E_Q;7G{dn о4< lvF,,J<.f/1r]EĻmoH"QgҦ H-+ٟ w~4X%[ԣŽ Q<IbG2W ՃOߎԥbه[t-yC*Dp1Pu1!̞S3`E !H1E t&3!cLmx| !BCFOJ8mEf *(4@R'Ь*m .g5Բ`YYqD;s4xr JqAĐyӷh6&ȆIj1tU(xq>NVf?x.r:ºFlxAO7RXNDq?pIV΋cb5+\Mm'gȵ %{jrͰ9o Jfut[ډŰJZx+YцR*{YZqXݍW)2^,sT$o (O7(M1 >NPpBM}((?ЛZHZ&eqrAmisbc WHSa%&eDA;_r;ɝa"nkA=ʇX'ݛ/Kwj>hZy-rTjhgPәz3<lSLP 梊NL>҃Qh7ty<ȕ#|a@lT\ \1]L@"vjg-u:]yp /4-ͨzĚJaJU*[FȖQS<Ƿ2:]Ie:[gmBQ4c`u:JHȔqĘ< Lq0E;ͮ d':v^}݁˭+bl\- 7wPH}W|ϻIHь.J4&w{ vo ˧]3Bz#^VIiD`T@Ñ5v.7 ʾY1j+{taL/>evIћZ qp (8]R d"Չ0xNa$x`nH}?!uGS2Xqs!*zJ}txw1b&A!6`ӥET#$vnb!F؉cY)4h .0IV-]xhl.G%WZn#lL8>)6vD uUnD죛PLςQ ǟOӚ8\Z]xq+==UUR핇6ܻwBF/#7Iz[oZ_\"')c@2  xNTy(D.TGEgfu%(ShYe?_IHYrX3i(-2M((ڋ)Ȇiv0K{|}f6l ygjmڥګ3nj_@cf5y)rXO!oqR >C+U9B4 m7c{k}\+cd]c)<ݼԚJ4uؖhqo{$EHU4-|8=/&)/k9* { 3hL ֹ U*Mr{>7pK`qAx-fwt::sҷdie/:R7%6A z#ح@=oZhmwÜF> _ƚQ}pXz:90kӓ"EJlL錤bW1oHe*5- .AxHiDe*)yTlJ|炋dÙ`%a=Dp$<+ OTC^#R*5zA RG\FYX:A\晒zcF2Ԑ&w:+*6yq*m cwvv$&aP3 \ ~}P$ GP %_ER<$T;SزUJBRkYVV76GX滦{(W/w-Od6F |9.|g`0Й8~m#qO! O-M~,bl,>d)k*cLѤ-3r!QJ?gBczs'JS"ؓhbP>E0LW {rVT ecDRg #]Ayzn5G4fh+%hu. oHJF}kf8uD5 D0ME|2:)\ɨ{3/24ҥL(P~nMȉٗSN>'@%k^,$QPNr/Vaο ߽8.nEr^N;blY;ԤB2% 04-01Xl95IJƥ-ۢdʷ2 =*$p'Q=&K|#WDUE Qª&QX©MmTiC#J6Pě=POw;k\L7p)}. YQ4|WҲ v|yLMCx\ &g6%ì$*4kK"VlKƂ\0Xo v9)̥}  ~ssb3C?@, uq9: qﱜJm(RgBiӆ)Awo+qV\W]0JʷlpUcP e t?DI.J3M$\iaYPm#ߵlA.M^$z*Ct e4iauB,Lj]uV1n]@/%#PܬYT.< }y1H']4s/*T.*'O/)@SA(A4$%V-aYa$ylAa4=nDp~'{s, j by\qUu<` %!\*{-\r2K)#_ܢzS&JGgd\B8%~t $kE .ć Uo ()&W׿>ȍHQhO|r ?`O|N3dRƺ&IQ xl'ܛ΄(4)k_qCi†xLjc wR1eziPm*}[0K~x?㺘;Cy%!$Sd?Gp'Nϒ7Xd+;<>M@~mE{/$yԃ ":bmT^g%ϝʕQ)Wزn4xM M(@i"? ?bg)433="|\ڡQȏv$d`=̠>?R A>5׆֥{¶T-Ҁ_ hq6[4:0YH%!X!ݟ. ӌt)t?AX|u<~NDcB ַlFx0=)vğ,Bް 8HPcs0 hFN!,zW5̧sB^ SgԸ7ʠnRNEE@ 壞JN0V?+1wTuD5 J4u`tj({#r%Jڌꙇ娝sBBFJ-ęrۖ]9 {]GZҗ`>$I~ c#q|EG_sGXY{dTC&~eRi ` {o/F l怐SzJ'}\ R*!CL deo'`kF,?doB# \/v}NF!nif3/sJ8++AK˒"=(eի>I^EyNJ)?Vl@)Ueޝ6*)t.qN%1!Crg"sի(UgLuIN{ %,ĆwH_I"D`G?,<ѡTme=,Q.lBtBYE&{csbk#*r4!Tj+6ٻp؜;RlA=G-5~?/^esƾf-x3J@#u{"80 DQ:-IȮyk(%쥳K?+P]; Sg2{^)T 1@lC-$gh>E KYb5é ޽lg&nAFkO  '" \;yHÅv"F4sqbthY_BLIc!:w[n u؉P(>Dצ @EC(fJM)\X'>$yziYb<P` S$k8n ĮΩID-%{2@brTWdr<\dZ"qٙeJJA-ZМve=&+Iw O p]ҡt\A=GkCTjiƧᴄ4d`Ŀ\u^E5K_k?Em6 {G^|^y+/u ~!ai5Z5<$`(O8CؽG "I8qM|DBaRQ&y?h)wq2kl55O~kՏJI%[̓mB 8quxPg0 cĎ Ћۅ=A#}Up( 8AZŞr'+4Ol4qZ#@J$~  /$ ?@6)ClkU'C1WYR2L+"'D᾵Hgl%V)ü}|sz^c^WhZ[A?ԯzϙz!塖zUуh<~n&N&#[B~@\qp߻I%jAU̔֋O=lFbZ+ !k#.dQ y?z>t= x(4s2|كvό?6^#$ y5kS$iG=tdJ}K ȽjA-hv/~UU{M"ꛧ~2-–Tk ^ڬ&f #>,4p![<8-q*{7.⍯JpmmYPW P`rЎ=%TY;8t\GdUGZ 3W0أzEB@q\^2搇ׯzH׷Nإ) `"a7y)@1TςK &Ӵ]8P˩/=T01W"7zt į Q=(a-cu(y 5Fkȧ%RNjC#<nφ=fmZl&5V|:.Ƶ95 hfQW=-93}Ybi ٸN,Q/--ș}!sȆG㤬SV*L+vo-yTUwLjsiZ馢I/zݜi: +R= ߑLf!]"AV{ (%d]YW%UX}eZ~TAѺX2za]ҢD?%K\l% w5]Bb1er{Vt!g^nHR5c[2lbRH n[?TR_ܜux`oA64 Vu:Ⱥ u|6\vjy\cل${􀰟chO;z\ωEfk^I.Ր ?=M]2H ;&AU' Ao%5Ҍ!l)K\!6ɡQܙ2yEF4HxR9da-R!=?hلh Dܦ6#oXdP) ը, |d R{dRl Sm<&xKnp9BF(YYK+OJ$s"S~*m[1d#i}K״G5-5 +jOsNLW;jfmZ#Hl>Nخˣ"c[aQ)&U"s 뜓Ul16:&;F<=}5<֬C` xbZ B|^7Ž?w7OWkڢ}OI Qz"{/&X$f a6#du rQi㹒IWua]}RxsƓt=w[d*9[?ȍqqa0S*.*o=| ~jj5yElfǽ)gS$4@h 枢op9Z,3IA3_ZM;wSSbn9 =͉d+f5G #JyP#mϑc.9ue:fA yomIC`SlVEլTj#z>(R_Ժkn #'}ʶoH>&OZ@啔BwCf+N+uF{Dz b)b?=uUȪ8b:x̃^/W,p>fn?XװqYZ~Sꎠ!@qC]>Ȣkt6K|QLDN4@iApY)1ˋX$hfjkGWbR:#?! r0e@Nz+Kję ׫!pkU=B;?[o!Ta2C({Q=l3[ƤzSI1F>czyyB[A?suw$B+T=%Xb _ƃ 0È/ǷրA1x}nh{}nݺ)\,\+FF24h%|/:=?˝7ặE2kb(/ #),e>P gN(i掬-oh H≾zW0bF0i@&ބ[z{?vtȾ>"hcX:v0ѮmP O fhPk`]mKa)j] {4FZʰ1#l-KBw o8}Ãpt&da iޟ?V·1Cy>LѤDg"\U}B|r|Ωn6{Q ~w6HE*nemrXWHmXD_542,;_yc=o~??w~BNu_~/_ß?񇋻_WH1B/;al}#&)m=K+ XVI9-*+䨑kA*󙚙gQ{cZ`z:cTQr>Sf&e8M'7p y\(a&ԧ!Vf'3fm:jƒڠJJi|6E#2T U&4 BgV&9_;WM^ђ.j@~Ef꾉4eݶjAtJ(4RKRYNe>Vm4/;`f >َʶbe-r{^ϫK`<mn ϱE1,7I|xl`el)tSՂ:(,ePd@2CfBa?[.R{ܩ=GW$^נ!o︔| { Ѩ+f=.`O]2[1qiB/ZBdR",q⽯ͩ(p^TU2gw nfc ȮwXsw = HTqQ F銚wg.=uvNh~{o-J~7bJ`"/GH)?S4VH/%wxael{-{!Hko=S`icSSKy- ;@e" "dzӆ?\pfMjR37*E7\6tψJ30K,͈ 16EA0+j`RIgղM܊B~cJ f1|[/<X3k{_,{b1u՞'#hIgհx\α!J`hŵ!:~츍o`սZ:#8s vԑkP?lg>C(ͽ F(1ŗbk,̺ EYj-Bh %L /9ȑ]U>A?`{3WӨ c1w?6a*´us!'顧D%=k^ .*@u-UKZ{f:y( Qr|6[9g2V*¾3aZVj+E-znɽmsӝAߜ$g";X2w ęލ&ZwK!_Q]_4!4uSqB/̵ةH.qSQp~k}>+t!bRRA骎B$EW%D2}9> 0A[)bj,'-漷ffLH@0m̟Fbf2Ɛr9Zӗ9Dơј /(ex Şzۯ/޴!m@N5|IDLaN@_ìQp.*:ݟ4p9gV4Uׄ؀^Ȓq( #m@cɆC58AEԧQ949A6RXA3r8/Ui䪓BCAfGz3=GsHgo 8{Ғk`ygJKj:T a M*'SW#1" S;A7`)6;یQi5g)d{;žGuV9jg@Y葍RV)fS/בHr ]L\1[Gwhrx{kp֭bxcZhD==VlLr4DU;x;F|\Lesݯ;d4pEWZ]:hAZ^'Rː^ O\/a=KfƘMrh4a50Xw'U,=_ >ɿۉaǷ0X{݅R+TқڶhHƉhD A _P;T?ƵϾ:hLi&CQC dgE*Ww$ k[sSDem!ڷݐh쏮3]m]߻dS϶ʐdO>޵}2kdOO{g-zuZ]8 r0 ܓ`&{Ci-jޕTLxp <׍$6"?}k.H́h~mϤ:3@$ 3@ظ]yk`y-K("4+&Ɍxp,yGA*<LO(x\hsx08VrpSfoF8'O$ÖFb#ƂMw %!L:SqSA(ܾ:6I^jC01}|&x|Ȅ\6w-lX3 gS!yLJ0B5\uRO緹U\v|p*wcKZa) %@b$sb (=<6" ,ze 5gnMZ6lts!\exX iw~ÊnI/~vP<«s\)@NI-E'Cߞ("ѧ 矿7dܶOcPNb-AGzGUhX,- *P-vcjb=3mӴEuF p'jjӰ^ |1s"p#m60OUd2{(^ Y@^JX|(V|M.R5B9@9o1g5籃e7oL1pCjtQHSm@V]ɭ^ ׷pR^}/Co ym?+1o}Y׾M=S>Ąm /rwRiQVq/B /7"O=m\nۊQp;H8eamb&hԭ> =xr02 aIKuhưm'@B%f0=@Y_LN{əqP+>C{4!0hXh^6ٶt59/zDzgjKAvMj`}gMM$ȍ }bw dM,Oz5f9$3Uz>&<\LjAfkúd\VnXݩ?;d9Dz @>uНzv1_ڮF0>v;O' qzG{3>2vXTjíV Mpǹ~ ϔ4 Yn[in$)WL~ѥEykB#ԵN@ @@,ު~Rurm5Y.1oq'Ah Qê#nD_Wo nr3]ý8+i{5Sq(f{<$ɼO=/ʖb[|]TdDW7 2(tNC. >stream +v *넛CJzl>5y"`wO1j P%($m@!(c`aY0o ['4r"6=76 Mp?C;\Gi0w &ױ ̮#*J3FΙIvE58A+sJ0*=8SBedZd Е5ݷKlP0a[}`:%(k2t|U dO.S n;J~7&0ʵ-hy jb%*FurwCf2e="T BdfN\#KG ܤU]wR3B$P>}7jEetZk:咔NeG beX [6A4C警Y'H m2~4[B␀hݒñӹ=̺ۙ9-z쇒fL8H_F#Qz[*ǖd?386:%Tю\Z4S4c=.G,;u{;ll0ZXs>F"AFU(v d;v=0",Ĩ:֑Fu"K,Q"u<CzHPrǃ  u녙^R<i$&"4y1&ViS:Fg K|US#gh4=Xu"r&9xWa 51GzX~tgIdƈ".,n6`bQyDԶJί߂Cz @+Ej2^7] יAP!(5U\]H_1Vd)d*.fKřT8f5o2;:򢁊{h#=$v.31eZSv})dyD7W`{О6;vɆy;o zcga︶BF))3v&OFEj*$NaE;aڎ#&7Vw^A 序.KkH 0$׮Mr#[~l^`@VH>oֶz,TJBz LwyR )7}+$]@'q3 CL'iЫ8WHKW>&A5ȡ=H MZjmU^=t5=7f2)[99kSAF_ʕRn'Aj*y=8)halz~ɂؚwbVF 47F'$zf 7*4(VQ96fnޏ\z3׮xu87G@݁<@ߛAI~^|G@Ԡ1B/{q!͑] /!zvxKص VVxe8-dLޥ T`H D] OEO.;ʔŦ~++:]z~)2r!lg;<pd0'ׇ DF)j]6rf,;*j Qظ+[3 &>+﫩y>qq :&L8Ό(:7252:Jmf ys_PlW#5i:Cx_T$W/@U3qc*CҤ+čqI1[s%H":=%gz+} ܸ哹D\>; wid!.z;n#Cȸ1/~V#B(}:v#)GޮtC9P=_LI-˳/ozJ:s=tɏLtGՖ̔d'}fG5r$]1C:\ Ci) O! áMә] TgmU½1_i{}UΟĆJGJ(&u:BK2#;D- |\fsٙ_v´8Gy lPeͦDQ{ۉuM".w# S_ M_ćpLl$PccI+NaM2b4$__ f hHT EEISGG+"{>a5έ>[Lv9B&c|_Qs/!^e)PSᓨ Uԟ,'g %.sW>O,iKfΦ=tEo}2xzʽ/k3QfV蠖Y9Ńգ' ҆Ygvbx&bXSY`=RhC0,FV\>ѽ$Y[ /6[lMz|=&w)\Э5w}^=]3oW5|L> zd3v (Io'p_b#1OcP+{^xº푱:bMձSID8 # ю.f`^gu{ےg"&Z}۲QI`>=.ND~pp18œU X]mVดNDbt@W= q/ 5|7Yەsk*C"qY_S \z2T8A9Rdw}$G\La%~"__?i坈t-M*]nϝN 꼚:-|Fu1߉V47 Eӓ>n=vǖ5+ARDh*uz*T҉L j2PLңy/Et0L;7X!I.F j|uD2leTkQ =ɽXF7<eUt6juxg&gtu,U#h]_0~⦓O3ch wH .=Sz sz&@c'ʋ{:B^kn2*PsJI⇪Ez+JG6kRA'dK^>±U4+sw:=L!(Am{)Y743t۸N5^! tlkD~6/-vYQ`Bag40jY/r%Tt) 6,Wo;,aR$M$!7V/a M]GJ9wc\(P}(9w0 MAtN׮ PHle|"̔%e+*tyKD-l̘ID'L^mƼ`&Osy ]يb!w y"+S mށV!|>M ԽgLZ %g*-s:Ӕ|\W@&|JеxQ#C{ͫSi>Fgzf ԍTt-Ȗ3-H pkl m^Ca=G\vg*SSGw`2ḓ6Tb#BCyq ~UO8UBf9uRI"ʽ.Fݳ?0BB^{  mq^Wd>.L6sh `=9 9B Do ^̐ľg _ጩQܑ\se:RzĽ7ףL!@(V"\}Ha!ujQt5@{L .q Q }\]=#\B̍N8㦿$b@ ZMO@zӁcCtJPgbIu& FjС^ݚH9)?ly x{H52Q@@¡v >gXPkj\|mt825"ec,<$/xH jd[($#q޲)χQ;V["h+ڂ)ul̸=2}\5*)$c"_L)ߖdvCb<8'|(߳ˢ{"e|Rn-l_(Pz;#xf>S`Q_Hdz^[@,h'汗90se;0y~)Bw-]+:hfa\y "&$L5OzWC ;E,Z2HG7PC}ck \x ]jQKnWέpZNpe$QS>"@/1RҸϏ%Lyh0ʪ>[e"c=vʄH3I"]Gwirl ȽmPcO4Jth~`8+7}9>4v\b^w۪`./#75*3V~~-~xRdH= 6uED FeY-p:Wdfb 6dO#=ZׄHǕٵCG: 階{43+Xݩ*gkrDrME -2[:xbM4լ![# km<ج ILZHy.8!AڴnZ Z=s+BYO:sn5E QABhP{&u"j=s;f-ـ (YFj̝5K W KMBc[/=CWt֒tjv vkDͧd#TB;+4'59\udPJcjȷm$Pmz}4Ce~)y{Zn `Kia+{X֥T떇jph`V1>)5Dt޿5~=[㙵,h+~D 55y>ϵ-^?KwP;1@]iF+s\ʩ>?괴[ml|lq# çOw>33:D DYƴ4& 9ڣETtn/;3cس[aLJC[cݮEH41IteãR|)׊q}m[2;=*";hV~na<|n YBey#H`䑐NpEVmH7 DdsxDI(=TQ? 3%@Mzщ.q4\\%rPؼZ t3-MR&'Q< ĥ/e-!I:L@WX}:%T8aBI o.W0 ńEf[E}fo.gà4ܸpSMPPt^mם>9٧^RMj2 Aȶ)4buBFQ瘡Gz `RPH iHωbNg˭ Hx8L{l-a;Ex˶Io:^'CkE5XZ=2qo7Y6@&8[cxy=Lט3yv\ȈC[߮5DQis/Pܔ1LN4B+*k}nȄ,ab>yeq_4q{nr{7^k' c9*yL$.?ܦ[ܳGRH%% >m$ڮFU襪Z/P oRmmN2׆E lqi+f)RS]|^WpQr30cзSd|p$cpn\q[?wZ,"f LۇyfeHõz.Iaң]"7= -sk=+J΀fTbZΜymd]Iơe7 *ƖV,hFx2uc+@rLU-[Г+,VZPۑTiY ӷW99%ɺ{KFLޙFvnA m8Ym2Qչه\>L!$ԁnL6 ;ZY0xՠDRֻל|6GVvh )gs > sEwm,ӓ7AIHIu%,2=]Җ[ Z!-iv% _P!Z;L Qʳho6 aWrmVz`X 7ɫ 5ZZ>1tDߡ*t[(/|!FǃBt>L– jߜ>C?k*AVt3M$Ik"5R(mGc7u]zf!٠U c CeR/:[wW~T$/{]SR܈,lY42{(Jm<AO> >hEzr]. M_e\LYʷAiнem۩ UIm!? D3 q;]CQab=*e7O/su mfYsO両q94^jݨAץm]OU \H|lq8( 1&9)W_LgORIxl[-۸ (nD(" T3VMn4@k%wnb9 [L"?޼.T]xkH˦`<ľڮ5Go!R  ԊQ!vIMT~x '$Xfh&bb|cP޶Sa M{Vl]CֿT pjs:n;S{:Q[ߏ΂OjcZ 4}ν;4$=P c՟˰zFGDS. 8=I(ӑfs0He eޯ3m_*נI*-lQ`a4z}OV³iiM%%L70~փNd? ką^>ՠknҨѡZF_{%UH%NB$ QjÓnw⦆ &4/rOE^1{Ѭ=k=QFFΤPBZbhy#B}_@]d:0I1Bm.<5"늏SߖNx1vn_E`4G+" NrbtC8GRVh~>SۋNCxQ8HCEt o-']Qk4T7|SjYat/g==th>c0*9b=R S7RmSUwFW>DciΣ :}䴚xmcc$/1~'F,c' Lp:Mn"*eF@Rp&ϱ-Xf~WWmI[W=6AqVUmۚpHʆs`-H8␒,Sۄ0)g~QgÕ]XfMvII~^/ ܷ0Udm1%0nuFUF> ՟(a-T<B+mc&<jfCiIdrע[I&-2s9\1/MuŒf&g]HnpAGFNp?^ydsvPIJ0PK[?^jK^$4kvU_tA==gy86v5}JN3O=j КcߢِC+|y;>ZUNoѺdGX|p>܂59=q 8۱ 4LVϙcԲѵ3<ᗯmxayis[һ^Wk*C)Y׵qOJz{Qr> o_: $ABY4Dr{8^YI9KP'CĆ>9ow䉋P?Ea.|"ඇqLc*J||i|QD|Gt?0$$#0Drw}(\j(#%k&~Wt傶x+%| {0$<shDz1~)gvđsah 9[Mg-]*.\ ^(a5}ݙ'X!ڍa< ~|f7ةY>o৶+-v`ayiL"F%^EieR3{d>7tJi[ORP7+c`l~lQ+oU">_ ̬|G9$[;Qrzj+C;{ic\i+}.VO+ml52 >7pύz򭹳{⛩\$՚+ Qg̵(? 3 P)}n\oe%tLW:y/e#W[e2Zp-ȝNB.0lYPgIEʃyBoɭ~?ۿ7oo??7oY_ȩ_~??pq /z%>o#& !iz6$^2'+Kiwɼho|R>)+dN d\5 `O, 2w:qʕ/ztRdE{V>EN!7fB-[Mp@@)7 ֬Zos8&Ow*j;& ر/͇۰{gR1irG^ {^5IpOdפ M~[ӭdHMQy b \h} $MO FM_ -D46:K@" r谖ju+,vDkDM{X4X-E8B(2\$0uJ,O/Pz0Yѣ1Xwa:yGwqqdlF~ήv%@QΘ@{^/zpXT`Ag+Jh<*s[ƠkvTo._5s;hviW&ǠUx(L3Qj~7ufBgz)IADH6F.1WE 8xZ nKy.:Uvaj>:Yac`py_ȋaM >Ohzz\(nTA֞h*k0~jwQ᳠Pm^d㫑c}s]?ש`΀˘?V`| ؅fE =֚Q+5d6Wݙ݁]B0+W¡t0>բM4 { =*~M5k+M{(]a}a/g^*Qd(Z~\=Xj3!8[$ ?! ԏ} F%& Z81]vh87xItO2˯ޔ!}ǎuDOBðlEbzn'3Vz>oNF m>_ÞD,3&@ZH`k=ۭ~Rp<ȏବh \z"/MAԊzz\=`3=4p@p{L_*Q#-e`<+&L'ʲA "V=[uT$aHC4Cp#Da,fNo*P&=<#wXxL5H6ҼivGf P:$sX]fp\ii5׭͘VU+ v[~ÝuqXժm N{3/=&l1{0z=U;*|ʉXs& -ܒX7غ?02YϿ4T*[L9~{54!-4tjkc@ ,ts>:ޠIܐPL:M3j-TG=BU)R[/$5ƣҴf<ځɻC ٤'vp8 ~C[B){܍֡~"O, ZBWZuˣ6߈Kܩ ֯pWٓ*UH|DAsSvi xdO,[v<`eF KХe. n#-Fn idZO\ o}(WLSP-&1=ݷ^lKCj3:JrΠ:˰L{>GRa~߄= yH8zPڻ(>o=Nԕ [cFlR97s)5WRj3js'!_I 詐7@J/5O;PLzuv4 eLfv 5Z;׉gm/Љ}4 5uN̵ĚuuAJړ2spG-Msc_M{бzR{Q4yb6TcnI2t)'ɦPV哷〷2SdHɯ{GK_ vJ!V~PAqj]9,,K;] oGaܹ8`!āQ-U'IMܺf.́}H, Cl5p0ؐimGx\?ҙR}j1@H:Hi^Og戚d؈R_pUq:^Vec/֊qSe {ɶW 741bIt}+tGF EVQ&SGO&XQTew^,G^ f7rLZbɿ`ƴkA Ο˧0$u(+Z3xi܈(!+ }<^o(C ߧ#3Ɋ0 _)6>'֫R^ƣF!o=vm8iwx^Q҈o$rq" +_|.K Hɂ~g~982 ;|[r# 8UP>S'YVǩz1{kYٻbY] u u(b[k[la ST<;AMdkuAn8Z2g'Qn+MGXr@XrӮ ֯Hv(l$ZHw!KִCYn6bO׈1}B}Ezю$v2ž Io n jwoŽŽ,*ܞxK/" }RCMՆF:M=Rgd/ZJWщ|0D[y]q9zQ[<#0NwB ͫ6g *s|nrھlyط"!nLy~_$z$[yq.MdKa;վqmz3}5FJ dOoFFTGvoBj(سycr!3WaL٤g`k`Sy}OղL5 Tź\!8Y EG mPc ŒçC" P`ꁟ]zN@/}^$ʍj\&SO*\Й3*@OH A_!=d^7)n/wke:ں/nPA~2q^PSap&'SkeW}u#'#E#HNڱ8$Ui,Jà_>& kf@2&\ =ε&P+В59~)+/za-n|{^z\@䊝_=܀y&\ n)>uσdQʸNnF5NtiiQfρ '; 6At!OtǐOhTa5&?7#0<L_}X{I39q(X!΃~vˋP0T@T@%,#p%F4HˡkZUgiq iΆşw()CNW`Ȧ${Ȏ]5•3!F9ϙ2_T}kWy+A! SRlu€ ?)7C-0Dfe6'lȡz[sϽN״"ܺ"|RB4/CNR܉@p'h%D;|S9M0?F @\y dhS-|'vlnf9Er + \!Œ`(0NoU^"צn.:Bd9G2quJjNUugWHy^{8hC""he㝵W4{=\z/dY3:LQ͈O$=2@F:$0d:pTWÚRn3BAIbR,􎯂4xm҃1+HUB:kʨF'@@/l{'m /Q: Kwгpi"+7%4snA#eD.~QĝXw@<_F>Ai'4*b g]vY+Vt8fd6a !KF :V*%e$x7rk1] K[73sȌFsӁ K/(}fX"qȄhڒs!ari$ȥxu.;k˷p8lhW(iNuE=U _\&D^GKN+. HW"0zylߤ.LD#YRƩ\ەʵ:T5ŭbq};R>K_9@PVl~!*Da ^?`0w۴^1B4ߎEƁs7Ko~WSZOd.ϠC7H!N ~[3T(Q&o(dm%\(A.^I6{LBr">EH{Q_%fk GrZ$Pr˨teYSo|XUHRTBPuIA2cz4k g$>C%{"lDA XEP~:"Rd͙e`.=gJ^r]}řhh㢅D;R@Vuǧ|wKEy9_iXaa~_R+7%xN?uP] ~;W7 {^@AjP MjB`Z p1d9Fg_s} &q-R5ǻ`<^JPM_}>LA=†KP>2oX }3w;'JJ!+8pѣpM~} +JhAЍg7{*Ѓ7h GAa@8\M%ٵf7UR+)^q#e0U%% 0 $,xŧւǗx)ۿ*^6pkצUwZdgȝtk!Q׬e%NN,?6Lb=I#i" )7M~aZ8jU!vgb é|M^,fɾxIr}AtDw4XF@eEodUDZw.u?%N2x"uֿΤC;Ł :' ;db)p13<;a=لd@DP0 ۰nB/ e@Xdf}>fpKg oJADI~rG"\DJ2BEԢ́JVjIaeƸjə'ƹWir@HR,hZAL=b.s m#55i~=Opj*yf4Hyp"\ba: 9|%]5Q)|j*@Jee-L7,RTEa 6x9e/ el9LQen9_<8_* =>276I9@ҁ1sƠUDek`2G=JZJ˦i![djps l b||f3U6u{6GGf#E`g`:1hUQ1|Im9.iuj/ۧ#F S_KE(W|YPYn%)kg3fWxsk k2V~[c_ 1od v:|O>g)DQ=[Ȧ'y+7mh*Mz;^Q"*BynFg.i\H$f 4bTd*AtSRoª6pᱷ<n:rDEIQ60qq%b| QH?FMQDèIK>)_‰RrɈ2jd BTq{BؚL^Ջƞϱ>HN#8Ќk_ B+ ˆig9pqau7 zfD7̱]y>_޸Ƒ/2P&Gh{iCxOq1Vj0co\>LAc&jlCwDFuCtmdke<Ɔ؜7E/^HFz7}kBԥi,y2O{ x?W瀗O踽t/ ]]f@&~mn+e1YjcDtH'GĤ/S~Q=23G @U)iЂAG']9D;`vxu玃\BAҜLZ.R4Zˀk)m;V0y#X_L W [O ՚O%k硫I%Zg7{P,IKc4p=S2s-V| m'|>L]o[*"_PT-PZz帯年.$Xܨc> "Gbx+W;Dד9-AIkNIF'{ r80'\c _ aؿPbD ]nƽ^ ("tc)G(($ȅJUhFWT*X5X vMC~.)þ.I\CThO H|@wql_ CCۄi a3b>L 77"g3pbq៓yV`^)= t^DRFqySqe8Y56S|u^\G;JjǐޝW3.i:$p]s&DqgWLu0 FD׻1OPإXrD ":սZ];ϽWrbQVqhX@"SD"V\k 7oC742h![Q[ktV4KKVz2@7_:XTwR=I&_D8>n_Y&Ui(+-+w28 ͑p ے]5aw .9ܨ!fIQ'}~*_X0[0@9Ko:?GA~oh,fGϘ9|ٟ>q$wd4egfz]`w#sO鞙;/ ڃ{µ ;WW~ )/(i{փG N\5p5*֯1_ G^w@mdrS E",n OD aƎF~dzJ1@~QX:``LfH_NXq3r (pBDHaf3!ETsdz)DN np\0mfwֲ̽Mc֧ a5:HB2Wv‡HZHR'lJS9Wf rMt0dN. xg*9o B6Ʀ;$CucﻩY:\AF2NS(t+ TmT* i=pj#q `9ѿhQCh-v+W,s"\ψOs"JckC|)XEs01ϖ Jx(Yz\'ߗ|{ Ôܶ_/:-`ܒ6(A V1Kjpp>a]u&>S?4w괳 cq͠ ]Fw؁ uِZJA/:[l;nhK#(/XLmʔ'N_3},@C)[C$6eߩÏ=*bȈ2* 2`̤z"0t +:NB('؝bY3+f0'aD%->SProfViAߊ}Wv0Lb܊tY xWLݬ"Жwc61񚻲i"nN?:` 7hDLk-kj:%O)p3tV#HM-q3/F(%iEח"s+i؂T *ڔɻ&.GN&N)@$ ~5HxpU^`NF'@PlodLh[1X)x]kT>p/{oO+1vggSY'ؓ HH*'DZ^-bLF@,4r>*C$8ՕB+{"'ܕ$\Q[BƗS Jo|i ѱ#{Exs9c-!F3<}O`?UұVXƒ{רL;ʙ4b6"9Flw}K>̭@[{iMw=S_Mב&Yۑ_~WZ dsnvԄ%J`㧔Oh:/b1z4>;O@w`.b%R/GPv47:=yⲲ.ʎsI;QȰr|+O`s"4E8>[hQx)^ P~7an"%(nPn_K{+p` ޕ7K0286J)T*!!9!oCD&e{QN=O;&5X`P湾> | @Π)޿B]-vuۉOEć(v[xOaS~1Xp5s0ju DUf˘(8W;b-Pa4]bW)TUi\Aq0M"dI4͟C]\44QjoY^l~/+u0}t~~}FEˈ剅26'RR^4@^J5Q ̭Gecp 0χ#I]W\=f{3'<*Ž8P&:eT:jXuZ{$4^B;*H:˞+9NT] #) ⴏ1pVUGY1fCń6{Ndm@GgS_X ѣ#RW]OQQny95u:RʦON38uL_!WDiD][Iu JR\קs?٤)BOd;}Qw65ihh0gUi%zTĕp.̍ REN-8ʟ Y >C9l#+$)4#lV# DY}#HInM/y`!u2dkDYCY $x AuL]Ka|@"whV#L+$!^I9Ybfw2`t9?Bt1ʓP܃1"%lJń6H~;"g)=q)twqŕ"CO@z?{)S^j֐ x{O1ffY<;eE7=RIDWTEAƕD$D?"Fb"5yf^?9Fҧį'Y8u =|iuu]gD~2&f'LYH%nT"2w8 0-(]114G])B Qݚ\ W)ic(:iψ/q6Ad qJ|'D\?zICԦ챽ei~ l,XΐFʂg5wA&SNL1[}Di* D1]=[5r>fAjvȝA !8Ϋ yGls'z1#Bm?Ծ"DEPE)#bc"p>hw^}km?j oo_'ШTX.ÅxG c!7OJ 1R 5JF(4\KNH4̋T qO`,ʈv"~k#Jf]V& Z->#j а_gsV(?=H #+ K4!\| GGܜ;bbj"[iF_!%I:St0!gWU+BU: Pw-)^7ZhQ<g<&qQFc}4>"Dz (FgFt<`.O띎jm`h }u)gѳȘ ƳVΤ䦿-F7%v!8C⦶x|x"s3޹&s qw (cCqu)7㓻;JexPgEjؐWylLƙ9Krj T\å{)O>~88DB($ػ>a}|ϧÔ.EM+Bne`*֥6;ۭ *רJE*F2q N:uAfG'ysaI]^p $t ӵHKRt\PzUy4*uiT[hr*gmJ;xk u;k͘N{{?1- g|pb(˭~ 2&j! PSz=]g<*5#\6. ^q 4@WH6cc gLe=YX#k y ZML3]&<}aS5R,^T>(()0}F``6ƨ(J3"( 2xu n(&:Klw(PsAҎC^)iȨ*iMRk`FW 32.yP5& ^ػaHDFRcC~Edo"зK:] a4L: s 1"J%F¦zMв1LAM6.>MH(\j3חE*;jNL>"z,VJܷd`vX\ {&)̥e>ZGNPU@:\Վ{W <ɕ fU_?T}k:E8)Exh( m%V;᜽ڏw-Ȅ$C{dg~ ￧ajڢ7Cz<B1Ӥߌ b΂~%%)`e~յe(W"|Y|R"ԟIH]+CfTSÃǠۅ`7T;Fʋ)ݺ~*$ >H pozSމ$~TE/8}8pK^@MD> o@/W݀~e /n0`8\{}DHFC a9jIF}O ڙvM($&CBӀwp˅߷pdOJ%*eGTT:#y]CCRsaRlx Eʶ`{~6?"#:/.9Q6nҀLeEE職N>i 4Sc ݫ}E%9)Iy?gQX ##I ou`ܣ[IU̞&@bNa,*we"po)gfO$hÐ}i`~U8 79K`@>KrP [r Q;Z;ٻgD,T>OBy=Khײ^QoQ* ;B^y5 Z%0Cʩavhak$hYd[swf-z$t.!%քV RO5~ATy"9_QfXޝdlFsKoD0_i%957-*"_<~uNhǘ>>|f+RGOܭ-6} B^ψG!d> WQ كR@K{r:bn(? N a2,-sZg?YEP7'Eԫ:g:(@LBR̪^iY!bsY&}XA㌣$6dgD} #Dr nu8AIn#n~'̵_2J,/|PPSfQ#gFO,"R< i _FmCCe5ǁkeRq IkE~vcm~XtGCbGҝL]/n H=-jXU^H8-MuxKP' %{DԒ!`2yrJX@0NW(PI,kߗC}%/jm=a>7:DoDշaXf= b#tV >~@y0հegt\6PjŏA[wGs=3xhDh&vOE_y#1~Wo_>YO?Ͽ?➯+Y /)Ӽ,3e9 @ĆoEaѫi,S Nl}0vڐIb]"=xc3'Jc|Fv@<hh91IGYWDu헏G4GH ^(/0c dh\gKwZ^OigDȿ1 h,/b:bFmڰm_}|55 >]+=X1<iG_*Άj>lyz|bEliLF0ch@ XClZqFk 7UAjfJM͂ZI}@LtfÖ \ y&}S1QKJes\oF7E&^N!rCA bQ+'*J0Rwɔ[ I7:W2l-2,ɦ`#P("RlK5 %5RZ]@x)]g0!Qt>d?N$En 'K+mfZHt{PQ`C;GP@ul+abX@Y4olMo}8Kw{߮s<  y?D~D.1QOi|@z/s1`OQw!bQRν݀N.vpzܫN9,DQqw ?+~eL@ ŵc ~&FYXX`Q}si~d)a=;s{WCU[̀pmǻ1b}Ŏuɉx#@ R2喃c޻%jPvD_W`je^)c>4D!"ຒ=8h&|!٫2H110<=INBZDA;1J)݃ц8։ .ؚL``5F3gɊ*UBK~/$0ߏhP\]&JHưk0ŦZ3R+LRpЃ~=" %ˣFg+n@5sH0_L=zڣT?fl"f`:Rb| 1D N,,(Qv-3C ms#S`}$rp[c ͸2\zڕc)@gv?W@R3}Dxل,>A*u#)f=}w'ٰ%hd&kp1>?$zP(8cpδ7ӨnzOOtfD e=D3>OX|^ y;든NBUɧ(,BFXJy%ցL M>hz4L˗[䐯|iA4_gD.pR}*|۫>pI# ! zþ44&~RP>CbFCpvEw s4pyԖrf}1؏m= mv/~xN.C8Q`<% Chd^O }4K!o~ഖWɦycܲ mLߦ)06\n~5"FwYg"Sgg.kA=#)մ0 J^C8f/3HΑL^t;za.F"p;⯡gs˥.*}] ΙP9g{^ѱaaXz~L`<<5.;e+I@[P٩)XF'?3ʕp5 u/}Sx{W.\LfrL/1Na Sw3O "n}gzaJkJI٣&ݳl܋1Kd\kb̅qK|mx:] s::>-J\uvB_Bb?i]H=;"p7U)Uu>0;7*9OO5*ȉ-#=6gbGox< }ɄX#vhSG-ߦ" Nfn+Q]bmϊJuu6?#gbwp zW=㏁>0^3Gݟ8Qǻk0Vf[(v#k4+;I">xD.PO8aDw*r&T45_)ITTNTvrRraLdGELϟKaܽRLW)طF}? >2t৾EI?NN3(dұy}C!D,sNbWSC'Jc<n 3t -{2g~Qh튷Osjm&Llu~}mgӟ`TC៩,0 o{T9NKhW|/b S?Zs"F".H5DPhgRIE07[K ;7C?E߱)qQ2gݤ(E\񁫲R/݁ WֲҧAVQE%SEG1J yze"Hb > CVK(:\v ^N~F` AL_Vot ٵw$Xs|^9uh<8zr/3RB,3ڱD"S ʮ! : tnevdoҪ*!=**\p@}8aqwH ’ e s`Uod{U*]"hd Eb;ĝWD~"X;`:;$uIj"(Fm1.*{]J^.-# 6r ``C' i Bx{hf?>ͩ@G'Xo(1&MG g 1$q ^^ET & 1Q$O23MU{=GcLy;3O^5AyhfgΉr"OOU^#-,{Fˆz&m n1_]?E,к4R|O|yh4d-<5b]}bv4?#Cқ> ݏ;=:B q8膬"_ =$q0 *@pMCOzA+-w5.%n M-9GλgDd^Ȓ(g9@~mD] u]>WA-<]Aw $8@k<="Eo3l0:wc] Pu}tht*Pts@o\Qc` [y =LsWyp8Yuvz~FA9ʞyW^M"`X$gSQpahp> ^oF)B~vOg>AFxV[ PqօĒ"3D'\N?|;DNT5eDxounGx:;/ӂ6S@7,<N8&ɌAʨdSbcPA^U-@%|[@M8BXAjd41ש! qJ' @HGX9<,ϏǙa*#%H~|+)L>^BV[icLįG/xwb|=%q2ED4XfYO،ӜȴNC6nW2gX:QuoS(LSz2 uiMh}n7p .Syoе^(H6Kp t 19T+W= f;Uw7/fWsw=I`v.Y֨`[BΣQȃS:(v~\`~6D$9ss&˶2jȪ޴Ѓ-Ud<6Mٿ!Պ" ~)/POVw aVdtrm$bo}7*pCRx.43dLJM N7"zIVe;QDVIWC -;0`K E[Ǵmo @fcQ?oie BfR.>9*%ixH-?Fs92z]{O#1]ZMZ}_y)BB 52<*`0S*Wiߞi6 ZYRw1,k b]kHCr/d ǟx gQd9XfL«!438\؝Ĭ9ҍcwSCг.k-͵\MB,DDeWT\>9 *IPQl̃1:o m@a@wLԂQ "8=hȱ_) \AFU^jwF6#uQ`kqx`{tEh>O:7l}Ӯ+wY"o~Ш@\r///`$ҳ犷AŻk$iwMdE>jM>RVRH*j@L=n&F30b_LތG':FWPEBpg˸O7v>pk+3l"Lc:XZhf@$m?)1b0|ޱqBkC`'/UzG\Kd@Wn)KѼKW3)Dq{ !A2Gs\6: FF4I2cHO-@\m"}/9  bLɱ@$:%K!G]G}'*i:#wR(@*;@RZc yEx.V%Fϛ~馜ϝsT Hn"EkDL?j=lNb6h=ҏ2l IhO?g*aDZhџ'LD f {AkApmoG[^W:Q"H#CX-XG=LPE Q e" q !#D6DWTF%n@U-/9a%TH%v=Upl6-h!X<~5/ifښL$ R?`{Bm$.V⸦=Hj:=Bf=)l8*, m|[ OuYFgO0J) 41TT*BCV9Rk7K6WMqTn=<<;w%Hso-:V^u {6;t3@ F6s>s:қq0^q`G΢& $%$zH:yDƭE+:,&F5hw*SbPRORDj?2lC츈'. gF6 1< FH0zlI2Wp4Q JՑ,h1NTV "}AGCmS.I. :6<ưrగK (~v_g&( (-^N(3fn5֏W*C{'S}@Vlc8$wz3)ud3O1,!ޅ6q̦j _fȋ} D0t~|9I#eCgnŧ4,#ʌH#?ι#+i;96Ej5X8\sww$K'A#Z+izZG6BwYLj׫ KI!9H@eȅSM?]͛/ 4#ADOO(g~ 5O452P#Mh:txK9m kPi&Bm1􎨣5 x>I3McTr++bSu"<]eno]: '%4I(#W4]]*t"%!ھ^SK(B%b=EVDꁎ^il?6 gP_}u-TT}f\_#S#3_]' Vx` [#1CŻTQrL`B ,8]A ,i8<Ac~4펈~UۻS3}Em$63+ H;t<"GkSiQxuq%4;Q>>kbg;2Af#t :N3;.L!gToq;Z$皭j(uMs$gC gB{-oDta M7u:U`Ft%hwڤtǚ͏ cCzo7n'Ddq<17 FNnVQWzr4Z p eA9QJ1I{I8wiV9xr|bPB#Kʺϕ$Rt:TNL"} P|;~*i N=gK1B”dF9D$펾:IYO=o4ً/<:`֮unp]H 3Sj;u9EީD_>G* _:VG?^ן;^G_U7gA)ٮȂ3lנ_e ]!l[b/_]x 6ޕg_&V;}^yLuətzTZ̙_zMۑt47J=w*VbxzxӐBǮH;(Zc [Yˌi~CWN- ڴrR9Ѱ;33[Zq+_UlRDgA(z$Y_RoTt_,<&M(ɌUTFMQ괋mj$Y TW~{=>(P}`5Д zX휥)t5>ғ)@;Kϲ90p$0"x齣h@IhC7\X!i5a)gd^;G^a0 R.4q{רO"b͆RU"Ly&2_'z"+S^TD$K'p:7D=ix-W4]Ɇ͠:DD_$K㞝D~Bu%@oNΎ dS鞸o3S*vft/ BR.X+>YGU iyXEj jT^VwЏpWAUI~_-0C|/ВCKMP:kgq3у :s TCY}-Po55_lAd' FܱbjF˂OptUl*IB4.jyEz>ͬhj234] aISAzt ;w3(ߠnO LgY%W{:;ľL @v]}EB;{ũ'ba[٫#~qÓc󞈶ةŭ 1 *st@g?"Y`r/*0%\p) 7Ƥ|pp 8e}`UtT{^2N԰KwI?nTz(^02ߺ?`.]$b~OR7j[,9X{C1@䰠n p|L E=65nS%{1Z!>x%J8cP^4L/fߋp驵e g2'? ܯ ژ8sXVpO@P裠qur\L#nXY{Jm0u9dר综? J`pбU `urHTT1[ؾDw] xtw(kC͈>0:L.ç5Li|jq|K"=&l1;ؕB]ɗ J~wh%4DG9 "3kL %oQ_ XЀ75Mekx —V:>T}sdT5x`XZZI˔YZCbP40j %@eۈ;3g[cdG[E -C峝n&\8)s *a OuS 'd Jjz5̰7?Z{֦D&<1a`6Fzר!'\!'c-xN`LFs z@BsWZtv,+Lqd:ʊGwRӳS0- ߞW%0;CCSztF/1Y "n7?+(CUX,/.oD[F Ca?30p+5m'bȬI$w=1VzS*ۍ#u )g}CynWi4:Sf JQ~jd&Pz_@blTżAz M7{38AYIi1dR.AӎL?H`ݒ Z>$!2ɁEA] L; J 1H ^Ȩ̮v^oqGɷEiL6,L>#XԌ)_>`GX iEwCAqk"T#FhSXHW5x7m$Й \+Rgth4TE Kv"Wh֚\99}ǘй@"nBS:=(OT|2~ gwV9~'ů׹VJϦJH:G8,[eea &9eyM\Xܮ ATQ&q7$w+mch#%{nW"?;1SAo q0ar:Vj:mqS ^»q xeHTP\Q3}Dd ;#_^W `jbA@~}8;m޴(zN!(B+z 2i' ~?{^rEtM~eَrQuu&eˀ2AED'I7P%Hol렸ŝ6ҟܹÀ᪸Q~D#D! =h(.U  H@'fF^|?4/T5Lqܥg Q?>Q .;8`«P1E ֣1olGgRHZP4$ԏFs "g Ŝ8\TlS^5C[ 4xEv*)pĘI5DF=MqU;D BIڋX0Vdqk^wP&b̙Z|O>eTN4h3b9ۋ0J:gmNu (\؊`E C?^䭶::`GPP.)[z9XWН-xBgȡU0t ׭uEnQ ՝1{I'臊ViY XRX X;zJ/*-"kyg7n0SV6= m)}IGS5mNט'c|wPTNhj:G\(]&h< o.)~_dsޞbH,rQYr~oB߮@:T!zs_VkZFsl]G4@uQ]ՕArn~0t3@WsGѧ%Jr\^^ X1fTDECW'4e?CQtv{$*uw\!0tH8o۩^n'삗b")D4t<,\zddv\QHhM-vX(?uܠFK<̴Ǖ)e>z/v˜)!( K)۴n0z`b4QNy#!GBa$WC=:|뮃Tn1s;d¢اs_6iE:N2( bn,0OKw7=ҷOm?hYYcȡm&FC\9"+gJˀ bu2N”UDL^ DGIu1W7O?ˈ<ΐc:QJs{lVFǺOm-'_~U~{a䳼7 rBpfYoн4'{8k|AqtbF jūۏh1"p sMYYouM3fBR U4:ݰG^4mr C=|}|wy(?QɆϽTURy.mHHJq. `?( {3FtLQL񕡏##~*yCEʚV#od!ogQLAjk刲#) #s-sRϢ".ziA`JbCui.{o@ۦ,.Gb(5E/<-#!\yXHo NƇwDYnWHjG= ;rX.d%;wb88+jTdi[]P+ D' TH%C$$-.e œDuIL坮Dls$M1 8< Ż17?oPԾvG#:OMkgy{tmU^̮Qy8)"+X6]^=p5xନ(U VzvCv 6z{;lo(jH#EGDm8|2=c綞STEv4 i&UǺKOLv(&=v#.gʺ5S:-*Xڊ*.JM(CmsNxơFZ[ CT,R(Ͼrist8 Al"{sAcʲD0Fw;3^~w.dmRR^䧈+5n[uꎭO%*aP|#/dn2uWeŹrf-ٞ^qqeզ:*UX%y H&|z ɟ&C#Ws^crĔ{kl ݗ@rq* uLp!rǾRWGaHJF"& drt*fh&Tn5gǴ%+ IP)8ȴXu$o9ui`ͨ"%f\::(3i3f<#N?߄znc K]="/U >|n4+UvG@{ U "gG+RQ>rjDđb'(p`ADVtPJ$/ Q m.gy 2VHP&I9]YvkNt,+sz {:EϊLޣ(2cN(,q*תme 45 6b-=D@Q/q\уأBDT'C[<ϯZ}2f?*bhpV^bжI3 <1$2PM33XRLs/#Kj"@e 򽿰ߢfy\>|%2e7YW{@Lpc:٩XkɿYEE3=Y^ޖz{5C!&Qi8m&!/ptmp9nm6qJpX } M+u+Ybed@,,!HǧUSSzr<i4)5*i0P0Ūoף cn7yT0 f GFU4_gWzV/'gj\6[@F1#PgQ= | K+Gq?6>OV[m<)3sX K]82v{} 2]駮{ri-\FNkm=X iȯG,& nL fhg _FȴI8ɩ/mOv}GD<-gRTE$z)ƒ7dL.qh~o=:ۮyasL kB@_|FJ1w@Ʒ$ԇȐ@߇Ioe6JOAz^hJd?xoqA}?U?=tDZ^" !U5ZUJ%EfhMv|pNَjʵ] uzwt@x,^#_戃A_P8$L?ŠOha7z6QU"su$GW3cA FqΕzz~ө=tfVؿN.{jt( *Y.=׷²F|Ǡ1mҴ7b}YOoI&p Cᵁs^ qh"NiK=SZgu~Deѥ8>V p$֓ht6)W!oy66la<;kK96P`D_9~05|3M,4cJ?#^fc}m4 C%?6Ii`rWGjy[Q*aڐ)Rjt⯿X QP!i w^[Q_r|U~^5ݸ )ső/w6i?%fL8m4lО4HmYZtG%L8]!Π`Q;C+?vB;ȿ"OSE^VY%yR=Nf?Ө]k$o"(&¯\qnSpʼne_yk XrZt#0 I-v~7X,oyS*tڻ}5m'ϔi_~j~bMx ceAy4}^к)2t>K3 LrJdmF485l*G;Sdi¼:-8uȴ-xb"bmL",Lqc_/LEgp'1UKBߍ0RQ4V:Nu[$/?u_T'Yl$\ N9ϑ J xF pod=Nvb90a%ԪO;z`VbqT_&wf-|<&>%0q"ˤ:},(FA?06iZqm n띊$ԑs}O7_.708n\`~vo7PFm syo<ni{M{BKO9G9@$슘N05Ov O=r~cT\C,m`Y+δwiw HKdͲٷ(mFQpyKG~~*}^Fâ_$twTI>SKrڬ| J=62Q*d)owA.Cek mng}LxrW7SF\V~.nzyBPz-\Xctb:DE (+p?~+m,y-f|ʎepŵ"0Ks -U%dxG\vޑ(]!9E$H=.9҈}샹6FO*rq-PJY- CEllMڡO[<]\ }5\%2҄c;*GsotL/\+qENUgy!L\<(D3J<>rVeW`-\%S6~>K1(PQ̢fA;}BMf訷՝=@Ό@mCnPCï-uaʬfeVJ \0{ۓ$!Ks[A7S!beÈ(92TK1#X>:XsHnu(tz#]Kbʫ MsiA#8@,-&J{Gc4$糊A0CĄLm?>D|O[ԈT HF]rT@}Kfb/R*Zc^ƻ;%w응^75ۍׯU#ORVzuwJ>תnjbϳ9Y]^sugOȁP"G d垷;yhk,~3 L7Q3km~BQ홳qLw\YG]ל*3-)죕 w. f=&͔jC m#~4evՉ-}?‡Ǐi{ RE놨ϺFؔT{n㋉;4d\!U35.ڣJϨܮk栵~ęƺ{/IjJ lvP%wgYݡpӶ;zBRԨo DZC VB\K5tCv3JG1WrEG,nz#qf2*]dƓl /){< -DQ!E[ m;cCY IAi1S>_ҚlHQ0() dȼ4 i ;Ǔ=˲UQBY#޽͐O[Zdk^FZѽD)y'| eM. O_l1ɍ|'wvcȸ桕9ÄT wJ;RD?\`ig)MDHh*tP1k#\FWֈ(*)G]ND;R189#/% }%'=[yBqaA}P{~Su1WsQ'\a{=w"r8 h,E$gxzcPy |LA*;86m,(CjF\@2, &ů,m\9u\޽jA EqUDn1%Ra*u̅+k`XHGj؉^8#\q2P髏cH{dߚP/"{3Ŀu_! ?WVQ,Sa([ͮ.R(BNU>$7z[y`?U(mev VOCI>(  | gӦq)4XCa[#7q%ʑ4[: j'[|lȋb}D@j#k:c ud "NDYS@9>l5C`[Һyi(g@JmLr]YI>ZB5r<(%!E_#SJ.o#E+7r.7^r"΀%<"wj0Ĵ$ɷư턪{W&Q pUINUC_Q2X/-2y8@]}owA}ۤKem[#4]@g#t>j`R.c[#BSR{Z 8u4Yw|vvd)+>F>n $]w0В#(/4K ;6Zv 9<ЊAtftͯy ic"x"h1-71p7OG6~Fg|؈'"H+g[E@V-ࡷc kO!NVfC]4džu DƹE}u]AhI12=>Z'Iu(~Ftk2lT&1u[$QX UYIdKZ77@2c-dG.8iQLo~kmwZ) gd< =M r¨ qItpT(}n^Ԗ<$EI) kx᧑\@2 )eoYO]U: \B5v֭s!lz4f[ЈNGNW#3VcB^O#ei|D4oRS |EEIfNlAӰ`%}l gaiA׵y (AbVWڢw !!8C@OcR#jq[KB_tfHưU===_ŕ!׭$Tܷ5"蠵V2D2]]+1 t6N#1Ewq\dm?`齔Κf#WĿkbw0;Y%[3>49ȚtL]VwdedisN\v@6@ۭxjkQEʖVBtKO^~'8=W4##v%\hCI+C.9TInq*{kIѰ=jsx!Y(+Uw@wmOwaA"z֊*J\s VAFiuKWzuDµ 1Ҋ3psÊuV]D(, t< e/LZ$E$Iץ25BSByDxp d{`|*{^G)ɐC`*\Q@S:j?HB{hmq$J۴"1^!Z=/mEv}GI,CZ"][ 2?G<*[tja u$fk?MNېV#EZOiI9V܀F2b@烎@t6$@0ZeC)Ad˚HnǢEٞ+lMmXJ]S̒x'$饹gPuIt>o=tbqU:bt  vI&_~2BXsr4CɖS8~wvW7Q4yӜvǪp¯njQj6Y6Oܿ_i39$2Ng#00eE`mkƆ5[N7 4_5=m7ZU-8״&0mR<VZ,Rs| cY(cxU=C 9 t+uhV_Ȳ])Dکװ^#6-I)8y陵0O3MܫjE 3'2JwVrku<#z-SN"*C(LUhaѭrZCz1,E/#`<-%55UݏZFZVyz. p;*Ϭ*ѹ4r렷^t{QDڰwݤ .VEj,'yF(x[WQp2ᱮ8׷)?ѯ9|;QR1Vr ËjE3ҧ3{%kuU&enjRNu]_LkBJЭcbkg:5Gkç8_:#1ktŌ$^Yu y{ q#T0Ջv}0_H>+P ^d Y/u+PN@p{Y5S v4+5NJw)E| ?¿EwUz,eY=v!uɿa=cr2e$V]LD>Nqʽ,pTgǟ3ȂRX[6ÒY&5^S7 O-0><|Ъv4؀p6X \UyǞr9;;ӓ]ggo[}GEUV+Mo/K?l12Uʒ&9q{I0T ?+DUo ձhF" ȶa<,1?T 94FD. \7xP-I!r҃gkcgHj̼ŔP!'@G+_3o9 TD4h)KSܹ9ɷ;pOߢ4 }`Q}NtdVպ֓X;6dTuVJ0xءHÏS ,'1smPϤ*Jk'O~k n[@!| -X@Eq'_c|]+Jrm6o50 d`-C}+K| J!oR|C;|=nZS')B*("NRMt(frGc=Ѯ(~ Sɉίl@[C.'HI I?gm8|9qL% &[t&8_l80tNihx&,6.-Ek/ra>6pQ^]r:J6#gztN-d-#Qxmfw{B^gIc^l]N׉*ʑR|j `\p/ Q|]4U5[9.qu,o{9!ڳ@ HU]8~?V~EZ1݀ͮ0Ǡ &BikxbF+b}I0Zk޸#Y߲HgQwXf]5vᷕT92 Q&6i? P} pVN="N~׫q0Ap @3h̷~q=K5@p҄xjXp,‘pIc\, oK󐽤|*~+#.D_8 U/B0b [Ǵf˯a%1S|98dz!@:ؽJR 99jCzu=^Y[IfX&׉Y"4uip׺XRl|POְ+m4\@Z|՘OUC{Q2q!֠;8f(U%^ uuהKROVZXn%0i2#@i:Of^D"LGz>o(@E 5uhKǛ`rR+Wg{2#ce*Ww|ˀb׬뻙َ0>Kg$Ӷ#+h; ;Yr U]]d;[1[<<\ùsɢYOzݩ21<vߢ aQk#f^s#>EOIج@tV'\^*˛Lۋ:>^e(Z@8˩FN_D)[WhCM..j}=.63mv8$|Hmqq͎dK~ԳJV *&pʲUg&&΂lʯdKxuё2B& BNg/VXFf/T2F Z)a5< 6{̮q bp"!iaMg]PZj,"rA7bsQ^Sƀ5W8#ZTrD+۰sFq3TWhtPV 7T[ 4 * njR[ ۱ڬfL'Rh$~׌36GB];C90g~X<#8|m]qW/vk&M3Éŵ+|WP`\@V@"(6; EMl&)q¬1ZX^sr3i4 ig3!b> ,"8?4^ Zʞ-YF|nXՙL]~ץAksg^mJ|r/* f9{qNqj$&Q_b廲.*uX%*t`5-NwvMM2 SB92O{xAsmOQGCAߧ حUvy}hs mMh OpM2sp_)D+T[b٧ӤE_ʜ'_#l FYdtX4չsL ch OįY6Ud,$-kT|o qC1hp)8h \N ~ڽD̵_ 7iD#(Fh1]3)Urց7(&sú9".gu .| 5ٜqȉL:E(yq狨Ko--1aA,e%mscGFLg|\M^+uaޥwRFGid{YX?'xᦺ4]5g!aنst/m D`+ hm])?IR,$IZGjqvW*)BDdcS1͒5W+Q",-KtHbe~#l+;* tQĉ ,3{{.D}?7/J۠3r𘺂GiUb@R֧⯷9L,A*-&Ŧ+rS"$[vDBf|;=F;iǖ*$-+ PgH`hkJuBjcSkh%?T1 V&mGtMtمː&6RY (pSvzAp/>P<QI6P.L47sy\ﺲ[;}IϞsYܰK ,9JN8Vw 9Zl\Mבm®Ǯm8!*@y*AK<"eRnS7gI"OD5A37 Yg̪|;CU(9s'^vhn8Y{O͔AVOX{t96zm[fuVf=#Anx~ڭg1γVޥ9Ҿxn S6>fsͨRE:cAL endstream endobj 177 0 obj <>stream ^okC5 zE`݀X Մю^k^Wxpgc:x`DmE\=>&LO~{l`V #V\_@5xw}C9GCTl1LKk RBa))ڿ^oUTy(WeL}ػ6Pv/8 MP| Ԁoі;{N@y)zǥCNC$2[@-{yA{ cTk+iPqC4PE/\{"EmChX#ҹe;~l3]QȵO.x Y٠R ,ΑU$vlՆ=KqUs*r}@[2cQ_<Q`l}Nk_mPJCݫhP}'{@]ʁKۆV#D"(J\rTi1Vړ`r">GWn#p`tOK:#s_h,DyTx]aicdFMcԺG&^:>_Jf\9IĿiE~=b3b@zE1FΩUb dq!~NSDR틦2s3Q;s^ʧ}uF&P7&džF2q J W8U5$AǟH8a#iV۲G09x6{(L6\xn$_ʺalh@JRzüV>U?/[f >;<VpV&lSxlFxFSY?7cl hʹlK(vs$5\3D ZYkPݵ,kz (z~thj'E/\uxMYo,^">oQơ ~EjUg/k.cxőn-\*vi` O:}K^p l:D2߷,R2VF$f3A̟x oRk`GAQ1N,#BPf~ZϮCS +rǼ1;0jb XYmD -ę<"r;ADRR%p7t iu#R2y ^&D"cȃ@غޑ-,QN  Y_5&ME=2S]r4if~ x֩3M>H;"@Ӳ1i-*J,oz _t#d]=UمD̊}ԃ#F WZFGUr?AL ֊oPܼqpipk 31 iAZ(˟RƟ'rCA9/vs?Jj-M{a=4ؑ70GȶW͈ ILhf]V"AR(N~9-L*6)*^=4l7_ 6p $BWjȤ`/'K;Oe=Q[xp  4(]Yl8ay^85租y/HNԧ_mzaΠUYo9۪ɬaGF=@7)nE_-+0@{4J@i]c?p=W&>7ri K[OoQD;%bRtv킿t1bR!]:@ObPY_j AJk,7hWИh_],:@lGP ݌;fq}k!\R,VzChr48 uq*XCEg9KC5î~S7u~B6Bl\ D3AVjtqd*T2wY.gDklY#)/ ¦wϠ"Hȡ"3*#œR6v"h0ft"hc.xWTD%6ZOJpp''N:}hLU{K(%{EL_Ǚh}BJGv!u<]z|ׂ6zY9X W|~kH}ti25CicOCP;duF aI ӧKg\U{,v+Ƣ*f=/Y[c  b۔5~/r ]g2i(1 ZܿCN\I"r &`9 ҳn]a\tf:>Q\\#"#s=qhcn8M9ij1}^K"# <#۟NL*K@IQܫ*7 =l X't{J?6㥍`E)|k֓eB'\ 9/-  ._}*08yew4ÂNᇈO/[ #SJ,@pY&ewq[4Ujҗi(EM\M1#AҲ%il<+iL|G(t{,L~aԚ@̞ ԑO'bO~1&NjOI@06^n[4mGp6]ZN\?Ac@LvL֣X99M{ZnI5Tx#QE@"CReY;4sz̯3Yo9p~&Wv8~1Aֵ!MERb[#bΤ^`z]&b<D*9|S-6+TuKm_3>i8+7\ |0&QNp_WTG#LQo0BaбAA>\Xpa @e'!;uҮird@ ?s4F^z{"2hLu*n]8Y%KAyt"<6d3D"i0N=a4R)R/Ke9b p' fQG915";<mnR[ b,!q!4,*r~jTM U D蘮ct򞬈=3M:tt VZy`kTݎJ0A[-p\ 1^ JJfh,LE MCIU?lL"G|ɮlp[7ĨqZZg潝 ~ |rd*8jx"ohu1X6|7qPXA FjSN[MNOO֦9e~$D=vtݍ 0f^6ݺz-O#u# oFPbz5rгdC*1*YY=z| OnH@tKLn3 S@9i\loQ!?h iu2x)~4;kuH>8~Y١pp3;y!*}oҢW= )T)Z 6$mbMe,@x+ G~-'fm@?z=6-)%fZy46aֵ֕XWb=% vέv x L7hULw3e]Qƛ9/U4ʚ+Nm J^v[s QwyJKkyVC^%ogkI1BՋAE|7N#U!U'Bkp%;sےЌ?ʌۼ#(\MXG9J"SgEV: wYGJRtG P7դE~ b}BtљcIj%SwFd\s NiǷZbt"GSQGw?pZ[9L |O+'7WWbVhކy@0#V=BY0&dd #}ld̈́]y{sm T00G~l4`wm 3 7T@3G(:[M0Ci؝H %mY88VVM-6`ϟL'AIMPbN9( F~/]%_u! .L4SVKʫ }7x 89G 05|߈OqD'7r UħoooI }[,|F(3э:XPﰄ9GL5n~>,ԉK芘Bh&KA{[LJ/SX1%~p32sq-+C<({CguMW.sjhswƹGxM#Y~<iICv;ˌr{Шf1{Er'D"H+YǾ=&Rs{1v ޠZ&>3^^Tdh㢗0H ̡Ezmh3E9lM.M7n!4B`9haW3r]EXr=D-Q6Own"Zz 'r UF]RReu@ڣ6 >,f.ϫ@vp{vC&oMVƥZJiQ( g~ ˔Hߤ'},^s0nݠ. )]a7.8i}V[)GDU9ҷQ@k@q$ўp̐좸Re $h{ZJ.zIwr.p#٤cRc԰4gE+zSL-9y2]H_]: D*!*.}%孿f Xå5+/S Nr)y@FȺl o<Ƒ 6 vJ@U뀞 \Ou֔ 7цNo䔳7Ky(܍=h#¬5d<_K("VR fE a| @FZn{d GGjFAGJAzG7%jw9DҚ#yzSQþ-|E>c?P$!)F+c:l UoZenϺTU{UUA߾yeUu!]mgiO[׼P[QM4?XVK{G+g#mۃօDb[p ru>5H}#mm1Bt )ITz({+j" }KFr kBD jTy$uiV9Q9;liΦrUܥ+rPlzy)Wn#u4VB:I]&m奓pg dh tju |M"qs @fE0T֩g=iaҽ^KO;GES$VZ~_O$r[h^M  (μ?{.|YG ]X˒m{^QXQ+_tf Bb}oIrSdfS R=;u>}˚w9ItƹQtqW܎C:&}Zɩg jh1#Ib$Y?(b'W9l͵V~@MT=mzt2ڻZyvFdl2Ol5w<9˂̑#3ۼ ۼlWFmQ\/#7A,GG#%_̽Mg Q MWs&18@856fq)$`ZZ忱xu"~n&؎Y޳Gm:.4 >-sfXXYd|AgnDh%kݦ>"|y^G&\l^{\1-Əx3~t޿W}I`ψ\CIr"Po_@?|Q8/"q¿nX`(hmN}`#0>8| '*X̪5[MwktywHߠwF1x5,$K6:4D!28r&ܣ.:S3L㑨}9x%pz(rm/Vw]OӾe]~.' %!W1mxQ1ɋݩ#2?x#6IXӄ- luQ>J1t* u8*PkZqoMMx̤)̨3dwfW5Ulw214HqplU`T5W0};O (i@-NuLQK>ʠJS[F_!5޸*_(=ؒJy>,lju}Ar W=`N#4&Bzih N DaGVG5ҁvSw&p k#i|tz޵Y|ԁH1bsÇQ 2d"}iI [_ lhO3?޺}%7QQ\+g{Psa."ڲfq̠po̷ *co ih 贆!J&İ>h 0Ru<-- Q:8ϡN&/CE[ψ7(}F!u'kta%PJ`tڑdKP3I <4YXQ>pA6Xc+llfʹG]2~j}JL '!('[=gIU#ӝ3&ceč]^$jL UNr+LCUդ1 Cǰ>r1': #CxH@w`ђwVh$piw;X0A~~#4q~&GJK| $T6<_ θx0 䩽]rO7~QXQM)@q8csvf&%)4Mg]du7Sk ąv i֠cI{#H"r]>֬75/zr2޲ ~)3靜ߛ@&{;kgVA8R.K@)(9裝}boiˁnhqzq2,s{*lX{~ze|Yj|dhFSA?։=ocS3 l<\!F|'.K %d^~.a[fsv=esw4J祈{+se˹]7P! F'/BA70H, &ap5R p%V ݧ~ xpU(qFQrū םJ>\ phA|HˇxWFԩs@%f#h =x2"9o9\_ѻ(KΤ>_]h~"x8^@ fL0. %`hԳ4x;rr~cCr wrkdPVa޺_+a b`剎Sz#teiyQ|+VDžG! ?nW\y=˜r_Ptækc0 v?͐t9ǡ~V@qlBv}tF,R9 lmWb]V H\Ib2Ɏ[bGbR?0=vpN݇D]I8x\-%>Y؍gr CD8NgΫוeDie`P=HU x_B.WĭvRsGt .) O~Ƞqmאj̨nR̨PJR((YݏP@;X.6=D!fd[ txtzk]a$iM* WGE{̭:dA>]6 <*0..)Dmsv2r(vEJ!]o qFN JwU8P38{KZZBpBAWRŤ C7w9Y23vD6eJuBnٴK)]A֮7  6LIh:kZ [eI`4_Mi4&+čp_ _f32XB!P<l z̓A*], DգXa[Mo^|(D*hjqmKz/_ @Ob%Mw r$aeށ??G'=x:Y8ǔ.:"$XY BZ DAw٩6M#0Kd^E8x7hAJz<0g0TD˽E(k~=DHX3}#ګ32uQ^wDMh,*Li< KzA K9PcN.5ȕN2=RT/x*i(<7 a/ ˎB֒e=bW\F~ t ];A| (~kLZA >K`z5bu)VtWFu*V\r˟| 4"jJ8jآ&H)7;YŴWK`[(+ۺFw?ťT[;mȟ`]4XwP`-H3CА!ޣ/^HcC/s/xe?D9BPϠuaBK V%\jut_e$ IyvA"PVadH^1c] ~Ɵ(f7Jl?k? Hwڤ`W9MF)sOڵ7O=%g{/+pAb|AL;<(W"tGt|pN54hʮ(1` 칒eg#)GYǟ>|l^2ŒmٴEn* dc`TjC ) 1=SZK`h-B މ}y:ZMijuΤ<~Y@=ҙ@=DXdcp ,r4ʘ+VībMLQ7X$ˍ: Wʚ%B>Y1k`*\j֝REwHKXR. BK}D,<ʚL+X'vkl.E*1H4x֗uhP(X9OuZ3H̶;0my?ЈMwl/u,OL0YRy9)T5hBwCeG$&\oBo s}Ϯ'P0|ݯ4\Y,}i2.`\@_kdZ[j[ ŪOȪl>]<4vİ]~B6_AG,*= P)VePhh܌^jZa=]d߭wŚ(/ns&iL̶bR0"W  7/IsY|M"Z3y`M("l ߃&bIc(7աP/2[U/xóa& Gq[N4Z#̬=}0۾.GF $|#k'6U9׍LL?=f;gI*;Q8/|';W3B_$=%Fzzt8ӢHT 9}LCrhJqT]O尼(6lGc I}aд nQPk-.|NY_q k[խ Q85? n)̅}Jֶȫ( DY _o0\YkIxo<ɜݎzqMf SMK% Z],6"0MQD*3K*Z5Dno&24, =yf& N߮Jd7: ^{xlG4iFUJ.\և4!#;O^]UU̻dLnUlm3de8x4PtB:(5- f(Uыg61[alU>] /OY(8>HE %ZJǙCI}WS[=K2uշ9cQ丽2|N@{dJ RueV!1f"#RL0$VPj '_NȈ22#ȕVo}gMzhCԣ3a&3\#֏x Xf)Z:Eb!b&_j.F j܌m1f8;+t?̮nuo-iҢ??k]3$0Wq0px-& Vpx :(+"S?Vc gfz &y٭_nQ} mU}՗*ج ykBK*mi9t {Y()S]wNiw =iz={]:ds``*(kgN7o@U:%QL;}@Q!2;UxiS5 hT_Bn-AIXf30rouČbf,աP-#&p?Ps~#txxA0]!Gl:#H;͙bhlP {fU?ķԷj^$AvP YDt?ލ%XmZ%^!tt;,`sdCmHL~@ x\(%BC9>e|]L7,ϥ(SYvt@ J~' n1S 2,ޤbeMp|#7HjeF;H(FS嚑hD`} |-g43%zha,}*h{hcGɗVׁۛWxygʙ@sZ0KEq(FJtp],&3smnG4"^*֋utlp?aW´5VZ/J%/`\; I/2oQKw <>a^L~%Ơ0D `c珆 $HdA HfW$a#:k [֡S\Of2r֩sRYL(wHEp:>_XYz-=Y8#*Z gQ1~*3*Z+|Ywt)t/zQwy\Ez} BuP"M#rjL~_5UTE?>a2skʽKw*999'zTo"~Ȇu@w;N6|YƆsyn0!@ЃϚi|3ZMHZ=L &ۯ8R(D/e\= YxR0–;'Io bzmw?qHO|giݺ?'υ3`wec3kU+#N|$'RKBc>Dks5,ɒQA\{PV XZ^ʶCiu#sLdq!/9Ðr;*38 _N7fdaQ̨ EآT4B Kס"+(Vձ ,Rj:r64cd? <Ʉ$(\e=_-I%pPfl^_6[tW "s(iJq͈rZ,=B>ځT 9\@aQʤ1*Tep 0i?-N){X*c~$!U/DT{@ُ%|)6:{UnHyJru]Έ$a)8R |ɽ_?XVj4f B9cYD+*udA)o *k8П?@/u.e3ՈкsХjnA]w<7f,U=%ڥ9B,G Q5}:: CLx:Ѣ 2@TrT]P^a2_P>F(Ӷ#z ym`T߳*N[z|;3_:$V{7&-T5,N;z2|3BsB \T맕&0efӽJӡdOO(Q|X+]50qݎHav\Vw2E7~bҳ, (kA3J`T Ȣ^nEK #rY:hVwMwzgcƒ-7 -p*%ލz* ָdV=BH= q:E t^ฃӾu]A ADA;8{B8PT7o{ج1/'>ԡ-şϨ .^Ct ,Ǒg@X^_*+m6z (?//-3QʮcNkB69`fzMhhGn}toK7[IamU OE"K;*tx`-q'qT#3jow(oh7Ȩ՞ψ_?ǹ_u MthZ 6/ EyB^IIJQW8鸍hړ-1Ӥ_4忎/¶< ^SpXp$zv3(KPO*ْa t>kpx*:T ptq+^uˋl(1"% RC Le?2Z"d*Qu&9 ;^k/~ӣaQY`,L)_;`DU "FJ jcU5N!|XȪ}vB_m#V3lh"\QA?\Tv=+]d\[Z]vK$>3QLM4d3S 9;ܼ Ð'~8#. Ͱ̤ vJB++K_%/-D{R^ G ?}/7|e(|K}q&Y;6y k7NM(gDu*wN%% Vui#`Ӯ*А[SFٽvԎhDIWT(.\Ӊd|NXA!P;u_"Z+LSiN|w)VƤ4DC H 6"V:!aĄ B2J(0WQ 8D#ߙ?)U:%\7&c+DZB("0%⏞gӑWK6-zOj!&dUWh4pѯQ*t&(ȼ*XLw^i 6"t|]v>#jňEGa7%VpO8 2L/RF-ψHm?DJ>B1'=v>?c;{ڷQW'BՄFMtM4LhnyEMEzM]m:X#5(ݕp{`MwH̯3!LO~]]}L`lR1;raLw:ܹ%C8TQ Z /Iް~8EGu>,t"+Hɀi҃޿l,1܃&P,@~}FY fZj@ Kq( ?; :G(7necy~~%H mc˾O.x]&JrooyեC,kd8%#7+o_tjuvV]D˦;HyQÈ3;qDsU'L\0+F_1&ӯA?s\VPj"0f-e.NT."HE73eQN0jH/I2xLWfg̿ ,g+Kםq`?0it&~3ջ 0NcVve zaT`wC Vr:;ѡk ,v7_#svٞUR򴘊ܯN}e#eC6a]CS&jé+ oWx~IY?]P 'b?W!&kt`VGS<~hWЊ^/39X`(gE!7 ~xj&Mt=Dz7xԞhᎨ;uq):O8eƈ;X"dvr0v&{. U+iF\-hix|HÕ3z4B1[ ^+v- !D:ZS19ҷuψ-e96tȭgf/deπו{̉9UNAICR( -0kvKޏ䢐zIT2qٔ"G[H:OPA;~DW({CL,}+?1L$Uy;U3vS:H\QnOϻh 4ãAߡ>=Dvgg&J׺^xw[5Gïfk7 ~U5 aj\@,FJƽ3bA]N2^RaSϼ/hɓn.='|RlS XٯaE09Gۂb( z5mW/tYMwaDFRiˬ|)u7ՂX+Sq|꫈3ED uvXGn{e-tJQ}LL5 _Dl@Ni0>=~GV5<}w25kz.$'1?"*rh?bXcF/30wH0X?|=j¨(lwT?BE0eD(Y8yGx_`YUDY* fxnSj2 ijE,!N_;ëp_~EQ@Ħj==# = 4Cv'Eu\R.=+n(Oz]{k#3`Hӂ\(ojtGcick_谌>>^JC]QX ]3pЈ[\Z". Q$%1 ]Ll&"hڃ!AηK<3'@,W(˵‘6֓d'Ԧ떓4ԨT}!tP!_dx_J}5mըvyAW`M] mKii(W^)h%]%w&8Oo{?0`V3]Aǒg/( ~Yz9Ί'{\f l N P!>lq8{OE"_EKqNPCk+Ξ@<ܬ(jfv\g{oC?&(=H+w5g$~ 1{5%4E8c3U҉_Hur`W=Ö ] Z8f=$%}~.ṼDM>Kc0JɎja->D]ݮNQpw=q|F춟,P"4  N0#hOre+pwׂc&M.2r*_1oصvMBCDF~m1ZM80Ǽ3@2ݝ+7~oD%UQ >QWУ49 (e !bs% 0u^u%2U‘32>g܉:l9-izݹ$L e廮Ƞ1H *i_G0No:2@}Zi-xGG4F<'? unݺӥ5$'} bDz_pk$4&旴GTHwq̣4]Rըi"cHė<vaEs[W)Js|-AFʌ<= K GD6;XQ=E|I>S/oL/vj9 )oY^D`&`ٔ~$zFDL̶.{faHF n]7܂ 1 ^JOct]v%EsyfaY_ wv٫MX ޯPD |?}`xiؐB;PՉW¨||1GqaH{313VMj) :9~yyGVWIR](kkG nFt`;UO%%Oie>~lK~;+rQeSfow3}gi 3ᾝVxvc _4Ђi諸ݼ5賍!Ygd!=Xރ/';Rǩr%A$w5T 0b ҾګRvA|@z_)tu?pZ˷#sŸ>s).q[,fWvs|3LwEjB.95g/4spId$BSԐs删'ddk_h(~xHi*|j%ކiLFL o`|FcE&&-;[*bcx(+B@Mxq 2ڟuA2to ԓ1ϲ+viO_o'+w??ÿ9q?wO[_W'^no59ҼL/0k~C? ߨ׫wz@L~@V~`=̆6b3%~V'%6>Bn{q kWphGRɥDEQ [E pȏ/,dޣ@DIާdgR=#gfLa:?BI#$bmњǐzg#3(U)oO 0Ⱦ]OKWViaȹDU&)-Iap}*A@/*|l:rJ tz\8r4)Fnu ɃsS(at+~QjEE(QV3P2& ?D#`Tݴ<3R 7!:^;'Go@bYn +'*8\\oF3N0coW+ޗ1rq:ąfܤb\f\F{fKPgq9jOo0ZLma Hz.isA0UCE\YטTuPEs0umDI@ν8pc߅8X<7M0ݿ&MWLJew V7]ә;ۇ9S]<@P@0}Cg|Fr+ .VM hDGGMW ѿ vÙE?#~zt?o?g/AGzO<.^)}RMyL!>@.7^ ebL,U$vOޅPpn<DA;۝D̃ QfeӺ 4ya.frm?p.Ti"c\"Y97,PUН8ш%G_;/nc]:t lȃ=q+#|X] ?yG$^+duY,0S˴BIIh3dN(xثIV\1byҧ_N< t^t y۷K`pBy-"ԋPZ.=ѢiOq{;Eyc{w/f+=@v@u;P5SO=O5;U5R1:YfPb\Mr,وrwH[ @09QgD-Vd@{x֘&fҭ2t-cr1}O!~3һ`CNw:8pt)1Br7G;%Q}xyWlvJ#{׍Ii#\=יs1n \B"sH"@>/RbUhvQ7/Ź]hv[0! ^QcT{םi Iqr =tбcD<;Q2#Jݔ =3f.S>ʈOP:3!Óc:nT {܋F*W0 |FHf0)@c :l*{ C| .ܷ H#>OS ~~RHf9_>_/ rдxAwސ Lyl&=/ɞD0^LbDT 1TGa#E~HSf;cR"hS'"{u7UD-'Bbsor Oo˵:< `*)p-@wR7"!NbM2L(TjqeIVbIt@D}QkGUQmB^*ؒ"&޾-n}{/(~ Jgwi>]E:ki6{e&r+f8kJ4;!!M;Cz{SӔA5X2uNxyXM#"6 !%ݥ1G,ZZpOt`-ʹp%ihYDD#gi?pYFԊV Fq/3;Y]k_6e?ݞ3 JMάxJ[(xxLI+]wkkqeqSptRL7vN i'Ys"VK  N?' E?{Jyyd/4ygyl UZtɾ",—j3[1S_Wk9[s߬eDر2>]_m@-5 ȗ-tK׿|᝶ԗq]2iFwU} uiNm8=mzX;{K .Yu0K֊-W8Ntj{Qym;:x=[逭k۟gKoA"y /DYTi$t2*tufA-Mݗbd"ąàĢEAFҡ)GŰD))9Ԣ؄Ͽ4罢ohrho̜^e]%(ބ SS$2ZSK`cCf,yxV )lӾΤ:펺t sA.dwy'"=MM7F^GNnwV&-c|T/pʖ ~>9J2?HrQ䗚3}5C74S_&w|eB v(ZLFߑDAMa F_5>A@1\P5|W+%'umKH͞ II{q Sj%LQAnz:A"h/7&Z燧SOE-ds}W 1#]fx?zp<+;?UYXf@Qq۱_=֝m":l.'˭(m ϰ} 7۩\Qf͍׸[_Z#Wߏr̫qC͓B-k|ӟ?ߣ"(jfv7KҎnI]brbp?G5RE>| w$}wӎ}V2ܾGqDM(8PEGcr}Ho}jHU{WZ;7@~}X!O)=KK%DY JV~rL(|E ٵ0JpVIHϟ+#D7%b{"J_'R=}c4@gۚ y1r)x2#T3S BҤcr}qZ%`}dV~U03YNcmSa22DGg8gGC GsͨGi/gMlLh'B#uD>0!ЩQ-oz[Ͱn®U9vD\, B-KG=!8{ Evry҆H}eX>PLwj^| !sWy$8`kH7XBB?XKÿG5lQt(k瀮foc?tΌof>ܮ}|EJec\D?~:RJzeՋ! |wt:.+{i_WAhA2QHEr?4@T'⟿av qE><+ߎ^$~Z I0]-Z(Ag *#pDW}]q zQ(rܴDZJZ=p#;L0RX'I3 X{S5QydGvr&P#+/F>=DXDkA0S'kp}uU)C/3wa!:4ac[x~E v)MԊXr H>bp`Pb&7g捚j/3*9T(͔yމ{b{D~BZo췏G!1߅b@y+*ŨugqS_aryy OoP?7/}.F2!n`?L5'u=x4Hۑx*F5=G5Z9;)ǩ+zNcÏn%>>w 5!*&p]|a "|>tC}6utd!h!8Ϩ.Rb>~x+QQAߗڅ7F%t < +uPNYb8w &*(. ځwUuc~zj>#ս՝*>.%aXTH Z+hY{N8KU#{Ng㉸o6Rk9FDlv̚328P%yLa߽wȂD/MںBleƠhK2\`Ў6퇈եyk8(t"^X[/&/Zx}ѧ߯Lo?>ɿT/BZZ?Tr={ "Y#) z#4L&' tJ'%{w̑GHwf?)٭ݿ͓r_qI¥FX iֆD%bD=N"j; #,}()sʹ`6/6&%'cēMG2uƫp. 1G\كK@y]ۏ"{E ;xt"`?2(}Z9Rt2g]TLQ۝Kho%A| 06ﭩf\ϕZYѠ/] bl*TAqJн`3 e;FObR 3t&Pץ=_hTܱ2f/.U ȓG73-.i~DG,#{!dS}J# !K!V ѡz%([ٴtLy@1p0"I]Ѥa 8zD #gV^9"*РK 2p>G). ]eeEb:hkD0}Rr6Bgy9mTCo,Fk=*; )_& 4[~ߐ?I# vS11UpoSj!30Y?EkN ŪhKG@QD]Xxga@Ž);tOa/~PO|{}|^ꨄ= V5ҐVC=O-%- B٘_8q&DyHX ڇ%%>HԪRʁ|+&-0(ETЊ!& ㎯A3hຨƏOZNnF~$ip>jobfd@m(B%}Y<\1'On^ǞMDhR}]1Y=yE=R3ê%wgB0vbC\q]𕟈@Yc&;V`.J A|x/|HBOƎ"dC`&G%3nTw j<^IH)ҩvR,{iHz9s!"oRFbFLmb{\Cܒ+J-{"tm`kSLή"'hD.Pal 6{5t#; [ 7`tMč*_|#J|X oѴ^;=t5F//sI xx/ x"ɍ%ȗ;Ԯk?_7^/=0'/mbRzȆ⣼h=t8-;bft0Un1ƮW*Q'Jv4O0cCԼF,ߋQ#n~-d~U8y^{9d0^؃7P" W totD^QeˋB5rC~SG[o5Mqw Y|!M== %m^xVaR.R (aEBr^Ç!5ɍ͍zZq+v?ޤG' ?e]8*t@mقg->sh'ш}g;NZJ$fb-ݿ$-X#P ?KH7T):kz?KJ*"I2dǵd23lBB?7Th4=)uU\.2LB_1;e#I<3&A$O(ODɅe+?g#E|OUy&Q 5 y[˖?T[ Q/m\l.6\O.Hr>r`>^RֻYZNa H3϶Z}g kr,] nܜq!LOu46y:"z4DÉ7FpUl,6v{h(@eM` q$"$jEI/,Q=BҲʉf(#.RO/e0`e'׵up1<6)c-踚OP E7p_AtzaXuUbk䔫`{L@*UHeDj <)(¿q &}nh(Ԑ0 kTpGj_u|0Tn+ 0``j!#"4zܾ(6HwshhT4dXj?@ ,ʌ!M9S_-ʕ=q"~ \BoꭇQ ?UPGܱNn޾o1aaIsrT6n*o]=[x Ók%?"Z75潎VtrP [&JH-f@~seK$q/oD4Hjb?JGVg"5d<{ <]-]ЪSOs:O%ԥii}{p[Τ,wmq%Wڹ=um&cw)c}83 Z8 G8.\C7 D{2/V[}cEtbg7ag강_-&Szj#54AfH`=HX ~NulԧƜ@;!V u3=/% \~.%07 >]lBͪ+f CV -7+(X7RXJ4RQĽ *q$3RlMfWH#Ot?[1w`OGߢyphA0bJW F˹,v{/'ꖯ"?(!aX"/;˜~?{Oׄ\:Vߟ[0HFZю0PN9J7* @*fÈ$uf‘3 E3-wI,P%KO* -tC^z&LLFjw#Hfҏ3\k>֎dx,,ơ瓖|oӓisKg1^t\;v9@9pݫ$M wfc3c%jORANX4K&=*4LOT8&b .r'{KpG~d۩ B )^RG']XP`h0t)!6=: axf 2Xfoy P1Q| { eap}}k2u>(A-ywH3u|v"z0/-qcVtުV#q÷wP8*GO ~鯒@Jjуm-h}{qɎ|˨'}=}/Ւ:'!7K!p#Y FjJ@F)ixg& QvtzG1ݤ 5PED{YѪ>cEOϰ٩vA M܀`& ?AmbӒa]O7ԝQkjɭ[%/1"`H=[ # b!x4(~|]E}îLQ0]S-dߥyfg>E_"6v0Azuc(j@M"jMDOK#1=K5=Q ?יmmÛ&j40JUO9*BAR3/"d]P%C:`Apup2?|[OdbsF$yW;.xY5~#P ohBgL|L/+J~zTOzFwN %K.Iy{c;U쁦@T#&;FYCۍaA5"lԨކ&sPQ*ݿB޵Zvٰq3 !o#L~cS6\y gXvԨQ%n)ifnҝ?(8qFf9w[='T}Gp? `l?DJkyx> Q~ZNPom>hE5%I,wtNqE WZߧtFD*[N|u@t+]D ~ nm_ꌾ4Ad?$O9jAz.@L;I"qhzOD.^')ң룶}|||r !>HQ){[a!AnF^:0w΃%9ԋJUE:zI/Ro)MȈ uvD\ZdPBv! |hjJL_%Cs0mk&I_vfV\>81 d N5XO 6^U&αzneFXlgw{x@J aO?]ɒ5͘{ZiVERy,G ͡ Xh}Vɕ@6|6(WXR' 'J?P]b-A+}b^8#&dO' Q!tzY&a Q>䟑_8ߊI}5ҿQfX9y0W~Vq8ibdw%#eD)eCRQ$tJ_Tu2HǠ+ނۍ{! GBW&g3UZCnR{tvPQuTÔBe+Ns2A_; کFWc{CpCUYڕ}EE(;Sdw;g J" N*h꺍UKJ9Oodѵ $MDisWLv~u U9SU(x]2`?:cs2x^1Cc2>"cça6"{?%8 SjDhD!t/uΤ+(բSmLUSRVH~;X\ߡ[TP *d./ot QTF uk>2[}p}e.ED>KwPիlenQRZ[3 .TѲ킕O8Z\J7/3 tҎt n~Z%`%\G LLm+aEa&eG_0-Y|zLK1. {SnyYRG0 54?L!O%22[㭽*~'w,n̅ϣ2*^cѤӲ b#nAXXf| {V%!J,|o~5ãbh6kB J0j{x~0o jSU#_ҵNk2-2_-vU _FYyHĥUC 9l쮽'Jwl<RxE1pLj Jʗ="[^пNx}}o[ȻzEF'[?Kc80 neh6)0X (-`7H34zo2׋\b6Zeƃ'E# ϽI ql8.RzE #H|$#'AntN5"94~9'>=*_ndTCpye:)X`! @ܻڒ\OPn q6C,,h"e" Dνj0C̱2s!bPYY)ܣK0$ޗR6.C핀c,~Ec )Ǫ<< V #U`v#܀zi w!8M.6GcL/eKZ[Z0Q^RHswL3IQa$ܗQ u;?$uW#G G2;(-c-Kƽ<ӵ)7igEI7ڥ( Og~LXӽwWJoJ"TJƲLj@)my ҝ@ j;*-dLϚOf\40Zz B-Si|ҩN͓BV^g/B<7xG퇋G!"AT ~& P ˗3\&8%}9T]ԟH3Ď5tU>%$)ѦD\g6$s睶7(o04-Ҽ^Byptup9U^ZJD.Q:eddrIq@lJ6=1EX3Y6`OoCVx-:4d5҂[&^N*Ŋ[B"g^zifÕqAw]jD!k"92z6I4|qn6U_6Mr_4[1~/8L8Vt=;%MٓKpk2˛èX*@\`p_"n"9gJSD P%,: {U2BEkwSc'$akW4,*$7"[|~l \E ɡw%gItug^4Q BNMQe ۉUwD%̸(k3ʠ`ԦR [!7;j QĎ:4(uLJhI%(,mC&N g%wGP6?"FXw~{3_ b\lbKQTy3^ݨDjk7rH7\Kktb\50gE,(#bVmH"Q^$/>j./),s$!{c*`sѢtGixSPג`"\Z<υTi:>G^u:؛hyd闟jt싡Ԕ啡Yb^r!JMԁ!*?ຕɟW\{3Omj *,'chX]3(^xR#0!Y2+zuJxkf BHu]2t.Q$ =\>!3 L qzIN Yp".%"^[جDV1G;b|FJ`f錫R} ;sJf8]h0Hmk5iiMuٽޓ< WQSLJ{;e1E4-Z.U7yJ6J~g W48I"wKo L?Ѯ+&Rtwp(reuUPtO¿f#oZb'dj*W%ұHE2 ‹ 5C'f;ۻizT QMD:!B9eh am f0oZa,w\a gX4+E;1.Loϑ}j')t*uCMݏ"i&µMSP::/x0zt ya?$@a},Kw4]܃!YoyGIːvJӸp=;2 n,e$M"j&#I(yX*ut|'"eOyeݶw]󓎦No4Yb߾y5pz{5NI&̈́S(> L* &kPUQ@gd.U2a.*-#7!)b/<CCv*s(S+H;yP8ш6bcb =41T_pw:d&F:~9 GPDuC'SUi(̳!n,(]{K'j>7EL*]Y9u2Ba$jXy82(A4Jۄո7MDTjǣ5 O{Tfc h$~m)ii]O~]U;qd|@=!uFa{Pk^ov(s3q8/Q^$M#)Px-]m?g`a&6@dXkVE߸jdAbd4cx oBmI,,2 [Yުd\U]< aRnCީ h$sKH6@W2#k5F}FWWe#@Web'I=? lV澃F AmA`Tw&5:ǐ-4@< D:1XL`1pbNf_O#XLyN0l풁@>0vdd@dٓ8~QsɶK5>s/zi!QdfaqT |;YEVxg6i}G8J;F 1$Db`wDPOm,&' q&DeIUE49E%@SP"T/ 8AvfD*;F,tsGzIZ Y"#Qvv5"hI/0 W|I ::5dvQ{u䩈 MQ2K_9jq{gU~ec8slDrCփ۸%eVfwc% V[z ߶S34(Ru@j  \ԽD 44 %4RWJɒ(EOhDDphN39NrҘ=00$seJz8E–qMZNKxID\˪eS4Yψ$}=[oG3Iײ8? yM/~kfDk9W?_1TvVr4EUG_dJ*PXQr#OQ.ٿd0⹣atkxsbI%B'rEX"|u֘|"5Pi^k)[PT$Ř 'r3KAފ&k=ng5GjBkx 0IZjw4=#Sq&AIݼDH!O BL/Q@N 크!j7>j Dr}j#SL94nwz>$eX 3L}1r)079SBv6Ԭ[PqW_V%N׈NBt$}| |^1o"N/QjzfiZTnV^ጲ_A ^u6t`%IkmLm<=}pIpͷkE0 v5A"ngFBshrpSYLF|ˎjcj}{RI{KBbXk& #73> 3I^9jP!ENM̢hgDD=Hs.ӧЫTi!DTĂ-`! ]&$H;7CU@nCQ@7vٖșюxFvE]Pn&œnQ ]L2>H_UmpG5ij.;}8̲G{V{HѾ:콳/Kw95r?CB@!-[f)lϽflDwmg@{wTM ?m,Q(å&}~„,I#!YNjy,ɞȳ.\o 5?W8|$/c$)`O苴 dgqU 6Uwt<- r\ Lk@b@;y+LQ0tTSM f5@,4/z;B$G\IUӔqUMhS &_gN*'hɇW ;=aL& ]e%%:^(L (S&)cy̖y)ޝڗ@E FkehVIxwq$=v Ou ZEI;[@ Ï}5&\1ZEWsc:LC5͐;b7"`TQDw1ɒ8?cһD5^'ZGKzO60AD4T-:CLBIBe`yls_X,7QFS-qջNЀ+8}5RT 0"Bu){u3UPSR~ͦFp\\BYiZj6LlD("f hHQ6Cs EM3 QD&qnV.O[PUJÁ#xB«L*qۭ*KQ<&BZq s:8]Aø?5f8(r&7Z#2qlDmO G4UuwrPa V_ 2ymjjoEt~EK'bґ$MehY/s%wIc4}{G Њ8{*)\ֶNB5(K<}C %M1 6& $4*>A1U@ |%U꿤hDi !x2yoҟj&z<{t+ net,^پ)~yi%q閚HQGUʞ؎JS-n#F H|P!^ 7GQqR^4۞'M-: +̤XvURũNFŦPix0&v3 -CWkYTUV5hB_aKX1gf:]5w g;$xq(ƃzr%U !IzLS`S+ 'J0ؔ6l}lqjat< i.}|4PYJ$$y›nG!^''Dvǡ* %'B͏h*@s@ȸY@7~#r]ЋN"hV`'C{R^^2 Pչgkbq#0z15<5'z(50%xBHNj0Kimz: a=FNտY 䑼(蕠J_ˆۣ@ΊEZ9N-݋#B`7DHOQ ϿX@2eu2eERL6˲&& ݠV Y- uԽ!,|Qkh1ĥGT1.ݑ% "`i*$ K @4fpD!g⥡Rfo,NEf%E\"B+QE=_Km%TYB2SFRհobq̛8u5kPGJ[1*iϯB3% ޗIJʶ{"{ajaц#?cģI.x 5=^OO,}oǟ_/~_˯~_w|q_~o?o.nW3#9rgUi uLlAxO~NK(YrTIbVh`ve,~N:;PT_رǷu| Wnғ,h[q z1"_&R3CJy{g'C`*k |2ŕjAL/$YEr{d91pL f2wM`яXf=OA*L*r:B XF^5ET?!4zb3ČP | ONFGq0 qAOw&d$3[n1ǰH*Y@'k ͢*q0ef8D4]BkTP~2K)T}Py8_d=Lw?=Z[Mj~Q;7v K.4Ǹ1OS85INLG/ɋeP &f@Z{ M s5KtjV<;Jn>A酳e+N! ّp(Hb%\f9 U 959a60dת]#f ԽN;6+ftJ\*?`>2;!_w^0?ߣ ;L5#`A&ϒb;l :P{a bv,S&;m-M^+t[QyF}Jȯco@JRJOZfZi'f6QZHPe }`(%֨v"PN/yhϡn˴NQo;8t h?K3B"Y셌7=+ٳimk{?KbCNيP(֏IOAsjµR+:HfbG)4hmd]rp#c82hxZh&Ei&%"3'@Lez|Dt;5K%)&!UEzP'tӣu*I @A]cIN2dh&hpqCbٚk%1ЧhUwJ#  :Ь/BUH]UKnˏNK)Zsxt΂ֲ&VȓPsK1j7;iPpYz(믵8E81$>֤ ؏K0ܵˑ`c-uTEڣY XFn ?GhBםQn۷n[U?NO%M}0uEX-ᯠh;7v,T5{+ɻ^%gu(sD@j~ځݰ, Y> ppM 1 XdUࣈv`iV6# + 2`)."px謇w)`Q[K*$4Y1LKjk=[EmWP޼c49u' b!Yi'>XX {x۞KWA޹eSt0Hj; U}8sT枢} ?۸wȏ< ɒz;(r`I̦ҙ5?HUߏ {㋏V%/O&?\_"UI8TXκX( Ng&38grvs=ZF.ˮ(LVJPlA\c/f͒Kp~T{-3-K]0KIQ&MA<펆?SO(]iS=h ₩@רUHz `P ѥ|U O#"h(#[&2|ax,B:Kfb-{t{بn!DLV,h %E.oiOЗ^Kxҡ <KkhN]@!잭L]Δٹ1bh;Gbg%PgiD| %%$෶e8gPB D<*Bn M0 V{mۡo61 hLZ!/ $$>ύ*43FԠTӄJ6% +4\ H(g1yPW !{2mlj$bBm3.b&zs\މ)LW2N}MYq%V|3k-.%t~l~.ɪSDC _#42LAyJV$fha%{afY^{N4PېB=StxzpaɷaaKz|^~1Pe ׈Pr})eSڣQ/U!HK+Q~Ԇ io*#􋆽;U~9N,.=Ԥv+{I;Ϩ2h5o)ai e囈z 9_/o3}h ժjPF%~Oď >9!EDK),pջg}2~+'$ێD2[g,qJ:`5|"eԶW"gHJ/>Qϻ 1*0XkGz^-跊ڤjUtsZ\5`Nmt[y0俸I4.J#:x0:3M%F<5lzP&gЈ /)?y7ptzKĪj,1qySaEܶ-: PTue$]{Ƥ[Qp'C_7k}% 6jQ*ʾM~%< s9JjաشkIlߝEf"9 ar(@26/aQSnSz`69JC ܆h"Z/r뽮`w (qRGLXv/9Cɫ{NBb`en"fOn3vcG9; mQ߷?&9Rf yn-tP 5ҏPSbn2(| 6B~,;2|?UQ\~sAu^ݓ&Dp7AzúwByyG\gGW5+YA#{@~A͒L}:Cr{:J 5*._KSju [2qL%#PJvp1_\VcNӛ/I=vTԅ)l, 7B,GX>CЩqgMHHFAx Ąt"Thnx=2 <8wט!l1hc ze7Evpt *PvˀHwꌊL \ WFh OCq"<.&ϻo$ emDJ-첞ca*8ş([4g:,k0$;APK%KH AK~\)6;ӽJݹ|.ˮu#Gg0]UjXa^P}ߕ) bKz*Љ~3ن͍~((詆U7=PJ/dJlaȕȩv]T4=Mqc홗yo/Fu kX|MЯbIX(LU54,qEd OLwiNPoZzqU۹)Tg_.L!}Qy(=`^F׏ M;^ˑ*$4D 2PL0P"zPVwSr0Ue>\M̝ '&e4=VM6+g򔭼2sIm㦰ZQMN~_tK!i+q! !DlrtthHҚ%1l(oRü\Y$5T߃! v|`>NF KB3* IU=/cX~-J ]9Рy<~iNr:^?z/y/Qd@ * ʐ*зsOG$?3y*IfjanXdCzCRWH*w15[1fZ#j~VtK*ROj4R8pt:"h2'8D,8v;N}& #@ Pp:&8j kw5PrQ8xܨ}LWT$q?coP1Dir)T=G%JZ1*k' UCt^imy.}S7+8_"kCF':ZJZ{y1 KJg9ʰa/͗+2?rEE3oSO; y_m$SA^!(q"| zS,#=SZ^!O2OGj><=.($KWT]n!IAzNۤ=l?) qb^/].-3 7$)ldrK-ױh=)Y!:I(e,R`V:l! 闹(y-Ya>aF%Q}s֙l F2C\Ac];R'QcFFJu_="JKh&@7KDUad',v8dl*9ZŻʙE0FrO_ᒙY5'/]9]ɝ4@So2Sc-ە%۽D^Z9E-:!Y }[uNa,|Dz%UH thKVzb~gF4Q e\tɱ'-}YKJ!{ Ѐ><h p\V[hLFjt&4.|&n;ﻠUiW&(@ᐎKDxy`|D-}RVѽѰ݇!T0 o$&[Ԁ"&v`\)b: h1gkߍhWz]prXwi&|JF4 , 9 /*\j^ ,P>~xE \=կ$H%Q` N12)"21OC!ƩKG Qj\: ֖1%_yj@$iE*#2۱t70P/F`dPG?`2<(AfN^Y,& ]jÔlU y6Pyy5V!@k㴨T)1*S*qQ6';Y[% $ɰQo qC^7q8 L~'٪*P*)\`N}741s{'p D;Q#5a'To!X'<"umGi>JAj X 0"&PWhQFAA. dwPI- F_[wg5tƾĮ$SW %%ݰ&e(nܮXn^&8( KDLݩI3֊ףp])V BRb$nt5 믧h ._ȉt#&=|f(րjZj$wHn]1%s QP.TG,X 'PQ?z_6M!zX30TȜ6`jd;78,"Ңwe, ѣ-*bY/pWUh{Fo&hc/&"E"WR:ǽ|S!ts50㢸G4TPwao{ Dn`Sk4ϼ2Ϊ?%ᮆ-Am*#NL?<;HϢU/[,ALRQ5\zdM׀D6jTT qYKdE$8꾠cʽ@{wbig>ekk ,,1IQEo HtnV;+db'f实 'Z_z4s0uTeԳT@UŠA8f@&q~ȫ*I{FݎI[ e;6E_V7ItFǶ}uZkCE2dWqo$= @VzVp=vHwOd'^IήTC;WzHp6(T4*@eqͲqD--p ,d'RxPx#roZPAl>/ ]3]~D*7((+%o #a?dAFd&C~u?~jcUB%7 yBg(~DI!H3a =СΚlpP@/5gPD SV3aE\,:::Bk0%vfxtvc)ӵB WRJn( [2UC?"P? i"L"aTg_hxU !EeZi_?/*3J aVOJ';g' 18Md"@J UWC+[!dgܐ+?sq\Ajh(> t&\zĈb=\I V=8"qm  ('d@SpWMЫ&Z)Y%%k4RW/`]%Ҟ 91} oMQt څْG̥ rD82Js"E'pr /6>n!հU/Lt="!,c{ݨ ‹"+] HRhv| շ)@Uc?J0J:Ǵ wq` =1csc'LC'*GPE(Oc#aՃ$35_*Z2RNgN -lepЖ`9}6BGeHP0k(L 1 UjZGb!) S%e$*@}NG W&$TEu4ֲX rpvJMa%ds`TCߟq*@V#jfeAT< ;eus0 VebRceXs^zˡX4PvbhB~hb0"Bڛ{2Ft+ EVZUOIj,+uPSOc}TVQqQZmu# "[^PF ^X O'rKX5j}Kg5#^pK$ouIŧ),exo,#Tr '-$ ^D~ʑn>x6@% b|QՔ%^B҉"YFm 8q" Rw WSʚB%NwD +Yݚe#`=0xx*;6ebB<]ex@ @UuRmdӬqd u\[9QR&Gd# %nnWeXќΉj16A$2DPs;M." 3I /Tr;dpQBO%%4L.HM:h#PXh]Jel|wᾣ2DHSZ"jAȢVx!$̏^DR)$UcYDF8fwoTA*im`"r8 >@GUBrxۚBC*X= mPOyuUСb$N{0łK+桃yCHߪg94QEa3!>X}%QXR"c-UW

@K" kH%rqDY߯+mɒLҮҟzvXsa2 VFLyZM@iY(Ϳf"81 Z5HY>*W*0 SLښHm{"I; #0'^﹄ٍ SU=y`QO+F)NI鼭lѰ !UVrbD%\ @'2fqZs_U=PPeaTJX&c+N/zgpFɝZ0.>*-$9}sML{r{fqKq'? /P#>k?`yM"7F5(8>L}jc aCaIn=% lkjfڹ(U:XjQOH~ƼK;IQXVu7!GҠl/A" IIٰ]8I$khgq\k;TM鉵]BNoXT^ ab~:/Y{u$I ̴VvKl =DtkbV N=< sSx_vP$ D^eUAbM):<].%N--󋻭ơc +3;# wґ$wZ#{2: W ("eOIQk[{rOVDE%5 RfiI q }'I)fz"<1H;<!?kCBo(oH@2cq: ),; q ԫr*Y,e`ݴ rx)dIs\1 {_vvsDb }W,,a$6ԅ7*9E&u I̸Z [^h-pIj+BmvD9=\-,~8%*X җ:QLlsT_w{Ɋc_(ؤ?dy?o(Gχ"^El{R$]T>- JxwKԢeǙ6GKRRvCRFU#rxq& e\Ap'G]j{$Z\Brq@Q QQ;$! 3I/}e0 SRtJziVSEM"bdhsofC'7SzRKdfKS]# |~`g}p\?g<{ĞQ Uq0P LR @z"Q%QD$KC*=9M4@`JP}5IWJyքHɬ%WU $a Q:NLI¸tEr9YjwLJt} 9 R'=O3>|qZvĞZ}au,풽ckZ TUSop(KNPC2D7Gºo-KfMJ{*+:4 [wxҺBE! A嵲D@L)NƢxI?ONl^rLZ\2?×5 -wp.a RJg4"C!7ZWx\D /}y,T|cB'h|cE,70)j_(#Pʼn~&_&|Z`k5Ƃdyo+Z}yI (`FT9 a2Bm<$ tdx`tԉJZZ$l@ȃ( e,T'0R,hP]6Er}+9k\2IVE{&Sk՟jȥCtgMdDf3A[H1[׷RҢQ4PPğ;)1EX1jM uyBerQPސϗ~${uVaxԂ$R:t,PUH`v{H{PWj˜ojC@angshZC URŗCĤة݁^"P'*zQÜ$)JIbxL`ӎ!j}%}Ӧ'2jGde,NDt<(U܆+Mi(#1+ NӔt*"5w86d5\/qh!&=@xJqm6EE3#\:T 2k0͖قP5[N\YaBeX`Fan{z^4ǽؐz^ 's%0@0D^Ӗy7QM}p&aҮaYOkpavO Da.κӆ `x:} 1=43n[xd4k҉عq^BJJ hNv%p$&kQW*$( 9C_%Hc - I$XoFds j4,$EО e5 ÈF,BۇHͷőMjTuv~-E[TdК8S@$ѳ[9/7[d!؀ Ozt0*](;8Q ~i]> 2 jVh梗Gʴ4zNtĴ GI!҃MJ2H9܎k@翔|Q5%oǸ I`uln=?X:#[ZB%^ԎejI)e%uxL=ejZ$@JLjU ֦v#%S>~w"p)&QB]2 #E(\8MRW oH -Xs^S+z?k*=X/(^v 7;9Vcfg֞y&ߣ퉓f;7^W੅xYڨ/~Sj*U"}++l6Ш}aYŔm,RDهZ+yQyg5-|^vRU6(a,xғ7[B;DHAȎ&&sAjIeڹݗt> %4hL0Uيdce aa74ѤxNʏp=7s )њx #5Ϗ(>o]WFv4D%JxNfij"Mch(PUcgFWo4ztXI'2R9X9t 1;)-$̥[3D7%K+j&wT;]-J3<|?SDsL=s;JlY8Tc^# ٯQ|BU&2@yyQ۞2Ta%D"ZClM!PpDn],"gO+{ӠpcxXk {s*CY{%TmBd/[Y9VljOA$*7"Vyz(1iݖ j4URbLdꎃm@wkGHKwaZՇJ/+zϒ%=P$J)dwI69C8K-EXVlcD\m2C5W5XdUq OM`HiXSly](LS<~ ) Qn9v0W:JNjyluãsDWq!x&$TȩR @/![-_%9a(4S^2/ZP#NLEA)K2CȇReGeRRݚ^h!PO51ٴ"u{#:aCGQ/.4(x*JDCe&gPɇ* u`~c5<OC:SuXtX*| xPhawY~h)H-CPZ-'KāG (̶Sl74/pVxG5 aQ-a/=4RM3NKl&$i;nQ\_rd\Zy+:*]$ǎ2U %9Ec K<〷qG17VrPκեv0OjF^6>20+Y G!ODyFt}wD+;׫餣;mL-!21-Gx@7}Ma!ހj;|?mQPKh =zz/AI"!6f"͔0O-R'΃s wr+[BvUfD@p0zVe#+"kDn_8xJvˋttE{%1-FHP AJt!oc9a)%cbYrC+![|t>vHL? OvX={jΐ/8 ]WKDC,?IG k> V+$PRӬ9 ESD֨>$˧}9}-V=;s))rT Ұ(!kxsP6Bl+ҙW$Jյ(Y׮BAԃK=v9 -R.c|4 jT>Z5ӆI\dЌY,>m! 'Jf@I^*>ͦv)t%VfC'_=LѥLes u/hDR{u}w\E"O#[ݢCr|&z\р!|%a87x;OcB{PRH }n5L~RBͦƒѵ@~&-]{En wH J!4͔(3jZS[UbNrtȽIҪ|ምh#cRSys+UJ wW@S$.NCLLGmQG;bfMwr<,Ad(QI6G0Ҥ햂"X􊅉`h۲ז٬-Q@™E]!EAUEAz:p+c~QP]c.JkZE,.$9sA&;_X2/k 2,|pa: ("?Gei.Ő8K*4>GR(j.PQT6zȱ{zPWoiU|,2P#CPa(tQU!cZ%)MޫJq)ZHIR>stream Bi)i>!&DEx/(I%H:ܟ觿>hEc@W?"O\VZԾ%SZKM*f3 A}|uG 3OIi>5YUh2(bP~q}XLzkO 20}1Ƶ>$֍ʟtP ?c~DI x 5VK4~d?o~>o_~_/S_O/w_~otq)/_ywo~nnߐ?3o_}_o~˞=/OW؋??q߾|}?߽?>_%wqHvⱧOSno~ 9ԇyq,5D XYOJ}-}b7݂~El;?Cj[}%Jab}޼rluOi*6? r<ΆOx6?*$OGAN•O'=OݗŸHh}qif}sČ-_7v0$cW7/lD /oD  7Ntl~K0{ݱވ״Ә7ce)I?A$nbzW7s| 2Tڦg䍭n#̣Dy/oP:JkDUMz[{k.D|Uբ 7"noKŬ>=إ8Yihc0۹ݫy;qyM1w5~@N@zբS햋{(>ߝ?%?1 hYN"ll'+דF>i1v>b@ c.ksk~ܛ{g;MsIk&>P*ĹDqoқ?[VL` !!?O;==~߽?b$g|OzOotc|>ѥ1Q^N/>wsftOG?qRfs'şNO'}=9)㓆'7:Ҙד>6>˱O_O.餏͟NWNmtcQ__~w$v)~6}'/bwIn[a~4UiU&hl,@셌o&stOÛ+غ8X툅Ώg3$)ŃduGW<{;C_0ͨ2^ɛՌFxtp+,jq嵡oۛfg3p8=R?wC16g:3~v? mXͿvsI'$7~uQY\O,QzƧmOG1K.ʦ~ߥ=m>odcǘq3憤wYdXiq96fcsߚ*.}n55s55eqh%x3}>,L"Bg0|:|}WX" 2k̿~.q>|mE)Χ\Z>!xW\TWW<o=u>tH+F'l-Lj3Fhݶt:W垁z\mof<ƞ zplj|ru?I(o/qO'uF ]'Ep1o4˹4ϛ iQS*Z94t KKq/VIs:^#65[?1 4clvs.TλYӾUoJ_9cx޴HohXg$vy{/>WzZ/'\?/%H~3no_ . AtR|O$O'o8|ƙGp_9[_ǹƖά5=^ ;m1:ovdxӜ|BOlV徍5דc~?v-nC1'v1;]RuCdp")4_!m oȀ8|8YJP^Gww}v@h-8*Kk ; G 쥥{-ldMe]{_,~]iQT}f7 w9c\o$o9{{8#U"2"9T4r=_Dž>{-^@ Y`So]٪F 3 ΏI,(!_ȦQg j͋ͪF' [dzyCd&t{aHuOW$S(I=N *&<9v!ulouMC2AFER2nEF;FeI&΍  mDͩ6\ c|PN79z͉p0_BA۩9Anl#x6,d"3ȵ:sbJIC3PvW՝Bbyaj^RAY?lzRnf> QFsIX΀%k3(-=|&2 ʏD[rbFPHfDD?UpȾ#K~Mxq4SǙWqOf7M{ V҄ɸn0)r9(N<9sT1=%EU+|Y {avjV`6@應qlr]Q7\LC1r茺$g8n`~Tj1Y?TfDh ti(cAHk x,CR`kCsVG%f{D tj\'`PLyw?vUH MEW5 1@7.9UoD ju^V{ml@V;RnhB@576{ʖ3xOh3iLtz#sf>I'v:|k J6eJd Ʃ0ҺEd*SG1i͖ZbõR 5ЉRT 33,SESZӪ`TABTـf^G3mUh{j&iRPbFt>zQaZNu* 2)$ [lEQs; Tx 6-4JnhtJkN1bD+!8㠃M8Ĵ~`Rp{}U[ fC{C`Fuqbh1L-l]M2@ǛU':ңkאF 3FH5CqRUJk- kzpq5Q-ae)}VmjOg*Ss:1|[I--0mcg8T d8(.F@!NEJ(>oXJC(^oX밨B79$201M9 t NXaS5&`iTC 6} 4a\k<+P1d # MǪIP)+'m֮4@DYO[ ENA~^ʶ̇G]% K˜+&)зQlp&NЍ:m(jztpC=j4O0)c4̥?j8VQK̞K'6%V?k"wLԈد*El fQbT1`ֽo(FGȍR P: 7"Fg8<+"@M.'1 ngKQotFE.DgYpAmYQ ۭ:AU;pdj W1-\ѬA<sbYSղ8guT; r.s vw-HQ]aw{`\z=\NYnBj]% :j66B=a\BVs3hakǍ:2"ozu\RI~QEF3C'siI(JeAHTH7Cg_ա[8S@ّ'zNv\z7Ļ f%XWAVLX_*b&`̶1gm\vuhlbI-ztC/le,8J.&@3dX\Y/&3pr4Tu@ "j-LmBpl X\#l98o"wrT js6\4[L yU(-4x\Yw!lϖdaToY%M(Y(6SUJvnznV/ͪT~"9~Bǫb&#iJ7Q>dMX&ްɮ-(5#:x6v T^@+z#jl&f*<J"DcJpl;eذ^-OdvSs4=)/,Hg}Do] 2̀5;3(n!\zכ%bƮGa( Y#HQ@mIXp@YG;P|A1ߺ 8TLHC)~?9P14:# sZè]ǏJ&t4a<.{DzM,=J h`x_{~_orUem"`1W 8qC&duC2ԆKwqVod8B'%g$EnZJSua>0]Yj јO=RjN-Mx u oĨެ{ŧnP͔zRޘZxDpC% CZUFڟ]G!~@ȓ7UЩG RszRv)Λ9؟-&8EZwhTT6WGVb5̢ӐuVIb>sM]V3ʥѳ)Yl1 /KZD\;S,tK` V(*qx$ g]Puo*죆"RWQYsrK W5AqX@]hlh:#\N< 8idL 7ʭg1Ȱ&nbXjat=(AA]$ʃd!lB,ZҶax] ` G.9DPuu(!.  #]9es 8=?6{kҦbQeQv<4ޛЅOZ— ԯM,Ixɔ4-~ 2Yzd*?3s{ӂT0M@qtؔj9 ,({9M4J˵9_֜h/Lѳ-~qm_s?1*u6GrbnlC@*Q/"-hY;g~ENr{֢so`l.y&NоiG0ޫ8K6@̓=iJ)Z,z D1q1 :bh$ n_o3Ʈcu{.k"XIS4h2O -U(ag!\`.r27kDσd0%7@02`E9@k|,& #{-D oU-OTylͽH;n g`"$1C =7AoWUuu|_taZ}5ha^"I&(M!8"jO*ʚnUĕBO(ly{}3tDC\.*FۡfeE^] f]P͖O5-J_eY`NƘS3W+v^b񃕽tǒ:ܵ3HQ}ŹAX@]f:=%2#z;zDsT\$b^ +A55Cm~IEW%yLC b9fKͤ㘚sʶ&SCbˡR#2 &O˗wX0 *V q,4ө9ZMUGI? =}!b*Xj\B qFlXrʢ&^fsch7{XA -ƀ N\5C6$2`f̀&[vvPd̝nEd- ݁Q"  :Kݸ݊EBudkEűcYNXg9,Nk:If%PfQ6 I=Qr!0I @y8]ʂdkk[tdJB Rp>K ̖~=U/:{]YtHK?&he_U ]GY݈0*LØ ' ƨT+΍HG*'Z LtjFh#Ь%VvK=n\ڸ}&4щ0ɇ1 b !I&M ]}fi/puvK1öSQPb_*}Q{.=5ՄNKÄ(w ѕ%9tENqQx0>5z8JYNάAd9^V]*u((ߖcws̍8)Rv=EoS,I/g,QJmܽ6<'0bOy[Rqy}͙%mjA&:*?lʵWMRupiSa{"AEXQ#cHz{Zp*]X :@],E sY- /'˙QՎ,7L6&] Su* 4'jS2G1b:ޕԥ .1ZwMNdQ!~nL+yӥgk3}ϊ%Nz @mVj0vc 1ڠn}ڋD=ÒU& 2/p+}|XT-6$!e PHGz3Ѳԫ"1a8I<NǦdaԂO@TB-I{(n#БϙjB,s(K%ڮ74ב=ak(c/zьEex m A/ {hcόM, 5(eeIVZ^EwC?-'yP|TuO\; Q`k2fU%'uZX6V!AJg5TM{Fvd ̈P\)8YC;5ȸrV* hQQc p#m%1/qjnU;K?]CgUۇ10ٚf^]%RR!TY ` ,hB)i YSK΁Cdڍ窔ҽcbw-2J\wRffN4C ĚJL.4PN@ 4h$ha.\8,3Ǝ!K 5EZ?k{L}Pn&@ױKj+-<]΃â}yPu3 WR6Vq=-^^UgQMr=7'~ x1QSGAG5w~LySMz1{XAG%ТIyr6ɶ9"齖XUY &}|rt }7]'G8CT)˚dB@kr6tX|RTgQ2G&Nvt%P1T Db  `e4ZNOޓVͪӠ*)gMV[Zg` [z~n]kgZ?ܺ&1q$n&-]*qNz0sulbO–Pem+q{qSMIZ7㙵i٨\+e`0f\ʹbdۏa0Y ^b݋VenJ+UQⶼ~t([߯*CO3[ }k8kٌԁvs҆ & pF/]鑘B-i~ 6I^ƻpGDR#YG<eصXaHLOh*/G I-sH,GgWZ=Sòvt=˰.;yn|)P-/QO Wyl!Ӥ1%6! pYpʪybs^&.s-]4q.Հc"69|'cR\h 뜪2̀&(L}lC,zbYZ7aD砾%/!uE"k-{^w"%oԢ=&_+jb! O3JζEJhZ@Sg̸ĨKURBT8͸$^J+q#~ mLlfb￰v^ a!@<L=˓7O[S߯=փ8fϖ5+`,T;61v-yt0a 4 +2v$]B"~bH]74[@KD%[auث*&02+°QsD1k[IwmȘfǽYiy)B`&hzz"Ş1@5{y3{%*J^O"9J>quk$,Ȓ <-`AOLYAƢf̢΂>U3CO7ɥZo0X`ZbNZ6jP_@.'6m/Y=6crO3/HS;J6p܋YL ,cE8Q9Kbޖz{ImdHN4bדx5h XG'! /6􌕞C{ 4ܽ*f.Yt6V2OrӱDdGv_ PXxSYRwzIbd>;)X>{ 6Xtm`otH5#WY:'^n=ܝ3:V։bnɜVSeN7bT{ ;-[`3B;Ѳirˉ|V"u4>׬"=EeQR5,ziۤ@n @K/t|sY6V ݚiAn}T{87ZQvh Xht1÷fjgZQ`YЖXyMV07pYhc0둪F{VZtse)zV¢(B3=&e?P}/z n>#F%g#bwxK]DHd>tQ kQ`/ҙ%$Gܜui|l1Cq$tn990Ji{3cоU&wVU'$uY5̞V!&5_l V3 W*$z!X&N7b7 ­8Փ &~fvN Bdxg;ݗ3>G~ݽyݟ/nŷ7kvssv}rW7( KDZ[ ~_qKSImIab&:{ž+pm*{Ė @5ʤ3Wtz-PN'&κ"]̕F:%ùNfK>*9ul @R=#pmSp8ںf{pFpf_p IMl#Ǹ1C@g"g"KUHbo(|]8sNU"<[_TH__8 P+Qܽ}2 u+0߭iEͷfIk?~AW4o;W_~'u}uC:i]~oV跟ݝ͞8 W7O_o~ݾyIs_Yo7̗oꍼWB޿W u ;:|ޱ W^>+_zwg_mu|j#O[O{d]\~˱S2y7W7nwxU7__ޟ@kzOb{΃o7:?aM_yx:s2mo:|rۮ)= zL}3gNݒssyk(OJ ܚ<=%pkA-tx: Vr쟍jjW_~wg#\E~*0R Zwx}.0Ko޼{=]go^=zwKΜ󋋻o/OO$ڕf<#p8Ov[qyX{!V/no>ϭ}T_CT! I[0n'l]|٘=6HXr<5Cww{ut}ԖM;д_yL{NӞmSi;d7M;~6@7~<+Tw5W#`קV#`r,h^|z}{ϙWgzUvz>dw8<[JJ z[ #eknn.86|}y[w}~닛/ξz<tsaeY-~tk?nbi{3ܭ >W$*b dos"}S,Yh+t`_n߫^]^]bxϷ|᜝~ndUW|mw,o///aq5n/>B.o.ζNh ]'/<Cxq%>Z'&>GwjV짭ON \xr5}NqGLn.w`G(G剗{.q}.a3&lf<5!lmb!l[~Znyoylg_SMO9pfCΟM+y*3[=!p!pfﴥswDNxJt]u>XM+zn5OfQeە=R/7//^]޼!4~w(2y2Q--ܡ;jl~A]aB6"J=6%?t.<]`Kjw<{N5];5 ztI [S ;J N:lm3;l=^;<Ӆ.ߞ>%S>617=LXqcRϻZGiWh?|ә|{>yv>cD:y莥s~Nٟ.nv5W~wO?>GѭW6m//_z I7ߨ{Ds~;.5.+ҔܭK{dw[;cg|' />yy'?\^]rwۻwy%ٺmn={sm|0 tݻCwoѵszDZ.藝 t7%+ɧ ;󹨙JxN(!$=DjڶI[|\ỮrgKŃ119jcZvئs09cs09cs01168XT=隦e {p@P=s8TzU!Oϰp%ʞ{Ⴇf>$ںwpiͿz![G|!^͸x~jTO_}9q=s9(q%n_c>vuK*!8l/_ѨO?kFg !G=}wKxc`xT-OS9? b~!ǞP`'~0~?bߟ=دϮx{}ۗė0L9<˫Jj𶈭cEo\6}Wvᢽ:dzFߜ|{ubn-1ۯD_n⫻?{;UzEn/b>Rj}TjPRUzkՔ>%oysEdMϬŞTLv0̰,LbІg62įߑ'ж?=B~Qh[ m~90yjdxf\=0t_ xZA @ZւA #Lh@n]e[/ΖvPjA <5WggۗޝmOV \~zܫR{ɡ\*l Bsbz!N^]$.=훫~g??]moק>|~vZSSD|zWRGgm]=~i#]9Q_>'vHڽҎ[=okI?y}^Sjރ/q׶{Nw\Siu(7w/S`=]xa[ |Ǔч4z! .$>B.ء)SA .|v.!?wTCP8DzqnaARb;pGЯ>SKF\x:GPI'W{/~<Ͼﶕc)v>$­Ϧ:dO|{{zò./H8!+~eQ~ ysOȃG.ֳ-rEɣ}8eT$yO3x"v>=(ڕzM^]>XQϾӯv p+/O<;d;)a@Zgzwv.3hߍ&#l|&{"s,'x^]˖@c;iaѧp׿y[Y7!ѱ?f?~cDӗ?]s{u/!"a)ћ1嫟A?~\K] #оҍi% hmE( 9ڇV: f ~߁ZpSo3" 'ѻ&OVV2=OYio2.` rBc\*:l( GEXHcvET>B <6~Aixx@ǝpkL LE D^L`Ȟ(bQ;.J-+pZ 4 R;Y+4ohu`ܙ>r<]GHMjQ8T^0PyhM#کS4'SlDK*l'zF8*@Fw9+bnD' 4<0u',0(߆c,_]@qvݥƬblt9hb-B seC@9']e札 >$f`|] %*Η Ğ@{aH^7~ 2MУ̌1,%BƐA|$nd(XBJz"S+^HSd +M>?x*G5 7 :`E&fA9ХJXU$n|%\̓6vWw ,0XXꓘo~\/Z 2e`zϔDnjSő!& ݢӄH'ּɂd]-1$c&3k#DEhp@H،ivr4D`'Br5D"ƝYLKL1 НyYoˆQ $2{㷜`6RHO7S9@Hr"_ h{jkQ)SHUK5Ot -Km(,DW@)) /E .HڸECK"mID.+uz[[NHX p:ZJ $_?M_$G(=LH%LXن 2D}(l Vmz/$|m!BgolǀNljƽ$u3X5'_9wz w ,9 `Du T2^a[%)`#DiQx. )61[tUiM<'q`Df B"kÊa"?:VQm L?d8&oV'wJ窷 P ,s6{)F[_PT6l֦XDy 0͋]lbfz7K012Њ-΋\ccY؅cȶAQ8OOq^z̀2k36֛ nfkF4Zj3_l~/z3hb|>A/VGjeh%LYKlST"1r>AP٢ SN<_v =$j?@$i$eQ*̗$.w=j[3;«H(i̾y-ņm<Dۤ\Vƌ(j>d=b=b.$DlI+ Mt{,As@*WTE4^#AV%Aųhl'"8y$;B6l.g K* B=F;&1; ΁CwGB< ftڼ(F}!aÀosXz\#J΀@#4 W9 24ND=n, ]HC ra#v5G^(/| 5*X[*)Ew5 OJ9s4ܰG1.,$d N~_{欑d [I'8P0zN7ʱɑ}k;]Ȗ~|60%>GXsHXzF͔ N{"Sq0+|< 2B:C G ¹t65lL(?fL5nrg:9^#{Vj,M18".HL,7hdXB<#`>8@ B3YQ4@tB8›4Xxf>BϏخŖ- B1^Oeci@k'Cd̹ͽgLI]r(;vk͈IҖQB2%#lH1>'-DI20MỦa/: C:@l9 / `]1vE"kpc0k Iq7Xj/X{'-p\Ν|b6 \ q[!r.^a%rnj qtd*0sL] &In%ʖil ќc:¦ Q;e1MйtWu$>;ՒFut6IJ#%ۨ|*+6a$oX<8#NbZ=hS26cq.,D|Y{X6 ?&$V;8Gm"$c bHGNjxG a$ E "Օ8y 2XcZbs,JX>yZTc6a DmM<5IܗpG3,0b'}`)R?v)9$N7lmm){y,P?/$c[0`^D+7$A0Q1[1?ʋa%H S13{| O^rI'0,o8AB/%E<0(l,ql= b C82_8`X̄0뿳cy m 4<6"qOJifLc$C vI"¯9Ӎ:d-A3D.$=( ]D ra#c$mG]_wOω(%UxE@ܘGp!nh[a&)橦 [,mA{[SnbLĽ n#ҍYhwo8v S؅4Xw`'K 'Q;ĞPZ7GZދ 9_HDS@T97e(Dg-q83[9/iFN5X_gshAzgHsE8dp!3!^\4J(IKѬsxEpS"n5D'ZAwil+Ed&13aŅ5wI^4| Z6Á9Hd&M[\QXl*Jή9"1hNKl<]Cku4 5TLg1yd*(;<[UWs`*8NTS. ŦA*԰(ŎBcQ&Z(D87H~0O Ja8 f YM|ݕ' lp::sNra='1FD])> &;58N#)> \cnTcq3wj/t!߰Su #S;ώ0@5"a `Nr7."IxgKj <^0}~3M*ړ%(H";B^#.ocEG0dH贈0x$ATDWұ^ۛemڎ6Nb s8RKALC8V6r(CXp!Lx-xsJAhۦ4l~Aes9>99XI ,AՃk$ۏ[0=z;d:co_ x4E ^ >?5<*XD&wGvMCuI};3זt<d(M)1XFE&XB37\D$n [ܸ GmT[8NN}v l}XD3ke\"LG#Anlfe 3`Y G3'wٓUcfS . -̫՗tEf"/3 ͺ{_"p6'#&`s_cn旄P&_]8%<+3j;32,/_DT%ăiALG1LAs[ܜ"Ix=xa{~47\m4 5 kH ,?]ӟm sL+^dβj׵Upu}vU.KJ\i(E+ eGK!}.į˯,*7%*S穎ɐb.S @WXdҢ.溰7V~O?CDʲ7"J;H*!-3/lb {KseqE{Ss^ NАǹc|W#VބZ0ԛd *:EaL򂔾I\ذ Ax7C=X.b9I "44. *lA%d44?<5tAjU ČSʁq68vjCid *Ӊ$>f`Q٩,5]FDcB#bQ2s7OFP 78#d<9܀ @\Lx"oƸ$R&j|,b00VBV_<ʫi1e#I㎤I':D"-^Dy$s7"9pX&m0Nò׽Q*M3˝< o\EןŠ <>׿r<'oV@jGis09&wN\ L_ z*3IԈ)#3g/s^WfEim}twu6 rx @X6)TkU$r2CE{ʆ?]~QѸZ8T i$sS":tSPT]aEyʆ?]~أ%#M`E!XF vZ7t9㲭$;|yĴ3`dgLgԏslp5^6G8`NJ8 K>rY9˽[&B8S.5KCܦ4ɵ9;|lIsFMz~U}6] 4ӭBP}9,!i 㞛 vZxHo*c;pf^N<̿˜%"0Qn`aYA._tN~;=vFIS}ホDkev*V i7I'!Ѯ#2r_r9v=<goȂ|Ig|Α6Bg}I0Di*F AfW'%/>bݧF[K$LX\Rlh㧒0"|xdGŽq"'Jg~oM߂Z)oUܐϱH0',L%F-jJ&rȕ%8r1uc4oob"NjNV%.e@ђiHH_͉M_XcN'e,Tfl?]_bMI rsXTǃKcuZ x8٩s뭾x5M ,snڀ "?ۻj{ՏVj˗vwşn/^^۫-ܰ>dIZH49]KmՇd%ayŷ4N=Zx)cw^ i+/rVk;k nH5/ .kFv}fpSJ#j*61Z༠x*DѽǷ</G!B/y&%#F.ӡD,kn"܉2e*{},$Qb"0fM?H -=>c!判2~öЊ:J1"c;u 7>D hоq/EV&&ޮ\<,&\pw~f&~`b4Md:W8 Q6ӓ >jk{:Z[ f%pe*oi3z [Xn3w @s⌦zH@ P/ Ia($̍4VTq9LjV49v̘[mHĽCuE9L"jq<1pJ&a"XDr֩RUѯ]uM8UFޔ\ܲA_5Ny2Z!*K|I50tIR:uQ} suqx1ߠɨ<7@j9lkg K4'8XS3񳴗\~ͻ0=jv㧛 \3+p[ ˑV =HKƠ9蕉c啢M|l5&ɨIq嵠U-}}ιS8ɀnIsC9 f8-_ @)BT h,@4Fn[cCDz)1ĻS- d _JsH( L\F)QjU Q}v_HxPIυ AQ 2Kpj HG)9ć^OOH^j>"+s\TLA+*KRH&:x- 9>Xd7_]|>=?s3<*&O|]]ܼ$*>G[iǟn|싳zūۻ %q'p5gp'B\18PYCIU]U š'Z7rxdT/!Y;%E 'G!b'%28׃qHH40Gkprl}C gb9NY%I HyW{f_Vyl$&IYBPCKR5)yFD8̖"Ʀq3AC (15 WZ 1TFݭѺ(Hݢx#o6zF"MueyȦtF_:Hy̵qy&+tĊB W@\'U#.j&P y) IQt٫"" R+9{ ȰCzKc>?ccA,}fvKWZj3kA w!9X!A4jcď"vDbNFPpIq8Ccl ){CG˰18=NUmT-'(,Yd1ˁ`S$; LxXZU1iǎEpI-XJU40 V > /| .6G &RIPuF?R҂iCz]g@v ev,qIέD|q_ScJQ%ѣ{V# 8#'<r5upAZK"Lx3wAr7a"UP(6^<t|m,Sa;QVϥs 5o/oYB4%=f_Jq;n(6A^DrStJAru"HJXևQI Md}9\ڣ`󊎤jSڋ@}{.x@F ;7p)a鋋R|}Pf7miRPz?=Wjgq[ƨwݱDhdF4i+ 4!fހ@5:5K}\҇;!

LLu\Pa5Ǧ1yD1!x|hӢcIKWKQ`1p+%ŮN0lkعWq"В+! MydҦTCGmPbT Р18[ri)I9 ȅ*i@yuINNo~, ]w4`ldViR4XlSDf) 3]0(ȽGrĽG*C(گŽwWP&JerY=Zȳ,bʩutZLpXEIjO%RUd&;!$J{@%"{V* ܁-.j "Zsnq@Cۘ /s\hCBMr[MXUA.脐[2HFoJ۷(0yܩXtIC괌Toӌo ,+E of'Y>Ԃ} ldz.Ή*Gi gߤ 4.>]a!#G)2&R`!c5+U$\j*H%qO^&+`n\/+eRcyP'L Wlr9Vŀ0p(<:\\^C=FGmOdTBT~?Hl+{X%*Jqq ,g.,Ð^PI[a`*(E@%"FFE I"g#sǎ"غB8< vXA)ŘUUx5Z(W`m 'O wY1|)=D U&+jc`)#9jcqy<'+CLb)x)Mf^;4PJL$ N:i^w{F[%(\1zk&-ѤWL\S@( Ok#@&FV5r16h 5 M8$!ʣ]D-7_rC.)G'9iG1i͘XBR\sKSC$B@6< r,]C bmf%boʑ+縞4?P^ǂ,NF Rr*{=8{\wfئ3р&yP␴&*tbݳt\qpe3MlEz$>Eˇp 5nbUrZ]ʍqWXX{묰sN8BiTk3n4_p&ADG@{H%9RF=r|:0K%";LRlO+9 DdpTzza5pRzs|M|wʇEFyBDVEd*bdF{V|VߋޤZT3+?v\|lg}*MR/qx.W +&[f%1N,(a|s=D{Xİ }c=4Tb(\qM%62^{Ѧto$ovz}Cެx%ZNk;쟾G>4k5$^z?_?^j_^]_,=m0Zr0T~9=8>t5JD$]*Q߈;".ЇRlt3#W:x٤?SM?Y r8wV1(jZa86 +L 3#"Ϩ"$5Pع$ٝ84E'L~Ct"fʰnBLYJ{>"%hH21:Af@2AɏS$d4.qK$W:r@y'c*tjվu~A>>)~`c @>Q-pi;RPޝkW&ݰIjuo` 'h_Up?rђI,J4@h`xyTyNЍW$Wd2+\̖W Kb^Mj %^T)1ЕSr)?}.pdFe>@8FC*=] 5)Z$^$46-)2.WO Mq z8iˎ FGWz@"3F:AyTQݕDH5Y$ĥh_ bI8ͤL|G׷dok?\* #j_$# !by#D]X@4a3cLΕΌ?h9ד|͇➎ [ )E y; b d̲Uן-QF:T:{M<]ӕgh/CbiF0^@U@HߋгbĠ, رg6v,;`xMHc:IY_rV]LEF IrYAx^k3, q$ !ϟCEG͐ZQk+aϺFiL3 Rj+U64ըg[`9l5ʫRs 2[#۸ 6h\0IF:# TqDr˵HDn})Z@=a b;@P 2E1n}$+q.07>sAs+97ccR[IW,DujѾA(50-.K2h*QiSK yηa$(E *=eGkz(2}D(*[,^|/AB(so|`/sSFC%N$fNB:eOHQ\<(36]|YsSS1 k╳Ux/ hG& #h N=KP,=848t#Ĝ.qw "w @gK8wPB ==o00Wd[6Yr$9陑$$oROuw'd/77 ĉ x dE r(ʧyV8xZ&d怩cN\AA݃IcDdTe+RAJvr3-0Y"^ ‱E>98 )j8\&Srl±2 rlQd?"Sq/%k~L S; ,wVa^~%FHq̤ dkpBa]DV ?fQ*:CgQZAP 5DvJZk=.Z{-?.BW.?89KJܡyP%Вm߅JKxiy)'UвN9)PC[%Ȩe `GU0gUuU9`.`,~K< 7˦èӹey0Qmߚ[ePiB> Ocw ZBBKX(hN؀HRU GFsJ}IBB3ٺJjOF'P)gR)G3T$<6^ fQ*~WK]βAx4T*R ݺN$K UjGiS)s7,AYo&%;9.L) VH9O :4ln [ (pAՕ9)eYX[E$m :syTuӵXLZ9B,)Aw^{R1G,X'+nu<+9.jo%|c Yb@#BǣTi.* ;?Gm2\OXvYÚESSCbˎ_Kʝ$JneZx&r yz{'Q!$Hqea;wøTR%rsh -s_̏>0pv [̙b- kTVou 6ut~gp E(( 8l$ gWpx8rg ’ "ނ3f5+' ޔ+-6^h8D"Oe*b۪xa=(m@o5S]Ei[ɲ .vTm%s3d $6*HDGYN-Λ#q-x7%PN # {g2 @NtĽlg"eoTEFUemIĠT%[4wX+ȿzğZƚz(!5PyBPTX" JJ*s*gŐЕʭVA*-LÏup[wET/{̝Œ]zJ$6. RzNDTN!*/9+g ~q``PFuB`*%*ن|^!{_ޭ:w<cǬJdrHΏ+QU@E% e+sJ&H"vU7U1$SNPM"y :伕ȓAd7aCɄs8>lBǛ8답HB:or h&~G3/$ DU f'~ҌSKbFJUNؘCe3e{+y?7}ꁞJH<@HPUhN"6D%Y@$jt t0Z58Dj( vV!u/,0lEt*z7'j[h 'iCv/&#cZa> n@9>TVQ.S+IXx\raDyϥD_𶗞\v<ꅇY"<0@,:IV 9HIZ *rhYt*)He +  UZYvV465J{Nޔ" DU3gSㄳCBkPZMOcQ}`&}.RnM[dT-M1"3 D*:3Qx4kI:$3G:**qLp=QHPŶ?ow*^T @@K~yD % ]#frurqaB R)FӸq+Sdjc.~K< H0>]sd\ '> |,>@ǫ@@n:]TŚ 6:0(ؼ#"T ҢҰS8QvJP`@ zRmjrθEI8 xWW+q΅?*CN@)`a>VFYCHq/ۂqo*!{^;CGf@iZbp=N/u EAqlSNFL2Sق$$P;N:Ȕ%0wb`ȹ XrsTԮ;t<]`WB4u(O(B`RJUVi@b=E 0v+o9=vo*gXSkpflRJV ת,3+9 bS]qꕑŇXcCX4jR+ZA g˦5`VqJ<QK4YLGX=rDS=3w%G =J7{nD(=!GFtJ=*Si'`==J7{ݣL#GFt2{iD(ӈQfBt2e=LQݣL#G{lnO=rnj9+ݰfW(=r\Jouˁ,,UˁU,XT>AeԦ"~0eg`ꖃʶ;Ap^2 +ChJ'#^Eb*>3*rP(zw钷O#`lz,C;%;|lR1DW6.40U >{o^)M dp'7E:"s:7,)қG-]윫C8r*rץrߥlY0^ZzzSc0UBzVNJk]g!{E_JyfЛ"~Nkflo]Vgs6r$|{Ri.AdHSa$b[tBbWkI8VFن*@e4[s4@91 %4y]w X!|r,nLYgopJJzVHURT O,P:PqmepvTWa膫2=)Aޕ@Kgmqn95;KԦ'P$/` b w:5`+Sѱ7?j;=)U[7uO!I{V5< Jj,vGQː%Ԭ%I`O%RI0A=pż*" IuGL5Bx*0AΙL*vr)=* ]1YVx#ja("^X(5ErQcŴAXCd CYN~|X$Ly9{#9#oT@<>3y/qAAQET  vud]Ը~bY!<0L1ӳEHiiEc2M䓉7,dNf&)/u ܨ^h@9sהIsN*ٸX rZ#X ̫*͹AWilp&T  780r)=ĞϬ|C͏+1a DhA!ũ!#Cy%b4o@mrF0yeމ}X) D|1$k!(Tp2͞n#LeaGÕF`7BJ\s<7qF89.܀X#Tܘ&V51v#@ R%6޵T;/ | U֘λ12;.<"\!H8O"^KklxC&/v .bylR3{j񰀓PraTT95xXl\+&iBBg(:WMlF{` ]J82%r4AF Xpl;![+Ϟ#R { E."љR=$k8TCm¼3㖭4^6iPow6)]2yMNVNZj)[Hn7ݚb |dDzU6(aNI=ےKR<- ` a?s>,#-a =%Enko-IbD,A]Dy4z&G D(45wKϥJ,*VPH)Uc FW2~B'$ ylFXl 8q"IUXl@C=x6s[G߀{-sc@TSA$dˤٺObS$~?jА]Oq1C'Pdv U+━<%jPՠ!8Ƅ=>B菛wIAvqo~ v@:oiM0;ؐWwUol&PKUlP'\N"/7Iws=p̄k?/&ސ@bC[?7Elܕ CP[9aQ']TwrzMn7j'I'2gS.oȴzlΰNsQr5 .*](;BA~y(2^N=vM_V:/znvt`fNo3쎷 zNٵ^`8ftp/w{A*Z3[/_LMSjO%ڐ< -a2«/%qVp2Bܧ|"{ZoE=~/B62T sɾ}qc;娢hC[5'^yھWA KSp#zyi{E26B!\zy*ED'73NA6"#K)ou?dnD&rB;((%yr-A8JNfUV+r9!e9$Gz)n4~ua\p"r:G \[9.ŧDcSӒ>S% τ6(.!TLOg)1&"'/NM! RjR- >rH̐{vM虉%?+&GG014$cƫ2)@z 4c_cƠؖ}Bd&,-F%;l's S S-#O9&#ZFVp}&ITH\-&R-^gܻ`)xѶB,!@ [&@, NMmQP$&}e$rBCp29 A-(lT$Ab!t/ $">G&'@CL1VS7&g֢#)]pؖkF9~G IqTFM:g"&~`ҭՙ\(?׼Rr!4b*9D$E,vs8JVn/t:"!9Q).2S4#JHad<9&pR`_1cQ Fx q&0B7~acH3ZNb$R `g7-8Pv0sf\Ӹ>EdAs58)%cY  (6F̮aPd"9-ȿ "e7%]1G"ۊ6T g{a+&Y 4bcKZ!ϗ3D "iӲ M35 ׯjɉϫPE9"6S saP{|IJ)HXRI`VX' ]]\X)>NrHjUBT2p1Z"w5-@B7Sq(4јIYGaab % X%%t͠؈ۘ%6 L+I#Iv*”92 n$ޘL[2jqih,sxrMVٝ٤\lpIS.u Pc`%`@gV``F@%(#_e6Fw7>dǁUSbtDT#!̮fl3bZI@xr!p YEt/"*~`eDuؒT$F\&U8lNSB~v@[S,HH\$ʥCcM.eM`-by$Q! E7QA{CYi]-N'iæw\ւz[8q,`.ܔ@EtQC/S,FL FvzX8wŁC璝ܻp_ =69t,Ya$DYw!х""IAiؘItqF̗'çq{y=l]pqol9er|l.I#*,M#E1HN~$&.lɝo,1̜nF\%Q7ieZ<06r, I34<'^^1@,v铐9gË,-DHjŗˢ1B|`;u[6!hUB@=Ӟ.k>'YK ajl06X>K$e2ĶE+*QRql.JfNG)DJtؾHFHR  *,#9C$]Y.# :}M!71d(xaleJqp{%?L~#{6 T f2-g.g2T@L8S>…f 1d d=X8$~W16"(HE&&: e |(ͅ cmax.Ey09&uF$ `Ɖ .n %ʥ㉝Kj} C3Q&c P[~ L}qd.1(D[ 473)(gtdT#\s YHz_gr97Բ/  PqFd+f *`H9z,b#&4dFl#(S) i0bHrw1㓧#mZ :LFqh9W3S塻 ^!Nׂe[ AdڔPIqvi uٺ TP9Fhgs9βW`[*4T3g %2d$NDb#_{6g0AqG,j%LwphTbleŦDb1Nr$7д; g]W qY9Ź91Cm ?6%u4] d:1\:^'oa c`m79HLEQ.Sb& ęOzįѠ94YsT{ԣ#/c;hS3{NkixM̈́?qHuSX{\i?LbR QNÇ-%=WYkŠ18Bu{\?]/:Nɏb4܉r N?h/RlY1;=G{SK;3~Lg]䥥`;ze*Ϝp]vmܖD'Ϲ_uW=v׊ A!Tı19ڰ4,K"GdV OM6$ѓ8 ELs<^01'p\uRYbQ!,3!@Iq2m-!E'!e:%E6s#]?8u K3 sNE qf0k?z}>]v=o9[]ɱ i<}8}YK6jX N܄J_ۈ`4.h8u/ ȗO<5ڪZ.Hԕc\M0ʳL,3Μ1D(h0<:LF~XMrvZ?i'$#P(^Pmq7??(omZu>n(~UpMOj}~x8@'FZpdgOtN)4EijUeiC6.P %/}&i''LߒCai{w<;YwG`(8 N+SgpT*FyG6w8H`JQ"f]2F屶E2qڅ) pTG(MkJ2fބ]:|jsy$3/>vLwKuFZ#!',҄fI+G0_ZP_=h=T) MBBj4n`Y$mW^o/;Bnrh9Ac1jӤ&Y_ӑؗ)k-hS.'OrĻNS(I.gtFb*NI!iO _v(X~"8H'iC*nӚP* E74nk,/tѥ)uSԈNLGkta3sG?lt"'LpI97cM(# y+6`yuZ~uyŴ&Oj *LDKմ`9:}E&~NBNfݶʙqi攛XtG^L {/iLħh$FRd&؂D&nnMA$NZ(= $ d 2ǗW61ҵi^$,,A!FI44_Z}Fu <Lvgw bj ,r&X@D&`!n 7QM fR|\LW#eUP$3|ht"ɔ;)׸ -kM2hUe2/fk-FI1e^j~{I˙}M΢)![G!gٶwuF'N ,9}[|Ar{:a5;{]e_+ּ@^klY~oQK}6<^w܂9p=T&}Qg|◓V}Lö:Ug~S՞WvR+z0{HJ;AkVHD n:IޜL&Kh@ޙTSޑknl3&<*\;MIZ۝vgǪ_sjk869 N3t=&YX+fEj%>)tg2$n_K[u~*5Ui%&*fKSCS0ԋ[jvjR- Kؠ4,+ 5ݱ9ʤzM Ib$1vȁ vdBRi9kRLEE(}Eǰ)hYJs+Bmc4Sκ'R?-Vu_#"dᢥsE%Z@D:ZA!VI洼P sႌQ,&2S-rl@5&XG9~d \Ӱ6SNt0J#E>UɃM9b\3$0N4XJ~o`g$r-BYHn4f_`u[uM6ybym.-5`7q61ҷ~Rfgt=&iDR6')sn5v H6^ =ğawZ")44zHzv_V1v^Ftwv$ w:e;>8Uح^C[iS߭WI.k |ӭA>nm9:uƣ^gbo7Z3>x<5]._]v?v{{C(0hrʻ_?/Gubpt#(6+i vHm!LF;ؘ`3гwƵ[׵Ðcmt"^_:r'Sw\wz /h<8?]܋C򟇇Gm=$銝{/;_)Ǡ'-rg0&:?&}?)749aH҅{x"2 s9韩1leg,_=ulﻸY /o49kH q뎿Ttp9w{/.iF~njR/>vw?6;8.&EQ]B[N֛ycr/FOAW=7픶¦>a`0[T|J%Hg6}ߜ8Un&s5pҴ*.) 1QSy$iWtrtC{cI;21˱v5dJm}Oquۣl /KU[;tq)0w{; Zha'g8pwpC"<ׅy}cn7\='&}boYսmNvnJX`1y챾Qk8|:; &Iu="Py@٬*+_ Y]<;^IN2Pg{53<ӍϋE?:f[SKDIBkxԪ{HnGl|-K[LrXGmC!\#z2$`x!d'^ڮ(ܴSS:5k:bv3:|Xi=rC6]{$rUs^Q=tcH-@#gOl;ܛ Q]!Nq0&:Bi̝z ݽފlkvLnیI>tS굏3a9<oPZB1ڙ̩tM6XDp3Gg4H%Yf 1YδN9Ǫwm@-z65zi- ۙ7^n>֠"g-yѹc'T,)2k 8a=초j"Nֿ>vQwlc+G{qpl]V;28n[ts -D2е ?Z[c4nz/0\1j2:WX-,4~9|w:F/;yzw=:C9J*"Ru9Xvyn}Zn~ZnlOޭqyb;Ӎ>sTت rHNݳV^ɌM?8vVD=byl $ .Ƥgѣml+ f$'DB&5Gr7tC<>u'Kw={ϳv tV5c^]O&[A9֎%)dN퍼z2еrNi=o1(Cgnl=/k+->o91KE蜗ӝ᧬.NȬڏ?$FпKgFNGu Ѣ6DB|AYߪoɺTI-3pP w_K<8gs"iRwiau*W ϻaubpotDzy"kʯ:نL.H}{KʲjK].n-f⛫7_ܺt٥Ï?_̥n{nKjz³;7^z0{s]\xOӂnW.Hޤ/'}ϗY6݅+~zQR{&S}M/VHkJgZ'}]}{Zsp{/; 5Z'@D\l7k7f֨ݝO+1J|N~xÕz?Ȕ09G2GyyiK`3^[dt& Fg ?~|=Cf1Ji~'~~ѯrPWDx- OwfDm7>UCڕ 0`x-,k9ϑ _nUO$8 -^D&b7KwmGf4&OX|c]Tg~}s2(A\v(SC2GډIW;>T'ȿV_x_fLo5*RwzO~a}ݨ. dM56\zUݕ k_tqӿy7yq#^|h=C샋Qxg3xsTuze۟_}Y,}~xD^guo"Bvui obvlwu\`;[Ϥ>~ŭ{\n ³ >>[3Ǫ8:C.QQ޷ꇣxgƳKsL77?-n?k ެut[쟄1ono9ooZOJ/֙7naލZ]ݕfn7ۻ#'ӽم>},j;ylM|G +/o,ԙy+sd'ww喥/nyt6qH/=>N^V?^;R˅/~ؿspZؕPl݋i7Jq-ǻt~oto8^S+\=mlꇨne{ejzYX|ٻ\e`3l4a1͙ۜlqt|N:@vtk0f (o}q>!O ?଎󝣃kFGL/ͮ ˵❍uUv+hvw|~޾"n.ͶùP,2rb#nr}oof׳+Qr'Ҏz^F[G צGx0%}tsIP1;Žkc+C#D{xw:~4LPJK}l3ҽy;󯏪,߾ڇ h}W߮4eds?WwLM_x5y} YnX+E !Ϸ' Ƚ kˋHD\XItlڶ6Cmyqu{1+ץCZRtb06T˳k^__ү~~v[}\+b^#R?VKaqӣ˯6Nj^{<[;,> QǟJ+DxGT{~qs;]l:Õwەn΋lͮ3k QtȬ{ ۼL{)hʃZV/kǛ:OWŤ>7JNt\,ewnGV6nMi"./: k]E+ѿJ}xօEes'FX&;vYz:3yB7+]{'@wՉlm,/߃`qPs:2;T7Yݷw _>k~aQ}Ӆ+s? vzmv =MB7:sK? W ~.lhom"m.=ܟYt]F!F?4^7&IV^][|rq8$7k^LҭR@qeo9Yٿxt!?ZЛ}Nct%AW\'$tiP/N^}!flC3) $LH0?ٯ`ۘak(U$JB(.f 6 my34B^u: [KJNF qe^@5|TQ$ 6 ʰ5>EfǗt1H}p/ҒZ-IŁ Wxf/'J QJRޯP_bmzM ڛq1"_H- eR8>|He;?=U`zW]>4\u`MpL IG +IyFr8*iH y/'=E4ՉkW Ow[Ǥ V,Pć^w]KG*h`WnB@^_W0a*86)H8u}&xе?3kړ_ij H{`wHz) ~zY9uPF7yn4*梄h)|1N0НV۰}6HCxG\K5uxtGrd(U5[,?ø? p9x%Z( rL1NTlE f p X7WZ~"Jb@!-3L|p<M x(ZC_}Ÿ0?{3% #{P!~2f` 2ŘIܑI'4Ngle KQ Qm'e9Bթ?8[F}8_hj󎞤fExkxi xS5h.o%<;/?IwAdI)%?bsVⶻڦ;3asZݟ͚՗f%ﺗV8w$o]nedbW֛YϚTN޶oŗ\ZܱZ[-yXUڦm,۬ՙdc6Wa TbZs2>۝ۮ.m7'[>_dVlm}lZmrwf~TmtⰍ+O[Kw˟:O;yYsD~yG SžLQ.{wgF0e{7b{>7ǧlA\.AMs6}wqu$#+\{U!xhYMGg|׷cu.tΠwd3R7_q9;kC_c=;ǩFй x.pˇW0a]U~\/Y~޹[}u-F715n>G\6w ݏi y"Qz\aJXzbyГK=hi ۄ(x#r^G :m^rțcCs&Î}|}8y]=_|S?]sZ-_m ?_& Թ&Ҹ wA |NJPw7=-r'd3W@ J.sP)`BO|'ȅʝvǯHf1!󋲍d1n0)OKQ@S=*9ƹrv}i壣]HvZt҃aU6IU zޘ$VcB"ϴ!F8"c'olk_Ö} .\6tpP$ כ"3PT_ޏ 兰g,)4z +ho+5ī\n* V|^ދ_ﰭtCaN8C*6WdȬX6~Zx8.텟%f.S)1.^yK6HI~]?W]svQs}_iclaN6t~M@ 9EgXiZ,Ǻ*6v7R6tM niGqOZG=~ =N”%:-1}`L2NbOÙᨖ,\gzJe|Y Ty65?ܯX=s?y%}m|wy^~ a7 kQtVNXŪ+-~֟<Q~%w/;qI8~op߫T)x,:$]z.U?meY~]tD} f&ևR8}J*u1YfC^SL Q|]=#WZ=UojQ\S]ݙnxUh?k'amޣ&k7K>ectoB+ծZgZ|"_Ob<=g}}.0A}\7viq/#vZlOm`~uSk{˷uҍݧr-?.+r>{3ou_SI;߃>9֟=C6OrSb3{\ofn?JUh>!>g9[f_yA{q{= ;z*.UAi-᯵vL~r]㴋zC/|iL>{ѫ)Mlrm:yO|rۮuF0&خ^Bvq,[\kj|)9Oki6^ߩ؝/mjȦ8ٸ{=e%dW{iJ^ eͽ]%QfirYZg*kq~W\E&'K5'(a]h|cPg 2AYf6ޥQRoZoݘ/IJ'x R~Ր/wL*ʊ8gʟh|QM|>Cټx|/."zgG9[庛z'[[w]? &!W._ttS~w0 *kyG爤灝;\jJoQ&!2">-}K^IcE/o yT]5[O^S_)o\Ұbh2_$߈\> 1Rh8gV `N])TMc\fȁZ8.ˏX ClUB]w+fMRc4˳v{d-0PvRvc睒@;SYh =m-+yn@]H9wgtr`{1N{lIfH&Pkfۅ^ (yl@a]`y\YSMh6pZ@a]^ lR*s`@rU[6G@=k|f>N,R\etr?%Bhwq:Z@-mϏ]V=:@j1 f\K>w\QP"-]u7qԝ@qMɯ=75{;]ȏ+H`_bdg|֩Ļ&7jmu!#k fLyvDUF2iI+]߫;@aw}"w91(}U\=.b>(tWi"W2e t[h]l+ C4F*$XXcN.(3:fj3uyB,[_[߾e۝]DsL_ );Xy|5x;x뿽#~>6ߖoz8}1N2)龝-zS˶4dr&߿$o-bL}3{mܥ]ulSםP-lѨ(:^(31U\꾍8Wݷӗo_g;#w}O-L*NU3\YIѩj n>Jb-XԈJ&BF6WS1_Q %|ʖoB W2| t`smw1l }]<4HXE!fVu]Hsd3Ţ9->.K z =BvPfq Kz %+"Kc 4#zEx@٪]2GˀN(XH߀e@Ohe=m}L7ǔ`At^u\Y;;Wt)|_E:)R!d7o$nn%-ȉJ\0vnh8LҮy¨^Q?ɀ71azVr 4B~4LVN5I ^윮To'zds8Sq1^>%h)zxȉ0@lxRwF[!(b 0Rk[(U]dy\LsPC^y!!Nw,U6`X۫˚Ž#Oyb%!81%[w2sb:sb9 cmyEh]#G\ݴUb1Ӊ@Srh)zrl#L+\SZp"f?P籚4h.`Ʃ>fr}4*syɦ0vw(øh0ny@d:cvîkt4ŒV=ܩsR6ca%Fӭ5M5sitx-{XH`c+ٖ^?Ir{wd5Pɣ w_MغזbM$L61+bT~bq.i{KCWquGcqbT.YmGKVKqSc۩)R5lEET~4)PQi^:COX{q?k1hAJvUiaLLJ3϶_մ`p&wTxc &;2-=,k0efVFt^{5!',}',*27/&2Y=BjMOIt?&9Pul'}o3rη,|6}-y*}= sQBn}6B.*c-Tj\5hɮDgmCch7ԧxM:TqDKc2#E8YSjNh[އu;DCJ4-m)9]^m㷔>stream ] 9A cLBS96L{ fÑt­:3 qX&t&r'ɑeH=E5-o[&:4-*@g#}/!bbp2._gtM 1Cu}@d+aP*~US-m CE&#rb.Ione.ɧK,3FBgǝh+FDPtZLtT O@`}\.Ex%1-BmB-'? Ljq܄bzֹ~=%8Nu{9tt 9tt8 9ttls3,gd CgA,9ttقg)Nȡ3ΠS$>C:U@~Ư^^ dUCRb{R8ȦT' Zv ݏ'6K™S8L'3qYwC`4c)/K9|JHW I+Oy2b{M0rg^Q+'ONyJFP~ߏS&)*Knw&^zY-" sz~>=cK{ҏ)Ύ}Ν =dAk/xZ\i9fq9.38hPyd6CRxzW:#c0$*'ɔGFJRzd{xRzdyd67Nk|YOu[e95 Ns 9:rj[7Gi:O)GFNܞΔ'%3Νw82ΛwJ|8!pJi٩p[5Lj|]K|oHp3M$w+>6_섘HnYۚѧ~}bV71;RP*x8br Q޻Hqr Uiܚ!kS]X2P5(f=o*4.vT#>"nSRsa~T8MpZ^I{R5ܟ gN1^"[}؍H's#mYbG^.ٙ O5tYtdP0udB=w^,FonzmhH2PFD^T3NW+ UD`J43"Q9$"ߏ ?UI?fؾYNjO3+=s1s"CґvٕiT..0Ȱ]:@y6yKv{2Ȱ[3FvU]N*:PfةUPUsw3Sui_gؑ0y3 94oOz|A#E.Py-JΕi: O$0[v=NYێ\^tW#~$۝Ԕsjߵ^+#E|@̕~jRsuJrZگ,Lu¥̇Hàh^]K#ϸيOoq){+O+>k35`~H!9H7Ji_.Qшh3fөG'av쀵eql:-Y\7OMQ<=N+Nﮛ{Oɦ:l:\:ci$9f^yl:6bTl:\:Vsgi?W6V.itZtXœ5Nk05ntl:tOxΦjMCΆ:!;.NcgΦʥ3ce:NK.ZΞMKg[l:sfi~ɬ3euLtZ+`ϖMgҮ<1tZ\nxRBk=YQI罠=&]+ ħ:qvvqD:-H8^v^Y>>2wBw')IeN(*sg1rjM,7Nop1D`Y0`"UrktC VD:}T5kg|G3'+vxPQu_]*CY1pA3FCAg犆*2N辚 i"srrogsx'C:G{~GFU'c:.UД4Xg:3ob1qhR.%*2pҦ IDUr(4b|g=.3=suTiYs #0VUx:Y;. ~LdЊh:"T׀ؗʰ w*P&^r~1Ɇ*ܙ˯<:\Xm wdz[}~wZ>ѶR>^NS˜`m짊1ɱkXQ cl痿Se>ΐX hy9؃9=z1vT.O zZ#ELcz!<ײ8L!Yк$&.q6DL.G_<;o[L3Snj]cyJXzRGp5JbZA1ˬ$hWEG)Jyqmien-Cs\͑qЬf.9ꨍZs-Lhf&tVѕ̖{4U;KuF9r\ ; -5cHVz$JT"K '顴*<8>W}W 5Gj㹞[{S([p!ROe;}2ot:l2[Դs.P2KZ@-ݘ|K>lv֒yix?~f'>Td@7i1xSK>7 T/ O?A*v1u_;pPgcH?6]ċ׏2suVfǟ)ˁv\,نfz fבC?(yG\.VmFS۩*ղWu;=!jUV[1f}%6ZƝ{LzOe4HHCV{+O$۽#]M~ևg65ڸrP y'0о?t*xO7n*S'Q13>eeR7Tbt2}='Lr%΃H:YfY/Gg4u^+m#x?, =9 f8N4h9) ,>|t@|X{fLSWw))yOEſVO w|꼟(=Pg/ʧ;kQ>͜;KʽET @wFnW;C&_PN wC3 cW;n(~2CW3CɦB i|D]S3:S"^UW;oyB]?嚛pp]#T맕?к~(6G{5Wۓ\[v̔vuU?]~~i>YFIq@=3ԱXoۋֱJ:qU?Og+8SOإ~C3>o֔cG;$~ݪ~;Q=P boo3mcD]n9A0'oi&ȭW.i~j6(Pov9.9߆?5[Zψ"dQâW'ه~VĸTvI k ^[*3(܇Q=R61Ē`^E ʓ-FU(}ˉ¹L7 U&lvM'vM8K"dN." _zkO2d&!3v($S΃dőX}d5$EꏬOvviT ۋ`| 7oA]u<(>m~68ogyn&ރLQ\2;?&("j -aVzdzPIjD>c>\ y&p/Pt~Ò2(-@̾!G뮂} gz~„}P,qAU 0:`N`|1]$k 5 HEyVxnQ Alϕ-f=ŗ=C{b7%{\T?o/ Du+6ٞIjP%%hO.suW=7%ʢlfOGeK: +d;oUlFZS7".+y!/f)h&?DAcLZn|fd8Cװp,YNn8)><ϰW^C*DOC$Ō:_MH JG?8C췟kr`ڐDXh ҩ㋌B~H9 p lDb*!,5Ar3RIx[;Te[?(q@Z =4*g_,4OXjR.Xo61N9UiLW:(!THQ]U}N *R$ jP 82GX]?!UzښJc߆ _YsE28RNY xieCZ4Mf&QAHKit]0?(b$ ]]̭\·vȱǬìD]L#A!@Įc06-VN3%)N#š'M#Ȩ9C˜iM>CEBY4Dmȱ`JA`G6އw{S4ۅixC'Oc~6&+ȿ> ǖ,(&-gS1klk,Uh+}0NDTMeW P$ǰ[ 8?Ll!aA A 3g8+;>~˥%x0̆/Rw8^\D.BjVRd0 ܛ sI]#g˒HrM5}Cϰ٣#eә*kKa۵*J`g<%fbq䮉@UAWcHȪkf=C"XoȝXO26S2lg+M>9mTN7nSqԛ/k=r~o ȧ|#elYxC[A ȿթΆ=W]O ٱ"KS)2%fB^'{u)s I4v"!{1M~l^#CнrmΎFCCP!P:1Z+ _S$jؿHl)hQ$j)[5_/)QEb;}{ľIٷ,CJZ}{ĮX3o-%-4ě <$u] Hdܓ+?-MR "1NyL)&Ý!zMm"9 B&C߾ +9r!ű6C'Co\7Bg.R `GtT&Yy,a|kTCOhNd\`l+CQꯐI> :k$=ؿ 8GP-nkU&@ݔwSaE6rj<r1XKVA'2ϥ*Rb1Q~Nӊ`hU-̢SZ^*#ѵOLyZ Z-m:+Ղ VMt㺀|ԥ7Aű~n&!co,+M`5=-̑Ay`" RPepW`~q!Xj3a2|\4&I,jHFxLX`i`"x8HDnNE> |ڋȋİ{ "71HBȋd!GdX$E d BibYOH,@,IgI:̅E%|v-<|Gȋ6y1@]43bgH"@ P.#\K1 TȐEm_/49NM( #q ƫlf: sl-Fm PLpG|ʉ2pA{2t&dGD`\Dɚq6,%lo.}˻6i 3Pu1\xdle袦2. $ab0PxXQtP" HZ8bPHh‡Fx:(e!ì H8hqA›&6Y#񌅠ZU?FMڎf;+vm<+ A%h&EU <͒aP yXL^9)A6bxeY V\x4_ b iVDF1 #M# CR9h K+h EfHʳ}F_0$p(aar0|Q4MY#3jM#hXGDf< шY!h&@ҷȁq F92 4 u&x>(P[\D|\XŠ -pgbIu#P" E88PP!K& !Oֆc%dmcA)7 lN , @A{lIJF)ظ)LXT>hٜpjۈ cA! hԹhb;^@4h_az5oP&xPY)0bIge##Rb6#]ODp/$DI_NH]zB>@1/`d@S"l^) A0jZ "bEK"(&4Az#*FAT]X3KCw Wʂ&Q/0$EUy s$axy""OQɃ |#& XL##1!M ODM`aIȳX"+1K" D/@ HphEIhF²4"%b0oV3Xl,ˆU)\0< ѶCms h…  idXq ',Jm"@ 6c0 k9ZإEv h$"(n 5CTO xFh(Aa5  `X R`Ȋ{#>Hq0-C@Hi|h3E db&WAUh;֟2؆IVJb A Ѕ8$p !pN#Ah_%fAڈRAvӉDE@#f 0i 6 bb  d7{E#ZDz$ y9JCZ-'sFå) XaBs+3? bH7AD冎9EWNj@m"%v}" y4WNU<@4v]?aINKP0 ?4  @Nb kIQpm֔pd+c(RΒ" # ,H'#dF*V 0 sK Z@U { aV8Jm$q!LKlI0=EoHdoTR!7+ksH_^aWqsH$mXD"I+]EA#O4@y$`#f~"*$A Ĭ R7>P$lَF~`ݎf@: ܃E|j[MH@ }į`XQQF;̴ݵ;\|̺/ ?RG wRr"Ir+^hTFG04`b4r}%=%fTʀY[=@MH iPH: Q-ږIjumZP)yZR4:@4i@FbOų:#HIЅY$VGxj4(0 s`A 4Aj&̉Ʈ.~hcAeA&:,CU>8Ё8Au"y-2J"#a] uDB(J->_He_t$T(A_5~vH$~{`3Iw;@ 8YD7ӿNNfL-uoi;`uΤmk< ޡt%Rgpqi 6^jZѺ1B2Z]n񹐚SdϤ?й*> endobj 31 0 obj <> endobj 81 0 obj <> endobj 109 0 obj [/View/Design] endobj 110 0 obj <>>> endobj 59 0 obj [/View/Design] endobj 60 0 obj <>>> endobj 20 0 obj [/View/Design] endobj 21 0 obj <>>> endobj 132 0 obj [131 0 R] endobj 180 0 obj <> endobj xref 0 181 0000000004 65535 f 0000000016 00000 n 0000000190 00000 n 0000050376 00000 n 0000000006 00000 f 0000525013 00000 n 0000000008 00000 f 0000050427 00000 n 0000000009 00000 f 0000000010 00000 f 0000000011 00000 f 0000000012 00000 f 0000000013 00000 f 0000000014 00000 f 0000000015 00000 f 0000000016 00000 f 0000000017 00000 f 0000000018 00000 f 0000000019 00000 f 0000000022 00000 f 0000525461 00000 n 0000525492 00000 n 0000000023 00000 f 0000000024 00000 f 0000000025 00000 f 0000000026 00000 f 0000000027 00000 f 0000000028 00000 f 0000000029 00000 f 0000000030 00000 f 0000000032 00000 f 0000525083 00000 n 0000000033 00000 f 0000000034 00000 f 0000000035 00000 f 0000000036 00000 f 0000000037 00000 f 0000000038 00000 f 0000000039 00000 f 0000000040 00000 f 0000000041 00000 f 0000000042 00000 f 0000000043 00000 f 0000000044 00000 f 0000000045 00000 f 0000000046 00000 f 0000000047 00000 f 0000000048 00000 f 0000000049 00000 f 0000000050 00000 f 0000000051 00000 f 0000000052 00000 f 0000000053 00000 f 0000000054 00000 f 0000000055 00000 f 0000000056 00000 f 0000000057 00000 f 0000000058 00000 f 0000000061 00000 f 0000525345 00000 n 0000525376 00000 n 0000000062 00000 f 0000000063 00000 f 0000000064 00000 f 0000000065 00000 f 0000000066 00000 f 0000000067 00000 f 0000000068 00000 f 0000000069 00000 f 0000000070 00000 f 0000000071 00000 f 0000000072 00000 f 0000000073 00000 f 0000000074 00000 f 0000000075 00000 f 0000000076 00000 f 0000000077 00000 f 0000000078 00000 f 0000000079 00000 f 0000000080 00000 f 0000000092 00000 f 0000525154 00000 n 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000525227 00000 n 0000525259 00000 n 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000167008 00000 n 0000525577 00000 n 0000050940 00000 n 0000051967 00000 n 0000168684 00000 n 0000140518 00000 n 0000167200 00000 n 0000167314 00000 n 0000165523 00000 n 0000053607 00000 n 0000077650 00000 n 0000052031 00000 n 0000524976 00000 n 0000053043 00000 n 0000053093 00000 n 0000156991 00000 n 0000140555 00000 n 0000154342 00000 n 0000165669 00000 n 0000165966 00000 n 0000166089 00000 n 0000166211 00000 n 0000166332 00000 n 0000166453 00000 n 0000166574 00000 n 0000166690 00000 n 0000166801 00000 n 0000166907 00000 n 0000167082 00000 n 0000167114 00000 n 0000167431 00000 n 0000167486 00000 n 0000167785 00000 n 0000167863 00000 n 0000168012 00000 n 0000168309 00000 n 0000168384 00000 n 0000168459 00000 n 0000168534 00000 n 0000168609 00000 n 0000168760 00000 n 0000169053 00000 n 0000170576 00000 n 0000184644 00000 n 0000250233 00000 n 0000315822 00000 n 0000381411 00000 n 0000447000 00000 n 0000512589 00000 n 0000525604 00000 n trailer <]>> startxref 525804 %%EOF ================================================ FILE: doc/modules/ROOT/assets/source/Blade.psd ================================================ [File too large to display: 43.0 MB] ================================================ FILE: doc/modules/ROOT/assets/source/F3.psd ================================================ [File too large to display: 23.1 MB] ================================================ FILE: doc/modules/ROOT/assets/source/Novation.psd ================================================ [File too large to display: 22.0 MB] ================================================ FILE: doc/modules/ROOT/assets/source/OLA Logo.ai ================================================ %PDF-1.5 % 1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream application/pdf OLA Logo RGB CS6 2012-08-26T15:57:41+10:00 2012-08-26T15:57:41+10:00 2012-08-26T15:57:41+10:00 Adobe Illustrator CS6 (Macintosh) 256 108 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAbAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq8o/Mz/nJT8u /I8k1gJjreuxVVtNsSCI3Haec1SP3A5MP5cVfNvnD/nLb81tceSPS5oPL1k2yx2aB5uPg08wdq+6 BMVeW6v5z836yzNq+t3+oFtz9ZuZpR0p0dj22xVJsVR2na5remsG07ULmyYdGt5pIj/whXFXoPlj /nJT84/L7pw16TU7dftW2pqLsN/rSP8Av/ukGKvevy8/5zJ8r6rJFY+cbJtDunov6QgLTWZY92Wn qxVP+sPFhir6EsL+x1CzhvbC4ju7O4UPBcwOskbqejK6kqR8sVV8VdirsVfEmvf85Y/m9Za7qNnB cWQgtrqaGIG1UnhHIyrU18Bir6E/5xs/MfzN5/8AI19rPmJ4pL231OWzjMEYiX0kt4JBVR35Stvi r1fFXYq7FXYq7FXYq7FXYq7FXk//ADkX+b1z+XPlK2fSXj/xFqk4jsElUOqxRUaeVkNKgAqnzYeG Kpn+Q35nP+YfkC31a7KDWbWR7TVo4xxX1koyuq9leNlPzqO2KvRcVdirsVdirsVdiqldXVtaW0t1 dSpBbQI0k88jBEREFWZmNAAAKknFXxt+ef8AzlHqvmGa58veSp5NP8vqWiuNTQlLm8HQ8Ds0UR8P tMOtAeOKvnoAk0G5OKvYPy8/5xc/MvzdHFe3cK+X9JkoVudQDCZ0P7UdsP3h23HPiD2OKvc/L3/O GP5cWKK2s39/rFwKcwHS1gNPBIw0g/5GYqypP+cWvyLVAp8tlyBQu19f1PuaTgfhiqT6z/zh/wDl Bfo31KO/0lzXgba5Mig7kVFyJyR9P04q8h87/wDOGfnLS45LrytqMOvQJVhZyj6rdU8F5M0T0/11 +WKvA9W0fVdHv5dO1WzmsL+A8ZrW4RopFPurAHFWa/lP+dnnD8uNQDafKbvRZX5XujTMfRkB6tGd /Skp+2o+YI2xV92/l7+Ynlnz75ej1vQZ+cRPC5tpKCa3lG5jlQE0Ph2I3GKsmxV2KvzA82f8pTrP /Mdc/wDJ5sVfYH/OFX/krNV/7blx/wBQdpir3/FXYq7FXYq7FXYq7FXYq7FX58f85D/mJ/jj8yr+ 6tpfU0fTP9x+lFTVWihY85R4+rIWYH+Wnhiqe/8AOKX5h/4X/MePSLqTjpXmULZSgmirdAk2r/Sz GP8A2eKvurFXYq7FXYq7FXYq+Nf+cp/zwm13Vp/I2gXBXQ9Ok4arcRsQLq5Q7x1B3ihbb3cV6BTi rwTQtC1fXtXtdH0e1e91K9cR21tGKszH8AANyTsBudsVfb/5K/8AONvlvyJDBq2srHq/mugY3Lry gtW/ltkYfaH+/D8Xhx6Yq9mxV2KuxV2KuxViP5i/lZ5N8/6UbHzBZK8yKRaajGAl1AT3jkpWleqm qnuMVfC35u/k95k/LXXRZ6gPrWl3JY6ZqsakRzIP2WH7Eij7SV+VRviqE/Kr8z9d/LvzTDrWmsZb Z6R6lp5YiO5gruh8GHVGp8J8RUFV+h3lfzLo/mfy/Y69o84uNO1CISwSbVFdmRwK0dGBVh2Ipiqa Yq/MDzZ/ylOs/wDMdc/8nmxV9gf84Vf+Ss1X/tuXH/UHaYq9/wAVdirsVdirsVdirsVdiryv/nJL 8xP8Gflnem2k4avrVdO0+hoy+qp9aUd/3cVaHsxXFX5/4qujkkikWSNikiEMjqSGDA1BBHQjFX6N /kz5/j89/l3pevFlN/w+raoi/s3cFFkqO3PaQD+VhirN8VdirsVdiry7/nIz8zJPIn5d3E1jJ6eu asTY6Ww+1GzqTLOP+MSV4n+Yrir8/SSTU7k4q+5/+cZfyYh8leWU1/VYP+dp1mJXl5je1tmoyQL4 M2zSe9F/ZxV7ZirsVdirsVdirsVdiqQeevJGhedfLN55e1qL1LS6X4JFp6kMo+xNET0dD0+47E4q /Ojzz5N1byb5q1Dy5qq0u7CTiJAKLLGw5Ryp/kuhDD7uuKvdP+cOvzNfTtfuPIuoTf6DqvK50rkd ku41rJGK9BLGtf8AWXbdsVfYWKvzA82f8pTrP/Mdc/8AJ5sVfYH/ADhV/wCSs1X/ALblx/1B2mKv f8VdirsVdirsVdirsVdir4K/5yg/MT/F/wCZVxaWshbSPLwbT7QA/C0qt/pMo/1pBxr3VVOKof8A 5xq/LhPOv5k2pvYPW0TRQL/UVYVRyh/cQtXY+pJSqnqobFUj/Oz8vm8h/mLqeiRow012F1pTmvxW k9WQVPX0zyjJ8VxV6N/zh9+Yf6E863HlS8lC6f5hUG25GgW9hBKU7D1U5L7kKMVfaeKuxV2KuxV8 O/8AOXvnB9a/ND9DRvWz8u26WyqDVfrE4E0zD3oyIf8AVxVIP+cbPIUXnD80tPiu4/U0zSVOp3yk VVhAyiKM9vimZKjutcVfoDirsVdirsVdirsVdirsVdir5p/5zR8hxXWg6Z52tov9L06QWGoOo+1b TEtEzf8AGOX4R/r4q+UNB1m90PW7DWbFuF5p1xFdW7ducLh1r7VG+Kv050XVbXV9HsdWszytNRt4 ru3bxjnQSIf+BbFX5mebP+Up1n/mOuf+TzYq+wP+cKv/ACVmq/8AbcuP+oO0xV7/AIq7FXYq7FXY q7FXYq89/Pj8xF8iflxqOpwy+nq12v1LSKfa+szAgSD/AIxIGk+j3xV+dxJJJJqTuSetcVffH/OM n5dDyd+WlrPcx8NX1/jqF9yFGRHX/R4jX+SM1I7MzYqkH/OXv5d/p/yLH5ns4+WpeW2LyhRUvZTE CUbf77YLJv0Xl44q+LdPv7vT7+2v7OQw3dnKk9tMvVJImDow+TCuKv0m/LbzrZ+dfJGk+ZLYqDfQ A3US/wC6rlPgnj33+GRTSvUUPfFWTYq7FXYq/Mnz7rD6z531/VnO99qN1OB4K8zFRv4DbFX0/wD8 4RaFHH5b8ya+VBkuryKwVtqhbaISsB8/rIr8sVfR+pajZaZp11qN/MtvY2UT3F1O/wBlIolLu5p2 CiuKvn2L/nNbyO2vC0fRb6PRjJw/ShZC4WtPUNsN+PfZ607V2xV9DWtzb3VtFdW0izW86LLDKhqr o45KynuCDXFVTFXYq7FXYq8c/NT/AJyd8n+QdebQBZXGsarAEa9jgZI4oOYDBWkatX4HlxC/M4qz f8s/zM8t/mH5cGt6G0iKkhgu7ScBZoJgAeLhSwIIIKsDQj3qAqs/N7Qo9d/K/wA0aY68jLp08kI/ 4ugQzRf8lI1xV+bWKv0H/wCca9WbU/yU8tSuayW8U1ow32FtcSRIOg/3Wq4q+DfNn/KU6z/zHXP/ ACebFX2B/wA4Vf8AkrNV/wC25cf9Qdpir3/FXYq7FXYq7FXYq7FXw7/zlp+Yp8yfmD+gLObnpXlo Nb0U/C949DcN/sKLH7FT44qxP8gvy7Pnr8ydP0+dOelWJ+v6rUVBt4GH7s16+q5VPkSe2Kv0OAAF BsB0GKqV3aW15azWl1Gs1tcRtFPC4qrxuCrKw8CDTFX5t/ml5GufI3nvVvLcxZ4rSXlZTN/uy2lH OF/CvBgGp+1UYq9s/wCcMvzEFlrV/wCRr2alvqYN7pQboLmJaTRj/jJEob/Ye+Kvr3FXYq7FX5V4 q+5v+cPoEj/J5HUkmbUbp2r4jgm30Jir1Hz35Z/xR5N1ry8Jvq76pZy20c+9Ed1IRjTcqGpUdxir 4Zg/5xo/OWXXxo7aA8X7wI2oO6fUwhP956wJBWm9AOX+TXbFX3h5W0RNB8s6RoSSGZNKsrexWYih cW0SxBiPfhXFUzxV2KuxV2Kvi/8A5yD/ACF/MN/zE1PX9D0u41rStZl+spJaAzSRSMB6kUkYJcUY fCacaU+WKvZf+cW/ys8x+RfKmozeYY/quo6zPHKLDkrNDFCpVOZWoDuXJIrsKd6jFXsGsANpN6CK g28oIPQjgcVfltir7r/5xEZj+TVqCSQt9dhQew5g0H0nFXxT5s/5SnWf+Y65/wCTzYq+wP8AnCr/ AMlZqv8A23Lj/qDtMVe/4q7FXYq7FXYq7FWG/m95+i8ifl/qvmAlfrkUfo6bG1Pju5vhiFD1Cn42 H8qnFX5wzzzTzSTzOZJpWLySMaszMakk+JOKvuP/AJxP/Lo+WPy8XWryHhq3mUrdsWHxLaKKWyf7 IEyf7IeGKvbcVdir5x/5zJ/Lo6n5asvOtlFW70U/VtS4j4ms5nHBj/xilb7nJ7Yq+SvL2u6joGuW Gt6bJ6V/p06XNu/bnG3KhHdT0I7jFX6WeUPM+n+afLGmeYdOP+ianbpPGp3KFh8cbf5SNVT7jFU3 xV2Kvy31jT307V77T3BD2dxLbsG61icoa7Dw8MVfYv8AzhXqkU/5carp1R69lqruVHX054IuBP8A so3xV9B4q0zKqlmIVVFWY7AAdziq2GeCdPUhkWVOnJCGFR7jFV+KuxV2KuxVZDPBMpaGRZFBoWQh hUdqjFV+Ksf/ADC1ZNH8h+YtUZuP1PTbuZSDQllhYqB03LUAxV+ZeKvvz/nFrTWsfyS0EuvGS7a6 uWFKGj3MgQnxqiqcVfDHmz/lKdZ/5jrn/k82KvsD/nCr/wAlZqv/AG3Lj/qDtMVe/wCKuxV2KuxV 2KuxV8X/APOYf5ijWfOFt5QspK2Hl8c7yh+F72dQSPA+lHRR4FmGKvB9Hk0yLVrOXVYpJ9Mjmja9 ghIWSSFWBdEY7KWXavbFX1jD/wA5s+UYYkhi8r3scUahI0WWEKqqKAAAdAMVX/8AQ73lb/qWr7/k dDirv+h3vK3/AFLV9/yOhxVB6z/zmR5G1jSbzSdQ8q3s1jfwyW9zEZofijlUqw6eBxV8nS+n6j+l y9LkfT5U5ca7VptWmKvqz/nC/wDMTnDqXkO9k+KLlqOkcj+wSFuIlr4MVkAHixxV9S4q7FX58/8A OSPlaTy9+cOvR8ONvqco1S2b+Zbv45CPlN6i/RirMf8AnDfznHpH5g3nl65kCW/mG2pDU0BurWsk Y32+KNpB86DFX2rir5k/5zZ17zDaaX5d0m1lkh0XUGuXvvTJCyyw+n6cchHUAOWCnqd+2KvM/wDn EfXvMFp+bVnpNlNJ+idThuf0rbCpjKw27yRSMOgZZVVQ3+VTvir7nxV2KuxV8/f85leZPMmk+RtL sdMlkttP1W7eHVJ4iVLKkfKOAsP2ZPiJHfjTpXFXgH/ONPmPzJpX5taJZ6RJI1tqk31bUrNSfTkt yrF3delYgOYPXb3OKv0AxV4V/wA5gec49G/LRdBikAvvMVwsPCvxfVrciaZh/shGn+yxV8SW9vPc 3EVvAhknmdY4o1FWZ2NFUDxJOKv038l+Xo/LnlHRtBSlNMsoLVmXozxRhXb/AGTVOKvzZ82f8pTr P/Mdc/8AJ5sVfYH/ADhV/wCSs1X/ALblx/1B2mKvf8VdirsVdirsVY1+Y/nWx8leStV8yXdCLGEm 3hJp6tw/wQxj/WkYV8BU9sVfmzqOoXmpahc6hfStPeXkrz3MzfaeSRizsfmxxVlej/kz+aWs6Zb6 ppnlq8utPu09S2uEQcXQ7BlqQaHFUZ/yoH85P+pTvv8AgV/5qxV3/Kgfzk/6lO+/4Ff+asVd/wAq B/OT/qU77/gV/wCasVd/yoH85P8AqU77/gV/5qxVK/Mf5UfmN5a0xtU13QLvT9PV1ja5lUcAz7KC QTSuKoDyP5sv/KPm3SvMljvPptwsxjrxEkf2ZYiR2kjLKfnir9K9F1ew1nSLLV9Pk9Wx1CCO5tpP GOVQy1pXeh3xVGYq+d/+cxfy5fWPKtp5xsY+d7oNYr8KKs1lM32vH9zJv8mY9sVfHul6nfaVqdpq dhKYL6xmS4tZl6pLEwdGHyIxV+jH5TfmTpf5g+TLPXbQql3QRanZg1MF0o+ND34n7SHupGKp35o8 peW/NWkvpPmHT4tR092D+jKD8LioDoylWRhU/EpBxVLfJP5XeQfJAn/wvo8WnSXIAnmDSTTMoNeJ lnaSTjXfjypirKcVfn75s/5yP/NbWfMlzqdnrt1pVn6p+padasI4oog3wK6jaRqfaL1qfbbFX2L+ RvnvUvPH5aaXr+qIF1J/VgvHVeKSSQSGP1FAAHxgAkDYGoxVlfmPy1oPmXSJ9H12yj1DTbinq28o JBINQwIoysD0ZSCMVY75H/Jv8t/I93Le+W9HS1vplKNdySSzyhCalEeZnKDx40r3rirL7y7tbK0m vLuVYLW3RpZ55CFREQcmZiegAFcVfnl+ef5myfmF59u9VhZho9qPqmjxNsRboT8ZHZpWJc+FQO2K sn/5xU/LqTzR+Y8OsXMXLR/LfG8nZh8LXW/1WMe4cep/sPfFX3Xir8wPNn/KU6z/AMx1z/yebFX2 B/zhV/5KzVf+25cf9Qdpir3/ABV2KuxV2KuxV8h/85mfmL9c1qw8i2M1bfTQL3VVU7G5lX9zG3/G OJuX+zHhirxD8sfI935388aV5ctwwS7mBvJV/wB1W0fxzSV9kBp4mgxV+ktjZWlhZW9jZxLBaWsa QW8KbKkcahUVfZVFMVVsVdirsVdiqTec/K2n+a/KuqeXb8f6Lqdu8DPSpRiKxyKD+1G4V19xir81 PMGh6hoGuX+i6jH6d9p08ltcJ25xsVJB7g0qD3GKvrX/AJw1/MT9JeWr3yVeyVu9FJudOBO7Wk7/ ALxR/wAYpm+5wO2Kvo/FVK8tLW9tJ7O7iWe1uY2huIXFVeORSrqw7gg0OKvz5/PT8ob78uPNr20a vL5fvy02jXhqQUr8ULt/vyKtD4ijd8VS38pfzX1/8t/Mq6rp37+yn4x6pprmkdxCDXrvxdeqP29w SCq++/Ivn7yx540GLWvL12Li3egmhPwzQSU3imTqrD7j1BI3xVkWKuxV4R5r/wCcQPy/13zHPrFt fXmlRXcpmurC39Joubtyf0eakxhq9NwO222KvY/LHlrRvLGg2eg6Lbi202wj9O3iBJPUszMTuzMx LMe5OKppiqldXVraW0t1dzJb20CmSaeVgkaIoqzMzEBQB1JxV8af85Gf85Gf4t9Xyn5TlZPLSNS/ vxVWvWU1CqDQiEEV33Y+3VV4b5c8vav5j1uz0TR7drrUb+QRW8K9yepJ7Ko3YnoN8Vfoj+U35b6b +Xvky00C0Ky3I/faleAUM904HqP48RQKgPRQMVZjir8wPNn/AClOs/8AMdc/8nmxV9gf84Vf+Ss1 X/tuXH/UHaYq9/xV2KuxV2KpN5z806f5U8q6p5ivz/oumW7zslaF2ApHGpP7UjlUX3OKvzU8wa5q Gva5f61qL+pfajPJc3DDYc5WLEAdgK0A8MVfWf8Azhr+XQ0/y9e+d72Kl5q5NpphYbrZxN+8df8A jLMtP9gPHFX0jirsVdirsVdirsVfIn/OZv5crZ6xYeerGKkOpUstW4jYXES/uJD/AMZIlK/7AeOK vEvys883Pkfz5pPmOKphtZQl7EP92WsvwTL8+BJX/KocVfpHaXdteWsN3ayLNbXEaywTIaq8bgMr KfAg1xVVxVIfO/kjy7518u3Gg69bieznFUcUEkMgB4yxNQ8XWux+g1BIxV8D/m3+Tfmj8t9ZNvqE ZudInY/o7V41PpTL2VuvpygfaQ/RUb4qx/yd5480+TdXTVvLmoSWF2Phk40aORP5JY2qjr7MPlvi r6l8gf8AOZvlm+iitfOtjJpN2AA+oWitPase7NGKzR/IB/nir2zQfzM/L3X0VtH8x6feMwqIUuIx KAf5omKyL9K4qyUEMAQag7gjoRiqVax5t8q6KjPrGsWOnKv2jdXEUO/h8bLiryXzr/zlx+WGhRyR aM83mO/XZEtVMVvyp+1PKBt7or4q+XvzQ/PXz5+Ychh1S5Fnoytyi0e0qkFQdmkqS0re7Gg7AYqw 7y75b1zzJq9vo+h2cl/qNy3GK3iFT7sxNAqjuzGg74q+6fyI/IfS/wAttNa8u3S+81XsYW9vVB9O JDQ+hBXfjUfE3Vj4CgxV6xirsVfmB5s/5SnWf+Y65/5PNir6E/5xm/O78u/InkO/0jzLfyWt9Pqk t3HGlvNMDE9vbxg8o1YfaibbFXrn/Q2H5Jf9Xef/AKQ7n/mjFXf9DYfkl/1d5/8ApDuf+aMVd/0N h+SX/V3n/wCkO5/5oxVk/kL85vIXnzULiw8s3U13PaRevcF7aaJEQsFFXkVVqSdh16+GKvDf+c0P zE/45vkKyk6cdR1cqfmtvEaf7KQg/wCQcVfOXkfynf8Am7zbpXlux2n1K4WEyU5COP7UspA7Rxhm PyxV+lWiaPYaLo9lpGnx+lY6fBHbW0fhHEoRa+JoNziqNxV2KuxV2KuxV2Ksd/MPybZec/JereW7 viF1CBkglYVEU6/FDLtv8Eiq34Yq/NfVNMvtK1O70y/iMF9YzPb3ULdUliYo6n5EYq+0v+cRfzE/ xB5Dfy1ey8tT8tsIogT8T2MlTCff025R7dAF8cVe8Yq7FUFrOiaRremz6Zq9nFf6fcrxmtp0Dow+ R7jqCNx2xV8u/mb/AM4a3Kyy6h+X10skJqx0S9k4uv8AkwXDbN7CSn+scVfOnmXyX5t8r3P1bzDp F1pkteKm4iZEcj/fclODj3UnFUlxV2KuxVEWNhfX91HaWNtLd3UppFbwI0kjHwVFBY4q9p/Lv/nE v8w/MckV1r6jy1pRIL/WRyvHWlfgtwRx8P3jLTwOKvrX8uvys8mfl/phsvL1nwlkA+t6hNR7qcj/ AH5JQbeCqAo7DFWXYq7FXYq/NTzT5W8zv5n1d00i9ZGvbkqwtpSCDK1CDxxVK/8ACfmn/qzX3/SN N/zTirv8J+af+rNff9I03/NOKu/wn5p/6s19/wBI03/NOKu/wn5p/wCrNff9I03/ADTir7W/5x78 mRflt+UU2t6vA6alqMbatqUaoTOsKRkwW4QfEWEe/GlebkYq+QvOUfnnzV5p1TzFqGkX5utTuHnZ TbzHgpNI4weP2Y0ARfYYq+if+cOvyuvNPXU/Ous2j21zLXT9KinQo6xijTy8WFfiPFFPs3jir6dx V2KuxV2KuxV2KuxV2Kvj3/nLn8qb+DzfbebdFsprm31tfT1CO3jaQpdwKFDkIDQSx0+lT44qwH8j dW82eRPzG03V5dKv00ydvqerD6tNQ2sxAZiOP+62Cyf7HFX6AYq7FXYq7FULqf6L+oy/pT0PqFP3 /wBa4ejx/wAvn8NPnirxDzd/0J76r/pb9A+pU+p+jOVa0Na/o7v/AB98VYFef9CPeuvpfWOFBX0f 0xwrU9fV+KvyxVkOg/8AQkn1gfUvqPOo/wB7/wBJ8K/9HvwUxV7j5L/5V19SP+Cv0T9Tp8X6I+rc P9l9X/jirJMVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/9k= uuid:4b8d80fb-79e0-e648-b7e5-561a697a3c5f xmp.did:78407A0809206811822AB037A4F90ED9 uuid:5D20892493BFDB11914A8590D31508C8 proof:pdf uuid:dd6f74e1-a7e7-604f-8b10-fa76c7b92231 xmp.did:0380117407206811822AB037A4F90ED9 uuid:5D20892493BFDB11914A8590D31508C8 proof:pdf saved xmp.iid:0180117407206811822AB037A4F90ED9 2012-08-26T15:46:21+10:00 Adobe Illustrator CS6 (Macintosh) / saved xmp.iid:78407A0809206811822AB037A4F90ED9 2012-08-26T15:57:39+10:00 Adobe Illustrator CS6 (Macintosh) / Document Print False False 1 296.999959 210.001652 Millimeters Cyan Magenta Yellow Black Default Swatch Group 0 White RGB PROCESS 255 255 255 Black RGB PROCESS 29 29 27 CMYK Red RGB PROCESS 226 6 19 CMYK Yellow RGB PROCESS 255 236 0 CMYK Green RGB PROCESS 0 149 64 CMYK Cyan RGB PROCESS 0 158 226 CMYK Blue RGB PROCESS 49 39 130 CMYK Magenta RGB PROCESS 229 0 126 C=15 M=100 Y=90 K=10 RGB PROCESS 189 22 34 C=0 M=90 Y=85 K=0 RGB PROCESS 229 51 42 C=0 M=80 Y=95 K=0 RGB PROCESS 232 78 27 C=0 M=50 Y=100 K=0 RGB PROCESS 242 145 0 C=0 M=35 Y=85 K=0 RGB PROCESS 248 177 51 C=5 M=0 Y=90 K=0 RGB PROCESS 252 234 13 C=20 M=0 Y=100 K=0 RGB PROCESS 221 219 0 C=50 M=0 Y=100 K=0 RGB PROCESS 147 192 31 C=75 M=0 Y=100 K=0 RGB PROCESS 57 169 53 C=85 M=10 Y=100 K=10 RGB PROCESS 0 141 54 C=90 M=30 Y=95 K=30 RGB PROCESS 0 102 51 C=75 M=0 Y=75 K=0 RGB PROCESS 45 171 102 C=80 M=10 Y=45 K=0 RGB PROCESS 0 160 153 C=70 M=15 Y=0 K=0 RGB PROCESS 53 168 224 C=85 M=50 Y=0 K=0 RGB PROCESS 29 112 183 C=100 M=95 Y=5 K=0 RGB PROCESS 45 46 130 C=100 M=100 Y=25 K=25 RGB PROCESS 41 35 92 C=75 M=100 Y=0 K=0 RGB PROCESS 102 36 130 C=50 M=100 Y=0 K=0 RGB PROCESS 148 27 128 C=35 M=100 Y=35 K=10 RGB PROCESS 162 25 91 C=10 M=100 Y=50 K=0 RGB PROCESS 214 11 81 C=0 M=95 Y=20 K=0 RGB PROCESS 230 27 114 C=25 M=25 Y=40 K=0 RGB PROCESS 202 186 159 C=40 M=45 Y=50 K=5 RGB PROCESS 163 137 122 C=50 M=50 Y=60 K=25 RGB PROCESS 122 106 88 C=55 M=60 Y=65 K=40 RGB PROCESS 99 78 66 C=25 M=40 Y=65 K=0 RGB PROCESS 201 157 102 C=30 M=50 Y=75 K=10 RGB PROCESS 177 127 73 C=35 M=60 Y=80 K=25 RGB PROCESS 146 95 54 C=40 M=65 Y=90 K=35 RGB PROCESS 126 78 36 C=40 M=70 Y=100 K=50 RGB PROCESS 104 59 17 C=50 M=70 Y=80 K=70 RGB PROCESS 66 41 24 Grays 1 C=0 M=0 Y=0 K=100 RGB PROCESS 29 29 27 C=0 M=0 Y=0 K=90 RGB PROCESS 60 60 59 C=0 M=0 Y=0 K=80 RGB PROCESS 87 87 86 C=0 M=0 Y=0 K=70 RGB PROCESS 111 111 110 C=0 M=0 Y=0 K=60 RGB PROCESS 134 134 134 C=0 M=0 Y=0 K=50 RGB PROCESS 156 155 155 C=0 M=0 Y=0 K=40 RGB PROCESS 177 177 177 C=0 M=0 Y=0 K=30 RGB PROCESS 198 198 197 C=0 M=0 Y=0 K=20 RGB PROCESS 217 217 217 C=0 M=0 Y=0 K=10 RGB PROCESS 236 236 236 C=0 M=0 Y=0 K=5 RGB PROCESS 245 245 245 Brights 1 C=0 M=100 Y=100 K=0 RGB PROCESS 226 6 19 C=0 M=75 Y=100 K=0 RGB PROCESS 233 90 12 C=0 M=10 Y=95 K=0 RGB PROCESS 255 221 0 C=85 M=10 Y=100 K=0 RGB PROCESS 0 151 58 C=100 M=90 Y=0 K=0 RGB PROCESS 40 52 138 C=60 M=90 Y=0 K=0 RGB PROCESS 129 53 138 Adobe PDF library 10.01 endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 12 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 8 0 obj <>stream HVˎ6 +Ƕ \b z(ɲ6(fqMyxy5|z᧟_}PO߷·!#\ow'H-D_7?,V<a}l#L9] q~|zl~dp#vyll/88g*Z\%7펣٫m6QAi3td= R,$) "z Kl8Lz i6:ϋvȥ3#a?qQH je%e y`LMuIN2ڲo>! jl9$̈6I*IQC\z8Fri|ިuB eR u`̐Mn!Kcj`̰kvFTvG$*+EE2.WWj^pRXs Fi[!SgX)Z=3io5ŮEA]P2E󈚳dS`gAյVgTds/*kj,bPErjW !RCKrX7T|&üI/S1;6/āq!YAdCN?VNa˝+dfDJ#Uᐱ 8I5!6NUG6W`dzE Ɯ~h7ڠT;b,va$RsY{JzUie@^wxKE$>C4 06m%H1  p=Hܜ A2b̍ ЈSt_uVm.9# ;^ܒZb2|  eA8>*De3 @ UVπŮ6|E.QoX;g@ i}`$pϳ endstream endobj 12 0 obj <>stream 8;Z]!9+o,r#X`\5$i2p?`$lCO7,$m!4(shr?p-lIcW[*kBJ^Wer_LScG:8SBfWBiJ ;%8U\!Z5]ZK,VFPnI?fSdR`<)pn?,-h`c:cfg,Y7OHRPK?M9]IuP;M)dM kHG,)456>:)?QFQePXR)]"p-2u)-t\5D=iE*ctG6SNCK[Md:312gthT~> endstream endobj 13 0 obj [/Indexed/DeviceRGB 255 14 0 R] endobj 14 0 obj <>stream 8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn 6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 5 0 obj <> endobj 15 0 obj [/View/Design] endobj 16 0 obj <>>> endobj 11 0 obj <> endobj 10 0 obj [/ICCBased 17 0 R] endobj 17 0 obj <>stream HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 N')].uJr  wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 9 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <>stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Douglas Heriot) () %%Title: (OLA Logo RGB.ai) %%CreationDate: 26/08/12 3:57 PM %%Canvassize: 16383 %%BoundingBox: 78 -440 764 -155 %%HiResBoundingBox: 78.7725 -439.3721 763.1172 -155.9082 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -595.2803 841.8896 0 %AI3_TemplateBox: 421.5 -298.5 421.5 -298.5 %AI3_TileBox: 141.4448 -677.6406 700.4453 105.3599 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 1 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -299 153 1.5 2307 1480 18 0 0 78 133 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:115 -694 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 20 0 obj <>stream %%BoundingBox: 78 -440 764 -155 %%HiResBoundingBox: 78.7725 -439.3721 763.1172 -155.9082 %AI7_Thumbnail: 128 56 8 %%BeginData: 6236 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD13FFA87D5227FD07F827527DA8FD6EFFA852FD11F8527DFD13FF %52272752277DFD28FFA85252FD25FFA827FD15F8277DFD11FF27FD04F852 %FD28FF7DF8F8A8FD22FFA852FD19F8277DFD0FFF27FD04F87DFD28FFF8F8 %F852FD21FF7DFD1DF852FD0EFF52FD04F852FD27FF7DFD04F8FD20FF27FD %0AF827527D7DFD04A87D5252FD0AF827FD0DFF27FD04F87DFD27FF27FD04 %F852FD1EFF27FD08F8277DFD0DFF7D27FD09F8A8FD0BFF52FD04F852FD26 %FFA8FD05F827FD1DFFFD09F8A8FD11FFA827FD08F8A8FD0AFF27FD04F87D %FD26FF27FD06F87DFD1BFF27FD07F87DFD15FF7D27FD07F8A8FD09FF52FD %04F852FD25FFA8FD07F827FD1AFF27FD06F827A8FD17FFA852FD07F8FD09 %FF27FD04F87DFD25FF52FD08F87DFD18FF52FD06F852FD1BFF7DFD06F827 %FD08FF52FD04F852FD25FFFD09F852FD17FF7DFD06F852FD1DFF7DFD06F8 %52FD07FF27FD04F87DFD24FF52FD0AF8A8FD16FF27FD05F852FD1FFF7DFD %06F8A8FD06FF52FD04F852FD24FF27FD0AF852FD15FF7DFD05F827A8FD20 %FF52FD05F827FD06FF27FD04F87DFD23FF7DFD05F87D27FD05F8A8FD14FF %FD06F8A8FD22FF27FD05F8A8FD05FF52FD04F852FD23FF27FD04F827FFA8 %FD05F87DFD13FF52FD05F852FD23FF7DFD05F827FD05FF27FD04F87DFD22 %FF7DFD05F852FFFF27FD05F8FD13FF27FD05F8FD25FF27FD05F87DFD04FF %52FD04F852FD22FF52FD05F8FFFFFF7DFD05F87DFD11FFA8FD05F87DFD25 %FFA8FD05F852FD04FF27FD04F87DFD21FFA8FD05F852FD04FFFD05F827FD %11FF52FD04F827A8FD26FF52FD05F8FD04FF52FD04F852FD21FF27FD05F8 %A8FD04FF7DFD05F8A8FD0FFFA8FD05F827FD27FF52FD05F87DFFFFFF27FD %04F87DFD20FFA8FD05F827FD05FFA8FD05F827FD0FFFA8FD05F8A8FD28FF %FD05F87DFFFFFF52FD04F852FD20FF52FD05F8A8FD06FF52FD05F8A8FD0E %FF52FD05F8A8FD28FF27FD04F827FFFFFF27FD04F87DFD20FFFD05F827FD %07FFA8FD05F852FD0EFF52FD04F827FD07FFA8FD19FFA8FD07FF52FD04F8 %27FFFFFF52FD04F852FD1FFF52FD05F87DFD08FF52FD05F8FD0EFF27FD04 %F852FD06FF27F8F852FD15FFA8F8F827FD06FF7DFD05F8FFFFFF27FD04F8 %7DFD1EFFA827FD04F827FD09FF7DFD05F852FD0DFF27FD04F87DFD05FF7D %FD04F8A8FD14FFFD04F852FD05FF7DFD04F827A8FFFF52FD04F852FD1EFF %7DFD05F87DFD0AFF27FD04F827FD0DFFFD05F87DFD05FF27FD04F852FD13 %FF7DFD04F827FD05FFA8FD05F8A8FFFF27FD04F87DFD1EFFFD05F827A8FD %0AFFA8FD05F87DFD0CFFFD05F87DFD05FF52FD04F87DFD13FFA8FD04F827 %FD05FFA8FD05F87DFFFF52FD04F852FD1DFF7DFD05F852FD0CFF27FD04F8 %27FD0CFFFD05F8A8FD06FF27F8F852FD15FF52F8F8F8A8FD05FFA8FD05F8 %A8FFFF27FD04F87DFD1DFF27FD05F8FD0DFF52FD05F87DFD0BFFFD05F87D %FD07FF7DA8FD17FFA87DFD07FFA8FD05F87DFFFF52FD04F852FD1CFFA8FD %05F87DFD0EFFFD05F827FD0BFFFD05F87DFD29FFA8FD05F8A8FFFF27FD04 %F87DFD1CFF27FD05F8A8FD0EFF7DFD05F8A8FD0AFF27FD04F87DFD29FF7D %FD05F8A8FFFF52FD04F852FD1BFFA8FD05F852FD10FF27FD04F852FD0AFF %FD05F852FD29FF7DFD05F8FFFFFF27FD04F87DFD1BFF52FD05F827FD0452 %275252522752525227525252FD06F8A8FD09FF52FD04F827FD29FF52FD04 %F827FFFFFF52FD04F852FD1BFFFD1DF852FD09FF52FD04F827A8FD07FFA8 %27F827A8FD10FF52F8277DFD08FF27FD04F827FFFFFF27FD04F87DFD1AFF %52FD1EF8FD09FFA8FD05F8A8FD07FF27F8F8F827FD0FFF7DF8F8F827A8FD %07FFFD05F87DFFFFFF52FD04F852FD1AFF27FD1EF87DFD08FFA8FD05F852 %FD06FFA8FD05F8FD0FFFFD05F87DFD06FF52FD05F87DFFFFFF27FD04F87D %FD19FF7DFD1FF827A8FD08FF27FD04F827FD06FFA827F8F8F827FD0FFF52 %FD04F8A8FD06FF52FD04F827FD04FF52FD04F852FD19FF27FD04F827527D %527D527D527D527D527D527D527D527D527D5252FD05F87DFD08FF7DFD05 %F87DFD06FF52F8F8F87DFD07FFA8FD07FF7DF8F8F827FD06FFA8FD05F852 %FD04FF27FD04F87DFD18FF7DFD05F852FD15FFA827FD04F827FD08FFA8FD %05F827FD07FF7D7DA8FD07FF27F8F8A8FD06FFA87D7DFD07FF27FD05F8A8 %FD04FF52FD04F852FD18FF27FD05F8FD17FF52FD05F8A8FD08FF52FD05F8 %52FD0FFF27FD04F8FD0FFF7DFD05F827FD05FF27FD04F87DFD17FFA8FD05 %F852FD17FFA8FD05F852FD09FFFD06F8A8FD0EFF27FD04F8A8FD0EFF27FD %05F8A8FD05FF52FD04F852FD17FF27FD05F8A8FD18FF52FD05F8A8FD08FF %52FD05F827FD0EFFFD05F8FD0EFF52FD05F852FD06FF27FD04F87DFD16FF %A8FD05F827FD19FFA8FD05F852FD09FF27FD05F852FD0DFFA8F8F8F87DFD %0DFF7DFD06F8A8FD06FF52FD04F852FD16FF52FD05F8A8FD1AFF27FD04F8 %27A8FD08FF7DFD06F852FD0DFFA87DA8FD0DFF7DFD06F852FD07FF27FD04 %F87DFD15FFA8FD05F852FD1BFFA8FD05F852FD09FF52FD06F852FD1BFF7D %FD06F852FD08FF52FD04F852FD15FF52FD05F87DFD1CFF52FD05F8FD0AFF %27FD06F827A8FD17FFA852FD07F8FD09FF27FD04F87DFD14FFA827FD04F8 %27FD1DFF7DFD05F87DFD0AFF27FD06F8277DFD15FFA827FD07F8FD0AFF52 %FD04F852FD14FF7DFD05F8A8FD1EFF27FD04F827FD0BFFFD08F827A8FD11 %FFA827FD08F8A8FD0AFF27FD04F87DFD14FFFD05F827A8FD1EFF7DFD05F8 %7DFD0BFF27FD08F8527DFD0DFF7D52FD09F8FD0CFF52FD04F827A8FD0F7D %A8FFFF7DFD05F87DFD20FF27FD04F827FD0CFF52FD0AF827527D7DA87DA8 %7D7D5227FD0AF827FD0DFF27FD15F87DFFFF27FD05F8FD21FF52FD05F87D %FD0CFF7D27FD1CF852FD0EFF52FD14F827FFFFA8FD05F87DFD22FFFD05F8 %52FD0DFFA852FD19F827A8FD0FFF27FD14F8A8FFFF27FD05F8A8FD22FF52 %FD05F8A8FD0EFFA827FD15F827A8FD11FF27FD13F827FFFFA8FD05F852FD %23FFA8FD05F852FD10FFA87DFD11F8527DFD13FF52522752275227522752 %275227522752275227527DFFFF7D2752275227A8FD24FF525227522752FD %13FFA87D52522727F8F8F8272727527DA8FD76FFA8FFA8A8A8FD62FFFF %%EndData endstream endobj 21 0 obj <>stream %AI12_CompressedDataxɕ&w~ 5!773_4hRHPP]L2dZs_J00ׯ-gwׯx^ś~?޽Ow|twGo~ MO'6'~xS?:}wo?|G?~ӻ;W?~}Ot0]ivNxw{9ұÇׇi޽JMcڽ 9o[t3MC3r!&ikn~Ӈ7sӯ?~xsw>|^ݿ޽{?vw{GC}ןvaX/߿}/ww4.#,~]wuqxgБ/>}b-2H;=߾{c-ro_w9h~Ow ~~'~Fze.4C'zB~P~K &_\ۯ߾i4dۯ$ڛ\[|[uG^jϯ?~p׿~;>=4Rr2/SV7G?{w޷|l\=o?~λm05_We.'D.t;Зͽ_{돯7[7$}7wߔT돟޾ywştͣ'ww-+sןoǷw>L߾߿tW7B}k|-w$_WC;zK dv_~u WݿuĹaZ#gGH_f#aAԏ]ݗU;٢tv:ݸēI~,}{3=N>69}*ҜPwYQD gjZZUǮZp8·c 阏q:Ԗx8?pJ|Oix:Χs;s6R3߃Ζ6uSFntJ)[{qM6ZnZZh?i|[蔏1ycΙ<@|K1>-iJcʤ4xK=1>.qǘc11=bZ݆vj:FPAӂ}qgT%vZV4^g8O3)Ty]%,˴˲rZO~qC8 !ta/KxnTʷleMkO-|[TCU [D3q4'3Hs8si:Ni?-[<%=[QDa"'jq$qKci3h Ow4risO32dp/c0(բ0 ItS7k@빏iK,x+-fmQ[֖u+j3z_&۞ny8D}!) LHdjDF"\ذ~h-D&xyID|k#x% :D#}?Ch駐0%-!Ék-i00˰9#pK9n15ޒnD( *@S$iuqc[ǿxFz==[M*3I ^odRjzZ=Z\'?m{niӺu J-~h_Lgt#X΅v0|˙-V.F{e7''mNwC;fnu&ą@bX *h~It1AÚg.|-C*@ W4~ o7,ii0ʝҋ3!WyΐB{$?kO='!?kb0fqY'InC"TC؄L3`B;曞dٞؑ< KA4qu\C?[I~IXzO~+39# |g$5yF4qL}gۣEyuNv:Y';&mòl\swK⩝p3}M4g|ukL}B_sk= 7I) ?Cf[bN*K4 ym:dMuGu`wB6ln!tCN,t&tD?1q|a\Ģ9sj̾8_Bn'ghН9|by& n$]e֖EWEO+'pd((jtP(-"MHp"DPi-'=ɰ ',,L 4$/@NH&=[~rk0Ψȍ7/*l̬,u}JUY*s䣇yNgVU1;S m&'o3j:oֶh{;h;zS DW;E>FDi-iP|O|p'F 0P*i .n0Huy;9IC+ >QjE3=#3v4w%Iwҡt)dA@q >1~`Ē<q"㇎r$%DC[j("YU[y: q\5h"M) e/"_4|)BH @(9V s(="ȁ(KVqT Anrbw%fobHcaaԟWZ,E$m;ЉZ@q UrpCbh-B5.鈷?]Zٮ^ [VBkAlʩ[\ܴine۱iGV ռiElZjZ[HiS-Mۯ>;شPz/i`02߄g|taz`M|ֳ̏:ر( JAO-+N $7D*Nuó놦i!xvD(k'VST]QL[Icؚt`Vg}?荺pejMW+[C/Y662[{a%>25sa]:b$Y=ܛad|dQe$6fPbpb` ]*Zwb^\1 &NILYN:Y[ يxbn}R}d/ĺ8v^8tPu-̵#"ЗBw<4y] Zus^jr00Q;y`@>)砗ѓ{U';!Sn!uWi匷rk=S:!knl#[^7^ tX|gxi lÞ]y@ob@NB_ _e ~^9@[ ,SgX 8WO w9eLD˛c;ӳZ0su4P0m FwY ]'u{6=f:{+fHV*W \UKV'V)U•W&`$PXQMSZjk:++2NpɅhφQJ"e6G v)kg̼Z`؁ّ4QnM}FX6amQ}#[)Gli-ui3πMq ~caꜣ_9;\xHaD Kמ\:,czf|nA&0Soʩex8NMR@Nzc5^YQND=%~wǏC?[}oޝ>C\>7uQ C٩rvɝ?}e͜I꟩iD;F]{QgkS-:{ykH!dN+󅸺ծru8m=ik?ڹgAGDo.D о;ݺ[pvZ_eֺ''}^iE( Q؈P* @x+Amdf-j=s6Ѻ\Zޭ>Vp)UZ4oZTKVjmX-mmƑM5nM,kpv8[ACNCȠ2Bs"ȴ"՞Y4GcVfkO&VWr-TiIp晃&Vfb]9*H #,OO5Spn&e:Aݠ"$M[{ 1ᠿn(?Vd&O\~m~B&UAo帟gV|7v+p_rYn췿x9 e*B<$.אDYѳCqYt7,Q07ub~fI6UVyg "ԃjx]<WYe60asgC:2a(fЩ'̛ri-VKk _PaS$S"@A"&Q=ΰqU6"̨1X$W(vھ8 F fgM(K0E*?zPIf5ݼ=1{yd( CC/`c'ƈG Lʞ9S'G0[BOUf|X:f`;M0D!0K;2S8Be&ɉ+֙ .`EQCHXxa`PjṅL\)/s3vn+A_6adXGWNNZoK뤪ƁОgiV]k+P|xf2"yD1̋J٠J~>tˆCqd*Gpг+X8K hQ%Ee(H@,uS &o͋5.cAyCMO@ӶW]{]Iskպ+naZ~uyoÒ!#`aUt @bR]dPc4- xѦn!V;:DթGV"V.NivLA슃uGFXJA[eQ UX4Tꎪ،V[O]׻{;Eu6j+T 5\cNB:ǫwxфDUUyk_7Z6N{|2K3VZ8VhX :GN׭f lhn __ թwd&?'H߉2P]>-%va451iяMEݝNiO5UaU_|heuj]zdXO$.xH(;kYH$I%G`eF`;14wĸ̟Ĉ`>lsQ*+\̦4ls,T?p;PGUCáAw(ȃ`IcG PNu*ZZWjS蝻fmzr*`wQjeʶYS>MvhFf;'nM~M>v6?6O?vu[I+4aGnA:ȶr_֛dۍ["E/#j!q5i(rD:]U}!L$:F) HUnT[u5!,m+_ tՇKA~k_7"Vwd_ /ym)b6|,Ʒ*ӌ_YH3ti6-&l[ թ̞G?]qhV^칣|'?ݏ27{]d#:9Umk3Wm(yUK-n/k>#{ :<{;,v^[V%Y>dNiT/qA!@l1^IouR`h܅KniVgՁ ͱ*MSп""""Ntu$.mTfSr,\CZWf vf뢝=9e74Xg2MD3H%%Su\ۡ.G˦h1/U(P[]R)_mYɚwmmy'[ֹylڤ^d\0;\%ٴejmmVtuOjf+*eihYbZaJ6iJ %ةX46zYf⫩Ia[-5~r:zin%1 DfO'==dʒ9ґ8BFQ@@MH7(jkfT4 CG+]ҼQ,]6缮:OiyVG*+zP1[\2H˝zTJ[m3mj^C+zZiijQZ/5Ki+n:o>6`k *݋&p^xS wUe ?*pgyϩk Rt bO`$^R9tCt2IsjHL|tVo/!BɓYnM]rNc1Gz% AJ⮶Wgtg`l VfG?KbhvK%^;i=Ӝ srL[sʶu.inigzltO;^o}_3Zq)8<4Q7:k=N;& ar `?K ${\۠͢l"Un\T3>z &ЪFZittZoW#ݺkߪ¸;o5~ֶѡJ^ũ/9 s64ڱ[_bȝ^hq]O͒m68m]**hUeGW2Tu]F6yHKXbYdBM3doh#TE7mCJlŽ&:pn#b\H친6RA+aI{8*ɣ'SGCWWQsw*S4E)!-fn;[u7r>ۊ8sCu芹boJM똛oS|c/V}b*8 /ZBդQ-Ǵ%9`ͲdiX*x Z骈6Ne҆X*„cFQA^" Oip GGG i.IIsD凛r;Ox֙k9K"P-RUwU WNe֜pLvH*{"ENo(NE-xn˹^t.k唲x%&H&KHZo<ءo^HJݦU3Yji1"v*#l l⯦sETn+16}]nt*_~%ˊ=7UFY|5/Ĭ ?sBCgiסKRɆӳ hp603vkxI-aqsE3n jԟ<#˖DKŪG+ѓ8&_2dz %K&L@/^2dz %P %K&L@/^2dz %K&yfJa|&%b.C.zOjR9_eJC#/}נG5%_%j~n챙'mAC7GנsքUpfTuKܘCv=)Je6 ӕri{誉o}=ng[oGt/Wgwv~m|[Cm9_Ds'y̬9Lh (p!W^KSCș]9f78E\!^I;S<=M/ S>hNc=}f>ZtB>DHO[g{Odbgh4Ь&7NmZ輑#gP%Դ<9(*k-RMOXZ+F_iZZS[^*yycŴgt͕jzM==WkItSR2YX:eYiu=ujMAuvֺ΍Zij }\WP+}8a5cX% i~(xV`/fEMc͘u2#[K5Vs5YI6GgU{zlh֥YҤ-kU&qN)ksBRi:Yq1K1҃Z~&tPT,ЂJ85V Z*nMr׶ZE cpsMݶmzGufRSf}~l{x|1UwبlO{HbWB6JlіԎת5YA>C'w"?g=W c;oZ=!)<'%s%ssbI U QF?[OWCz>5ڻ{=oi3܄r)OWBKՇMQˮlw5\\vGo}nºkZ WەGhp?'{CbELh,0+QmZ # lL}ID6Qz8yzwH1^b ^v{j%LTJ̭e\e\W⠅qsɜ&v{;_Dktpפݶb>[jqM.6el[y/5m?k,X5MJ/I؎[ r+ZW^>VKryӠNVr/iD]Z#?mDvL~n/>|K/>_!m:`p..oGRv߶@KZ|نm]u=t綶+i?uKymVKX}Voe6yhS0G|E,nUԡ7&R&K6Rh.1YTѶFnP[Vyɒp,2y{KMn3޺\_C'Hti'n maOg- wlƜ;ڑ؋W$ R8yig}t)v]/VïTUq_w/'mY'9:IQC2˜>{GwF93f{,OB.Eލ"suH]߾ׯ^UaEoMo~ӧIcHYv!N../.N qg?_t?ww_%e7>wы;~^y'No|zA>|xg:_z//Ә}۷ݛO?=]?_ii4q0"hCD=ΥAkԀ\cޅyADtl#1V}CkGH,waLMr5FSSO nz04ϑ'kZ~oN=N Aw PqfzQ:2H2+I #fi@6dy@_wQxCJ(Uʌf8VGDt = C=Ǜa{bͫMU˜xMtӏz`/OO=hqXx(S3,(f(WA($$ HODn Q`H#! K{:paOgLң,Z?a5Ъ#49 rK8} ˆ4>BfgMly&ԢONsO=M3 9%YF%Y9#b/0}gX@lksH3I5CGhh},uz9ڇt օqט':aM+ʴ @7fz6|W7cΧ?4Zr%}iwZn9-R@7}6 #f"qit0& .IX=7ȑ[bXh.6H^x7cqNY#ϟu$"9~z:lAP4~Ҭw0%O@#'7#yk.{E3OXV^nOLRfbhIKw=a/?|"W4 {'{?}|ݏ|ܐW~wg˗ _|qrgB:lm OXøяw_ PVj?AcMHdk@G$ݤ|+{$:~n==L SJli2΃?8. ]F{$HX gb|{ȭ;+e1R_ctN oHb1ER%BCFCwX$@fh|i=% DL8/7qe (xIBTW͈'ʭ(t1-(;"УҚ'(nLX$=[/|40h!{(IFƝ/JOA&1%hfZHzN#@Jii~oX dLvmՔ'u9ZDJ#q>'~C&`›*[@"#%N!'Q87 'Zg`K~d9ϚUNb"A2;( `\>ӽ"k9p'^FZ4 *jg~O (spH)"I΃bDRp9x>>#Y&:࿣G'򆸐!gb凨# vIƐ$\5ZU}E,ӷrihXTi^]x#Hv}7K*i iR,PQg[wѫh+c k&eg! J, @2ehP^$-O{1K/qg;@SZ~#&n{9H}^ P@ƉM !NO(=v/ck2<8Ѝ6zC8e,}8Lr][Vذ0(;dvP-A5^oxw'IGẢִ0 eTKȑ6S7CT{t|Eh4i'n=v%CbLS2fS2J,BQ8!I:phE4\ݑH6#o'AP#.Wf;'ve(pe?C{lF@E@|y4tp$b43;l|I]=-jXx @!2 Dd&H'^!ؠP["U=peH&m &- yKTu N'gCFI0@&>~)D$@"Қ@T'Q`: ]c1↣3}dĨ$nx#`FlhθO$F,8q&ˊ@L-3Cy;% x4O32 yaǙy8<+eG50+0 [% TYUZQbͱ9/P7WٗTVGh.x#&`a1At$GF1/R26A23 ˕5ddgj(pD,-&a"TC,dG. kiaaCWq%%1T}ɽh#/gqOJtU ֝KtffqXzN] q_.H?k:B7]+AM# I,( &D2e0 f4VC]£Rp =<豦CnlIpc(itE+4JbW73Cm)S}KSY Y f$ׅA#UV]jp署7, * Vx)84U#kxha#[~K7BGAh;rc tyʑ?A/ Y'86x E6 &8LSe %j(f+̡2_5Ձ7_ԎW6r з͖tXѷnAuw|&4bQN'dFWu kCuh8L{ꐰ`GH;ܐrGFmLl6㠸s?r;2tݙc sޙHo1w9R3rԄV6Fpˇn:R2QxBlM;< VD&$rۣV.GeeM7U[\puC nokd`7˹;[ Mw{b#7L`Fp#k fu%ō2&Uyjf+ b077[]si~nznr)nvemݍR&q]b^c2?sSAje(j{H1幨1nh-E^Xt b ,4_qFb1b<(b9d4q81 Oя2H J)=Rh̛ )o`0'M *Ca`QT*CkS>K5iXWo..pCq]3FAb zEwDGQDڋ3w;E~A:r<@+VG`Cl槜Du!r?;"c‹8|ݩlfi-M{4U\iK `yQ@?{c+^ޢ" %xAAd2Tγg/}M;Cj8H-/H6S3#40Dp"L}r7O1iPJW-5WǷ[zmgFs5q:`S䗳tK?6z7ZâcnR8FR~4kGY vz7uf Kl""pY:{2< &U T\ Mzb5C8?QuDyB‘ 6D`4 ^J#Oo,3 * pPV@f%4D͗ŷ( <"x+u o8Agqٟy6?v#[e @tщzC@ 2dcۻ W*ܙGbez@%R9fnJG$h0X< $`T\ޑ4ǨѢÕQ S~0na3R sɄlQl%V͖ay~[{c;۲lޑ \6ݗ@b8@0If e6AωX~xNs/InSs fꥫ}%ѫx!Mex<琲x_Y8Xu4'#3hќCb`>L9^69yfvhNB9INWׂ9q桄n:߳iւ9qZR4s%?k9d]!9Y4?JHI9GeJ!CBE6j8gUńIfQ֍H-$v/ w ϙOاT: 1iOɱc*<Ԓ, S, Iɱ$^$ 3$ p`Vd|_.$ U&1W0[`Xfl0L c=,"?B|ĉNzQ 2 -S4 9bJmLW%36 ob~$R%Y>X+Z,b* Ys-4 #&(Ν%?&yCo 81oq*qkb6B\mo%sj䜈Z,%>m441yag`}5@hX|fP%=hq`9>^v;P7"wW}3|l0J,V 3Ec:dӎY\'K|@#?qku|(ޕ֢H͹4i)96*Вm'ИVLN!p8ix,*c,u{Z-?AD I(RE™%I5w"\G3AГcK! 1R"DXB!I~{@9gx/ΡVGXcdC!}pa+@m,L:a"󍮙XT`q!rcsvŠTgl K!˯Ż3bv**hd,v>4`7zh,1%PbaK#5ɢYb"g\<![*@`(gK? N4QY ܟA"Q3%~aN`\o{Ab&$L<4ݼ.8k,W|\!yk4DWc% 6n8A$.,2pjj6y[L3Ka=qzQ6_¨"Rʦ1VXtk2w6ɢUKB): `J<6TDpBÈQ^%l.Y\ < 7ݤI CZ*$:d.ߦY8ip09©48ʇI|#`^CXf T2a^[ShGp+"D 7} pZcvvЙ/8 sg+#Ts-,A)`A:?"M(s|R";~+ I`q2܅ե3Z`>b*҈y!4y/k"DMHI#:kJ!_ˮ&? ?B*UK$raWIE-^3=$V+3$bBUJD,"j틮d T63M1k=nT#Uװ anuuйշQiG727Zۢ]-jW]VkY'8|4d&<=pd=0|2cF"+LEVU ԙ 0q n3KJ$!D XB.IhN2S~HvuR([ʳ9 )`N)j0H>?5hTi.=puN&x,1(o py)h%5hī4rteu|y4?"/޲ ;h&+A9+s,XG%,Yw|h-<}49ZNM"-ì< F o5$ ?n<ݬ̀dmݮl=6U>?hy|-Ӏl%c^91M"PMƪd°=Ջ|C*lߨ(*R 8$ndy&pXs0S5.2TVk(k&{x,aY /bRXr(}7֩t9 RĞmv$OSG%h9/RQ R'!׌kÁwr2rfhqA&%X8I-#O&=89HŸY?\nGB HTy_YxaW^[zyɚOw./ZGϗ(2AY|[TY_N Uh|V|II|S>ؼoZ>PNuBħhN3N||jhVC_]sEVJ.xxIFQ-{MY#P?%'J@!S*5pdPP(Ѳ5_T!wHa+a@JҪ^*Z'4vVE C6 ho]%qY2* 1ڟ!_*qpJLՐ LGtrQQ`XѨ#X-7#[˃Ylyx-XGӖ2ZCmT2[fȢDQey(J_x{ GEkyM[>}|w4#g3v4)4\_Q6Ŀ.UNG(IL&L$$&K=ޒp&cOd\;Z%ɔ%1AFvNILr*xWZN$&#%$&`#la.ɓ L$&p9b/)- ̠=1yy4&l ,]{Zc"S#> ,&IL3ZaD.@R~{&D@& &Wn>$$0yz0ix%eɖ$U ׻7o7><'P~=BHԋZ=2Uw_eJcROLDJ/!s"+.&m Gy^e<`[8\*rQ\2c>U";;X5+Ռrf^H&F_ӌ8zMJud_0w0JQkZyuZ@ /<r6N#_GrZ:-:\y)%.8BDntq1ΑD.D!d9-1} ^A؃e|- >R9'eޯ>I}&IҏB-lHh1Zm-0ENzX*DrÅߏY=`VZV!"VF!WR Y icp9˷wp-InK#GVSW.KMual^""WWG"87RG") no\f/ !8u?l FdA:82[R pҭ4D&J̰ ˌp$AR.y[U- [^APWJhTJ&c{Yp)c^gP9x wρ9V{Q xH^ fݿVWtgD8quQQ_[-ʩS*aU+L l'6V]gșTO+R'"wZ> ,z? EGTƐk#%fK5Fku/?R߳gZJ^si4}<| WyǵT/lT3^ʧ۫TjVұWļ0VYV@Y^h˗_v[ċ{F*tyfKzbuK1U x3șQR mT WQuūֺdu붺]uʫbU1zugMʴzFa,Zp]񴒹~ju]ڻz^W~Z7NA HƂ@*ތC C KcrWJAc&}I#w8*U=Hi+ʙHd74 WBrP/A#;Fldj$b-gd?H(m!=@ \{ThR?Hh& :_i ?scxEژeb7sfPQ2x8=AK1kL<'<fG(erF]ˁQZH9)刉3DibH&%^DJ?p^Z K40t 72ܜB2I8I 0/U`2G): 4L]8M0LMf!քوi5ETzMp/iC\NGB !*(ojSNjMO#X'Q,ngp5G W`{df*IEQS]hQщ?jA %YYJ#va: L&x154~%|,(xaƙ(h!8aƒ2咻VKJ(eb\Y-#–KtS|C96dd0t%:E,0l^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` E[]tK~5`JnaJu+7 vE݋ 2Eߋ;8Ս@*4{jd$Mg7@C ^ǹJy v)4xMhW0)PʰS^| Q-Qʬ@v[[^֔sƠ;&G,`0!le#Z)fIa =w#2CP~^yE04Ŝ!Di=J9{iՒGF>4YO ߘG'd^ТW\)D"uhK_|ӭ97 !8zdk̉`^9f9OKJWScʃYu6~/xVR+7c}콊ϏW;nѫ"t{d_ 2̾R/B/G8T8굧,-ɘFP[߱e,8kLNsڻc5 s"[YmIW鲯7>XgW,ֆlBQ-FPBuˉNx_&CkC[b4by)XES҇sg4//v VcXG)A> m{}ir4f?0.{R1E[n6!D2R$Z Rlhv2@$M;HI44$Db",ƚ_ђE!O\Fs k])orO5]?iH j=]ֿROObЭLojqT@qb AAv 5sC9H΍V B/j!^؅Ί;rs;VǹzЍZ7iPLW{y4' |$'MFQ;Me2OSZQU2I+gլ2~-ғ-ʓB,Oo yK_>}F%j,]lK!1HW@E@}.E V@=TAjc([G6bF$ a0g+-}5rRY %rd#ދQI[reNw#f.kL"'u_dS=A((jr0Z~S$8ю8q7jf%…Ad}U_x|'-X" l*K;|<-Eu(Ҝ&XU |Whʎ N;7y*퇸'4I_w|w{>}c{qC^M6pyFbwt;sK̰ԞIoEjhg>iV_vYI*PeaLoVX7 ~3g70MhRUo_Q )u_wKx?'?3GN_/Tᯩ+X>fWCbWqFU)f*L&ZMozWݥ*nj5- RB۲l.siXD8ӯ_WW3xm.ٌJ=Y=?£lV+x?/U$cz1'>Xe_QKF΋1}Jb:~*c}]ڲtb1Z/ƨDyY kKcX?Y]pkZκQ\^2-|p_y .qqƣGXҺ7FTJ,,YrLTGjWL J.D\kZ[*{j~g 'S@^S^V$(axtdTNz2*dPNUA2ruj—A9eFPI8ʑ9WeP+xn&%(ǐjp*PHΠ_[<(wZL`r+󠜎CG~bTw.3.7C[ܳ=㦗56)ĉ#4C@쏸B⿆u_C5wTسnˡҹmT.[w2v,bw M} /vlZ6T-,TeǗ- UXr-orqssk/[ͭ0tViӿ26a:F6K^ 7\ss+Ehn-jRooEHn(ZGnѨr|wz;!w贻0nIIiz[6A0v#`hl0g ju5QC/|: $3jv)q{Y 4cg]yU.f~kSmUQe:pw`_)x* _!@sx$mt6#=OP^]?n=+!~l!U"_W4wIA`"q)u[qy;PiZbEǻ,a_8Kb(Vz` `qy,r*i>?7*{T$e zI>0C\Q݉ei$'9n] hqaٜICϹyw9 r9=6N/E&iӤ;c +$NO.6Sv jݶ %.6ml뾜xy^ݯ3"hQm $KЌ%otaz#j:wň q!@S3iG`7l1TzZ[<NKe[i\<q!:bv6fiԬ;$H#jQm|Dc]6be1E{adj6n-SD, "5HHp:hldա#))D圾w֌Ϣ@+!xj)9(sU%N) {RԦt5` h֔k,A߰gʂBAW氵"m`4κ.LecZo,ߤN.sg4"tuZ:tәg rk@R}(s^nD8‹cUx Z )M͔l%qI9lM*Zc'isn7~Oq\l+Kz2)*lQ%[Y<$]j<Ŷخ `>w?nګc+[e,Y-"0Xq l5yKYUWɟ31bz;`R{l ~'xqI5ͰR{/rY-/6tqE6S(hYݛGw>_kshoPmA[n*=\p<wgEⵋgzpxoY ~}ge2A[Pw.6v>=@J,uzN;q !;#`Xo(WNR73nޘhW4 g!V]YHŪ$]11Q&A#3# ^NWD-'W0 Z^= ^[" Kx5lxPArc8HT]?-JTeuxyLLj)!ؐ]x ٛXՈ.ꚻ}jn%aexjO*WCV@L q?ӷr;eA4(슨NoW^ꭹ'JWsx+;Z\1wXs ܺn1ߔȶn=x[TlԦ-lJEC}f{)ȎK{4;b/qV =%Mu8<@[7/cOr ج2L-kl{mZEfecݐW,uZYZ4N^PG~F߸w0O{h|& 0B2{TUJ䱗1aX-yQ!e@[AFjh1Fl<X2p2&+v937 xPa ).Fdd\^ƌvK|#p_i"C9dvq23S}se"A\v@.Y e-S򗩅\&30R,Knf3ri΄G.#S2/Ú@Xe\Zd&\y[fwf":PTe*,.sodf7q$ҝ]xǛӑ;~{5\] Gyd Ù pG3̍.n~Ps;y2d>vYd67 ڍ-J$džgcS4ridc܇e{ٯe6xiGGƆ8tcB AS-3EmA;ayYQdQE rr[Tm7 .ĒЊ#J7v)ySfXm%RQ3KAz"Q1B9JdvTsFp~Rb/_~ ϸ0'KAݮi=zNȗ:|݋^*;I Pv>qĠȋX3خǘ/i jXRZ"q\~VsLNƼ,h^> QgΫ]nP27oC[+TƕPQ {JOx ECW`́i-#9WVyE !y3G.6Q,_R^YmyV.2޼ ˉ`9aI%QN>˳I*yc9."bc^qgDqԌ6kQ:a(q?{+Ҹٸٸ0Zƅlƅlƅl\0pn\Nh\xW#ҸٸٸKB6fB4fBv. = .d't\/EBv. .d+]VѻKBfBfB.  ezĦR#ݹ'C'8\'ZBmg:9'yB'gݗL:9;*WC'!lż//\K>[/h:9T >&͗;PhP.Ha/w NB9{0S)',vfH^?R9>KE(rզV}j9^{/?1r!q |J尒6G~*|K:9?ǂգNrLI&G%[Er<$2Qߺi}C+bRHHC)$fT YfT )BrBre:JR)$!2OGQ*tJ!tJ!9 T< THGC*dTHGC*$f2GC,$!P 磡 =P[?4XǧVT4*Rx}K8ݔm!6y!;+jDʟIYD3nTN1;lkF;x}N/gD#VIbrTGY1GY^Yļ˯́w#ޱL76^mGz+#B|ue/c xKTqf;KLAy@rwP 0+V]&ќSOzJϊKe{>N|_wT^۔˟"Z|^WEO9^4UC.+jgאJ\֞yoZX9&pUcDN(TE7Rul5 V}7t^h4$ hnz٣̀yάbYJ6${~iPG2(ܮxF[%b"nʹ Y^W so1=9G$6=7K>sOtChֱ%Ut0J~S4g[;*#U^k87&{]&[o K' ? ϲ>J Q'>R n]Vel+ X-p:iqb]Fj]ILUL-يۣW(MV^rZ:3O9;77k~R=varejjN upһVsj?%׀oVbmT׋Ԝ X:nIk6AضڭV?Z_(k>CW lڼE.+μ,H|VTk#Rȍ+MjH-x"{6{8'R_aP$A)N~կyۍՙeg³g7 sskvM h?m)0~X􎊌5!&]lZBV3|v/Lo“H`[w|VZLk^^>gмT靖9n92EYG'OZ-Oǯ|ԫ93gկy}`?2vZ_2fn},91߬za\;Ό m;Z^J.=-U].fA7 j4ǤʲI[}L^]}=fB6~ ,q/xYks=-fgd|۵7}LS3VtX5t5Ț M?*D'^%EP_ԎOEWp~zl[i-^V5|c=Ɖ2`s,iYVjL9/Q\k4] M}Ik9(H?5]!Ly*Tth"ᥕ4hSK :3m&Jz+.ID\ot')sDw_ c){iGFմݍ7Xf):g><6-ol{Y=@KTx9ŶDUeݼPq{ZF ̀U:;*>)YU8]Ӷ޺ؼ!ۻ˳Y6y|ክ$*j7HP1RtHcb im]b|ZaeU#z^I*Ȟ\Wqcu:36eW3oX8b Tɵ~nU"GĻ:H]XȬ)Ib*]`+' B`~eiO5gZx+TXwG]QZ7Xh Sz=^ujۼ|3&ƬAWVB6sOӁ^xYcP#*9ug6o:PMht-5y̪HDyL)B%}P:_U]GtF##3nDy AF(o~!|;XrS 1-c*@[Vv% FmQEt]Ni?"oYrX[aϓOgJ90,qowB/t:ϳ9ս cq8]Z&F?>) }_ݑ5+F:Dnß8g7q~>~Jy kwA;[PS]Q^xʒxJ*[x5(cD%,#{jB9' pK>Ϣ>L-Rym/M_9nD/7 % Ҋ7B:O $Y3kOz > ۤgCLJ H%^saWHzǰ"ťūo#͛owްE>Qij<ɜ c"a;9#{Ϛ+ϫrIi׮y}da ˟Kml1ˇfO׶@TG|(Ām0*RQ7;ԍBtۨ.6/x'n*cr4 Pҷ ]VLo1a/HDmq5}^ůF . @Fc;ś~&]G]%sE[/aaM5D:UsfM)fbO]WV&uo.`fEإbAA6ʪTވ)bUu SWhh}pЩsP19~ڵ ?#h,*.]I9A0yݶ}%x?Ą꺴{1րUoG9:j'Y^?S@nDEWï(LTw=-x5Z}Ið096S%S%[vWt9M݌GSIuߣaK5CWGp? G:.reKMYA@&Y{]$uJE^MwAJFG'z.!I#I}Ww9/30k,Ra<&|=J ׋u$Ewgձilki2گmBZە˔UUL=U?)C ՆF$(sZ]b_Bv<^k6DZYuN&WFYyX_D*^W}k1k7!qv<[6 rOQylV<}McmPJ)VҚ?fg8]on2~8nڳ8n=#^!Ldbc,/,a^|Gƨ{>x?Q3zrco~?S_/;eZ]?yOO_~ʞp  &ESڿ)1g?=>ݾ}SCxg7}ٚWm]>׿c?~b,Mwg$6r*-IP3"y'SФtV¿_?1Hc3܇ܶ?1ͅGȑbULbEPxZZgR@ND,6);F3"~Yt]H+뉲d(SOd(e_0#wQ5a@'؃A89|"nS}ܶ&dRuٜx",9wD ŕJMTQ_XIE~uigރPMEULU;=ϴ$w}>u)vީn: #"J6KDwv51}Xo6ڎfpΖpeee]g2L5.jjjpę$`'U'v&.,.*@gD-"ę 2\V,`Q`鵲q% ]hLnX쾢W8^m3ZM`X'VvMH$cҮhwmm$Pܭ r!Ԥ@U{~^"FME~c6;yl-bɓnNcmKYD%~w[.`hA' T&+5ϦVjz-B/6a)ͰL8RXҤWlTY51C6ӣ讉(w{[Wm -S9 ,iObKz_qwdhU$eTKTt[nPg`޸~SE1qV?UMKno̚JN^ma!1Yl¾1\A/5{˱n"pԂT-,|Y]}ӈwᗷ BXY>hhj iح(Ov;& \\K&H3: AzLA#ݩ@UvxYVKXA,(8Lr>+U_~Muu[:UWYy\4)YVc`݌]N9 VUv(CKjsҎE% \w7isg2m`;*&h N+rPo$ 3zd(ʯ< ?97Y*r/ڬ6nvqP<Ǐ*Rqd#BEov Q9m/72aщtZy6kt:n:CgV=;9bt#ǫ\Drf3?{<ʏ˰ .:B84%Ln󔥡S1[AkM5]P23nioV8Fg5OKF A n,(^sv蚇SpQ 系-LQwn+Y; {c|rMq5vO%*bi ]A}: Ҁz9ΠgRɉooBAgўGolx@%Flx|^P><1襗rO!l8= /463tWOٝ6 ~UԼBͦg_f4KBip<.RZ1obQs$IPN/v?~y''_ Ry\(aE5- kFMăٵyKcL뽆?E$ # <;s=Urh~ KN'hn-cOp%G ⡪/ol d`Z ^~^vF_zoj)#IP;;zP+AzgqPp]ET6N: #.?s^yaIܷ{N m^:$igiV DP[ߟU[QJSkk7 vk",VV;?w^D)嫇a#q{A Ǝ~sBC$o#)x>s;: L-j$Y*K-:FYDU-Z JŬ[Ujo/쩎3} q'ܕҙdp|Ryxq43[!BqKֳMU:F>wZ_Aeհ͒ kc6W}^S0c׎9}&)EߺYՖ Bgs"L{cNw,ٍ3 4ZX,ގkgU}CumqOحvv5&ue2V^yy2l( =%d8̦V0&{L ~siQ??,\1]$H, Q"Hׁ vk+*uO%f[|4=ͻh7V2[3*EqC Q6a6ӗ$'yPjNnvp)IvI#{ ,cjJL #F$b$XG(!=:b ,/8.ť-#c{W8" ln\m[?ʽHFP'#d-3v/}ZN3lwR7;շ9Ū$;gdȯ蘿VzO(n rjnf9KlqnJl,SbCVp' \I7SX*hOI)$bD_}Q}YE8%= ]Qk\a&IԙɂBri{Z(zE1T*f!]nj9%訉"!-!?T,ǓŞ'nw^e,[E Rc똴xoy к#/Pa,WNƟtFM떈 "+0Lx\Za!Hi#QV `Zf6axN.Iw}fA6 (-~łq*tG>l%/mؼ1Pv96sj+8(5@lW +Ô nbRR*B5 Z=5} =VAc=1NUrwt%UEoï8"{JC[LPLLm8.V CT*ieK)+#^A_(?ifs%N ?sg^WP-Ь쉩2_y0,&^YUet 5z nJ'H^\3Ӗxf_~az'Rzhޝ .I2Y˳7YK᏾J?,(}P* >ΰ%լ"ӎ]a~DCx-sMո|5VTsºk*i dn͋8F|f y~A"hu%Pg7ol09ܽUL t y*458߹=TU~&!xX*8Y%YI^# AV6)ܩyZXTSU{Ġ&Bp^'#f;,*QAd3D-I+_,tbQ+Nv37l_LUHY^װGXZ 8X\ hEZ$գwyMiuF^!l5>})i5s*ϣijcڹ}Ԓ *4wfH ?J6*)u1BTma6sDZv ?H.Ϯ~g2b'r^_{IOpa&Y\U*T|g)1ʶGڛRм /c26dԪ < ]0eBd}õv9ztg͟*\uy$VAiq0--kɶP"jίDl [Oe[D A26ˊZTa1ԦjXi.d6i[C.ƴ+E6& QHvVvGFrtE<~o.6k8E̱7{^ym6BDSkG(VIIqaJ$hL١Oe5D.Yӟ}iyڇĶEmL[H?7_ש8LjL{w+ GT0 &sփ,pa +jlI}&ʆp[5K:LPk1OyϨ<]Qe8E6(MnɣNTN:,RjJ~5&vz4z/ԔEtjJRO1$fLT5N |.Qi>"JWg*M\Z0TfFѓVFQp146ີsR?:2SLϷQyqk!dj%@TUJ*_#5֒͑Ze IYF8m$-+1A0Z26J fuxdȠ+,)WUo@ uȲſ41e9h edzHj#\{Ul{$!ۚ? qzXж#Ok}6gBonӑ$U/0M2؟'L>b,%*mlڣZhV/h6W&DeC*e.$!UYfQiEzs_)-_y5sU8cn*8}+. 3~h4zD:U s%xY'KZ{=9 (P" 3ϳj`o.Q~kUh>2)Q)2I8$Z)*sܕ!ccLxӖfh7ֽv=)OpW fEjEdaάT>%(ej-z߽dJu Mq{YvfؐRLTQ*UO {~T=+oqbF;D^h dޘq&*J@d1HQmP k{Wnwfc^h"Hg=-TG^g(C%uȖj ))U;QY=/>}g*v7 1_1UhqE ҈C}BgƆ '.52>ݶfb)NT7[c0b, +<#-t[q(}iPhR)fRl5U(V?8,L ^] [9(*2ڨV\/5 ϩȤvD:jN>/ @hxa0j}]3N Zj@]=wmWqi9UR$ .W% -zzubuc*6XA/P+GA^@3̯01|4yn 3N*j6bu5>jvlp|d9:Nľ yzŸz$b ͻx wnmv.k[*h>姾RfImDZCʉٖ^%%yD oPEטt۠"}E/[!7%諩-& \zd MGE+mPR'oU/ahW G>A.]݄v>TT P6W[  }Z&6utjfgU' HvWsЩhs{)^HbТ6qZISYՀ6Hw v 1ܾg# N&#igRYShn'$0_Ϋb?Lu[g+n$P%\-hkWLI1mgY_& T"0Ѿl5B[BLoj=48 /tW2,UmȷFDN 33=A^:g)'9}Ge6ԡٔ[3qW Zr ӕ]N"=*dAMQ)V ,NwZ)xvwu)k)㎞qfl797r׊9ڲai$?BT(ZU`FnsOaW8;MYN QZ*vT)UC:)j-^.˙VE4 μcik^ ,1Fy7GSK팉 j|WJZsض{t!r5JCκiN۲ѲJ3H-Ю͛e Uխa@AsI\c.$x*!n!~jnWh1_*3|N)*=I $=љluz83g89٫$ﻭS&d5pTP<C =@kF(w9P}]+FZE1B7.e79"ʪ>N5w}hEboے͙5,v j ʍ mwSdXbnWEŮu8.lR Ҷv)ӕ͋^-j\6HT[S 1xZnu-Um+S&i4C;ćU2*N eYjL+0*24Ϗ|UҪwHkNW o)We#~JK3-(d;8 o_ygݛ:UlGQ$,XVeX* r節Sm>rDy̮T.wvfq5oN!Ÿp+U6UBl/XӷQzy *uN2U2<(0C&k*v[HaDOTNwivUr8t\fAZNÿSjoSX)ةU_ k+Bd>N?Wa9rE}KqYf )vXمƙjOtB4+Kxq7]Y{ U˸Ml(=ݰǼmgq Uq- 2"8@oﳥY qj.lyDQI Bʘ Mi1IdiضPlٜ;( ޱ\fb&Р*9(N[Sҍ/1"wh  {`ʧaZ> ׆ =B V_i<JUb5(dX/_&đz>(&:ф|>ωNMTgQ \ 3t. =UQP9V2k4s nۺ߶/;Ϗ! rPDB],%[x2QTQ k(HyO˶XOلXiWNoMS4.Zբp'>lĵdu%kwhv#Obz9ŞOyTaTɳnHJŁk2$E)*R0r%d7ܱd֨:Sojds؆$j5J6*2/d%tDk&JSKjy? -+ r0%Gi^l;|d$ZNd8GZpռSɐC2 ;-՚\TC9Ns}z`[WT_fKˠn}rc.s{1V9"t+8E e=U ];DN. gD|/~,m]cN+6펣6+ %U8?j+0z4~%}o-;v2~Ͷ;79ɖ(M~G" xmF$`dGZag{7嫽yfOnR;3̥ ):#*E沙PJ7x`NVK\Exg"$)m􄘢"9aQmb-PB,RݪW>oB5j 7j#?fY5C?X7~&/ y.rqo_|?_{۫ǁ}D}0.,2 HxweEV,o5*YdPdW, ̎YYdEeeay ԐEVYd%5EV_XdHYdXWE ,2Y,M,2}V+ Y@F?d3d׹,2&P$zEF"{׵`ɺE&"fa]XdVg=`Y~f!7Ȇab1XdEF"3ʙEqf Dj,2B}+gf!gȤ\q(2, LM*mLPdXVU)|iYQdb3 EV +@ELB80<7l^n,V h"4/(Z"\Pd5jE&˂"*$DUWE" EV"x}FU(Z E&ۂ"eAayȪ:&fE"ྡྷȪ&9~\)ADa\Pd:jFax0.(2 왭("@"N("8Eƚ tXQd(2fYEٴ E&'L(BpFju>PdY1܁"KÌ"Fύ dLo'dAj""K;fYEVj_Qd2>Pd:EV?ȊH!E/YeEUjN(aPdi ^(Ќ"+ĬgYfYEV$6J?("+T(EV(g(r7 "+,3nEqAaXPdU(2 LE&(0ȘVk""RgA!Ba\PdRQdD8tڌ"'/(2 EOYPdȴDi=lC(2"qF0](2~"Y&YEF`EU$F^(rFUgYEQ LTE& E&".,(4(4L)3"^Qd"KÌ"FGU3 @ E%,(E&eO3LEV{y0.(2 ZE5-(21g Ym}E"yB ,F{W5:B1v3, 3,"jȘPd"Dx3 ~E@ EV(2^Ef8 L93 Â"gy\Qd@\PdU mOK yA Ä"FG1-(2"(2 3L;(23N(25}XG" E@Ug$_(2=E&E E&E˿*O6H3ʂ"KZ1Pd:EVF\Qdu+[wFu(Ê"{6 W'LEf EfE&Ì"E,+ Ì"OYaQd E>"+!(2 L۟OEf Eӈ(p"+ Pd|_(23x"KÌ"Kcȸo+EV; 친oȰ(2,+KEuAaQd:"+jQdE3GBa]QdXVٳE&"ә3LBYa.(aQdi Y5(rEƤҰȆ5PdE XPdD[(2bv+EV(23H͊"#Fa]Pd:lFaxd]Pd ,(2,o &Y_^(2faEfOD *#"yE(2n EqAaXQdR1^[Pd,(2Y^(2+L FZPd0,(2o]+LE}}Ȉ(2EV/>QdXWoъ";Da]Qd,(2Y^(2)f8"{fYU"cJ|lPdJ{CYE<6j1EVBa[Pd (2'4PdBiQdU EV%"c_PdZf E~FUO(2>Qd 3L}pSYmuEٗqX฾QdXO(29M(2,:?Pd+ , >8E&gxAQAȈ_QdEiE.gAQ"Euo"Ŝ"1[_Qd\(2}vM(2,u?Pdo(2۸(2o+h"+RiD_Qd%":(2;/EVb("'LqEeEBa]QdL(2OWȸc LqXϊ"SqF!U>Pdx+EFXaEiP(2oY!(2>"c(2>kEr/WZQd|E&"aAayQWݮE"JWYƄ"{ϒ?ҌB@(2xdQdT(2 EB/Pd2(2 v >ȊM-QdWWʇgU5a "+Pd2^Pdj(2   R(27{D8-(2]/ނ"vtAQ"#ݱ/(fF{_Qd>Qd$MRk EԌ"+#Qd<LEVT;PPdBPdM EY iiA)"øȸE&' M EPd%ց"+ "'EuF'YXE$VyErgN |B)F9Ȋ@q/‚"#HPdQd^(2{A[@1~.(2M3"qFpEVTWE5.(2 ڤ.-Qd1DÜQda@yȴ[Qd;E&yB>Pd("" +L'{Ȋ@ZuԢEF,dF]E+MȈ,(Z E'zȊ2(2E66Jʓ "SZFI3HcEȔd[Pd JpEFq"^Qd弿"[zhwqYE&"eAayȰ( E"c]Qd/(27LEeAax0(2g7 bEaYQd8$oYeBYPdԌPdZPd$WY(2R3+lJ8b7 >3dYPd:"úȰL(2|(V]Qd,(JC EuEUA}f "M\Pd|Ȫdڊ"b(2.(2FɊ"S EVQdȪm?PdԣֻEV(Zg( R"(x-(2~"~"ø2ȖE&"òȰQd5ԙEVW"S)"U,(*'L3L Os"cYPdPdڗ( /".64L(2ELEeEUp~`,adEi FFli)5dad:Fq)9Ԟ #SpQ˰(xȐX`dj1adj 8dad*$`dj`dʡ|(adFzb_~A FFg #q F&#Ss02B$+Y`d/adj]`dUF^ #uU)!02,o6 #}XadlI0*FF#K #F׫#*'2T7YFf?g1iad.02Y7L[FVsI'#zcg{F6Yډa _ȸo!^3lfٰL PtadC[`dUшO!FFxv}]`dځ-02e%^02YF #SuɲOFFusy&uQ~~hzȰ0"iR#uF,>ȊgYFnx[_ad%3Le+ LFf-02Y,3L_Q9x$+lXfYgY1;Pc~T3`dadadDX`d`d`dJGFfF.eQY #éZad2&  #+*>ad2.02Y(:Ȋb3 F #(# #+үad܌F6Y&du*Rso\gYfYF/02FFXadVٰ0202JVYQ'ZFV% ad{|$8Ȥԓa]adXVyJm02U/0R7`dLq+LZ lL0*7LױȰ02Y^0202YOY\ #c]ade kȊ 3} #3Y`d&;({xMVKF#:d 25`d?]adN #3iF| ## # #)]adU3^7̬3,3,02F&##S*z #=Qj??`d9{Ȱ02,+L[OTbQN|Ȉ/02ZgQOFe #3#.02|T3jm+ Q #t #[FmaX`d:F&ɕFFlQ0a\`dL Ff>FVm`d4-02>adyTȪVIsFVO02FFƀ[`dR/QHtfYf0:#A`d0o  #aOȸFV0|0YZfYFf?`dU+Ff!##J^ad .0023N02Us0z0.02 3L0.02fY`FƓadu ,`da 3}ȴ~02UIN0#KctUɱM02Lj/02/F&#Y02gF#Ll=8T9aQO1$$;ȪZ?`drad8 FVadM^`dh ,040at*afF #ðd89,fFF6 lFV#1/faFVUY#Fg-02y},`da YU #cr`dR ?FƀIo3xy02Jqz>adJ?`d6-02B_3 #+da k$|94Ȟ!1`dgEFdب]^͔E dqB&2N]0tDg٭~ 'ctkŏ]{[BH伒Vw_csAU|y53M:c"| Xc0c8Aea,g1 9Ǵc #)EYbLޙpclJX7u0Ҙ1JA|pkaѽFL35LF}nPdia6Cð$4  SyNTIrZKէA {?/qb坨a-,0ų j 0 +؉ h[mK}]$ d% /Oo #JDLi܉a@n!\*s$dVqa  #Kʔ09*L -0R~4pFZLpŽ3"ABPM&N Vόy0?-_۬3 츍I6г Zg!G UTcޛ$˒J[4ڍcZ{@0IEYE#W^**2Că" `!0Ќ!`oǜf6 :kY݆F<\ )V*dӕx/2B]M2]vCP" `:?CQ0LSA[B"--`ڕ?x쥬(2Ld}2Q STW8-#tmÁ h/7ݕ ֢Is <ہ[BF-1`XЪp*>;Z/4_c4Q4Χ k* l@m __i^_ٙKA$0>g~ݨ1=,/'O:(.&hhfA&^e)Zb h)d/V%J/j -__Č^`q[ḵ_\aVӬa7nw:KKL" I9_A<lp%\%;:Ag,Fݐo Ei仭;a}i~\'w fo: Pwi2I/L7Ҵ$_[H%{UW=v_ץDၯ!^AdDZK/>Cy@Ğ3](u(8{K_Y@>?c;*KΤ7n,Gu^R\S?./^d. x7{V.־˥I;[zEvr)Wbr\%#.J5ȥwqi<)uqÏgø.y]- u:*KfP(gpaZw WpiEOP0f !IvcA"Il2S>]^bٌ6KސB">ϦpIYPP.B!j.N.\ʹsEEO . _GzA-l's11f nծKq:2%C? :(\wkalvoW&U,)QI! ^WJ3x덀so | E[[Q-.H_kM1|u=m/KAْlaERHKlc z!lV{hьw f3&R))8e{Eҿ> \Ҳ>SKf|g uwǨ:WD-Lpֲ%-rx-.@ԢX0x`u2/E"ˠ+LKa/ 9C8I b#'嫫h-m-5S(->CqRLE@aư=RQ+4 kz zQ0ó?e.vmޜAΒw zw,5Sci,\جk4 "%@fTRk}Xk6_}nIei,%A"tE>鋕,שּׁ粼^FeP,HYEdM&L֌Qd* Y}:%_v gM UiRMcsgcMKfІUUkoW- dЯP~:b~ŲOo٢_5j{߱WR0ӯ4኷Wdٌ~JW( Sb_^jI``g_I& qWR,~tC_Gh=~"Õ+ WX+\鬂W,"Jwg_ e2A;f_̶Wxޕ|%To+""|8m|EveWӃJyO~  $ zО+M+vQdOQ!Wˡ.Wd"({LjĸۻW8#|EL&_z~ DA2 K[]y|a_a3i5ֶzAr`U{|%r[4t7*'.*hp޲WR,ˑW + ZNzrc~ge A[ʚ+bŖ54uVF)KZ"_i4WR$+"o|BmAj䫆} K`g_ģ0Wt PW~%'mDl"yMB^7 RN":Ԝh&_Y |E _)eyL )W+ J5/L&_)Yf=nk)#aA"Bt'z|E\khПh&_QZ{+L|eHWY!nr,Ot<|ř\LRV>~fԗSfȏQWXhH;WSXF&_q&OdwGw)+} [@ "Ye:Rf^edBpI+J( -RNnv_u{n3rȚul;iH8C'%T > endstream endobj 22 0 obj <>stream 1: W- |EJxo,yd\`K+l^&+YTdzQ5=IJ_B7*- r6R╕Qp0e xrsX@ê6WVzEBL2^+Z~J5sz)T ֠QA|N)D^iAD~q>ނ8G^^54UW\+A Q AUmQ;!G^L΂VAR̀~fD{w^r9('IZ-vk+*Z٧0 ڕϢ]]hW|&]I`F+/U{Q^uFJ-{ʌҠ!pWzቴEafܕ&}*Rq:pWzO_.oٍvEe$R(˴+D<.pJЮhmMo.U^N| Lj E]5hW8Ю4DfU+\eN+4RNBЌ+ 3cy~0*8`WkdU Κ\aqW w]u6w% 񌻒w]-\wew΢pjϸ+٨pWwpW/ -᮰ϸ+ ܕ #c +Fz :|s+Z$Y~I]I!|?`WDh'K|>[#:ͤX܌ź`uYJEuEMwP .I/,jF]9Nj;Q՟ºƛVR+ڣek,sx>5îы+i$I8jfqWq|,YR6"]q7^N*+-zmWChʝhW9Y\7hWZ^+9!BE':AE2 _Ю-ڕ*p ni4Abu U7^iWl) 係vBjJ5iasV2*?%U}»󾃷!8 ʄF@^#6ׁGvd*EہBa yvOSh#pdB^uS+WII [ BYRW!Z)ī-dVxEpՎlxe5 ̘Jq3ϸ^ڭYY^500]0l= ,FbE7Wd" 9uUcY,aϗӮ숣ShWXNҿ4<&1fDuuXNwA*ӽs5u8Wgf >,kt׾"yl'? % V%QPx+u!E9u-v䄂m%vd!'l%[kVzYH"Z-!RYkCcU\0+(6j % w[(: R?9pr UQ$c>BX]a VK JEHy4m)} V2*Nzt0.5'~%W=t)'z$UӨUZhUʱ %UO$l[\!wF'tJowfdKH-z:Pis l߂ֱ:oo[%dZV̢Pn"_`UDo[EdX jQGUCd`iĪﰺt1Z Tu ^SA[Ud"^*~Qu_rS]nַT^&e:~!K<j META-0dB\*}תiV}Wr93setFv?TfU HE e׃iqFXT>*C*TW> ZxB XbPTq8K>6YU#ƪW{৬=+~mUTa*Ol{yB"yER.̆1S 2:o?mJ@By OXCOflw3˓T,AE g -3IG[U+zo!mg'&v[L!P- @^@N{vMJ҂@L2o)}{  [j3qA.) i~>T˩0H*Ϙ@ۦ]E8@6 &T{1e*ǂ@iz@E[&LBԺ+T֞eQg^6>d@e`Kѝ߮Am^gҜ>pAjO)])[oX($4w5&ABP$1ӧɼA7VJ0J=î! R2}jAb9ӧS@.DTNR6m>t'&SAGmJO8ƢOQNeoЧ,<>Es>/?G=fAV*ӧpsfOѵjtإ;|J׍w5SKHʂp}Jğb$GXѐ6گ'QF!*,3'Ke*(RuTsϻ2µS{/6mDO!vKQ8@2原2^X9 ?odž ~đ\A\BK7oNG={@6 LTF6J@f@@Em,E\2JAdn:yAe𧖐S[t%)Rkz3 S5̤X)*D]P9:?T)0 薍bUG Pm!`K)[[&=688 P7Z Q5Y@Ś̗TK v7, ;D+5Gw#.% :[%_ BEVR>1VƕT6T g}/@xmքfIS !,rMNb[S\M氩߅5>V M}fLřT)y>HSR-U߻.FRz7GP%{wةH"eNuIr95 %6Qk o;FE~^3b4z&8bhr'-ԮO Q C5zZӟsm,d͛}Pkv.PJ>DeU/!h৚߈ϵS4<JvM9AՌ'%1xJS 3(T*7=Ճ|('bjCc,vH1ڙ:/N)ɘHIVbE_Vy+xe_|m XlI70.цWa9'HR K anRJr%lU*e$ #:r Mv/ 2XP/M3BT"v1Tx(v]b-zVY6]tSmoPB)u8`04c8 1(\BWXbw[29;^tjPZ %z"V8ܓ:Eɘ^N( 5:OUxULynI51oZ5Ttžs!S<~x #ЉI]`I;{dfr5Z{9)-|.Rm9*3vڙ$ A+93HVmY>b]~1aۃagހs؈Ժ0+6fLOz4>J~Ue­R`ϢeV.QOΌ|xfKttX}>OUeb+@VR&QԆ㞨\ e_~f{oQ6~b+p7Wq3#:_pn)1Sz݌pb% qsH\J`9bfTZ1@`!K5ⶰR_Qhb2eT1(ZMe!VƦFz_ה;MRw\>`{%Si\ kbS^I#n,ݭc!ēd?I yʝOm>_zT-YCG39TptE>+;R>ӊ}+Z"yïr piVoYD; ˼ꌓ˔l)%ɴbHl^-^YpfA+<>}É D!®Pn?ͨ"u_Od3_Tp Kjzt7@yGjGD_? c_X$bMox sn{FOY8UJLYL{ra 3G>NhoXR?l[<(8٩BV$8L?I\XLKkmU/ATe)t~p"M)1e dEaUmM?՘>4BK{iNǩ,QLm &a0}R,n=kVKSQ])AJq_:n?R6Œ{|bgv46'Q䂱Uk~30{ZF5}ճNtBj䷾ ּ}T3i5 .=,UBbN jMD 'X472zqL A2bAR-ZFDŽ|%>)vC/іIK4ȁRҀd2- V6ڝ5g=K `:D'8-V'es"2)ga~ 2:aNWHYM+NOvyb/eȥ5(/FF-@`3Sh:c')φl.ǻxlr8☶WNěDI%ڨ/ K:h?X 3#By4)r<jj5E@C}9,ԗԿXK5{a (.TЋf@z/M gve `<&ڡb &ɳbq\ƀmQmnTMQhK|˨ڍNfݐB۲b\1H> QG,.PX,^Rm}&UÛ JuC'/Fu~D/g/ ޥ>=1ڇ7ǗٜD%M8m{)_pP(&OL b rUt^8'hjECYԏ^ݓY m+CH7"CpXҋ3AYN jRj;LW2ͽfҟmUw(WbhrQrN#eclW[wd,\XtٵN2QYO\_XZ]Z9|\%i=Bd-+m,|[>o6')g<=Z*#x =9@M|+7̭Xts Kk{-l{Ӱ4ɯh^l+ϖt9^ Q}cEOg&9hP. +0,qhaJ2B-ےr,C-6+J$*xms( G[`D%E6ise#hº+4QR[=r*7AXe$ҁĤm9u5\Vb "TZR &B3`iMbqwqÔR!/;/=`Z+ߢ= S AcG0jeUXذ|IWifߞCf{Zb 8.\<\ﭜmv^$Ko^'VOZrkФzRp`7%>ͤ#cVJBaz(kZu']Zوٲ1d]~xt> U;#=zCa+FkEDP0iI-P`n"*eir.Lz1E[o6Pw*K3e?QNB_sSzjGa{:Ɇ"vb9Kv"a?ُKJynAiuD`$0bR_D#t^m\~(Y9TpZߺ9=U/Z eTxYvU!٬j#vpװJe"՝`JGuv8t5'؉ՑF GO?뼉i.,C ނ!&R+OdNj$֭;kT;3!v^X9?7-pҙ7u[꺪mO!hJPq C A.I ۩#Ĭ[SVp@qTj_o-zEAL-tfĤj 5-CeȒI_j^-b~/*]'n_#qh1''-OCS5wYj bnxZ-pG#CJT& b'nZKyUh#ʈ^6w̬ &%b zI##z}~[-uC;ۇ),JV" ɤZ İM)Et% 6Zo[7rLJlmF5i{yVFkYjVXMu2R#/ԧoV)흥(j.Ĉ$ ˄}C5vu -I1Ո*K]K Ut}4,Θt,LilX- k;QImL(ͨ?yɯnЁ5oײcN&nj=,݉'mEbǽm5 #M[Y$0ПlaF-Y%Jk)S _pxTKeFPd  hP"OYYiRBzde-)E3R U.F-6ir! tCzF*4VjL$i /WDoc+lOQIB ްgCԤi$+MЛs5FY(5^бl[x8Rmt[Jxc۸,x0ڈT9gA`; fÂg6Ԫ~ (lg?b Znᑕe9W3a$Ng|F6}[hو4Kb4SKSpؔ"sQlЭ6j|~JN)/hC VZ`bA0:VxjX5 '<"˭#b!aڪ0<ARdUyY4) FJx{yo/es}`mIZиu4+[ZCHl'6J4EpY!vZ&@jZ`ؔ!lؓnLE>/A7{aؔf2k\q;a Kl$"\{p>Ҳ1Şp ;y,5|KX)H?i%|齣mH6U@|3m7M+ K$C=O@`=b.ET $h ԉcgQ 6eZ=YilNl7gs6 ߴ7 N lCL0I9}T3#JyQl/C̮+g2q 5Hjƈ--Rv6L޽˪L3G|ݡiwyv\60]*7dպNkw l{ `hjubrZmRSgZ8Nq}q'4 hj-[jW|Q^F}JRO/oEJ8jQ`6 ϓα-}-y0bQu'Z<0 t䬑VRVG~l4k vvba#wlnxiTcl[۩΁l ]w Hݸz햊fJD܁Zut7v>i/ <4ծ x; EhܭSWy1%^@!6re9(RGsQ&u \ CTUb~ǍcQ^li[dx&W}y F{&yi@[^̼/^yVrnf`FSc]kZ$9oRe֫CZ z@ GiQFFfqc|d]E#2wZ:HWt*2G h4L|YVlJ-TMf\7ݝ[rJ-*bW7:<J )Ԇp^~q)z5gTNd cOIU-HjBƀ[9͖ (P)}nIzfH/mp9jѣEvT$U0VAG>M5 LQcx۪"b{k^T*UP!<&8i7%1eihc8il=͉p+F۞z] knRM(_w@pRR*ZG0yZ8s Zqc:48>|Fm僩h6kȞ`^G`5sFV)hjn_8(JnoQEⱲ+Լbf.k X;7}!H?I`é AOش( r5.J6*ΰMC{Jaٿy2{__hH>ZZs;}=|!s#*22zeuL^ rU]۽oƙry~nzJadЍP"&My+ٜֆAK,sK[YdgXA.b)0-ݳr ;R*w)ӐJ@1q,J%Dz{%x'QUR8!܎I |%fRGNGU BÓχA7l*Ská*e[}Y`w62[AUf"ֶ{#=t_J<uʘs)l*0N \rnmmžk 8."ll֏kGjsOa8yi,zvWmCbSM5oidSQ6WN՞+>{벙f MCR)+c?Дr[ (m8﨎V&=xbym dޢ9Z澌3gY y@(sqT|Pe4K];oBO >uep"ް9GszMzZv!Cݾު\N/ ba}bw9 [xo4 3 ='Ks+C9r# r^𵩽M\MSڦޫiϙ:BwWPPq39,}zbޯM#YA"͎""V]S);"".)BLی4ĊE@M}"oDsE#7Lhnxp(I*%&#kE߭4幃;L Rj[27wl?tSc @Qf4#Y1LF6r.*lzGmwd94uHxKۘMRa]fTV 3@Z?@LnͶj冨7)v!aL}V"$:NlϹ =+25ý,(!T8S pւV mmަ~HJ>r ۪ RW6yTESï:N׊*s0',UR p8O\}sK4cn^r#V|舨 J( To+J18T}n>$}/&Zq2lµY`2DkM4wT eP-^ETwPMJ]"ԾR87"50QؿF8vT3P,~{j!kq}o0è0f ^.(>6NZB^&c.l]hd_*^JbpP0|ڂ[j:Ӏ(15󞘙^;M#:Ngň+lLk3TO{N嵮n q"ƷmŝZfQ{&|8_Tf ֖ u&]Qu4VJnG_~X CItKc0=I<,tV|Z|J7!X4WG=9( QJE`Ki&%^ |(=兿ZKWqjb1F%>܎Iqy~8%m[lfzx3$uQOĵ7. \׊bgvq3K\J$k:\;h\;}&@ ٵҼ,6[㼬Mn5i׽iB9S`aʛ ښ2ʟ80Fڗ%ЙwsF- HQyy*_Hj9 ySh†ml^Hfߩ7 SV ^g<;-\T;a[JoWIjhoMm .8tXtFx /Zƣ:~?h< n׊ӒSP ώh<>T4-xZW4^ŊKiGi(hN׷%,x>h<ǚτƣ>xr΄f/hFt oxP?~x O{Em%ؒhd<ҿ_xJ |xR+OJ%Q!(MLCƓZxWxRd<< ό2KdN%e&i=%*dddd< OJ%m%dd<3OJ&%͹VJV2藌cWxTf2燌'P 3?d<{3OJ%a!U2j+o+ ɔ~xz+O/B!iV2&JSC!,dL3g=Djj-d<y!az!2]2_!,dd<􅌧U!c O'~x T2ړ*<ׇ7l3LJ&mx4_e22MJF#$,d222a!id<]/b(d<)_22OOQ! 1SxLd2"'džJKS0:dddd<`qG;$|xZT2J:Kƣu6Hg2d<$2..CcVx)Sdd\AƣǾ~xԢ2ߢGp=B(ddl<6Mpe1~xf x(Ǚ6#ZxDH?luW666l<*/)Xdӟl<]/k#x[l: Bƃ aYA|f+lH|xGcaI6Ja1l<8MGNa}s֔eiVxfxaLaaSx|xf[xXx|gGDaudl<3l<T6^_<#Qx(gQ_6jad6 tK*o)gjf:Ol>#Rx)%6Uyd6_6G`fi-em3u\|L /ƣh/h3N6V2o;63If)TxS |xƓRxRl<\gɍƳ䗍JŨl$VRGMna㩪ƣ 0l%d6^/l<=_6ӾRxf62sOף1b(rl<< )l<)Gm]aq̇aPxc}xwl< /)Uc*c{6Usa㙚x(gǎ6V2oD2?{Rxfx`>l<&KmaAG6*o+e0ufU6̧)(}ꛍ+gP#_Vx*)l<5N}xf6)g/OC)l<|xbяRx?xc ZXd6cⱰB/>'~x6ƉƣGJaIl$6GaaaQhxc6'.ll.xΖ =@j6V2ob~)l<87/)` j3o Eb!6-,OZed6‡Oll<2oU6GeTa%%l2XSƣରlXif6^`i{Ux2񴤬l &EQfIh; 7َZ2n%sdr5k">cQDpiB-qTnP҉g/>[:XbىrYng*-mcctesvlG(vjWۭ[6mxGJ0>#jua`u6B˲ؑxlrQOxpB,18uz_@gP]7cͩNR{f)Q7V^+Z:e͸[bӝ^l23l:+N r(: Gwy.d;N 3[bn7_9xgebmy<(tKHNJcUnXXI.{ZLHjZNŽvh]Dyqj,'-!9m(-N8^_ j[NZ̹%d8νQ2nۢVmw 6 kQ'm}S`͵~{Af5`!Mt/t_i8,kNâp|[Q j?$Ps(Cw?a>W8k;M75ŚSaŚ#0QYsR[kcXM_9 kՇK@ЉXp 5 K#Xt{x )9%^{;Hsl_9w5`PY9{@s(fAsNdVW2m%9mUMK-z>NF:4_#iE7"A6D"r6iw%A-s\_dV4W 2Ak窌*zDc斐9sK ̜O|\&̜}DbJs̡ 甹& 2o.9+^5:_;fy髙SPbW8{RỎ[u>0ۗ?R[ط M/Ac2h:Nne.)2ՠ5A>2p3fV2B/z:@[мxv̱s˦.Cpj\[Ӝ[dt69S|I{A8O~T҂)X i%](sa/2 KC<\a&1pfs8ï9E` ĜFTB̑cV Ĝ^B 1K#:myTu3bo${*gSsxH=?qjѵ΄9vcZcEJRAk*eWsm^O˱3 X7ͷ-\4'4 p`0J^GtDj0v@8^a\-p kz( ` -'ojޅ1jzysAuʙ? )MeAӎU]~ a91F'%`rKKNL ƚ{|-PrIy˃$[bp(#`k8r/u-YTcGNզGA}9GNf8"aV?y[䚂)%\c+|n #[Cqv[ؠ9Ff1rq/nVtnh\c¢apݶ̸/sM^GsR'C.d`ȍ9݇㚪7tis[$`V״xHFufơˆ`" 'er20EơK` K B9xqu%8QpuqSd^Vg6NpRv85⬰mن“'%O kܸd\V צIS2.NC$8pqR;NF=~Iqq(p88Skk0"QƂ%V2.n+1dp \k^\pq6\!TQaq[cTiC]J4V8q]nFAඒAp[ FbNaT2 ̚aWI@K Ng:!A}കdorf'詴V5e_JmApVz[r5l2k݊le'@pߐs 8|x+M&.Q? 8)  )ApMٺAp 86 پī?8pRH|ЙLNHtChypDܧ3g ڼ(B28*wV p8g"dqoˆ;` a^cn׵pzV(8LP8ܵZ̰80/QYkedtϷp#p"_*#p* p4<,{2HЩ`wlE\`<^#fؤfj;/w8L=vé ϋ,hQ!p2I 8*ƻp'qIƻo<ݳߴ6&H7뮨$ԅ~cpRo*:[o76]WA}<|QocE|hElȌ{-?;EUޚK!e؛"}`oZq5Hn* & 5 dѢ~ޚaۆ){R`oD%h ؛ JaI~`X'07NȬ7}1z"7" (qr l騷(;˄zy ֛n9Mm,r2MXBM4=a9om,;5(o+v̷UVR41|&bX7Sn nMf *kϷav88$:e^uzHMtP;31)!L7z&М6U$BIa-e9VĢӧux=BHnzy+MEytørۢ](nsC$}VڀglڭNn?mn~V 4 \6bmrMN+wK*)vLmkl?ۦq}E`ۚ#V5mdƬEҨm"?6ŚmڤjuypN+ekšlH*&ɰ6PGꬶ7jS+则Ԧ E>n8m˧єMl8Be 9ǀIGfflc Z^PNH<3O,㩀aϜ`2`Akct<ӄӗ|,=W_[EoUIB櫵/X|5S`p3X9qPY`M d &*3`aMm,#IO Xo_-ȅ`Ah_$5ek0 tl*ʀ56&BRnk O1ˉƸchGE5g`KqM5TXaMfk4\~Xd߶k(˟H`Mufh5R X36`Gc)Sf$ DXskt0dK˭TL,FEf݀5g:'B1 FG(׺`͈o5jt`̀dzk.p1!5jyfg0᢭@`=^IRk|WkXkdWeJ:|5rQLx5E6)j x53]gQ."@)_Mnx᫁{[< =̓@ޫ^  C"RLbY>[5 4]UcSo}jo2W֜jfy!+eT `6%"XC䫑nalCb^x55Nx5}msJAWSaa՜ $>:9]MQP|5E娄|5V|5ZHg-Cip-P5}09T i Ha[@P ȡjĚNT,ڃ&/g[@fe︳2U-*'BUSMU{P6R1ՠ~.T5/jdT5LUQjx㾨j*UM?-ͬQPO8t\̀хx{StB=T͚bG?9jDLLgbsS S.}虩Fl DqV&e Ո^ǽj4:H5gj#< 2& R^435c܁*j(kp"jXxɡj4iܵȐ)_VYAU{E9:C2Usl9|뽒EM)#y@8Cs@drde5*o@9TMr3V@դpMLP5ҍP5cͧW2RUcP5fj T6TMy^ TdZR{=u/=uX5\Qu͜qLݺjzE'YMcd*AVC3jRg{>͝ɨ$Z=<aaY-)tcAV[lׂbKݳ[MՖjI &W⪩@sUӉV5\5vܟq7VUkx7iRt0__q`VFtR઱ţ/jDhMX54m X{a[!+1[P5 B/ {r̂T#юT;J.jYqzaiko-4LMg, 3ILF~xG Vu 6tڱ{|) j}? CM8BMd4"lA`fSO~0w{4ELr N pEMdc.@Ѯ~.f40fĴK{-oVjd\f2-mZxn VdJ(M{t*G_4- @iKɠ(gx 2PEkA(+Ȑ䓑v~+|-V!)oaAҍAFXARF?vGFиh|Nl4U4 #BZsn;Nܙ2f*T߽-3pŚB8hwLMa4d&~m U &&m*fj v֙m?H4QFE`NP*n_ hLQ9@-!Цh#vJ|kr0==Hг;#B Y ^>\]yڪv&^f7{,΄ޮ:#݋_+^6ca FMNY,׀rfn1)gD)g\45%㪜3'rGδX,J;3qV+3S{!(g(wXĜ!xX1挤4cs$ИsTҙZ,3l gfHgR-3)n qͻoizr̕&L-3ĭHdδ=I1%%LUH[3Cn/*3*~( Bo3<[ j&I5'3hLD:zM"t :.saB& @gʢSTTcOt&ժt&z :b :Ceu3lrcr45)Fv. I9[1E;}[5IU1*[XcJ-5@gڔ@3 Y9g 8ӥtl9Sτ1H3Y6o:gZeIH$g͏]P@fș^လ5<Ͼeڑs2l#9[J-5 gx9SI.B%jqU@ rZrFy ɦ!g 9Y@Κ"h(͐3f 3)3br&278C qiq_Қ.qht@Ζ(gS3A_ִNkO3f_lqos9/RpL_QЃ^ s]{FφZ2EhRGl,QH1{KWjgy}s+MP@#-\ Λ%_?_苂6z;gNPM;T+ߴO>$fuDCBk6XhMDihͨRPTvtp hMWgA=,%:S{a*t-UIôOKw|KK>H}rs:1#paEX*qςv_J&T$ysDs4KR/r8hJ}VäkbҦxg=ܩGP[g|A)&P_dp-ڳx9GPF?JebʁPCT݀BwebP4. "V{[4Qɱ"e o=%7XЩE2fM}i)uyʦ4V6\>̬gUEtv2Z]Z*vfƠOCocV@zP26Дbo8uVbY]ǙDęOJU.ޠ;dTShG!G;z)С ϒT e;昏X=4jw8(y= ߝEo#ܦ^|Ƽwk>Jfۍ{,Re͍ށrm>b ZԵg)Sl8Eӵ܁ iJ̩v# TYpyg:TCVM6_hHEܠiԴ4_J4  9hE% 9iNSM*4)_m5}ƃ0kRJOFS&=R w/GQ+Z7zfޱX!֐-H62&jg 5q2CKp-ZsUOdp0=k12V axияE焃@akEBO}s> vLhst:幽E`;S\P"kyӪ}Z#(E!_ WJ $O;S sCĆrSa g5qZ@y \>H"ϲPhGPm<RƬj'\ǍޞORZGUDsJ3ߖlB g'[8ox-U@m5DpHzi %.ɄStQ{[^k[6T7p<+IaJ|kBC&*6;f鳍~C{)"Yg)vBj\iĽlNN1)$Â,Y4!>k{)؉4?8`!'YOuDJm,dE޵%n! !{yD*'G.,DHתWqmghߒ5M> `M2brgE}b[ъbY[)Tb!_=b}:C̳|syP3u5\l Bx( ycL{٣u)y1h_s{P|WdK7HhˬU`a4қh%#͟8\H&ZT?S`g(6DL'֔swe2BqT'er0?VҴxd^D%I&崁ު$vqd%aٓN3<~ؤKD]_ڌH>L9I- &T*\fۤ ºW6tOFUNIJDN}(dI%&@BERvP:`{#\ i5ӌJdC -70*KNw[S*%i7e2ڤ~vF_ qlk Dsμ4rh3o=_JHg]@ O덥Y$K ܭ2yWPYL4ޙvXd-I)hiMۀ /up4#@K2bqw;-n0 լ?K|q'ĕX}:5X۠Q{_β4aف;I}*\ORl*S}mCI: mAjMe 6AM%t g0/!F8n+f,gQ 10uH72Fٻڤu3x2^䚨XmBG,⸰LR R \=j5<#ϕ4mhR=I:vĻQFt,ěTV>sq K0eP8Aԓ.j'mY.xCeU _6J]Y1BkLBDLj&0gmAtRF d*XLdV M֛6X(u⊧贴%oԜCaZ)=V?PTk뒰Q>>iQ+=>V]mB7${ގT8;̬K Л]?ʊ*bmt:܆8;ӞsMLUI}Խۃ KCvmSir-p0Plv3Nqmx7;.cHJ46=DOo+M90(9 wy+u(=[SVPƤIp#º(U̠Ie E)PNDΠYVCPE}#nTڟ!ڢAZz (o6NZM-O5PqX{A,5 Z7MEq'' 0LjThpQKb)(D9Gge/f=vi{dJTN/bTVL`fO5oԉj(֔Dq$ FD94^:G& ZȢt>{ʴjuޢq3aJbPa%-@ni_x"UFkyiԤq^ ,V"Aq j+챨2#bߚ#Ǝ_= VH#b#SiĒa@|a>:@ KjBaR$jKa[1)ߤJM% tn{_"Q#\ں m̷MLqVFb$oߴޙcssZbgUk u^ H߫>m-nͰx 4]!}Z)J b%iSxj?!pd5AX>z DKGYI%'ur!۰'Nئ')4M Z$""}7q{j08 pvPtqw \K!虤2LI[X6!}(;=@U)s)ɋzDzˍ)SN۝J R ;LעDBW2׺mjNh* A>GVdl (VRͿ,U8C)QLLԃnkN5HRlsz)tVU]NE:dzURAk]6laa8n8ڭ~/?J udn,a}V^9qz٥FBڼ(&U  4:C Ϊ_Iir?y o\iKe 4E|PE^dd-ITVh8Zvh0nYwb8*,6r: 7^Z%hN|"GU̩C AP)A59¨ˬvC=ׂ۱3IݨwZhHݙuodR$2`wRlW*I/2[L9a t ,NS$ HZJx,ZSIm.tߍ0ҙVG?{)bh9}6)Ii3jD HZjkéS{?,L]*D5IP 5nR gnVP;dÛSZ;d5\@ԢYJfKpXs7+Nة>l0ڜ ʎKYӃ+ 8\i&fsŬ'TaR :wu[ZLӊ Fٞ^ JGX9olY-`s;Q~\Nw77ϩ򈭓kLP%5m?YϞsjͳ|ũ5CKk(m nPY+}Qi({jdψrpJ1.Zyuy,#0t$5  /E.CJVÛg*@t"[C-NAr5[٧UU) Z*G})ф$qVM،C(BiIT,WԀ{S]){:McDg"#93lì(!z DT-lk$>T$r[+u ~|,TOs7#]:3 ɗȣ зòTOjCUgtwE/lT.FPL&-Z.T<}j lM֠9@ݸ|w6%Z-zE Ka.aŖgn&5@k;=ŢӞٶ#RhEU0sRg )!p 4/M*K*T01W4lVN_Z u>AfY;[{舮r=65kTg4 P/l4ԆG)~z2c,:v;4+ݨ׈![wґbm{[XYnwVl@WgPO2qq$BبĆ֓dҲ di#hŌn7dҷD}[,:&86Vc*G?4ctY!/StY9d7X7RRP%!/>%I OkyϓւEG=O,Q'LYe%(FZ2tK1\V̙q-j{>~buyNamᢹJImdվuUT05KۂtUT(aT} st%Q@sH3-|Se"6<-R5~qe"|0VxnX& 8д67yǥCdg/tUV@*γެ #ԅ0@P&B}HSq[YZ[k(vO'u:9Xܛl 7pt0J{OT|tۦBǁB?1A;ƀ){m &H]\E;.1?f(x~ I`l6!vYk >װRtGړt:GMȵmxpt>lOKQF`5vm=SF  J^?@]4h V&A1e0-|GwcS^20$\D>( ]&Q=*u <#/Kو'Ԝi,Y!E>T~K dZ/aux̢x&S\Q^oG@½z]GK@ XNws\ V$O`4GغC  l}ݚ&'Nkd_51\|ijǵQLԨNBD)KJxhkiA;8ZPI/l\z ${/TD \NRmi1=h;8OI- X? 0P3$vc %f?2Tsa'Fa;=2OZP.aEoY8f]\wR7JS?p9>)XP-w^/NbàLSm_THV`3y[\ʃ 5˕-aGݚcNg?xlfL74 C2Ta2lOc_ SfsriLjӨtR,qU'`ݜcafa@mmͨt 83/Gqڭ v3)fER&N*LTOO[Zp+⣤x8Nfзōv=Kƥ#Kfv5IbY\:ޭ @ I@F Bv;qbh"$DJݕ١pa! [kihK 2N5%!s~m j+c(C}(9V,u|No @+l 5 q+ NDŽok_M鏇RBhwzdꟴhVy,**b*OvmuP/*e:R=53s%(ʶ .@t!lJ]Ӹq{UNHO০/&//MEhuzXts1Ju.V 8RӾf^j6`ѸDPgI.Qեi3tV];_1{I;H*%-)z&~]R/n*9jL:T :FY"Μ3;rkflCoR٬NiZTsZmy'LTÓJ?(us.Lv[Nx ŋ`Yhf8TܧP;ToIOJ1cn:$O,L㢩uڛÜf"cÝ͝"%"~ 5)(l40ݎx &w`IPx*nF5 _g󇆝ae\:odsxsx7.[ӃTzU1v9|ff R=kZ);JEC$Įe͝k4=Xݎ -%".S~9m8v5J"5#M$zPKoӡagAMʳWK%˹[M~?.*#bR9ns ǜƖnf [HvO%nɥz&n.}۬16c݋p767Z.ڷviG3ŻmRVaT=|yXmDu TW9-P3NPXjnJ?Z\>v '!bkƼ#&r]jVpcImvxehdwZVσzYhsKt덼I-f}.C3z(tyD驔`*;Bgk3<Qɉ^P,[nNClHSO?ԞPUP_`)V}S5"LCw\\Qos}mկ(v=o3A lfՋ4;$xx?إ<3cKyF ,R㴿wɨ6׉RxEHn7x re#Đ5laE3\7uݡ0w\J[maT7c9,Ec\1:J<ݿ @c=tZ)Cn;!>Vw~}aj iµ Hԝ52sZ1)޾T;(x*dxn-os4p΍H6ONŨܱ!EZKř{{2 nqm!3K71#Ǝ0x(]+ iݬZ<:԰MeXS%YlZ0rݝoCgxwP Z/T=Ūbb[yP6ϊifx:NToVܳ@@ʄj*c,}6bV}]}ƙϟ{W=Gb= WK[*ԑ|vF}l(GzbYGkz*=e|^+nr@ei+>,]㬾6@B*"Wt\+,nEyQa)b-U=QZ#=k9NtQUz= *%gr~?_@6gDʭ_y ga o.,vʳxKՅŐdevmR*vf;Y= B#ECI <Y:NK/7,mXz-&Ln# Af>NR[[a'ME7U CP0T -4O.V wW+?' Ojeu3c O7P ώl<^T6xTW6h'7OlƓ We61bZӉ.xB~x\Cdf%%ؖlЦ&w"x O-eisںw5k_x IJl<)I\`vxxSl%:Oߺ(o6hҕgt[JEjlvFl5ba5-\Vx(侰Lh<3 ~o_hvo?A5v0g4/4^oaj x h<ԂƓd}oLV TB/hZx{O4JAPv4ƓF [x{x{?q1:Lv o Vx(cƓZxR*O 5Bw޷'h<qoOxR+OJE4^6":''sEihO!Oj{C)h.OgחxR*خh>h.3v$4[JF%ճx}By@Bih<}~ KJUBIh^h<!TAyP 3 WtOU4ѭxh*hIEGBB4JAG OjE*h<)o4>[EA.hHA4x'xf4'4}o4iĂӣRxKhogxx"G*h< Oo4fRP'oWPA o߮/4޾_h=שNhN ?HhJC,h /4'T4^'$d4xþeQEuh^h6:T4g4jAqfF/4^g˓xo)@u& ?OJE-%hN0M/4^WFAeh$4Rף8x|T47?P^h<[x ƛ#:N[j2O7O#Zx qx 41Ԃ[JF-xx'T4^Ff'P 3_h/4bE-%:xz(*_grF)TxKYhMRA+h<=o`'P 3_h<Ԃe47O񺲅7[ju~{h< +TBIh>"h<-_h>/4͂d?zxJYW4R2/S̵:yAI-P^h<Ԃ oB)uPxJmKh,4^ I,;Ͽx]WTDE{0h)}lLh<҂{1~:4&x oܕ@XEIh<)Bf4x^h<ӂS24x+)4̿x x(/4ގbF4gxZT4>E'cYE4Sx3++yߣ}wh: x]ӾxS4/tYcxR cx(Ow%bRͤ4xR/ө(f4>:OVE)kFiZE㡼x=,&h<>x]˫ Yx!g4^ 4wOhG+ EoiQx o8+p> 8>`x$4Yx恸/p#IX_6JN ?+Ob$_  SKZ+ww B&w~N{'s*0qm1 *NZ'jNޯʻ>OG`?v8ydڸŰCvZ>*îEdIa;vR_ao v6KNgV°k؍ǂ5~-]Ӣ;.(v'EmA$p N*?ʄI!2!vR+vzÄ5cQ?SfLJ`R8XP,7H$=!vRl#@آ0 kݚ'P bfةNAS"؝ŏd9'gɯà _wZfQ\]m@םG*:98uJ=ZSsT6!adHNP#X)df=fc.G~`81t\nix"YyӃTe7v=GΘ: NZ-vz?)]2CxttF+QDbxsօ*x:Mؗ(9N7̦[鴾!vdFKGEau\0ydG $CROCyfvBZ<ΗtRY;M(]STҵ=J'պZ˯ (]hQtiL:`ҡiPFb@ EcN({)P1 d J1o}ATdPۛceÊɚ$Jel CҬtb1GE^t\fi׋divΤS:-7N_v ^W'v0s{H:Ը>,L@P7ta: ACyO"VN>tSD%NEU"lZ2^c ˵kT(t:퉤9`oa@-%#:tx îj3]6<d?&n H75>Ag1t£ǰH<`KqVǥ+PmsDZuZG'I1|c308:x>fc,Ů+itIIz\mktR޶4Z=qtK8N]oD*8tzv֨`8g-5ptz!Ёs^]Sa$Qy|pjA렡eIthWhq:=0MI{LgB$D : mTNu6N.u?w=wk36י>gY=YBi]N_?M\;ӈd):mAn(9a9sN3u:rn 87Ω@z暦 -|#mF'y/j&p[^*9g\S8RIk[eM\k/FpI`;ysaM͡rvu6%YfޜCwgLYtƄ~PZ^rǞG?Sd)XN2 &1A7u!5U7Dn(6rIIdYu _Md9Tm'YN I2Z,'qoP-҅,'Z,J5j`o:n-%`9{3a䴙v)} ;I, Ota ;-%sj\vlΕSz3WN\9)K6)\96RW從ŕLY W\+h-%s:rz$T 0yqd'U.^L9W& C,ӘG/7OBÅ('{oPg+Q<"I!7rR>D4NRrK \ׂxPqSNN~&%R&wER'XrraPrLNv[;Cz6FtQXDn !DG)ĥDisWf *d/~B'8P(v(dǝ &:N̿p'[q4XH8|L*k9Dw5a27î8U۵q:` 08Ey|B%PC1YuIJ!-5q18Q$b2k> bBJf"8E06H8l|d΄Pq P?qre6Qpr%)q^R+B2'-%8:8ڙBL ē9G0%Ʊ2ڈ`bZMbgהƾh|sbv˝%.:IH^qB+q|e2yqXsN`\Zvm蝙*Nڤ&*˗@kSxTB2'*N Bף3 Pqv;;TEPAx;ˆ;)N aB# Av,<')k滐W0*/YzVd3(Hqj5HqTRzINRHD2ۊ#b8aqReOX'#tP4LX'Hۄڭu0~XSd&-7wZ8QZZ/y'-6Aӵn+8*L\\i$_Wpq.NQ1b .N*ӓkIaQpqR&.E{C9J#q!4FMZ\*g01iq"-N!1Ar?/ Ž/r[8f/= ^\"͗xq=l@š(Uxqp+g·|3cPvK鐝S Ӏ[ƵL`3)FOI~hơ`qRaq/ljAg^0xM^>--j:Q{T&a8U& TDVApQtʉژ a`4GLV'+&"NsџJal x8v/8zA۳W6y0hQ;iw2}Lp;:O,{T }ƠµȟO*_ NcJE&k G0{)hRۢ)Rp%^T8)D&AZ4~N(*NLɄ"L8B ʉ @O `5r1t  o '{0@0"n?ᨩŃoޯא,OZ` U{3(r>v=cѩ}\(o>^p/im7ꢦ!)NJ#5*~tg¢W=ft"zj s[\E=]IHoEjDگ_7mW ›Lݾ o*sPoJ^ؚ*o4o]՚nWX߭IY\5P{nʂX]HY/d!w}.39h7dmg*\7"TSqBuS MuSM31bHk''؁n@·a&M!*j=Nsp8H/]s-(AdoN$Rk7ci_0ncN,\7Bz2M7pS =xmG!]NiwvO a)knAoStb'U6gnO&ftInl/nrƶ+Jڦ ^p6 EBqW^*T%V06p1Ymf@uMR\-l~t C)m5&mtd)Ӹ;0m"$Z5vI-o xӛݣpgiIemς)z\ƫl6 &;Mv0Be08}e۽dbnBeYL鋠)}Bv+ RvAdvoc#+qlM#{űia@86f;DZ٪wT!cӊRƦs-06=ڶ: [k>[U,BZTX*ePMK3fT'Q&2M'戓F߲Un):BcCU.`l(& Ѧ[<6gֈSXW_06)K򔑖$6$ؚF R,cSn)k7&݂ѰE1ؔkzNe0,f'm%֨bka^=Yl(-'W%I$" 6  Ħ? JRٜMqVhb8ؤR]㕗ES!ߓĦ=֓؉iIl Mgڼ$&>D5JtĦ/>46PkZw&D &`]n!VN$6T,Ab{$[$kIbjIlb$6>A{n"ѿH*IlW e<8MނĦr33 ]Abk3Ilmw+bcܱUV[6"G cC>`lRzB+OTlO{TNW$3$6""tsB2rĆa$Y p$6`)ĦDIbSm$A%IlF>Eb#l1Hl9( 1 8LcAb3+O=Il(6x.g5C"ɍ"KAbQq;IlͰ2{%pT$63DJ\i+%$6=Ħ4%Ab~٦beJ:Y 6QM6eވmM7ll%Al?૖ 6bSA.+Rf*X$]MR"IK#ѧdN'JfHYӮ 6l݋F`k[9c8Xcؔe)l~M/DMİ(1lXndrNntL=j3MaVKaLlHwZ Ř `bi}RشԳuIPXU*+7 *@YO zj6 MuEd&}l71lZPF01lʽ-CP;+Mak 6[ nv%=lH ˇ`wvz~f:WLWl tMRS6O\Ӹ򯋾[)C T4?cN$5) ʊ }Mi9*įi@£_`iX 7;UF״@Te¥5 qi2kT"&B_C-k(,dW>_SNUƙ3}dWRL_M_,}M̢yA_åD_C"k(kRZ(5V_m=_AגkK < ~Mo&&S_KJ953O5/0_UZk(&_C50&_Tk!s#}A ~Me30-5X}6ۻj%d5kRZ|=Y_#fg)ƉIƄ9 _c5 <5[/~^D {M*`?u:Zrnfl .\TG-kVӥ)(ذ 50S K'-!ؒj`kTl:#iK{C6(9l+9lr/6Vj6xlIFJ!ըbI!PkokJ &v*}Mak|=Ry{D=ffiL}&zpCB^S:];W`$ưDgеFI\#p< Fmu6nnMNkQIGՎ"{)Xk.G~f{*iq$cnO5I,ڱYv֦k«Ul ]\p\R̚Xt4/ZXLN: ʌU^!4T UZ@TB.jwlQM 'sR2QmAT{htPTOMsŅ!b9կESS!X'm+yTB IM[RÛv{*Gv&FLnf!Cwh#Mb7XiIXƧ%>XKH)=v;IEuFKצH}yĄ-%ZOxJ'.:hT֡"##0igx(epi)a`NxrPiliull͕ؑiL"f4=yi*΀#Z+Sf9XiSȨ%BJ;ܛk C+s(iǽbI`՜iX4 i|+ 'Z|aug6ԜF,@ 谕>ڹʱh[L*ڵYff N]p|LMWl桱*R-%?K Z,f1qhfDۇdhDk  DL"El#&MAX =qqnmy3;^j(3  FR݁hHhL V$Z,H4l$g榓hR‘hRH7N$ZsLDby-Dp3pwMO Zz+R67R"ED~ IZђh*$wEFŏ%00ۉD3OqAI5Ga4hLl2#Ѥ{ִHѰn.ND [ )hQIDSQoVD4)N"Zt{* X 8RɵԤ&hjh{F4&qDk_V߶\D:~$-%іD4m b3 (|O@4Uֳ5yhKH8) M'"<"cih۳`hmxtдeih(n>(s9W*=;7/. R2 mAC71BCSIB%J@ih BV/5,EZXZ]R2 }_44A Z(f&ս!&ʼ@V,Фڰ04lC:WmKah<ӓC[bHY!Ccŵu_٣-!В!CZ4Ls?;yJMI M\ٌCsvqCC:ACbC'3olތ9m fꞭ^ 1Ǐ :#fΉ֮)> -h*`jVhbP@4-96ß9MF|h$k&L֯@NZRmCfx6/ vp`D8;8m7j)PjD`mx"faD4j=-) W:Eb*N$& LDaB@4֙Fs"R2mDk~z-f) maE3N#'M5h 2( EkN(ZPO&԰e$Luh@Y_f"|g2 Cc4=Qԙ: @c=~6Pg^>6sWWK//>_j?3_^/x/%_|R?>?+H[eMe袉?Oϔ8??|7EC>ò,>w^DeDReǶ+;a?eQy 09DLєyPϸz[YYc[V*s_Sq*x!|P8!yכ[_o6W_zۿ-Aa:96u,:+w}eӋwBo~Me7pލ0_־f,fI-O]K?Kίev~j5,Ɋ!~Rțv.͏%j"?/p)zK(ۯ͎[b`i=Гa"oFD7!'^d>r샿YH!v|*oGcK/vWb"LHEJc z؏YNtagp'и/6>XYqk_A鼀" ^bɃHо6^GY.G4~#)CW$C,G,Q~G>G*q8cI_/ݿS` W>pm"y>*Axk.!u%AH}D ~Y_db?UX~o;?헥ۨɊwQb/h#eY dJ$ҵG9/f n?tX(^m!d= Jb] qָ%~ZCg^|5 Vl29|1?q[Q bwg JO>ӵ;O|]kB͞V--cznӽBg`ߛD{ \͖78|Ӟ~gٗƀy]) \Vg} tm>[ˑG̨(e52-J2RH6g$FXMQO%2+QlU`&pD{dy9v٫fץ\/Cy؈>*t,(۔M$Zn*8I09D?]Q)L+'nwWZA;xwA꠳UX,N+NT^t޷ &bʠxw7ׁWZ!NI:WryPye;]_^td%1ŋEZ!$ې_=@&`>W}aU%yZRvLf׉=~-WO7 ta`U_5 >m@"ThGsO2 * ŵNopĭ\ !d(@,!HDG=Nh#陼\2L4=LIK!) .8VpME.IX];SY*Td4m}y,JG.N@J#w*[mG8o`낶udX]U`Rd &=_ ^6,ؓM- 18 76xDmpUiL)p^f쬯2*%O}iqtEuY*8kyy2Ftp"!㹂b|۽v!e/B r oY*:M&68 H NɛɊY!<ÀC,萠7MY4bv٪J) 3M(@+r(²KtBjy nkyѥ mGe+|3""v@Bl LVXenB I<{]W抵f<PglT^!"Y`A{vu[uM#QIxTO(6lc[׉R-_Adv-`l }5T[v5fߡ>d\vUMMe` uA=#AjtҶ* T]J=W+:dI6Y%I%豔iL , MxVhE1{u2~ů Y8V83qGWCjr?|aOmV.Mkn련|x(](v#HB3mV/b s:@N_U@U#N$6*3bwB[3.u ӫ:/}@Ȧ :eU"B _)r.JKcB]mUNXFۉיQMlT9R&p 0heƳ Lp;KPe@rr]s%u&ϰT}*Լ:cUbZF75NRT|o pCkx#]'b. H2[LSk\!if SCT[(O `W0p}!8:O oYiH~ʊםDt!ߓLcpm3 8< l5Q )2L:SѶ1f %ECuPTXHLr^6@2s23X*";eDwTt*2ΤAfkgd5v$BEŲXpiQFea֗i*MOkuNಏ]?T iʌSE%9V^mepO8QETl :l8rXzYh%wsKUDdJ(h Ge'ElMqj6޲V;H;X-`kEW;7\'E1N8V:j `+z.mۅ2%=_#'3p/] vH[oy0΁fe7!Nv,)_'qY% e%n'a\lxH 8G嬛H)fZe.\ۅ06kuT'^} eK]fLHJL+WpޑVdQ(_ۯXYXV%Gz)`"RO ݍR綦_ŤB7Mkx *3LL݌?NR\gzmgJ1u} i|e yF1)5l5)0h^:kȠmnuJY4 db1>'K֦Q<BwP>UkeA\ [y2bJ.!ffE}rSbCt:L{6?6M*%Ct2 ~ `nP)r>(<9s1=Ʈ%vh+m|I ;~U5 W.⍚393r3Rku6MVK,SY&߾w׫ȗd0+2# cNV KCE2WR2C鄔3QX((kݧځM&m|25JW3klσcZhM}UBut I\j 1$(@#*']?*`ϡ[ȫ,6qC|P܁{IND'IƦXeHL{l@V;Rnhjw ͼ N *NdNGb@5gv-#d,_z`#XXR;cLVZYTTDѺ~5((Y:#٠xyg0L-:0P$u|H޹ks[1 v^}7rovzK#:Y3Z^B)@hY)}jz(ЪNC/$IX c(oSRԽ#6QLU;P25VCS *v JCQu&*"R|I$V?(M1Z[3(\7!O( hE+ehEլ0*£[0)dtPrHLh!U})lsG6-]cDA pj(a{(zm_&5-&tXj(\lx$STJ3_"ӔXt$Z^r;t1#O5FʽLUȣnFm|rhːkW0l` cE6W?tٹ Uzn( |6.hjDdEB1VX%mzZ^9]8P"H`<ƨDb.TNlmȀ;,ݫ®Yad5ʛְ/{]vR/V9r53<$wz$[a;ސJl2eZ'݀w!f8zkuv.G dQɧ ILtA-#UH(/ZYԦz8 Rò?U--_Vz#sݢ=v0}i)@6ur4ھߝȨt2W;&mPvKHbiFUDhQ9؍^JQW7E! @ޥg(bUeKg ιF1=>_E瑀'SDiMg_UӍd oȣ 'D;k=GBD+I wK0_ *l!g`H1Fg_.հ%8 :(<;Z )]e HUv0[PziTuNAֵd-#d5k(/=6@ #fע;3 ; . Z侉Hzk4WJAyP2"_!68E#[WjT;TdK6GU h~pL UIAQj >\YARTW8Ep1Mn#|{L+L<tva2ƣ`'3چ| x$Iڠq6zXww8#וR"".mYLK['Fҭxvj)e$ 2j,&vPʛnLU`RtAe(NmxS%vthHwU1{$\:z##1wP:j.<&Ot\킄Tg@cV! 00Bo(j{JO=v?A5 gCG+AU f&{@Ծ\_Eʸ6fY~w*duAR|rIDFUK6M$̡JCRY9݀7ïܯXhP$]{@VBPbDc7qacKe^Ĭd]#_5ܗ̞<47{>ސ*oAEpE% gУYF.^G&~OSUЊ3 c9P9[y9;y:?mV)(ւ(zId5LYQvz5hP-V1H'j$A)`s;Q"5 w3*b{ĉhT,u^HIerwSڮB W7p]SDZʪ(KbTW.u7Q#TJ+0ɆZUۑ.F$, 4^.jQbrgAn=%6tHbV_ͪArޚnp$Dj"V5k몗O1qJ5@mxkAd4-ACiJpgzjxڴkҪǬeK Vo#bX+1Y DS;=kdN-BXjuŜ 4{kb#5:&Z t(A/5F ?1:!;;9((A}J_cܑ'Nբگ`c9grP6:_.&{>dHRT/~dgdb1*EUj(eS7-&TT9} jXJHJh|m0@$%t7ejF(/WerOTYj>CO,oPj}IltJ^ratOab sp MvMꉣ_\j`nC;P6_Fh{n#سE%$  %d`8O1{~=2L`!:=\EK%kITMͣg@# DD*;M} /˳= *sω* C %=k(AL+o ڳGbbkP8-BऱtK橳= 7wz#{"sVG6C=+A%iuvg77thsfώ,J*(yUN>18F~ 5ZE7=7:*{͡ SD8üQ\|WR2R[5TQVUܳ#κZ52/,zΘr5/X΍kIO+V024 K hF-]&N.3X`izjT ]T{$=دxX!-Yw=!Υ*ˆw9gݰQHf0,ߝ̆A/辤Mh۳|>J S09MIzov*/`Ou0J Yc[8";Ӕx:V4ўb(84(i TpzAj%^ \ j]PMJ54VJ,l1+ X'k{*{+{tkg* n_S"ށ*bkt{le8F&bk}wz`ԓLJY@Z}jȔ k4Dmji9΃wPM[?jRzz<¨ԟ/0 Y2WYl+U2燗zI.Q]v3ŌYU"/gC%dAkH?48U\F;̅Tr(5\*XmZ] y!0΍ތaQ4&;wd,=ϨTqY&f{NԹIFQ<|y)%".`X;[5( U}M eE0.(7S M.z헂wm =GN eIR UN:iZ:j:zWdOس^} 끃J*ފ؍;ǻ{<\?OU0~m} Ӓ~P]-!7č@4#Q,W^`jяȋ8dO7A$[qKQi%ƑNT(FdU874mRKq@5 uĐZvc&`RXGstYiUp)*tjf2#Z1T fpx;ŝDmWōԋ{j|Ϝ)y8E|jVA]ZX*v(=<؜Bws̕ڥ0㒣m" c.'đmҝs #$l]T%+P*zT-īL V UzmS?lJ\pwPU(x"x(F :tM/ Zpv#*tޕjO% DА`e(4?og~:EQ-cKh2@U iy챮]):%u#C mP=URZj4HBzU wE\nk[{Z' -;Qٳ Y1ЁbƨZ{׵ j{GkG#v[An%OGK7D,aC|kpd*5ә-` Br#ǃhD?{lj7Du7qZmNJűX~%HEfU5!!@׹Dރ}"ڮ7m*?%C{}T7 ŠѶζD/P?= ɱFʖztp Z+5u;?Eˬ qI6:¥sA|^r1^J<%')eZh64Ug\:pu9 KkiWj fL+.KӞߕF"`6vlh5`~J'B(nU -5Cۊ_uMJ2pEVzd|CNIkqA*K_[OvPmNuS=I[eG\z@ F t#J$&u0 8ڻFYIu~-R*^t01_'{A`@#/:kFb7kx=ځX~/QAA TEVmIyjH"ד2 K{ endstream endobj 23 0 obj <>stream ìTXL *ZTQG,O0atg;zTex}~( D[u˫=q/i[-+.Kը*{⻙ApV)F9YB;%ȸ#:JA٥]h! GDՒpVo5t}6Hܚ׏'mVEdqz""xֱLY&$ԫbwV!XT{ 6B O#1k(Yi7l@ym3btaI5 dy0˰k)=К,O_ 9 *([ #*!^jN vR,I/v%CM!RXV[,^w" nĢ4s=&+3_ Hb! 3rκÙgj@gȸDK;QBT(ոQ=W_X7N{j:OI[l/kM$zLI򂫧LK=п/=փ\SpUg+a,T;_&iX`T@&RdHw;zmE]7/T[E@MD5İt:{F~U&a(|)"OQK}OCdL^Wr@D8p0==EP=yh')J|tPԞ ^;N `F tȺZ e VsF/LiAĆzjLzV>9dnrg D4#77bL Z?Εse7dʰS7C51d*njF31YX%( 05/jp9 V "geV#g`<2OLtؔ1)vB3`yDy3 Leo MRشjL7߄B=:"mQy{yXf0 ?b ?.Z7G?.7rۛOM7?Gl˫w7[7_]oXc~orsy_~o[m o ) mT}q/I?>7]._,m})Ώˏ;n>:nߋoܼhSzI5W?hWo\]ܜ_l=<ܦysǿ'&no^_{Nws3WxsxXkj˫-pG_!ܦxjs>7@}3d{fS}uqwv{ 4]<@82>j}sw~񻻳W_o-V-1e6oxފN pB*AywYgp{Y)ӓS7t:A<9[ht/^\}ً3=]pl ,?U/.^aB[H}q^y{x7__|wQ^lNL^*$ PAmu,LxXZ? 7yg۬j kmnϣ]M]ktC^)TOZv\[,?(˛6Vyĥ0წ&}ؒ8蓪KN1ykE/o DXx!vOdsj gw__o'5u8G7!΁nv}$Kɗw]`'O$=#q<82=Ew؉QG[ЮK7^!eSP6؜? ';{qf揾Wg;xI~Q}/dߴ/o^}{u|kwԖs/@8M{r{MӶav|"y͍ksͮ-onv5>m݆žq}CC?|Wh}_mlE?|EnKyCz>o_]_\_yjxYjco^Jha.kb]qO | ΓqH)j܀|"vc}׉nǯXecd*6EWOp77U?y]^|Oqsqq|iϿh!޼':=.VE$07ó)|Yv#!p榙C!+=ӧ?<ρmD/m};з}+ۻ8oϊ]L@ԍAx;Pu;PFno xfDn^y hKɗh.^?]OWg?~].FEG)~E@G_mͪ\>Tdj\޼xyyWg_lQ&cdja͝ׯPugӕS͝ ¾ܱWs9T9THH:,?m?~ٳ8DmٺͮRng <Wa' <:rpM V$|M .S]хnx3:44<{4^ ah& 鐅E;e>||9)yy#~_\|f7Mv0lisz+HOoohsM}KMyu(2=1s!G;Mw%oILpw0mεwxy`{!..n>mŧ]~w۫O.^|z{wv`{D//[F_<>,/_ox=qLY$ey ı3_`O_8oR6O lU?`ÇO ?`);y0mե;}Wvݾ|7Vzߨi(+ r88̯6._lw%7_d揾A6n|>ˌO!2n_#< 9?@C7*p0D揃cP϶Ymn/77u]hCjx|>l7lhvl'|qo^_{sqs 4xsu|y |Pi0>=_Pi_ڂ{C-xSU_:͕6_^oΙTSY,I~s훫Fx7w['i3{M%. mQ1y m~L曟nǡmC07ˁq X~r\0t:6Wn5xqMZƲA ܙuk $Oxi5n?xPjA 50>;5p_/;ۜxlJz[mxϳ|bcPac4qAe r[ȡ^Ǹ+z!KͶz|׉˫7;?>]0Wos|vgW5Փ<}NyځJ]7oGbĎ=~pBwmg[ +HOoo^ߟ=Xo~K- 4\~r٣/ro^_l#0twMeq=Vv($_opO&j}qIiSgӇ06( ܭEOr*W7Ãt~?ã;,$ds _/NVU6|2>v>k]m\a]gO6߃k\w\/ݠ/7H8Kqоe8dk/&v_qxv>>s^J,^^.XQvϾ{hΨ{ssgl'ya tݞ/}ā*n^i9\]7|t7׎Q4gWW;p4%0Cg޼OY7j]Pc~GxE}?^{{u.mGfY~8zs4~Xŗx_;wR OLu~q}J %4Pnl#sb.I9T~H6XJXJӿO.Fbxm8yi=v\$R=q8nBXZ%8bknIʥAI6%6@9Lɥ.Nۀb}}kO &hĞh ߵM)/p|49=z9=9儣0'!`mpmaI|Oruף6kxۼ]Xto kNl jamI@ > փ1aM^ckט6qNÆK1lXQmÎ5ق6XM:SU D-g=,bHTM.ޅ(5׀X)h&Ծ #Minc_ZaM} Kȹ}SXVDr&KXD(5np%o?8Ed6n]C0FWq I$BͶh"._.{oP*DOcv`{NJ ֟g+/85'\r1/PGjA\q4[[Ml'cnwlXƘx|kVr3@5Ǹ2 ]n&mkimlDۈ Hhoe`!m)7 TDv I kgݔFAƝly7A6d%n ۆ$b`1:b&MLccMՖ!rЭdn/W$0+7&yz <]>g<+M:?ZJݗd=c`8Ԙi44o_R %MJ̳mnIwL0WILw_7K8F&$ ̰Qdx1A1,E5*A rW7O&!%јA Xyo5X>ǔ d:A!ZJ :R~nϖq@`ɖiS]Áb+~wvEt#aK۵+ʄ}j.:RIج5}Zkʹ9Pr9M{ru\@3H Q3%\  A,[qdc'*:Ad5eVid&a>1IyvИ5OQIG֮l6tA^[6ui;9N( DR`,ZGgK"(bn4och҉-V0e)\NdeSF$C&Aiz-Y  )ݶ,2MF8MMcKXjDb>@,Ж7dj"kD<ɯ.1_y .@& &<hDW/4,fL'bM(LidLV |uhQS@q7І Iv0xIoB+D+]E?%esFRYm6!jj6T LIMF %oW!AԐ ФxBSD Tpkm֔uaf i" H$cXޓr`o@Փ1وkm\TMښ _q ̮lA%O0u( FhֱSB%H[[KD'4R.4M~}q'#: LW"FԶxg2mWO LW^6)`jxm&DHd7މ[ 12:,jD O 4#[ $VS\0*7M~XhFb1àЩH\b|n{WR&V729B6k`vLXĘtɧk 湶nlF QS6,ѩL~$ X9#&hܺT1MM7h6e{eaɢ֧mW"rR!Z5FH#hNXiJXB& (b@2G O :0+^;]; ZoA> 6&vVҶf 'D71æP;Y 9ybe#E$ C ZIr'] S.#A{hC3KhU!evv%fMqfu-v\{nCf4ـ&MD'Mbtjb-K#F_N c#D"mxMhRV]Myk̨Sԑ ְwߒY,vY# K"qOf(JI-q7 ;? i\ αp.5#$w@ p̀uN]fG3%0wT1"=Dsfu&G5B o YǸ,w[HWRSam8<ߓlbkmD,@Ub-hm[38|ΏvsicCt`| !2O o&~jقH+lk&TYL$mH8[,vO[&̏v. L"ʓ>$ xK6&MN4a quoΐdRSdղar 0˪jp )ZDava{=qL&3 =Ge'aIImdQa 2`N6ƭ?u^e;y yAvT |`Bq$LU#+rͼM=31yȖP뜔_F.|62 f+oIlN2S:F($hr-O:ԅc;=".ؑ=ZH}:'AډHHL'׷G뜴s?ez̎Fc\^i48$?S Bj X0($t,aG1B'fNh< #ALy5sВsƝzˉ-\­ ({Cc̕)؍mU1Zy&k >yzeK,ݠ9ɓVFvP]4t@ءPd'B·Fi#I505Q=A^7@ޑ_8 L>{v]]i{i5ܤ*b`vMN̷o8Aiۣ5qX˟P%4-"\2AD!ꞕf&N0K1.6KMjg͑r KCs;{StT7 lę1;Z7$Mx"IPM!49jC7{"16;5 Eaݞ`ķ-mU`iypn$byLkifhzks.'"Ķi0Y$>i$he4D:H(i-NO!-(x1,%1'nf0b)\hre@!I1=(@rNx)~|$i]T,`hh3"bMWd} (/q0m1di$KH{|LvLU(J zpQT1.AI8N[6Lɫ`X)3S1i'KSH*ƛqljD,dmr5l+YH5.EP8]2b X=yNϜ%Y7HeuEl5ݚwy.'Ȫ*0 -S=ZpRr-4P2z!SIΤDXUrJ OعDR4‡ M /TV6MV"}~(4l u݉ 9J >BA^h/ϑfŔ6'# $l>pMȉjl(Å!9ݩAYVXds;Dqp P- HFEClo4U#nhl&+unxY4|fklIe!* ߄L8q[%+4t5&8jguBD$Q*le85D4yvVff??ZL NCR,*(xUᐉ2ꐾT)/PAHN'=Z$;t9; vvQlR)2"z`^QJؠ; >ּ䈄6FUN.qmN3C q:$T8x~.q8J0ۼ0^#] dG4E:ִ&fc3 ™ꜷ[,aazPaHd M U)@& 1(@XR&Q&`=(H5,Hd kL}7GvxFF23dBBl؂ƕXYi֜Wh4!宔ythMwOW׹`W}Cd:z&(1b r" C3F3oHs:9 ~j珦AO5Y:S)%!"FS 4JƎjˤPF_3P$|sjO&ob"XشVm,t8ObaW<т,sÂ։֨Yrj,hj:Zk6fH K S4`Ug&VO =VdnFT+tV3I6ϏT^ITXIF&+Kg&0Oc+.FHXY32pZ&I<ȕ$YD "jS!~$X:as2Xl$ *ήq_t5&e"b%[|%V8^2g%1v O<-g /GTQZ|K&6^j(tPTEiј(GabAˮBJ86lBHl!QC?jtC\!@$j'%3@y>~&+J*2$ƊiLCgDd8uKI^(ʩI} ![oyI en)g>)l&!:ᡣɚh~ !xc1r)؈#v94_._\bAIчUfLOSL{Tʲ~* 5@+m=/gc15*t"QA{pj4$(&CcH}׎0h3P$A l e1c.a+z>QkǦ99iF( Ku&vEf3x 6?f:rͨKx! Lc;vN\Ģs,w`ibuNXWf)I-MF,.V(='RAHl?yчJ_GiTJ W 5-@HʷZY1%;W>Vr>"M&6rZTZ h#3qT*(UyDgF^·9Xag@c%F6n2~ 1G|ixLE Y5rMˡ1YMZvV!k]R@([rf%ۂ[#4w i䄴JhX<džZѥ@+lˡNrPF-nao_E*_~o>_)o>mm\{M_]9xw+6wfz0p~5ir_VjoTQ O>A/ LZUN;?Q'ui }nϿm_nPD⻻7~MSGKϿ;,(E^pR XZziӈR >?}r5O*;O JqN=I"T'[) R͚gh0rTC@!<-0g0Ю0?vNJw8q _hJ+xwĦ)1dEq]р?BJJZ ~]xGh>4bC|پ תxYVy9=&O^e$:P{q8y8Mx6JN\˚+5G9>=^Fcz{ed5NDWvA{,Aq )(g)F^W61|<L_ V9wf&K7v7lHa":#pTՈ|@ST.(yM5MVA5Xp^Ov~34gߟŗg󋗷wrq?ֶlv;'PP5QGm 7eDRsՒ4@WC))ڥz6MBCk{Oא,D7Iߋ˨N$t[[(#!TjEb^C6E‚):^R񾰋^AV4^ "Ga2H}*A[~pz.mi}{KCU|g!IC*G\*RdwGMPDQH5jUm4z§R<9DFq HC9ZC@>XBB~W) y 22?T/AR3W/LJcj#5ʙDV7|-\bxD7DJ)QRya}Dr m\בhx FQ^szY Rү+)yJm[v7`|-> W .f|ij.3Jwye*H,%'y6~C^>D,kn,qxe>3?E၊B zMCu8$Í#^zlG>p+XDA. x*5Q MU3|8NոLBHKB(nRymS#Z\x1I 8i1ri)(CT3e!s90\'"H+FL@E sr$'N 4cuJKԮ7ROqM2gL镙8W7Hd.0 d e1`n /2WO 3q!̨Z`J[|C}8:XdL!t<,9QQB>Axr ^Oz+YPJ_.RFr,ĢY&x""&1i/z$w@mea~E<3ǢʾLjHlWCoHʐj)cB+0Q=Ki:oIoCV7ߛΖC !bz#1oHx%dA h eD,*9Z6N@,Z)*4?Ir=,tH\.` X*)pfhҬD Y1@\@1q&>X$$RBaIeFHϖe_^5TIKƒӶ2p dfeb6zV\l0EJd CqfEuPr@VF3#l aceF{S@ȇ$l TJCqz cQGK"L̾'8PC?4S}! s(T6rYĘ&{ Qȅs8.H+Y!ѝ*Hy:Xj\ }W![9-NbEʲG~< 6_ZP0VU2dE bB, T+_4 lUӲRo}PoXHb{鬰szL T5*?ʙ Hm`|v59 XJ9M>bC};L\F:I l"G\A2Jb‘G  |, mV,arYu/ 4;BK%aof)*-00 :VA2K,SR7XWE=to2UD\qSi=e@NG{@t &Jӗ $cTO](QR|Js ̨\NFX\tO `F ^_a*?acՐ&rΨ.rCy 1_z2.ڄP`8ÏPjIVN c+#hi ؄V0p~4 ¿YU-HSU]›O[MBsaQMO^Y( mP% $EYr POE`! JB.!Q1 -, mLaT@xq"}rUpN R DmH|(c? @N 0iʔ*{Ihe>  ؘ@ K|@ҷ9gqC1g$AY4y>8 4%ҒaPYz\v r#RИiTbFps8-,cI}r5F\ 9yd}d( KC;(3 GgmYh)4tq* êȏj@SEuS8i +֎E,3sC^<8+5=ѥJtQFn3z摫* ( Ag^BP "Axkh:dعdVko68+v*-B#0ƅC w&=B;JPHp vRgY{Drf| 2S`ļ4HVbLX'Y65;42LF .ӋA aUz 3g>HQeDAh!(>@ـHm%E1X˅9LD4D'tJWie1 1៞0aaiשlѐD9$Č\ĘK1 ӄ b]YV=i;5(*t֢'sQ%2LˤAmgP- }2CTD$3Zww倘s/&37]`pVAMXd<uCa[ $r& )B$T V+(:8>r8` $Φ@TC!jt DOώ S,nX@C=18fvu}{jMo ٕhwX{L93g9#&uyA[ ( 0kd¶4ji05AvbOdVSE9w Ԟ W9@K1bȯFrOY9(Z {y4#7JKZ4bTP\ҶrAή$@{dYٙqN(g.FapQ`PjeqVTG?:XMA0=d&3YvTWeXƷ:9O0}Wʥ&BA+ Rzcغ v3Q+2 Ig&g =yʅOpܺ;8 ja.:OOLлe%>1 7c*'DL qI P`'&ND& ]O ͣ}MGǙvtH0 mUYdt^'fg|bTӅV3OL(=Q(FF:͞_S~*)7ݎJ q:񉁻ԏ:s'fAQs`'Iz~@C$f|]fEi {vQ]&Y^@'&4o ! 28߀PTJD'& nh@2H zʃۤ}]K@(ӎSͪ޸'&QG'ꩠ-1>1d}bDA >1'~"5l!^b >1MꛈO > J@LS".Id St9BR;SkVzOLxd2>1,0>1p OLj /pl'L ZƖڮ rhN;Edzg'&9_1+ c8)M"Hzv r<;6;v<; m@(#N G\R+gCNЏ>hbuDc. ñx@s", 1 #MkTTw2qGfahi1)f?FҟkfPAF7&G|GɥmlCI1BFwƷuM5о_^*fbnQʷC >s/M%QU83w [Id=İuh37 {c>U!)G Pwtwǧz? ȬG.֧a6>M@F3t=i кa'gFIfGqlU"fHaP:aEh5r ' X>ƿPgP,Q>l/TnкAV zE~,b;>}>n̅03 ׿F[Q0Cwoj3$wUapZ Py,Ϲ@4Cren|wް@kcY%JWb@X9 WJqk{TDv?ƼIQF Aѡ8#`CrP;qi&(*F+`|J)lN))XH*"`JYk1heղ6G͟w7٘6~ȎF&CGv2@BZ_] myt; P[ > SF*-_!uް0u1|t|¤'0kO-^[ )"ӫ!:=BrUSHfP-UWB H tȒQV.5!˨(!y4#ƨ7#; ]@k)YF5A31@Ǒ A88ǝv Nx,"Tedx۞""e5 #`YW0C)Y DȎ73?deGx#)t;-IAFaBx?皙v7NQtBwv̬A[82 Vc_7#M/`^ zvXUQЦ盘EHG<Ȏ."4'STEaP?ʠ2L)GL] xYVAE:WMbnqr[1q/r6ha`eGn@GjCBP,2L(N*c)Jfh=OSDYƒ,Zwȼ9yk4fmOX j&[a|^=(WHrحR)^m˫~g8' Nb~2bijـXQJs}_':pps35J,!%9F 4~7,v2kP˱0aV$vVO a;t!c9THc[=yy:1:.DGn&` ]& Dc5E`$(J?}<#V Ȃd#K~J%e5# 3J̺:+XcMwvkF(1Us3PZkT2@f^9{l^OfǑ9Y?dU) ,BsLby)L6NR\ FMF&W^j~5&֋ӻKj "25$Kq)1o!`y+‹Gcvp]qz;&gΜX3Ԃy)g\ YKҬZPP1%RC@4Wf"=0qk;W~%OOᇅpL =.\f]|&܅˞p.{]|&%3˄peO =.\>eO =.űpk`&܅l τpeO js w'܅˞p. wIC'-] w'܅g] w'܅g] w'܅g]R(܅˞p. w'܅˞p.z] w'܅g] w'ŀ{vڙp.z]܄pEO τpEO τpEOYL; w!rzz] w'܅g] w'܅ES =. S τpEO τpp?jGnQ.z]Rk5.\p3.\p3.\p3.\p wp.{] wpO<T UN)*`n.zwT;Ϩ$HU߹xF}`F}GLR 0>&=5L٨Pl[V}OmQߝ1{I}7n 'SJ}CF3;ޔnlX)XF}G3YV}`F}kVԣ4Vrw*gvW} M8HڴQߝ=6{,Qߝ59{ )dG}ϴ$)0 03MdYqzI-OJQq;EZ}7zJJ}O]CV})1kHӣQq"˪%jS.G}wv-™]V}wN'W}ϠiF{w{qJ"*R ĘPIP>CAlY%9I<$*Ct?9!ra j@BNh," ԤVȍ}zEI iR({3.<'}ݝॖ!;yl\q jhF,Z56TQŰ$vT0BlMJZ%1jRgaO dB$4T;J|K<))୙ŷz,X̊뵒 Dƙ[KpQcF3_M' Mv5xLj!UvNk ށ >ϏLr([ >:fx$V5mxʭOdDd5xjۨ؋yVO0}`0GpKp@2q@C(iV3dt>FT368L_1P ;@Cof꩹ZDƭ/ ȨRGbY(i ZS̐U߮2껤z8;]!_3yfPd|ߪS I5=(D}TWPPu"4섅зܨr@$4: T#"X 0̪R۸owirV}ϲՔ.t 㩈C]\OEzq DhcIE-1JR=7XLOy(_= CF ]Y:%ten2yw ȉM6<&n ,afBqaTCFd6 g! 1$ↄ:@17 lT}bUD\mLd%ϣ f>qZtӉJ*ГkvDbwt 'zLTO ,ȍ8L6T7ƝC Qg<q M"+Ual/~S*"'D&FҢcSqhAna:Yp") yU*ӷ dsSFq,˄ϥtI!catm@8^NarC,2Y$A/"a*LMsőVmؠX;| FF0!\=y ~>UZ"`гԔBSlR1ӂk\r$o"ӂ"Ha!kEr8-loŽx ν:1jRFRF%gxMI봠fΔ},^Zrehe ["y?$&DV)y3,}IqԩK]yQwL#p Hw L>]3*Y3A10[KRb`N@9F&K ea]6+ΦDk2XR@3":ן]ѽWj99h ̑{b`&WX,06º>3ݩrwiAZ RCuĨe3xXH1;; ҫ*RԞ$ g&-DdzJuYƳ'kא?eJaH^(qp6; ; Fh$61 v=qzޒ'ažW"Sed-S x%+KLκ+BCr(t1!PTj%!?Sĝ.Wu}Y qcna|vl< #Pt'0r k# XZv'(@zk=-1# ={…#UvNA`4(hkP'Jl-Fj" _6g{F>­5'r;}gy؇@ِ,VULR?LR jCΠ1!S#̎g4SE=a'Lu]5180E6I7Ÿ(d=QsNB=yδMq?gwfKP䜑1*QVg:P[!CשI/!NM$;G!׉?'Oz8WПr㔿oCUo"/hΒ==VFDړ}KEitJ#Z C3% RRggXd$sP(AΆO/Ρ!+vK{nCu;i,s% _9[-M_|}A"xfNύQWbsي88do.q0w ۤVn)4UTMMBo(]'5ؙE;iԡb?S#vICw ?RUwz΄3ᮦpGca{Q:)\"~i3ڋ)dOBdG3[B^ɠU/3u<-:KzQ.yo'f|oI$ֳ$ԪX ]M/˵2_jQ /7]l6 &kUM=Y_iՇcI՚!f_x޳ JP3&Ӗ:sDtwK QXR2*O8nTkROg8Z%PXC )(N jJ!>sc؊GXH@3BOǣ_fx\f{w`Gf0FVP`YHRԥ]LXգy`v^ 8O",̨,R_,X+WRpuRQ2ED9xˈλ0FmtcB5MqvQ/ /+8JL#UcLbxjsbJGf1nrSI'GƂpT,j 4̲R0ZoJ .!ZR0xzPyl "צ"͔"kboX7T,r(.ޡE,*nDgP ˙Gju)4Qpڏ+w &M cSq{ dІцP Nҳ)Q%DL}TK8e#|/tD,Qw#BZcD ui vx X.?:,t .P)|8'  EF:mFJ]0KրHp@0?$ 1U? Gq y~qT7=1& IH ^WXDxXHVBv3ˉQԮ(ZJJOpv>M<$z* A1 Q 1jy bu7cJmOj`%2&QWwE ALVUz!7sIH=],FP hMْ=J,1=~jC- u$eoה=lKe<_9|dxVq$Q犋@2at`TX !=֊Bᣐ2Z"T&&!)މ x BL HI&[H՛-~)Lj3‹4`^ U܆"[ "A<ݘF@DڏP@M"!Rh X?t2E p|*zTSPL2G<)D! 8 &'I.^0(/hQ/|H /.t!$eN @RV{n=s` Oӭ 1kH) @40B8#O_hu6mV pa Aj W# 9#iz\}} $B.)ۘDe'i.@)WvD@mH_v|Ï9%DX@],`T7KK<45W% qh>"d |{*isC/=h|Z8#@0kM@%ڠE(So~+CMjX C_"iRgdJDA Ҹ|a/@UC %in˄4 ̎ޮކu)L@:Scbl "ΰlQV$PÀ!̌ûE~jx8'(f۠ IbJyB>Ō C|rM=C :ŪԌKu#"q_yPO-@rE! qrH~1Ģ6؆RAD.d7" l `,$Ո ?RGR T /w(9B1Ԏ*L !w!ƅ3H|wDXfab`E#]k Fx} a >̏A *N@tV'*CɈo]R?( ڇoՕ5@hN .S7*jǃ$VZd&+bsC 1"BO9BʽAQ5s,1@ xPg0z=ʙ~eibB!b:NzD!"S @cbCUs0j`TOnU|Ib0P\b DAcTc]Ώ)0cNQIm4@Ȟa/@dyً`3Q n#U^d3ujj,Ҩ#,tfH&ȅw9٭@eO;94L|(e-*̀ ɼt7Pq/sGzF),BcIyn#!lA)FcccK|3xy lcek@#QHS~5t@m?s'F:ي@Z0*+ peulڜ@YE99F NBg (8 .e̷ߡ0Ā #6[~ST?_.]1I<9X?||g%bk B"Jh"e:@bLr F:'-da&G#V{i&)dcEZ2ԉ|mRnjXlta܄US6s Eʔ I:_oQ,(i*Hx$$Ya2 RYHEu%CIx z9ఙhP*I #4} mP!)!tp~j z%P^/}o eYEEw1 D b4d٣j8߅JF)怺`Gx@"ӱ`%Bp:S.C'D'\W|l:w wʅ޹a ,✦ؽ^cJk(yjS4v+*ft TL"wb o@z2H] T0޸PrPvht)0jD5Ҕ(c^tcP B+4V1Fq#DPN#iGo|}QPZRdL`!0H [ uqg# W"&14 StF:gОJX@.Rx8^u%H †RtQ^Qp(12 ( }:5%j$ *tL&O!>"G :~f?0 슐 AvP2'ƔS e  u)@g*KX>JJ aԲA@ Y?Rc `n5c#;H!AZG#@g: *% c/@;z85jq^ 28'srs0!%F $oH fBW]r-B2 -1!ն,}`H9`7@\D2|P0LxXȪ $ {+ l}A>xmA.\m%C$ I/1PaMɤ*h NҗOS#󥶇s.n N1P<ᥭ1P&a[_VjuW."WS.dps`i8q |ʈ Dp!G[p0phD(v]Ǖ b&T3,p QC=D Df@H0z0FGC߽B#C"J;Y1m!`nLBiR3ӪeL^PZjgRЂ:*cz,50I&hpLoxfZu#pt,xjrZHڂ\а:Ipe ڊCFe[PCFb,eDB)3qi&!BRz!*U+C rOt8R:gF*!ai2GIB#^{3Px0AaXP>:J>J4{Qjˊδ!HRcdX!-sJ+ʥ-2U9\X;1GfN,"{"fPhÏj % .@O<y+eOQBTɥeIcX ab \$TT<<9S9-P~Ҷ{uܔ@(JYQ, $kL f6όa5*^ цp gtJi8W*@@T)D(Q01F"0VxDq391+vOP%q0%PNuq+wPn`̌bv~!z*؇37Nmi D, mWkJlPQ sޱHEZK̷qua0^,B̂Ca(řL=vX?sP惒 ZDP0~',httE}೐vc@?jfP jSgsLvq.r[G{1iPk2(N1ɦԟUǹHޒ2^W.(3 1mdG4L#u4G>ڦ @$"= H*BF Iu @I2vIebmJhJ@42,2+PT E AA+9Z|,h8b"^bU.z@%A$Xݠ̭#)7'Dԫ*E3EX7)>P-Ѽ/3O.MPsم!sx2KzX< Y1*t!TGk`HB(A3]) {} B;0CUS3 bq]XĂ ",ڧvo9׮_XEp#4l94KV>pY=+iSm09&Hh½_f,eAx =R<[<*\6aW,x" TP`vGi93E=Jp2xʡJȤ;x.bKhz̜vja}!dEZh$ZoC_"IWh-XEr%݅(>h>Q_$B!0SN$"NҰxq!B-['!LfqHK;= f7d{PEI- XphHoݏzLHipҍ>ڥƭk[d'*o4ZJ熴>4I7{~K(mܶYiMst]muCI$zlB9mJBA)qÕ{-xx@8"8or~#ۯe(wL>N9LCSbRؐPHMxg`"^K$\L(]3¸DŜ+oZ+C_<@#%z,Cm=I, eG}A "dKU9^+p_ƜT2D 'O$t/`zZe'.5s,:!3AoIQܩ#wz޷ni%ku~Pm=;VL_;Um鳝] =SjS n.CN]^ihX+kpsKݙu2/F"Bz&oi47lL]Vɾ3wB̿*v kSqX͛Zj[ڻj cKWu }IN1Ÿ >j|8Ԇ7^0i/ ;o6*%P%M\*tO_r=ZYWK iRTӽۻr+o&h}߶Q;nVQ/Y Ai4B@.btz3Do^ZPlRjR=`RzCu&6fZI k޲ܬ-e&O| tx lfzq%a$ΫW& bG)aL;zB=͆}c/3>M\oyRʛ;'{3oںˣC=:5SA$K\͛E/=RWoز2 [#ޖ5 -+o~K%3r>zj:Atis ^'jvpkZ떯 QxCR},LRѻzJSG߅0W--'1/mW 6Rvv75hdUK' 8mUm~M0~y}r^eDmʍk(tD>uJR۽2CAikTZuLFo-6'*\| YtL y M*M5hSn7[hPMo4k;)/5(^ڝW1YsyC㮳ou8LbGJOO 4֙s-Ts-\ m,qLuԩ.7hI{V^4:kQ{[_mC!'Qʾiru(VeVo:]=+c';ך)=RjTo5o}ss_R#E_a?z.֌dpic#US|>oxv4Ԟ+ l|n\[9#t:?/H>?7핽?Q|abxq[W? }P֊ 5].\|S?+_,Z5>T_boFwil~=Z),NǡQî~܅Wji'* Sÿ.U_cujQ"n㯸X,Wn.>#b~?vVW\囑' 7͟X /~񾜰?n `vM}WS s}Coۯs+ͳy0S\VtP)uO,2uynuc/'Km}9X^ L?ln'PPcsfprTtr>\tZ\ٽ޺gvFg}oڛ|Z8pN~8Q*~.ps/l!aS\<|MW"kOM,,\/FS囩s3=R:?T}>|*ζ]g>L<8Z;z 6#t>OS|L~`ry7?'Cs{RȌ}_[9lǷf I~|>_O<ռ?OA^]ŽWz~8- O^m~&ř火p{0u!>:o[SOU~X~8^7vD;;Ο<Ϛ+OWswj0~r$''Yk0S)%0g>~7 kӯ$_oZŝpq{3)lo_lG#3һǯKw[b޿}׿WQGOsX:__?of7xXu8кoGjq0jקS?Fr؟Kw_fo? ,n zۧsǁ?P/|ohqt7^{382t;8qv7n`|~up~\Zf#ĩ< fϧOK3ovt[ݵP~iohhlw{hi|CAwqbPѻ9Zp7576t>wφ._*`P8Cpa5,}yx874l =4'?}X.y51|[˧᧩ӑTulD\Ff?̞bdc2>~6| >Nub0y`O^Ly51=Ż؝\O'J0?&G|ucwTJg6W L~'_өT838tj~Ӝ:ԗӝ'0QS녅u2zZ8~7X(mꛍtnzz: 饧齙?xrZ!y퍎.,zvԻKeC}CMñ;Qvq3-5Yc}}-r>72+utָXBu{`[>l//~X/~6{^ߐ.Mw8/q#:`GNͧ/sS?.͏WvKw幫֦'׶s[WvϷjSSKwZKۭR06# CCk1y>W*oOoOoGJwőwcq嵋ŵb]Z*K|{~\^;Y<{,{ͽBanqepezxRV+Ǐ#xupzgTt1FY*}k{~ane~q~1y586vqq7Ǟ|u`bb:55dKh=wŋ}Cۇ#w'wXdgV\9:l~w"] V>ʁw{ٽK}0Jϟj^<:7f";I4qxp:||6}p}x7:OEGόvo'[3ǟ>fN;ٹ9^?+ۛOPif~,X?ۛ=})2~\8xGͧ&gWƶ?-sz|l?_}:?n_/ }C3/GR˽Z8~|U8>^eUn˘x`_.?w˥ҧكu{vOʇ(Uʇ׮<|MOV>كkffqw8|uiٻǓC]c3km%}C<\<,/VnCTĪg /fcd4iFyڛkNnss?m]Ͽkqoox՜o }˯v/T x߼6pNJ@&2FLf _;OnU.?g5n7C28F]`yUWRϟl)-?&VnhdMvmLrRjO?-n-n) ?=XXlG'vf::WK3X^율m GUfjK%ulgntjZC KNW&ct|ԼxwR<ï.ƐZ|0>G98 >4`cF͓ʶ.vKW0J^Iߐwݿ!ww+[|ir u? g$_~;9{7[߽ēVE5*n \$`sШ*&+jPE)//-O,Lo}])FwWGw`ygq@}Sr"^>$EB{JSu[=VIQm.wbf=P$k@D_f2pw>BWJZ{]])gԿּ3\7fGݧޭ̜y):P[A\]n-Vwv{S,ݧ>n-]wVn6#m]WV*x>skz0wt]?̡oH͢0TUC}xff;li꿎Yٍّݗ'^P SC5gT :Gw69h6lúaQ| k & . z^!^"`,e5QY%9abO6ƂVH6) ‚!ΈWWR y*^7T~r@! 8<9D\qǑXqfz)ܮ꿕P3W>i|TdK@PjJkdÈկ0"+L9RHun " b:Iuy5^_3Qe9*Qcs@w@˸Q~o-oc_O`o3 9<3$s(a?}z> @k2y3EdH4co^dP"CR+͈sGy Cu .Po8% 3m'!0e͠HK8aN2 D~i>4f7;Bgw v2T¾*VG0/8x dkfX?=v\IN@@O:($c?'B3?YM-"iguIw=7%Y^(/$ ߚJ/$|/P܆h'6 -60/E1ij'iI Er$o^=b嬨Aq3߫b +^G Ͳ &މK;J /}׆O4໧^OD &nM~ <_59p59jcʍű>ylBwK]~wx*ź*o?$F&?<P2vyWh7H ӑΟHz]dzw aQ6 '15R& D4WBj8ҵS Xt@6 BZ_Q/#ş_eeyx3j͂/W2oHJ?81)r(&\~fD |Qiyõ,}e/ $eLs>K#<a/HKgh5<&A~YiDN9/@zUht4۸G0g=󃖿|WP³8!pC{< ~y)_p_`V^{.71TcZBLx3~X"rńg/?-sڼ ]-7%ЖJ: |ZaΧC v7i$}1gEܥMtiWNQ $=M||/{/ ̨`K/Q.Ǵ>{ БfZTWh<R#4>?Ọj,veZp^Kz]oC;/_][-+Bn{+E ݻ+NbY+o"gc/>NdYڥdxرȠ0+ys_8ɟtiM_>^o 0#S\"8RMmMGw~}ty ʔ;2{Y VQCQ8=P-v$u{StxHQ o0Dg ѧ.[yp7v]S6Io;b[X3[Lڛ}W"[l8X5o3 >MgokL\Bgl/~Q:|pયb;y\_^n{o{ixnYt:U3R^*$#f?׿vFk%< ?,ǘm'&n6x{LTӼ?e|*~՚ k18ThݛjUhXeO9vU&/3,̅&j9װɻL6I*HtX 2j'H s|$^x/9-`zD8fDr>H *w>GDbc5EGLt ?Z,up3/l|Q~JóXBx~yoT>*?6-d`!9V fBo€l3Fꗚd$:na=[ӛMKcW2 <ةu(Wuz'2UR'gH/-md/H{˦ãB+#M|5mNbI{Hgev _Dt?_ F:??B :WW:~emJzyDr5ch}w7>u>OD*bUH FۯG^xnCNU=D;/c6u?ـJhA#e|9M9&Ұ o 5̛B:OiKו0XvrNhZcՖ*'gt#R9w)4;Sj`ֽX SR!], نϝ*wF\i2dzk!A?T2O-N'U{[To٫5́7T{T=M~[|21<~z.(zYi ޼?|Ŷfhz?^OUK߆5S5oҪo;qNg(N Z,t{1r&WO/}tNbK~E } ]ju3\Ab?uV ñs֧XɸU7cOTOCL|Z~ snɅoXJysqAgKB1+70Ky wEm3\)&yo nͷ8f|눨Qc9l OEj?a O%|Wvt\Y_];<2Z M󤍔>"EVcX-yozHG$R|dmxK y.)%FZQ tJU8"ֿRHa,"/9}E S{ΨҦO))dHhMV8A(=~[NIy3ULߋ|'j" j-}"^{WI|˕ Q[t֑N`݋0;8*Ie]l#v^p5sGѝϟK_P1"c@,7)xey]P+!Ig|XΪ>٧&y9yo31RUU=3֭<$.+T6zdÈOiGOi׍8uնTxкFbxp]ŒՆWMH9_Go `w$$й4>q CҟPv9'㠎60*0-P.Op[U3:X+kùtFTea?vk&khˤ)y=Zu>$RMRZMچaM4|rKcOb,uDe[F':"!%꣆BO6|raSRyH:ü,Q" +65t0CG@fcSR["{Yye .+|HFt`P[rﻎ6T]yYVe͠8 Uwe]u%lX/XwzS 9R5npQ,\U($+-x<$ C#I}ast.jxC]9_+ >5[J}(9Ad1TNQ'a 4t~6􃉢N`L#*7Ԧ Ǹ?V Y'SqZ*Kx7yɴC3IyC 1t墷8x9FIޡZlYj3[H[V ԡ*y~ ڬ0\Dżp)wE-oA0xVU, @h7)/ypވ{}%P"y2N';Q[a,ca(çZXn0&j{OLj@g9HI?*hI`K-' < M3BRhYmW;FsXABvhTVfh0kZͶm+v!_!(b8A_ʼn93N vUJkJ2{|gDQ3>em|8g9gy|նX'z~t2M"WF]JCc4gITTGA=V4`{ǫݔ'!1'Ü1m^Yj@hˊakjTT LakG!ghMg x[N/J=wbs.,f@,l'*Lv4cU5tKIfjvY[74q)ViI0Ʀx_ӥשV|`TUF05j_jac 2D·^f`ob3M>HYD1e)>t#ʃN5zL.kVw͒DF;ni/`r\5@2=j(5 Ξ8{5Ξ@],ݪa-UnSƤ fdpQVF9r4g [x@W8+;2:/,ﺽ$XJ& r[ZG?#j`խJ,w^xG?N}hg:}D*WBlFd]R#C;.)|3gKƧ͓⌺# )IȜ̞v[Ȉ{|&9LԻODihDdȠ44UDF/#,?ь[HϱR@9=TR X?7nXf:!f0I7sK;LP鵒vr}A d%c[G4l>,3̫#RG 2̓ K%lKãzw6 &]`aC3·.pZG|8ˇCQ=%B>ƍI\)NCm:N}塚w|8[رpr|8/2ϬG D(H=ʙȻ3f%|@blt 'l6X#х"c2N27h(N? }ޙes:3F{C9*+Z-=+ݹU14vۀ1{⣓ pYY[L_ s1+MoCSFU51,|f|C-eǻ!ƬwN㾅$R㡕IA2R"#ퟑ"#v %:ׇDTۇqbRءSy~=HӜTRwW GAI*FTi,g]#ÐTFOgUJQA/*n)h!lgӆٺd޵ct;/r%ObܬΫ{ֽG8l˃,j\X 8es7]uO=c+h~}"_%bT*|y~]#N\,3%9JOygVd/e|&?SL/Î>%bH)]4ʰ\}]  FRu.V&$pd7)U&T ɯ^]Kݞ~3f.Ros9C:6zGZ|=eOzH[ ;< /3;zO*(䞛 rk=ql&4 ˍ?(vlȭ҂ M(äPUGMXY/f)éf<ʎhܩb!dTIVlI6$ƹ>"rI9i}3+6bu|,ݬΈ.=YXqW#dMljq.0{fi6V.ݮtZxd)"ʬc{ei2!dlWdtZ4Zyl:\:?L6V.ų=6b ˦Ӛ]=h6qC=L6V.m{dmwӥo)Me:<ΦӚ?P{fөA)N϶[t8 r2M ,HPz딪KVUrʍ(Uv٨K)t5 .L)=3|XwznR82'U2*tw;+&.et5,*Y,se- rڝ[2cT4w;ц1.tw;!ͤНͣy\gxY4vDiސMsy`hـUAL'JCγaR" CC CutCJNVa 0||"ti^إ8 Leri(ez~i(fDfV(hp8X8u{ P253s10Kz5 ԉnDR֊2#.]RHiZ up{Kem6PdH7۷$A5ׇ`-~Vj7TxmosBbt ٷZe#Z7;ڱ`k7; "{WWոA 5WZ^;=phbT3'V)o|"RbhPNd%?d wF^Q;jO}=rb-37sV 6n#_xm+ guGs| ʚ/f G?V0f˳߮D"Ìd",ĵ6u,1YIbe{jOXŬ1)i;AIƔ[P7t%H$&_v6w+l%1 B VZ{იûǭ*PćP9b[VGLJ}{{x@9]ݫ0år&b;)ðl ]l*FD46xe ]*ˮS> ݶP~Uqv̏_,,<8KĎ_$˳"YdJY-Sz ɪ4<*p7$g]0c~ꎕ;H}aC[@F*er3RejҗuYUcAVלS Թ$y:H.wY~cꌸҪ;r=j!uR5EjQƝ>J+NvZ7z~I`6}_I3 C٪"/0.6:1ڣ\Wk]w;=9;V=SCvnT:@0I-#:|A{d[,(fd+*mKQ(vlj+Dw 8q[H$2H4+il2jcTu5fVEǧή5ZUi.A*w.i=[kr:҅Cb;fZ|^@nǓdZ$o8h5GwT>k/ j Y2=2n@G) PK[9~ПQ_zE}cE (YErF 9<VmGE#(# S N$2K ֯P燸b]?KwC]׏ҫgҮut7F]?㨐'n6 C]?sN>D]?!RjϺ~f\ VsxltuMع#[UvYx@Z'Tw맙htuXΔռ z~7I{{3\Jx;@]?㰰 w맕&)~n1?D]? e8$3RwajU uTbH))첝BIuL^Rϸ{3>pMdUOE=W;3& `P@֖@P,3)'g^u$(c7cAރi۱ݺ~Ɩ<u,D314g߬=gD]?XqE޻r~[囬u 1b]?K6uș1ȮՑO~Ƌabu?<<hW{>Uk%vޫܴ1y&yBlJDWљL*v5NHTx%}cNXVΝK7{$P>}G){{s[?T[_yOn4&Ӈ?'<4q鼿:=ǖ>\Wl6U sp6`~:4ITn/t. 3Ʌ}?T{_0(J n}.]`ω4B%hX<8v INdg©lkV4_a.RFaϚu:MT, ν}Rhx R<*EGLsyP5H|wsCل6R[H~ᡫ(B3jQBYFt-d{q>q0RqQ"-Bz.__b(=2 sݡ7;?턅oۡPuBOC KźM,2W G1R NßVoU'Z Zio%MNKZ!n1yNUo.GY4S<6#D.8iJ1`fYw؉>|a_OȮ:5_#vr!F >į'OWz35{3TSyc&t:UIR($#1쇨ԟ7YV=y?Л_#F~LM|u]f“FZde:0W/ Q8 fjђMQC'?Kc/˃sfޢ}Xx`7|\U]2N)[>yF.74B$A )nHDRτ&/nP^JDxJ"LGlD]mQG$:)&EEb!=Xdɫt I"]]O\B7R.{ zh΋0e0Hf1 b'%1 ݓj6乐`~r6vi?^ AX!RkN>LAUAvL >i'"ŨZv(];3USiᄄ&G~og#<BtGiHM#)# ): % bM q݅xn(%:4: vԿIa,;F@ ] s>W@L' Q0d0 Jq>XZsK,{JX2_R¸R[P"HCiˠ4Z\iE[b2;Sj[4Ǣ-Zt>`q9` p-)GPU>mB~,B|n\{uV4F6%S ![B"]R ^;}!Y"k1ɫy&痂2x^IF| IaFDQTx2? |WrԨ'vY9#KQWL?<e74ԂC-w~Bi tɌ؄/I~di QϷ:Niu0XL q&;˟ ,'H{)7[9l.].)xbLƟjAԂ'$Al5b|uW_S۵8F6-Gؙu//E:<.jsgIY#LUB"w0=/zxj~/ Q9M@ãƣ)y呒~A#K>(Oܛw\ˣ(T[O%'ԝ;D'{Y€\%J \!?{ۿ/"z/>8iſuKP*󕋻&LBسWwFL1AAL. n|~tAd3>_ΑL&d*n?kzv8b:Mw]gotu9nKz*^F㣰"sEDP$7FAYIuߩnC ˼b5XRCoQXW':e0BdSsk]񢸮.*M/v}q|-?Nccc+jWeqGSq~&G8PE0w9so_]gH95gϵ@"74LH`b ]͠9PqWgr-Qh 5_(~GS79{'5aNBB6̔2Lކ#q OV&>63G0f O qLy+)oeۚ̔2a,l3S$V&2Bf)+R?̔-fZ=o63ecU2=D!]F?k||~:%(OBcW; 'DHYS3Vè *RRۇoʿ@\o?QVr6ś bԟ҄);4㍭WSbMߦ}]MC,8H%} A!ݯ @„ ,JG/G%T:=P J%"HXHGe$5 *EMbd"R $Ȯ>\,쁒p!xt!)[->GLAT ߈at21[;RN4.yB*"ŬR cpz)`~&C%JsIQZ+bOioVMi|c`&!^ڗ|xtx2f(l $<%}flL U汹j"ϲC/MJ|t64x>c~ZcRhoO6hC6jg7IM5n =~k#ڬȆ0Üg*UDW͝olT&%-MV"D)}֖og3U)`g'.`R.WzxKςT/4l!"Wq9'y υcO+̩]baaQ{3"n:`= >&ߜpȑk(F<|Yq'4h1px$g(r L>#A|}'ka!B]Ƞ"є`B+ *Z-p Ŷw(!(- ] 7`h1CRRp@"#&[`:Ͱvl52DH\PduBe:o={ً Gq:#:pԜ:{rP}xЦhzwPG?5_rP4pI&Sأ :b#ICj?74爦.^`6HE8M&_CQ.&*e,jIFSqlIģlr[IHLEq>"nC&L|x*Ar5a9t"M,\ F:FiBM,Xy)Ms %a0 MO:4iJ:,L%X$c%Il ^b A4b(E!!5IDN0Q$),\H'bJ&e{И_qBT%@gW: sd4He27L3)-ixRT(̀1H"ѪEEIX,I@#ǀ%ah2@,$V"VE_qMF3 _t\@JI4c\:)o$z-O1B8L Bi jb\?>ټ-C endstream endobj 6 0 obj [5 0 R] endobj 24 0 obj <> endobj xref 0 25 0000000000 65535 f 0000000016 00000 n 0000000144 00000 n 0000044395 00000 n 0000000000 00000 f 0000046916 00000 n 0000253194 00000 n 0000044446 00000 n 0000044812 00000 n 0000049898 00000 n 0000047215 00000 n 0000047102 00000 n 0000045822 00000 n 0000046355 00000 n 0000046403 00000 n 0000046986 00000 n 0000047017 00000 n 0000047250 00000 n 0000049971 00000 n 0000050189 00000 n 0000051232 00000 n 0000057671 00000 n 0000123259 00000 n 0000188847 00000 n 0000253217 00000 n trailer <<0A3F3EE61BD34EFE9E0E26C74DA50670>]>> startxref 253412 %%EOF ================================================ FILE: doc/modules/ROOT/assets/source/Push2NoEffects.psd ================================================ [File too large to display: 27.4 MB] ================================================ FILE: doc/modules/ROOT/assets/source/PushNoEffects.psd ================================================ [File too large to display: 36.6 MB] ================================================ FILE: doc/modules/ROOT/assets/source/Show Space.psd ================================================ [File too large to display: 35.9 MB] ================================================ FILE: doc/modules/ROOT/assets/source/WeatherSystem.psd ================================================ [File too large to display: 31.9 MB] ================================================ FILE: doc/modules/ROOT/nav.adoc ================================================ * xref:README.adoc[Developer Guide] * xref:cues.adoc[Cues] * xref:effects.adoc[Effects] * xref:parameters.adoc[Dynamic Parameters] * xref:metronomes.adoc[Metronomes] * xref:oscillators.adoc[Oscillators] * xref:fixture_definitions.adoc[Fixture Definitions] * xref:show_space.adoc[Show Space] * xref:color.adoc[Working with Color] * xref:mapping_sync.adoc[Mapping and Sync] * xref:push2.adoc[Using Ableton Push 2] * xref:push.adoc[Using Ableton Push] * xref:launchpad.adoc[Using Novation Launchpad] * xref:rendering_loop.adoc[The Rendering Loop] * xref:videos.adoc[Videos] ================================================ FILE: doc/modules/ROOT/pages/README.adoc ================================================ = Afterglow Developer Guide James Elliott [[organization]] This section provides an <> describing this guide and an <> of the Afterglow environment. It then explains the <>, and links to other sections that go into more detail. It is worth reading through this whole page once if you are new to Afterglow, because the orientation it provides will be helpful, and it ends with a <> to help you get started on your way to creating your own light show. Once you know what you are looking for, you can also dive right into it by jumping to the section you want: **** <>:: The building blocks of a dynamic light show, which have a <> worth understanding, and a few <> to get you started. <>:: Provide inputs to your effects which change over time and space, enabling much more interesting and complex appearance and behavior. <>:: Provide a convenient way to organize and trigger effects. Allow you to build a user interface for your show, through a colorful cue grid in the web UI, on a supported grid controller, a basic MIDI controller, or a combination of several of these options. <>:: Keep track of musical time, in terms of beats, bars, and phrases, and can be <> to DJ equipment and software. <>:: Convert show timing information into waveforms that can drive your light show. <>:: Tell Afterglow how to work with different lighting hardware. <>:: Explores how to measure locations and orientations when hanging your lights so that Afterglow can properly calculate spatial and directional effects. <>:: Introduces tools for expressing and manipulating color values when designing lighting effects. <>:: Looks at options for using MIDI controllers to run your show, and synchronizing its metronome with DJ equipment. <>:: Explains in detail how a frame of lighting control data is calculated and sent to the lights in the show. This is advanced, low-level information for people who are ready to create their own custom effect algorithms. {api-doc}index.html[API Documentation]:: Generated from Afterglow's Clojure source code, to provide information about all the namespaces and functions that make it work. The rest of the documentation sometimes links to related sections of the API documentation, and vice versa. <>:: Show examples of Afterglow in action. **** image::Afterglow-logo.png[Afterglow logo,128,127,style="vertical-align:middle"] [[introduction]] == What is Afterglow? Afterglow is a lighting controller designed to support https://en.wikipedia.org/wiki/Live_coding[live coding], written in http://clojure.org[Clojure], intended to enable people to produce spectacular and highly customizable light shows using modern stage and effect lighting, and which are related in deep ways to the phrasing of music being played. (Its http://deepsymmetry.org[creator] is a DJ and producer of light and laser shows by avocation.) Currently, the <> and <> are written and organized through Clojure code, so you will either need to learn Clojure or work with a Clojure programmer to create new ones, but they are controlled through MIDI control surfaces or Open Sound Control, so once they are set up, there is great flexibility in how you can perform them. Someday a user interface for building shows and fixture definitions may be created, either within Afterglow, or as a companion project, but that is not currently planned. For now the focus is on building rich user interfaces for controlling shows, such as the <> and <> mappings and the <>, while using the concise expressive power of Clojure for writing the fixture definitions, effects, and cues. Afterglow communicates with the lighting hardware using the https://www.openlighting.org/ola/[Open Lighting Architecture], so it supports a wide variety of communication methods and interfaces. Information about https://github.com/Deep-Symmetry/afterglow#installation[installing OLA] is included in the project https://github.com/Deep-Symmetry/afterglow[README]. [[overview]] == How Afterglow Works The fundamental task of Afterglow is to make light shows happen. It does this by controlling lights, communicating with them through the https://www.openlighting.org/ola/[Open Lighting Architecture], which can work with several kinds of control protocols, most of which are derived from http://en.wikipedia.org/wiki/DMX512[DMX512], or a faster implementation of its basic ideas over Ethernet. When a show is running, Afterglow runs a thread which periodically asks “what should all the lights be doing now?” (resulting in a single “frame” of control values representing that moment in time), and sends the results of that analysis to all of the OLA universes the show is configured to control. By default this happens 40 times each second, but the interval is configurable within the show, and should be decided based on the fastest refresh rate of any physical interfaces you have hooked up to Afterglow. This is described in more detail in the <> section. TIP: In principle you could have more than one show running at a time, each controlling a different set of OLA universes, but most people will not need this capability. When you just create a show and call `(show/start!)`, Afterglow will send a bunch of zero values to the show’s universes. To make interesting things happen you add <> to the show. The default namespace you are put into when you launch the Afterglow project using `lein repl` has some <> that can help get a feel for this concept. To get a full understanding of how to use (and create) effects, learn about the <>. The effects need to know what lights they are supposed to control, what capabilities they have, and how they are connected (what universe, what channels), as well as how they are arranged in space. This is accomplished by patching <> to the show. To work with the actual lights you have available, you will need to create fixture definitions for them, unless they happen to be ones already available in the Afterglow project. Since there are so many kinds of lights, with more being created every month, that seems unlikely unless the project really takes off… and, to that end, if you _do_ create definitions for your lights, please contribute them to the project! To learn how to install Afterglow and the Open Lighting Architecture, see the project https://github.com/Deep-Symmetry/afterglow[README]. Since Afterglow was developed to create light shows for electronic music events, it is deeply driven by the notion of musical time, through its <>, so it is worth learning how to configure and interact with them. It is also designed to work with MIDI controllers, both to trigger effects, and to synchronize with music, as described in <>. Of course, you are not going to want to have to type and evaluate Clojure expressions to create your effects in the heat of the moment of running a light show, so Afterglow shows incorporate a grid of <> that you can trigger and adjust quickly, both through the embedded web interface described below, and with dedicated physical grid controllers or simpler MIDI controllers. [[web-ui]] == The Embedded Web Interface Although a physical grid controller (especially one as well-designed as the <> or <>) offers the ideal control surface for running a light show, you can do a lot with just the web interface built in to Afterglow. And even when you have a Push or other grid controller, the web interface makes it all the more powerful by adding at-a-glance documentation of cue names, as well as alternate ways of doing things, or the opportunity to interact with more than one section of the cue grid at once. If you have started Afterglow by running the jar file, it will have opened a browser window on the web interface by default. Otherwise, you can bring it up by evaluating: [source,clojure] ---- (core/start-web-server 16000 true) ---- TIP: The `16000` specifies the port number on which the web interface will run. You can use a different port number if you want: just pick an unused port and type it instead. The `true` requests the browser window; it will be opened on whatever port you told the web interface to use. image::WebHome.png[Web interface,537,427] The home page offers some buttons which can take you to this documentation, the Open Lighting Architecture console in case you want to monitor DMX values or configure the universe(s) that your show will be using, and an embedded web REPL that can be used to evaluate arbitrary expressions to configure and control Afterglow. The primary interface, however, is the show page, which is reached by a link in the Shows section. However, when you first start Afterglow on its own, there will be no shows running. The Console can be used to change that: image::Console.png[Web console,850,690] NOTE: As menioned in the main project https://github.com/Deep-Symmetry/afterglow#afterglow[Readme], the web console is there for quick hacks, and is no substitute for a rich Clojure development environment. For any real work you will want to either start Afterglow from your development REPL in the first place, or to connect it via `nrepl` if you have launched Afterglow independently, such as through a jar file. Afterglow can offer an embedded `nrepl` server, which can be brought up via either https://github.com/Deep-Symmetry/afterglow#usage[command-line arguments], or by using the web console to invoke {api-doc}afterglow.core.html#var-start-nrepl[`core/start-nrepl`]. [[show-control]] === Show Control Once you have the web interface open, and a show running, you will spend most of your time on the show page. Here a look at the cue grid that gets created for the sample show by {api-doc}afterglow.examples.html#var-make-cues[`afterglow.examples/make-cues`]: image::ShowGrid.gif[Show control,998,912] There are a number of different things you can control from this page. The load indicator in the middle of the navigation bar gives you a sense of how much headroom your system has, by showing you what fraction of the time available for rendering the last few frames of lighting effects was used up. As you add more complex effects, the bar will fill in and turn red, warning you if Afterglow might not be able to keep up. The red `Stop` button next to it can be used to temporarily shut down the show, blacking out all universes that it controls. Clicking it again restarts the show where it would have been had it not stopped. If there is a problem communicating with the Open Lighting Architecture daemon, the status indicator will show Error, and there will be a `Details` button you can click to get more information about the problem Afterglow is encountering. [[cues]] ==== Cues The majority of the page is taken up by an 8×8 window on to the <> attached to the show. You can activate any cue shown by clicking on it; running cues will light up, and darken again when they end. To stop a running cue, click it again. Some cues will end immediately, others will continue to run until they reach what they feel is an appropriate stopping point. While they are in the process of ending, the cue cell will blink. If you want the cue to end immediately even though it would otherwise run for a while longer, you can click the blinking cue cell and it will be killed right then. The text labels within the cue cells are to help identify their purpose, and are established when the cues are created. Similarly, the colors are intended to help identify related cues. Some cues (especially intense ones like strobes) are configured to run only as long as they are held down. In that case, when you click on the cue cell, a whitened version of its color is displayed as a hint that this is happening, and as soon as you release the mouse, the cue will end. If you want to override this behavior, you can hold down the kbd:[Shift] key as you click on the cue cell, and it will activate as a normal cue, staying on until you click it a second time. Cues may be mutually exclusive by nature, and if they were created to reflect this (by using the same keyword to register their effects with the show, or specifying other effect keys in their `:end-keys` list), when you activate one, the other cues which use the same keyword are darkened. This is a hint that when you activate one of them, it will _replace_ the others, rather than running at the same time. The <> of the Cues documentation goes into more details about the relationships between cues illustrated in the above animation. [[effect-control]] ==== Effect Control When any effects are running, whether they were launched by a cue button or some other means, they are listed at the bottom of the show control page, in descending order of priority. (Effects are run in the reverse order that they appear on the screen, so effects towards the top of the list can override things done by those further down. Newly launched effects assigned a given priority appear above older ones with the same priority.) image::EffectList.png[The Effect List,872,263] The name of the effect is shown, along with its prority (if it is anything other than the default of zero), when it was started, in terms of clock time (down to 1/100 of a second), and the show Metronome (phrase, bar, beat, and hundredths of a beat). If an effect was launched by a cue with any cue variables, they appear after the start time. Numeric cue variables can be adjusted by dragging the associated slider. As shown in the image above, the current value appears as a popup above the slider thumb when the mouse is over the slider. Color cue variables can also be adjusted. The current color value appears as a swatch; clicking on that swatch opens a color picker interface which can be used to adjust the color parameter: image::EffectColor.png[Effect Color Parameter Adjustment,872,299] Click anywhere outside the swatch and color picker to dismiss the color adjustment interface. If cue variables are adjusted somewhere else, such as a mapped MIDI controller or from other code that is running, the web interface will update to show their changed values. ===== Saving Cues If you have made any adjustments to cue variable values, these are normally discarded when you end the cue; the next time it begins, it starts with the values that were configured in the show. You can change that by saving the cue's variables. In the effect list, any cues whose variables you've adjusted will have a green kbd:[Save] button on the right, like the `Color snowball` cue in the photo below: image::SavingCues.png[Saving Cues,1002,246] After clicking kbd:[Save] in this situation, whenever you click the `Color snowball` cue in the cue grid, it will start out blue rather than its previous white color. To reflect this, the color of the cue in the cue grid is updated to be blue as well, both in the web interface, and on any attached hardware grid controllers. Once you have saved a cue's variables, while it is running, instead of a green kbd:[Save] button, you will see a gray kbd:[Clear] button (like the one on the `All Dimmers` effect in the photo). Clicking that will remove the saved values, so the cue goes back to its original configuration. For the moment, saved cue variables last only for the duration of an Afterglow run. The next time you start up a show, all cues are back to their configured values. This may change in a future release. ===== Creating Macros In addition to saving the values of a single cue, you can also make an entirely new cue which, when you launch it, will start one or more cues that you currently have running, with whatever cue variable values they had when you created the macro. This is a great way to quickly build up a library of looks by combining a bunch of running cues that you like, so you can get back to them in an instant. To do that, start by clicking the kbd:[Make Macro] button at the bottom of the effect list. Checkboxes will appear in front of all running effects that were created by cues. Check the ones that you want the macro to include, type a name for it, then click on any empty cell in the cue grid. A new cue will appear there with the name you have chosen. image::MakeMacro.png[Creating a Macro,1002,383] Whenver you click that cue cell, it will start all of the cues that you included in the macro, with the variable settings they had at the time you created the macro. If you decide you don't want to create a macro after all, you can click the red kbd:[Cancel] button, and the effect list will return to its normal state. ===== Deleting Cues If you have created a macro and decide you don't want it any more, you can right-click on the cue cell and choose the `Delete` option that appears. image::DeletingCue.png[Deleting a Cue,313,284] WARNING: Be careful with this: You can delete any cue this way, and if it was not a macro, the only way to get it back is to re-run the code that created it in the first place. ===== Ending Effects A running effect can be asked to end by clicking its kbd:[End] button. If the effect takes a while to end, its entire row will take on the color of the kbd:[End] button while it is in the process of ending, and the button becomes a kbd:[Kill] button which can be clicked to instantly terminate the ending effect: image::EffectEnding.png[An Ending Effect,1002,246] [[scrolling-and-linked-controllers]] ==== Scrolling and Linked Controllers The show may have many more cues than fit on the screen at once; the diamond of blue arrows below the bottom right of the cue grid allow you to page through the larger grid. If there are more cues available in a given direction, that arrow will be enabled, otherwise it is dimmed. Clicking an active arrow scrolls the view one page in that direction. In this grid, it is currently possible to scroll up and to the right. [.right] image::CueScrollLink.png[Cue scroll arrows and link menu,365,167] If you hold down kbd:[Shift] while clicking a scroll arrow, it will scroll you as far as possible in the direction you clicked. You can also use the arrow keys on your keyboard to scroll in the corresponding direction. (Again, holding kbd:[Shift] will scroll you as far as possible in that direction.) If you have any compatible grid controllers, Afterglow started watching for them to be connected as soon as you called `(use-sample-show)`. If you are defining your own show and want to learn more about how that works, or lower-level ways of binding to a specific controller, see the <> in the Mapping and Sync section. With auto-binding active, whenever a compatible grid controller is connected and powered on, you will see a link menu appear next to the scroll diamond, as shown in the above screen image. The link menu allows the web interface to be tied to a grid controller, so that each is always looking at the same page of cues. Using the scroll arrows on either the web interface, or on the controller itself if it has them (the Push and Launchpad family do), will cause both to scroll simultaneously. This provides an excellent additional layer of information about the buttons on the physical controller. TIP: Of course, there may be times you want to break this link, for example so you could have access to one set of cues on the physical buttons of your controller, while simultaneously being able to control others via the screen and mouse. To do that, simply use the link menu to turn off the link. [[brightness-control]] ==== Brightness Control In the center of the interface below the cue grid is a slider that lets you adjust the show's dimmer grand master. This can be used to control the overall brightness of the show, because any dimmer cues that are running will be affected by the value of this master. If it is set at 100% (all the way to the right), the dimmer cues can operate at full brightness. As you slide it to the left, it gradually reduces the maximum brightness that any dimmer cue can achieve. In the middle, all dimmer cues will be reduced by 50%, and all the way to the left, all dimmer cues will be zeroed out. image::GrandMaster.png[Dimmer Grand Master,319,172] [[metronome-control]] ==== Metronome Control The final section of the show control interface, left of the Dimmer Grand Master section, lets you view and adjust the Metronome that the show is using to keep time with the music that is being played. Since Afterglow's effects are generally defined with respect to the metronome, it is important to keep it synchronized with the music. The metronome section shows the current speed, in Beats Per Minute, of the metronome, and the `Tap Tempo` button label flashes yellow at each beat. It also shows you the current phrase number, the bar within that phrase, and beat within that bar which has been reached. image::Metronome.png[Metronome,361,175] The most basic way of synchronizing the metronome is to click the `Tap Tempo` button at each beat of the music. Tapping the button aligns the metronome to a beat, and if you tap it three or more times within two seconds of each preceding tap, sets the metronome's BPM. Tap it as you hear each beat of the music, and after three or more taps, the speed of the metronome will be approximately synchronized with the music. You can also adjust the BPM by dragging the slider along the bottom, or fine-tune it with the `+` and `-` buttons around the current BPM value. Once the tempo is correct, you can tell Afterglow which beat is the down beat by holding down kbd:[Shift] while pressing kbd:[Tap Tempo]. (The label of the button will change to kbd:[Tap Bar] while kbd:[Shift] is down). This combination does not change the tempo, but tells Afterglow that the moment when you tapped the button is the down beat (the first beat of a bar). In order to make longer chases and effects line up properly with the music, you will also want to make sure the count is right, that the beat number shows `1` on the down beat, and that the bar numbers are right as well, so that the start of a phrase is reflected as bar number `1`. In addition to using kbd:[Shift] with kbd:[Tap Tempo] to set the down beat, you can adjust the count using the `+` and `-` buttons around the Bar and Beat numbers. A shortcut that you can use right as a phrase begins is to click the red `x` button above the phrase number, which resets the metronome to Phrase 1, Bar 1, Beat 1. Trying to keep up with tempo changes during dynamic shows can be tedious, so you will hopefully be able to take advantage of Afterglow's metronome synchronization features. If you can get the DJ to feed you <> or <>, or connect via a Local Area Network to Pioneer professional DJ gear to lock into the beat grid established by <>, Afterglow can keep the BPM (with MIDI) and even the beats (with Traktor Beat Phase or Pro DJ Link) synchronized for you. To configure that synchronization, click the `Sync` button once you have the MIDI clock, beat phase, or network Pro DJ Link signals reaching the machine running Afterglow, and choose the sync source you want to use. image::MetronomeSync.png[Metronome sync,1040,800] TIP: When you are synchronizing with Pro DJ Link, you will almost always want to sync to the mixer, rather than one of the CDJs, so you stay in sync as the DJs mix between tracks. The actual list of choices you will see depends on what MIDI and DJ Link Pro traffic Afterglow has seen in the last few seconds, and will update as players and mixers start and stop sending clock or beat grid information. Once your sync is established, the `Tap Tempo` button changes. If you are using MIDI clock to sync the BPM, it becomes a `Tap Beat` button, which simply establishes where the beat falls. If you are locked in to a Pro DJ Link or Traktor Beat Phase beat grid, it becomes a `Tap Bar` button which, when pressed, indicates that the current beat is the down beat (start) of a bar. Similarly, if you press the metronome Reset button (the red x above the phrase counter) while synced to a Pro DJ Link or Traktor Beat Phase beat grid, the beat itself will not move, but the beat closest to when you pressed the pad will be identified as Beat 1. In these sync modes you can also use the kbd:[Shift] key to align at the next bigger boundary: If tapping would normally move the bar, shift-tapping will move the phrase. image::MetronomeSynced.png[Metronome synced,355,156] The Sync button also turns green to indicate that sync is in effect. If something interrupts the sync process (such as the network link being broken, or the DJ software's MIDI clock generator being turned off), the button will turn red to warn you that it is not working. Pressing the Sync button again will give you more information to troubleshoot the problem. [[getting-started]] == Getting Started There is a lot to Afterglow, and already a lot of documentation. In an effort to help you find your way through it, here is a guide to the steps you'll want to take to get a basic light show up and running. Once you are there, you can branch off and explore extending it in any direction you like, and hopefully contribute back the fixture definitions and new effects and cues you come up with! . If you don't know any Clojure, you are going to want to learn at least a little. Luckily, it is a fantastic, helpful community, and an amazing language (the existence of Afterglow after a couple of months of spare time work is good proof of that)! The http://clojure.org/getting_started[Getting Started] page on clojure.org has links to some great resources. https://www.maria.cloud[Maria] is an interactive, online workbook for beginners that provides progressive instruction in the language. And don't miss http://www.braveclojure.com[Clojure for the Brave and True], a fun book under development which can be read in its entirety online. . Install Afterglow. For now the best way to do that is following the steps in the https://github.com/Deep-Symmetry/afterglow#installation[Installation] section on the main project page, to install the Open Lighting Architecture, then create a new Clojure project with Leiningen that includes Afterglow as a dependency. . Set up your universe(s) in OLA. Their own https://www.openlighting.org/ola/getting-started/[Getting Started] page may be helpful. Until OLA is successfully communicating with your lights, whether over a USB DMX interface, Artnet over a LAN, or the like, Afterglow will not be able to control them. Even though their examples show using the command-line tools to configure your interface, today you will likely find the web interface, especially the beta new UI, much more convenient and easy to learn. With a default installation, once you have `olad` running, you can find that at http://localhost:9090/new/[http://localhost:9090/new/]. . Find or create <>. Once you are able to get your lights to do things by manipulating the Faders section of the OLA web interface, it is time to get Afterglow ready to talk to them. There are a vast number of fixture types out there, and at this early stage almost none of them are built in to Afterglow, so you will probably need to create your own. The <> explains how, and links to existing fixture definitions as examples. You can also ask for help on the https://deep-symmetry.zulipchat.com/#narrow/stream/318697-afterglow[Zulip chat] or the https://github.com/Deep-Symmetry/afterglow/wiki/Questions[Wiki]. + At this point you are almost certainly writing enough code that you want to save it for later reuse. The https://github.com/Deep-Symmetry/afterglow#usage[Usage] section of the project page explains how you can have Afterglow load files when it starts up when you are running it as a standalone jar, which makes it easier to use your own configuration files. + . Patch your actual fixture channels and locations. Once you have working definitions for your fixtures, you will want to create a show that tells Afterglow what fixtures you have, and the DMX universes and channels you have them connected to, and how you have them arranged in physical space. You will want to create a namespace for your show along the lines of {api-doc}afterglow.examples.html[`afterglow.examples`], and a function like {api-doc}afterglow.examples.html#var-use-sample-show[`use-sample-show`] which sets up your own show. . Create the cues you want. Much as the {api-doc}afterglow.examples.html#var-make-cues[`make-cues`] function in the examples namespace creates a bunch of cues that work with the sample show's fixtures, you will want cues that create effects to make your lights do interesting things, and which are arranged, labeled, and colored in a way that makes sense to you. . Map some cues to a controller, if you have one. If you have an Ableton Push, you are in luck because you will be able to take advantage of the built in <> Afterglow offers. Or perhaps a <>? But even if you just have a simple MIDI controller with a few buttons and faders, or even a keyboard, you can <> keys, buttons, and faders to trigger cues and adjust variables used by the cues. . Run the show! With or without a physical controller, you can create your show by calling the function you wrote modeled on `use-sample-show`, then bring up the <> to trigger your cues and watch the results. . Create your own custom effects if you want to be fancy. Once you feel constrained by the limits of the <> that are built in to the current release of Afterglow, the whole point of the environment it offers is to enable people to imagine and create brand new effects. You have the full power of the language used to create Afterglow at your fingertips at every moment to create and explore new ideas; you are not constrained to the limited scripting environment that most lighting control software offers, if it offers any at all. . Don't forget to contribute your fixture definitions and effects to the Afterglow community! If you are confident that you have fully mapped out the functions of a fixture, please make a pull request to include it in afterglow, either within the existing namespace for its manufacturer, or creating a new namespace for a new manufacturer. Similarly, if you have created an awesome new kind of effect, please consider a pull request to add it somewhere within the effects namespace hierarchy. And if you are just tinkering with something new and experimental, please post about it on the https://deep-symmetry.zulipchat.com/#narrow/stream/318697-afterglow[Zulip chat]! ================================================ FILE: doc/modules/ROOT/pages/color.adoc ================================================ = Working with Color James Elliott Cues that assign color to lights are designed to leverage the https://github.com/jolby/colors[jolby/colors] library. In addition to creating colors by name, as in the Usage examples, you can create them by hex string, RGB values, and, most usefully when thinking about how to mix and fade them, http://en.wikipedia.org/wiki/HSL_and_HSV[HSL] (Hue, Saturation, and Lightness). So, if you wanted a cue that shifts back and forth around yellow, and don't remember the hue value of yellow, you could do something like this: [source,clojure] ---- (use 'com.evocomputing.colors) (def yellow (create-color "yellow")) (def hue-param (oscillators/build-oscillated-param (oscillators/sine) :min (hue (adjust-hue yellow -5)) :max (hue (adjust-hue yellow 5)))) (show/add-effect! :color (global-color-effect (params/build-color-param :s 100 :l 50 :h hue-param))) ---- You can add lighten it up by changing to something like `:l 70` in the `build-color-param` call, darken it a bunch with `:l 20` or desaturate it a touch with `:s 80`... For more options and ideas, delve into the colors library http://jolby.github.io/colors/[API documentation], and the various <> that Afterglow makes available to you. Since working with colors is so fundamental to creating light shows, the mechanism for creating <> is very well developed, and worth getting familiar with. You can often avoid having to write your own function entirely by clever combinations of oscillated parameters for creating dynamic color parameters. [[thinking-in-hsl]] == Thinking in Hue, Saturation, and Lightness If you are not accustomed to working with colors in the HSL space, it is definitely worth spending a little time becoming familiar with it, because it is a powerful way of expressing relationships between colors in ways that are visually sensible and pleasing. The http://en.wikipedia.org/wiki/HSL_and_HSV[Wikipedia article] is a nice reference, with diagrams. Please spend a little time reading it. This is the way that Afterglow works with colors when it is fading (blending) between them, and many of the sample cues and effects use HSL relationships to achieve pretty and interesting results. In a nutshell, a color in HSL is represented by three numbers: Hue:: Identifies a specific pure color, as an angle in degrees around the color wheel. Red is at 0, green is at 120, and blue at 240; values in between these are a linear mixture between the colors, and as the value increases towards 360 it returns to red. Saturation:: Specifies how pure the color is. A saturation of 100 means it is fully pure, while a saturation of 0 is completely achromatic (gray). Lightness:: Specifies how white the color is. A lightness value of 100 is pure white, while 0 is pure black. At these extremes the saturation can't affect the color, it is always achromatic anyway. A lightness of 50 lets the color "be itself" when fully saturated. Lightnesses above fifty start to whiten it, while those below fifty blacken it. [[modifying-colors]] == Modifying Colors You can also create a variety of layered looks by building effects that work with each other, rather than having to create a separate effect for each combination. The discussion on <> explains how to do this and points at a sample implementation that ships with Afterglow. [[colors-and-cues]] == Colors and Cues When you create a cue that assigns a color to a group of lights, you can take advantage of Afterglow's rich user interfaces for picking colors to let the operator tweak that color during the show, simply by making the color a <>. Even if you are creating a cue to simply assign a fixed color to a group of lights, it is worth setting that color up as a cue variable, because it will allow the show operator to adjust the color in a very convenient way when running the show. The {api-doc}afterglow.examples.html#var-global-color-effect[`global-color-effect`] function in the `examples` namespace provides an example of how to do this (click the kbd:[view source] link below the description to see how it is done). You may also want to have a group of cues which share a same basic color, like the strobe cues do in the sample show. In that case, rather than having a color variable that exists only within the cue, you will want to set up a show variable to contain the color, and have each cue share the same show variable as a cue variable. The {api-doc}afterglow.examples.html#var-make-strobe-cue[`make-strobe-cue`] function in the `examples` namespace shows how to do this (again click the kbd:[view source] link below the description to see how it is done). All of the strobe cues in the sample show use the same color, and if you adjust that color while one is running, the cue cells within the web interface and on the Ableton Push and Novation Launchpad Pro will update to show the new color you have chosen, and it will be used when you press any of them. In order to let you adjust the strobe color even when no strobe cue is running, the sample show also sets up a “Strobe Color” cue. All it does is run a {api-doc}afterglow.effects.html#var-blank[`blank`] effect, while binding a cue variable to the show variable that is being used to set strobe colors, so that you can run the cue to adjust the color without firing any strobes: [source,clojure] ---- (let [color-var {:key :strobe-color :type :color :name "Strobe Color"}] (ct/set-cue! (:cue-grid *show*) 7 6 (cues/cue :strobe-color (fn [_] (fx/blank "Strobe Color")) :color :purple :color-fn (cues/color-fn-from-cue-var color-var) :variables [color-var]))) ---- This example also shows how to use the cue `:color-fn` key to configure the cue grid to display the cue using the current value of the color variable associated with it, as an additional aid to the show operator. ================================================ FILE: doc/modules/ROOT/pages/cues.adoc ================================================ = Cues James Elliott Cues are designed to support creating user interfaces for controlling effects. They provide a convenient way to organize, identify, trigger, adjust, and monitor effects. Each {api-doc}afterglow.show.html[`show`] in Afterglow maintains a cue grid, which can be viewed and interacted with through the <> and MIDI controller mapping implementations which can be {api-doc}afterglow.show.html#var-register-grid-controller[registered as grid controllers], like the <> and <>. [[the-cue-grid]] == The Cue Grid The cue grid is a two dimensional arrangement of cues, where the bottom left corner is assigned coordinates `(0, 0)`. X coordinates increase from left to right, and Y coordinates increase from bottom to top. The web interface and registered grid controllers display 64 cues at a time in an 8×8 grid, and can be scrolled around that grid. The user can configue (“link”) the web interface to track the scroll position of a registered grid controller. When that is done, scrolling either interface will cause the other to scroll in the same way, so the browser window can act as documentation to help the user learn the cue names associated with each available cue pad on the controller. image::ShowGrid.gif[Web interface,998,912] In addition to names, cues can be assigned colors in the grid, and the web interface will honor those colors, as will the physical grid controllers, within the limits of their capabilities. To provide feedback about cue activation, a lightened version of the cue color is displayed for cues which are currently active. And to help inform the user about cue compatibility, any cues which would cause a running effect to end (either because they are assigned the same effect keyword, or they mention that keyword in their `:end-keys` list) will be displayed in a darkened color. Examples of these features can be seen in the animation above, in which the first two rows of color cues are all mutually exclusive, while the four rows of dimmer cues above them have a more complex interrelationship: The “All Dimmers” cues in the leftmost column darken the entire rectangle of dimmer cues, while individual fixture dimmer cues to their right darken their just their own columns as well as the "all" cues. On the blue/green page of Torrent gobo cues, you can see how each gobo wheel cue dims other cues which use the same fixture and gobo wheel while it is active. This is a useful technique for building easy-to-learn cue grids. A slightly older version of the same cues are shown on the Ableton Push below, so you can see how the color relationships help with learning the cue names. image::AbletonInterface.jpg[Ableton Push interface,800,637] To trigger a cue, simply press the corresponding pad on a physical interface, or click within the grid cell in the web interface. The effect associated with the cue will be created and added to the show, and the grid cell will be lightened to indicate that the cue's effect is running. If the cue ends itself after a period, the grid interface will be updated to reflect that as well. To end a cue's effect before it would naturally end (or because it is open-ended and does not end until asked to), simply press the pad corresponding to the running cue (or, again, click the grid cell in the web interface). The effect will be asked to end. Some effects end instantly, which will be refleced by the cue grid cell returning to its normal color. Some effects have a delayed ending, so they can fade out, or finish some musically relevant sequence. If this is happening, the grid cell will blink while the effect ends, and then stay at its normal color once the effect finishes ending. If you want the effect to end immediately you can press the pad one more time while the effect is performing its gradual ending, and it will be killed at that point, regardless of how much longer it was planning to run. [[held-flag]]Cues can also be created which run only as long as the corresponding controller pad is held down (this is done by passing a true value with the `:held` optional keyword argument when creating the cue). This is often done for intense effects like strobes. Cues can also offer pressure sensitivity on controllers which support this (like the Ableton Push and Novation Launchpad Pro). For such cues, one or more variable used by the cue can be updated by the strike and aftertouch pressure exerted by the operator as they hold down the pad. This can make for very expressive effects, as exemplified by the Sparkle cue set up early in the examples namespace's {api-doc}afterglow.examples.html#var-make-cues[`make-cues`] function, and its {api-doc}afterglow.examples.html#var-make-strobe-cue[strobe] cues. Of course, this pressure sensitivity is not possible with the web cue grid. The interface for moving around the cue grid is the diamond of arrows at the bottom right of both the web interface and the Ableton Push. If there are more cues available in a particular direction, that arrow is lit, otherwise it is dark. For the cues pictured above, the bottom left corner of the cue grid is being displayed, and there are more cues above and to the right, so the up and right scroll arrows are lit. Pressing an arrow scrolls to the next set of eight rows or columns in that direction. (And if the web view is linked to a grid controller, pressing the arrow on either will scroll both. For physical grid controllers which lack scroll buttons, linking them to the web interface is the most practical way of scrolling them.) Cues can also be triggered from simpler MIDI controllers (which don't register as grid controllers) by explicitly mapping notes or control changes sent by the controller to cues within the grid using {api-doc}afterglow.effects.cues.html#var-add-midi-to-cue-mapping[`afterglow.effects.cues/add-midi-to-cue-mapping`]. Regardless of the mechanism by which a cue is triggered, the web interface, a registered grid controller, or an explicitly mapped MIDI note or control change, feedback will be sent to all interfaces so the status of the cue will be represented consistently on all of them. And a cue triggered on one controller can be ended on any other controller by simply pressing the lit button or clicking the lit cell there. For example, to be able to trigger the Sparkle cue, which the examples namespace places at `(0, 7)` within the sample show cue grid, by pressing the bottom leftmost button on my inexpensive Korg nanoKontrol 2 MIDI controller, after using {api-doc}afterglow.midi.html#var-identify-mapping[`afterglow.midi/identify-mapping`] to determine that the button sends control-change messages for controller number `43`, I can simply evaluate: [source,clojure] ---- (cues/add-midi-to-cue-mapping "nano" 0 :control 43 0 7) ---- Now I can press the top-left pad on the Push, click the top left cell in the Web interface, or press that button on the nanoKontrol, and the Sparkle cue lights up on all three interfaces, and the effect runs and sparkles the lights. [NOTE] ==== In order to enable Afterglow to send feedback about cue status to the lights on the nanoKontrol I needed to use the Korg Kontrol Editor to set its LED Mode to _External_ (as shipped, they were in _Internal_ mode, and lit themselves when held down). Most MIDI controllers are likely to need similar configuration to work as feedback-capable cue controllers with Afterglow, but most I have seen do offer configuration tools to enable this kind of external control. ==== [[creating-cues]] == Creating Cues The {api-doc}afterglow.effects.cues.html[`afterglow.effects.cues`] namespace provides functions for creating cues. Unsurprisingly, the {api-doc}afterglow.effects.cues.html#var-cue[`cue`] function creates a cue. At its most basic, you pass in two parameters, `show-key` which is the keyword that will be used to add the cue's effect to the show when the cue is triggered, ending any other effect running under that same keyword, and `effect-fn`, which is a function that will be called when the cue is triggered, and whose responsibility is to create and return the effect that the cue should add to the show. This is done so that a fresh instance of the effect is used each time the cue is triggered, in case the effect is complex and maintains its own state. `effect-fn` will be passed a map containing any <>. NOTE: For the very common case of wanting to create a cue to activate a fixture-specific _function_ (capability), and perhaps adjust the function's activation level while it runs, you can instead call the special-purpose `function-cue` described <>. There are a number of optional keyword parameters which can be used to modify the cue that is created. Remember that you can also consult the {api-doc}afterglow.effects.cues.html#var-cue[API documentation] for another explanation of these functions, and for links to examine the source code, which is the most authoritative explanation of how they work, and can offer inspiration for variations that you might want to create yourself. [cols="1a,1a,5a", options="header"] .Keyword parameters to `cue` |=== |Parameter |Default |Purpose |`:short-name` |effect name |Sets the text to be displayed for the cue in the web cue grid, and in the text display of the controller (if it has one) when the cue is running. If you don't supply a short name, the name of the effect created by the `effect-fn` function is used, but that may be too long or not informative enough. |`:color` |white |Sets the color of the cue within the grid for hinting about its purpose and relatedness to other cues, to help operators learn and understand the interface. If not specified, white is used. |`:color-fn` |none |Specifies a function to call to obtain the current color to use for the cue within the grid, so that an dynamic/animated color can provide even more intense hinting about its purpose and relatedness to other cues, to help operators learn and understand the interface. If not specified, the static value specified by `:color` is used. The function provided will be called whenever the grid interface is being updated, and will be called with four arguments: the `cue` whose current color is desired; the map describing the currently active `effect` that was launched by that cue, if any; the `show` in which the cue and effect exist; and the metronome `snapshot` representing the moment in time at which the interface is being rendered. The function can use this information to calculate and return a color value, which will be used to draw the cue in the interface, or it can return `nil`, in which case the static `:color` value will be displayed instead. Helper functions exist to create cue color functions for commonly useful situations. {api-doc}afterglow.effects.cues.html#var-color-fn-from-cue-var[`afterglow.effects.cues/color-fn-from-cue-var`] returns a function that causes the cue to appear in the same color as a cue color parameter, whenever the cue is running and that parameter has a value. Similarly, {api-doc}afterglow.effects.cues.html#var-color-fn-from-param[`afterglow.effects.cues/color-fn-from-param`] causes the cue to appear in whatever color is returned by evaluating the specified dynamic parameter at that point within the show. The source code of those helper functions are good examples of how to create dynamic cue color functions, and the source of the {api-doc}afterglow.examples.html#var-make-strobe-cue-2[`make-strobe-cue-2`] function in the examples namespace shows how the strobe cues are configured to flash between current color of the `:strobe-color` show variable and white to emphasize their strobe nature. NOTE: When assigning a color to a cue in the user interface, the lightness of the color has no effect, because that is assigned by the controller to indicate the cue state, so you will need to use changes in hue and saturation for your animation. |`:end-keys` |none |A list of keywords that identify additional effects to be ended when launching this cue. See the dimmer cue section of {api-doc}afterglow.examples.html#var-make-cues[`make-cues`] for an example of how this can be helpful: it sets up a couple of rows of dimmer cues where the leftmost affects all the dimmers in the lighting rig, and cancels all the cues that work on individual light groups, while the individual light group dimmer cues cancel the all-dimmers cues, but leave the dimmer cues for other light groups alone. |`:priority` |`0` |Sets the effect priority used when adding the cue's effect to the show. This can be used to make sure the effect runs before or after other effects in the <>. Effects are run in order, and later effects can modify or override the results of earlier ones, like the way the Sparkle effect in {api-doc}afterglow.examples.html#var-make-cues[`make-cues`] is assigned a priority of 100 so it sorts after any chase which may be running, and its sparkles can lighten the color which would otherwise be present in their fixtures. |`:held` |`false` |As described <>, causes the cue's effect to run only as long as the corresponding controller button or pad is held down, if the controller supports that capability. All current controller implementations, including the web interface, the <>, and mappings to generic MIDI controllers created using {api-doc}afterglow.effects.cues.html#var-add-midi-to-cue-mapping[`afterglow.effects.cues/add-midi-to-cue-mapping`] do honor this setting. The web interface and controllers like the Push, which can vary the color of cue grid cells, will provide feedback that a cue will last only as long as it is held by displaying a whitened version of the cue color while it is held down. Show operators can override the `:held` flag by holding down the `Shift` key when triggering the cue on interfaces which have `Shift` keys (like the web interface and Ableton Push). This will cause the cue to run until the corresponding pad or grid cell is pressed again, and will not whiten the cue color while it is held down. |`:variables` |none |Specifies a sequence of show variable bindings that can be used by the cue's effect. Each variable specification is a map, whose content is described in the following table. These specifications are used to create any necessary new variables, and a `var-map` describing any cue-local variables is passed to the `effect-fn` function when the cue is triggered, so they can be used as needed when creating the cue's effect. See <> below for many more details. |`:visualizer` |none |A visualizer creation function that will be called by controllers with animated graphical displays like the Push 2. It will be passed two arguments, the cue's `var-map` and the `show` in which the cue is running. It must return another function which takes a metronome snapshot and returns a value between 0 and 1 representing a meaningful numerical summary of the cue state at that time. When supplied, this function will be used to create a moving strip chart of the cue's activity around the current moment on the display. The example dimmer oscillator cues like {api-doc}afterglow.examples.html#var-make-sawtooth-dimmer-cue[make-sawtooth-dimmer-cue] show how this can be used effectively. image::blade-saw.gif[Visualizer function in action,240,160] |=== The ability to create animated cue colors in a grid controller interface via the `:color-fn` key described above can come in handy when there are a lot of cues and you want some to stand out to the operator, but there are contexts in which it might be gratuitous or distracting; the example strobe and rainbow-shifting cues provided with Afterglow might tend toward that extreme. So you don't need to use it, but you can if it makes sense. It is hard to argue against the usefulness of a dynamic color that is tied to a show variable, however, like the `:strobe-color` example, or even a cue parameter, like the example global color cues, because this approach updates the grid controller interface to reflect a color chosen by the user, and so provides valuable information in a non-distracting way. [[cue-variables]] === Cue Variables As noted above, a cue can contain a map under the key `:variables` which assigns variables to the cue. These variables allow the cue to be adjusted by the show operator in convenient and powerful ways, either through the interfaces automatically presented by the Effect Control sections of the <> or <>, through velocity-sensitive grid controllers like the Push or <>, or a binding to <>. Cue Variables can either be numeric (adjusted by sliders in the web UI, or rotary encoders and faders on MIDI controllers), boolean (with corresponding simple Web and Push interfaces) or they can store colors, in which case both the web UI and <> provide a powerful interface for picking and adjusting the color. They can also be temporary, lasting only the duration of the cue, or tied to a {api-doc}afterglow.show.html#var-set-variable.21[show variable], so they can be shared between cues, and have values which last between activations of the cue. Color variables which are stored as show variables can be adjusted by <>. [cols="1a,1a,5a", options="header"] .Cue variable specification maps |=== |Key |Default |Purpose |`:key` |_n/a_ |Identifies the variable that is being bound to the cue. This can either be a keyword, and refer to an existing show variable (set using {api-doc}afterglow.show.html#var-set-variable.21[`afterglow.show/set-variable!`]), or a string, meaning that a new variable should be introduced for the cue. The actual name of this new variable will be assigned when the cue is activated. In order for the effect to be able to access the correct variable, a map is passed to the `effect-fn` function that creates the cue's effect. Within this map, the keys are keywords created from the strings passed as `:key` values in the cue's variable specification maps, and the corresponding values are the keyword of the variable that was created for the cue to go with that key. An example of using such cue-local variables can be found in the source of the {api-doc}afterglow.examples.html#var-make-strobe-cue[`make-strobe-cue`] example, for the variable `level`. That cue also makes use of the independent show variable `:strobe-color`, so that changing it in any strobe effect changes it for all of them. The color can also be set by a separate `:strobe-color` cue running a {api-doc}afterglow.effects.html#var-blank[`blank`] effect, so you can preconfigure the color while no strobes are running. These are intended to be a demonstration of interacting cues. |`:start` |`nil` |When not `nil`, specifies the value to assign to the variable when the cue starts. Most important when the value at `:key` is a string rather than a keyword, so a variable is being created just for the cue, because otherwise the variable will start out empty, and whatever effect parameter is using it will fall back to its default value. But you can also assign starting values to cue variables that are bound to regular show variables, and they will get set when the cue starts. You will probably not want to do that in cases where you are using a shared variable to adjust the appearance of many cues, unless you want the start of this cue to affect them all. If the value of `:start` is a keyword, this cue variable will be initialized with the value held in the show variable by that name when the cue begins. If it is a function, that function will be called when the cue starts to determine the starting value of the variable. Otherwise, the value is simply copied to the variable. |`:name` |variable name |Provides a name to identify the variable in the web interface and in the text area of physical controllers which provide a labeled interface for adjusting running effects, like the Ableton Push. If no name is supplied, the name of the value passed with `:key` is used; provide `:name` in cases where that would be insufficiently descriptive. |`:short-name` |none |If present, gives a shorter version of `:name` to be used in interfaces with limited space. |`:min` |`0` |Specifies the smallest value that the variable can be adjusted to, for interfaces which support adjustment of cue variables while the cue is running. If not supplied, the minimum value will be zero. |`:max` |`100` |Specifies the largest value that the variable can be adjusted to, for interfaces which support adjustment of cue variables while the cue is running. If not supplied, the maximum value will be one hundred. |`:type` |`:double` |Provides a hint for how the variable should be formatted in adjustment interfaces. Supported values are `:integer`, `:double`, `:boolean`, and `:color`. Others may be added in the future. If not provided (or an unrecognized value is provided), the variable is assumed to hold double-precision floating-point values. |`:centered` |`false` |Requests that variable adjustment interfaces which draw a graphical representation of the current value within its range display this variable as a deviation from a central value, rather than something growing from the left, if they have such options. |`:resolution` |_varies_ |Specifies the smallest amount by which the variable should be adjusted when the user is turning a continuous encoder knob. If not specified, the controller implementation gets to decide what to do. The recommended default resolution is no larger then 1/256 of the range from `:min` to `:max`. |`:velocity` |`false` |If present, with a true value, requests that the variable value be adjusted by strike and aftertouch pressure while the operator is holding down the button or pad which launched the cue, on controllers which have pressure sensitivity. |`:velocity-min` |`:min` |If present (and `:velocity` is active), specifies the smallest value the variable should be set to by MIDI strike velocity and aftertouch pressure. If not specified, the standard `:min` value is used. |`:velocity-max` |`:max` |If present (and `:velocity` is active), specifies the largest value the variable should be set to by MIDI strike velocity and aftertouch pressure. If not specified, the standard `:max` value is used. |=== ==== Using Cue Variables The purpose of cue variables is to define a user interface for the show operator, either in the web interface, or on a rich MIDI controller like the Ableton Push. The web UI and controller implementations look at the variable specifications as you have set them up, and build interface elements accordingly when the cue is running. The running effect looks up the variable values when it needs them, and adjusts itself appropriately. If the cue is configured to use any temporary variables (which are indicated by using strings rather than keywords for their `:key` entry), the effect needs to know how to look them up. That's the purpose of the `var-map` argument which gets passed to `effect-fn`. It contains a mapping from the keyword version of the temporary variable's name to the actual keyword of the temporary variable that was created to hold its value for the duration of the cue. For example, a cue with a temporary variable named "color", defined by including `:key "color"` in the cue variable specification, might be assigned a temporary variable with the actual name `:cue-3-9-temp-color`. The `var-map` passed to `effect-fn` would have an entry `:color :cue-3-9-temp-color` to let it know about this assignment. So `effect-fn` can find the actual variable keyword to use for its effects that want to access its `:color` variable by looking up that keyword in `var-map` [source,clojure] ---- (:color var-map) ---- The above function call would return `:cue-3-9-temp-color` in this example scenario. There are many examples of cues using permanent and temporary variables in the `afterglow.examples` namespace. Several of them take advantage of the helper function {api-doc}afterglow.effects.cues.html#var-apply-merging-var-map[`apply-merging-var-map`] which provides a very convenient shortcut: If the effect that you want to call makes use of keyword arguments, name your temporary cue variables the same as those keyword arguments, and you can then simply use `apply-merging-var-map` to build the function call to the effect, passing in the cue variables (and their values) as the keyword arguments and values that configure the effect. [[a-cue-example]] ==== A Cue Example As a simple illustration, here is how to wrap the blue and red scene from the <> into a cue, and add it to the show grid, so it can be started and stopped from a grid controller or the web interface. This cue has no variables, so the effect-creation function ignores its argument (this is reflected by using the conventional Clojure “don't care” name for it, `_`, rather than `var-map`): [source,clojure] ---- (ct/set-cue! (:cue-grid *show*) 0 17 (cues/cue :color (fn [_] (afterglow.effects/scene "Blue and red 2" (afterglow.effects.color/color-effect "Plain red" (create-color "red") (show/fixtures-named "odd")) (afterglow.effects.color/color-effect "Plain Blue" (create-color "blue") (show/fixtures-named "even")))))) ---- [[creating-function-cues]] == Creating Function Cues Often you want a cue to activate a specific feature of a fixture (often described as a _function_ in the fixture manual, and in the fixture definition within Afterglow, which can unfortunately get confusing when we are talking about invoking Clojure functions). To make it easy to work with such fixture capabilities, the `afterglow.effects.cues` namespace also offers the {api-doc}afterglow.effects.cues.html#var-function-cue[`function-cue`] function. It is quite similar to the `cue` function described <>, but it takes care of creating the effect for you, given the function name you want to apply to a fixture or set of fixtures. You can even apply the function to fixtures from different manufactures, regardless of whether they implement it on different channels and with different value ranges. If it has been assigned the same function name (such as, for example, `:strobe`), Afterglow will find it in each fixture definition, and send the right values to each fixture. NOTE: Function cues are able to figure out how to do the right thing for each fixture because they can scan the fixture definitions for <> matching the keyword you gave when creating the cue. When you patch a fixture into a show, Afterglow indexes its function ranges in order to make this efficient. `function-cue` also automatically creates a temporary cue-local variable for <> the function level if the function is not fixed over its range. This makes it essentially a one-liner to create a button in your cue grid which activates a function and then, via the web interface or if your controller supports it, lets you tweak that function while is running. Examples include the Torrent gobo, focus, and prism cues created by {api-doc}afterglow.examples.html#var-make-cues[`make-cues`]. Minimally, `function-cue` requires three parameters: `show-key` which is the keyword that will be used to add the cue's effect to the show when the cue is triggered, ending any other effect running under that same keyword, `function`, which is the keyword identifying the fixture-specific capability that you want the cue to activate and control, as defined in the fixture definition, and `fixtures`, which is the list of fixtures or heads that you want the cue to affect. (Only fixtures and heads which actually support the specified function will be affected by the cue.) There are a number of optional keyword parameters which can be used to modify the cue that is created, and are described below. See the {api-doc}afterglow.effects.cues.html#var-function-cue[API documentation] for more details. [cols="1a,1a,5a", options="header"] .Keyword parameters to `function-cue` |=== |Parameter |Default |Purpose |`:effect-name` |function name |Sets the name to assign the effect created by the cue. If none is provided, the name of the `function` keyword is used. |`:short-name` |none |Can be used to provide a shorter name to be displayed for the cue in the web cue grid, and in the text display of the controller (if it has one) when the cue is running. |`:color` |white |Sets the color of the cue within the grid for hinting about its purpose and relatedness to other cues, to help operators learn and understand the interface. If not specified, white is used. |`:color-fn` |none |Specifies a function to call to obtain the current color to use for the cue within the grid, so that an dynamic/animated color can provide even more intense hinting about its purpose and relatedness to other cues, to help operators learn and understand the interface. If not specified, the static value specified by `:color` is used. The function provided will be called whenever the grid interface is being updated, and will be called with four arguments: the `cue` whose current color is desired; the map describing the currently active `effect` that was launched by that cue, if any; the `show` in which the cue and effect exist; and the metronome `snapshot` representing the moment in time at which the interface is being rendered. The function can use this information to calculate and return a color value, which will be used to draw the cue in the interface, or it can return `nil`, in which case the static `:color` value will be displayed instead. Helper functions exist to create cue color functions for commonly useful situations. {api-doc}afterglow.effects.cues.html#var-color-fn-from-cue-var[`afterglow.effects.cues/color-fn-from-cue-var`] returns a function that causes the cue to appear in the same color as a cue color parameter, whenever the cue is running and that parameter has a value. Similarly, {api-doc}afterglow.effects.cues.html#var-color-fn-from-param[`afterglow.effects.cues/color-fn-from-param`] causes the cue to appear in whatever color is returned by evaluating the specified dynamic parameter at that point within the show. The source code of those helper functions are good examples of how to create dynamic cue color functions, and the source of the {api-doc}afterglow.examples.html#var-make-strobe-cue-2[`make-strobe-cue-2`] function in the examples namespace shows how the strobe cues are configured to flash between current color of the `:strobe-color` show variable and white to emphasize their strobe nature. NOTE: When assigning a color to a cue in the user interface, the lightness of the color has no effect, because that is assigned by the controller to indicate the cue state, so you will need to use changes in hue and saturation for your animation. |`:level` |`0` |If provided, and the function supports a range of values with different meanings (such as a focus range, movement speed, or the like), sets the initial level to assign the function, and to the variable which will be introduced to allow the function value to be adjusted while the cue runs. Functions with no variable effect will ignore `:level`, and will have no cue-specific variables created for them. The level is treated as a percentage, where 0 is mapped to the lowest DMX value that activates the function, and 100 is mapped to the highest. |`:htp` |`false` |If supplied along with a true value, causes the effect that is created for this cue to operate with _highest-takes-precedence_ rules with respect to any other effect which has already assigned a value for this function. Otherwise, the effect will simply discard any previous assignments, replacing them with its own regardless of their value. |`:end-keys` |none |A list of keywords that identify additional effects to be ended when launching this cue. See the dimmer cue section of {api-doc}afterglow.examples.html#var-make-cues[`make-cues`] for an example of how this can be helpful: it sets up a couple of rows of dimmer cues where the leftmost affects all the dimmers in the lighting rig, and cancels all the cues that work on individual light groups, while the individual light group dimmer cues cancel the all-dimmers cues, but leave the dimmer cues for other light groups alone. |`:priority` |`0` |Sets the effect priority used when adding the cue's effect to the show. This can be used to make sure the effect runs before or after other effects in the <>. Effects are run in order, and later effects can modify or override the results of earlier ones, like the way the Sparkle effect in {api-doc}afterglow.examples.html#var-make-cues[`make-cues`] is assigned a priority of 100 so it sorts after any chase which may be running, and its sparkles can lighten the color which would otherwise be present in their fixtures. |`:held` |`false` |As described <>, causes the cue's effect to run only as long as the corresponding controller button or pad is held down, if the controller supports that capability. All current controller implementations, including the web interface, the <>, and mappings to generic MIDI controllers created using {api-doc}afterglow.effects.cues.html#var-add-midi-to-cue-mapping[`afterglow.effects.cues/add-midi-to-cue-mapping`] do honor this setting. The web interface and controllers like the Push, which can vary the color of cue grid cells, will provide feedback that a cue will last only as long as it is held by displaying a whitened version of the cue color while it is held down. Show operators can override the `:held` flag by holding down the `Shift` key when triggering the cue on interfaces which have `Shift` keys (like the web interface and Ableton Push). This will cause the cue to run until the corresponding pad or grid cell is pressed again, and will not whiten the cue color while it is held down. |`:velocity` |`false` |If present, with a true value, requests that the function value be adjusted by MIDI velocity and aftertouch pressure while the operator is holding down the button or pad which launched the cue, on controllers which have pressure sensitivity. |`:velocity-min` |`0` |If present (and `:velocity` is active), specifies the smallest value the function should be set to by MIDI velocity and aftertouch pressure. If not specified, `0` is used, which corresponds to the lowest legal DMX value the fixture definition identifies for the function. |`:velocity-max` |`100` |If present (and `:velocity` is active), specifies the largest value the variable should be set to by MIDI velocity and aftertouch pressure. If not specified, `100` is used, which corresponds to the highest legal DMX value the fixture definition identifies for the function. |=== [[creating-code-cues]] == Creating Code Cues It can be convenient to use a cue grid to trigger arbitrary actions which have nothing directly to do with lighting effects. For example, if your grid controller doesn't have a dedicated button for resetting the show metronome, you might want to use one of the cue grid cells for that purpose. The {api-doc}afterglow.effects.cues.html#var-code-cue[`code-cue`] function makes this easy. It creates a cue that does nothing other than call the function you supply, one time, when the cue is launched. Your function must take two arguments, because it will be called with the show and metronome snapshot when the cue starts. The function must also return right away, since it's run as part of the effect rendering pipeline. If you need to do something that could take a while, you will need to do that on a different thread. Your function is passed as the first argument to `code-cue`, and you must also supply a string as the second argument; this will be used to label the cue when it is assigned to a cue grid with text capabilities, to identify its purpose. As with other cues, you can also provide an optional keyword argument `:color` along with a color specification, to request that the cue grid use that color for the cell holding this cue. The cue will be configured to end when you let go of the cue pad, because it doesn't do anything after calling your function once when it is first launched. As a concrete example, here is how to create a code cue that restarts the show metronome when it is launched: ```clojure (ct/set-cue! (:cue-grid *show*) 0 0 (cues/code-cue (fn [show snapshot] (rhythm/metro-start (:metronome show) 1)) "Reset")) ``` [[controlling-cues]] == Controlling Cues The {api-doc}afterglow.controllers.html[`afterglow.controllers`] namespace defines some helpful functions for working with cues, and defines a {api-doc}afterglow.controllers.html#var-IGridController[grid controller protocol] which rich controller mappings, like the ones for the <> and <>, use to attach themselves to a running show, and synchronize with the web interface. If you are implementing a new grid controller mapping, you will want to study that protocol, and will likely find the Novation Launchpad family and Ableton Push mappings to be useful examples and starting points for your own work. (And please, when you are done, submit a pull request to add your implementation to Afterglow!) When you are setting up the cue grid for your show, you will use {api-doc}afterglow.controllers.html#var-set-cue.21[`set-cue!`] to arrange the cues you want it to contain. The {api-doc}afterglow.examples.html#var-make-cues[`make-cues`] function in the examples namespace contains a lot of examples of doing this. As cues are added to the grid, its dimensions are updated, and the web interfaces and any registered grid controllers will immediately reflect the new cue and dimensions. You can remove a cue from the grid with {api-doc}afterglow.controllers.html#var-clear-cue.21[`clear-cue`]. === Digging Deeper The rest of the functions in the `afterglow.controllers` namespace are used by controller implementations and running shows to mediate their interactions with the cue grid; dig into them if you are writing code in those spaces. ================================================ FILE: doc/modules/ROOT/pages/effects.adoc ================================================ = Effects James Elliott Effects determine what a light or group of lights are doing at a given moment in time. == Overview This section starts out by describing the basic effect types which act as building blocks for an Afterglow light show, then goes on to introduce the <> and <> that you can use to group and sequence these building blocks into a show that evolves over time, driven by the show's metronome. When creating an effect, you assign one or more <> to it, and it will generate control values for only those fixtures. The fixture channels that will be manipulated by the effect depend on the kind of effect it is, and are grouped into several primary categories. The simplest kinds of effects apply to a single channel per fixture, or perhaps per head, if the fixture has multiple independent light-emitting heads. A very common single-channel effect is the <>. Many effects assign <> to lights, which often involves multiple channels. RGB fixtures will use three channels, one each for the red, green, and blue levels which make up the color. Some fixtures add other LED colors, such as amber, white, and even ultraviolet. Other fixtures simply use a rotating color wheel to pick from a fixed set of colors, using a single channel. Regardless of how the color is finally produced, at most stages of effect processing, Afterglow works in terms of the <>, allowing you to blend, lighten, darken, shift hue, and the like so you can produce interesting looks, without regard to details of fixture implementation. It is only at the <> that the color is broken down into channel assignments. Another important category of effects control the <> of moving-head fixtures. These work in terms of a desired 3D direction vector or <> with respect to the <>, and at the last stage of rendering, convert that to pan and tilt channel values, with reference to the angle at which the fixture has actually been hung. You can also conveniently use features which are shared by a number of fixtures, or completely unique to a single fixture, through <>, or drop right down to the level of individual DMX channel values with <>. As mentioned above, there are a number of ways to combine these effects. If you have a group of effects that you want to start and stop at the same time, you can group them into a <>. To smoothly transition from one effect to another you can use a <>, and either side of the fade can be a scene. Or you can fade to or from a <>, or sequence a whole list of effects or scenes using a <>. <> and <> are designed to make it easy for effects to influence and interact with each other by responding to and setting show variables. Finally, Afterglow includes some examples of how to build up <>, which can be fun in themselves, and also serve as templates and inspiration for whole new kinds of effects you create on your own. [[basic-effect-types]] == Basic Effect Types Effects in afterglow are divided by the aspect of a light that they control. Not all fixtures have features which allow them to participate in all kinds of effects. Afterglow effects will simply ignore fixtures which are unable to reapond to them. [[dimmer-effects]] === Dimmer Effects Dimmer effects set the basic brightness level of a fixture. To create an effect that will set the dimmer level of a fixture, use: [source,clojure] ---- (afterglow.effects.dimmer/dimmer-effect level fixtures) ---- This effect finds all the dimmer channels associated with the specified fixtures (there may be multiple, if the fixture has more than one light-emitting head), and assigns them a level. 0 is off, 255 is maximum brightness. Dimmer effects can work with either fully dedicated dimmer channels (in which case the channel itself has a `:type` of `:dimmer`, and the entire DMX range is used for dimming), or multipurpose channels in which a subset of the DMX range is assigned to a function of type `:dimmer`, and the channel `:type` is something else. If `htp?` is true, uses highest-takes-precedence rules when replacing any earlier or lower-priority effects which attempted to set this particular dimmer in the current rendering cycle. In other words, if an earlier effect chose a higher value, let it win, otherwise use the value this effect wants. The {api-doc}afterglow.effects.dimmer.html#var-dimmer-effect[API documentation] also identifies some optional keyword arguments you can pass. If `:htp?` passed with a `false`, value this effect will simply overwrite any previous assignments it finds for the dimmers it is controlling. Omitting `:htp?` is the same as passing it with a `true` value. And you can change the {api-doc}afterglow.effects.dimmer.html#var-master[`master`] that scales the dimmer value by passing one along with `:master`. If you do not, the effect will be tied directly to the show's grand master. TIP: If you want your dimmer cue to affect only one head of a fixture, you can pass it just that head, rather than the entire fixture. For some fixtures, generally those with a single, white light source, the dimmer is the only thing that determines the amount of light output. For color-mixing fixtures like RGB LED lights, each color channel has its own separate brightness level, and then dimmer scales the actual output of the light, so the final brightness will be a combination of both. In other words, if the red channel is set to 50% brightness, and the dimmer is also set to 50% brightness, the final red output will be at 25% brightness. In addition to passing in a literal number for the `level` parameter, you can pass a <> whose value depends on a <>, the physical location or orientation of the head, or a show variable, perhaps <> to a MIDI control surface. It often makes sense to use <> with dimmer cues. TIP: If you have color effects running for a light and you aren’t seeing anything, make sure you have a dimmer effect setting the dimmer to some visible level. And if the fixture has a shutter (either physical or electronic), you may need an effect running to open that as well. [[virtual-dimmers]] ==== Virtual Dimmers Although most RGB color-mixing fixtures have a dimmer channel which is separate from the color component intensity channels, we have encountered a few that lack this feature: they have only a red, green, and blue channel, with no overall dimmer. In order to accommodate fixtures like this, and enable them to participate in dimmer effects for more flexible show control, Afterglow now can provide _virtual dimmers_ for them. To use this feature, pass the optional argument `:add-virtual-dimmers?` with a `true` value to `dimmer-effect`. NOTE: As explained below, when using virtual dimmers you must also turn off highest-takes-precedence dimmer mixing by passing `false` with the `:htp?` optional keyword argument, and add your dimmer effect to the show with a higher priority than any color effects running on the fixtures that lack real dimmers, so it can run after them and manipulate their results. Since virtual dimmers do not have an actual separate dimmer channel to work with, they are actually <> which work by modifying the result of whatever other color effect you have established for the dimmer-lacking fixtures. When you tell `dimmer-effect` that `add-virtual-dimmers?` is `true`, it will scan the list of fixtures whose dimmers it is supposed to control, and in addition to creating ordinary dimmer effects for fixures with dimmers, it will create special color effects for any fixtures that can mix RGB colors but lack dimmers. These color effects will act as virtual dimmers: they will look at the color value that has been established for the fixture, and darken it as needed in order to reflect the dimmer level of the dimmer effect that created them (scaled by the dimmer master chain, just like regular dimmer effects). This dimmed version of the color will replace the one that came from the other effects, and the visible result will be the same as if the fixtures had dimmer channels. In order for the virtual dimmer effect to be able to modify the other color effects, it needs to run after them. So you need to be sure when you are adding virtual dimmer effects to the show to assign them a higher priority value than the color effects they will be working with. Because the virtual dimmer color adjustment is a destructive operation, and the color channels have no direct access to the dimmer level information once it is complete, virtual dimmers cannot be combined with each other in a “highest takes precedence” style. So when you need to use virtual dimmers, you must set `:htp?` mode to `false` in `dimmer-effect`, or the function will throw an exception. You should also not try to run more than one dimmer effect with virtual dimmers on the same fixtures at the same time, because each one will darken them, giving you different results than actual dimmers do. Even with these restrictions, virtual dimmers can address most of the limitations of fixtures that lack actual dimmer channels, and allow them to participate as nearly first-class citizens of Afterglow's dimmer effects. [[color-effects]] === Color Effects One of the most common basic effects you will be using to create the looks you want is the color effect. To create an effect that will assign a color to a fixture (which will assign colors to all of the fixture’s heads), or a single head of a fixture, pass the fixture or head to {api-doc}afterglow.effects.color.html#var-color-effect[`color-effect`]: [source,clojure] ---- (afterglow.effects.color/color-effect name color fixtures) ---- The `name` parameter is intended to help identify the purpose of the effect, and shows up when examining the created effect. Put something descriptive in there, or use a helper function like {api-doc}afterglow.examples.html#var-global-color-effect[`afterglow.examples/global-color-effect`] which builds the effect for you, figuring out a reasonable name in many cases. The `color` parameter is where you specify the color to assign to the lights. It should be a color object returned by one of the factories in the https://github.com/jolby/colors[jolby/colors] library, as described in <>. In addition to passing in a color for the `color` parameter, you can pass a <> whose value depends on a <>, the physical location or orientation of the head, or a show variable, perhaps <> to a MIDI control surface. The flexibility offered by <> is huge, especially when combined with <>. Learning how to effectively leverage these in combination with each other will enable you to create most of the basic lighting looks you need. The following code creates a effect that assigns a pure red color to all fixtures with RGB channels, then adds it to the current show under the keyword `:color`: [source,clojure] ---- (show/add-effect! :color (afterglow.effects.color/color-effect "Plain red" (create-color "red") (show/all-fixtures))) ---- TIP: Remember that if aren’t seeing anything when you have assigned color effects to a fixture to make sure you also have a dimmer effect setting that fixture’s dimmer to some visible level. And if the fixture has a shutter (either physical or electronic), you may need an effect running to open that as well. You can also assign colors to lights that use color wheels instead of RGB mixing by passing a `true` value with the optional keyword argument `:include-color-wheels?` to `color-effect`. Afterglow will try to find a color wheel position which is close enough to the desired color, and if one can be found, tell the light to use it. [[multiple-colors]] ==== Multiple Colors You can assign different color effects to different sets of fixtures even just using simple single-color effects, by combining them into a <>, which is explained more fully below, but worth mentioning now. Here is an example of how to assign a red color to odd fixtures and blue to even fixtures (assuming you have named the fixtures even-_number_ and odd-_number_): [source,clojure] ---- (show/add-effect! :color (afterglow.effects/scene "Different colors" (afterglow.effects.color/color-effect "Plain red" (create-color "red") (show/fixtures-named "odd")) (afterglow.effects.color/color-effect "Plain Blue" (create-color "blue") (show/fixtures-named "even")))) ---- The Cues documentation <> to show how to wrap this scene into a cue, for easy control by a light show operator. TIP: There are many other ways to achieve multi-colored effects, ranging from <> up to writing your own custom <>. You can also group fixtures any way you want, independently of how you name them, by storing sets of them in variables and passing those sets, or combinations of those sets created using Clojure's rich http://clojure.github.io/clojure/clojure.set-api.html[set-manipulation API], to the effect-creation functions. [[direction-effects]] === Direction Effects Moving-head fixtures can create particularly exciting and dynamic shows. To create an effect that will tell a fixture or head what direction it should be pointing, pass the fixture or head to: [source,clojure] ---- (afterglow.effects.movement/direction-effect name direction fixtures) ---- The `name` parameter is intended to help identify the purpose of the effect, and shows up when examining the created effect. The `direction` parameter is where you specify the direction the lights should be pointing. It is a `javax.vector.Vector3d` pointing in the direction the lights should face, with respect to the show’s <>. An easy way to create one is to call {api-doc}afterglow.effects.params.html#var-build-direction-param[`afterglow.effects.params/build-direction-param`] or {api-doc}afterglow.effects.params.html#var-build-direction-param-from-pan-tilt[`afterglow.effects.params/build-direction-param-from-pan-tilt`]. These can create static vectors for you, but can also create <> whose value depends on a <>, the physical location or orientation of the head, or a show variable, perhaps <> to a MIDI control surface. Building dynamic direction parameters with <> can create fascinating motions. If a group of fixtures is assigned the same direction effect, they will all face the same direction. If they are assigned the same aim effect (below), they will all face slightly different directions in order to aim at the same point in space. TIP: Because of the fact that the direction vector must be translated into pan and tilt angles before sending it to control the light, fades between directions might not always work the way you expect them to. This is especially true if the directions you are fading between are exact opposites of each other: In that case, the angle does not change at all during the fade until the midpoint, when it reaches the center of the light, and the light instantly flips around to face the opposite direction for the rest of the fade. You can also run into issues where one of the directions you are fading is close to a geometric singularity (when one of the angles gets near 90°), at that point the other direction will suddenly dominate, and you can see unexpected jiggling or changes in direction. For such cases you may be better off using lower-level <>, which operate closer to the way the lights themselves do. [[aim-effects]] === Aim Effects These are very similar to <>, except they tell each fixture to aim at a particular point in space, such as an object or person in front of the lighting rig, or perhaps another fixture. To create an effect that will tell a fixture or head what point it should be aiming at, pass the fixture or head to: [source,clojure] ---- (afterglow.effects.movement/aim-effect name target-point fixtures) ---- The `name` parameter is intended to help identify the purpose of the effect, and shows up when examining the created effect. The `target-point` parameter is where you specify the point at which the lights should be aiming. It is a `javax.vector.Point3d` identifying a point within the show’s <>. An easy way to create one is to call {api-doc}afterglow.effects.params.html#var-build-aim-param[`afterglow.effects.params/build-aim-param`]. This can create static points for you, but can also create <> whose value depends on a <>, the physical location or orientation of the head, or a show variable, perhaps <> to a MIDI control surface. Using a tablet with an OSC or midi interface that lets you drag an aiming point around a map of the stage is one fun possibility. If a group of fixtures is assigned the same direction effect, they will all face the same direction. If they are assigned the same aim effect, they will all face slightly different directions in order to aim at the same point in space. [[pan-tilt-effects]] === Pan/Tilt Effects These are essentially the same as <>, except they use a pan and tilt angle to tell the fixtures which way to face, so they are closer to the way the lights naturally work, will be more familiar to light show designers, and can behave more smoothly and predictably when fading into each other. To create an effect that will tell a fixture or head what direction it should be pointing via pan and tilt angles, pass the fixture or head to: [source,clojure] ---- (afterglow.effects.movement/pan-tilt-effect name pan-tilt fixtures) ---- The `name` parameter is intended to help identify the purpose of the effect, and shows up when examining the created effect. The `pan-tilt` parameter is where you specify the angles in which the lights should be aiming. It is a `javax.vector.Vector2d` whose `x` component contains the `pan` angle, and whose `y` component contains the `tilt` angle. These angles tell the fixture how far, in radians, it should rotate away from pointing straight out at the audience (along the `z` axis of the show’s <>). An easy way to create the pan-tilt vector is to call {api-doc}afterglow.effects.params.html#var-build-pan-tilt-param[`afterglow.effects.params/build-pan-tilt-param`]. This function also allows you to work in degrees rather than radians, if that is more convenient. It can create static angle vectors for you, but can also create <> whose value depends on a <>, the physical location or orientation of the head, or a show variable, perhaps <> to a MIDI control surface. Because when you fade between pan-tilt effects, the angles always change smoothly, and correspond to the actual movements of the lights, they can be easier building blocks for natural-looking movement effects when you aren't trying to track particular points in space. If a group of fixtures is assigned the same pan-tilt or direction effect, they will all face the same direction. If they are assigned the same aim effect, they will all face slightly different directions in order to aim at the same point in space. [[function-effects]] === Function Effects Fixtures have a wide variety of different capabilities, often more than would be reasonable to assign a separate DMX channel for each, especially when it does not make sense to activate or control some at the same time. Afterglow can be told about these in the <>, and you can control them using function effects, by specifying the name of the function you want to activate, and a _percentage_ (a value between `0` and `100`) by which you want it activated. (The percentage will be translated to the corresponding value within that function’s valid DMX range that Afterglow should send). For example, many fixtures have a strobe function, which causes them to flash off and on at a particular speed. The following line shows how to cause them all to strobe at their fastest speed: [source,clojure] ---- (show/add-effect! :strobe (afterglow.effects.channel/function-effect "Fastest strobe" :strobe 100 (show/all-fixtures))) ---- With this effect active, any fixture with a `:strobe` function range will be sent the highest value defined for that range, on the channel on which the function exists, causing it to strobe rapidly. Fixtures which lack such a function will be unaffected. Function effects can be very specific to individual fixtures. For example, the Blizzard Torrent F3 has a pair of gobo wheels; one of them has a gobo that projects something that looks like a fat atom with electrons orbiting it. This projection can be selected, and caused to jiggle back and forth at the mid-range of possible shake speeds, by adding the following effect: [source,clojure] ---- (show/add-effect! :gobo-fixed (afterglow.effects.channel/function-effect "Brownian motion?" :gobo-fixed-atom-shake 50 (show/fixtures-named "torrent"))) ---- Depending on how far away the projection is landing, it may be very blurry; focus can be adjusted like so: [source,clojure] ---- (show/add-effect! :focus (afterglow.effects.channel/function-effect "focus" :focus 95.5 (show/fixtures-named "torrent"))) ---- The functions available for a fixture, their names, channels, and ranges, are specified by the <>, so reading over those can be helpful. (And carefully crafting and testing them is important when defining a new fixture.) Trying to maintain consistency in function naming is valuable in allowing functions to be conveniently applied to groups of different fixtures. Functions which do not vary in their effect for different DMX values within the legal range are described as `:range :fixed` in the fixture definition; this is currently only used for displaying the interpretation of a fixture setting, you still need to provide a percentage within the range when setting up the function effect. Fixture definitions can also supply a _scaling function_ for a function specification, which maps input values to the final percentage within the DMX range. This is helpful, for example, to allow strobe settings to be interpreted as approximate Hz values, so fixtures from different manufacturers can be asked to strobe at roughly the same rate for the same function setting. You can view the source of the {api-doc}afterglow.fixtures.blizzard.html[Blizzard fixture definitions] for examples of how this is done, passing the minimum and maximum Hz strobe rates of the actual fixture to create a partial implementation of {api-doc}afterglow.effects.channel.html#var-function-value-scaler[`afterglow.effects.channel/function-value-scaler`] which is passed the value that the effect is trying to establish, and converts it to a position in that fixture’s range which attempts to approximate that strobing rate. [[channel-effects]] === Channel Effects When you just want to send a specific number to a particular DMX channel, you can drop right down to the bottom level with channel effects. For example, to pin the dimmer channel of a group of fixtures to 55, regardless of the setting of the show’s master chain, you could do something like this: [source,clojure] ---- (show/add-effect! :blade-dimmers (afterglow.effects.channel/channel-effect "Blade dimmers" 55 (afterglow.channels/extract-channels (show/fixtures-named :blade) #(= (:type %) :dimmer)))) ---- Or to look at what actual pan values do to a Torrent, without fancy geometric transformations, as you set values into the show variable named `:pan`: [source,clojure] ---- (show/add-effect! :pan-torrent (afterglow.effects.channel/channel-effect "Pan Torrent" (params/build-variable-param :pan) (afterglow.channels/extract-channels (show/fixtures-named :torrent) #(= (:type %) :pan)))) ---- You will most likely be wanting to do this sort of thing for channel types which Afterglow does not yet have a more sophisticated understanding, and then perhaps you will end up creating a whole new category of effects as your experimentation progresses. [[compound-effects]] == Compound Effects The most straightforward way to create interesting shows is to combine multiple simple effects in different ways. Compound effects are tools which enable that. [[scenes]] === Scenes The simplest way to build a compound effect is to combine a group of effects into one which can be started and stopped as a unit. That is the purpose of the {api-doc}afterglow.effects.html#var-scene[`scene`] function in the `afterglow.effects` namespace. It takes a name for the scene to be created, followed by one or more effects to be grouped, and returns an effect which combines them all under that name: [source,clojure] ---- (show/add-effect! :color (afterglow.effects/scene "Blue Sparks" (afterglow.examples/global-color-effect :blue) (fun/sparkle (show/all-fixtures) :chance 0.07 :fade-time 500))) ---- Assuming you are running the sample show and have the dimmers up, you'll see all the lights turn blue, and a random pattern of white <> twinkling across them. Ending the scene effect will end both underlying effects in a coordinated fashion (the blue color effect will linger as the last sparkles fade out). [[blank-effects]] === Blank Effects A blank effect does nothing at all. Although this might not immediately seem useful, assigning a blank effect to one side or the other of a <> (below) lets you fade an effect in or out, from or to nothing. In such cases the fade also takes care that as it fades towards the blank effect, whatever effects were being replaced by the fade are restored. To create a blank effect, simply call the {api-doc}afterglow.effects.html#var-blank[`blank`] function in the `afterglow.effects` namespace. You might also want to create a blank effect as part of a cue whose purpose is simply to provide a way to adjust a show variable. The <> discussion provides an example of doing just that. [[fades]] === Fades A fade effect lets you smoothly transition from one effect to another, blending a weighted combination of each. The {api-doc}afterglow.effects.html#var-fade[`fade`] function in the `afterglow.effects` namespace supports this. It takes a name for the fade to be created, followed by `from-effect` and `to-effect`, the two effects to be faded between, and a `phase` parameter which controls how much of each effect is seen. It returns the blended effect. TIP: For the common case of wanting to fade in an effect when you start it, and then fade it back out when you tell it to end, see <<#fading-in-and-out,Fading In and Out>>. When the value of `phase` is `0` (or less), the fade acts as if it is simply `from-effect`. When `phase` is `1` (or more), the fade behaves identical to `to-effect`. When `phase` falls somewhere between `0` and `1`, a corresponding linear blend between `from-effect` and `to-effect` is created. At the value `0.5`, each effect contributes the same amount. Either or both of the effects being faded between can be a <>, which groups many other effects, or one can be a <>, which will simply fade the other effect in or out of existence (allowing any earlier or lower-priority effects to show through). When fading between two non-blank effects, if they include different groups of fixtures (or affect different aspects of the fixtures they do include), the same notion of “seeing what is underneath” the fade applies, as the side which is controlling a particular fixture or feature is faded out. The `phase` parameter can (and usually will) be a dynamic parameter, probably a <> or <>, so the fade will take place over time, or under the control of an operator using a control surface. Here is an example of a very simple fade cue from the sample show: [source,clojure] ---- (show/set-cue! 4 7 (cues/cue :color-fade (fn [var-map] (fx/fade "Color Fade" (global-color-effect :red :include-color-wheels? true) (global-color-effect :green :include-color-wheels? true) (params/bind-keyword-param (:phase var-map 0) Number 0))) :variables [{:key "phase" :min 0.0 :max 1.0 :start 0.0 :name "Fade"}])) ---- This fades all the lights from red to green as the cue's encoder is turned. Switching either color effect to `(blank)` would insted fade to or from whatever color the fixtures were otherwise displaying at the time. [[fading-in-and-out]] === Fading In and Out Sometimes you would like an open-ended effect to fade in when you launch it, and then fade out when you ask it to end. To facilitate this, Afterglow includes a special compound effect you can wrap around any other effect to implement this behavior, building on the fade mechanism described <<#fades,above>>. This is built using the {api-doc}afterglow.effects.html#var-wrap-fade-in-out[`wrap-fade-in-out`] function in the `afterglow.effects` namespace. This function takes a name for the wrapped effect, and the effect you want to wrap with fade-in and fade-out behavior. By default it will fade in and out over a beat, but you can change that by passing keyword arguments `:step-in` and/or `:step-out` to configure the <> that will be used to manage the two fades. The values you pass with these arguments are maps that will be merged onto `{:fade-fraction 1.0}` and then passed to {api-doc}afterglow.effects.params.html#var-build-step-param[`afterglow.effects.params/build-step-param`] to build the step functions that control the fade in and fade out process. The most likely arguments you would want to use to adjust these fades are `:interval` and `:interval-ratio`. Here is an example of how, in the sample show, you could wrap a dimmer cue so that it fades in over two beats, and fades out over half a beat: [source,clojure] ---- (show/set-cue! 7 0 (cues/cue :dimmer (fn [var-map] (fx/wrap-fade-in-out "Fade Test" (dimmer-effect (params/bind-keyword-param (:level var-map 255) Number 255) (show/fixtures-named :ws)) :step-in {:interval-ratio 2} :step-out {:interval-ratio (/ 1 2)})) :variables [{:key "level" :min 0 :max 255 :start 255}])) ---- > You can omit the `:step-in` and `:step-out` lines if the default of > fading over a single beat is what you want. [[chases]] === Chases Chase effects allow you to sequence a series of effects one after another, with optional <> between them. They are built using the {api-doc}afterglow.effects.html#var-chase[`chase`] function in the `afterglow.effects` namespace. Of course each effect within the chase can itself be a <>, which groups many other effects, or a <>, which will simply fade the chase temporarily out of existence (allowing any earlier or lower-priority effects to show through). When fading between two non-blank effects, if they include different groups of fixtures (or affect different aspects of the fixtures they do include), the same notion of “seeing what is underneath” the fade applies, as the side which is controlling a particular fixture or feature is faded out. In addition to the list of effects which make up the chase, a `position` parameter is used to create it. When the effect is rendered, the current value of this parameter is an index into the effects that make up the chase, and it controls which one is currently visible. When `position` is `1`, the first effect in `effects` is active; `2` causes the second to be seen, and so on. Non-integer values are how fades are accomplished, they result in a linear blend between the corresponding effects. In order to make the chase evolve over time, `position` needs to be a dynamic variable parameter, and <>, created by the function {api-doc}afterglow.effects.params.html#var-build-step-param[`afterglow.effects.params/build-step-param`], are designed specifically to work with chases. With no other arguments, the chase will end when `position` has a value less than zero, or greater than the number of elements in `effects` plus one. Values between `0` and `1` fade into the first effect from nothing, and as the value grows above the number of entries in `effects`, it begins to fade out the final effect. A chase can be made open-ended by supplying a value with the optional keyword argument `:beyond`. The default value, `:blank`, causes the behavior described in the previous paragraph. If `:beyond` is supplied with the value `:loop`, the chase will act as if the `effects` list contained an infinite number of copies of itself. So when `position` grows past the final index, the last effect in the list fades back into the first entry. Similarly, values of `position` below `1` fade back to the end of the list. In this configuration, the chase will only end when either all of the underlying effects contained within the `effects` list have ended on their own, or `position` resolves to `nil`, which always ends a chase immediately. Another way to create an open-ended chase is to pass `:beyond` with the value `:bounce`. This acts like `:loop`, except that whenever one end of the list of `effects` is reached, the chase changes direction and moves back through the list from that point. In other words, if `position` keeps growing steadily in value, and there are three effects in `effects`, with a `:beyond` value of `:loop` you will see them in the order 1 → 2 → 3 → 1 → 2 → 3 → 1… while a value of `:bounce` would give you 1 → 2 → 3 → 2 → 1 → 2 → 3 → 2…. [[conditional-effects]] === Conditional Effects The {api-doc}afterglow.effects.html#var-conditional-effect[`conditional-effect`] function in the `afterglow.effects` namespace wraps another effect, allowing it to run only when the value of some dynamic parameter (most likely a <> or <>) is not zero. {api-doc}afterglow.shows.sallie.html#var-global-color-effect[`afterglow.shows.sallie/global-color-effect`] shows an example of using it within a scene to optionally have the color effect apply to a laser show running simultaneously with the light show, controlled by the show variable `:also-color-laser`. This variable gets set when the “Also color laser” cue is running, by means of a Variable Effect, described in the next section. [source,clojure] ---- (ns afterglow.shows.sallie ;; ... (:require [afterglow.effects :as fx] ;; ... ) ;; ... (fx/scene (str "Color: " desc) (color-effect (str "Color: " desc) c lights) (fx/conditional-effect "Color Laser?" (params/build-variable-param :also-color-laser) (beyond/laser-color-effect laser-show c)))) ---- [[variable-effects]] === Variable Effects The {api-doc}afterglow.effects.show-variable.html#var-create-for-show[`variable-effect`] function in the `afterglow.effects.show-variable` namespace creates an effect which does not set any DMX values. Instead, it makes use of the rendering loop <> to set a show variable while the effect is active. This dovetails very nicely with Conditional Effects, described above. You can see an example of how to use variable effects in {api-doc}afterglow.shows.sallie.html#var-use-sallie-show[`afterglow.shows.sallie/use-sallie-show`], which creates a binding to the show variables using {api-doc}afterglow.effects.show-variable.html#var-create-for-show[`afterglow.effects.show-variable/create-for-show`]. Then {api-doc}afterglow.shows.sallie.html#var-make-cues[`afterglow.shows.sallie/make-cues`] uses that `var-binder` to create a `:color-laser` cue which sets the show variable `:also-color-laser` while it runs: [source,clojure] ---- (ns afterglow.shows.sallie ;; ... (:require [afterglow.effects.show-variable :as var-fx] ;; ... ) ;; ... (reset! var-binder (var-fx/create-for-show *show*)) ;; ... (ct/set-cue! (:cue-grid *show*) 5 7 (cues/cue :color-laser (fn [_] (var-fx/variable-effect @var-binder :also-color-laser 1)) :color :red :short-name "Also color laser")) ---- This variable setting causes the Conditional Effects in scenes created by `global-color-effect` (as described in the preceding section) to also send commands to the laser show. [[complex-effects]] === Complex Effects These are effects which build on more than one of the capabilities listed above to create an interesting or fun effect. They represent examples of how Afterglow can be used to create new things, and we hope that people will contribute their own effects for inclusion in future releases. [[color-cycle-chases]] ==== Color Cycle Chases This family of related effects are an excellent illustration of why Afterglow was created, which was to enable the concise expression and implementation of effects like them. They leverage many of the building blocks within Afterglow, and provide a framework to combine them in flexible ways using functional composition to acheive a variety of different looks that change in space at appropriate musical times, with very little code required in each. They are useful in themselves, and as examples of how to write similar effects. The {api-doc}afterglow.effects.fun.html#var-iris-out-color-cycle-chase[Iris Out] color cycle chase changes the color of a group of fixtures to a different color for each bar of a phrase of music. During the down beat of each new bar, the color spreads over the participating fixtures starting at their geometric center in the x-y plane of <>, and spreading in an expanding circle until reaching the furthest heads at the end of the down beat. [source,clojure] ---- (show/add-effect! :color (afterglow.effects.fun/iris-out-color-cycle-chase (show/all-fixtures))) ---- If you look at the source code (which you can always get to by following the “view source” link at the bottom of the {api-doc}afterglow.effects.fun.html#var-iris-out-color-cycle-chase[API documentation], or typing `(source afterglow.effects.fun/iris-out-color-cycle-chase)` in a REPL or the web console), you will see that it is only a few lines, once you get past the documentation and parameters, most of which are given default values to pass along to {api-doc}afterglow.effects.fun.html#var-color-cycle-chase[`color-cycle-chase`], which is used to actually implement the chase. Those parameters can be used to change the set of colors in the cycle, as well as control when the color changes, and when and how quickly the transition occurs. The documentation for `color-cycle-chase` explains how. The body of `iris-out-color-cycle-chase` simply sets up the measure function which causes the iris-out effect to behave as described, measuring a circular distance in the x-y plane (ignoring the z axis) from the center of the fixtures that have been assigned to participate in the effect. This is why it is easy to set up a family of similar effects which create different spatial transitions for the color cycle chase. For example, {api-doc}afterglow.effects.fun.html#var-wipe-right-color-cycle-chase[Wipe Right], which transitions the lights from left to right, ignoring both the y and z axes. The work of both of these chases is simplified with the help of {api-doc}afterglow.transform.html#var-build-distance-measure[`afterglow.transform/build-distance-measure`], a function for constructing distance measure functions for use in effects like this, and {api-doc}afterglow.transform.html#var-calculate-bounds[`afterglow.transform/calculate-bounds`], which calculates a bounding box and center for a group of fixtures and the heads which make them up. [source,clojure] ---- (show/add-effect! :color (afterglow.effects.fun/wipe-right-color-cycle-chase (show/all-fixtures))) ---- [[sparkle]] ==== Sparkle Creates a random sparkling effect like a particle generator over the supplied RGB fixture heads. See the {api-doc}afterglow.effects.fun.html#var-sparkle[API documentation] for details. [source,clojure] ---- (show/add-effect! :sparkle (afterglow.effects.fun/sparkle (show/all-fixtures))) ---- You can also create a {api-doc}afterglow.effects.fun.html#var-dimmer-sparkle[similar effect] with fixtures that have only dimmer channels, rather than RGB capabilities. [source,clojure] ---- (show/add-effect! :sparkle (afterglow.effects.fun/dimmer-sparkle (show/all-fixtures))) ---- And if you want to run a sparkle effect on both kinds of fixtures at the same time, you can combine these two effects with a <>. [source,clojure] ---- (show/add-effect! :sparkle (afterglow.effects/scene "Sparkle all" (afterglow.effects.fun/sparkle (show/all-fixtures)) (afterglow.effects.fun/dimmer-sparkle (show/all-fixtures)))) ---- [[strobe]] ==== Strobe A flexible strobe effect designed for intuitive tweaking via pressure-sensitive controllers like the Ableton Push. See the {api-doc}afterglow.effects.fun.html#var-strobe[API documentation] for details. [source,clojure] ---- (show/add-effect! :strobe-all (afterglow.effects.fun/strobe "Strobe All" (show/all-fixtures) 50)) ---- [[metronome]] ==== Metronome The Metronome cue is a way to check the synchronization of the show metronome with your DJ software or mixer if you don't have an Ableton Push or an easy way to pull up the web interface, and is mostly a nice example of how to write a cue that is driven by a metronome. It was one of the first clearly metronome-driven effects written, and was extremely useful when developing the metronome sync facilities (especially since at the time there was no web or Ableton Push interface, with their metronome monitoring and adjustment sections). Today it is less interesting, especially compared to the color cycle chases described above. [source,clojure] ---- (show/add-effect! :color (afterglow.effects.fun/metronome-effect (show/all-fixtures))) ---- Creates an effect which flashes the heads of the supplied fixtures one color on the down beat and another color on the other beats of the show metronome. The default down beat color is a lightened red, and the other beat color is a darkened yellow; these can be overridden by optional keyword parameters. See the {api-doc}afterglow.effects.fun.html#var-metronome-effect[API documentation] for details. [[the-effect-lifecycle]] == The Effect Lifecycle When an effect is added to a show via `(show/add-effect! :effect-key effect)` it immediately replaces any other effect which had been previously added with the same keyword. The former effect does not get a chance to gracefully finish its effects, it is simply gone. The new effect is added to the <> in a position determined by the priority value, if any, specified after the optional `:priority` keyword argument. If no priority argument is supplied, a priority of zero is used. The new effect is added after any other existing effects of the same (or lower) priority, but before any existing effects with higher priority. Since later effects get a chance to override earlier effects, this means that higher-priority effects, and effects added later, win. All effects implement the {api-doc}afterglow.effects.html#var-IEffect[`afterglow.effects/IEffect`] protocol. As each frame of lighting control values is rendered, a snapshot is created from the show metronome, so every effect shares the same notion of the point in time at which effects are being rendered. The priority-ordered list of effects is traversed, and each effect’s `(still-active? [this show snapshot])` function is invoked to determine if the effect has ended at this point. If this returns `true`, the effect is removed from the list of active effects, and is finished. Limited-time effects can use this mechanism to tell the show when they finish. Ongoing effects will simply always return `true`, or if they want to end gracefully, will return `true` until they have been asked to end, and their graceful ending has completed. Assuming the effect has not reported completion, its `(generate [this show snapshot])` function will be called, as described in the <> section, to create the effect it represents at this point in time. At some point, the show operator may indicate a desire for the effect to end, by calling `(show/end-effect! :effect-key force)`. If `force` is `true`, the specified effect will simply be removed from the list of active effects. If `force` is omitted or `false`, the effect is asked to end gracefully by calling its `(end [this show snapshot])` function. If the effect is ready to end right away, it can return `true`, and will be removed at that point. Otherwise, if it wants to take a little while to animate an ending effect, it should set an internal flag so it knows it is ending and return `false`, and at some point in the not-so-distant future, conclude its ending and return `false` from `still-active?`. WARNING: As implied by the preceding paragraph, your effect cannot rely on its `end` function ever being called. If the effect is ended forcibly, if another effect is added under the same keyword, or if it is taking part in a fade, at some point it will simply be discarded. It must therefore not retain any resources that will not be reclaimed by simple garbage collection. If `end-effect!` is called a second time for an effect which was already asked to end, even if `force` is false, it will be removed forcibly at that point. [[effect-examples]] == Effect Examples Here are a few ways in which effects can be used and combined. NOTE: These examples assume you are in a Clojure REPL with Afterglow loaded, in the namespace `afterglow.examples`. This is the default namespace you get if you check out the project and run `lein repl`. [[oscillator-effects]] === Oscillator Effects Oscillators in Afterglow are a flexible way of turning the timing information tracked by metronomes into waveforms that can be used to make lights do interesting things. They can be related to the beats or bars of the metronome, or multiples or fractions thereof, and can be sawtooth, triangle, square, or sine waves. http://en.wikipedia.org/wiki/Sawtooth_wave[Wikipedia] has a nice introduction to these waveforms. The namespace `afterglow.effects.oscillator` has <> for creating lots of variations on them. Here is one way to create a basic oscillated hue effect which cycles through all colors over one bar of the show metronome: [source,clojure] ---- (def hue-param (oscillators/build-oscillated-param (oscillators/sawtooth :interval :bar) :max 360)) (show/add-effect! :color (global-color-effect (params/build-color-param :s 100 :l 50 :h hue-param))) ---- TIP: Remember that if you aren’t seeing anything when after assigning color effects to a fixture to make sure you also have a dimmer effect setting that fixture’s dimmer to some visible level. And if the fixture has a shutter (either physical or electronic), you may need an effect running to open that as well. We can set up separate metronomes as show variables, so that effect timing can be separate from the main show, which is intended to track the beat of the music. Here we will create a metronome running at 5 beats per minute in a show variable we will call `timer`. [source,clojure] ---- (show/set-variable! :timer (metronome 50)) ---- Then we can build an oscillated hue parameter based on that timer, for a nice, gradual color fade. We will use a sawtooth wave since it smoothly goes from its minimum to its maximum value. Zero is the default minimum, which is perfect, since it is the lowest hue value. We will tell the oscillated parameter to range from that to a maximum of 360, the largest hue. Since hues form a circle, we will fade smoothly around the circle for each oscillation, with no jarring transition from one bar to the next: [source,clojure] ---- (show/set-variable! :hue-param (oscillators/build-oscillated-param (oscillators/sawtooth :interval :bar) :metronome :timer :max 360)) ---- Notice the use of the keyword `:timer` to tell `build-oscillated-param` to use the show variable with that name for its `:metronome` keyword parameter. We can do the same thing when building our color effect to use this oscillated hue parameter variable: [source,clojure] ---- (show/add-effect! :color (global-color-effect (params/build-color-param :s 100 :l 50 :h :hue-param))) ---- We can change the speed of the fade by changing the BPM of the metronome stored in the show variable: [source,clojure] ---- (metro-bpm (show/get-variable :timer) 500) ---- Suddenly it is crazy fast! [source,clojure] ---- (metro-bpm (show/get-variable :timer) 5) ---- Back to a sedate fade. [[spatial-effects]] === Spatial Effects Rather than spreading the rainbow out in time, how about if we spread it physically across the lights in the show, in the form of a rainbow gradient along the X axis? [source,clojure] ---- (def hue-gradient (params/build-spatial-param (show/all-fixtures) (fn [head] (- (:x head) (:min-x @(:dimensions *show*)))) :end 360)) (show/add-effect! :color (global-color-effect (params/build-color-param :s 100 :l 50 :h hue-gradient) :include-color-wheels true)) ---- NOTE: Since this cue is not constantly changing over time, it makes sense to allow fixtures that use color wheels to participate. That’s pretty! But now that we have both of these interesting concepts, oscillators and spatial gradients, wouldn’t it be nice if we could combine them? Oh, but we can! [source,clojure] ---- (def adjust-param (oscillators/build-oscillated-param (oscillators/sawtooth :interval :bar) :max 360)) (show/add-effect! :color (global-color-effect (params/build-color-param :s 100 :l 50 :h hue-gradient :adjust-hue adjust-param))) ---- NOTE: Now the rainbow drifts across the whole lighting rig. We left out color wheels this time, since the color is continually shifting. The <> section goes into more detail about how these effects work. TIP: Looking at the source code of the <> is a great way to learn about how to create effects, and to get ideas for ways to vary or build on them. [[layering-effects]] === Layering Effects Rather than building separate effects for every combination of ideas, you can get much more power by building effects that build on or modify each other, which you can then compose in different ways. The most straightforward way of doing this is by combining effects that work on different facets of the lights, such as when you choose a dimmer oscillator, to make them pulse in a particular way with the beat, along with a color effect, and perhaps an aim or direction chase. Varying these effects can give you quite a palette of looks. The Afterglow <> is designed to let you be even more flexible than that, though: you can combine multiple effects which work on the same channels of the same fixtures, because of the way that later (and higher priority) effects can see what earlier effects have done, and modify the results. The {api-doc}afterglow.effects.color.html#var-transform-colors[`transform-colors`] effect is an example of how easy and flexible this can be. (As always with the API documentation, you can click on the `viw source` button to see the actual implementation of the function.) This effect uses its own variable parameter to adjust the saturation of any color being sent to the fixtures it is assigned. (If there isn't currently a color being assigned to those fixtures, it does nothing.) Calling it with no arguments uses a default transformation and oscillated parameter which causes the saturation of the color to start each beat fully saturated, and to fade to gray by the end of the beat. This was inspired by the rainbow fade effect which was initially created while experimenting with https://github.com/Deep-Symmetry/afterglow-max#afterglow-max[afterglow-max], but this generalization can be combined with any other color effect. The `transform-colors` function itself does all the work of creating assigners that will watch for colors being sent to the fixtures it is supposed to affect, and whenever appropriate, transforming them. The transformation itself is separated into another function, which can be passed in as an argument to achieve a totally different kind of transformation. The default transformation if none is specified is created by calling {api-doc}afterglow.effects.color.html#var-build-saturation-transformation[`build-saturation-transformation`] with no arguments. The source of this function shows how easy it is to write a transformation given the support provided by the Rendering Loop and `transform-colors`. [source,clojure] ---- (defn build-saturation-transformation "Creates a color transformation for use with [[transform-colors]] which changes the saturation based on a variable parameter. If no parameter is supplied, the default is to use an oscillated parameter based on [[sawtooth]] with `:down?` set to `true` so the color is fully saturated at the start of the beat, and fully desaturated by the end. A different pattern can be created by supplying a different parameter with the `:param` optional keyword argument." {:doc/format :markdown} [& {:keys [param] :or {param (oscillators/build-oscillated-param (osc/sawtooth :down? true) :max 100)}}] (fn [color show snapshot head] (let [saturation (colors/clamp-percent-float (params/resolve-param param show snapshot head))] (colors/create-color {:h (colors/hue color) :s saturation :l (colors/lightness color)})))) ---- This particular function takes an optional variable parameter to control what the current saturation should be (if you don't provide one, it creates an <> which implements the desaturate-over-each-beat behavior described above: [source,clojure] ---- (oscillators/build-oscillated-param (oscillators/sawtooth :down? true) :max 100) ---- The downwards-direction sawtooth wave from 100 to 0 each beat causes the saturation pattern described; changing to a different wave form, or something which oscillates over a bar or phrase or fraction thereof, or with different `:min` and `:max` values would achieve a different effect. The function returned by `build-saturation-transformation` is called by `transform-colors` when Afterglow is calculating a frame of DMX data to send to the lights, whenver one of the lights that the `transform-colors` effect has been applied to is being sent a color value. The function is called with the color that has so far been assigned to the light (in `color`), and the current `show`, metronome `snapshot` representing the current instant in musical time (and which can be used with an oscillated variable parameter as seen here to generate smoothly changing, rhythmically-driven values), and the light `head` this is being sent to (which can be used to perform <> calculations as described above). The function returns a new color to replace the former assignment (or it could return `nil` to suppress coloring the light entirely). Having all this information at hand, and the flexible power of <> and <>, <>, and <> variable parameters, makes it possible to write straightforward, concise transformation functions like this one. And of course you can change things other than saturation; take a look at the source and try writing your own transformation functions which do different things. When you come up with exciting looks, please contribute them back to Afterglow! Remember that when you create a cue for an effect like `transform-color`, you want it to run _after_ the other effects that it is going to transform, so give it a high effect priority. Here is how the sample show configures it: [source,clojure] ---- (ct/set-cue! (:cue-grid *show*) 2 7 (cues/cue :transform-colors (fn [_] (color-fx/transform-colors (show/all-fixtures))) :priority 1000)) ---- And here is a complete, concrete example of how you can try out `transform-colors` from the REPL: [source,clojure] ---- (show/add-effect! :color (afterglow.effects/scene "Blue Sparks" (global-color-effect :blue) (color-fx/transform-colors (show/all-fixtures) :priority 1000))) ---- > This assigns a blue color to all the lights, and pulses them to white once per beat. ================================================ FILE: doc/modules/ROOT/pages/fixture_definitions.adoc ================================================ = Fixture Definitions James Elliott // TODO: Can the following be defived from Antora, or just eliminated? :branch-base: https://github.com/Deep-Symmetry/afterglow/blob/master/ Fixture definitions tell Afterglow what capabilities a given piece of lighting hardware has, and how to control it to get the effects that are being requested. == Overview There are a vast number of fixture types out there, and at this early stage almost none of them are built in to Afterglow, so you will probably need to create your own. You can study the existing fixture definitions for examples of how it is done. You can also ask for help on the https://github.com/Deep-Symmetry/afterglow/wiki/Questions[wiki]. [TIP] ==== When you first embark on the project of creating a fixture definition, it might seem overwhelming. This page is long, and includes a great deal of complicated detail. But don't despair! First, remember that most fixtures only do a subset of the kinds of things that the fixture definition mechanism needs to handle, so you do not need to learn and understand all of it at once. And even more helpful to beginners, realize that you do not need to finish your fixture definition before you can start using and testing it. Your fixture may be capable of many things, but start out by defining just a couple of channels that will make it at least light up, and see if you can get those working in a show. Once they are, you can already use the fixture at least at that level. And that success can be a foundation for digging deeper into other types of channels, which you can add to your definition one at a time, building on what you learn as you go along. Also, as of version 0.1.3, Afterglow can read fixture definitions from the http://www.qlcplus.org[QLC+] lighting controller and use those to <> for you. Since there are far more fixtures already defined for QLC+, that can be a huge help. ==== The namespace {api-doc}afterglow.fixtures.html[`afterglow.fixtures`] has definitions for very basic one-channel generic dimmers and switches. Looking at the source for those can illustrate the most basic structure of a fixture definition. It also contains some helper functions Afterglow uses in processing fixture definitions. The namespace {api-doc}afterglow.fixtures.american-dj.html[`afterglow.fixtures.american-dj`] contains definitions for fixtures made by American DJ. Currently, only the Hypnotic RGB laser is present. The namespace {api-doc}afterglow.fixtures.blizzard.html[`afterglow.fixtures.blizzard`] is the most complete so far, mostly because the author lives close to Blizzard and mostly owns fixures made by them. It includes definitions for a full-featured moving head spot (the Torrent F3), a moving head color-mixing LED fixture (the Blade RGBW), an LED five-color Par (the Puck Fab5), an eight-head RGB system (the Weather System), and an RGBW moonflower effect (the Snowball). These might be useful examples for fixtures you want to create. The namespace {api-doc}afterglow.fixtures.chauvet.html[`afterglow.fixtures.chauvet`] is for fixtures made by Chauvet. [[structure]] == Structure of a Fixture Definition Once created, a fixture definition is simply a Clojure map with keys and values that tell Afterglow how to control it. The fixture definition functions linked to above simply create and return these maps. Fixtures may have multiple "personalities" or _modes_ which change the number and meaning of the control channels they use, and the features that are available. For such fixtures, the mode is generally given as an argument to the fixture definition function, and tells it what version of the map to return. For convenience, the function may let you call it with no argument, and assume a default mode. Its documentation should reflect this, see for example the {api-doc}afterglow.fixtures.blizzard.html#var-blade-rgbw[`blade-rgbw`] documentation. When you are learning how to write fixture definitions, it can be helpful to compare the fixture definition functions, which call helper functions described on this page, with the actual maps that they return. This can be facilitated by using `clojure.pprint/pprint` to pretty-print the map that you get when calling the function. For example: [source,clojure] ---- (clojure.pprint/pprint (afterglow.fixtures.blizzard/snowball)) {:name "Blizzard Snowball", :channels [{:offset 1, :type :dimmer, :functions [{:start 0, :end 255, :range :variable, :type :dimmer, :label "Dimmer"}]} {:offset 2, :type :color, :functions [{:start 0, :end 255, :range :variable, :type :red, :label "Red"}], :color :red} ; [...many channels omitted for brevity...] {:offset 9, :type :control, :functions [{:start 0, :range :fixed, :type :no-function, :label "No function", :end 127} {:range :variable, :label "Sound-active", :type :sound-active, :var-label "Sensitivity", :start 128, :end 255}]}]} ; -> nil ---- Even though most of the channels were cut out to shorten that example, it is still pretty long. Still, it gives a sense of the shape of a fixture definition. You may have noticed that there were only two top-level keys in the returned map, `:name` and `:channels`. Those are the only two that need to be there for a simple fixture. And almost all of the information Afterglow needs is found in the `:channels` list, so that is where you will spend most of your work in creating the fixture definition. If you had already looked at the source for {api-doc}afterglow.fixtures.blizzard.html#var-snowball[`snowball`] (which you can get to by clicking the `view source` button at the bottom of all the API documentation entries), you might have noticed that the source is a lot shorter than the resulting map. That's because it can take advantage of a bunch of helper functions described on this page to help with the tedious and repetetive parts of constructing the map. And when you patch a fixture into a show using {api-doc}afterglow.show.html#var-patch-fixture.21[`afterglow.show/patch-fixture!`] the map gets much bigger again, as Afterglow annotates it with information you provided during the patching process, assigning the actual universes and DMX channels for each logical channel in the fixture definition, and figuring out the location in space and aiming direction, potentially of several heads of a multi-head fixture. So, let's look at the fixture definition map contents in detail. [cols="2l,5a", options="header"] |=== |Key |Purpose |:name |A string which identifies the manufacturer and model of fixture. |:channels | A list of channel specifications which tell Afterglow about the DMX channels that the fixture responds to, and how to make it do different things. This is the meat of the fixture definition, and is described in detail <>. |:mode |If present, identifies the fixture mode in which this definition map was created. As desrcibed above, some fixtures can be configured to have different “personalities” which use a different number of DMX channels and provide a different set of features. Their fixture definition functions will use a `mode` argument to determine the mode in which the fixture is operating, and return an appropriate map. That map will include the chosen mode keyword as the value at this key. |:heads |If a fixture has multiple independent heads, which can be controlled individually, the channels which control the heads are grouped into a list under this key. Each entry in the list is a map which explains a single head. It will contain its own `:channels` key with the channel specifications controlling that specific head, and will also contain geometric information about the offset of that particular head from the geometric center of the fixture, so Afterglow can figure out where the head is in space when the fiture is patched into the show. This is described in more detail <>. |:pan-center |If this fixture is a moving head capable of pan movements, this entry tells afterglow the DMX value to send the fixture to pan it directly at the audience when the fixture is hung at its standard orientation. (The documentation you create for your fixture definition needs to explain what this default orientation is, so that people patching your fixture can figure out the proper angle information to tell Afterglow if they hung it in a different orientation, as explained in <>.) The `:pan-center` value should pan the light so it is aimed exactly along the show Z axis when also tilted to `:tilt-center`. Many fixtures can pan more than once around a full circle, so you may have a choice of values to supply here, all of which pan the fixture directly towards the audience in your default hanging orientation. If so, pick one towards the middle of the DMX range, giving Afterglow room to maneuver without having to flip to the opposite end of the pan range regardless of how the fixture has been hung. If the fixture cannot pan far enough to aim directly at the audience when it is hung in its default orientation, you may be better off choosing a different default hanging orientation. But if you do not want to do that, you can set this to the closest value outside the legal DMX range which would cause the fixture to pan that far if it were legal and possible, and Afterglow will still be able to figure out and use the legal movements that the fixture is capable of. |:pan-half-circle |If this fixture is a moving head capable of pan movements, this entry tells Afterglow the amount it needs to add to the DMX value sent on the fixture's Pan channel to pan it halfway around a circle in a counterclockwise direction. Afterglow uses this to figure out how to aim the head exactly where you want it. If your fixture is not capable of panning that far, this value may be larger than a legal DMX value. That is fine, Afterglow will figure that out. Simply always give it the value which, when added to some legal Pan channel value, would cause the fixture to rotate counterclockwise halfway around a circle if it could rotate that far. (This number could be negative if the fixture turns clockwise when the pan value is increased in its default hanging orientation.) The <> page explains how to figure out which rotations are clockwise or counterclockwise with respect to different axes. Pan motions are rotations around the fixture Y axis. |:tilt-center |If this fixture is a moving head capable of tilt movements, this entry tells afterglow the DMX value to send the fixture to tilt it directly at the audience when the fixture is hung at its standard orientation. (The documentation you create for your fixture definition needs to explain what this default orientation is, so that people patching your fixture can figure out the proper angle information to tell Afterglow if they hung it in a different orientation, as explained in <>.) The `:tilt-center` value should tilt the light so it is aimed exactly along the show Z axis when also panned to `:pan-center`. Some fixtures can tilt more than once around a full circle, so you may have a choice of values to supply here, all of which tilt the fixture directly towards the audience in your default hanging orientation. If so, pick one towards the middle of the DMX range, giving Afterglow room to maneuver without having to flip to the opposite end of the tilt range regardless of how the fixture has been hung. If the fixture cannot tilt far enough to aim directly at the audience when it is hung in its default orientation, you may be better off choosing a different default hanging orientation. But if you do not want to do that, you can set this to the closest value outside the legal DMX range which would cause the fixture to tilt that far if it were legal and possible, and Afterglow will still be able to figure out and use the legal movements that the fixture is capable of. |:tilt-half-circle |If this fixture is a moving head capable of tilt movements, this entry tells Afterglow the amount it needs to add to the DMX value sent on the fixture's Tilt channel to tilt it halfway around a circle in a counterclockwise direction. Afterglow uses this to figure out how to aim the head exactly where you want it. If your fixture is not capable of tilting that far, this value may be larger than a legal DMX value. That is fine, Afterglow will figure that out. Simply always give it the value which, when added to some legal Tilt channel value, would cause the fixture to rotate counterclockwise halfway around a circle if it could rotate that far. (This number could be negative if the fixture turns clockwise when the tilt value is increased in its default hanging orientation.) The <> page explains how to figure out which rotations are clockwise or counterclockwise with respect to different axes. Tilt motions are rotations around the fixture X axis. |=== [[channel-specifications]] === Channel Specifications The `:channels` entry for a fixture or head definition map tells Afterglow the control channels that can be used to make that fixture or head do things. It is a list of maps, each of which describes the nature and capabilities of a single channel that the fixture or head responds to. TIP: Although there is a lot of detail in this table, you don't necessarily need to understand it all to create fixture definitions, because Afterglow provides <> to create these maps for you. Each channel specification map has the following content: [cols="2l,5a", options="header"] |=== |Key |Purpose |:offset |[[channel-offset]]The number that identifies the channel. Each fixture listens to one or more channels, and is itself configured to a partcular DMX channel number (DMX channels range from 1 to 512). That configuration defines the _first_ channel the fixture listens to. The `:offset` value tells Afterglow how the current channel specification relates to the fixture's configured (starting) channel number. An offset of `1` corresponds to the first channel the fixture is listening to, which would be the channel number configured on the fixture's front panel (or via its DIP switches or jumpers if it is really old-school). The second channel would have offset `2`, and would correspond to the channel one greater than the fixture is configured to listen to. Although it might seem more natural (at least to a programmer) to start the offset with `0`, because then you could calculate the actual channel number by simply adding the offset to the address at which the fixture is configured to listen, most lighting manuals describe their fixture channels with numbers that start with `1`, so Afterglow follows that convention. The offsets for all the channel specifications in a fixture definition should form a continuous series of integers starting from 1 and going up to the number of channels the fixture supports. It is an error if more than one channel specification in the fixture definition uses the same offset value, and if there are any gaps it probably means that you have missed a channel specification (except for multi-byte channels, as described in the next row). You don't need to define the channels in the same order as their offsets in your fixture definition, although that is a reasonable practice, making it easier to match them up with the manual. |:fine-offset |There is one circumstance in which there _will_ be gaps in the `:offset` values for your channel definitions. Sometimes a pair of channels are used to express a single value, such as pan, tilt, or a dimmer level, because the normal DMX value range, from 0 to 255, does not give enough precision to allow smooth movements or fades. In those cases, you specify the channel number containing the most-significant byte (MSB) of the value as the `:offset`, and the channel containing the least-significant byte (LSB) is specified in the same channel specification using the key `:fine-offset`. The function {api-doc}afterglow.channels.html#var-fine-channel[`afterglow.channels/fine-channel`] helps create such a channel specification map. (In fact, it has other handy features which make it useful even when you are creating a channel specification that does not need a `:fine-offset` value). |:type |Tells afterglow the kind of channel this is. Special values include `:color` for a channel that contains a color intensity, `:dimmer` for controlling brightness independent of color, and `:pan` and `:tilt` for controlling moving heads. Other channels may use keywords that Afterglow does not recognize. A common keyword used for a grab-bag channel which may do many things depending on the exact DMX value sent is `:control`. |:color |When the channel `:type` is `:color`, this key is also present to tell Afterglow what color the channel controls the intensity of. Afterglow uses this information to enable color mixing using multiple color channels. The value of this key will be a keyword. The values `:red`, `:green`, `:blue`, and `:white` are understood and supported for color mixing automatically. If your fixture has LEDs of other colors and you would like Afterglow to include them in its color mixing calculations, in addition to supplying a `:color` value for their channel, you will need to specify a `:hue` value (below), so Afterglow knows how to mix them in. |:hue |[[hue-mixing]]When the channel `:type` is `:color`, this key is optionally present to tell Afterglow the hue value of the LEDs controlled by the channel. This allows Afterglow to perform color mixing with non-standard LED colors. Its value is the numeric hue (expressed in terms of degrees around the color circle) of the LEDs. The best way to find that is with a colorimeter, but since most of us can't afford them, you can approximate it by working with graphic design software, or even entering the color name on https://www.wolframalpha.com[Wolfram Alpha]. If you don't want Afterglow to mix colors using this channel, leave out the `:hue` entry. The fixture definition function for the Chauvet {api-doc}afterglow.fixtures.chauvet.html#var-slimpar-hex3-irc[SlimPar Hex3 IRC] uses optional keyword arguments to let the show creator decide whether or not to include them for its amber and ultraviolet channels. |:functions |A list of <> which identify ranges of DMX values that can be sent to the channel, and which perform particular functions. Fixture manufacturers often use a single DMX channel to achieve many different kinds of effects, in order to not use up the DMX address space, especially when it would not make sense to try to activate two or more of the functions at the same time. Afterglow effects and cues can work in terms of these function definitions, and it often makes sense to do so even for channels which implement only a single function, so you don't need to worry about how a function is implemented when designing your effect or cue. Because of that, the channel creation functions add a function map even when you are creating a single-function channel. |:inverted-from |[[inverted-channels]]If this key is present, the value established by the channel's <> will be {api-doc}afterglow.effects.channel.html#var-apply-channel-value[reversed] when it is sent to the fixture. This is necessary to support fixtures which have inverted dimmer channels, and can be configured when <> the dimmer channel specification. |=== [[head-specifications]] === Head Specifications As described above, the `:heads` entry in a fixture definition map is a list that describes each individually controllable head within that fixture. It may be a separate moving head, or it may just be an individually-addressable pixel. If a fixture has only one light-emitting head, it does not need a head specification list at all; everthing Afterglow needs to know about it will be contained in the main fixture definition. But if there is more than one place on the fixture that can be controlled independently, you will want to organize them into heads, and tell Afterglow their spatial relationships as well as which channels control which head, using a head specifications list. Each element of the list is a map with the following content: [cols="2l,5a", options="header"] |=== |Key |Purpose |:channels | A list of channel specifications which tell Afterglow about the DMX channels that this individual head responds to. These have exactly the same structure as the channel specifications for the main fixture, as described <>. A channel can only be listed in one place or the other. If it affects the entire fixture, it should be in the main list; if it affects only a single head, it should be in that head's list. |:x |The offset along the fixture X axis, in meters, from the geometric center of the fixture (the point at which Afterglow is told the fixture is located when patching the fixture) and the geometric center of this head. If this head is centered along the fixture X axis, you can omit this value or you can supply it with a value of 0.0. The <> page illustrates the axes and links to a function you can use for converting inches to meters. |:y |The offset along the fixture Y axis, in meters, from the geometric center of the fixture (the point at which Afterglow is told the fixture is located when patching the fixture) and the geometric center of this head. If this head is centered along the fixture Y axis, you can omit this value or you can supply it with a value of 0.0. The <> page illustrates the axes and links to a function you can use for converting inches to meters. |:z |The offset along the fixture Z axis, in meters, from the geometric center of the fixture (the point at which Afterglow is told the fixture is located when patching the fixture) and the geometric center of this head. If this head is centered along the fixture X axis, you can omit this value or you can supply it with a value of 0.0. The <> page illustrates the axes and links to a function you can use for converting inches to meters. |:x-rotation |If this head aims in a different direction than the fixture as a whole, this value tells afterglow the angle in radians it is rotated around the X axis. The <> page illustrates the axes, explains how to calculate the sign of a rotation, and links to a function you can use for converting degrees to radians. |:y-rotation |If this head aims in a different direction than the fixture as a whole, this value tells afterglow the angle in radians it is rotated around the Y axis. The <> page illustrates the axes, explains how to calculate the sign of a rotation, and links to a function you can use for converting degrees to radians. |:z-rotation |If this head aims in a different direction than the fixture as a whole, this value tells afterglow the angle in radians it is rotated around the Z axis. The <> page illustrates the axes, explains how to calculate the sign of a rotation, and links to a function you can use for converting degrees to radians. |=== [[function-specifications]] === Function Specifications Function specifications allow a single channel to be broken up into a series of value ranges which accomplish different purposes. As noted above, fixture manufacturers often do this so that they can provide a lot of functionality without taking up too much of the DMX address space. And since fixtures often have functions which cannot be activated at the same time, such as selecting a particular gobo on a gobo wheel, it makes great sense. The `:functions` entry in a channel specification map lists all the functions that a given channel offers. In order to work well with <> and <> it is best to provide a function list even for channels which only perform a single function. A function list is a list of maps, each of which identifies a range of values that do something when the channel is set to a value within that range. Each map has the following content: [cols="2l,5a", options="header"] |=== |Key |Purpose |:start |The beginning of the function range: the lowest DMX value which activates this function on the channel. Must be a legal DMX value, from `0` to `255`, and less than or equal to `:end`. Ranges must not overlap, so this value must be greater than the `:end` value of any other function range defined for the channel. |:end |The end of the function range: the highest DMX value which activates this function on the channel. Must be a legal DMX value, from `0` to `255`, and greater than or equal to `:start`. Ranges must not overlap, so this value must be less than the `:start` value of any other function range defined for the channel. |:type |A keyword which identifies the nature of the function. This is how <> and <> will find the effect, so it is important to be consistent when assigning function types. The list of <> is a good starting point. If you feel there is a common kind of function which should be added to that list, please open an https://github.com/Deep-Symmetry/afterglow/issues[issue] requesting it. |:range |Tells Afterglow what kind of a function range this is. Some functions are simply either off or on, and even if multiple DMX values exist within the function range, the result of using any of them is no different from using another. Such functions are identified by a `:range` type of `:fixed`. Other functions, such as a rotation speed or focus, will have different effects for every value in the range, and are identified by a `:range` type of `:variable`. This helps Afterglow build an appropriate user interface for interacting with <> in places like the <>. |:label |Specifies a label that should be used when creating a user interface that refers to this function. <> will use this as the label text in the grid cell they create in the <>. If omitted, a capitalzed version of the value of the `:type` keyword (without its leading colon) is used as the label; this entry allows you to specify something more readable. |:var-label |Specifies a label that should be used when creating a user interface for adjusting the value associated with this function (so it makes sense to set this only when `:range` is `:variable`). <> will use this as the label for the cue-local variable they create, and it will appear in places like the <>. If omitted, the generic label “Level” will be displayed under the encoder knob. |:scale-fn |A function that will be called to scale the function value being requested by an effect. For functions whose `:range` is `:variable`, Afterglow function effects can vary the value being sent to activate the function. They normally do this as a percentage, where 0 maps to the `:start` of the range, and 100 maps to the `:end`, and values in between are scaled appropriately. If there is a reason to tweak the values on the way in, you can store a function at this key in the function specification, and Afterglow will call the function with the percentage value the effect requested, and expect the function to return a modified percentage value to use to actually pick the DMX value to send. A good example of a reason to do this is with the `strobe` function, so that different fixtures can be coaxed into strobing at roughly the same rate. The fixture definitions that ship with Afterglow use {api-doc}afterglow.effects.channel.html#var-function-value-scaler[`afterglow.effects.channel/function-value-scaler`] to build `:scale-fn` functions for their `:strobe` functions so that, rather than a percentage, the strobe function value is interpreted as an approximate tenth-Hz rate (flashes per ten seconds), normalized for each fixture. The example in the <> section below explains this further. |=== [[channel-creation-functions]] === Channel Creation Functions The {api-doc}afterglow.channels.html[`afterglow.channels`] namespace provides a number of functions to help you create channel specifications in your fixture definitions. You will see these used all over the place in the fixture definitions which ship with Afterglow; here is an introduction to how they work. [[color-channels]] ==== Color Channels {api-doc}afterglow.channels.html#var-color[`afterglow.channels/color`] returns a channel specification for a channel that controls an individual color intensity (such as with an RGB LED fixture). Its two mandatory arguments are the channel `offset` (the channel number reported in the fixture manual, assuming they are numbered starting with `1` as described <>), and the `color`, a keyword naming the color. The standard colors `:red`, `:green`, `:blue`, and `:white` will automatically participate in Afterglow's color mixing for <>. If your fixture has other color channels, and you would like them to participate in color mixing as well, pass the hue value of the color channel with the optional keyword argument `:hue`. (See the discussion <> for ways to determine the hue value of your color channel.) If your fixture supports two-byte color values for more precise color mixing, use the most-significant byte as the `offset` value, and pass the offset of least-significant byte using the optional keyword argument `:fine-offset`. If you want to use a label which differs from the name of the `color` keyword in the user interface when <> <> (for example, if the keyword is hyphenated, and you want the label to use a space), specify your desired label with the optional keyword argument `:function-label`. [[dimmer-channels]] ==== Dimmer Channels {api-doc}afterglow.channels.html#var-dimmer[`afterglow.channels/dimmer`] returns a specification for a channel that controls the dimmer of a fixture or head. It always takes at least one argument, the channel `offset` (as described <>). If the fixture uses two-byte values for more precise dimmer control, use the most-significant byte as the `offset` value, and pass the offset of the least-significant byte using the optional keyword argument `:fine-offset`. Normal dimmers are dark at zero, and get brighter as the channel value increases, to a maximum brightness at 255. However, some fixtures have inverted dimmers. If that is the case for the fixture you are defining, pass the DMX value at which the inversion takes place with `:inverted-from`. For example, fixtures which are brightest at zero and darken as the value approaches 255 would be specified as `:inverted-from 0`, while fixtures which are dark at zero, jump to maximum brightness at 1, then dim as the value grows towards 255 would be specified as `:inverted-from 1`. [[focus-channels]] ==== Focus Channels {api-doc}afterglow.channels.html#var-focus[`afterglow.channels/focus`] returns a specification for a channel that controls the focal plane of a fixture or head, usually a moving head spot which can project gobo (template) images. It always takes at least one argument, the channel `offset` (as described <>). If the fixture uses two-byte values for more precise focus control, pass the offset of the channel that controls the most-significant byte as the `offset` argument, and pass the offset of the channel that controls the least-significant byte as the second argument, `fine-offset`. [[frost-channels]] ==== Frost Channels {api-doc}afterglow.channels.html#var-frost[`afterglow.channels/frost`] returns a specification for a channel that controls the frost effect of a fixture or head, softening the beam of light it emits. It always takes at least one argument, the channel `offset` (as described <>). If the fixture uses two-byte values for more precise focus control, pass the offset of the channel that controls the most-significant byte as the `offset` argument, and pass the offset of the channel that controls the least-significant byte as the second argument, `fine-offset`. [[iris-channels]] ==== Iris Channels {api-doc}afterglow.channels.html#var-iris[`afterglow.channels/iris`] returns a specification for a channel that controls the iris (aperture) of a fixture or head, widening or narrowing the beam of light it emits. It always takes at least one argument, the channel `offset` (as described <>). If the fixture uses two-byte values for more precise iris control, pass the offset of the channel that controls the most-significant byte as the `offset` argument, and pass the offset of the channel that controls the least-significant byte as the second argument, `fine-offset`. [[pan-channels]] ==== Pan Channels {api-doc}afterglow.channels.html#var-pan[`afterglow.channels/pan`] returns a specification for a channel that controls the pan (rotation around the Y axis) of a fixture or head. It always takes at least one argument, the channel `offset` (as described <>). If the fixture uses two-byte values for more precise pan control, pass the offset of the channel that controls the most-significant byte as the `offset` argument, and pass the offset of the channel that controls the least-significant byte as the second argument, `fine-offset`. [[tilt-channels]] ==== Tilt Channels {api-doc}afterglow.channels.html#var-tilt[`afterglow.channels/tilt`] returns a specification for a channel that controls the tilt (rotation around the X axis) of a fixture or head. It always takes at least one argument, the channel `offset` (as described <>). If the fixture uses two-byte values for more precise tilt control, pass the offset of the channel that controls the most-significant byte as the `offset` argument, and pass the offset of the channel that controls the least-significant byte as the second argument, `fine-offset`. [[zoom-channels]] ==== Zoom Channels {api-doc}afterglow.channels.html#var-zoom[`afterglow.channels/zoom`] returns a specification for a channel that controls the zoom of a fixture or head, changing how much the beam spreads as it travels from the fixture. It always takes at least one argument, the channel `offset` (as described <>). If the fixture uses two-byte values for more precise zoom control, pass the offset of the channel that controls the most-significant byte as the `offset` argument, and pass the offset of the channel that controls the least-significant byte as the second argument, `fine-offset`. [[function-channels]] ==== Function Channels {api-doc}afterglow.channels.html#var-functions[`afterglow.channels/functions`] returns a specification for a channel that implements a list of different functions for different ranges of DMX values. Its first two arguments are `chan-type`, the keyword which identifies the type of the channel (please see the list of <> below and try to reuse one if it is appropriate, or at least create your keyword in a way that follows their conventions), and the channel `offset` (as described <>). These are followed by a variable number of function range specifications, which take the form of a number (which identifies the starting DMX value for the function range) followed by the function specification itself. This can either be a <> as described above (without the `:start` and `:end` keys, which will be figured out from the starting ranges supplied to this function), or in many simple cases you can use the shorthand of passing a keyword, which will be expanded into a variable-range function with the a type of the keyword you supplied, or a string, which will be expanded into a fixed-range function with a type of a keyword made from the string you supplied. If you pass a `nil` after the number, it tells Afterglow to not create a function at all for that part of the range. The range specifications need to be in order of increasing starting values, and the ending values for each will be figured out by context. The best way to understand this is to look at an example, like the specification for channel 9 of the Torrent F3: [source,clojure] ---- (chan/functions :shutter 9 0 "shutter-closed" 32 "shutter-open" 64 {:type :strobe :scale-fn (partial function-value-scaler 14 100) :label "Strobe (1.4Hz->10Hz)" :range :variable} 96 "shutter-open-2" 128 :pulse-strobe 160 "shutter-open-3" 192 :random-strobe 224 "shutter-open-4") ---- This sets up a channel of type `:shutter` with offset `9`. The remaining arguments are pairs which define function ranges. The first two pairs use the String shortcut to set up a fixed-ranged function of type `:shutter-closed` from `0`-`31`, and another fixed-range function of type `:shutter-open` from `32`-`63`. Then there is a more complex function specification, using the map approach to set up a variable-range function of type `:strobe` from `64`-`95`, assign it a function label of `Strobe (1.4Hz->10Hz)`, and assign it a scaling function, which maps the values from 14 to 100 onto tenth-Hertz frequency values, to try to normalize the strobe speed of the fixture, since `:strobe` is a very common function, and it is nice to try to get different models of fixtures to react similarly when a given value for that function is assigned to them. > The discussion of the `:strobe` standard function <> provides another example of this approach, and explains it further. This is followed by another fixed-range function of type `:shutter-open-2` from `96`-`127` set up using the String shortcut, and a simpler variable-range function of type `:pulse-strobe` from `128`-`159` set up using the keyword shortcut rather than a map. That line finishes with a fixed-range function of type `:shutter-open-3` from `160`-`191` created using the String shortcut. Since the Torrent's pulse strobe mode is not something any of the other fixtures support, there was no need to try to use a scaling function to make it approximate another fixture's speed. The last two pairs should be easily understood by now, as we have seen their like before. The second-to-last line uses the keyword shortcut to create a variable-range function of type `:random-strobe` from `192`-`223`, and the last line uses the String shortcut to create a fixed-range function of type `:shutter-open-4` from `224` to the largest legal DMX value of `255`. Again, random strobing is a function unique to the Torrent, so no effort was made to scale it. NOTE: The various shutter-open ranges all do the same thing, but need to be given different names, since function names must be unique; it is a quirk of this fixture that it has multiple ranges with the same function. Another valid approach for handling the redundant later ranges would have been to pass `nil` after the number to tell Afterglow to not create a function for them. [[generic-channels]] ==== Generic Channels If none of the above functions match the channel you are creating, you can use {api-doc}afterglow.channels.html#var-fine-channel[`afterglow.channels/fine-channel`] to create the definition. It always takes at least two arguments: `chan-type`, a keyword identfying the type of the channel (please see the list of <> below and try to reuse one if it is appropriate, or at least create your keyword in a way that follows their conventions), and the channel `offset` (as described <>). If the channel uses two-byte values for more precise control, use the most-significant byte as the `offset` value, and pass the offset of the least-significant byte using the optional keyword argument `:fine-offset`. If for some reason the channel's function type should differ from the value you gave for `chan-type`, you can pass a different keyword to use when creating the function range, using the optional keyword argument `:function-type`. If you want to use a variable label which differs from the name of the channel's function type keyword in the user interface when <> <> (for example, if the keyword is hyphenated, and you want the label to use a space), specify your desired label with the optional keyword argument `:var-label`. [[function-creation-functions]] === Function Creation Functions There are also functions to help you create function specifications in your channel definitions. [[color-wheel-hue]] ==== Color Wheel Hue {api-doc}afterglow.channels.html#var-color-wheel-hue[`afterglow.channels/color-wheel-hue`] returns a function specification which ties a color wheel position to a particular hue, so the color wheel can participate in Afterglow's color effects. See the {api-doc}afterglow.channels.html#var-color-wheel-hue[API documentation] for more details, and the {api-doc}afterglow.fixtures.blizzard.html#var-torrent-f3[Torrent F3] fixture definition source for an example of its use. [[standard-function-types]] == Standard Function Types <> and <> trigger and control specific functions, potentially across a range of different fixture types from different manufacturers. In order for that to work, the <> must be created with consistent `:type` keywords. When you are creating a new fixture definition, check to see if any of the functions that it provides are covered by this table, and if so, use the same keywords to identify them, so your fixture can participate with other fixtures in effects using that function. If your function does not fit into this list, make up a keyword that makes sense for it, following the style shown here. And also please consider (if the function type is likely to be present on other fixtures and useful to other people) opening an https://github.com/Deep-Symmetry/afterglow/issues[issue] requesting that your new function type be added to this list so that when other people create definitions for similar fixtures, they can interoperate with yours. [cols="2l,5a", options="header"] |=== |Function Key |Description |:dimmer |Controls the overall brightness of the fixture or head, independent of any color intensity channels which might also affect it. This is also a fundamental channel type in Afterglow, and has a category of <> to work with it. Dimmer effects can work with either fully dedicated dimmer channels (in which case the channel itself has a `:type` of `:dimmer`, and the entire DMX range is used for dimming), or multipurpose channels in which a subset of the DMX range is assigned to a function of type `:dimmer`, and the channel `:type` is something else (like `:control`, as suggested below). |:red :green :blue :white :amber :uv |These identify functions (usually entire channels) which control the intensity of a particular color, usually on LED fixtures. When you create a channel of type `:color`, it will have a `:color` key with this value, and a corresponding function range. If your fixture has LEDs of colors other than these, use the color name to identify the function. (This will happen automatically when you use the {api-doc}afterglow.channels.html#var-color[`color`] channel <> to create the channel.) Color channels are fundamental channel types in Afterglow, and the colors `:red`, `:green`, `:blue`, and `:white` will automatically participate in the color mixing Afterglow performs with <>. The others can too if, as described <>, the `:color` channel has a `:hue` entry. |:pan :tilt |Rotates the fixture about its Y (in the case of `:pan`) or X (in the case of `:tilt`) axis. These are also fundamental channel types in Afterglow, and have categories of <> and <> to work with them. |:strobe |[[strobe-function]]Causes the fixture to flash on and off abruptly (and usually rapidly). This is typically a variable-range function, so different values within the function range cause the fixture to strobe at different speeds. If possible, use a `:scale-fn` function (with the help of {api-doc}afterglow.effects.channel.html#var-function-value-scaler[`afterglow.effects.channel/function-value-scaler`]) when creating a strobe function so that the function level is interpreted as an approximate Hz rate for the strobe, and your new fixture will strobe in rough tandem with other fixtures being strobed. Take a look at the strobe function definitions for the existing fixtures for examples how to do this. All you need to do is measure the slowest and fastest rates at which your fixture actually strobes, as best you can, and use them like this: [source,clojure] ---- (chan/functions :strobe 7 0 nil 11 {:type :strobe :scale-fn (partial function-value-scaler 6.6 100) :label "Strobe (0.66Hz->10Hz)" :range :variable}) ---- In this example, the fixture's strobe channel is at offset `7`, and the range from `0`-`10` does not strobe (the `nil` function specification tells Afterglow to skip creating a function for that range), while at `11` it begins to strobe approximately 0.66 times per second (or 6.6 times every ten seconds, which gives a more useful spread of strobe values across the normal function value assignment range of 1-100), and strobes faster for higher values, finally reaching around ten times per second at the maximum function value of `100`. > Measuring the actual strobing rate of arbitrary fixtures is difficult to get right, I am not yet quite satisfied with the scaling function values for my lighting rig, but for all practical purposes, the audience does not notice the difference when being dazzled by strobes. |:focus |Adjusts the focal plane of the fixture, usually a moving-head spot with the ability to project gobos (templates). |:frost |Controls a frost effect, softening the beam of light. |:iris |Controls the iris size, widening or narrowing the beam of light. |:zoom |Adjusts the rate at which the beam spreads as it travels further from the fixture. |:sound-active |Puts the fixture in a mode where it decides what to do by listening to music in the environment, rather than being directly controlled by its DMX channels. |=== [[translating-qlc-fixture-definitions]] == Translating QLC+ Fixture Definitions http://www.qlcplus.org[QLC+] is an established and powerful free and open-source lighting control system aimed at more traditional workflows than Afterglow. If you were not already aware of it, you should definitely take a look. And since it has been around a while, used by an increasing variety of people, it has had time to accumulate a bunch of fixture definitions for lights that you are likely to encounter or own. Even though QLC+ does not model fixtures in as much detail as Afterglow, so their definitions are incomplete from our perspective (lacking geometry information for aim and direction cues, and explicit links between channels that pair up to control a single fixture function, among other things), Afterglow can still use them as a starting point to help you creating a fixture definition, and save a whole lot of time reading fixture manuals, and trial and error... especially when it comes to channels with a lot of functions, like gobo wheels. So when you decide to create an Afterglow fixture definition, start by looking to see if QLC+ already has one for that fixture. You can find its current set of fixture definitions on https://github.com/mcallegari/qlcplus/tree/master/resources/fixtures[GitHub]. If you see one for the fixture you want, you can either click on it and download it individually (after choosing the `Raw` view for the file in its header bar), or, if you are already using git, you can clone the entire project to get local copies of all the fixture definitions. Once you have downloaded the QLC+ fixture definition file, you can invoke Afterglow from the command line, as described in the https://github.com/Deep-Symmetry/afterglow#usage[Usage] section on the project page, to translate it into an Afterglow fixture definition. For example, translating the definition for the https://github.com/mcallegari/qlcplus/blob/master/resources/fixtures/American_DJ/American-DJ-ECO-UV-BAR-DMX.qxf[American DJ Eco UV Bar], like so: ``` % java -jar afterglow.jar -q American-DJ-ECO-UV-BAR-DMX.qxf Translated fixture definition written to eco-uv-bar-dmx.clj ``` would result in the following Afterglow fixture definition file: ```clojure (ns afterglow.fixtures.american-dj "Translated definition for the fixture ECO UV BAR DMX from American DJ. This was created by Afterglow from the QLC+ Fixture Definintion (.qxf) file, and will almost certainly need some manual adjustment in order to enable full Afterglow capabilities. If you have more than one fixture definition for this manufacturer, you can consolidate them into a single file if you like, with a single copy of this namespace definition, since it is the same for all fixture definitions translated by Afterglow. Once you have completed the fixture definition, and are happy with the way everything is being controlled by Afterglow, please consider submitting it for inclusion with Afterglow, either as a Pull Request at https://github.com/Deep-Symmetry/afterglow/pulls if you are comfortable putting that together, or just on the Wiki if that's easier for you: https://github.com/Deep-Symmetry/afterglow/wiki/Questions#defining-fixtures The original fixture defintition was created by Rob G. using Q Light Controller Plus version 5.0.0 GIT. QLC+ Fixture Type: Other" (:require [afterglow.channels :as chan] [afterglow.effects.channel :as chan-fx])) (defn eco-uv-bar-dmx "ECO UV BAR DMX. Please flesh out this documentation if you are submitting this for inclusion into Afterglow. See, for example, the Blizzard fixture definitions: http://deepsymmetry.org/afterglow/api-doc/afterglow.fixtures.blizzard.html" [] {:channels [(chan/color 1 :uv) ; TODO: add :hue key if you want to color mix this (chan/fine-channel :strobing 2 :function-name "Strobing" :var-label "Strobing (slow -> fast)") (chan/functions :dimmer-curve 3 0 {:type :dimmer-curve-no-dimmer-curve :label "No dimmer curve" :range :variable} 21 {:type :dimmer-curve-dimmer-curve-1 :label "Dimmer curve 1" :range :variable} 41 {:type :dimmer-curve-dimmer-curve-2 :label "Dimmer curve 2" :range :variable} 61 {:type :dimmer-curve-dimmer-curve-3 :label "Dimmer curve 3" :range :variable} 81 {:type :dimmer-curve-dimmer-curve-4 :label "Dimmer curve 4" :range :variable} 101 {:type :dimmer-curve-delay-mode-control :label "Delay mode control" :range :variable})] :name "ECO UV BAR DMX"}) ``` > Of course this is a very simple fixture, but I didn't want to waste > a ton of space on the example, and it shows the basic idea. The new definition file will be written to the same directory as the `.qxf` file it was based on. It is not named in a way (nor placed in the necessary directory hierarchy) that would enable it to be loaded using a normal Clojure `require` form, because it is intended to be loaded individualy using Afterglow's init-file mechanism, also described in https://github.com/Deep-Symmetry/afterglow#usage[Usage], and within https://github.com/Deep-Symmetry/afterglow-max#afterglow-max[afterglow-max], by the `load-init-file` function. If you are creating definitions for several fixtures from the same manufacturer, you are encouraged to combine them into a single file, as described in the API documentation at the top of the example above, using your favorite text editor. The `ns` form places the fixture definition functions in a package named after the manufacturer, and so needs to appear only once at the top of the file, and all the fixture definition functions themselves can be listed after it. Using the fixture definition from this example, once the file is loaded, is as simple as calling `(afterglow.fixtures.american-dj/eco-uv-bar-dmx)` within {api-doc}afterglow.show.html#var-patch-fixture.21[`show/patch-fixture!`]. [[lost-in-translation]] === What's Missing from Translated Fixture Definitions As mentioned in the introduction, there are some things that Afterglow simply cannot guess from translated fixture definitions. Even in simple cases like this example, you will find things that you can make better by hand-editing the results based on your understanding of the fixture, after reading its manual or working with it for a bit. [[no-function-specifications]] ==== Function Specifications First off, all fixture function ranges are created as `:variable`, meaning that they do slightly different things along the range of values that activate that function, because QLC+ does not distinguish between fixed and variable functions. In the event that the function actually has no adjustable behavior, you will want to change `:range :variable` in the corresponding function specification entry to `:range :fixed`, so that the user interface of a function cue created for this fixture properly reflects the fixture's behavior. I am pretty sure that is something that should be done for all the ranges in this example, but I don't have the actual fixture to test it and see. Function specifications are explained in more depth <>. The types and labels assigned to the function ranges are derived from the labels in the `.qxf` file, and uniqueness is enforced, but they are probably too long in many cases (especially if you want them to be readable in the Web or Ableton Push interfaces), and in some cases should be adjusted to match up with the <> so that they can automatically work with cues. (This is especially likely to be the case with strobe cues, for example. Compare the translated definitions with some that ship with Afterglow as you are starting to get a feel for these issues.) [[no-channel-types]] ==== Channel Types Afterglow tries to guess what kinds of channels it finds, based on their name, and aspects of their structure. For simple cases it will get it right, and save you time, but it might be wrong. This is especially important to double-check for dimmer channels, to make sure they are properly detected, since only then will they participate in <> and the Master chain. (And you don't want inappropriate channels to be mapped as dimmer channels for the opposite reason.) [[no-dimmer-channels]] ==== Dimmer Channels In addition to the possibility that a dimmer channel might be misidentified, as described above, some fixtures have _inverted_ dimmer channels, which do not get brighter as the DMX value increases. The `.qxf` file does not record this information, so you will need to manually add it to the <>. [[no-color-channels]] ==== Color Channels Colors are fairly well represented and identified in the QLC+ format, and if you have a channel controlling a red, green, blue, or white channel, chances are good that it will be properly translated. If you have an LED fixture with other colors, like amber, UV, or beyond, and want these other channels to participate in Afterglow's automatic color mixing capabilities, as noted by the `TODO:` comment in the translation example above, you will need to add a `:hue` key to the color channel definition, containing the actual hue value of the LEDs controlled by that channel. The Chauvet SlimPar Hex IRC {branch-base}src/afterglow/fixtures/chauvet.clj[definition] that ships with Afterglow contains a nice example of doing this for its amber and UV channels, and shows how to make this extended color mixing an optional feature when using the fixture definition. [[no-two-byte-channels]] ==== Two-Byte Channels DMX parameter values are integers which only range from 0-255. That is not enough to achieve precise pan and tilt movements, and some fixtures even want to allow more precise dimming values and color intensities. In order to achieve that, they use more than one channel to communicate a single parameter value. QLC+ fixture definition files reflect this to an extent, using their `Group` tags which have a `Byte` value of 0 or 1. But there is no explicit link in the `.qxf` file between the channels that are controlling the same value. Afterglow is able to figure it out in simple cases, such as where there are two channels controlling the intensity of the color red, using bytes 0 and 1. But if there are more than two channels serving the same purpose, it cannot figure out the relationships, and you will have to sort that out using the fixture's manual. Once you do, get rid of the channel specification for the least-significant byte in the fixture definition, and specify that channel as the `fine-channel` value for the channel specification of the most-significant byte, as documented in the <> section. [[no-geometric-information]] ==== Geometric Information If the fixture includes a Pan or Tilt channel, you will see additional `TODO:` comments telling you that you need to add information about how the channel actually physically rotates the fixture, in order for Afterglow to be able to accurately calculate <> and <> effects with it. The <> describes the `:pan-center`, `:pan-half-circle`, `:tilt-center`, and `:tilt-half-circle` values that you will need to figure out experimentally. > We hope to someday help automate part of this process, which will > make it easier for all of us! Similarly, if the fixture has multiple heads, you will see `TODO:` entries where you need to fill in their <> relative to the origin of the fixture itself, so that <> can work properly with them. [[dont-panic]] === Don't Panic! Even though this sounds like a lot of things that can go wrong trying to build an Afterglow fixture definition, most of the problem areas are subtle, or relate to the more advanced capabilities of Afterglow. Chances are very good that the automatically generated fixture definition will at least enable basic control of the fixture right away. So try that, and gain some confidence, as you gradually explore the areas where it isn't quite doing what you want, and tackle those one at a time. And, as you do, remember that you can get help: [[when-things-go-awry]] === When Things Go Awry Not all definitions have been tested with the translator, and there may be scenarios that it gets fundamentally wrong. If so, please raise an https://github.com/Deep-Symmetry/afterglow/issues[Issue], so we can see if it is something that can be fixed, or a fundamental limitation of the translation approach that should be documented here. If you are having trouble figuring out the details of how to finish or use your fixture definition, please ask for help on the https://deep-symmetry.zulipchat.com/#narrow/stream/318697-afterglow[Zulip chat] or https://github.com/Deep-Symmetry/afterglow/wiki/Questions#defining-fixtures[Wiki]. Not only will that hopefully get you going faster, but it might help others in the future, especially if it leads to improvements in the documentation or Afterglow itself. ================================================ FILE: doc/modules/ROOT/pages/launchpad.adoc ================================================ = Using the Novation Launchpad Family James Elliott Novation makes an entire family of grid controllers which can all be used with Afterglow, with differing capabilities. The most powerful is the Launchpad Pro, with pressure-sensitive RGB pads. [[binding-to-a-launchpad]] == Binding to a Launchpad Assuming you have a Launchpad family controller connected to the machine running Afterglow, Afterglow will find and activate it as soon as you have set up the sample show. You will see a brief startup animation, and Afterglow's appropriate Launchpad interface will start. TIP: For information about how to set up bindings without the sample show, or more details about how it works, see <>. [[using-launchpad-pro]] == Using Launchpad Pro With its pressure-sensitive, RGB-capable 8×8 pad grid, the Novation Launchpad Pro makes an excellent grid controller for Afterglow, and has its own custom {api-doc}afterglow.controllers.launchpad-pro.html[mapping]. > There are also mappings for the <>, <> Here is what the Launchpad Pro interface looks like: image::LaunchpadPro.jpg[Launchpad Pro interface,1000,1011] [[show-control]] === Show Control Once you have the Launchpad linked to a show, it becomes a helpful way to monitor and control the cues and manage the musical synchronization of the show. The red kbd:[Stop] button at the bottom can be used to stop a running show, which will suspend the processing of its effects, and black out all universes assigned to the show. The button will be illuminated brightly while the show is stopped. Pressing it again will restart the show where it would have been had it not stopped, and dim the button again. Most of the space on the interface is dedicated to an 8×8 grid of color coded cue trigger pads, which provide a window onto the show's overall <>. The Launchpad can be <> to the <> so that both always display the same section of the cue grid, and the web interface can remind you of the names of the cues you are looking at, or it can be scrolled independently, allowing you access to more cues at the same time. TIP: If you have more than one compatible grid controller, you can have Afterglow using all of them at the same time; each can be scrolled to different areas of the cue grid, and each can even be linked to a different browser window if you have that much screen space. You can activate any cue shown by pressing its pad; running cues will light up, and darken again when they end. If the cues are configured to respond to velocity, you can adjust the corresponding variables by how hard you are pressing on the pad while the cue is running. To stop a running cue, press its pad again. Some cues will end immediately, others will continue to run until they reach what they feel is an appropriate stopping point. While they are in the process of ending, the cue pad will blink. If you want the cue to end immediately even though it would otherwise run for a while longer, you can press the blinking cue pad again and it will be killed right then. The colors assigned to cue pads by the creator of the cue grid are intended to help identify related cues. Some cues (especially intense ones like strobes) are configured to run only as long as they are held down. In that case, when you press cue pad, it lights up with a whitened version of the cue color as a hint that this is happening, and as soon as you release the pad, the cue will end. If you want to override this behavior, you can hold down the kbd:[Shift] button (towards the top left of the Launchpad Pro) as you press the cue pad, and it will activate as a normal cue, staying on until you press it a second time. As noted above, cues can also be configured to take advantage of the pressure sensitivity of the Launchpad Pro cue pads, so that as you vary the pressure with which you are holding down the pad, some visible variable of the cue is altered. The strobe and sparkle cues in created by {api-doc}afterglow.examples.html#var-make-cues[`afterglow.examples/make-cues`] for the sample show work this way: the intensity and lightness of the strobe are increased by pressure, and so is the chance that a sparkle will be assigned to a light on each frame. NOTE: In order for aftertouch to work with your cues--in other words, for you to be able to adjust cue variables by varing pressure on the pad after you have launched it--you need to set your Launchpad Pro's *Aftertouch* mode to *Polyphonic*, as described in the *Setup Button* section of the https://downloads.novationmusic.com/novation/launchpad-mk2/launchpad-pro[User Guide]. You might also want to set the *Aftertouch Threshold* to *Low*. Cues may be mutually exclusive by nature, and if they were created to reflect this (by using the same keyword to register their effects with the show, or specifying other effect keys in their `:end-keys` list), when you activate one, the other cues which use the same keyword are dimmed. This is a hint that when you activate one of them, it will _replace_ the others, rather than running at the same time. (There are photos demonstrating this effect on the <>.) [[scrolling]] === Scrolling The show will likely have many more cues than fit on the pad grid; the row of arrow buttons at the top left allow you to page through the larger show grid. If there are more cues available in a given direction, that arrow will be lit, otherwise it is dark. Pressing an active arrow scrolls the view one “page” in that direction. In the photo below, it is currently possible to scroll down and to the left: image::LaunchpadPro-scroll.jpg[Launchpad Pro interface,800,539] If you hold down the kbd:[Shift] button, the arrows will scroll you as far as possible in the direction that you press. [[metronome-control]] === Metronome Control The kbd:[Click] button lets you monitor and adjust the Metronome that the show is using to keep time with the music that is being played. Since Afterglow's effects are generally defined with respect to the metronome, it is important to keep it synchronized with the music. The kbd:[Click] button label flashes at each beat, and the color of the button tells you whether the metronome is syncronized to an external source. If it is blue, as in the first photo in this section, the tempo is being set manually. If green, as is shown right above, then tempo is being driven by an external source, such as MIDI or DJ Link Pro. If the button is red, it means that Afterglow was configured to sync to some external source, but has lost contact with it. The most basic way of synchronizing the metronome is to tap the kbd:[Click] button at each beat of the music. Tapping the button aligns the metronome to a beat, and if you tap it three or more times within two seconds of each preceding tap, sets the metronome's BPM. Tap it as you hear each beat of the music, and after three or more taps, the speed of the metronome will be approximately synchronized with the music. Once the tempo is correct, you can tell Afterglow which beat is the down beat by holding down the kbd:[Shift] button while pressing kbd:[Click]. This combination does not change the tempo, but tells Afterglow that the moment when you tapped the button is the down beat (the first beat of a bar). Trying to keep up with tempo changes during dynamic shows can be tedious, so you will hopefully be able to take advantage of Afterglow's metronome synchronization features. If the DJ can send you <>, or you can connect via a Local Area Network to Pioneer professional DJ gear to lock into the beat grid established by <>, Afterglow can keep the BPM (with MIDI) and even the beats (with Pro DJ Link and the Traktor Afterglow Beat Phase <>) synchronized for you. You can use the <> to configure metronome sync. Once your sync is established, the meaning of the kbd:[Click] button changes. If you are using MIDI clock to sync the BPM, it becomes a kbd:[Tap Beat] button, which simply establishes where the beat falls. If you are locked in to a Pro DJ Link beat grid or using the Traktor beat phase mapping, the beats are automatically aligned for you so, it becomes a kbd:[Tap Bar] button which, when pressed, indicates that the current beat is the down beat (start) of a bar. In these sync modes you can also use the kbd:[Shift] button to align at the next bigger boundary: If tapping kbd:[Click] would normally move the bar, shift-tapping will move the phrase. [[sharing-the-launchpad-pro]] === Sharing the Launchpad Pro If you are using Afterglow at the same time as Ableton Live, you can switch back and forth between which has control of the Launchpad Pro by pressing the kbd:[User] button. If Live is not running when you press kbd:[User], the Launchpad interface will simply go blank (except for the kbd:[User] button itself), until you press it again, at which point Afterglow will light it up. NOTE: Future releases may take advantage of more of the buttons on the controller. [[using-launchpad-mk2]] == Using Launchpad Mk2 The Launchpad Mk2 is very similar to the Pro, except that it lacks velocity sensitivity and has fewer buttons outside the cue grid. For the most part you can follow the <> instructions above (ignoring the discussion of velocity sensitivity and aftertouch configuration), but refer to the button mapping shown for the Launchpad Mini and Launchpad S <>, because the Launchpad Mk2 {api-doc}afterglow.controllers.launchpad-mk2.html[mapping] uses the same arrangement of round buttons as those controllers. [[using-launchpad-mini-and-launchpad-s]] == Using Launchpad Mini and Launchpad S These two controllers share the same {api-doc}afterglow.controllers.launchpad-mini.html[mapping] because they are functionally identical--the Mini is a highly compact version of the S. Neither supports velocity, and they have a very limited color palette, so the mapping does not attempt to reflect the Afterglow cue grid colors. Instead, colors are used to represent cue state. > The mapping of these controllers was made possible thanks to the kind loan of a Launchpad Mini for that purpose by Novation. [[cue-grid-colors]] === Launchpad Mini and S Cue Grid Colors Pads which have no cues associated with them are dark. If the pad has a cue that is not running, it will be amber. If the pad's cue conflicts with another cue that is running, it will be a dim amber. Cues which are running are bright green; cues which are ending blink red, as illustrated below. The round buttons along the top are used to scroll around the grid, using the same conventions as the decals which come with the Launchpad Mini (and the arrows printed on the Launchpad S). The User 2 button can be used suspend and resume the Afterglow mapping. The round buttons on the right side are used to adjust the metronome, and start or stop the show, as shown: [[launchpad-mini-image]] image::LaunchpadMini.jpg[Launchpad Mini interface,1186,1194] > The Tap Tempo button corresponds to the button labeled Volume on the Launchpad S (and on the decal which comes with the Launchpad Mini), the Stop button matches the decal and printed label, and the Shift button corresponds to the Arm button. Although the locations of these buttons are different, they light up and respond as described in the <> instructions above. Cues which run only while you hold them down will light up as bright amber instead of green while you are holding them, to let you know they will end as soon as you release the pad. As with other controller mappings, if you hold down the Shift button (the bottom right round button) while launching such a momentary cue, it will stay running even after you let it go, and in that case will be green. ================================================ FILE: doc/modules/ROOT/pages/mapping_sync.adoc ================================================ = MIDI Mapping and Beat Sync James Elliott Afterglow is designed to work with MIDI controllers and DJ equipment. You can bind physical controller elements to trigger cues and adjust show variables, and sync the BPM of the show master metronome to MIDI clock pulses from a DJ controller or mixer. (Although if you have professional Pioneer gear, you are better off syncing the metronome to the Pro DJ Link via an Ethernet cable.) NOTE: These examples assume you are in a Clojure REPL with Afterglow loaded, in the namespace `afterglow.examples`. This is the default namespace you get if you check out the project and run `lein repl`. The sample show is assumed to be running; if not, `(show/start!)` [[mapping-cues-to-a-controller]] == Mapping Cues to a Controller Although the most convenient and powerful way of running cues with Afterglow is to use a large grid controller with color feedback (like the Ableton Push or Novation Launchpad Pro, which can mirror the cue grid of the web interface) you can still accomplish a great deal with a simple controller with a few buttons. You will still want to start by creating the cues in the show cue grid, not only so you can see and manipulate them with the web interface, but also because that is how they can be mapped to MIDI controllers. (The rich <> and <> mappings are described in detail on their own pages.) First you need to identify the MIDI messages that the controller sends when you press and release the interface element you want to assign the cue. Afterglow can help with that too, as described <>. Once you have the cue created and the control identified, you can create the mapping using {api-doc}afterglow.effects.cues.html#var-add-midi-to-cue-mapping[`afterglow.effects.cues/add-midi-to-cue-mapping`], like: [source,clojure] ---- (cues/add-midi-to-cue-mapping "nano" 0 :control 46 0 6) ---- This would cause Afterglow to start or stop the cue at grid position (0, 6) when a pad on the device named "nano" is pressed and sends a MIDI control change message on control number 46. See the {api-doc}afterglow.effects.cues.html#var-add-midi-to-cue-mapping[documentation] for details on all the arguments. TIP: If the controller has LEDs associated with the controls, and you can configure it so that its LEDs are in external control mode, Afterglow will even give you feedback about when the cue is running, by lighting up the pad or button when the cue starts (whether or not you started it using this controller), and darkening it when the cue ends. If you are unable to configure your controller in this way, or there is some other reason why you want to avoid having Afterglow send it MIDI messages about the cue status, pass the additional arguments `:feedback-on false` to `add-midi-to-cue-mapping`. See the function {api-doc}afterglow.effects.cues.html#var-add-midi-to-cue-mapping[documentation] for full details. If you want to be able to later remove this cue mapping, be sure to save the value returned by `add-midi-to-cue-mapping` in a variable, because you will need to pass it to {api-doc}afterglow.effects.cues.html#var-remove-midi-to-cue-mapping[`remove-midi-to-cue-mapping`]. Or you can simply disconnect the controller from your system, and Afterglow will clean up any mappings that had been assigned to it. Also be sure to see the section <> that explains how you can arrange to have afterglow automatically call the relevant MIDI mapping functions to set up your device whenever it is connected. NOTE: If you are mapping a cue that is set up with velocity sensitive variables, and your controller is not actually velocity-sensitive, you might find the cue being activated more intensely than you like, because the controller is always sending maximum velocity values when pressed. You can work around this by passing the optional `:use-veolocity` argument along with an explicit velocity value from `0` to `127` to `add-midi-to-cue-mapping`. This will cause the mapping to act as if the button was pressed with the velocity you specified here, allowing you to choose the values with which the cue gets activated. [[mapping-a-control-to-a-variable]] == Mapping a Control to a Variable You can also tie an encoder or fader on a MIDI control surface to a show variable, so that turning the encoder or sliding the fader changes the value of the variable. If you have set up cues to look at that variable, through <>, the control surface can then vary the look of the effect created by the cue, both before the cue is launched, and while it is running. Here is a lower-level example of how I can use {api-doc}afterglow.show.html#var-add-midi-control-to-var-mapping[`add-midi-control-to-var-mapping`] have a knob on one of my simple MIDI controllers set the hue of all the lights. It shows up with a MIDI port name of `SLIDER/KNOB`, and its first rotary controller is control 16 on channel 0. I can map that to set a show variable `knob-1` to the values 0-360 (the legal hue values): [source,clojure] ---- (show/add-midi-control-to-var-mapping "Slider" 0 16 :knob-1 :max 360) ---- NOTE: See the {api-doc}afterglow.show.html#var-add-midi-control-to-var-mapping[documentation] for details about all the arguments. Also, if you want to map a color component like this, there is a <> to do it that makes it easier to work with the color in the web interface. Then I can create a global color effect based on that variable: [source,clojure] ---- (show/add-effect! :color (global-color-effect (params/build-color-param :s 100 :l 50 :h :knob-1))) ---- It is also possible to perform arbitrary transformation of the MIDI value before storing it into the show variable, by passing `add-midi-control-to-var-mapping` a transformation function using the optional keyword argument `:transform-fn`. The function you supply will called with the MIDI value (already scaled, if you passed a value with `:min` or `:max`), and whatever it returns will be stored in the variable. Your function can contain whatever logic it needs, and does not even need to return a number. As a simple example, suppose you want to set up a `:beat-ratio` variable for configuring oscillators, and you want it to have the value 1, 2, 4, or 8, depending on how far a fader is raised. Since those are all powers of two, you could implement the varible binding like this: [source,clojure] ---- (show/add-midi-control-to-var-mapping "SLIDER" 0 1 :beat-ratio :max 3 :transform-fn (fn [v] (Math/pow 2 (Math/round v)))) ---- NOTE: This intercepts any MIDI control-change messages for the device whose name or description contains "SLIDER", on channel 0, controller number 1. It scales the incoming control value to the range 0 through 3, then calls a custom function which rounds the scaled value to the nearest integer, and raises 2 to that power. The result gets stored into the show variable `:beat-ratio`. If you want to be able to later remove this variable mapping, be sure to save the value returned by `add-midi-control-to-var-mapping` in a variable, because you will need to pass it to {api-doc}afterglow.midi.html#var-remove-control-mapping[`remove-control-mapping`]. Or you can simply disconnect the controller from your system, and Afterglow will clean up any mappings that had been assigned to it. Also be sure to see the section <> that explains how you can arrange to have afterglow automatically call the relevant MIDI mapping functions to set up your device whenever it is connected. [[finding-mapping-details]] == Finding Mapping Details In the all-too likely event you don’t have all your MIDI port names and control channel and note numbers memorized, Afterglow can help. Just run... [source,clojure] ---- (afterglow.midi/identify-mapping) ---- ...then twiddle the knob, slide the fader, or press the button you wish to map. Afterglow will report the first control-change or note message it receives: [source,clojure] ---- {:command :control-change, :channel 0, :note 32, :velocity 127, :device {:name "SLIDER/KNOB", :description "nanoKONTROL2 SLIDER/KNOB"}} ---- ____ Notice that even for control changes, the controller number is identified as `:note` (32 in this example). ____ If nothing is received for ten seconds, it will give up: [source,clojure] ---- nil ---- If this happens, and you are sure the device is connected, you will need to troubleshoot your MIDI setup. If you are on a Mac, and the device was not connected when you started Afterglow, be sure that you have installed https://github.com/DerekCook/CoreMidi4J/releases[CoreMIDI4J] as discussed on the https://github.com/Deep-Symmetry/afterglow/wiki/Questions#midi-from-java-on-the-mac[Afterglow Wiki]. NOTE: These examples show how to perform low-level MIDI mapping. Over time, you might find that someone has written a rich user interface binding for your controller, as has been done for the <>, which would let you jump right in without having to worry about such details. These examples can still help explain how your controller's binding works, or encourage you to write and share a binding for a new controller that you happen to have. [[automatic-bindings]] == Automatically Creating Bindings When a Device Connects You can tell Afterglow to watch for a particular device to be connected and call a function whenever it is present. This function can set up all of the MIDI bindings you want for that device. This is convenient because if the device is not there, nothing will happen (and there will be no errors), but if it is, the bindings will be set up. Even more importantly, in a performance context, if the device is accidentally disconnected or powered down, the bindings will be reconfigured as soon as it is reconnected. To do this, set up a function like `map-nano` in the example below which creates all the MIDI bindings you want for your device, and then call {api-doc}afterglow.midi.html#var-watch-for[`afterglow.midi/watch-for`] to cause that function to be called whenever a device with a matching name or description is connected: [source,clojure] ---- (defn map-nano [] (cues/add-midi-to-cue-mapping "nano" 0 :control 46 0 6) (show/add-midi-control-to-var-mapping "nano" 0 16 :knob-1 :max 360)) (afterglow.midi/watch-for "nano" map-nano) ---- TIP: If you want to be able to cancel the watcher later, be sure to save the value returned by `watch-for` in a variable. The return value is a function which cancels that watcher when you call it. See the `watch-for` {api-doc}afterglow.midi.html#var-watch-for[documentation] for details about other ways you can configure it, such as adjusting how long it waits for the new device to stabilize before calling your function, and how to provide another function that gets called to clean up when the device is disconnected. You do not need to worry about cleaning up ordinary MIDI bindings, since Afterglow automatically does that whenever a device is disconnected, but if you have set up any of your own state that you would like to remove, you can use this mechanism to do so. [[mapping-a-control-to-a-color-component]] == Mapping a Control to a Color Component When you are working with colors for cues, Afterglow lets you put a <> in a show variable or cue parameter, rather than simply storing individual numeric components like the hue. Doing this lets the web and Ableton Push interfaces give the user a rich color picker interface for adjusting that variable or parameter, so it is usually a better approach than just storing the numbers that make up the color. When you do that, you can still use any MIDI controller to adjust components of that color, using {api-doc}afterglow.controllers.color.html#var-add-midi-control-to-color-mapping[`afterglow.controllers.color/add-midi-control-to-color-mapping`]. Here is an example of how to tie the left six faders on one of my simple MIDI controllers to adjust all of the components that make up the color used by the sample show's strobe effects. The controller shows up with a MIDI port name of `SLIDER/KNOB`, and its fader controllers are controls 0 through 7 on channel 0. Assigning the first six to adjust components of the strobe color looks like: [source,clojure] ---- (require '[afterglow.controllers.color :as color-ctl]) (color-ctl/add-midi-control-to-color-mapping "SLIDER" 0 0 :strobe-color :red) (color-ctl/add-midi-control-to-color-mapping "SLIDER" 0 1 :strobe-color :green) (color-ctl/add-midi-control-to-color-mapping "SLIDER" 0 2 :strobe-color :blue) (color-ctl/add-midi-control-to-color-mapping "SLIDER" 0 3 :strobe-color :hue) (color-ctl/add-midi-control-to-color-mapping "SLIDER" 0 4 :strobe-color :saturation) (color-ctl/add-midi-control-to-color-mapping "SLIDER" 0 5 :strobe-color :lightness) ---- NOTE: See the {api-doc}afterglow.controllers.color.html#var-add-midi-control-to-color-mapping[documentation] for details about all the arguments; this simple example assumes you want to access the full range of each color component and that higher MIDI values should map to higher color values. Also, even though it is included here for completeness, there is no point in assigning a value to the `:strobe-color` variable's `:lightness` component, since that is under the control of the strobe cue. With this done, as I move the sliders on this MIDI controller, I can see the colors of the strobe cues in the web interface and on the Ableton Push and Novation Launchpad grids changing (and on the lights themselves if any strobe cue is running at the time). [[mapping-dimmer-masters]] == Mapping a Control to a Dimmer Master The web interface and Ableton Push mapping have dedicated interfaces for controlling the show's dimmer grand master, but you can map any MIDI controller fader or rotary controller to it, or to any other dimmer master that you have created to control your cues, using {api-doc}afterglow.show.html#var-add-midi-control-to-master-mapping[`add-midi-control-to-master-mapping`]. Here is an example of how to tie the leftmost fader on one of my simple MIDI controllers to the show's dimmer grand master. The controller shows up with a MIDI port name of `SLIDER/KNOB`, and its first fader controller is control 0 on channel 0. I can map that to set the show grand master to the values 0-100 (the legal dimmer master values) by simply calling: [source,clojure] ---- (show/add-midi-control-to-master-mapping "Slider" 0 0) ---- NOTE: See the {api-doc}afterglow.show.html#var-add-midi-control-to-master-mapping[documentation] for details about all the arguments; this simple call takes advantage of the fact that the show dimmer grand master is the default master if you don't pass one in with `:master`. [[mapping-metronome-control]] == Mapping Metronome Control The rich grid controller bindings created for the Ableton Push and Novation Launch Pad provide very convenient metronome control using Tap Tempo buttons that flash on each beat of the show metronome, and respond to taps appropriately for any metronome synchronization (as described in the <>) the show may have established. Even if you don't have such a controller, you can set up a button or pad on any MIDI controller you own to work the same way. Simply <> you need to interact with that button or pad as decribed above, then call {api-doc}afterglow.controllers.tempo.html#var-add-midi-control-to-tempo-mapping[`afterglow.controllers.tempo/add-midi-control-to-tempo-mapping`] to set it up. NOTE: As with cue mappings, these mappings work best if you can configure your controller so that its LEDs are in external control mode (instead of local control mode), so that Afterglow is completely in control of when they are lit. If you can't do that, of there is some other reason why you want to avoid having Afterglow send MIDI messages to try to control the LEDs, you can pass the additional arguments `:feedback-on false` when setting up the mappings. Of course this will mean that the Tap Tempo button can't blink on beat for you. For example, to set this up for the kbd:[Record] button on a Korg nanoKONTROL2 controller, you can call: [source,clojure] ---- (def tempo-map (afterglow.controllers.tempo/add-midi-control-to-tempo-mapping "nano" 0 :control 45)) ---- > See the {api-doc}afterglow.controllers.tempo.html#var-add-midi-control-to-tempo-mapping[documentation] for details about all the arguments. From that point on, the kbd:[Record] button blinks on each beat of the show metronome, and when you press the button, it adjusts the tempo of the show. Assuming you have no metronone synchronization established for the show, tapping the button aligns the metronome to a beat, and if you tap it three or more times within two seconds of each preceding tap, sets the metronome's BPM. Tap it as you hear each beat of the music, and after three or more taps, the speed of the metronome will be approximately synchronized with the music. NOTE: To synchronize bars, see the discussion about how to pair this mapping with a shift button, coming up shortly. Also, because of the two second threshold, you can't tap tempos that are 30 BPM or less. If the metronome's BPM is already being synced automatically, via MIDI clock messages as described in the <>, then tapping the button will not change the BPM. Instead, it acts as a Tap Beat button, always moving the start of the current beat to match when you tapped the button. If the metronome's BPM and beat positions are both being synced automatically, either via the <> or <> (as described further below) then tapping the button acts as a Tap Bar button, telling Afterglow that the moment when you tapped the button is the down beat (the first beat of the current bar). In addition to Tap Tempo buttons, the grid controllers have Shift buttons which modify the behavior of other buttons, including the Tap Tempo button. That can be very convenient, especially when you are not synced to a beat grid from Pioneer DJ Link Pro or Traktor, so you want to be able to set the tempo, the beat location, and the down beat. You can set up another button on your controller to act this way and work with your Tap Tempo button, but you need to map it before mapping the Tap Tempo button, so you can make use of it in setting up the Tap Tempo mapping. To set up a Shift button on any MIDI controller you happen to have, start by <> you need to interact with the button or pad you want to use, then call {api-doc}afterglow.controllers.tempo.html#var-add-midi-control-to-shift-mapping[`afterglow.controllers.tempo/add-midi-control-to-shift-mapping`] to set it up. For example, to set this up for the kbd:[Play] button on a Korg nanoKONTROL2 controller, you can call: [source,clojure] ---- (def shift-map (afterglow.controllers.tempo/add-midi-control-to-shift-mapping "nano" 0 :control 41)) ---- > See the {api-doc}afterglow.controllers.tempo.html#var-add-midi-control-to-shift-mapping[documentation] for details about all the arguments. Once you've done that, when you hold down that button Afterglow lights it up, and when you release it Afterglow darkens it. But more importantly, you can use the value it returned to set up a relationship between your Shift button and a Tap Tempo button: [source,clojure] ---- (def tempo-map (afterglow.controllers.tempo/add-midi-control-to-tempo-mapping "nano" 0 :control 45 :shift-fn (:state shift-map))) ---- This tells Afterglow to check the state of your Shift button whenever you it your Tap Tempo button. If the Shift button is not held down, the Tap Tempo button acts as described above, but if your Shift button _is_ being held down, tempo taps act differently, synchronizing at one level higher. So if your show metronome is unsynchronized, and the Tap Tempo button would normally align the beat or set the BPM, or if it is synchronized to MIDI clock and the button always simply aligns the beat, then tapping it while holding down your Shift key makes it act as a Tap Bar button, telling Afterglow that the moment when you tapped the button is the down beat (the first beat of a bar). If the BPM and beat positions are both already being synced automatically, so the button would normally act as a Tap Bar button, then with Shift down it acts as a Tap Phrase button, telling Afterglow that the closest beat to when you tapped the button is the start of an entire phrase. If you ever want to stop using the mapped buttons, there is a function to remove MIDI mappings. This would undo what we did above: [source,clojure] ---- (afterglow.midi/remove-control-mapping "nano" 0 :control 45 tempo-map) (afterglow.midi/remove-control-mapping "nano" 0 :control 41 shift-map) ---- Simply detaching the MIDI controller also automatically removes any mappings that were created for it. [[syncing-to-midi-clock]] == Syncing to MIDI Clock Many DJ mixers automatically send MIDI clock pulses to help synchronize to their BPM. Pioneer’s Nexus mixers send MIDI clock over both their physical MIDI connection, and over USB if you are connected that way, conveniently. But they offer far more useful sync information over the Ethernet port via Pro DJ Link packets, which Afterglow <>. If you are using a mixer or DJ software like Traktor which supports only MIDI clock sync, it is a lot better than nothing! Here is how to take advantage of it. TIP: Native Instruments has an informative Knowledge Base article which https://support.native-instruments.com/hc/en-us/articles/209590629-How-to-Send-a-MIDI-Clock-Sync-Signal-in-TRAKTOR[explains] how to configure Traktor to send the MIDI clock pulses that Afterglow can sync to. Also see <> for how to sync to the actual beat phase information when you are using Traktor. Once you have your MIDI clock pulses reaching the system on which Afterglow is running, start Afterglow. Because of limitations inherent in the Java MIDI API, only MIDI devices which were connected when the program started are available to it. Then, assuming you have only one device sending MIDI clock, you can just execute: [source,clojure] ---- (show/sync-to-external-clock (afterglow.midi/sync-to-midi-clock)) ---- If there is ambiguity about which device’s MIDI clocks you want to process, Afterglow will complain. Resolve that by passing a device filter which matches the device you want to use. The simplest kind of filter you can pass is a string, which uniquely matches the name or description of the MIDI device that you want to sync to: [source,clojure] ---- (show/sync-to-external-clock (afterglow.midi/sync-to-midi-clock "traktor")) ---- The documentation for {api-doc}afterglow.midi.html#var-filter-devices[`afterglow.midi/filter-devices`] explains the other kinds of device filter you can use. NOTE: This section describes the low-level mechanisms available for establishing MIDI sync from code and the REPL. A much easier way is to just click the Sync button in the Metronome section at the bottom of the <>. From then on, as the BPM of that device changes, Afterglow will track it automatically. To check on the sync status, you can invoke: [source,clojure] ---- (show/sync-status) ; -> {:type :midi, :status "Running, clock pulse buffer is full."} ---- The calculated BPM of the synced show can be displayed like this: [source,clojure] ---- (metro-bpm (:metronome sample-show)) ; -> 128.5046728971963 ---- It will bounce up and down near the actual BPM as clock pulses are received, but overall track the beat quite well. To get a rock-solid beat lock you need to have equipment that can provide Pro DJ Link syncing, as described below. To shut down the syncing, just call `sync-to-external-clock` with no sync source: [source,clojure] ---- (show/sync-to-external-clock) (show/sync-status) ; -> {:type :manual} ---- [[syncing-to-traktor-beat-phase]] == Syncing to Traktor Beat Phase If you are using Traktor as your source of MIDI clock synchronization, even though you cannot quite attain the kind of smoothly precise BPM lock as you can with <>, you can configure Traktor to send its beat phase information in a way that Afterglow can detect and analyze, giving you the same kind of beat grid synchronization. In order to do that, download and unzip the Afterglow Traktor Controller Mapping, https://github.com/Deep-Symmetry/afterglow/raw/main/doc/modules/ROOT/assets/attachments/Afterglow.tsi.zip[Afterglow.tsi], and import it into Traktor. WARNING: Be sure to use the following steps to import the mapping, which will add it to any other mappings or settings you have already set up in Traktor. If you instead use the obvious and tempting `Import` button at the bottom of the Preferences window, you will replace--rather than add to--your settings. 1. Open the Traktor Preferences. 2. Choose the `Controller Manager` section from the menu down the right. 3. Click the `Add...` button in the `Device Setup` section at the top: + image::TraktorAddMapping.png[Traktor Add Device Mapping,654,431] 4. Choose `Import TSI` in the menu which pops up, and `Import Other...` at the bottom of the menu which that opens: + image::TraktorImport.png[Traktor Import Other TSI,659,429] 5. Navigate to the folder containing the `Afterglow.tsi` file you downloaded, and open it. Following this procedure will create a Device named `Clock, Afterglow` within the Traktor Controller Manager: image::TraktorMapping.png[Afterglow Traktor Device Mapping,996,774] Select and use that rather than the Generic MIDI device you would create in the process described in the Traktor Knowledge Base article linked above, and in addition to sending basic MIDI clock mesages, Traktor will send special MIDI messages that Afterglow will recognize and use to remain synchronized to the Traktor beat grid. [WARNING] ==================================================================== In order to avoid extra MIDI clock pulses being sent, which will cause the BPM calculations to be wildly incorrect, make sure not to create more than one Generic MIDI device on the Traktor Virtual Output port. If you created one following the directions in the Syncing to MIDI Clock section above, be sure to delete it, and leave only the Afterglow Traktor controller mapping. You must still follow the instructions in the Traktor https://support.native-instruments.com/hc/en-us/articles/209590629-How-to-Send-a-MIDI-Clock-Sync-Signal-in-TRAKTOR[Knowledge Base article], starting with step 3.2, to ensure that the `Clock, Afterglow` device is configured to send MIDI messages to the appropriate MIDI output port, and step 4, which configures Traktor to send MIDI clock. ==================================================================== The way the Afterglow mapping works is that it sends out Control Change messages for all currently playing decks. These messages communicate the current beat phase on that deck. (Deck A is sent as controller `1`, B as controller `2`, C as controller `3`, and D as controller `4`). In order for Afterglow to know which deck to pay attention to if more than one is playing at the same time, whenever a different deck becomes the Tempo Master, a message identifying the new Master deck is sent out as a Control Change message on controller `0`. (The same number to deck correspondence is used.) When no deck is Tempo Master, a Control Change with value `0` is sent on controller `0`. Whenever Afterglow detects a coordinated stream of messages on controllers `0` through `4` which are consistent with beat-phase information from this Traktor mapping, it offers that MIDI input device as a source of Traktor beat-phase synchronization, and if it is <> with the MIDI clock messages on that port, will also synchronize the beats. [[syncing-to-pro-dj-link]] == Syncing to Pro DJ Link If you are working with Pioneer club gear, such as the Nexus line of CDJs and mixers, you can use Pro DJ Link to sync much more precisely. You just need to be on the same LAN as the gear (most easily by connecting an Ethernet cable between your laptop running Afterglow and the mixer, or a hub or router connected to the mixer. You don’t need to be connected to the Internet, the protocol works fine over self-assigned IP addresses. You just need to specify which device you want to use as the source of beat information, and that will generally be the mixer, since it will track whichever device is currently the tempo master (or perform BPM analysis if a non-DJ-Link, or even non-digital, source is being played). Like with MIDI sync, you can give a unique substring of the device name in the sync call: [source,clojure] ---- (show/sync-to-external-clock (afterglow.dj-link/sync-to-dj-link "DJM-2000")) ---- As with MIDI, you can check on the sync status: [source,clojure] ---- (show/sync-status) ; -> {:type :dj-link, :status "Running, 5 beats received."} ; -> {:type :dj-link, ; :status "Network problems? No DJ Link packets received."} ---- TIP: If you are not getting any packets, you will need to put on your network troubleshooting hat, and figure out why UDP broadcast packets to port 50001 from the mixer are not making it to the machine running Afterglow. [[midi-over-networks]] == Sending MIDI Over a Network You can sync MIDI clock and respond to MIDI controller messages from hardware and software which is not directly attached to the machine running Afterglow. If you are on a Mac, this capability is built in, and can be configured using the https://help.apple.com/audiomidisetup/mac/10.10/index.html?localePath=en.lproj#/ams1012[Audio MIDI Setup] utility (in the `Utilities` subfolder of your `Applications` folder). For Windows, you can install the excellent, free, and fully compatible http://www.tobias-erichsen.de/software/rtpmidi.html[rtpMIDI] driver. Either of these approaches allow you to communicate with the network MIDI capabilities built in to iOS devices and applications. If you are interested in using Open Sound Control (OSC) control surfaces with Afterglow, you should also check out the free http://hexler.net/software/touchosc[TouchOSC] package (also available for http://hexler.net/software/touchosc-android[Android]). The TouchOSC site also has a nice http://hexler.net/docs/touchosc-setup-coremidi-network[illustrated walk-through] of setting up network MIDI communication. [[local-midi-ports]] == Connecting to MIDI Ports on the Same Machine To achive MIDI routing on a single machine, you need to set up a virtual MIDI bus. On the Mac you can use Core MIDI's built-in IAC bus, and on Windows you could use the MIDI Yoke utility. You can find https://help.ableton.com/hc/en-us/articles/209774225-Setting-up-a-virtual-MIDI-bus[a good tutorial] about the needed steps on the Ableton Live website. [[checking-sync]] == Checking your Sync An easy way to see how well your show is syncing the beat is to use the `metronome-effect`, which flashes a bright pink pulse on the down beat, and a less bright yellow pulse on all other beats of the show metronome. To set that up: [source,clojure] ---- (require 'afterglow.effects.fun) (show/add-effect! :color (afterglow.effects.fun/metronome-effect (show/all-fixtures))) ---- Then you can reset the metronome by hitting kbd:[Return] on the following command, right on the down beat of a track playing through your synchronized gear, and watch how Afterglow tracks tempo changes made by the DJ from then on: [source,clojure] ---- (metro-start (:metronome sample-show) 1) ---- When running live light shows you will almost certainly want to map a button on a MIDI controller to perform this beat resynchronization (although it is not necessary when you are using Pro DJ Link to synchronize with your mixer—but even then you will likely want the next two functions mapped, for realigning on bars and phrases). Here is how I do it for one of the buttons on my Korg nanoKontrol 2: [source,clojure] ---- (show/add-midi-control-metronome-reset-mapping "slider" 0 45) ---- Then, whenever I press that button, the metronome is started at beat 1, bar 1, phrase 1. You can add mappings to reset metronomes which are stored in show variables by adding the variable name as an additional parameter at the end of this function call. As noted above, even when you have a rock solid beat sync with your mixer, you sometimes want to adjust when bars or phrases begin, especially when tricky mixing has been taking place. You can accomplish this by mapping other buttons with `add-midi-control-metronome-align-bar-mapping` and `add-midi-control-metronome-align-phrase-mapping`. These cause the MIDI control to call `metro-bar-start` and `metro-phrase-start` on the associated metronome to restart the current bar or phrase on the nearest beat, without moving the beat. This means you do not need to be as precise in your timing with these functions, so you can stay beat-locked with your synch mechanism, much like the “beat jump” feature in modern DJ software. If the metronome flashes start driving you crazy, you can switch back to a static cue, [source,clojure] ---- (show/add-effect! :color blue-effect) ---- or even black things out: [source,clojure] ---- (show/clear-effects!) ---- [[open-sound-control]] == Open Sound Control Afterglow also embeds https://github.com/rosejn/osc-clj[osc-clj] so you can bind cues and variables to be controlled via Open Sound Control (OSC), using tools like hexler.net's http://hexler.net/software/touchosc[TouchOSC]. The sample show in the `afterglow.examples` namespace uses this capability to offer wireless graphical X-Y-Z aiming of groups of moving heads: image::TouchOSC.jpg[TouchOSC interface,1024,1366] The functions {api-doc}afterglow.examples.html#var-add-osc-cue-binding[`add-osc-cue-binding`] and {api-doc}afterglow.examples.html#var-add-osc-var-binding[`add-osc-var-binding`], and the ones near them in the namespace, show how this was done. They seem to work well enough that they will be fleshed out a bit and moved into a new OSC-support namespace in a future release of Afterglow. But for now, you can use them and tweak them as they are. [[rich-grid-controller-mappings]] == Rich Grid Controller Mappings Afterglow ships with built-in mappings that take advantage of several excellent grid controllers. If you happen to own one, you are in luck! And if you don't, reading about these capabilities may tempt you to buy one, or write a mapping for one that you own that is not yet supported. [[using-ableton-push]] === Using Ableton Push Perhaps the best way to control Afterglow is using the fluid, tactile interface offered by the Ableton Push. There's enough to say about that now that it has been moved to its own <>. [[using-novation-launchpad]] === Using the Novation Launchpad Family Novation also makes a great line of grid controllers, some of which offer touch-sensitivity as well. Even though they lack built-in text and graphical displays (at least so far), Afterglow uses them well enough that they get their own <>. [[setting-up-grid-controller-bindings]] === Setting Up Grid Controller Bindings When you set up the sample show by calling `(use-sample-show)` in the `afterglow.examples` namespace, it configures Afterglow to automatically use any compatible grid controller as soon as it is detected in the MIDI environment. Here is a closer look at how it accomplishes that. It uses the {api-doc}afterglow.controllers.html#var-auto-bind[`auto-bind`] function in the `afterglow.controllers` namespace: [source,clojure] ---- (require '[afterglow.controllers :as ct]) (ct/auto-bind *show*) ---- When you want to shut down the bindings running on all connected controllers, you can call: [source,clojure] ---- (ct/deactivate-all) ---- You can also undo the binding of any controller by simply disconnecting it or powering it down; Afterglow will gracefully stop using it when that happens. Both of the above approaches leave the auto-binding mechanism active, though. So if you attach a new controller, or disconnect (or turn off) one of the controllers that you just deactivated, then reconnect it (or turn it back on), it will get bound again. To stop that from happening, you can call: [source,clojure] ---- (ct/cancel-auto-bind) ---- From that point on, controllers will be ignored as they come and go until you reactivate the auto-bind system. As described in the {api-doc}afterglow.controllers.html#var-auto-bind[API documentation], there are optional parameters you can give to `auto-bind` to adjust things like the refresh rate used by the controllers, or to only auto-bind to certain controllers. For example, if you only want to auto-bind to Push, you could call: [source,clojure] ---- (ct/auto-bind *show* :device-filter "Ableton Push") ---- Similarly, to only bind to Launchpad Pro, you could use a `:device-filter` value of `"Launchpad Pro"` (or `"Launchpad Mk2"`, `"Launchpad Mini"`, or `"Launchpad S"`), or to bind to any member of the Launchpad family, just `"Launchpad"`. Whenever you call `auto-bind` it cancels whatever previous auto-bind configuration had been set up, and applies your new arguments. If you don't want to turn on auto-binding at all but simply want to set up a one-time binding to a controller that is already connected, you can call {api-doc}afterglow.controllers.html#var-bind-to-show[`afterglow.controllers/bind-to-show`]. That function always expects you to pass a device filter as its second argument, and then accepts the same kinds of optional keyword arguments that `auto-bind` does. It will try to bind to first device matching the `device-filter` argument you supplied, so that needs to be the correct port on a device like the Push or launchpad Pro which has multiple MIDI ports. That means that to successfully bind to a Push or Launchpad Pro, you need calls like these: [source,clojure] ---- (def push (ct/bind-to-show *show* "User Port")) (def launchpad-pro (ct/bind-to-show *show* "Standalone Port")) ---- That finds the User Port on the Push, and the Standalone Port on the Launchpad Pro, which are the ports that Afterglow needs to use to communicate successfully with them. Simpler controllers like the Launchpad Mk2, Mini, and S have only one port, so you can use the name of the device itself as your device filter. NOTE: If a compatible controller can't be immediately found at the first port that matches your device filter, `bind-to-show` will fail. There are more sophisticated ways of building device filters than simply using strings; see the {api-doc}afterglow.midi.html#var-filter-devices[`afterglow.midi/filter-devices`] documentation for details. The example calls stored the results of calling `bind-to-show` in variables, which is useful because you can later use those variables to individually shut down the resulting bindings: [source,clojure] ---- (ct/deactivate push) (ct/deactivate launchpad-pro) ---- Of course, if you don't care about that and simply want to deactivate all bindings, you can still use `(ct/deactivate-all)` as described above. Or you can just turn off or unplug the controllers. Since auto-binding is not active, that will permanently remove them from Afterglow's control (at least until you explicitly re-bind them). ================================================ FILE: doc/modules/ROOT/pages/metronomes.adoc ================================================ = Metronomes James Elliott Metronomes play a fundamental role in coordinating the timing of Afterglow’s effects, and helping them relate to musical structure. They keep track of musical time relative to some starting point, in terms of beats, bars (by default four beats to a bar), and phrases (usually eight bars to a phrase). In addition to keeping track of the current beat, bar, and phrase, metronomes can also tell you the _phase_ of that beat, bar, or phrase, which is a measurement of progress through the beat, bar, or phrase. The phase starts out at 0.0 at the very beginning of the interval, and grows towards, but never quite reaches, 1.0, because at that point you have moved on to phase 0.0 of the following interval. Metronomes are generally combined with <> to generate wave shapes which drive the parameters sent to lights, creating color shifts, brightness pulses, or movements. Since they are so important, there is always a metronome associated with a show in Afterglow. It gets created when the show is created, and is used for the show’s timing unless you create a separate metronome and explicitly tell an effect to use it (which you might want to do if that effect is to run at a very different speed than the music). The main show metronome can be <> to external timing sources, such as DJ controllers and mixers, to keep the light show tightly in time with the music being played. You can access the the main show’s metronome through the `:metronome` keyword in the show map, for example: [source,clojure] ---- (:metronome *show*) ---- To create a separate metronome, you call: [source,clojure] ---- (afterglow.rhythm/metronome bpm) ---- The `bpm` parameter tells the metronome what tempo to use, that is, how many beats happen per minute. You can also adjust the number of beats which make up a bar (or measure), and how many bars make up a phrase: [cols="1,1,2",options="header",] |=================================================== |Parameter |Default |Purpose |`:bpb` |`4` |How many beats make up a bar (measure) |`:bpp` |`8` |How many bars make up a phrase |=================================================== The metronome starts counting from the moment it was created, and you can ask it for all the counts as a string by calling: [source,clojure] ---- (afterglow.rhythm/metro-marker (:metronome *show*)) ; -> "15.1.4" ---- TIP: This is used by the <> to display the metronome state and support beat jumping. For that metronome, the current count was phrase 15, bar 1, beat 4. You can determine those values as individual numbers as well, but you might end up with confusing results because time is moving on while you are calling the individual functions to ask for information, and you might be on a different beat, bar, or phrase for a later call than an earlier one. So the way to start is by asking the Metronome for a _{api-doc}afterglow.rhythm.html#var-ISnapshot[snapshot]_ of its state at an instant in time, and then ask the snapshot for the individual pieces of information you want. Afterglow does this when it starts generating a frame of lighting effects, to make sure that all the effects share the same notion of the point at which they are being rendered, and create a consistent look: [source,clojure] ---- (afterglow.rhythm/metro-snapshot (:metronome *show*)) ; -> #afterglow.rhythm.MetronomeSnapshot{:start 1431727332206, :bpm 120, :bpb 4, :bpp 8, ; :instant 1431727683636, :beat 703, :bar 176, :phrase 22, ; :beat-phase 0.8600000000000136, :bar-phase 0.7150000000000034, ; :phrase-phase 0.9643750000000004} ---- Although this captures all of the information, it is not necessarily in the format you want it, for example the beat number and bar number are counted since the start of the metronome, and you usually want them since the start of the bar or phrase. The snapshot has ways of providing this information: [source,clojure] ---- (def snap (afterglow.rhythm/metro-snapshot (:metronome *show*))) ; -> #'afterglow.examples/snap snap ; -> #afterglow.rhythm.MetronomeSnapshot{:start 1431727332206, :bpm 120, :bpb 4, :bpp 8, ; :instant 1431727967069, :beat 1270, :bar 318, :phrase 40, :beat-phase 0.7260000000001128, ; :bar-phase 0.4315000000000282, :phrase-phase 0.6789375000000035} (:beat snap) ; -> 1270 (afterglow.rhythm/snapshot-beat-within-bar snap) ; -> 2 ---- Since the notion of a “down beat” (the first beat in a bar) is important in music and thus potentially to lighting effects, there is a snapshot function for checking that, too: [source,clojure] ---- (afterglow.rhythm/snapshot-down-beat? snap) ; -> false ---- ____ The second beat is not the down beat. ____ The metronome can be restarted at a particular beat by calling `metro-start` with a beat number. (Calling it with no argument returns the time at which the metronome was started.) This can be useful to resynchronize the metronome to the music if it has drifted, either because there is no BPM synchronization in place, or if MIDI clock sync is being used, and it’s been a long time, since that can drift, unlike Pro DJ Link sync: [source,clojure] ---- (afterglow.rhythm/metro-start (:metronome *show*) 1) ; -> 1431727642086 ---- ____ The new metronome start timestamp is returned. ____ If the beats are landing in the right place but the notion of the down beat (bar start) or phrase start is wrong, you can reset those by calling `metro-bar-start` or `metro-phrase-start` with the desired bar or phrase number (usually 1). These adjust the metronome so the larger intervals are resynchronized without changing the individual beats themselves. The metronome’s tempo (beats per minute) can be determined or changed by calling `metro-bpm`. Without an argument it returns the current BPM, and an argument is used as the new BPM value. The same can be done with the beats per bar (`metro-bpb`) and beats per phrase (`metro-bpp`). There are a number of other functions which can be called on metronomes and snapshots. The {api-doc}afterglow.rhythm.html#var-IMetronome[`IMetronome`] and {api-doc}afterglow.rhythm.html#var-ISnapshot[`ISnapshot`] protocols in {api-doc}afterglow.rhythm.html[`afterglow.rhythm`] specify and describe them. [[watching-metronomes]] == Watching Metronomes To help get a feeling for exactly what your metronome is doing, there is an effect that flashes one bright color on the down beat, and another less-bright color on the rest of the beats. Running this while you change the metronome BPM, sync, beats per bar, and such can help drive a more visceral understanding. To run it for the main show metronome, you can do this: [source,clojure] ---- (require 'afterglow.effects.fun) (show/add-effect! :color (afterglow.effects.fun/metronome-effect *show* (show/all-fixtures *show*))) ---- If you want to watch a different metronome, the invocation looks like this: [source,clojure] ---- (show/set-variable :my-metro (afterglow.rhythm/metronome 50)) (require 'afterglow.effects.fun) (show/add-effect! :color (afterglow.effects.fun/metronome-effect *show* (show/all-fixtures) :metronome :my-metro)) ---- ____ The lights are pulsing sedately... ____ [source,clojure] ---- (metro-bpm (show/get-variable :my-metro) 400) ---- ____ ...and now they are almost seizure-worthy! ____ ================================================ FILE: doc/modules/ROOT/pages/oscillators.adoc ================================================ = Oscillators James Elliott Oscillators in Afterglow are a flexible way of turning the timing information tracked by <> into waveforms that can be used to make lights do interesting things. They can be related to the beats, bars, or phrases of the metronome, or multiples or fractions thereof, and can create <>, <>, <>, or <> waves, or any <> you can dream up and code a shape function for. Metronomes keep track of musical time relative to some starting point, in terms of beats, bars (by default four beats to a bar), and phrases (usually eight bars to a phrase). In addition to keeping track of the current beat, bar, and phrase, metronomes can also tell you the _phase_ of that beat, bar, or phrase, which is a measurement of progress through the beat, bar, or phrase. The phase starts out at 0.0 at the very beginning of the interval, and grows towards, but never quite reaches, 1.0, because at that point you will be on to phase 0.0 of the following interval. So, in a sense, by itself a metronome can give you a <> wave related to its intervals, just by looking at the interval phase. The sawtooth oscillators build on that by letting you change the direction of oscillation, so it starts at 1.0 and slides downward, the speed of oscillation, so it ramps over multiples or fractions of an interval, and also let you shift the phase of the wave so it does not coincide with the interval itself. So that all of the lighting effects created for a given frame of control output are synchronized and share the same notion of the current state of the metronome, Afterglow takes a _snapshot_ of the metronome at the start of the frame, and the oscillators work from that. [[sawtooth-oscillators]] == Sawtooth Oscillators [source,clojure] ---- (afterglow.effects.oscillators/sawtooth) ---- Returns an oscillator which generates a http://en.wikipedia.org/wiki/Sawtooth_wave[sawtooth wave] relative to the phase of the current beat. At the start of the beat, the value will be 0.0, and at the end of the beat, the value will have grown linearly to 1.0. image::sawtooth-beat.png[Default Sawtooth Oscillator,500,378] You can change the nature of the wave by using optional keyword parameters, and the values you use with them can be be <>: [cols="2,1,4",options="header",] |======================================================================= |Parameter |Default |Purpose |`:down?` |`false` |When `true` the wave starts at 1.0 and falls linearly to 0.0. |`:interval` |`:beat` |Change whether the oscillator cycles over each beat, bar, or phrase, by passing in the keyword `:beat`, `:bar`, or `:phrase`. There are graphs showing the other intervals below. |`:interval-ratio` |`1` |Runs the oscillator at the specified <> of the interval (beat, bar, or phrase). |`:phase` |0.0 |<> the oscillator from the interval boundary by the specified amount (where 1.0 is an entire interval, and so would have no visible effect). |======================================================================= As noted in the table, the direction of the wave can be reversed: [source,clojure] ---- (afterglow.effects.oscillators/sawtooth :down? true) ---- image::sawtooth-beat-down.png[Downward Sawtooth Oscillator,500,378] [[ratios]] === Ratios All of the oscillators can be modified by supplying the `:interval-ratio` keyword argument. This argument specifies a fraction that adjusts the speed of the oscillator with respect to the interval it is oscillating over. For example a beat-oriented oscillator normally goes through its entire wave shape once per beat. If you supply an `:interval-ratio` of `2`, it will run half as fast, taking two beats to go through its waveform. image::sawtooth-beat-ratio-2.png[Sawtooth Beat Oscillator with Beat Ratio 2,500,378] An `:interval-ratio` of `1/3` speeds it up so that it only takes one-third of a beat to go through its oscillation, and will finish three complete cycles each beat. image::sawtooth-beat-ratio-1-3.png[Sawtooth Oscillator with Interval Ratio 1/3,500,378] These can be combined, of course, so an `:interval-ratio` of `2/3` would complete three cycles every two beats. image::sawtooth-beat-ratio-2-3.png[Sawtooth Oscillator with Interval Ratio 2/3,500,378] [[phase-shifting]] === Phase Shifting All of the oscillators can be modified by supplying a `:phase` keyword argument, which offsets them from the actual phase of the interval that they are tracking. For example, if you supply a `:phase` value of `0.5`, the oscillator will be pushed exactly halfway out-of-phase with the metronome interval, so that it will act as if a beat is starting halfway through the actual beat. A positive value shifts the oscillator ahead of the underlying interval, and a negative value delays it. Only values between -1.0 and 1.0 make sense, since shifting multiple intervals has no functional difference from staying within the current interval. In other words, passing in exactly 1.0 (or 2.0, etc.) is the same as passing in 0.0, and will have no effect on the oscillator. image::sawtooth-beat-phase.png[Sawtooth Oscillator with Phase 0.25,500,378] As noted in the table above, to have the oscillator work with intervals other than beats, you use the optional keyword argument `:interval`. For example to have the sawtooth spread over each bar: [source,clojure] ---- (afterglow.effects.oscillators/sawtooth :interval :bar) ---- image::sawtooth-bar.png[Sawtooth Bar Oscillator,500,378] And to have it oscillate over each phrase: [source,clojure] ---- (afterglow.effects.oscillators/sawtooth :interval :phrase) ---- image::sawtooth-phrase.png[Sawtooth Phrase Oscillator,500,378] [[triangle-oscillators]] == Triangle Oscillators [source,clojure] ---- (afterglow.effects.oscillators/triangle) ---- Returns an oscillator which generates a http://en.wikipedia.org/wiki/Triangle_wave[triangle wave] relative to the phase of the current beat. At the start of the beat, the value will be 0.0, at the midpoint, the value will have grown linearly to 1.0, and at the end of the beat it will have returned to 0.0. image::triangle-beat.png[Default Triangle Oscillator,500,378] You can change the nature of the wave by using optional keyword parameters, and the values you use with them can be be <>: [cols="2,1,4",options="header",] |======================================================================= |Parameter |Default |Purpose |`:interval` |`:beat` |Change whether the oscillator cycles over each beat, bar, or phrase, by passing in the keyword `:beat`, `:bar`, or `:phrase`. There are graphs showing the other intervals below. |`:interval-ratio` |`1` |Runs the oscillator at the specified <> of the interval (beat, bar, or phrase). |`:phase` |0.0 |<> the oscillator from the beat by the specified amount |======================================================================= NOTE: The effects of the `:interval-ratio` and `:phase` parameters are discussed in more depth, and illustrated with graphs, in the documentation for the Sawtooth oscillator. You can jump to those sections using the links in the _Purpose_ section of the table. As noted in the table above, to have the oscillator work with intervals other than beats, you use the optional keyword argument `:interval`. For example to have the triangle spread over each bar: [source,clojure] ---- (afterglow.effects.oscillators/triangle :interval :bar) ---- image::triangle-bar.png[Triangle Bar Oscillator,500,378] And to have it oscillate over each phrase: [source,clojure] ---- (afterglow.effects.oscillators/triangle :interval :phrase) ---- image::triangle-phrase.png[Triangle Phrase Oscillator,500,378] [[sine-oscillators]] == Sine Oscillators Just like in musical synthesis, sine waves are the smoothest-feeling waves of all, and are good for creating gentle, subtle effects which ease in and out. [source,clojure] ---- (afterglow.effects.oscillators/sine) ---- Returns an oscillator which generates a http://en.wikipedia.org/wiki/Sine_wave[sine wave] relative to the phase of the current beat. At the start of the beat, the value will be 0.0 and beginning to rise slowly, picking up speed as it goes, and slowing down again as it approaches the midpoint. At the midpoint, the value will reach 1.0 and begin falling slowly, again picking up speed, and at the end of the beat it will have returned to 0.0. image::sine-beat.png[Default Sine Oscillator,500,378] You can change the nature of the wave by using optional keyword parameters, and the values you use with them can be be <>: [cols="2,1,4",options="header",] |======================================================================= |Parameter |Default |Purpose |`:interval` |`:beat` |Change whether the oscillator cycles over each beat, bar, or phrase, by passing in the keyword `:beat`, `:bar`, or `:phrase`. There are graphs showing the other intervals below. |`:interval-ratio` |`1` |Runs the oscillator at the specified <> of the interval (beat, bar, or phrase). |`:phase` |0.0 |<> the oscillator from the beat by the specified amount |======================================================================= NOTE: The effects of the `:interval-ratio` and `:phase` parameters are discussed in more depth, and illustrated with graphs, in the documentation for the Sawtooth oscillator. You can jump to those sections using the links in the _Purpose_ section of the table. As noted in the table above, to have the oscillator work with intervals other than beats, you use the optional keyword argument `:interval`. For example to have the sine wave spread over each bar: [source,clojure] ---- (afterglow.effects.oscillators/sine :interval :bar) ---- image::sine-bar.png[Sine Bar Oscillator,500,378] And to have it oscillate over each phrase: [source,clojure] ---- (afterglow.effects.oscillators/sine :interval :phrase) ---- image::sine-phrase.png[Sine Phrase Oscillator,500,378] [[square-oscillators]] == Square Oscillators Square waves are good for abrupt transitions, like strobes, or switching between different effects. [source,clojure] ---- (afterglow.effects.oscillators/square) ---- Returns an oscillator which generates a http://en.wikipedia.org/wiki/Square_wave[square wave] relative to the phase of the current beat. At the start of the beat, the value will be 1.0. At the midpoint, it will instantly drop to 0.0, where it will stay until the end of the beat. image::square-beat.png[Square Beat Oscillator,500,378] You can change the nature of the wave by using optional keyword parameters, and the values you use with them can be be <>: [cols="2,1,4",options="header",] |======================================================================= |Parameter |Default |Purpose |`:width` |`0.5` |Determines the phase at which the value changes from 1.0 to 0.0, and therefore the width of the 1.0 pulse |`:interval` |`:beat` |Change whether the oscillator cycles over each beat, bar, or phrase, by passing in the keyword `:beat`, `:bar`, or `:phrase`. There are graphs showing the other intervals below. |`:interval-ratio` |`1` |Runs the oscillator at the specified <> of the interval (beat, bar, or phrase). |`:phase` |0.0 |<> the oscillator from the beat by the specified amount |======================================================================= NOTE: The effects of the `:interval-ratio` and `:phase` parameters are discussed in more depth, and illustrated with graphs, in the documentation for the Sawtooth oscillator. You can jump to those sections using the links in the _Purpose_ section of the table. [[pulse-widths]] === Pulse Widths As shown in the above graph, the square oscillator normally spends half its time in the “on” state (at the value one), and half its time “off” (at zero). You can adjust that by passing a value between `0.0` and `1.0` with the optional keyword argument `:width`. This tells the oscillator what fraction of the time to be on. For example, with the value `0.8`, it is on 4/5 of the time: [source,clojure] ---- (afterglow.effects.oscillators/square :width 0.8) ---- image::square-beat-width-8.png[Square Oscillator with Width 0.8,500,378] Alternately, using a `:width` of `0.1` causes the oscillator to be on for only one tenth of each beat: [source,clojure] ---- (afterglow.effects.oscillators/square :width 0.1) ---- image::square-beat-width-1.png[Square Oscillator with Width 0.1,500,378] You can shift where within the beat the transitions take place using the `:phase` argument, as with all oscillators, in the manner described <>. NOTE: The `:width` value must be greater than `0` and less than `1`, or the oscillator does not oscillate at all. A value of `0` leaves it permanently off, and a value of `1` leaves it permanently on. Values outside that range are not accepted. As noted in the table above, to have the oscillator work with intervals other than beats, you use the optional keyword argument `:interval`. For example to have the wave spread over each bar: [source,clojure] ---- (afterglow.effects.oscillators/square :interval :bar) ---- image::square-bar.png[Square Bar Oscillator,500,378] And to have it oscillate over each phrase: [source,clojure] ---- (afterglow.effects.oscillators/square :interval :phrase) ---- image::square-phrase.png[Square Phrase Oscillator,500,378] [[custom-oscillators]] == Custom Oscillators You can build your own oscillator with any shape waveform that you like by defining a _shape function_ for it, and let Afterglow do all the hard work of hosting it within the oscillator framework by passing that shape function to {api-doc}afterglow.effects.oscillators.html#var-build-oscillator[`afterglow.effects.oscillators/build-oscillator`]. All of the oscillators you have seen so far use this approach, and you can see how simple they actually are by looking at the source of one, for example {api-doc}afterglow.effects.oscillators.html#var-triangle[`triangle`], which defines a the triangle wave oscillator. (Click on the `view source` button at the bottom of the linked documentation.) As you will see, most of the function consists of its documentation, and its argument declaration, and those simply get passed on to `build-oscillator`, which supports the `:interval`, `:interval-ratio`, and `:phase` arguments you've seen in all the oscillator functions. The core of `triangle` is setting up its shape function to create the triangle wave which makes it a triangle oscillator. [[shape-functions]] === Shape Functions The shape function is the first argument to `build-oscillator`, and it is simply a function which is given the current phase of the oscillator, ranging from 0.0 to 1.0, and must return the value of the oscillator's wave form when it is at that phase of oscillation. In the case of a triangle wave, it needs to ramp up from 0 to 1 during the first half of the oscillation (as the phase grows from 0 to 0.5), then back down to 0 during the second half. Here is how `triangle` implements that: [source,clojure] ---- (fn [phase] (if (< phase 0.5) (* phase 2.0) (- 2.0 (* phase 2.0)))) ---- The arguments to `triangle` are then passed along to `build-oscillator` after the phase function, and the result is the triangle oscillator behavior you can use in your shows. Hopefully examining this example, as well as the source of the other oscillators, can inspire you to create your own interesting oscillator shapes. ================================================ FILE: doc/modules/ROOT/pages/parameters.adoc ================================================ = Dynamic Parameters James Elliott Dynamic parameters provide a way to turn a simple cue into something which changes over time and space, or reacts to operator input. Most cues which take simple values can also take dynamic parameters which evaluate to those values. [[frame-dynamic-parameters]] == Frame Dynamic Parameters When creating a dynamic parameter, you can control _how_ dynamic it is. The most dynamic, __frame dynamic__, are evaluated anew for every single frame of control values that are sent out to the lights. If, on the other hand, you want the value to be calculated when the effect is started, and then stay constant, you can create the parameter with a `false` value for `frame-dynamic?` [[variable-parameters]] == Variable Parameters Parameters can get their values from a __show variable__. Any number of values can be stored in the show, by assigning them a keyword with the function: [source,clojure] ---- (afterglow.show/set-variable! :key value) ---- TIP: In addition to manually setting values in show variables, you can use <> to have them set by turning a knob or sliding a fader on a MIDI control surface. <> can also set variables, and can bind them to encoders or pressure sensitive pads on controllers like the <> and <>. You can then refer to that stored value whenever you are building a dynamic parameter (for example when you are passing in the `:hue` parameter for a <> as described below), by simply using the keyword (in this example, `:key`), and the current value stored in the show variable will be used. This keyword shorthand is just a convenience mechanism provided by functions like {api-doc}afterglow.effects.params.html#var-build-color-param[`build-color-param`]. You can also explicitly build a reference to a show variable like this: [source,clojure] ---- (afterglow.effects.params/build-variable-param :key) ---- The most common reason you might want to use the explicit creation function is that you can control details about the binding by passing in optional keyword parameters: [cols="1,1,4",options="header",] |======================================================================= |Parameter |Default |Purpose |`:type` |`Number` |The type of value that is expected in the variable |`:default` |`0` |The value to assign the parameter if the variable is missing or has the wrong type |`:transform-fn` |none |If supplied, is called with the value of the show variable, and its return value is used as the value of the parameter |`:frame-dynamic` |`true` |Whether the variable value should be looked at at every frame, or just once |======================================================================= As an example of using these parameters, consider: [source,clojure] ---- (afterglow.effects.params/build-variable-param :key :type Number :default 0 :transform-fn #(* % 2)) ---- This would cause the dynamic parameter to have a numeric value which is twice the value found in the show variable named `:key`. When you use the keyword shorthand to bind to a show variable in building another dynamic parameter, the type and default are assumed from the context in which you are using the variable. TIP: Another time when you will need to use this explicit way of building a dynamic parameter from a show variable is if the parameter holds keywords. In that case, clearly Afterglow can't assume that a keyword is shorthand for a show variable. The `:interval` parameter for Afterglow's built in oscillator-building functions, like {api-doc}afterglow.effects.oscillators.html#var-sine[`afterglow.effects.oscillators/sine`], is an example of such a parameter: It expects the value `:beat`, `:bar`, or `:phrase`. So to have an oscillator look up and use the value in the show variable `:my-interval` to control the interval over which it oscillates, you would write something like this: [source,clojure] ---- (afterglow.effects.oscillators/sine :interval (afterglow.effects.params/build-variable-param :my-interval :type clojure.lang.Keyword :default :beat)) ---- [[oscillated-parameters]] == Oscillated Parameters Oscillated parameters vary over time, at a speed controlled by a <> (usually the main show metronome, synced to DJ equipment) and so can make the lights appear to be reacting intelligently to the music being played. The timing information produced by the metronome is fed into an <>, which determines the shape of the wave that controls its value, and the frequency at which it oscillates, related to beats, bars, or phrases of the underlying metronome. The resulting value can then be scaled to meet the needs of whatever is being generated (a dimmer level, color component, or light rotation). Oscillated parameters are created by calling {api-doc}afterglow.effects.oscillators.html#var-build-oscillated-param[`afterglow.effects.oscillators/build-oscillated-param`]. [source,clojure] ---- (afterglow.effects.oscillators/build-oscillated-param oscillator) ---- The `oscillator` parameter is an <> created by one of the functions in {api-doc}afterglow.effects.oscillators.html[`afterglow.effects.oscillators`] which, as described above, determines how to react to the time information provided by the metronome. Additionally, you can supply one of the following optional keyword parameters: [cols="1,1,4",options="header",] |======================================================================= |Parameter |Default |Purpose |`:min` |`0` |The smallest value that the oscillated parameter will be assigned |`:max` |`255` |The largest value that the oscillated parameter will be assigned |`:metronome` |none |If supplied, is used instead of the main show metronome |`:frame-dynamic` |`true` |Whether the parameter should be calculated at every frame, or just once |======================================================================= The keyword parameters `:min`, `:max`, and `:metronome` can themselves be bound to show variables by passing in the keyword with which the show variable was created. The frame-dynamic setting of such variable bindings will be controlled by the frame-dynamic setting of the oscillated parameter being created. NOTE: If `:min` ever evaluates greater than or equal to `:max`, the oscillator will be pinned to the value of `:min`. [[step-parameters]] == Step Parameters Like oscillated parameters (above), step parameters vary over time, at a speed controlled by a <> (usually the main show metronome, synced to DJ equipment). But rather than moving back and forth, step parameters increase steadily over time, because they are designed to control the progression of a <>. Step parameters are created by calling {api-doc}afterglow.effects.params.html#var-build-step-param[`afterglow.effects.params/build-step-param`]. [source,clojure] ---- (afterglow.effects.params/build-step-param) ---- With no arguments, this creates a step parameter that starts out with the value `1` for the duration of the beat closest to when you created it, and the value will jump up by one as each subsequent beat occurs: image::step-fade-0.png[Default Step Parameter,500,378] If a less-abrupt transition between stages in the chase is desired, a fade can be added between them by passing a value with the optional keyword argument `:fade-fraction`. When omitted, the default value is `0`, meaning no time is spent fading, which results in the kind of abrupt steps seen in the graph above. Passing a value of `0.2` would cause the parameter to spend 1/5 of its time fading: During the final 0.1 of the beat, it would ramp up towards the midpoint of the next value, and then finish that ramp during the first 0.1 of the next beat, as shown in the following graph: [source,clojure] ---- (afterglow.effects.params/build-step-param :fade-fraction 0.2) ---- image::step-fade-0-2.png[Step Parameter with fade fraction 0.2,500,378] The graph shows that most of each beat is spent with the step parameter steady at its expected value, but the first and last tenths are a linear fade from and to the next value. Changing the fade fraction to 0.5 causes half the time to be spent fading, and only half sitting at the beat's assigned value: [source,clojure] ---- (afterglow.effects.params/build-step-param :fade-fraction 0.5) ---- image::step-fade-0-5.png[Step Parameter with fade fraction 0.5,500,378] That trend continues until the maximum possible fade-fraction value of `1` is used, which causes all of each beat to be spent fading, so the step parameter continuously fades through values, reaching the value assigned to a given beat at the midpoint of that beat: [source,clojure] ---- (afterglow.effects.params/build-step-param :fade-fraction 1) ---- image::step-fade-1.png[Step Parameter with fade fraction 1,500,378] In addition to linear fades, you can smooth out the start and end of the fades by using a sine-shaped fade curve, by passing the optional keyword argument `:fade-curve` with the value `:sine`. Here is what that looks like with a continuous fade: [source,clojure] ---- (afterglow.effects.params/build-step-param :fade-curve :sine :fade-fraction 1) ---- image::step-sine-fade-1.png[Step Parameter with sine curve and fade fraction 1,500,378] The smoothing effect of the sine curve option becomes even more evident when you configure the step parameter to fade for only part of the beat: [source,clojure] ---- (afterglow.effects.params/build-step-param :fade-curve :sine :fade-fraction 0.5) ---- image::step-sine-fade-0-5.png[Step Parameter with sine curve and fade fraction 0.5,500,378] Of course, as the amount of time spent fading gets compressed, the smoothing is less obvious, although it is still there. Dropping back to fading over just the first and last tenth of the beat looks like this: [source,clojure] ---- (afterglow.effects.params/build-step-param :fade-curve :sine :fade-fraction 0.2) ---- image::step-sine-fade-0-2.png[Step Parameter with sine curve and fade fraction 0.2,500,378] When the fade fraction is `0`, it does not matter what the fade curve is, because no fading takes place. You can also have the step parameter increment for each bar or phrase, rather than each beat, by passing the optional keyword argument `:interval` with the value `:bar` or `:phrase`. And, as with oscillators, you can use the optional keyword argument `:interval-ratio` to have the parameter run at the specified fraction or multiple of the chosen interval. The way that `:interval-ratio` works is illustrated in the <> section of the oscillator documentation. As one example of `:inteval-ratio` specifically applied to step parameters, here is what the preceding graph would look like if the interval ratio was changed to a value of one half, meaning that the step parameter increases every half of a beat: [source,clojure] ---- (afterglow.effects.params/build-step-param :interval-ratio (/ 1 2) :fade-curve :sine :fade-fraction 0.2) ---- image::step-sine-fade-0-2-half.png[alt="Step Parameter with sine curve, fade fraction 0.2, interval ratio 1/2",width=500,height=378] Finally, if you would like the beat numbers to be counted from a time that is different than when you created the step parameter, you can pass a metronome snapshot along with the keyword argument `:starting`, and beats will be counted so that the first beat is the one that occured closest to that snapshot. For maximum flexibility, any of the parameters to `build-step-param` can themselves be dynamic parameters from the show. If none of them are, a more efficient version of the step parameter is built, precalculating as much as possible. [[color-parameters]] == Color Parameters Color parameters are an extremely flexible way of dynamically assigning color. The basic way to create one is to call {api-doc}afterglow.effects.params.html#var-build-color-param[`afterglow.effects.params/build-color-param`]. [source,clojure] ---- (afterglow.effects.params/build-color-param) ---- By itself this call would simply return a non-dynamic black color. However, you will use one or more of the following optional keyword parameters to get the dynamic color you want: [cols="2,1,4",options="header",] |======================================================================= |Parameter |Default |Purpose |`:color` |black |The base, starting color of this dynamic color |`:r` |`0` |Red brightness, from 0 to 255 |`:g` |`0` |Green brightness, from 0 to 255 |`:b` |`0` |Blue brightness, from 0 to 255 |`:h` |`0.0` |Hue value, from 0.0 to 360.0 |`:s` |`0.0` |Saturaion value, from 0.0 to 100.0 |`:l` |`0.0` |Lightness value, from 0.0 to 100.0 |`:adjust-hue` |`0.0` |Hue shift value, from -360.0 to 360.0 |`:adjust-saturation` |`0.0` |Saturation shift value, from -100.0 to 100.0 |`:adjust-lightness` |`0.0` |Lightness shift value, from -100.0 to 100.0 |`:frame-dynamic` |`true` |Whether the parameter should be calculated at every frame, or just once |======================================================================= All of these parameters, except for `frame-dynamic`, can themselves be dynamic parameters, such as show <> (with the convenience shorthand of just passing in the keyword by which the show variable was stored) or <>. Refer to <> for a refresher on the meaning of the basic color components. It would not make sense to pass all of these parameters, because some will override others, but here is how they are evaluated: . The base color is established by the `:color` parameter. . If any of `:r`, `:g`, or `:b` have been supplied, the color is replaced by creating an RGB color with the values (or defaults) supplied. . If any of `:h`, `:s`, or `:l` have been supplied, the color is replaced by creating an HSL color with the values (or defaults) supplied. . If `:adjust-hue` was supplied, the hue of the color obtained so far is shifted by adding that amount to it (and wrapping around the color circle if needed). . If `adjust-saturation` was supplied, the saturation of the color is adjusted by adding that amount to it, maxing out at 100.0, and bottoming out at 0.0. Lower saturations yield less colorful (more gray) colors. . If `adjust-lightness` was supplied, the lightness of the color is adjusted by adding that amount to it, maxing out at 100.0, and bottoming out at 0.0. A lightness of 50.0 allows for a fully saturated color, lightnesses above that start getting whitened, and a lightness of 100.0 is pure white; lightnesses below 50.0 start getting darkened, and a lightness of 0.0 is pure black. Finally, the result of all this is the color that is returned by the dynamic parameter. Afterglow tries to be as efficient about this as possible, and do as much calculation as it can when the parameter is created. If there are no frame dynamic parameters, it will return a fixed color. But you can easily use frame-dynamic oscillated parameters and get lovely shifting rainbow cues, as shown in the <>. [[movement]] == Movement There are three different kinds of parameters which tell fixtures how to move. They differ in the way that you express direction or aim. [[direction-parameters]] === Direction Parameters Direction parameters are one way to tell a group of fixtures to point in a particular _direction_, or move in unison or in a coordinated pattern. They are used with <>. (<> and <> are the other way to achieve that result.) The basic way to create a direction parameter is to call {api-doc}afterglow.effects.params.html#var-build-direction-param[`afterglow.effects.params/build-direction-param`]. [source,clojure] ---- (afterglow.effects.params/build-direction-param) ---- By itself this call would simply return a non-dynamic direction telling fixtures to point directly at the audience. However, you will use one or more of the following optional keyword parameters to get the dynamic direction you want: [cols="2,1,4",options="header",] |======================================================================= |Parameter |Default |Purpose |`:x` |`0` |The amount the light should point towards audience’s right |`:y` |`0` |The amount the light should point up |`:z` |`1` |The amount the light should point towards the audience |`:frame-dynamic` |`true` |Whether the parameter should be calculated at every frame, or just once |======================================================================= Collectively, `x`, `y`, and `z` specify a three-dimensional vector in the light show’s <> telling the lights which direction they should point. The absolute magnitudes of the values are not important, it is their relative sizes that matter. The default of `[0, 0, 1]` means the lights point neither left nor right, neither up nor down, and straight towards the audience. `[1, 0, 0]` would be straight right, `[-1, 0, 0]` straight left, `[0, 1, 0]` straight up, and `[0, 1, -1]` up and away from the audience at a 45° angle. When this vector is supplied to a <>, it causes the attached lights to make the specified movement, if they are capable. All of these parameters, except for `frame-dynamic`, can themselves be dynamic parameters, such as show <> (with the convenience shorthand of just passing in the keyword by which the show variable was stored) or <>. [[aim-parameters]] === Aim Parameters Aim parameters are a way to tell a group of fixtures to aim at a particular _point_ in space, or track something in unison or in a coordinated pattern. They are used with <>. The basic way to create one is to call: [source,clojure] ---- (afterglow.effects.params/build-aim-param) ---- By itself this call would simply return a non-dynamic point telling fixtures to aim directly at a height of zero, centered on the X axis, two meters towards the audience. However, you will use one or more of the following optional keyword parameters to get the dynamic target point you want: [cols="2,1,4",options="header",] |======================================================================= |Parameter |Default |Purpose |`:x` |`0` |How many meters along the X axis the target point is found |`:y` |`0` |How high up or down the Y axis is the target point |`:z` |`2` |How far towards or away from the audience is the target point |`:frame-dynamic` |`true` |Whether the parameter should be calculated at every frame, or just once |======================================================================= Collectively, `x`, `y`, and `z` specify a three-dimensional point within the light show’s <> telling the lights where to aim. When this vector is supplied to an <>, it causes the attached lights to make the specified movement, if they are capable. If you need to convert inches or feet to meters, which are the standard distance units in Afterglow, you can use {api-doc}afterglow.transform.html#var-inches[`afterglow.transform/inches`] and {api-doc}afterglow.transform.html#var-feet[`afterglow.transform/feet`]. All of these parameters, except for `frame-dynamic`, can themselves be dynamic parameters, such as show <> (with the convenience shorthand of just passing in the keyword by which the show variable was stored) or <>. [[pan-tilt-parameters]] === Pan/Tilt Parameters A more traditional way of aiming fixtures (in contrast to <>) involves setting pan and tilt angles. Afterglow supports this approach as well, although even in this case you use angles expressed in the standard show <> regardless of how the individual fixtures are hung. Pan Tilt parameters work with <>. The basic way to create one is to call: [source,clojure] ---- (afterglow.effects.params/build-pan-tilt-param) ---- By itself this call would simply return a non-dynamic pan-tilt parameter telling fixtures to point directly at the audience. However, you will use one or more of the following optional keyword parameters to get the dynamic angles you want: [cols="2,1,5",options="header",] |======================================================================= |Parameter |Default |Purpose |`:pan` |`0` |How many degrees counter-clockwise should the light turn around the Y axis |`:tilt` |`0` |How many degrees counter-clockwise should the light turn around the X axis |`:radians`|`false` |Supply a `true` value with `:radians` if you would rather work in radians than degrees for your `:pan` and `:tilt` values. |`:frame-dynamic` |`true` |Whether the parameter should be calculated at every frame, or just once |======================================================================= The rotations requested by `pan` and `tilt` jointly identify the direction the light should turn away from the audience. The result of the parameter is a pair of pan and tilt angles away from the `z` axis of the light show’s <> telling the lights which direction they should point. When this parameter is supplied to a <>, it causes the attached lights to make the specified movement, if they are capable. Note that although internally Afterglow works with angles expressed in radians, the values of `pan` and `tilt` are assumed to be in degrees and will be converted to radians for the convenience of users who are more accustomed to working with angles expressed in degrees. If you would rather stick with radians, you can suppress this conversion by passing a `true` value with the `:radians` keyword. All of these parameters, except for `frame-dynamic`, can themselves be dynamic parameters, such as show <> (with the convenience shorthand of just passing in the keyword by which the show variable was stored) or <>. NOTE: You can also create a direction parameter using pan and tilt angles if you want to work with <> in those terms. This can be helpful, for example, when you want to fade between a specific direction that is easiest to express as a spatial vector, and one that is easiest to express in terms of angles. Use {api-doc}afterglow.effects.params.html#var-build-direction-param-from-pan-tilt[`build-direction-from-pan-tilt`] to create a normal direction parameter starting from the same pan/tilt parameters described above. [[spatial-parameters]] == Spatial Parameters Spatial parameters allow you to base an effect parameter on the physical arrangement or relationships between fixtures in your light show. The way to create one is to call {api-doc}afterglow.effects.params.html#var-build-spatial-param[`afterglow.effects.params/build-spatial-param`]. [source,clojure] ---- (afterglow.effects.params/build-spatial-param fixtures-or-heads f) ---- The required parameters are the fixtures and/or heads over which you want this parameter to be calculated, and a function which, when invoked with a fixture or head, returns a number or a dynamic `Number` parameter. If desired, the results returned for all included heads can be scaled to fall within a standard range. Scaling is activated using the optional keyword parameters `:max` and `:min`. If neither is supplied, scaling is not performed. Passing a value for only `:max` activates scaling with a default minimum value of `0`, and passing a value for only `:min` activates scaling with a default maximum value of `255`. The maximum value must be larger than the minimum value. [cols="2,1,6",options="header",] |======================================================================= |Parameter |Default |Purpose |`:min` | n/a | If present, activates result scaling, and establishes the smallest value this dynamic parameter will hold. |`:max` | n/a | If present, activates result scaling, and establishes the largest value this dynamic parameter will hold. |`:frame-dynamic` |n/a | Whether the parameter should be calculated at every frame, or just once. |======================================================================= As noted above, the values returned by `f` can themselves be dynamic parameters, such as show <> (with the convenience shorthand of just passing in the keyword by which the show variable was stored) or <>. If `frame-dynamic` is not explicitly set, the spatial parameter will be frame dynamic if any value returned by `f` is frame-dynamic. Useful things that `f` can do include calculating the distance of the head from some point, either in 3D or along an axis, its angle from some line, and so on. These can allow the creation of lighting gradients across all or part of a show. Spatial parameters make excellent building blocks for <>, <> and <> parameters, as shown in the <>. [[combining-parameters]] == Combining Parameters Sometimes you want to build a cue parameter by combining some other values using a simple expression. While you can certainly do this by implementing the low-level {api-doc}afterglow.effects.params.html#var-IParam[`IParam`] protocol, Afterglow provides a helper function, {api-doc}afterglow.effects.params.html#var-build-param-formula[`build-param-formula`] to eliminate most of the boilerplate involved in that approach. You can see an example of it being used in {api-doc}afterglow.examples.html#var-build-ratio-param[`build-ratio-param`] in the `examples` namespace, which takes the `beats` and `cycles` cue parameters chosen by a user, and divides them to create the ratio that an oscillated parameter needs: [source,clojure] ---- (params/build-param-formula Number #(/ %1 %2) beats-param cycles-param) ---- The `build-param-formula` function takes the `param-type` of the parameter you want to create (in this case a `Number`), a function `calc-fn` that will be called to calculate the parameter value when needed (in this case, an anonymous function that simply divides its first argument by its second), and then the list of other dynamic parameters that will be evaluated and fed as input to `calc-fn`. This is a very compact way to perform calculations to combine or transform other dynamic parameters. If you want to perform geometric transformations on <> and <> parameters, there are some helper functions for that as well. {api-doc}afterglow.effects.params.html#var-build-direction-transformer[`build-direction-transformer`] takes an incoming direction parameter and a Java3D https://docs.oracle.com/cd/E17802_01/j2se/javase/technologies/desktop/java3d/forDevelopers/J3D_1_3_API/j3dapi/javax/media/j3d/Transform3D.html[`Transform3D`] object which will be used to transform it. Both can by dynamic parameters, including keywords that will be looked up as show variables. Similarly, {api-doc}afterglow.effects.params.html#var-build-aim-transformer[`build-aim-transformer`] applies a transformation parameter to an aim parameter. [[debugging-dynamic-parameters]] == Debugging Dynamic Parameters Since dynamic parameters are such a source of flexibility, they can get complex quickly, especially when you are driving them from external systems via MIDI events. Here are a few tips on how you can check whether the parameter is doing what you expect, and how it is feeding into the effects you are creating with it. [[checking-variable-parameters]] === Checking Variable Parameters If you are using a show variable to hold values as the basis of your dynamic parameter, perhaps by <> incoming MIDI events to it, can check the current value of the variable at any time like this: [source,clojure] ---- (show/get-variable :key) ---- If you want to be informed more proactively whenever the show variable value changes, you can register a {api-doc}afterglow.show.html#var-add-variable-set-fn.21[watch function] to be called whenever the variable changes. The following example prints the new values of the variable named `:key` each time it is changed. [source,clojure] ---- (show/set-variable! :key 0) ; nothing special happens (defn println-on-change "Prints a variable every time it changes" [key value] (println key "set to" value)) (show/add-variable-set-fn! :key println-on-change) (show/set-variable! :key 10) ; prints ":key set to 10" ---- [[evaulating-other-parameters]] === Evaluating Other Parameters For all the other kinds of dynamic parameters, there isn't a place where their value is stored; instead, it is calculated for a particular point in time (and perhaps space). But you can ask the parameter to evaluate itself by giving it the proper, context, in the same way Afterglow itself does, using the {api-doc}afterglow.effects.params.html#var-evaluate[`evaluate`] function in the {api-doc}afterglow.effects.params.html#var-IParam[`IParam`] protocol. All dynamic parameters implement this protocol. To call `evaluate`, you pass in the dynamic parameter, the show in which it is running, and a metronome snapshot to identify the instant in time you want to ask about. If you are testing a spatial parameter, you will also want pass in the fixture head that you are asking about. Otherwise, you can leave that last parameter `nil`. The https://github.com/Deep-Symmetry/graphterglow#graphterglow[graphterglow] project includes a bunch of examples of doing this, and graphing the results. It is how the graphs of oscillators and step parameters in this documentation were created. Its https://github.com/Deep-Symmetry/graphterglow/blob/master/src/graphterglow/core.clj#L21-L31[build-test-snapshot and build-beat snapshot] functions show how to create a snapshot for a certain number of millseconds or beats since the start of the metronome. Using them to evaluate a parameter looks like this: [source,clojure] ---- (afterglow.effects.params/evaluate my-param *show* (build-beat-snapshot (:metronome *show*) 5) nil) ---- That would determine the value of the dynamic parameter `my-param` at five beats past the start of the show. If you are working on a tricky oscillated or step parameter, or any other sort of numeric dynamic parameter, getting it set up for graphing within graphterglow might help you get a visual insight for how it is behaving. === Digging Deeper For more details, see the {api-doc}afterglow.effects.params.html[API documentation]. ================================================ FILE: doc/modules/ROOT/pages/push.adoc ================================================ = Using Ableton Push James Elliott Some controllers have such rich capabilities that they deserve their own custom mapping implementations to exploit their capabilities as a show control interface. The Ableton Push is one, and a powerful {api-doc}afterglow.controllers.ableton-push.html[mapping] is being created. You can already use it to do most of the things that you would use the <> for, and often with deeper control, since you can press multiple cue trigger pads at the same time, and they respond to variations in pressure. NOTE: This page describes the mapping for the original Ableton Push. There is also a <>. [[binding-to-the-push]] ## Binding to the Push Assuming you have an Ableton Push connected to the machine running Afterglow, Afterglow will find and activate it as soon as you have set up the sample show. You will see a brief startup animation, and Afterglow's Push interface will start. TIP: For information about how to set up bindings without the sample show, or more details about how it works, see <>. Here is an overview of how the Push mapping works: image::PushNoEffects.jpg[Push interface,1200,977] [[show-control]] == Show Control Once you have the Push linked to a show, it becomes a very direct and tactile way to monitor and control the cues and other aspects of the show. The text area at the top of the Push displays the effects currently running, and can optionally display <> information as well. If a cue was defined with adjustable variables for its effect, they will also be displayed in the text area, and you will be able to <> them by turning the encoder above the variable. The rightmost encoder, past the text area, adjusts the show Grand Master, which controls the maximum brightness that any dimmer cue can achieve, so you can always use it to adjust the overall brightness of the show. As soon as you touch the encoder, the current Grand Master level will appear, and be updated as you turn the encoder. When you release it, the display returns to showing whatever it was before. image::GrandMaster.jpg[Grand Master adjustment,638,344] As with other numeric values that you can adjust, while you are adjusting the Grand Master, the touch strip on the left hand side of the Push will light up in the same proportion as the bar graph in the display, and you can touch or drag it to instantly set the value to whatever level you want. The red kbd:[Stop] button to the right of the top of the cue grid can be used to temporarily shut down the show, blacking out all universes that it controls, and suspending the processing of its effects. image::ShowStop.jpg[Show stopped,800,600] Pressing it again restarts the show where it would have been had it not stopped. [[cues]] == Cues Most of the space on the interface is dedicated to an 8×8 grid of color coded cue trigger pads, which provide a window onto the show's overall <>. The Push can be <> to the <> so that both always display the same section of the cue grid, and the web interface can remind you of the names of the cues you are looking at, or it can be scrolled independently, allowing you access to more cues at the same time. TIP: If you have more than one compatible grid controller, you can have Afterglow using all of them at the same time; each can be scrolled to different areas of the cue grid, and each can even be linked to a different browser window if you have that much screen space. You can activate any cue shown by pressing its pad; running cues will light up, and darken again when they end. The effects which cues create will also appear in the text area above the cue pad, from left to right, with the most recent effect on the right. In the photo below, “Sparkle” is the most recent effect, and it has two variables, `chance` and `Fade`, which can be adjusted by turning the encoders above them. The `chance` value is changing rapidly because it is configured to also be adjusted through the pressure sensitive cue pad that was used to launch it. image::SparklePressure.jpg[Sparkle effect ajusting chance variable,814,452] To stop a running cue, press its pad again, or press the red kbd:[End] pad underneath its effect entry in the text area. Some cues will end immediately, others will continue to run until they reach what they feel is an appropriate stopping point. While they are in the process of ending, the cue pad will blink, and the kbd:[End] pad will be labeled kbd:[Ending]. If you want the cue to end immediately even though it would otherwise run for a while longer, you can press the blinking cue pad (or effect kbd:[Ending] pad) again and it will be killed right then. The colors assigned to cue pads by the creator of the cue grid are intended to help identify related cues. Some cues (especially intense ones like strobes) are configured to run only as long as they are held down. In that case, when you press cue pad, it lights up with a whitened version of the cue color as a hint that this is happening, and as soon as you release the pad, the cue will end. If you want to override this behavior, you can hold down the kbd:[Shift] button (towards the bottom right of the Push) as you press the cue pad, and it will activate as a normal cue, staying on until you press it a second time. As noted above, cues can also be configured to take advantage of the pressure sensitivity of the Push cue pads, so that as you vary the pressure with which you are holding down the pad, some visible variable of the cue is altered. The strobe and sparkle cues in created by {api-doc}afterglow.examples.html#var-make-cues[`afterglow.examples/make-cues`] for the sample show work this way: the intensity and lightness of the strobe are increased by pressure, and so is the chance that a sparkle will be assigned to a light on each frame. You can see these variables change in the text area above the cue's effect name while you are adjusting them, as shown in the photo above. [[exclusivity]]Cues may be mutually exclusive by nature, and if they were created to reflect this (by using the same keyword to register their effects with the show, or specifying other effect keys in their `:end-keys` list), when you activate one, the other cues which use the same keyword are dimmed. This is a hint that when you activate one of them, it will _replace_ the others, rather than running at the same time. In the photo <>, the rest of the Torrent 1 fixed gobo cues (the leftmost blue cues) are dimmed because they would replace the running “T1 atom shake” cue. [[scrolling]] == Scrolling The show will likely have many more cues than fit on the pad grid; the diamond of arrow buttons at the bottom right allow you to page through the larger show grid. If there are more cues available in a given direction, that arrow will be lit, otherwise it is dark. Pressing an active arrow scrolls the view one “page” in that direction. In the photo below, it is currently possible to scroll up and to the right: image::PushScroll.jpg[Push scroll diamond,300,337] If you hold down the kbd:[Shift] button, the arrows gain a different purpose, allowing you to scroll the text display left and right, to see and <> all of the currently running effects, even though only four at a time (or three, if the <> is showing) fit in the display. Pressing the left or right arrows scrolls the next group of effects in that direction into view; pressing the up arrow scrolls to the oldest (leftmost) effect, and pressing the down arrow scrolls to the most recent (rightmost) effect. While kbd:[Shift] is pressed, the arrows will light up according to whether they can scroll effects rather than cues in the corresponding direction. [[effect-control]] == Effect Control As described above, the effects created by cues appear in the text display area, and can be scrolled through and ended by pressing the corresponding red kbd:[End] pad which appears underneath them. [[numeric-cue-variables]] === Numeric Cue Variables If the cue that created an effect has numeric variables assigned to it, the variable names and values will appear above the effect name, and they can be adjusted using the encoder knob above the variable. For example, in addition to varying the sparkle `chance` variable using the pad pressure, as was done above, its `Fade` variable can be adjusted using the effect variable encoder above it. As soon as you touch the encoder knob associated with a variable, a graphical representation of the current value replaces its name, and updates as you turn the encoder to change the value. image::AdjustingFade.jpg[Adjusting Fade variable,800,673] While you are adjusting the variable, the large touch strip on the left hand side of the Push lights up to show you where you are in the variable range, and you can touch and drag on the strip to instantly set the variable to another value. Most numeric variables will have values that grow from the bottom of the touch strip, but variables marked as `:centered`, like Pan and Tilt variables, grow from the center up or down. If an effect has only one adjustable variable, it will take up the entire effect area, and you can use either encoder to adjust it, as when adjusting a Focus <> for the Torrent moving head spot: image::AdjustingFocus.jpg[Adjusting Focus cue,1000,922] When you release the encoder knob, the adjustment graph disappears, and the variable name reappears. The <- indicator at the left of the text area in the above photo is an indicator that there are older effects which have been scrolled to the left, off the display. You will see -> at the bottom right of the display when there are newer effects to the right. You can scroll to them using the kbd:[Shift] button with the scroll arrow buttons as described <>. This photo also illustrates the dimming of incompatible cues discussed <>: The leftmost columns of blue cues all establish settings for the fixed gobo wheel of one of the Torrent moving-head spots. Since one of them is active (the `T1 atom shake` effect at the left of the text area corresponds to the bright blue button three rows down the second column), the others are dimmed to hint that pressing them would replace the active cue. This dimming can also be seen in the web interface view of the cue grid: [[gobo-photo]] image::GoboCues.png[Gobo cues,1100,769] [[boolean-cue-variables]] === Boolean Cue Variables If a cue has Boolean variables assigned to it, they will also appear above the effect name, with the current value showing as `Yes` or `No`. To adjust them you also start by grabbing the closest encoder, at which point you will see the two options with an arrow pointing at the currently-chosen one. Rotate the encoder towards the option you want to choose and the variable will be updated: image::AdjustingDown.jpg[Adjusting a Down? cue variable,600,494] When you release the encoder knob, the choices disappear and the variable name reappears. You can also use the touch strip when setting a Boolean variable; touching the top half sets it to `Yes`, while the bottom half sets it to `No`. [[color-cue-variables]] === Color Cue Variables If a cue has color variables assigned to it, they will also appear above the effect name. The currently assigned color value will be displayed as a six digit hexadecimal number, representing the eight bit red, green, and blue representation of the color value, #rrggbb. In this photo, a cue with a color variable that starts out white has just been launched: image::ColorParam.jpg[Cue with color variable,1000,785] When an effect is displaying a color cue variable, touching the associated encoder will open up a special color selection interface, which takes over the entire cue grid, as well as the effect cell: image::ColorPalette.jpg[Color adjustment palette,1000,750] In addition to adjusting the color's hue and saturation using the encoders above the effect, you can instantly jump to a color by tapping any of the pads in the grid, which form a palette of four saturation levels of hues spread across the rainbow. The four pads on the bottom right let you select white, medium gray, and black as color values as well, and the last pad displays a preview of the currently selected color, rather than doing anything when you press it. If any pad other than the preview pad matches the currently selected color, it blinks (regardless of whether you chose that color by pressing the pad or by turning the encoders). While you are holding the hue or saturation encoder, you can also use the touch strip to see and jump to any value in that encoder's range. If both encoders are being held, the touch pad allows you to select saturations, since the touch pads already give you an easy interface for selecting hues. As soon as you let go of both the hue and saturation encoders, the palette disappears and the normal cue grid returns. [[scrolling-through-cue-variables]] === Scrolling Through Cue Variables If a cue has more than two variables, even though you can only see two at a time on the Push, you can still check and adjust all of them. Whenever there are too many to fit, the rightmost pad just below the effect display will be lit with an amber color and labeled kbd:[More ->] as shown below: image::MoreVars.jpg[More than Two Cue Variables,800,562] Each time you press the kbd:[More ->] button, you will see the next two variables assigned to the cue. Once you reach the end of the list, it wraps back to the beginning. Grabbing an encoder above the variables will adjust whichever variable is currently displayed beneath it. (While you are holding encoders to adjust an effect's variables, its kbd:[More ->] button will be blacked out and disabled.) [[saving-cues]] == Saving Cues If you have made any adjustments to cue variable values, these are normally discarded when you end the cue; the next time it begins, it starts with the values that were configured in the show. You can change that by saving the cue's variables. To begin, hold down the kbd:[◯] button near the bottom left of the Push: image::Saving1.jpg[Saving Cue Variables,1000,761] While this button is held down, the red kbd:[End] buttons beneath the effect list disappear, and are replaced with the cue saving interface. If you have made any adjustments to a cue's variables since it was started, a green kbd:[Save] button will appear (like the one beneath the `Color all` effect in the photo above). Pressing that will save the adjustments you made, so the next time you launch the cue, the adjusted values will be used. When you save a color cue that is configured like the ones in the sample show, the color of the cue's pad in the cue grid is updated to reflect the new color you have chosen. (Its color in the the web interface cue grid is updated as well). Once you have saved a cue's variables, while it is running, instead of a green kbd:[Save] button, you will see an amber kbd:[Clear] button (like the one beneath the `Torrent Sine` effect in the photo). Pressing that will remove the saved values, so the cue goes back to its original configuration. If you save a cue's variables, and then adjust them further, the kbd:[Save] button returns, allowing you to save your new values. If you don't, the values you saved earlier will be used the next time you start the cue. If a cue's variables have neither been saved nor adjusted, no kbd:[Save] or kbd:[Update] button appears (like for the `Blade Triangle` effect in the photo). Of course, while saving cues, you can still scroll though their variables using the kbd:[More ->] buttons. Once you release the kbd:[◯] button, the save interface goes away, and the effect kbd:[End] buttons return. [[metronome-control]] == Metronome Control The top left section of the Push lets you view and adjust the Metronome that the show is using to keep time with the music that is being played. Since Afterglow's effects are generally defined with respect to the metronome, it is important to keep it synchronized with the music. When active, the metronome section takes over the leftmost quarter of the text area (so there are room to see only three effects, rather than the normal four). To toggle the metronome section, press the kbd:[Metronome] button. It will appear if it was not showing, and disappear if it was there. The kbd:[Metronome] button is lit more brightly when the section is active. The metronome section shows the current speed, in Beats Per Minute, of the metronome, and the kbd:[Tap Tempo] button label flashes at each beat (this flashing happens regardless of whether the metronome section is visible in the text area). The metronome section also shows you the current phrase number, the bar within that phrase, and the beat within that bar which has been reached. image::PushMetronome.jpg[Metronome section,600,559] The most basic way of synchronizing the metronome is to tap the kbd:[Tap Tempo] button at each beat of the music. Tapping the button aligns the metronome to a beat, and if you tap it three or more times within two seconds of each preceding tap, sets the metronome's BPM. Tap it as you hear each beat of the music, and after three or more taps, the speed of the metronome will be approximately synchronized with the music. Once the tempo is correct, you can tell Afterglow which beat is the down beat by holding down the kbd:[Shift] button while pressing kbd:[Tap Tempo]. This combination does not change the tempo, but tells Afterglow that the moment when you tapped the button is the down beat (the first beat of a bar). You can also adjust the BPM by turning the BPM encoder, which is the rightmost encoder below the Metronome button: image::PushBPM.jpg[BPM encoder,600,450] While you are holding this encoder, the symbol `↑` appears below the BPM value as a visual reminder of what value you are adjusting. Turning the encoder clockwise raises the BPM, turning counterclockwise lowers it. While the metronome section is showing, you can also use the encoder above the BPM value to adjust it. But you can grab the dedicated BPM encoder below the kbd:[Metronome] button even when the metronome section is not showing, and it will appear while you have the encoder in your hand, so you can adjust the BPM quickly, and then get back to what you were doing. If you press the kbd:[Shift] button, the BPM encoder can be used to adjust the BPM by whole beats rather than tenths. While kbd:[Shift] is down, the `↑` will point to the left of the decimal point rather than to the right of it, and the BPM will change ten times as quickly as you turn it. You can switch back and forth in the middle of your adjustments by pressing and releasing the shift key at any time. In order to make longer chases and effects line up properly with the music, you will also want to make sure the count is right, that the beat number shows `1` on the down beat, and that the bar numbers are right as well, so that the start of a phrase is reflected as bar number `1`. In addition to using kbd:[Shift] with kbd:[Tap Tempo] to set the down beat, you can adjust the current beat number using the beat encoder, the leftmost encoder below the metronome button: image::PushBeat.jpg[Beat encoder,600,474] While you are holding this encoder, the symbol `↑` appears below the beat number as a visual reminder of what value you are adjusting. Turning the encoder clockwise jumps to the next beat, turning counterclockwise jumps back to the previous one. As a tactile reminder that you are adjusting whole beats, this encoder moves with a distinct click as it changes value, while the BPM encoder turns smoothly as you scroll through fractional BPM values. While the metronome section is showing, you can also use the encoder above the Beat value to adjust it. But you can grab the dedicated Beat encoder below the kbd:[Metronome] button even when the metronome section is not showing, and it will appear while you have the encoder in your hand, so you can adjust the beat number quickly, and then get back to what you were doing. If you press the kbd:[Shift] button, the Beat encoder can be used to adjust the current bar within the phrase instead of the current beat. While kbd:[Shift] is down, the `↑` will point at the bar instead of the beat, and turning the encoder will jump that value forwards or backwards: image::PushBar.jpg[Bar jumping,600,475] If you know a phrase is about to begin, you can press the red Reset pad in the metronome section right as it does. This will reset the count to Phrase 1, Bar 1, Beat 1. Trying to keep up with tempo changes during dynamic shows can be tedious, so you will hopefully be able to take advantage of Afterglow's metronome synchronization features. If the DJ can send you <>, or you can connect via a Local Area Network to Pioneer professional DJ gear to lock into the beat grid established by <>, Afterglow can keep the BPM (with MIDI) and even the beats (with Pro DJ Link and the Traktor Afterglow Beat Phase <>) synchronized for you. The Sync pad in the Metronome section (showing `Manual` sync in these photos) will eventually allow you to set this up, but that is not yet implemented, so for now you will need to use the <> to configure it. NOTE: The pad does already change color to let you know the sync status: amber means manual, green means successful automatic sync, and red means a requested automatic sync has failed. It is likely that a future release of Afterglow will let you press this pad to choose your sync source. Once your sync is established, the meaning of the kbd:[Tap Tempo] button changes. If you are using MIDI clock to sync the BPM, it becomes a kbd:[Tap Beat] button, which simply establishes where the beat falls. If you are locked in to a Pro DJ Link beat grid or using the Traktor beat phase mapping, the beats are automatically aligned for you so, it becomes a kbd:[Tap Bar] button which, when pressed, indicates that the current beat is the down beat (start) of a bar. (Similarly, if you press the metronome kbd:[Reset] pad while synced to a Pro DJ Link beat grid or Traktor beat phase, the beat itself will not move, but the beat closest to when you pressed the pad will be identified as Beat 1.) In these sync modes you can also use the kbd:[Shift] button to align at the next bigger boundary: If tapping would normally move the bar, shift-tapping will move the phrase. If you try to adjust the BPM encoder while sync is active, it will have no effect, and Afterglow will point at the sync mode to explain why it is ignoring your adjustments. [[sharing-the-push]] == Sharing the Push If you are using Afterglow at the same time as Ableton Live, you can switch back and forth between which has control of the Push by pressing the kbd:[User] button. If Live is not running when you press kbd:[User], the Push interface will simply go blank (except for the kbd:[User] button itself), until you press it again, at which point Afterglow will light it up. NOTE: Future releases may take advantage of more of the buttons on the controller. ================================================ FILE: doc/modules/ROOT/pages/push2.adoc ================================================ = Using Ableton Push 2 James Elliott Some controllers have such rich capabilities that they deserve their own custom mapping implementations to exploit their capabilities as a show control interface. The Push 2 called out for such treatment, and thankfully in March 2016 Ableton published https://github.com/Ableton/push-interface/blob/master/doc/AbletonPush2MIDIDisplayInterface.asc[documentation] which made that possible, and a {api-doc}afterglow.controllers.ableton-push-2.html[mapping] has been created. You can use it to do most of the things that you would use the <> for, often with deeper control, since you can press multiple cue trigger pads at the same time, and they respond to variations in pressure. NOTE: Although this page discusses the second version of the Push controller, with a graphical display, there is also a page describing the <>, which is still fully supported. [[binding-to-the-push-2]] ## Binding to the Push 2 Assuming you have an Ableton Push 2 connected to the machine running Afterglow and powered on, it will be noticed, identified, and activated as soon as you have set up the sample show. You will see a brief startup animation, and Afterglow's Push 2 interface will appear. TIP: For information about how to set up bindings without the sample show, or more details about how it works, see <>. Here is an overview of how the Push 2 mapping works, with details explained in the upcoming sections: image::Push2NoEffects.jpg[Push 2 interface,1200,977] The most exciting innovation that the Push 2 adds to the already excellent Push experience is the color graphic display, and Afterglow can take full advantage of it, as this example shows: image::Example.gif[Afterglow graphic animation,960,160] [[show-control]] == Show Control Once you have the Push 2 bound to a show, it becomes a very direct and tactile way to monitor and control the cues and other aspects of the show. The graphical display at the top of the Push displays the effects currently running, and can optionally display <> information as well. If a cue was defined with adjustable variables for its effect, they will also be displayed, and you will be able to <> them by turning the encoder above the variable. The rightmost encoder, past the display, adjusts the show Grand Master, which controls the maximum brightness that any dimmer cue can achieve, so you can always use it to adjust the overall brightness of the show. As soon as you touch the encoder, the Grand Master level will appear along with a gauge representing what fraction of its maximum level is currently in effect, and both will be updated as you turn the encoder. When you release it, the display returns to showing whatever it was before. image::GrandMaster2.jpg[Grand Master adjustment,1200,978] As with other numeric values that you can adjust, while you are adjusting the Grand Master, the touch strip on the left hand side of the Push will light up in the same proportion as the circular gauge in the display under the encoder, and you can touch or drag on the strip to instantly set the level to whatever value you want. The red kbd:[▷] button to the at the bottom left of the cue grid can be used to temporarily shut down the show, blacking out all universes that it controls, and suspending the processing of its effects. image::ShowStop2.jpg[Show stopped,1000,1008] Whenever the show is stopped, the kbd:[▷] button turns green to represent “Play”. Pressing it in this state restarts the show where it would have been had it not stopped. [[cues]] == Cues Most of the space on the interface is dedicated to an 8×8 grid of color coded cue trigger pads, which provide a window onto the show's overall <>. The Push 2 can be <> to the <> so that both always display the same section of the cue grid, and the web interface can remind you of the names of the cues you are looking at, or it can be scrolled independently, allowing you access to more cues at the same time. TIP: If you have more than one compatible grid controller, you can have Afterglow using all of them at the same time; each can be scrolled to different areas of the cue grid, and each can even be linked to a different browser window if you have that much screen space. You can activate any cue shown by pressing its pad; running cues will light up, and darken again when they end. The effects which cues create will also appear in the display above the cue pad, from left to right, with the most recent effect on the right. The labels containing the effect name are drawn in the same color as the cue pad used to launch the effect, to help keep track of which is which. In the photo below, “Sparkle” is the most recent effect, and it has two variables, `chance` and `Fade`, which can be adjusted by turning the encoders above them. The `chance` value is changing because it is configured to also be adjusted through the pressure sensitive cue pad that was used to launch it. image::SparklePressure2.jpg[Sparkle effect adjusting chance variable,600,624] To stop a running cue, press its pad again, or press the red kbd:[End] pad underneath its effect entry in the display. Some cues will end immediately, others will continue to run until they reach what they feel is an appropriate stopping point. While they are in the process of ending, the cue pad will blink, and the kbd:[End] pad will be labeled kbd:[Ending]. If you want the cue to end immediately even though it would otherwise run for a while longer, you can press the blinking cue pad (or effect kbd:[Ending] pad) again and it will be killed right then. The colors assigned to cue pads by the creator of the cue grid are intended to help identify related cues. The same color is used in the cue label at the bottom of the graphical display, to help keep track of which cue came from where. Some cues (especially intense ones like strobes) are configured to run only as long as they are held down. In that case, when you press cue pad, it lights up with a whitened version of the cue color as a hint that this is happening, and as soon as you release the pad, the cue will end. If you want to override this behavior, you can hold down the kbd:[Shift] button (towards the bottom right of the Push) as you press the cue pad, and it will activate as a normal cue, staying on until you press its pad a second time. As noted above, cues can also be configured to take advantage of the pressure sensitivity of the Push cue pads, so that as you vary the pressure with which you are holding down the pad, some visible variable of the cue is altered. The strobe and sparkle cues in created by {api-doc}afterglow.examples.html#var-make-cues[`afterglow.examples/make-cues`] for the sample show work this way: the intensity and lightness of the strobe are increased by pressure, and so is the chance that a sparkle will be assigned to a light on each frame. You can see these variables change in the display above the cue's effect name while you are adjusting them, as shown in the photo above. [[exclusivity]]Cues may be mutually exclusive by nature, and if they were created to reflect this (by using the same keyword to register their effects with the show, or specifying other effect keys in their `:end-keys` list), when you activate one, the other cues which use the same keyword are dimmed. This is a hint that when you activate one of them, it will _replace_ the others, rather than running at the same time. In the photo <>, the rest of the Torrent 1 fixed gobo cues (the leftmost blue cues) are dimmed because they would replace the running “T1 atom shake” cue. [[scrolling]] == Scrolling The show will likely have many more cues than fit on the pad grid; the diamond of arrow buttons to the right of the top of the cue grid allow you to page through the larger show grid. If there are more cues available in a given direction, that arrow will be lit, otherwise it is dark. Pressing an active arrow scrolls the view one “page” in that direction. In the photo below, it is currently possible to scroll up and to the right: image::PushScroll2.jpg[Push 2 scroll diamond,286,244] If you hold down the kbd:[Shift] button, the arrows will scroll you as far as possible in the direction that you press. The kbd:[Page <] and kbd:[> Page] buttons (toward the bottom right, just above kbd:[Shift]) allow you to scroll the graphical display left and right, to see and <> all of the currently running effects, even though only four at a time (or three, if the <> is showing) fit in the display. Pressing the kbd:[Page <] scrolls the display left, showing you older (or lower priority) effects, and kbd:[> Page] scrolls to the right, showing you newer and higher priority effects. Pressing these buttons while kbd:[Shift] is held will scroll as far as possible in the corresponding direction. (As illustrated in the photo below, in addition to lighting up the kbd:[Page <] and kbd:[> Page] buttons when there are effects off the screen in that direction, Afterglow draws `<` and `>` markers below the effect name labels at the corresponding edge of the screen.) image::Push2Page.jpg[Push 2 page arrows,1000,832] [[effect-control]] == Effect Control Effects, whether created by cues or other code, appear in the display area, and can be scrolled through and ended by pressing the corresponding red kbd:[End] pad which appears underneath them. There are many ways you can interact with running effects: [[numeric-cue-variables]] === Numeric Cue Variables If the effect was created by a cue that has numeric variables assigned to it, the variable names and values will appear above the effect name. The values can be adjusted using the encoder knob above the variable. For example, in addition to varying the sparkle `chance` variable using the pad pressure, as was done above, its `Fade` variable can be adjusted using the effect variable encoder above it. As soon as you touch the encoder knob associated with a variable, the gauge underneath its value brightens to indicate that you are adjusting it, and updates as you turn the encoder to change the value. In the photo below, the `Confetti Dance` cue's `Min Last` variable is being adjusted. image::AdjustingConfetti.jpg[Adjusting Min Last variable,693,566] And here is how the effect's display section updates while the value is being adjusted: image::min-last.gif[Adjusting Min Last Animation,240,160] While you are adjusting the variable, the large touch strip on the left hand side of the Push lights up to show you where you are in the variable range, and you can touch and drag on the strip to instantly set the variable to another value. image::AdjustingConfetti2.jpg[Adjusting and touch strip,800,646] Most numeric variables will have values that grow from the bottom of the touch strip, but variables marked as `:centered` when created, like Pan and Tilt, grow from the center up or down. (Their graphical gauges grow from the center as well.) image::AdjustingCentered2.jpg[Adjusting centered cue variables,800,807] image::pan-tilt.gif[Adjusting centered variable animation,241,160] If an effect has only one adjustable variable, it will take up the entire effect area, and you can use either encoder to adjust it, as when adjusting a gobo shaking <> for the Torrent moving head spot: image::AdjustingShake.jpg[Adjusting gobo shake cue,800,926] When you release the encoder knob, the adjustment graph returns to its normal brightness, and the touch strip deactivates. This photo also illustrates the dimming of incompatible cues discussed <>: The leftmost columns of blue cues all establish settings for the fixed gobo wheel of one of the Torrent moving-head spots. Since one of them is active (the `T1 atom shake` effect being adjusted corresponds to the bright blue button three rows down the second column), the others are dimmed to hint that pressing them would replace the active cue. This dimming can also be seen in the web interface view of the cue grid: [[gobo-photo]] image::GoboCues.png[Gobo cues,1100,769] [[boolean-cue-variables]] === Boolean Cue Variables If a cue has Boolean variables assigned to it, they will also appear above the effect name, with the current value showing as `Yes` or `No`. To adjust them you also start by grabbing the closest encoder. With a Boolean value, the adjustment graph is always half full, and you rotate it to the left for No, or right for Yes: image::AdjustingDown2.jpg[Adjusting a Down? cue variable,700,475] NOTE: The `Blade Saw` cue in the photo is also an example of a cue that defines a custom visualization. Underneath its variable gauges, it draws an animated view of the previous and upcoming measure of time, with down beats marked in red as they are in the Metronome section. The visualization is a strip chart showing the dimmer level that the cue will establish at each point in time. As you adjust the cue variables, the visualization instantly updates to reflect your changes, helping you understand how they affect it. image::blade-saw.gif[Cue visualization animation,240,160] You can also use the touch strip when setting a Boolean variable; touching the top half sets it to `Yes`, while the bottom half sets it to `No`. image::AdjustingDown2Strip.jpg[Adjusting a Down? cue with the touch strip visible,800,748] NOTE: The `Rainbow Pulse` cue to the left of the one being adjusted is an example of a cue with no variables to adjust. [[color-cue-variables]] === Color Cue Variables If a cue has color variables assigned to it, they will also appear above the effect name. The currently assigned color value will be displayed as swatch and a six digit hexadecimal number, representing the eight bit red, green, and blue representation of the color value, #rrggbb. In this photo, a `Color all` cue with a color variable that starts out white has just been launched: image::ColorParam2.jpg[Cue with color variable,1200,941] When an effect is displaying a color cue variable, the gauges beneath it represent hue and saturation values. (If the cue has only one variable, both of these will always be visible. Otherwise, only the one underneath the variable's encoder will be visible until you start adjusting that variable, at which point the other color gauge will appear.) Touching the associated encoder will open up a special color selection interface, which takes over the entire cue grid, as well as the effect cell: image::ColorPalette2.jpg[Color adjustment palette,1000,891] In addition to adjusting the color's hue and saturation using the encoders above the effect, you can instantly jump to a color by tapping any of the pads in the grid, which form a palette of four saturation levels of hues spread across the rainbow. The four pads on the bottom right let you select white, medium gray, and black as color values as well, and the last pad displays a preview of the currently selected color, rather than doing anything when you press it. If any pad other than the preview pad matches the currently selected color, it blinks (regardless of whether you chose that color by pressing the pad or by turning the encoders). While you are holding the hue or saturation encoder, you can also use the touch strip to see and jump to any value in that encoder's range. If both encoders are being held, the touch pad allows you to select saturations, since the touch pads already give you an easy interface for selecting hues. image::color-all.gif[Color selection animation,240,160] As soon as you let go of both the hue and saturation encoders, the palette disappears and the normal cue grid returns. [[scrolling-through-cue-variables]] === Scrolling Through Cue Variables If a cue has more than two variables, even though you can only see two at a time on the Push, you can still check and adjust all of them. Whenever there are too many to fit, the rightmost pad just below the effect display will be lit white and labeled kbd:[Next Vars >] as shown below: image::MoreVars2.jpg[More than Two Cue Variables,600,389] In the photo, the `Torrent Sine` and `Blade Triangle` cues have more variables than are being displayed, while the `Color all` cue does not. Each time you press a kbd:[Next Vars >] button, you will see the next two variables assigned to the cue. Once you reach the end of the list, it wraps back to the beginning. Grabbing an encoder above the variables will adjust whichever variable is currently displayed beneath it. (While you are holding encoders to adjust an effect's variables, its kbd:[Next Vars >] button will be blacked out and disabled.) [[saving-cues]] === Saving Cues If you have made any adjustments to cue variable values, these are normally discarded when you end the cue; the next time it begins, it starts with the values that were configured in the show. You can change that by saving the cue's variables. To begin, hold down the kbd:[◯] button near the bottom left of the Push 2: image::Saving2.jpg[Saving Cue Variables,1000,821] While this button is held down, the red kbd:[End] buttons beneath the effect list disappear, and are replaced with the cue saving interface. If you have made any adjustments to a cue's variables since it was started, a green kbd:[Save] button will appear (like the one beneath the `Color all` effect in the photo above). Pressing that will save the adjustments you made, so the next time you launch the cue, the adjusted values will be used. When you save a color cue that is configured like the ones in the sample show, the color of the cue's pad in the cue grid is updated to reflect the new color you have chosen. (Its color in the the web interface cue grid is updated as well). Once you have saved a cue's variables, while it is running, instead of a green kbd:[Save] button, you will see an amber kbd:[Clear] button (like the one beneath the `Torrent Sine` effect in the photo). Pressing that will remove the saved values, so the cue goes back to its original configuration. If you save a cue's variables, and then adjust them further, the kbd:[Save] button returns, allowing you to save your new values. If you don't, the values you saved earlier will be used the next time you start the cue. If a cue's variables have neither been saved nor adjusted, no kbd:[Save] or kbd:[Update] button appears (like for the `Blade Triangle` effect in the photo). Of course, while saving cues, you can still scroll though their variables using the kbd:[Next Vars >] buttons. Once you release the kbd:[◯] button, the save interface goes away, and the effect kbd:[End] buttons return. image::save-clear.gif[Save interface animation,960,160] [[metronome-control]] == Metronome Control The top left section of the Push lets you view and adjust the Metronome that the show is using to keep time with the music that is being played. Since Afterglow's effects are generally defined with respect to the metronome, it is important to keep it synchronized with the music. When active, the metronome section takes over the leftmost quarter of the graphical display (so there are room to see only three effects, rather than the normal four). To toggle the metronome section, press the kbd:[Metronome] button. It will appear if it was not showing, and disappear if it was there. The kbd:[Metronome] button is lit more brightly when the section is active. The metronome section shows the current speed, in Beats Per Minute, of the metronome, and the kbd:[Tap Tempo] button label flashes at each beat (this flashing happens regardless of whether the metronome section is visible in the text area). The metronome section also shows you the current phrase number, the bar within that phrase, and the beat within that bar which has been reached. image::Metronome2.png[Metronome section,414,302] Finally, below the beat and BPM displays, there is a visualization of the passing beats, bars, and phrases. The beats are drawn in white, with their phase increasing until the next beat hits. In a layer beneath them, the measures (bars) are drawn in red, and beneath those, the phrases in blue. The current moment in time is centered in the visualization with a stationary line to mark it, and there is room for one measure before and after the line. A full phrase doesn't fit, but you can see its phase gradually growing until it ends. image::metronome-phrase.gif[One phrase of metronome animation,239,160] The most basic way of synchronizing the metronome is to tap the kbd:[Tap Tempo] button at each beat of the music. Tapping the button aligns the metronome to a beat, and if you tap it three or more times within two seconds of each preceding tap, sets the metronome's BPM. Tap it as you hear each beat of the music, and after three or more taps, the speed of the metronome will be approximately synchronized with the music. Once the tempo is correct, you can tell Afterglow which beat is the down beat by holding down the kbd:[Shift] button while pressing kbd:[Tap Tempo]. This combination does not change the tempo, but tells Afterglow that the moment when you tapped the button is the down beat (the first beat of a bar). You can also adjust the BPM by turning the BPM encoder, which is the encoder right above the kbd:[Metronome] button: image::Push2BPM.jpg[BPM encoder,800,663] While you are holding this encoder, the BPM gauge brightens, along with the BPM digit after the decimal point, as a visual reminder of what value you are adjusting. Turning the encoder clockwise raises the BPM, turning counterclockwise lowers it. While the metronome section is showing, you can also use the encoder above the BPM value to adjust it. But you can grab the dedicated BPM encoder above the kbd:[Metronome] button even when the metronome section is not showing, and it will appear while you have the encoder in your hand, so you can adjust the BPM quickly, and then get back to what you were doing. If you press the kbd:[Shift] button, the BPM encoder can be used to adjust the BPM by whole beats rather than tenths. While kbd:[Shift] is down, the BPM value before the decimal point will be brightened, rather than the digit after it, and the BPM will change ten times as quickly when you turn it. You can switch back and forth in the middle of your adjustments by pressing and releasing the shift key at any time. image::bpm-adjustment.gif[BPM adjustment animation,240,160] In order to make longer chases and effects line up properly with the music, you will also want to make sure the count is right, that the beat number shows `1` on the down beat, and that the bar numbers are right as well, so that the start of a phrase is reflected as bar number `1`. In addition to using kbd:[Shift] with kbd:[Tap Tempo] to set the down beat, you can adjust the current beat number using the beat encoder, the encoder above the kbd:[Tap Tempo] button: image::Push2Beat.jpg[Beat encoder,800,459] While you are holding this encoder, an endless circular gauge appears below the beat information, and the beat number is brightened, as a visual reminder of what value you are adjusting. Turning the encoder clockwise jumps to the next beat, turning counterclockwise jumps back to the previous one. As a tactile reminder that you are adjusting whole beats, this encoder moves with a distinct click as it changes value, while the BPM encoder turns smoothly as you scroll through fractional BPM values. While the metronome section is showing, you can also use the encoder above the Beat value to adjust it. But you can grab the dedicated Beat encoder above the kbd:[Tap Tempo] button even when the metronome section is not showing, and it will appear while you have the encoder in your hand, so you can adjust the beat number quickly, and then get back to what you were doing. If you press the kbd:[Shift] button, the Beat encoder can be used to adjust the current bar within the phrase instead of the current beat. While kbd:[Shift] is down, the bar will be brightened instead of the beat, and turning the encoder will jump that value forwards or backwards: image::beat-adjustment.gif[Beat adjustment animation,240,160] If you know a phrase is about to begin, you can press the red kbd:[Reset] button in the metronome section right as it does. This will reset the count to Phrase 1, Bar 1, Beat 1. Trying to keep up with tempo changes during dynamic shows can be tedious, so you will hopefully be able to take advantage of Afterglow's metronome synchronization features. If the DJ can send you <>, or you can connect via a Local Area Network to Pioneer professional DJ gear to lock into the beat grid established by <>, Afterglow can keep the BPM (with MIDI) and even the beats (with Pro DJ Link and the Traktor Afterglow Beat Phase <>) synchronized for you. The Sync button in the Metronome section (showing kbd:[Manual] sync in these photos) will eventually allow you to set this up, but that is not yet implemented, so for now you will need to use the <> to configure it. NOTE: The button does already change color to let you know the sync status: amber means manual, green means successful automatic sync, and red means a requested automatic sync has failed. It is likely that a future release of Afterglow will let you press this button to choose your sync source. Once your sync is established, the meaning of the kbd:[Tap Tempo] button changes. If you are using MIDI clock to sync the BPM, it becomes a kbd:[Tap Beat] button, which simply establishes where the beat falls. If you are locked in to a Pro DJ Link beat grid or using the Traktor beat phase mapping, the beats are automatically aligned for you so, it becomes a kbd:[Tap Bar] button which, when pressed, indicates that the current beat is the down beat (start) of a bar. (Similarly, if you press the metronome kbd:[Reset] pad while synced to a Pro DJ Link beat grid or Traktor beat phase, the beat itself will not move, but the beat closest to when you pressed the pad will be identified as Beat 1.) In these sync modes you can also use the kbd:[Shift] button to align at the next bigger boundary: If tapping would normally move the bar, shift-tapping will move the phrase. If you try to adjust the BPM encoder while sync is active, it will have no effect, and Afterglow will point at the sync mode to explain why it is ignoring your adjustments. [[sharing-the-push]] === Sharing the Push 2 If you are using Afterglow at the same time as Ableton Live, you can switch back and forth between which has control of the Push by pressing the kbd:[User] button. If Live is not running when you press kbd:[User], the Push interface will simply go blank (except for the kbd:[User] button itself), until you press it again, at which point Afterglow will light it up. NOTE: Future releases will take advantage of more of the buttons on the controller. ================================================ FILE: doc/modules/ROOT/pages/rendering_loop.adoc ================================================ = The Rendering Loop James Elliott This page contains advanced, low-level information for people who are ready to create their own custom effect algorithms. Not to scare you off, but don't be discouraged if you are new to Afterglow, and this content seems rather difficult. Start experimenting in other places, and by the time you need this information, it will make much more sense! And once you are ready to really dive deep, you can learn how to <> the rendering loop to incorporate completely new kinds of elements, such as integrating with Pangolin Beyond laser shows. [[frame-rendering-stages]] == Frame Rendering Stages When an afterglow show is running, that is, from when {api-doc}afterglow.show.html#var-start.21[`(show/start!)`] has been called, until {api-doc}afterglow.show.html#var-stop.21[`(show/stop!)`] or {api-doc}afterglow.show.html#var-stop-all.21[`(show/stop-all!)`] is called, there is a background task scheduled to run many times per second, to calculate the next “frame” of control values to send to the universes controlled by the show, and then send those values. The rate at which this activity is scheduled is determined by the `refresh-interval` value established when the show was {api-doc}afterglow.show.html#var-show[created]. If not explicitly set as a parameter to `(show/show)`, an interval of 25 milliseconds is used, causing the lights to be updated forty times each second. If your DMX interface is running at a different rate, you will want to configure your show to match it, so that you are getting the best results possible without wasting computation on frames that never get seen. TIP: Once a show has started running, you can get a sense of how heavily it is taxing your hardware by looking at the show’s `:statistics` atom: [source,clojure] ---- (clojure.pprint/pprint @(:statistics *show*)) ; {:afterglow-version "0.1.0-SNAPSHOT", ; :total-time 70429, ; :frames-sent 105828, ; :average-duration 0.6655044, ; :recent #amalloy/ring-buffer [30 (0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1)], ; :recent-total 6, ; :recent-average 0.2} ; -> nil ---- ____ This tells you how many milliseconds have been spent in the rendering loop while the show is running, how many frames of DMX data have been sent to the show universes, and the average number of milliseconds spent in the rendering loop. If the duration of a rendering cycle ever exceeds the refresh interval, Afterglow will log a warning that it is unable to keep up with the effects you are trying to run. If you have a show’s web interface open, the `:recent` keys in this atom are used to display the Load bar at the top of the screen, which fills up and turns red as the time within each frame available for calculating and sending control values to the lights gets used up. ____ When it is time to determine the next set of values to send to the show’s patched fixtures, this is what happens: . The first thing Afterglow does is take a {api-doc}afterglow.rhythm.html#var-ISnapshot[snapshot] of the show <> to identify a common point in time for all the effects to use in deciding how they should look. This enables a consistent, coordinated appearance for everything in the frame. . The next step is to zero out the buffers that will be used to send DMX data for each universe, so that if no effect tries to set a value for a particular channel on this frame, a zero value will be sent for it. . Then Afterglow loops over all <> that are currently active for the show, and asks if any are ready to end, as described in the <> section. If any are, they are removed from the list of active effects. . Then it makes another loop over any effects that did not end, to see how they want to affect the lights. It does this by calling, in order, each effect’s {api-doc}afterglow.effects.html#var-generate[`generate`] function, passing in the show and the metronome snapshot. In order to make the lights do things, each effect returns a list of <> specifying the things it wants to happen. These are gathered in the order they were returned by each effect. . While being gathered, the assigners are separated into individual lists, divided first by the `kind` value of the assigner (`:channel`, `:function`, `:color`, `:pan-tilt`, `:direction`, or `:aim`, or some other value added by a rendering loop <>), and within each kind, further divided into lists based on the target ID that the assigner wants to affect. The structure of a target ID is up to the Assigner kind, and may be a simple number or tuple, depending on the needs of the Assigner implementation; the important thing from the Show's perspective is that if two target IDs are equal to each other, the assigners are affecting the same element of the show. + Since the effects are run in priority order (lower priority first, with effects of the same priority running in the order in which they were added to the show), higher-priority and more recent effects’ assigners will come later in the gathered lists, and will get the chance to modify or veto any assigners from earlier and lower-priority effects which are trying to control the same thing. If the effect doesn’t want to do anything this frame, it can simply return an empty assigner list. . Once all the assigners have been collected into their kind/target lists, each list is evaluated. The assigner kinds are processed in the order established by {api-doc}afterglow.show.html#var-resolution-order[`show/resolution-order`] and starts with low-level, single channel `:channel` assigners, then moves up to more complex `:function`, `:color`, `:pan-tilt`, `:direction`, and `:aim` assigners. (This order was chosen because different kinds of assigners might end up affecting the same DMX channel; the higher levels of abstraction are allowed to win by running last.) Within each kind, however, the lists can be processed in parallel, since they will all affect separate targets. + To process a list, each assigner’s {api-doc}afterglow.effects.html#var-assign[`assign`] function is called, again passing in the show and the metronome snapshot, the target which is being assigned (a DMX channel in a show universe, or a fixture or fixture head, depending on the assigner kind), as well as the assignment value the effect wanted to establish (a number, color, or head direction, again depending on the assigner type), and the previous assignment (if any) that an earlier assigner wanted to set for this target. The assigner can decide what to do with the previous assignment: Ignore it, blend the current assignment with it somehow, or honor it, depending on the nature and configuration of the assigner. The `assign` function returns a single resolved value of the appropriate type for the assignment, and Afterglow records it, potentially to pass it to the next assigner on the list. The assigner can also veto any previous assignment and say that nothing should happen by returning an assignment with `nil` for its value. + The input to `assign` might be a <>, and the resulting value may be as well, or the assigner may choose to resolve it into a non-dynamic value, in order to decide between or blend competing assignments. + At the end of this process, Afterglow is left with a single assigned value for every target which any effect wanted to influence for the current frame. . Afterglow uses these assignment results to establish actual DMX values for the frame, using the {api-doc}afterglow.effects.html#var-resolve-assignment[`resolve-assignment`] multimethod, whose implementations (which are specific for each of the possible assignment kinds) finally resolve any remaining dynamic parameters, and then turn abstractions like color objects and aiming vectors into appropriate DMX channel values for the target that is being assigned. . Finally, the resulting buffers of DMX values, with zeros in any channels which were not affected by assigners, are sent to their corresponding universes, causing the lights to produce the desired effects. [[assigners]] == Assigners As described above, the role of an assigner in the rendering loop is to actually decide what _value_ (color, direction, or the like) is going to be sent to a _target_ (a lighting fixture head for more abstract assigners, or a simple DMX channel for Channel assigners), at a given point in time. It really is the heart of implementing an effect. The assigner fulfills this responsibility by implementing the {api-doc}afterglow.effects.html#var-assign[`assign`] function in the {api-doc}afterglow.effects.html#var-IAssigner[`IAssigner`] protocol. It is passed the show, the metronome snapshot which identifies the point in musical time that has been reached, the target being assigned, and the value that any earlier assigners of the same type have decided should be assigned to the target. It performs its magic, using the values established in setting up the effect, and the algorithm that the effect author designed, to come up with the resulting value that it wants assigned to the target, which may or may not be influenced by the previous assignment, and returns that value for Afterglow to either use, or pass on to the next assigner of that type in the effect chain. The best way to understand this is probably to look at examples of effects that ship with Afterglow, starting with simple ones like {api-doc}afterglow.effects.color.html#var-color-effect[`color-effect`], {api-doc}afterglow.effects.dimmer.html#var-dimmer-effect[`dimmer-effect`], and {api-doc}afterglow.effects.movement.html#var-direction-effect[`direction-effect`], then slightly more complex {api-doc}afterglow.effects.fun.html#var-strobe[`strobe`] and {api-doc}afterglow.effects.fun.html#var-sparkle[`sparkle`] effects, and on up to more sophisticated compound effects like {api-doc}afterglow.effects.fun.html#var-color-cycle-chase[`color-cycle-chase`], and the spatially mapped elaborations of it like {api-doc}afterglow.effects.fun.html#var-iris-out-color-cycle-chase[`iris-out-color-cycle-chase`]. Once you can understand how all of those pieces fit together, you will be ready to build your own complex and mesmerizing effects! [[channel-assigners]] === Channel Assigners Channel assigners have a `kind` of `:channel`, and their `target-id` is a tuple of universe ID and channel address, so `[1 234]` would represent an assignment to universe `1`, address `234`. The assignment values they return are either a valid DMX data value (see next paragraph), a <> which will resolve to a valid DMX data value, or `nil`, meaning no assignment should take place. [[dmx-values]] The DMX data value is a number in the range `[0-256)`. In other words, it can take any value from zero up to but not reaching 256. Non-integer values are supported, because the channel might be a <> which uses two bytes to offer more precision in control than a single byte can offer. In that case, the integer portion of the value is sent as the most-significant byte on the main channel, and the fractional portion is converted to a least-significant byte and sent on the fine channel. If the channel does not have a fine channel attached to it, any fractional part of the assigned value is simply discarded. Channels can also be _inverted_, which means the DMX values are reversed from the value being assigned. This is needed to support some fixtures which have inverted dimmers, is established by the presence of an `:inverted-from` entry in the <>, and taken care of by {api-doc}afterglow.effects.channel.html#var-apply-channel-value[`apply-channel-value`], which is invoked by the channel assignment resolver, so channel assigners do not need to worry about this detail, and can always work in terms of non-inverted channel values. (This is important, for example, when implementing highest-takes-precedence rules for a dimmer channel. Bigger numbers will always mean brighter, even if at the last step before sending them to the fixture they are inverted because of the nature of the channel.) [[function-assigners]] === Function Assigners Function assigners have a `kind` of `:function`, and their `target-id` is a tuple of the head or fixture ID and the function keyword, so `[3 :strobe]` would represent an assignment to the fixture or head with ID 3, setting the value of that head's `:strobe` <>. The assignment values they return are either a percentage value, a <> which will resolve to a percentage value, or `nil`, meaning no assignment should take place. When the assignment is resolved, the percentage is translated to an actual DMX value along the range defined in each fixture's function specification. For example, if the function was defined as existing on the range 20-29 for a particular fixture, and the assigned percentage was 50.0, then the assignment for that fixture would send a value of 25 to the function's channel. [[color-assigners]] === Color Assigners Color assigners have a `kind` of `:color`, and their `target-id` is the head or fixture ID; `42` would represent an assignment to the fixture or head with ID 42. The assignment values they return are either a <> object, a <> which will resolve to a color object, or `nil`, meaning no assignment should take place. When the assignment is resolved, Afterglow uses all available color channels in the target head to mix the specified color. It is automatically able to use `:color` intensity channels of type `:red`, `:green`, `:blue`, and `:white`. It will also use any other `:color` channels whose hue has been <> in the fixture definition. If the head or fixture uses a color wheel to make colors, rather than trying to mix colors using channel intensities, Afterglow will find the <> closest to the hue of the color being assigned, and send the function value needed to set the color wheel to that position. The color wheel hue has to be “close enough” to the assigned hue for Afterglow to use it. By default, as long as the hue values are within 60° of each other (which is very lenient), Afterglow will use it. You can adjust this tolerance by setting a different value in the show variable `:color-wheel-hue-tolerance`. The color being assigned must also have a saturation of at least 40% for the color wheel to be considered (this minimum saturation can be adjusted by setting a different value in the show variable `:color-wheel-min-saturation`). [[pan-tilt-assigners]] === Pan/Tilt Assigners Pan/Tilt assigners have a `kind` of `:pan-tilt`, and their `target-id` is the head or fixture ID; `68` would represent an assignment to the fixture or head with ID 68. The assignment values they return are either a `javax.vecmath.Vector2d`, a <> which will resolve to a `Vector2d` object, or `nil`, meaning no assignment should take place. When the assignment is resolved, the vector indicates the pan and tilt angles away from the `z` axis of the <> to aim the fixture or head. Afterglow translates this vector to the appropriate values to send to the fixture's pan and tilt channels to aim it in the specified direction, if possible. Otherwise it gets as close as the fixture allows. If multiple fixtures or heads are assigned the same pan-tilt vector, they will all be aimed in exactly the same direction, regardless of the location and orientation with which they were hung. NOTE: If there is an active Direction or Aim Assigner which affects the same target, it will run later, so its effects will be the ones that matter. [[direction-assigners]] === Direction Assigners Direction assigners have a `kind` of `:direction`, and their `target-id` is the head or fixture ID; `42` would represent an assignment to the the fixture or head with ID 42. The assignment values they return are either a `javax.vecmath.Vector3d`, a <> which will resolve to a `Vector3d` object, or `nil`, meaning no assignment should take place. When the assignment is resolved, the vector indicates the direction in the <> to aim the fixture or head. Afterglow translates this vector to the appropriate values to send to the fixture's pan and tilt channels to aim it in the specified direction, if possible. Otherwise it gets as close as the fixture allows. If multiple fixtures or heads are assigned the same direction vector, they will all be aimed in exactly the same direction, regardless of the location and orientation with which they were hung. NOTE: If there is an active Aim Assigner which affects the same target, it will run later, so its effects will be the ones that matter. [[aim-assigners]] === Aim Assigners Aim assigners have a `kind` of `:aim`, and their `target-id` is the head or fixture ID; `17` would represent an assignment to the fixture or head with ID 17. The assignment values they return are either a `javax.vecmath.Point3d`, a <> which will resolve to a `Point3d` object, or `nil`, meaning no assignment should take place. When the assignment is resolved, the point identifies the precise location in the <> to aim the fixture or head. Afterglow translates this point to the appropriate values to send to the fixture's pan and tilt channels to aim it at that exact spot, if possible. Otherwise it gets as close as the fixture allows. If multiple fixtures or heads are assigned the same aiming point, they will all be aimed at exactly the same spot, regardless of the location and orientation with which they were hung. [[extensions]] == Extensions If you want Afterglow to control something that does not respond to DMX values, you might be able to do so by extending the rendering loop. There is an example of doing just this to control laser shows by communicating with Pangolin's Beyond software in the {api-doc}afterglow.beyond.html[`afterglow.beyond`] namespace, and another example in {api-doc}afterglow.effects.show-variable.html[`afterglow.effects.show-variable`], which creates effects that set show variables when they are run. [[new-assigner-types]] === Introducing New Assigner Types The first thing you need to do is identify the kinds of assigners that your new effect types will need. They will need their own unique `kind` keywords, and a structure for their `target-id` values which lets Afterglow keep track of which assigners are affecting the same value. The Beyond integration uses `:beyond-color` and `:beyond-cue` for `kind` values. `:beyond-color` is global, and thus uses a `target-id` that references the entire Beyond server instance. In contrast, more than one `:beyond-cue` can be active at once, so its `target-id` is composed of both the server ID and the cue coordinates. Afterglow needs to be told how to handle your new kinds of assigners. First, you need to establish the order in which they should be run by calling {api-doc}afterglow.show.html#var-set-extension-resolution-order.21[`show/set-extension-resolution-order!`] with your unique extension key and the list of all your assigner types in the order in which they should be resolved. You need to do this even if you don't care about the order, or have only one new assigner type, in order to get them added to stage 6 of the frame rendering process, as described above. This is done towards the end of the Beyond extension source, if you would like to see a concrete example. Then you need to tell afterglow how to actually resolve one of your assigners. You do this in the same way Afterglow registers its own built-in assigners, by using `defmethod` to add a new implementation of the {api-doc}afterglow.effects.html#var-resolve-assignment[`resolve-assignment`] multimethod, for your new assigner keyword. Again, the end of the Beyond integration provides a concrete example. [[customizing-fades]] === Customizing Fades for your Assigner Types If you want to support smooth fades between different values being returned by your assigners, you will also want to `defmethod` an implementation of the {api-doc}afterglow.effects.html#var-fade-between-assignments[`fade-between-assignments`] multimethod. This is the last thing that the Beyond integration does. TIP: If you do not provide an implementation of `fade-between-assignments` tailored to your specific assigner `kind`, the default implementation is used: it simply selects whichever assigner is on the side of the fade which is currently above 50%. [[frame-data]] === Buffering and Sending Your Frame Data Chances are good that your extension will need to do some sort of setup at the start of a frame before your assigners can be resolved, and then will want to actually do something when the frame is rendered and being sent to the lights. To accomplish these tasks, you register functions with a show: {api-doc}afterglow.show.html#var-add-empty-buffer-fn.21[`add-empty-buffer-fn!`] tells the show to call the supplied function when a frame is about to be rendered, allowing you to set up any buffers your assigners will need, and {api-doc}afterglow.show.html#var-add-send-buffer-fn.21[`add-send-buffer-fn!`] tells the show to call the supplied function when it is time to actually send out the frame. The Beyond integration calls these in its {api-doc}afterglow.beyond.html#var-bind-to-show[`bind-to-show`] function. Having done all these things, it becomes possible to create cues which launch or end Beyond laser cues, and effects which change the color of the laser beam to match (or contrast with) colors being sent to the lights, as well as effects which simply set show variables so that other effects can respond to the fact that they are running. Perhaps looking at these example implementations can help inspire your own extension in a completely new direction! (Links to the namespaces' API documentation are at the <> of this section, and as always, the API docs have `view source` buttons which take you right to the code that makes them work.) ================================================ FILE: doc/modules/ROOT/pages/show_space.adoc ================================================ = Show Space James Elliott In order to be able to create spatial effects, from lighting gradients spread across your grid, to aiming moving heads in a precise and coordinated way with respect to each other or people or objects near them, Afterglow needs to know where everything is, and how it is oriented in space. This means you need to be able to specify these things. When mounting a <>, you specify where it is and where it is facing. When creating a <> or <> cue, you specify a direction for lights to face, or a point for them to aim at. In order to be able to communicate such concepts, Afterglow has a standard frame of reference for the light show. The entire show has an __origin__, the zero point for the three spatial axes, which you decide on before you start patching fixtures, and an __orientation__, which is expressed in terms of the origin. The afterglow show orientation is chosen to make it easy to think in terms of the way effects will look for the audience. As shown in the diagram below, in the standard orientation, the X axis extends directly to the right of the origin. That is to say, X coordinates are zero at the origin, increase as you move to the right, and decrease as you move to the left. The Y axis extends straight up; Y coordinates grow from zero as you move up from the show origin, and decrease as you move down. The Z axis extends directly towards the audience, increasing in that direction from zero at the origin, decreasing as you move towards the back of the show. image::Show-Space.png[Afterglow show axes,800,582] Distance units are in meters, but if you find it easier to measure inches or feet, you can call {api-doc}afterglow.transform.html#var-inches[`afterglow.transform/inches`] and {api-doc}afterglow.transform.html#var-feet[`afterglow.transform/feet`] to convert them to meters for you. To express rotations, the same frame of reference is used. If a light has been hung upside down compared to its standard orientation (which should be documented in the <>), you need to account for that when calling {api-doc}afterglow.show.html#var-patch-fixture.21[`show/patch-fixture`]. Rotations are expressed in terms of the axes as well. For example, if a fixture has been tumbled towards the audience by a quarter rotation, that would be a rotation around the X axis of π/2. (Rotations are expressed in radians, a complete rotation being 2π. Again, if you find it more convenient to work in degrees, you can call {api-doc}afterglow.transform.html#var-degrees[`afterglow.transform/degrees`] to convert them into radians for you.) To figure out which direction of rotation is positive, imagine you are standing looking towards the origin on the axis in question, so its arrowhead is pointing at your nose. From that perspective, a positive rotation is counter-clockwise, and a negative rotation is clockwise, as shown by the purple arc in the figure above. When measuring these distances and angles you don’t need to worry about getting things perfect down to the millimeter, pretty close is good enough, but the closer you can get, the more precisely Afterglow will be able to aim at things and coordinate looks for you. When it comes to picking your origin, it is up to you. Picking the center of your lighting grid makes conceptual sense, although if you want to make it easy to create aiming effects that hit particular spots on the floor, having the Y axis start at floor level is handy. That is what I have found most convenient in setting up shows so far: my X and Z origins are in the center of the lighting rig, and Y is 0 at the floor. ================================================ FILE: doc/modules/ROOT/pages/videos.adoc ================================================ = Videos James Elliott This page collects performance videos that highlight Afterglow in action. If you have any to share, please post them to the https://deep-symmetry.zulipchat.com/#narrow/stream/318697-afterglow[Afterglow stream on Zulip]! Since I have been too busy working on the software to get out and perform with it, I was deeply grateful to https://github.com/dandaka[Vlad Rafeev] for getting this page started by sharing a video of a https://www.facebook.com/deepowerband/[Deepower audiovisual] show he lit using Afterglow in Kaliningrad, in December, 2015. He modestly says, “My first experience with lights, still a lot to accomplish.” And I say, there is a ton left to implement in the software too. But it was fun to see the great video he shared, but it is sadly no longer online. For a more wordy and nerdy introduction, there is a video of my https://youtu.be/mvNN0SMMZDQ[presentation and demonstration] at the June 2016 http://www.meetup.com/Madison-Clojure-Meetup/events/229842513/[Madison Clojure Meetup]. ================================================ FILE: doc/primes.md ================================================ # Playing with Primes in Clojure My friend Andrew recently dicovered the joys of programming, and shared his cool Python code for testing numbers for primality. I wanted to encourage this enthusiasm, and make sure that he learned about functional programming before his mind got too stuck in the ruts of C-style imperative code (which makes up the bulk of examples out there), so I decided to play around with writing some of my own examples for him. I think one of the best languages for exploring functional programming today is probably [Racket](https://racket-lang.org), but I haven't had time to learn that yet myself. The pinnacle in many ways is [Haskell](https://www.haskell.org) but that's not nearly as approachable, and I would be even more lost trying to introduce someone there. But I have had the privilege of using [Clojure](https://clojure.org) for my professional work for the past several years, and find it a lovely, practical modern Lisp with a focus on simplicity and functional programming, and with a great interoperability story for the Java Virtual Machine environment, which is the indutrial-strength platform we use to deliver our products. (It's also been perfect for my open-source projects in areas like [light show control](https://github.com/Deep-Symmetry/afterglow#afterglow) and [DJ performance synchronization](https://github.com/Deep-Symmetry/beat-link-trigger#beat-link-trigger).) So I'm well equipped to guide a tour through finding prime numbers in Clojure! ## Building Blocks Since Clojure is a Lisp, it looks very different than C-like languages (including Python). The first thing to get used to is that pretty much everything is an expression, formed by grouping a list of symbols inside parentheses. The first symbol specifies _what you want to do_ and is generally a function name (or a macro, or a special form, but we won't need to worry about those details in this discussion). Then you follow that with _what you want to do it to_. So for example, to divide 10 by 2, you would write: ```clojure (/ 10 2) ``` And you would see the result, `5`. Not too surprising. A bit more surprising is what happens if you try dividing 10 by 3 (from now on, to save space in these examples, I am going to show what I type at the Clojure REPL prompt, followed by a comment prefixed with `;; => ` that shows the response): ```clojure (/ 10 3) ;; => 10/3 ``` Wait, `10/3`, what witchcraft is this? It didn't give me an answer, or at least not the kind I expected! In fact, Clojure is biased towards retaining as much precision as possible, so when you ask it to perform a division whose result does not have an exact integer representation, it returns a rational value which is exactly equal to what you wanted. You can continue to use that result in further mathematical operations with no loss of precision, or you can tell Clojure you want a floating-point approximation of the result, like you would get in most languages, like so: ```clojure (float (/ 10 3)) ;; => 3.3333333 ``` So, for finding primes, what we want to know is whether a number evenly divides another. The `rem` function helps with that, giving us the remainder: ```clojure (rem 10 2) ;; => 0 (rem 10 3) ;; => 1 ``` We can combine that with the `zero?` predicate (a predicate is a function that returns `true` or `false` given its input) to build up our test for whether one number evenly divides another: ```clojure (zero? (rem 10 3)) false (zero? (rem 10 2)) true ``` ## Building our Own Blocks Great, we get `true` when the second number evenly divides the first, and `false` otherwise. This is useful enough that I want to give it a name, to be able to use it in other expressions. So I will define it as a function, using the `defn` macro: ```clojure (defn divides? "Returns true when the numerator can be evenly divided by the denominator." [numerator denominator] (zero? (rem numerator denominator))) ;; => #'user/divides? ``` There is a little more structure to this than we've encountered so far, but hopefully it's still easy enough to figure out what is going on. We are defining a new function named `divides?`. The string that follows the function name is an optional "doc string", which helps explain how to use the function, both when reading the definition, and also when you are typing at the REPL (this word comes from "Read, Eval, Print, Loop", the core of interactive programming with a Lisp like Clojure). At a REPL prompt you can type `(doc divides?)` and get that explanatory text: ```clojure (doc divides?) ;; => ------------------------- ;; => user/divides? ;; => ([numerator denominator]) ;; => Returns true when the numerator can be evenly divided by the ;; => denominator. ``` Following the doc string is the parameter list, which specifies what the function expects to be given when called, in our case two values which we name `numerator` and `denominator`. And then finally, the last line is the actual body of the function, which uses the `zero?` predicate and `rem` function as we did in our earlier examples. The return value we saw at the REPL simply reported that the function `divides?` had been created in the `user` namespace, which goes a bit far afield from what we are talking about today. With this in place, we can try out our new function. It works just as you'd expect: ```clojure (divides? 10 2) ;; => true (divides? 10 3) ;; => false ``` Incidentally, we can use `doc` on the other functions we've been using up to this point: ```clojure (doc zero?) ;; => ------------------------- ;; => clojure.core/zero? ;; => ([num]) ;; => Returns true if num is zero, else false ``` And now we are ready to build our prime-tester! As in Andrew's example I want to start by verifying that we were given a positive integer. There are two built-in predicates we can use for that, `integer?` and `pos?`. All that remains is to check whether there is any number ranging from two up to the square root of our candidate number that evenly divides it. If not, then we can be sure it is prime. While in imperative languages you do this kind of thing by writing an explicit loop that assigns a variable to hold each value you want to consider, in a functional language you instead filter sequences of values using predicates. So let's start by figuring out how to express the sequence of values we want to check. To test if ten is prime, the range of values we need to test if it is divisible by starts at two, and goes up to three (the largest integer that is less than the square root of ten). There is a built-in function `range` that gives a range of values. If we try it out with the square root of our candidate value, we see it seems _almost_ give us the numbers we want: ```clojure (range (Math/sqrt 10)) ;; => (0 1 2 3 4) ``` We have a couple of extra values at the beginning, because `range` defaults to starting with zero, and although it goes far enough in this case, because it gives you values up to _but not including_ the upper bound you supply, it would not work if we gave it a perfect square as its input. Let's tackle the first problem first: We could use the `drop` function to get rid of the first two values, but if we check the `doc` for `range` we find that there is also another way to call it, which lets us supply the starting value too: ```clojure (doc range) ------------------------- clojure.core/range ;; => ([] [end] [start end] [start end step]) ;; => Returns a lazy seq of nums from start (inclusive) to end ;; => (exclusive), by step, where start defaults to 0, step to 1, and end to ;; => infinity. When step is equal to 0, returns an infinite sequence of ;; => start. When start is equal to end, returns empty list. ``` So `(range 2 (Math/sqrt 10))` gets us almost there; it works great for ten: ```clojure (range 2 (Math/sqrt 10)) ;; => (2 3) ``` But if we try it with 9, which is a perfect square, we don't get the value 3, which is its square root, and which we definitely do need to test as a factor: ```clojure (range 2 (Math/sqrt 10)) ;; => (2) ``` To fix that, we will round the result of our square root operation down to the closest integer less than or equal to it, using the `Math/floor` function, and then add one to that: ```clojure (range 2 (inc (Math/floor (Math/sqrt 9)))) (2 3) ``` That slightly more complex formula also works for ten: ```clojure (range 2 (inc (Math/floor (Math/sqrt 10)))) (2 3) ``` Ok, that gives us the numbers we want to check if ten is divisible by. Ten is prime if it is not divisible by any of those numbers. And the way we express that in Clojure is almost shockingly concise and readable, once you get over all the parentheses. At this point I want to show you the finished `prime?` function, and explain how the final pieces fit together: ```clojure (defn prime? "Returns true when `n` is prime." [n] (and (integer? n) (pos? n) (not-any? (partial divides? n) (range 2 (inc (Math/floor (Math/sqrt n))))))) ``` We already looked at `defn`, the doc string, and argument list. Our `prime?` function takes a single argument `n`, and (as suggested by the question mark at the end of the name) is a predicate, returning `true` or `false`. In the body, we use a new `and` function, which, as its name suggests, returns `true` if all of its arguments are themselves true. In fact, it stops evaluating and returns false as soon as it encounters a false argument, so we don't have to worry about division by zero or other problems, because the first two things we check are that `n` is a positive integer. That last line is where the rubber meets the road. And at first glance it might seem confusing. But notice that the second half, the `range` expression, we have already explored. That returns a sequence of integers ranging from 2 to the square root of `n`. It is used as the second argument of the `not-any?` function. `not-any?` takes a predicate and a collection, and returns `true` if no elements of the collection satisfy the predicate. The collection we gave it is the list of numbers we want to check as potential divisors of our candidate prime number. So we need a predicate that returns `true` if the potential divisor evenly divides `n`. In other words, we want a function that takes a single number, and returns `true` if that number evenly divides `n`, whatever `n` happened to be when `prime?` was called. One of the really powerful things about functional languages is that they make it very easy to create, modify, and pass around functions, and our little bit of code here is a perfect example of that. The `partial` function is an example of a _higher order function_, which means a function that manipulates other functions. You give `partial` the name of a function that you want to work with, and some arguments, and it returns the result of _partially applying_ those arguments to the function. > What? Well, let me be more conrete. We have already defined a function `divides?` that takes two arguments. We want a function that acts just like that, only with the first argument, the numerator, already filled in, because we want a predicate that takes one argument and tests whether that value evenly divides `n`. We can do exactly that: `(partial divides? n)` creates a new function that calls `divides?` with the values `n` and whatever you pass to this new function. So that is exactly what we need as a predicate for `not-any?` to use. Our `prime?` function will return `true` if no integer from 2 to the square root of `n` can evenly divide `n`. And in so few words! The explanation is far bigger than the code itself, even counting the doc strings. Let's try it out! ```clojure (prime? 10) ;; => false (prime? 11) ;; => true (prime? 1001) ;; => false user=> (prime? 1009) ;; => true ``` ## Infinite, Lazy Blocks So that was to show Andrew what his prime tester would look like in Clojure. But this is just where the fun begins! Now that we have a nice `prime?` predicate, we can use it to easily build the list of all prime numbers: ```clojure (def primes "The prime numbers." (filter prime? (range))) ``` The `filter` function takes a predicate and a collection, and returns a new collection that contains only those elements for which the predicate was true. So in this case, we supply all the natural numbers for our range (when you give no arguments to `range`, the lower bound is zero, and there is no upper bound), and filter out anything that isn't prime. > Whoa, James, you're crazy. That can't work. I know I bought a fancy > computer, but it doesn't have enough memory to store _all_ numbers, > and even if it could, even with my fast processor, it would take too > long to figure out which elements in that infinite sequence were > prime! Here's the crazy thing, it _does_ work! And the reason it does is that Clojure supports _lazy sequences_, meaning the values are not produced until you actually ask for them. So we can quite happily define infinite sequences, and only pay for the production of the values we actually want to work with. So yes, if you tried to print out the value of `primes`, your computer would chunk away until it ran out of memory, but we can use the `take` function to look at as many as we want to without that problem. Here are the first ten primes: ```clojure (take 10 primes) ;; => (1 2 3 5 7 11 13 17 19 23) ``` And, actually, this reveals a mistake we made early on. Technically, 1 is not considered a prime number, and including it in this list is going to break some of the fancy things we are about to do, so let's go back and fix this. (I left this change until now, because I wanted the code to exactly parallel Andrew's Python example, but we are going to start diverging a bit.) Here is the revised version of `prime?`: ```clojure (defn prime? "Returns true when `n` is prime." [n] (and (integer? n) (> n 1) (not-any? (partial divides? n) (range 2 (inc (Math/floor (Math/sqrt n))))))) ``` > I will include a complete copy of the final version of all this code > at the end of this article for people who want to examine it as a > whole, or load it into their own REPL and play. Reloading everything with that change in place, we get this more traditional list of the first ten primes: ```clojure (take 10 primes) (2 3 5 7 11 13 17 19 23 29) ``` And we can combine `take` with `drop` to skip to the part of the sequence we're interested in. Here's how we would find out what the thousandth prime is: ```clojure (take 1 (drop 999 primes)) ;; => (7919) ``` Or what about the ten-thousandth? ```clojure (take 1 (drop 9999 primes)) ;; => (104729) ``` But that was starting to make my computer work hard. There was a noticeable delay between when I hit `return` and when I got the answer back. Interestingly, however, if I ask it a second time, I get the answer instantly. That's because the `primes` sequence remembers values that have aleady been calculated, and only has to do work when you ask it to go out beyond what it has already figured out. Let's take a look at exactly how hard it is working, and start exploring some interesting ways we can calculate primes faster. If I quit the Clojure REPL, then reload my functions, I can time how long getting the ten-thousandth prime took using the `time` function. At first I was getting utterly bogus values by trying it directly like this: ```clojure (time (take 1 (drop 9999 primes))) ;; => "Elapsed time: 0.02719 msecs" ``` But then I remembered one of the pitfalls of working with lazy sequences. In the above attempt, we never _did anything_ with the expression, so it stayed lazy, and the prime number sequence never got built. So to force it to really do the work, I added a call to `vec`, which converts the result to a non-lazy vector, thereby forcing evaluation. Armed with that better approach, and starting with a fresh Clojure REPL, I got the following results: ```clojure (time (vec (take 1 (drop 9999 primes)))) ;; => "Elapsed time: 28318.878726 msecs" ;; => [104723] ``` The square brackets around the result show it is a vector rather than a sequence, and you can see it took nearly thirty seconds to come up with the answer. Running it a second time it already knew the primes up to that point, so it went vastly faster: ```clojure (time (vec (take 1 (drop 9999 primes)))) ;; => "Elapsed time: 1.320859 msecs" ;; => [104723] ``` No noticeable delay. Lazy sequences are cool! And we can use them in really powerful ways, as we will now explore. ## Getting Even Smarter About It That was some very compact code that gave us a nice list of prime numbers. But we can do even better! Now that we have this sequence of prime numbers, we can make use of it in our definition of `prime?` itself, because it is actually redundant to try dividing `n` by _every_ number from `2` to `sqrt(n)`, we only need to test the _prime_ numbers in that range. To make this convenient, let's define a couple of new functions. First, a predicate that will tell us whether the prime factor we are considering is small enough that we need to test it: ```clojure (defn sqrt-or-less? "Returns true when `candidate` is less than or equal to the square root of `n`." [n candidate] (<= candidate (Math/sqrt n))) ``` Then, a function that returns the set of prime numbers we need to try dividing our number by, in order to see if it is prime. In other words, all prime numbers from 2 up to the square root of our number. Because this function is going to use our `primes` sequence, but we can't define `primes` until later because it needs to use this function, we have to promise the Clojure compiler that `primes` is a value we will define later on. Then we can write the new function using it: ```clojure (declare primes) (defn potential-prime-factors "Returns the prime numbers from 2 up to the square root of `n`." [n] (take-while (partial sqrt-or-less? n) primes)) ``` This introduces another new function, `take-while`, which is like `take` but instead of knowing in advance how many values we want, we can supply a predicate, and we will get back all the values up to the one for which that predicate is no longer true. The predicate we want is one that is true when the number is small enough to potentially be a prime factor of `n`, so that means it is less than or equal to the square root of `n`. We once again use the `partial` higher-order function to build that predicate, by "pre-filling" in the value of `n` as the first argument of our `sqrt-or-less?` predicate, and then we keep feeding it prime numbers until we reach one that is too big. > I could have done this next bit without adding those two new helper > functions, but that would require using Clojure's "function > literals" to define functions right where I am using them, and that > is more of a detour than makes sense for this introduction. And > sometimes spelling things out and naming them makes for a more > readable solution to my future self anyway. Finally, a redefinition of our `prime?` function, taking advantage of these new helper functions: ```clojure (defn prime? "Returns true if `n` is prime." [n] (and (integer? n) (> n 1) (not-any? (partial divides? n) (potential-prime-factors n)))) ``` It's now even more self-explanatory, thanks to the nicely named helper functions. But more importantly, is it faster? If I start in a fresh Clojure REPL, load the code, and time it, I see... ```clojure (time (vec (take 1 (drop 9999 primes)))) ;; => "Elapsed time: 121.442485 msecs" ;; => [104729] ``` Indeed! A tenth of a second is definitely faster than thirty. Nice. And what a fun exploration this has been. Thanks, Andrew! Even though I kind of knew where I was hoping to end up, I was impressed by just how perfectly lazy sequences fit this problem. I was able to define the prime number sequence using a function that depends on the prime number sequence, and since things are not evaluated until they are needed, that works perfectly, and only does work once, the first time it is needed. > When I first posted these examples, I had misremembered how big you > need to go when testing potential prime factors, and was going all > the way up to half of `n`, rather than to its square root. That > still saved time, taking just over six seconds, but a tenth of a > second is way better. Thanks to my newest coworker Sarah for > reminding me of this important fact. Here is the full code in its final version, as promised: ```clojure (defn divides? "Returns true when the numerator can be evenly divided by the denominator." [numerator denominator] (zero? (rem numerator denominator))) (defn sqrt-or-less? "Returns true when `candidate` is less than or equal to the square root of `n`." [n candidate] (<= candidate (Math/sqrt n))) (declare primes) (defn potential-prime-factors "Returns the prime numbers from 2 up to the square root of `n`." [n] (take-while (partial sqrt-or-less? n) primes)) (defn prime? "Returns true if `n` is prime." [n] (and (integer? n) (> n 1) (not-any? (partial divides? n) (potential-prime-factors n)))) (def primes "The prime numbers." (filter prime? (range))) ``` ================================================ FILE: logs/README.txt ================================================ This directory is where development-mode log files are written, to make it easy to debug problems which happen on background threads. The log files themselves are ignored by git, so when you first check out Afterglow, this directory will be empty (except for this explanation). As you run it in your repl, you will start to collect logs here, and they will hopefully help you figure out why things aren't working, if you run into snags in learning how to use and extend the system. ================================================ FILE: package.json ================================================ { "private": true, "description": "Used to build the documentation site, not the project itself.", "dependencies": {}, "devDependencies": { "@antora/cli": "3.1.2", "@antora/site-generator": "3.1.2", "@antora/lunr-extension": "^1.0.0-alpha.8" }, "scripts": { "local-docs": "npx antora --fetch doc/embedded.yml", "hosted-docs": "npx antora --fetch doc/github-actions.yml" }, "repository": { "type": "git", "url": "git+https://github.com/Deep-Symmetry/afterglow.git" }, "author": { "name": "James Elliott", "email": "james@deepsymmetry.org" }, "bugs": { "url": "https://github.com/Deep-Symmetry/aferglow/issues" }, "homepage": "https://github.com/Deep-Symmetry/afterglow#readme" } ================================================ FILE: project.clj ================================================ (defproject afterglow :lein-v :description "A live-coding environment for light shows, built on the Open Lighting Architecture, using bits of Overtone." :url "https://github.com/Deep-Symmetry/afterglow" :license {:name "Eclipse Public License 2.0" :url "https://www.eclipse.org/legal/epl-2.0/"} :jvm-opts ["-Dapple.awt.UIElement=true"] ; Suppress dock icon and focus stealing when compiling on a Mac. :dependencies [[org.clojure/clojure "1.11.4"] [org.clojure/core.cache "1.1.234"] [org.clojure/core.async "1.6.681" :exclusions [org.clojure/tools.reader]] [org.clojure/data.json "2.5.0"] [org.clojure/data.zip "1.1.0"] [org.clojure/math.numeric-tower "0.1.0"] [org.clojure/tools.cli "1.1.230"] [org.clojure/tools.nrepl "0.2.13"] [org.clojure/tools.reader "1.4.2"] [org.deepsymmetry/beat-link "8.0.0-SNAPSHOT" :exclusions [org.slf4j/slf4j-api]] [org.deepsymmetry/lib-carabiner "1.2.0"] [org.deepsymmetry/wayang "0.1.8"] [java3d/vecmath "1.3.1"] [java3d/j3d-core "1.3.1"] [java3d/j3d-core-utils "1.3.1"] [overtone/at-at "1.3.58"] [overtone/midi-clj "0.5.0"] [overtone/osc-clj "0.9.0"] [uk.co.xfactory-librarians/coremidi4j "1.6"] [amalloy/ring-buffer "1.3.1" :exclusions [org.clojure/tools.reader com.google.protobuf/protobuf-java]] [com.climate/claypoole "1.1.4"] [org.clojars.brunchboy/protobuf "0.8.3"] [ola-clojure "0.1.8" :exclusions [org.clojure/tools.reader]] [selmer "1.12.61" :exclusions [cheshire]] [com.evocomputing/colors "1.0.6"] [environ "1.2.0"] [camel-snake-kebab "0.4.3"] [com.taoensso/timbre "5.2.1"] [com.taoensso/tufte "2.2.0"] [com.fzakaria/slf4j-timbre "0.3.21"] [com.taoensso/tower "3.0.2"] [com.taoensso/truss "1.6.0"] [markdown-clj "1.12.1"] [ring/ring-core "1.12.2"] [clj-time "0.15.2"] [compojure "1.7.1" :exclusions [org.eclipse.jetty/jetty-server ring/ring-core ring/ring-codec]] [ring/ring-defaults "0.5.0"] [ring/ring-session-timeout "0.3.0"] [ring-middleware-format "0.7.5" :exclusions [ring/ring-jetty-adapter cheshire org.clojure/tools.reader org.clojure/java.classpath org.clojure/core.memoize com.fasterxml.jackson.core/jackson-core]] [metosin/ring-http-response "0.9.4"] [prone "2021-04-23"] [buddy "2.0.0"] [instaparse "1.5.0"] [http-kit "2.8.0"]] :repositories {"sonatype-snapshots" "https://oss.sonatype.org/content/repositories/snapshots"} :main afterglow.core :uberjar-name "afterglow.jar" ;; Add project name and version information to jar file manifest :manifest {"Name" ~#(str (clojure.string/replace (:group %) "." "/") "/" (:name %) "/") "Package" ~#(str (:group %) "." (:name %)) "Specification-Title" ~#(:name %) "Specification-Version" ~#(:version %)} :deploy-repositories [["snapshots" :clojars "releases" :clojars]] ;; enable to start the nREPL server when the application launches ;; :env {:repl-port 16002} :profiles {:dev {:dependencies [[ring-mock "0.1.5" :exclusions [ring/ring-codec]] [ring/ring-devel "1.12.2"]] :repl-options {:init-ns afterglow.examples :welcome (println "afterglow loaded.")} :jvm-opts ["-XX:-OmitStackTraceInFastThrow" "-Dapple.awt.UIElement=true"] :env {:dev "true"}} :uberjar {:env {:production "true"} :prep-tasks ["javac" "compile"] :aot :all} :web-docs {:prep-tasks ^:replace []}} :plugins [[lein-codox "0.10.8"] [lein-resource "17.06.1"] [lein-environ "1.2.0"] [lein-shell "0.5.0"] [com.roomkey/lein-v "7.2.0"]] :middleware [lein-v.plugin/middleware] :codox {:output-path "target/codox" :doc-files [] :source-uri "https://github.com/Deep-Symmetry/afterglow/blob/main/{filepath}#L{line}" :metadata {:doc/format :markdown}} :resource {:resource-paths [["target/codox" {:target-path "target/classes/api_doc" ; For embedded use :extra-values {:guide-url "http:/guide/afterglow/"}}] ["target/codox" {:target-path "doc/build/site/api" ; For hosting on the web :extra-values {:guide-url "https://afterglow-guide.deepsymmetry.org/afterglow/"}}]]} ;; Perform the tasks which embed the developer guide and api docs before compilation, ;; so they will be available both in development, and in the distributed archive. :prep-tasks [["shell" "npm" "run" "local-docs" ] "codox" "resource" ["v" "cache" "resources/afterglow" "edn"]] :min-lein-version "2.0.0") ================================================ FILE: resources/afterglow/readme.txt ================================================ This file is here to make sure Git creates the parent directory, which is needed for building the uberjar. ================================================ FILE: resources/docs/docs.md ================================================

### Managing Your Middleware Request middleware functions are located under the `my-app.middleware` namespace. A request logging helper called `log-request` has already been defined for you there. This namespace also defines two vectors for organizing the middleware called `development-middleware` and `production-middleware`. Any middleware that you only wish to run in development mode, such as `log-request`, should be added to the first vector. ### Here are some links to get started 1. [HTML templating](http://www.luminusweb.net/docs/html_templating.md) 2. [Accessing the database](http://www.luminusweb.net/docs/database.md) 3. [Serving static resources](http://www.luminusweb.net/docs/static_resources.md) 4. [Setting response types](http://www.luminusweb.net/docs/responses.md) 5. [Defining routes](http://www.luminusweb.net/docs/routes.md) 6. [Adding middleware](http://www.luminusweb.net/docs/middleware.md) 7. [Sessions and cookies](http://www.luminusweb.net/docs/sessions_cookies.md) 8. [Security](http://www.luminusweb.net/docs/security.md) 9. [Deploying the application](http://www.luminusweb.net/docs/deployment.md) ================================================ FILE: resources/public/css/bootstrap-cyborg.css ================================================ @import url("https://fonts.googleapis.com/css?family=Roboto:400,700"); /*! * bootswatch v3.3.5 * Homepage: http://bootswatch.com * Copyright 2012-2015 Thomas Park * Licensed under MIT * Based on Bootstrap */ /*! * Bootstrap v3.3.5 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ html { font-family: sans-serif; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; } body { margin: 0; } article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { display: block; } audio, canvas, progress, video { display: inline-block; vertical-align: baseline; } audio:not([controls]) { display: none; height: 0; } [hidden], template { display: none; } a { background-color: transparent; } a:active, a:hover { outline: 0; } abbr[title] { border-bottom: 1px dotted; } b, strong { font-weight: bold; } dfn { font-style: italic; } h1 { font-size: 2em; margin: 0.67em 0; } mark { background: #ff0; color: #000; } small { font-size: 80%; } sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } img { border: 0; } svg:not(:root) { overflow: hidden; } figure { margin: 1em 40px; } hr { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; height: 0; } pre { overflow: auto; } code, kbd, pre, samp { font-family: monospace, monospace; font-size: 1em; } button, input, optgroup, select, textarea { color: inherit; font: inherit; margin: 0; } button { overflow: visible; } button, select { text-transform: none; } button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; cursor: pointer; } button[disabled], html input[disabled] { cursor: default; } button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } input { line-height: normal; } input[type="checkbox"], input[type="radio"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; padding: 0; } input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { height: auto; } input[type="search"] { -webkit-appearance: textfield; -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; } input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } legend { border: 0; padding: 0; } textarea { overflow: auto; } optgroup { font-weight: bold; } table { border-collapse: collapse; border-spacing: 0; } td, th { padding: 0; } /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ @media print { *, *:before, *:after { background: transparent !important; color: #000 !important; -webkit-box-shadow: none !important; box-shadow: none !important; text-shadow: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } a[href^="#"]:after, a[href^="javascript:"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } thead { display: table-header-group; } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } .navbar { display: none; } .btn > .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px solid #000; } .table { border-collapse: collapse !important; } .table td, .table th { background-color: #fff !important; } .table-bordered th, .table-bordered td { border: 1px solid #ddd !important; } } @font-face { font-family: 'Glyphicons Halflings'; src: url('../fonts/glyphicons-halflings-regular.eot'); src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); } .glyphicon { position: relative; top: 1px; display: inline-block; font-family: 'Glyphicons Halflings'; font-style: normal; font-weight: normal; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .glyphicon-asterisk:before { content: "\2a"; } .glyphicon-plus:before { content: "\2b"; } .glyphicon-euro:before, .glyphicon-eur:before { content: "\20ac"; } .glyphicon-minus:before { content: "\2212"; } .glyphicon-cloud:before { content: "\2601"; } .glyphicon-envelope:before { content: "\2709"; } .glyphicon-pencil:before { content: "\270f"; } .glyphicon-glass:before { content: "\e001"; } .glyphicon-music:before { content: "\e002"; } .glyphicon-search:before { content: "\e003"; } .glyphicon-heart:before { content: "\e005"; } .glyphicon-star:before { content: "\e006"; } .glyphicon-star-empty:before { content: "\e007"; } .glyphicon-user:before { content: "\e008"; } .glyphicon-film:before { content: "\e009"; } .glyphicon-th-large:before { content: "\e010"; } .glyphicon-th:before { content: "\e011"; } .glyphicon-th-list:before { content: "\e012"; } .glyphicon-ok:before { content: "\e013"; } .glyphicon-remove:before { content: "\e014"; } .glyphicon-zoom-in:before { content: "\e015"; } .glyphicon-zoom-out:before { content: "\e016"; } .glyphicon-off:before { content: "\e017"; } .glyphicon-signal:before { content: "\e018"; } .glyphicon-cog:before { content: "\e019"; } .glyphicon-trash:before { content: "\e020"; } .glyphicon-home:before { content: "\e021"; } .glyphicon-file:before { content: "\e022"; } .glyphicon-time:before { content: "\e023"; } .glyphicon-road:before { content: "\e024"; } .glyphicon-download-alt:before { content: "\e025"; } .glyphicon-download:before { content: "\e026"; } .glyphicon-upload:before { content: "\e027"; } .glyphicon-inbox:before { content: "\e028"; } .glyphicon-play-circle:before { content: "\e029"; } .glyphicon-repeat:before { content: "\e030"; } .glyphicon-refresh:before { content: "\e031"; } .glyphicon-list-alt:before { content: "\e032"; } .glyphicon-lock:before { content: "\e033"; } .glyphicon-flag:before { content: "\e034"; } .glyphicon-headphones:before { content: "\e035"; } .glyphicon-volume-off:before { content: "\e036"; } .glyphicon-volume-down:before { content: "\e037"; } .glyphicon-volume-up:before { content: "\e038"; } .glyphicon-qrcode:before { content: "\e039"; } .glyphicon-barcode:before { content: "\e040"; } .glyphicon-tag:before { content: "\e041"; } .glyphicon-tags:before { content: "\e042"; } .glyphicon-book:before { content: "\e043"; } .glyphicon-bookmark:before { content: "\e044"; } .glyphicon-print:before { content: "\e045"; } .glyphicon-camera:before { content: "\e046"; } .glyphicon-font:before { content: "\e047"; } .glyphicon-bold:before { content: "\e048"; } .glyphicon-italic:before { content: "\e049"; } .glyphicon-text-height:before { content: "\e050"; } .glyphicon-text-width:before { content: "\e051"; } .glyphicon-align-left:before { content: "\e052"; } .glyphicon-align-center:before { content: "\e053"; } .glyphicon-align-right:before { content: "\e054"; } .glyphicon-align-justify:before { content: "\e055"; } .glyphicon-list:before { content: "\e056"; } .glyphicon-indent-left:before { content: "\e057"; } .glyphicon-indent-right:before { content: "\e058"; } .glyphicon-facetime-video:before { content: "\e059"; } .glyphicon-picture:before { content: "\e060"; } .glyphicon-map-marker:before { content: "\e062"; } .glyphicon-adjust:before { content: "\e063"; } .glyphicon-tint:before { content: "\e064"; } .glyphicon-edit:before { content: "\e065"; } .glyphicon-share:before { content: "\e066"; } .glyphicon-check:before { content: "\e067"; } .glyphicon-move:before { content: "\e068"; } .glyphicon-step-backward:before { content: "\e069"; } .glyphicon-fast-backward:before { content: "\e070"; } .glyphicon-backward:before { content: "\e071"; } .glyphicon-play:before { content: "\e072"; } .glyphicon-pause:before { content: "\e073"; } .glyphicon-stop:before { content: "\e074"; } .glyphicon-forward:before { content: "\e075"; } .glyphicon-fast-forward:before { content: "\e076"; } .glyphicon-step-forward:before { content: "\e077"; } .glyphicon-eject:before { content: "\e078"; } .glyphicon-chevron-left:before { content: "\e079"; } .glyphicon-chevron-right:before { content: "\e080"; } .glyphicon-plus-sign:before { content: "\e081"; } .glyphicon-minus-sign:before { content: "\e082"; } .glyphicon-remove-sign:before { content: "\e083"; } .glyphicon-ok-sign:before { content: "\e084"; } .glyphicon-question-sign:before { content: "\e085"; } .glyphicon-info-sign:before { content: "\e086"; } .glyphicon-screenshot:before { content: "\e087"; } .glyphicon-remove-circle:before { content: "\e088"; } .glyphicon-ok-circle:before { content: "\e089"; } .glyphicon-ban-circle:before { content: "\e090"; } .glyphicon-arrow-left:before { content: "\e091"; } .glyphicon-arrow-right:before { content: "\e092"; } .glyphicon-arrow-up:before { content: "\e093"; } .glyphicon-arrow-down:before { content: "\e094"; } .glyphicon-share-alt:before { content: "\e095"; } .glyphicon-resize-full:before { content: "\e096"; } .glyphicon-resize-small:before { content: "\e097"; } .glyphicon-exclamation-sign:before { content: "\e101"; } .glyphicon-gift:before { content: "\e102"; } .glyphicon-leaf:before { content: "\e103"; } .glyphicon-fire:before { content: "\e104"; } .glyphicon-eye-open:before { content: "\e105"; } .glyphicon-eye-close:before { content: "\e106"; } .glyphicon-warning-sign:before { content: "\e107"; } .glyphicon-plane:before { content: "\e108"; } .glyphicon-calendar:before { content: "\e109"; } .glyphicon-random:before { content: "\e110"; } .glyphicon-comment:before { content: "\e111"; } .glyphicon-magnet:before { content: "\e112"; } .glyphicon-chevron-up:before { content: "\e113"; } .glyphicon-chevron-down:before { content: "\e114"; } .glyphicon-retweet:before { content: "\e115"; } .glyphicon-shopping-cart:before { content: "\e116"; } .glyphicon-folder-close:before { content: "\e117"; } .glyphicon-folder-open:before { content: "\e118"; } .glyphicon-resize-vertical:before { content: "\e119"; } .glyphicon-resize-horizontal:before { content: "\e120"; } .glyphicon-hdd:before { content: "\e121"; } .glyphicon-bullhorn:before { content: "\e122"; } .glyphicon-bell:before { content: "\e123"; } .glyphicon-certificate:before { content: "\e124"; } .glyphicon-thumbs-up:before { content: "\e125"; } .glyphicon-thumbs-down:before { content: "\e126"; } .glyphicon-hand-right:before { content: "\e127"; } .glyphicon-hand-left:before { content: "\e128"; } .glyphicon-hand-up:before { content: "\e129"; } .glyphicon-hand-down:before { content: "\e130"; } .glyphicon-circle-arrow-right:before { content: "\e131"; } .glyphicon-circle-arrow-left:before { content: "\e132"; } .glyphicon-circle-arrow-up:before { content: "\e133"; } .glyphicon-circle-arrow-down:before { content: "\e134"; } .glyphicon-globe:before { content: "\e135"; } .glyphicon-wrench:before { content: "\e136"; } .glyphicon-tasks:before { content: "\e137"; } .glyphicon-filter:before { content: "\e138"; } .glyphicon-briefcase:before { content: "\e139"; } .glyphicon-fullscreen:before { content: "\e140"; } .glyphicon-dashboard:before { content: "\e141"; } .glyphicon-paperclip:before { content: "\e142"; } .glyphicon-heart-empty:before { content: "\e143"; } .glyphicon-link:before { content: "\e144"; } .glyphicon-phone:before { content: "\e145"; } .glyphicon-pushpin:before { content: "\e146"; } .glyphicon-usd:before { content: "\e148"; } .glyphicon-gbp:before { content: "\e149"; } .glyphicon-sort:before { content: "\e150"; } .glyphicon-sort-by-alphabet:before { content: "\e151"; } .glyphicon-sort-by-alphabet-alt:before { content: "\e152"; } .glyphicon-sort-by-order:before { content: "\e153"; } .glyphicon-sort-by-order-alt:before { content: "\e154"; } .glyphicon-sort-by-attributes:before { content: "\e155"; } .glyphicon-sort-by-attributes-alt:before { content: "\e156"; } .glyphicon-unchecked:before { content: "\e157"; } .glyphicon-expand:before { content: "\e158"; } .glyphicon-collapse-down:before { content: "\e159"; } .glyphicon-collapse-up:before { content: "\e160"; } .glyphicon-log-in:before { content: "\e161"; } .glyphicon-flash:before { content: "\e162"; } .glyphicon-log-out:before { content: "\e163"; } .glyphicon-new-window:before { content: "\e164"; } .glyphicon-record:before { content: "\e165"; } .glyphicon-save:before { content: "\e166"; } .glyphicon-open:before { content: "\e167"; } .glyphicon-saved:before { content: "\e168"; } .glyphicon-import:before { content: "\e169"; } .glyphicon-export:before { content: "\e170"; } .glyphicon-send:before { content: "\e171"; } .glyphicon-floppy-disk:before { content: "\e172"; } .glyphicon-floppy-saved:before { content: "\e173"; } .glyphicon-floppy-remove:before { content: "\e174"; } .glyphicon-floppy-save:before { content: "\e175"; } .glyphicon-floppy-open:before { content: "\e176"; } .glyphicon-credit-card:before { content: "\e177"; } .glyphicon-transfer:before { content: "\e178"; } .glyphicon-cutlery:before { content: "\e179"; } .glyphicon-header:before { content: "\e180"; } .glyphicon-compressed:before { content: "\e181"; } .glyphicon-earphone:before { content: "\e182"; } .glyphicon-phone-alt:before { content: "\e183"; } .glyphicon-tower:before { content: "\e184"; } .glyphicon-stats:before { content: "\e185"; } .glyphicon-sd-video:before { content: "\e186"; } .glyphicon-hd-video:before { content: "\e187"; } .glyphicon-subtitles:before { content: "\e188"; } .glyphicon-sound-stereo:before { content: "\e189"; } .glyphicon-sound-dolby:before { content: "\e190"; } .glyphicon-sound-5-1:before { content: "\e191"; } .glyphicon-sound-6-1:before { content: "\e192"; } .glyphicon-sound-7-1:before { content: "\e193"; } .glyphicon-copyright-mark:before { content: "\e194"; } .glyphicon-registration-mark:before { content: "\e195"; } .glyphicon-cloud-download:before { content: "\e197"; } .glyphicon-cloud-upload:before { content: "\e198"; } .glyphicon-tree-conifer:before { content: "\e199"; } .glyphicon-tree-deciduous:before { content: "\e200"; } .glyphicon-cd:before { content: "\e201"; } .glyphicon-save-file:before { content: "\e202"; } .glyphicon-open-file:before { content: "\e203"; } .glyphicon-level-up:before { content: "\e204"; } .glyphicon-copy:before { content: "\e205"; } .glyphicon-paste:before { content: "\e206"; } .glyphicon-alert:before { content: "\e209"; } .glyphicon-equalizer:before { content: "\e210"; } .glyphicon-king:before { content: "\e211"; } .glyphicon-queen:before { content: "\e212"; } .glyphicon-pawn:before { content: "\e213"; } .glyphicon-bishop:before { content: "\e214"; } .glyphicon-knight:before { content: "\e215"; } .glyphicon-baby-formula:before { content: "\e216"; } .glyphicon-tent:before { content: "\26fa"; } .glyphicon-blackboard:before { content: "\e218"; } .glyphicon-bed:before { content: "\e219"; } .glyphicon-apple:before { content: "\f8ff"; } .glyphicon-erase:before { content: "\e221"; } .glyphicon-hourglass:before { content: "\231b"; } .glyphicon-lamp:before { content: "\e223"; } .glyphicon-duplicate:before { content: "\e224"; } .glyphicon-piggy-bank:before { content: "\e225"; } .glyphicon-scissors:before { content: "\e226"; } .glyphicon-bitcoin:before { content: "\e227"; } .glyphicon-btc:before { content: "\e227"; } .glyphicon-xbt:before { content: "\e227"; } .glyphicon-yen:before { content: "\00a5"; } .glyphicon-jpy:before { content: "\00a5"; } .glyphicon-ruble:before { content: "\20bd"; } .glyphicon-rub:before { content: "\20bd"; } .glyphicon-scale:before { content: "\e230"; } .glyphicon-ice-lolly:before { content: "\e231"; } .glyphicon-ice-lolly-tasted:before { content: "\e232"; } .glyphicon-education:before { content: "\e233"; } .glyphicon-option-horizontal:before { content: "\e234"; } .glyphicon-option-vertical:before { content: "\e235"; } .glyphicon-menu-hamburger:before { content: "\e236"; } .glyphicon-modal-window:before { content: "\e237"; } .glyphicon-oil:before { content: "\e238"; } .glyphicon-grain:before { content: "\e239"; } .glyphicon-sunglasses:before { content: "\e240"; } .glyphicon-text-size:before { content: "\e241"; } .glyphicon-text-color:before { content: "\e242"; } .glyphicon-text-background:before { content: "\e243"; } .glyphicon-object-align-top:before { content: "\e244"; } .glyphicon-object-align-bottom:before { content: "\e245"; } .glyphicon-object-align-horizontal:before { content: "\e246"; } .glyphicon-object-align-left:before { content: "\e247"; } .glyphicon-object-align-vertical:before { content: "\e248"; } .glyphicon-object-align-right:before { content: "\e249"; } .glyphicon-triangle-right:before { content: "\e250"; } .glyphicon-triangle-left:before { content: "\e251"; } .glyphicon-triangle-bottom:before { content: "\e252"; } .glyphicon-triangle-top:before { content: "\e253"; } .glyphicon-console:before { content: "\e254"; } .glyphicon-superscript:before { content: "\e255"; } .glyphicon-subscript:before { content: "\e256"; } .glyphicon-menu-left:before { content: "\e257"; } .glyphicon-menu-right:before { content: "\e258"; } .glyphicon-menu-down:before { content: "\e259"; } .glyphicon-menu-up:before { content: "\e260"; } * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } html { font-size: 10px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body { font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.42857143; color: #888888; background-color: #060606; } input, button, select, textarea { font-family: inherit; font-size: inherit; line-height: inherit; } a { color: #2a9fd6; text-decoration: none; } a:hover, a:focus { color: #2a9fd6; text-decoration: underline; } a:focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } figure { margin: 0; } img { vertical-align: middle; } .img-responsive, .thumbnail > img, .thumbnail a > img, .carousel-inner > .item > img, .carousel-inner > .item > a > img { display: block; max-width: 100%; height: auto; } .img-rounded { border-radius: 6px; } .img-thumbnail { padding: 4px; line-height: 1.42857143; background-color: #282828; border: 1px solid #282828; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; -o-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; display: inline-block; max-width: 100%; height: auto; } .img-circle { border-radius: 50%; } hr { margin-top: 20px; margin-bottom: 20px; border: 0; border-top: 1px solid #282828; } .sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } .sr-only-focusable:active, .sr-only-focusable:focus { position: static; width: auto; height: auto; margin: 0; overflow: visible; clip: auto; } [role="button"] { cursor: pointer; } h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 500; line-height: 1.1; color: #ffffff; } h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small, h1 .small, h2 .small, h3 .small, h4 .small, h5 .small, h6 .small, .h1 .small, .h2 .small, .h3 .small, .h4 .small, .h5 .small, .h6 .small { font-weight: normal; line-height: 1; color: #888888; } h1, .h1, h2, .h2, h3, .h3 { margin-top: 20px; margin-bottom: 10px; } h1 small, .h1 small, h2 small, .h2 small, h3 small, .h3 small, h1 .small, .h1 .small, h2 .small, .h2 .small, h3 .small, .h3 .small { font-size: 65%; } h4, .h4, h5, .h5, h6, .h6 { margin-top: 10px; margin-bottom: 10px; } h4 small, .h4 small, h5 small, .h5 small, h6 small, .h6 small, h4 .small, .h4 .small, h5 .small, .h5 .small, h6 .small, .h6 .small { font-size: 75%; } h1, .h1 { font-size: 56px; } h2, .h2 { font-size: 45px; } h3, .h3 { font-size: 34px; } h4, .h4 { font-size: 24px; } h5, .h5 { font-size: 20px; } h6, .h6 { font-size: 16px; } p { margin: 0 0 10px; } .lead { margin-bottom: 20px; font-size: 16px; font-weight: 300; line-height: 1.4; } @media (min-width: 768px) { .lead { font-size: 21px; } } small, .small { font-size: 85%; } mark, .mark { background-color: #ff8800; padding: .2em; } .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } .text-justify { text-align: justify; } .text-nowrap { white-space: nowrap; } .text-lowercase { text-transform: lowercase; } .text-uppercase { text-transform: uppercase; } .text-capitalize { text-transform: capitalize; } .text-muted { color: #888888; } .text-primary { color: #2a9fd6; } a.text-primary:hover, a.text-primary:focus { color: #2180ac; } .text-success { color: #ffffff; } a.text-success:hover, a.text-success:focus { color: #e6e6e6; } .text-info { color: #ffffff; } a.text-info:hover, a.text-info:focus { color: #e6e6e6; } .text-warning { color: #ffffff; } a.text-warning:hover, a.text-warning:focus { color: #e6e6e6; } .text-danger { color: #ffffff; } a.text-danger:hover, a.text-danger:focus { color: #e6e6e6; } .bg-primary { color: #fff; background-color: #2a9fd6; } a.bg-primary:hover, a.bg-primary:focus { background-color: #2180ac; } .bg-success { background-color: #77b300; } a.bg-success:hover, a.bg-success:focus { background-color: #558000; } .bg-info { background-color: #9933cc; } a.bg-info:hover, a.bg-info:focus { background-color: #7a29a3; } .bg-warning { background-color: #ff8800; } a.bg-warning:hover, a.bg-warning:focus { background-color: #cc6d00; } .bg-danger { background-color: #cc0000; } a.bg-danger:hover, a.bg-danger:focus { background-color: #990000; } .page-header { padding-bottom: 9px; margin: 40px 0 20px; border-bottom: 1px solid #282828; } ul, ol { margin-top: 0; margin-bottom: 10px; } ul ul, ol ul, ul ol, ol ol { margin-bottom: 0; } .list-unstyled { padding-left: 0; list-style: none; } .list-inline { padding-left: 0; list-style: none; margin-left: -5px; } .list-inline > li { display: inline-block; padding-left: 5px; padding-right: 5px; } dl { margin-top: 0; margin-bottom: 20px; } dt, dd { line-height: 1.42857143; } dt { font-weight: bold; } dd { margin-left: 0; } @media (min-width: 768px) { .dl-horizontal dt { float: left; width: 160px; clear: left; text-align: right; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .dl-horizontal dd { margin-left: 180px; } } abbr[title], abbr[data-original-title] { cursor: help; border-bottom: 1px dotted #888888; } .initialism { font-size: 90%; text-transform: uppercase; } blockquote { padding: 10px 20px; margin: 0 0 20px; font-size: 17.5px; border-left: 5px solid #282828; } blockquote p:last-child, blockquote ul:last-child, blockquote ol:last-child { margin-bottom: 0; } blockquote footer, blockquote small, blockquote .small { display: block; font-size: 80%; line-height: 1.42857143; color: #555555; } blockquote footer:before, blockquote small:before, blockquote .small:before { content: '\2014 \00A0'; } .blockquote-reverse, blockquote.pull-right { padding-right: 15px; padding-left: 0; border-right: 5px solid #282828; border-left: 0; text-align: right; } .blockquote-reverse footer:before, blockquote.pull-right footer:before, .blockquote-reverse small:before, blockquote.pull-right small:before, .blockquote-reverse .small:before, blockquote.pull-right .small:before { content: ''; } .blockquote-reverse footer:after, blockquote.pull-right footer:after, .blockquote-reverse small:after, blockquote.pull-right small:after, .blockquote-reverse .small:after, blockquote.pull-right .small:after { content: '\00A0 \2014'; } address { margin-bottom: 20px; font-style: normal; line-height: 1.42857143; } code, kbd, pre, samp { font-family: Menlo, Monaco, Consolas, "Courier New", monospace; } code { padding: 2px 4px; font-size: 90%; color: #c7254e; background-color: #f9f2f4; border-radius: 4px; } kbd { padding: 2px 4px; font-size: 90%; color: #ffffff; background-color: #333333; border-radius: 3px; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } kbd kbd { padding: 0; font-size: 100%; font-weight: bold; -webkit-box-shadow: none; box-shadow: none; } pre { display: block; padding: 9.5px; margin: 0 0 10px; font-size: 13px; line-height: 1.42857143; word-break: break-all; word-wrap: break-word; color: #282828; background-color: #f5f5f5; border: 1px solid #cccccc; border-radius: 4px; } pre code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border-radius: 0; } .pre-scrollable { max-height: 340px; overflow-y: scroll; } .container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px; } @media (min-width: 768px) { .container { width: 750px; } } @media (min-width: 992px) { .container { width: 970px; } } @media (min-width: 1200px) { .container { width: 1170px; } } .container-fluid { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px; } .row { margin-left: -15px; margin-right: -15px; } .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { position: relative; min-height: 1px; padding-left: 15px; padding-right: 15px; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { float: left; } .col-xs-12 { width: 100%; } .col-xs-11 { width: 91.66666667%; } .col-xs-10 { width: 83.33333333%; } .col-xs-9 { width: 75%; } .col-xs-8 { width: 66.66666667%; } .col-xs-7 { width: 58.33333333%; } .col-xs-6 { width: 50%; } .col-xs-5 { width: 41.66666667%; } .col-xs-4 { width: 33.33333333%; } .col-xs-3 { width: 25%; } .col-xs-2 { width: 16.66666667%; } .col-xs-1 { width: 8.33333333%; } .col-xs-pull-12 { right: 100%; } .col-xs-pull-11 { right: 91.66666667%; } .col-xs-pull-10 { right: 83.33333333%; } .col-xs-pull-9 { right: 75%; } .col-xs-pull-8 { right: 66.66666667%; } .col-xs-pull-7 { right: 58.33333333%; } .col-xs-pull-6 { right: 50%; } .col-xs-pull-5 { right: 41.66666667%; } .col-xs-pull-4 { right: 33.33333333%; } .col-xs-pull-3 { right: 25%; } .col-xs-pull-2 { right: 16.66666667%; } .col-xs-pull-1 { right: 8.33333333%; } .col-xs-pull-0 { right: auto; } .col-xs-push-12 { left: 100%; } .col-xs-push-11 { left: 91.66666667%; } .col-xs-push-10 { left: 83.33333333%; } .col-xs-push-9 { left: 75%; } .col-xs-push-8 { left: 66.66666667%; } .col-xs-push-7 { left: 58.33333333%; } .col-xs-push-6 { left: 50%; } .col-xs-push-5 { left: 41.66666667%; } .col-xs-push-4 { left: 33.33333333%; } .col-xs-push-3 { left: 25%; } .col-xs-push-2 { left: 16.66666667%; } .col-xs-push-1 { left: 8.33333333%; } .col-xs-push-0 { left: auto; } .col-xs-offset-12 { margin-left: 100%; } .col-xs-offset-11 { margin-left: 91.66666667%; } .col-xs-offset-10 { margin-left: 83.33333333%; } .col-xs-offset-9 { margin-left: 75%; } .col-xs-offset-8 { margin-left: 66.66666667%; } .col-xs-offset-7 { margin-left: 58.33333333%; } .col-xs-offset-6 { margin-left: 50%; } .col-xs-offset-5 { margin-left: 41.66666667%; } .col-xs-offset-4 { margin-left: 33.33333333%; } .col-xs-offset-3 { margin-left: 25%; } .col-xs-offset-2 { margin-left: 16.66666667%; } .col-xs-offset-1 { margin-left: 8.33333333%; } .col-xs-offset-0 { margin-left: 0%; } @media (min-width: 768px) { .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { float: left; } .col-sm-12 { width: 100%; } .col-sm-11 { width: 91.66666667%; } .col-sm-10 { width: 83.33333333%; } .col-sm-9 { width: 75%; } .col-sm-8 { width: 66.66666667%; } .col-sm-7 { width: 58.33333333%; } .col-sm-6 { width: 50%; } .col-sm-5 { width: 41.66666667%; } .col-sm-4 { width: 33.33333333%; } .col-sm-3 { width: 25%; } .col-sm-2 { width: 16.66666667%; } .col-sm-1 { width: 8.33333333%; } .col-sm-pull-12 { right: 100%; } .col-sm-pull-11 { right: 91.66666667%; } .col-sm-pull-10 { right: 83.33333333%; } .col-sm-pull-9 { right: 75%; } .col-sm-pull-8 { right: 66.66666667%; } .col-sm-pull-7 { right: 58.33333333%; } .col-sm-pull-6 { right: 50%; } .col-sm-pull-5 { right: 41.66666667%; } .col-sm-pull-4 { right: 33.33333333%; } .col-sm-pull-3 { right: 25%; } .col-sm-pull-2 { right: 16.66666667%; } .col-sm-pull-1 { right: 8.33333333%; } .col-sm-pull-0 { right: auto; } .col-sm-push-12 { left: 100%; } .col-sm-push-11 { left: 91.66666667%; } .col-sm-push-10 { left: 83.33333333%; } .col-sm-push-9 { left: 75%; } .col-sm-push-8 { left: 66.66666667%; } .col-sm-push-7 { left: 58.33333333%; } .col-sm-push-6 { left: 50%; } .col-sm-push-5 { left: 41.66666667%; } .col-sm-push-4 { left: 33.33333333%; } .col-sm-push-3 { left: 25%; } .col-sm-push-2 { left: 16.66666667%; } .col-sm-push-1 { left: 8.33333333%; } .col-sm-push-0 { left: auto; } .col-sm-offset-12 { margin-left: 100%; } .col-sm-offset-11 { margin-left: 91.66666667%; } .col-sm-offset-10 { margin-left: 83.33333333%; } .col-sm-offset-9 { margin-left: 75%; } .col-sm-offset-8 { margin-left: 66.66666667%; } .col-sm-offset-7 { margin-left: 58.33333333%; } .col-sm-offset-6 { margin-left: 50%; } .col-sm-offset-5 { margin-left: 41.66666667%; } .col-sm-offset-4 { margin-left: 33.33333333%; } .col-sm-offset-3 { margin-left: 25%; } .col-sm-offset-2 { margin-left: 16.66666667%; } .col-sm-offset-1 { margin-left: 8.33333333%; } .col-sm-offset-0 { margin-left: 0%; } } @media (min-width: 992px) { .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { float: left; } .col-md-12 { width: 100%; } .col-md-11 { width: 91.66666667%; } .col-md-10 { width: 83.33333333%; } .col-md-9 { width: 75%; } .col-md-8 { width: 66.66666667%; } .col-md-7 { width: 58.33333333%; } .col-md-6 { width: 50%; } .col-md-5 { width: 41.66666667%; } .col-md-4 { width: 33.33333333%; } .col-md-3 { width: 25%; } .col-md-2 { width: 16.66666667%; } .col-md-1 { width: 8.33333333%; } .col-md-pull-12 { right: 100%; } .col-md-pull-11 { right: 91.66666667%; } .col-md-pull-10 { right: 83.33333333%; } .col-md-pull-9 { right: 75%; } .col-md-pull-8 { right: 66.66666667%; } .col-md-pull-7 { right: 58.33333333%; } .col-md-pull-6 { right: 50%; } .col-md-pull-5 { right: 41.66666667%; } .col-md-pull-4 { right: 33.33333333%; } .col-md-pull-3 { right: 25%; } .col-md-pull-2 { right: 16.66666667%; } .col-md-pull-1 { right: 8.33333333%; } .col-md-pull-0 { right: auto; } .col-md-push-12 { left: 100%; } .col-md-push-11 { left: 91.66666667%; } .col-md-push-10 { left: 83.33333333%; } .col-md-push-9 { left: 75%; } .col-md-push-8 { left: 66.66666667%; } .col-md-push-7 { left: 58.33333333%; } .col-md-push-6 { left: 50%; } .col-md-push-5 { left: 41.66666667%; } .col-md-push-4 { left: 33.33333333%; } .col-md-push-3 { left: 25%; } .col-md-push-2 { left: 16.66666667%; } .col-md-push-1 { left: 8.33333333%; } .col-md-push-0 { left: auto; } .col-md-offset-12 { margin-left: 100%; } .col-md-offset-11 { margin-left: 91.66666667%; } .col-md-offset-10 { margin-left: 83.33333333%; } .col-md-offset-9 { margin-left: 75%; } .col-md-offset-8 { margin-left: 66.66666667%; } .col-md-offset-7 { margin-left: 58.33333333%; } .col-md-offset-6 { margin-left: 50%; } .col-md-offset-5 { margin-left: 41.66666667%; } .col-md-offset-4 { margin-left: 33.33333333%; } .col-md-offset-3 { margin-left: 25%; } .col-md-offset-2 { margin-left: 16.66666667%; } .col-md-offset-1 { margin-left: 8.33333333%; } .col-md-offset-0 { margin-left: 0%; } } @media (min-width: 1200px) { .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { float: left; } .col-lg-12 { width: 100%; } .col-lg-11 { width: 91.66666667%; } .col-lg-10 { width: 83.33333333%; } .col-lg-9 { width: 75%; } .col-lg-8 { width: 66.66666667%; } .col-lg-7 { width: 58.33333333%; } .col-lg-6 { width: 50%; } .col-lg-5 { width: 41.66666667%; } .col-lg-4 { width: 33.33333333%; } .col-lg-3 { width: 25%; } .col-lg-2 { width: 16.66666667%; } .col-lg-1 { width: 8.33333333%; } .col-lg-pull-12 { right: 100%; } .col-lg-pull-11 { right: 91.66666667%; } .col-lg-pull-10 { right: 83.33333333%; } .col-lg-pull-9 { right: 75%; } .col-lg-pull-8 { right: 66.66666667%; } .col-lg-pull-7 { right: 58.33333333%; } .col-lg-pull-6 { right: 50%; } .col-lg-pull-5 { right: 41.66666667%; } .col-lg-pull-4 { right: 33.33333333%; } .col-lg-pull-3 { right: 25%; } .col-lg-pull-2 { right: 16.66666667%; } .col-lg-pull-1 { right: 8.33333333%; } .col-lg-pull-0 { right: auto; } .col-lg-push-12 { left: 100%; } .col-lg-push-11 { left: 91.66666667%; } .col-lg-push-10 { left: 83.33333333%; } .col-lg-push-9 { left: 75%; } .col-lg-push-8 { left: 66.66666667%; } .col-lg-push-7 { left: 58.33333333%; } .col-lg-push-6 { left: 50%; } .col-lg-push-5 { left: 41.66666667%; } .col-lg-push-4 { left: 33.33333333%; } .col-lg-push-3 { left: 25%; } .col-lg-push-2 { left: 16.66666667%; } .col-lg-push-1 { left: 8.33333333%; } .col-lg-push-0 { left: auto; } .col-lg-offset-12 { margin-left: 100%; } .col-lg-offset-11 { margin-left: 91.66666667%; } .col-lg-offset-10 { margin-left: 83.33333333%; } .col-lg-offset-9 { margin-left: 75%; } .col-lg-offset-8 { margin-left: 66.66666667%; } .col-lg-offset-7 { margin-left: 58.33333333%; } .col-lg-offset-6 { margin-left: 50%; } .col-lg-offset-5 { margin-left: 41.66666667%; } .col-lg-offset-4 { margin-left: 33.33333333%; } .col-lg-offset-3 { margin-left: 25%; } .col-lg-offset-2 { margin-left: 16.66666667%; } .col-lg-offset-1 { margin-left: 8.33333333%; } .col-lg-offset-0 { margin-left: 0%; } } table { background-color: #181818; } caption { padding-top: 8px; padding-bottom: 8px; color: #888888; text-align: left; } th { text-align: left; } .table { width: 100%; max-width: 100%; margin-bottom: 20px; } .table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td { padding: 8px; line-height: 1.42857143; vertical-align: top; border-top: 1px solid #282828; } .table > thead > tr > th { vertical-align: bottom; border-bottom: 2px solid #282828; } .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > th, .table > thead:first-child > tr:first-child > th, .table > caption + thead > tr:first-child > td, .table > colgroup + thead > tr:first-child > td, .table > thead:first-child > tr:first-child > td { border-top: 0; } .table > tbody + tbody { border-top: 2px solid #282828; } .table .table { background-color: #060606; } .table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, .table-condensed > tfoot > tr > th, .table-condensed > thead > tr > td, .table-condensed > tbody > tr > td, .table-condensed > tfoot > tr > td { padding: 5px; } .table-bordered { border: 1px solid #282828; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { border: 1px solid #282828; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { border-bottom-width: 2px; } .table-striped > tbody > tr:nth-of-type(odd) { background-color: #080808; } .table-hover > tbody > tr:hover { background-color: #282828; } table col[class*="col-"] { position: static; float: none; display: table-column; } table td[class*="col-"], table th[class*="col-"] { position: static; float: none; display: table-cell; } .table > thead > tr > td.active, .table > tbody > tr > td.active, .table > tfoot > tr > td.active, .table > thead > tr > th.active, .table > tbody > tr > th.active, .table > tfoot > tr > th.active, .table > thead > tr.active > td, .table > tbody > tr.active > td, .table > tfoot > tr.active > td, .table > thead > tr.active > th, .table > tbody > tr.active > th, .table > tfoot > tr.active > th { background-color: #282828; } .table-hover > tbody > tr > td.active:hover, .table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th { background-color: #1b1b1b; } .table > thead > tr > td.success, .table > tbody > tr > td.success, .table > tfoot > tr > td.success, .table > thead > tr > th.success, .table > tbody > tr > th.success, .table > tfoot > tr > th.success, .table > thead > tr.success > td, .table > tbody > tr.success > td, .table > tfoot > tr.success > td, .table > thead > tr.success > th, .table > tbody > tr.success > th, .table > tfoot > tr.success > th { background-color: #77b300; } .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th { background-color: #669a00; } .table > thead > tr > td.info, .table > tbody > tr > td.info, .table > tfoot > tr > td.info, .table > thead > tr > th.info, .table > tbody > tr > th.info, .table > tfoot > tr > th.info, .table > thead > tr.info > td, .table > tbody > tr.info > td, .table > tfoot > tr.info > td, .table > thead > tr.info > th, .table > tbody > tr.info > th, .table > tfoot > tr.info > th { background-color: #9933cc; } .table-hover > tbody > tr > td.info:hover, .table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th { background-color: #8a2eb8; } .table > thead > tr > td.warning, .table > tbody > tr > td.warning, .table > tfoot > tr > td.warning, .table > thead > tr > th.warning, .table > tbody > tr > th.warning, .table > tfoot > tr > th.warning, .table > thead > tr.warning > td, .table > tbody > tr.warning > td, .table > tfoot > tr.warning > td, .table > thead > tr.warning > th, .table > tbody > tr.warning > th, .table > tfoot > tr.warning > th { background-color: #ff8800; } .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th { background-color: #e67a00; } .table > thead > tr > td.danger, .table > tbody > tr > td.danger, .table > tfoot > tr > td.danger, .table > thead > tr > th.danger, .table > tbody > tr > th.danger, .table > tfoot > tr > th.danger, .table > thead > tr.danger > td, .table > tbody > tr.danger > td, .table > tfoot > tr.danger > td, .table > thead > tr.danger > th, .table > tbody > tr.danger > th, .table > tfoot > tr.danger > th { background-color: #cc0000; } .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th { background-color: #b30000; } .table-responsive { overflow-x: auto; min-height: 0.01%; } @media screen and (max-width: 767px) { .table-responsive { width: 100%; margin-bottom: 15px; overflow-y: hidden; -ms-overflow-style: -ms-autohiding-scrollbar; border: 1px solid #282828; } .table-responsive > .table { margin-bottom: 0; } .table-responsive > .table > thead > tr > th, .table-responsive > .table > tbody > tr > th, .table-responsive > .table > tfoot > tr > th, .table-responsive > .table > thead > tr > td, .table-responsive > .table > tbody > tr > td, .table-responsive > .table > tfoot > tr > td { white-space: nowrap; } .table-responsive > .table-bordered { border: 0; } .table-responsive > .table-bordered > thead > tr > th:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .table-responsive > .table-bordered > thead > tr > th:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .table-responsive > .table-bordered > tbody > tr:last-child > th, .table-responsive > .table-bordered > tfoot > tr:last-child > th, .table-responsive > .table-bordered > tbody > tr:last-child > td, .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } } fieldset { padding: 0; margin: 0; border: 0; min-width: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: 20px; font-size: 21px; line-height: inherit; color: #888888; border: 0; border-bottom: 1px solid #282828; } label { display: inline-block; max-width: 100%; margin-bottom: 5px; font-weight: bold; } input[type="search"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px \9; line-height: normal; } input[type="file"] { display: block; } input[type="range"] { display: block; width: 100%; } select[multiple], select[size] { height: auto; } input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } output { display: block; padding-top: 9px; font-size: 14px; line-height: 1.42857143; color: #888888; } .form-control { display: block; width: 100%; height: 38px; padding: 8px 12px; font-size: 14px; line-height: 1.42857143; color: #888888; background-color: #ffffff; background-image: none; border: 1px solid #282828; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } .form-control:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); } .form-control::-moz-placeholder { color: #888888; opacity: 1; } .form-control:-ms-input-placeholder { color: #888888; } .form-control::-webkit-input-placeholder { color: #888888; } .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { background-color: #adafae; opacity: 1; } .form-control[disabled], fieldset[disabled] .form-control { cursor: not-allowed; } textarea.form-control { height: auto; } input[type="search"] { -webkit-appearance: none; } @media screen and (-webkit-min-device-pixel-ratio: 0) { input[type="date"].form-control, input[type="time"].form-control, input[type="datetime-local"].form-control, input[type="month"].form-control { line-height: 38px; } input[type="date"].input-sm, input[type="time"].input-sm, input[type="datetime-local"].input-sm, input[type="month"].input-sm, .input-group-sm input[type="date"], .input-group-sm input[type="time"], .input-group-sm input[type="datetime-local"], .input-group-sm input[type="month"] { line-height: 30px; } input[type="date"].input-lg, input[type="time"].input-lg, input[type="datetime-local"].input-lg, input[type="month"].input-lg, .input-group-lg input[type="date"], .input-group-lg input[type="time"], .input-group-lg input[type="datetime-local"], .input-group-lg input[type="month"] { line-height: 54px; } } .form-group { margin-bottom: 15px; } .radio, .checkbox { position: relative; display: block; margin-top: 10px; margin-bottom: 10px; } .radio label, .checkbox label { min-height: 20px; padding-left: 20px; margin-bottom: 0; font-weight: normal; cursor: pointer; } .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { position: absolute; margin-left: -20px; margin-top: 4px \9; } .radio + .radio, .checkbox + .checkbox { margin-top: -5px; } .radio-inline, .checkbox-inline { position: relative; display: inline-block; padding-left: 20px; margin-bottom: 0; vertical-align: middle; font-weight: normal; cursor: pointer; } .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { margin-top: 0; margin-left: 10px; } input[type="radio"][disabled], input[type="checkbox"][disabled], input[type="radio"].disabled, input[type="checkbox"].disabled, fieldset[disabled] input[type="radio"], fieldset[disabled] input[type="checkbox"] { cursor: not-allowed; } .radio-inline.disabled, .checkbox-inline.disabled, fieldset[disabled] .radio-inline, fieldset[disabled] .checkbox-inline { cursor: not-allowed; } .radio.disabled label, .checkbox.disabled label, fieldset[disabled] .radio label, fieldset[disabled] .checkbox label { cursor: not-allowed; } .form-control-static { padding-top: 9px; padding-bottom: 9px; margin-bottom: 0; min-height: 34px; } .form-control-static.input-lg, .form-control-static.input-sm { padding-left: 0; padding-right: 0; } .input-sm { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-sm { height: 30px; line-height: 30px; } textarea.input-sm, select[multiple].input-sm { height: auto; } .form-group-sm .form-control { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .form-group-sm select.form-control { height: 30px; line-height: 30px; } .form-group-sm textarea.form-control, .form-group-sm select[multiple].form-control { height: auto; } .form-group-sm .form-control-static { height: 30px; min-height: 32px; padding: 6px 10px; font-size: 12px; line-height: 1.5; } .input-lg { height: 54px; padding: 14px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } select.input-lg { height: 54px; line-height: 54px; } textarea.input-lg, select[multiple].input-lg { height: auto; } .form-group-lg .form-control { height: 54px; padding: 14px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } .form-group-lg select.form-control { height: 54px; line-height: 54px; } .form-group-lg textarea.form-control, .form-group-lg select[multiple].form-control { height: auto; } .form-group-lg .form-control-static { height: 54px; min-height: 38px; padding: 15px 16px; font-size: 18px; line-height: 1.3333333; } .has-feedback { position: relative; } .has-feedback .form-control { padding-right: 47.5px; } .form-control-feedback { position: absolute; top: 0; right: 0; z-index: 2; display: block; width: 38px; height: 38px; line-height: 38px; text-align: center; pointer-events: none; } .input-lg + .form-control-feedback, .input-group-lg + .form-control-feedback, .form-group-lg .form-control + .form-control-feedback { width: 54px; height: 54px; line-height: 54px; } .input-sm + .form-control-feedback, .input-group-sm + .form-control-feedback, .form-group-sm .form-control + .form-control-feedback { width: 30px; height: 30px; line-height: 30px; } .has-success .help-block, .has-success .control-label, .has-success .radio, .has-success .checkbox, .has-success .radio-inline, .has-success .checkbox-inline, .has-success.radio label, .has-success.checkbox label, .has-success.radio-inline label, .has-success.checkbox-inline label { color: #ffffff; } .has-success .form-control { border-color: #ffffff; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-success .form-control:focus { border-color: #e6e6e6; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; } .has-success .input-group-addon { color: #ffffff; border-color: #ffffff; background-color: #77b300; } .has-success .form-control-feedback { color: #ffffff; } .has-warning .help-block, .has-warning .control-label, .has-warning .radio, .has-warning .checkbox, .has-warning .radio-inline, .has-warning .checkbox-inline, .has-warning.radio label, .has-warning.checkbox label, .has-warning.radio-inline label, .has-warning.checkbox-inline label { color: #ffffff; } .has-warning .form-control { border-color: #ffffff; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-warning .form-control:focus { border-color: #e6e6e6; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; } .has-warning .input-group-addon { color: #ffffff; border-color: #ffffff; background-color: #ff8800; } .has-warning .form-control-feedback { color: #ffffff; } .has-error .help-block, .has-error .control-label, .has-error .radio, .has-error .checkbox, .has-error .radio-inline, .has-error .checkbox-inline, .has-error.radio label, .has-error.checkbox label, .has-error.radio-inline label, .has-error.checkbox-inline label { color: #ffffff; } .has-error .form-control { border-color: #ffffff; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-error .form-control:focus { border-color: #e6e6e6; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; } .has-error .input-group-addon { color: #ffffff; border-color: #ffffff; background-color: #cc0000; } .has-error .form-control-feedback { color: #ffffff; } .has-feedback label ~ .form-control-feedback { top: 25px; } .has-feedback label.sr-only ~ .form-control-feedback { top: 0; } .help-block { display: block; margin-top: 5px; margin-bottom: 10px; color: #c8c8c8; } @media (min-width: 768px) { .form-inline .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .form-inline .form-control { display: inline-block; width: auto; vertical-align: middle; } .form-inline .form-control-static { display: inline-block; } .form-inline .input-group { display: inline-table; vertical-align: middle; } .form-inline .input-group .input-group-addon, .form-inline .input-group .input-group-btn, .form-inline .input-group .form-control { width: auto; } .form-inline .input-group > .form-control { width: 100%; } .form-inline .control-label { margin-bottom: 0; vertical-align: middle; } .form-inline .radio, .form-inline .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .form-inline .radio label, .form-inline .checkbox label { padding-left: 0; } .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .form-inline .has-feedback .form-control-feedback { top: 0; } } .form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline { margin-top: 0; margin-bottom: 0; padding-top: 9px; } .form-horizontal .radio, .form-horizontal .checkbox { min-height: 29px; } .form-horizontal .form-group { margin-left: -15px; margin-right: -15px; } @media (min-width: 768px) { .form-horizontal .control-label { text-align: right; margin-bottom: 0; padding-top: 9px; } } .form-horizontal .has-feedback .form-control-feedback { right: 15px; } @media (min-width: 768px) { .form-horizontal .form-group-lg .control-label { padding-top: 19.6666662px; font-size: 18px; } } @media (min-width: 768px) { .form-horizontal .form-group-sm .control-label { padding-top: 6px; font-size: 12px; } } .btn { display: inline-block; margin-bottom: 0; font-weight: normal; text-align: center; vertical-align: middle; -ms-touch-action: manipulation; touch-action: manipulation; cursor: pointer; background-image: none; border: 1px solid transparent; white-space: nowrap; padding: 8px 12px; font-size: 14px; line-height: 1.42857143; border-radius: 4px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .btn:focus, .btn:active:focus, .btn.active:focus, .btn.focus, .btn:active.focus, .btn.active.focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn:hover, .btn:focus, .btn.focus { color: #ffffff; text-decoration: none; } .btn:active, .btn.active { outline: 0; background-image: none; -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn.disabled, .btn[disabled], fieldset[disabled] .btn { cursor: not-allowed; opacity: 0.65; filter: alpha(opacity=65); -webkit-box-shadow: none; box-shadow: none; } a.btn.disabled, fieldset[disabled] a.btn { pointer-events: none; } .btn-default { color: #ffffff; background-color: #424242; border-color: #424242; } .btn-default:focus, .btn-default.focus { color: #ffffff; background-color: #282828; border-color: #020202; } .btn-default:hover { color: #ffffff; background-color: #282828; border-color: #232323; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { color: #ffffff; background-color: #282828; border-color: #232323; } .btn-default:active:hover, .btn-default.active:hover, .open > .dropdown-toggle.btn-default:hover, .btn-default:active:focus, .btn-default.active:focus, .open > .dropdown-toggle.btn-default:focus, .btn-default:active.focus, .btn-default.active.focus, .open > .dropdown-toggle.btn-default.focus { color: #ffffff; background-color: #161616; border-color: #020202; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { background-image: none; } .btn-default.disabled, .btn-default[disabled], fieldset[disabled] .btn-default, .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus, .btn-default.disabled:active, .btn-default[disabled]:active, fieldset[disabled] .btn-default:active, .btn-default.disabled.active, .btn-default[disabled].active, fieldset[disabled] .btn-default.active { background-color: #424242; border-color: #424242; } .btn-default .badge { color: #424242; background-color: #ffffff; } .btn-primary { color: #ffffff; background-color: #2a9fd6; border-color: #2a9fd6; } .btn-primary:focus, .btn-primary.focus { color: #ffffff; background-color: #2180ac; border-color: #15506c; } .btn-primary:hover { color: #ffffff; background-color: #2180ac; border-color: #1f79a3; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { color: #ffffff; background-color: #2180ac; border-color: #1f79a3; } .btn-primary:active:hover, .btn-primary.active:hover, .open > .dropdown-toggle.btn-primary:hover, .btn-primary:active:focus, .btn-primary.active:focus, .open > .dropdown-toggle.btn-primary:focus, .btn-primary:active.focus, .btn-primary.active.focus, .open > .dropdown-toggle.btn-primary.focus { color: #ffffff; background-color: #1b698e; border-color: #15506c; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { background-image: none; } .btn-primary.disabled, .btn-primary[disabled], fieldset[disabled] .btn-primary, .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled.focus, .btn-primary[disabled].focus, fieldset[disabled] .btn-primary.focus, .btn-primary.disabled:active, .btn-primary[disabled]:active, fieldset[disabled] .btn-primary:active, .btn-primary.disabled.active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary.active { background-color: #2a9fd6; border-color: #2a9fd6; } .btn-primary .badge { color: #2a9fd6; background-color: #ffffff; } .btn-success { color: #ffffff; background-color: #77b300; border-color: #77b300; } .btn-success:focus, .btn-success.focus { color: #ffffff; background-color: #558000; border-color: #223300; } .btn-success:hover { color: #ffffff; background-color: #558000; border-color: #4e7600; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { color: #ffffff; background-color: #558000; border-color: #4e7600; } .btn-success:active:hover, .btn-success.active:hover, .open > .dropdown-toggle.btn-success:hover, .btn-success:active:focus, .btn-success.active:focus, .open > .dropdown-toggle.btn-success:focus, .btn-success:active.focus, .btn-success.active.focus, .open > .dropdown-toggle.btn-success.focus { color: #ffffff; background-color: #3d5c00; border-color: #223300; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { background-image: none; } .btn-success.disabled, .btn-success[disabled], fieldset[disabled] .btn-success, .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled.focus, .btn-success[disabled].focus, fieldset[disabled] .btn-success.focus, .btn-success.disabled:active, .btn-success[disabled]:active, fieldset[disabled] .btn-success:active, .btn-success.disabled.active, .btn-success[disabled].active, fieldset[disabled] .btn-success.active { background-color: #77b300; border-color: #77b300; } .btn-success .badge { color: #77b300; background-color: #ffffff; } .btn-info { color: #ffffff; background-color: #9933cc; border-color: #9933cc; } .btn-info:focus, .btn-info.focus { color: #ffffff; background-color: #7a29a3; border-color: #4c1966; } .btn-info:hover { color: #ffffff; background-color: #7a29a3; border-color: #74279b; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { color: #ffffff; background-color: #7a29a3; border-color: #74279b; } .btn-info:active:hover, .btn-info.active:hover, .open > .dropdown-toggle.btn-info:hover, .btn-info:active:focus, .btn-info.active:focus, .open > .dropdown-toggle.btn-info:focus, .btn-info:active.focus, .btn-info.active.focus, .open > .dropdown-toggle.btn-info.focus { color: #ffffff; background-color: #652287; border-color: #4c1966; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { background-image: none; } .btn-info.disabled, .btn-info[disabled], fieldset[disabled] .btn-info, .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled.focus, .btn-info[disabled].focus, fieldset[disabled] .btn-info.focus, .btn-info.disabled:active, .btn-info[disabled]:active, fieldset[disabled] .btn-info:active, .btn-info.disabled.active, .btn-info[disabled].active, fieldset[disabled] .btn-info.active { background-color: #9933cc; border-color: #9933cc; } .btn-info .badge { color: #9933cc; background-color: #ffffff; } .btn-warning { color: #ffffff; background-color: #ff8800; border-color: #ff8800; } .btn-warning:focus, .btn-warning.focus { color: #ffffff; background-color: #cc6d00; border-color: #804400; } .btn-warning:hover { color: #ffffff; background-color: #cc6d00; border-color: #c26700; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { color: #ffffff; background-color: #cc6d00; border-color: #c26700; } .btn-warning:active:hover, .btn-warning.active:hover, .open > .dropdown-toggle.btn-warning:hover, .btn-warning:active:focus, .btn-warning.active:focus, .open > .dropdown-toggle.btn-warning:focus, .btn-warning:active.focus, .btn-warning.active.focus, .open > .dropdown-toggle.btn-warning.focus { color: #ffffff; background-color: #a85a00; border-color: #804400; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { background-image: none; } .btn-warning.disabled, .btn-warning[disabled], fieldset[disabled] .btn-warning, .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled.focus, .btn-warning[disabled].focus, fieldset[disabled] .btn-warning.focus, .btn-warning.disabled:active, .btn-warning[disabled]:active, fieldset[disabled] .btn-warning:active, .btn-warning.disabled.active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning.active { background-color: #ff8800; border-color: #ff8800; } .btn-warning .badge { color: #ff8800; background-color: #ffffff; } .btn-danger { color: #ffffff; background-color: #cc0000; border-color: #cc0000; } .btn-danger:focus, .btn-danger.focus { color: #ffffff; background-color: #990000; border-color: #4d0000; } .btn-danger:hover { color: #ffffff; background-color: #990000; border-color: #8f0000; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { color: #ffffff; background-color: #990000; border-color: #8f0000; } .btn-danger:active:hover, .btn-danger.active:hover, .open > .dropdown-toggle.btn-danger:hover, .btn-danger:active:focus, .btn-danger.active:focus, .open > .dropdown-toggle.btn-danger:focus, .btn-danger:active.focus, .btn-danger.active.focus, .open > .dropdown-toggle.btn-danger.focus { color: #ffffff; background-color: #750000; border-color: #4d0000; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { background-image: none; } .btn-danger.disabled, .btn-danger[disabled], fieldset[disabled] .btn-danger, .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled.focus, .btn-danger[disabled].focus, fieldset[disabled] .btn-danger.focus, .btn-danger.disabled:active, .btn-danger[disabled]:active, fieldset[disabled] .btn-danger:active, .btn-danger.disabled.active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger.active { background-color: #cc0000; border-color: #cc0000; } .btn-danger .badge { color: #cc0000; background-color: #ffffff; } .btn-link { color: #2a9fd6; font-weight: normal; border-radius: 0; } .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled], fieldset[disabled] .btn-link { background-color: transparent; -webkit-box-shadow: none; box-shadow: none; } .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { border-color: transparent; } .btn-link:hover, .btn-link:focus { color: #2a9fd6; text-decoration: underline; background-color: transparent; } .btn-link[disabled]:hover, fieldset[disabled] .btn-link:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:focus { color: #888888; text-decoration: none; } .btn-lg, .btn-group-lg > .btn { padding: 14px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } .btn-sm, .btn-group-sm > .btn { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-xs, .btn-group-xs > .btn { padding: 1px 5px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-block { display: block; width: 100%; } .btn-block + .btn-block { margin-top: 5px; } input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { width: 100%; } .fade { opacity: 0; -webkit-transition: opacity 0.15s linear; -o-transition: opacity 0.15s linear; transition: opacity 0.15s linear; } .fade.in { opacity: 1; } .collapse { display: none; } .collapse.in { display: block; } tr.collapse.in { display: table-row; } tbody.collapse.in { display: table-row-group; } .collapsing { position: relative; height: 0; overflow: hidden; -webkit-transition-property: height, visibility; -o-transition-property: height, visibility; transition-property: height, visibility; -webkit-transition-duration: 0.35s; -o-transition-duration: 0.35s; transition-duration: 0.35s; -webkit-transition-timing-function: ease; -o-transition-timing-function: ease; transition-timing-function: ease; } .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: 4px dashed; border-top: 4px solid \9; border-right: 4px solid transparent; border-left: 4px solid transparent; } .dropup, .dropdown { position: relative; } .dropdown-toggle:focus { outline: 0; } .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; list-style: none; font-size: 14px; text-align: left; background-color: #222222; border: 1px solid #444444; border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); -webkit-background-clip: padding-box; background-clip: padding-box; } .dropdown-menu.pull-right { right: 0; left: auto; } .dropdown-menu .divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: rgba(255, 255, 255, 0.1); } .dropdown-menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 1.42857143; color: #ffffff; white-space: nowrap; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { text-decoration: none; color: #ffffff; background-color: #2a9fd6; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { color: #ffffff; text-decoration: none; outline: 0; background-color: #2a9fd6; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { color: #888888; } .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { text-decoration: none; background-color: transparent; background-image: none; filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); cursor: not-allowed; } .open > .dropdown-menu { display: block; } .open > a { outline: 0; } .dropdown-menu-right { left: auto; right: 0; } .dropdown-menu-left { left: 0; right: auto; } .dropdown-header { display: block; padding: 3px 20px; font-size: 12px; line-height: 1.42857143; color: #888888; white-space: nowrap; } .dropdown-backdrop { position: fixed; left: 0; right: 0; bottom: 0; top: 0; z-index: 990; } .pull-right > .dropdown-menu { right: 0; left: auto; } .dropup .caret, .navbar-fixed-bottom .dropdown .caret { border-top: 0; border-bottom: 4px dashed; border-bottom: 4px solid \9; content: ""; } .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 2px; } @media (min-width: 768px) { .navbar-right .dropdown-menu { left: auto; right: 0; } .navbar-right .dropdown-menu-left { left: 0; right: auto; } } .btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; } .btn-group > .btn, .btn-group-vertical > .btn { position: relative; float: left; } .btn-group > .btn:hover, .btn-group-vertical > .btn:hover, .btn-group > .btn:focus, .btn-group-vertical > .btn:focus, .btn-group > .btn:active, .btn-group-vertical > .btn:active, .btn-group > .btn.active, .btn-group-vertical > .btn.active { z-index: 2; } .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { margin-left: -1px; } .btn-toolbar { margin-left: -5px; } .btn-toolbar .btn, .btn-toolbar .btn-group, .btn-toolbar .input-group { float: left; } .btn-toolbar > .btn, .btn-toolbar > .btn-group, .btn-toolbar > .input-group { margin-left: 5px; } .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } .btn-group > .btn:first-child { margin-left: 0; } .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-bottom-right-radius: 0; border-top-right-radius: 0; } .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group > .btn-group { float: left; } .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-bottom-right-radius: 0; border-top-right-radius: 0; } .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } .btn-group > .btn + .dropdown-toggle { padding-left: 8px; padding-right: 8px; } .btn-group > .btn-lg + .dropdown-toggle { padding-left: 12px; padding-right: 12px; } .btn-group.open .dropdown-toggle { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn-group.open .dropdown-toggle.btn-link { -webkit-box-shadow: none; box-shadow: none; } .btn .caret { margin-left: 0; } .btn-lg .caret { border-width: 5px 5px 0; border-bottom-width: 0; } .dropup .btn-lg .caret { border-width: 0 5px 5px; } .btn-group-vertical > .btn, .btn-group-vertical > .btn-group, .btn-group-vertical > .btn-group > .btn { display: block; float: none; width: 100%; max-width: 100%; } .btn-group-vertical > .btn-group > .btn { float: none; } .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { margin-top: -1px; margin-left: 0; } .btn-group-vertical > .btn:not(:first-child):not(:last-child) { border-radius: 0; } .btn-group-vertical > .btn:first-child:not(:last-child) { border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn:last-child:not(:first-child) { border-bottom-left-radius: 4px; border-top-right-radius: 0; border-top-left-radius: 0; } .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .btn-group-justified { display: table; width: 100%; table-layout: fixed; border-collapse: separate; } .btn-group-justified > .btn, .btn-group-justified > .btn-group { float: none; display: table-cell; width: 1%; } .btn-group-justified > .btn-group .btn { width: 100%; } .btn-group-justified > .btn-group .dropdown-menu { left: auto; } [data-toggle="buttons"] > .btn input[type="radio"], [data-toggle="buttons"] > .btn-group > .btn input[type="radio"], [data-toggle="buttons"] > .btn input[type="checkbox"], [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { position: absolute; clip: rect(0, 0, 0, 0); pointer-events: none; } .input-group { position: relative; display: table; border-collapse: separate; } .input-group[class*="col-"] { float: none; padding-left: 0; padding-right: 0; } .input-group .form-control { position: relative; z-index: 2; float: left; width: 100%; margin-bottom: 0; } .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { height: 54px; padding: 14px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { height: 54px; line-height: 54px; } textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, textarea.input-group-lg > .input-group-btn > .btn, select[multiple].input-group-lg > .form-control, select[multiple].input-group-lg > .input-group-addon, select[multiple].input-group-lg > .input-group-btn > .btn { height: auto; } .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { height: 30px; line-height: 30px; } textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, textarea.input-group-sm > .input-group-btn > .btn, select[multiple].input-group-sm > .form-control, select[multiple].input-group-sm > .input-group-addon, select[multiple].input-group-sm > .input-group-btn > .btn { height: auto; } .input-group-addon, .input-group-btn, .input-group .form-control { display: table-cell; } .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { border-radius: 0; } .input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; } .input-group-addon { padding: 8px 12px; font-size: 14px; font-weight: normal; line-height: 1; color: #888888; text-align: center; background-color: #adafae; border: 1px solid #282828; border-radius: 4px; } .input-group-addon.input-sm { padding: 5px 10px; font-size: 12px; border-radius: 3px; } .input-group-addon.input-lg { padding: 14px 16px; font-size: 18px; border-radius: 6px; } .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { margin-top: 0; } .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { border-bottom-right-radius: 0; border-top-right-radius: 0; } .input-group-addon:first-child { border-right: 0; } .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child), .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { border-bottom-left-radius: 0; border-top-left-radius: 0; } .input-group-addon:last-child { border-left: 0; } .input-group-btn { position: relative; font-size: 0; white-space: nowrap; } .input-group-btn > .btn { position: relative; } .input-group-btn > .btn + .btn { margin-left: -1px; } .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { z-index: 2; } .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group { margin-right: -1px; } .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { z-index: 2; margin-left: -1px; } .nav { margin-bottom: 0; padding-left: 0; list-style: none; } .nav > li { position: relative; display: block; } .nav > li > a { position: relative; display: block; padding: 10px 15px; } .nav > li > a:hover, .nav > li > a:focus { text-decoration: none; background-color: #222222; } .nav > li.disabled > a { color: #888888; } .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { color: #888888; text-decoration: none; background-color: transparent; cursor: not-allowed; } .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { background-color: #222222; border-color: #2a9fd6; } .nav .nav-divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .nav > li > a > img { max-width: none; } .nav-tabs { border-bottom: 1px solid #282828; } .nav-tabs > li { float: left; margin-bottom: -1px; } .nav-tabs > li > a { margin-right: 2px; line-height: 1.42857143; border: 1px solid transparent; border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { border-color: transparent transparent #282828; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #ffffff; background-color: #2a9fd6; border: 1px solid #282828; border-bottom-color: transparent; cursor: default; } .nav-tabs.nav-justified { width: 100%; border-bottom: 0; } .nav-tabs.nav-justified > li { float: none; } .nav-tabs.nav-justified > li > a { text-align: center; margin-bottom: 5px; } .nav-tabs.nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-tabs.nav-justified > li { display: table-cell; width: 1%; } .nav-tabs.nav-justified > li > a { margin-bottom: 0; } } .nav-tabs.nav-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border: 1px solid #dddddd; } @media (min-width: 768px) { .nav-tabs.nav-justified > li > a { border-bottom: 1px solid #dddddd; border-radius: 4px 4px 0 0; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border-bottom-color: #060606; } } .nav-pills > li { float: left; } .nav-pills > li > a { border-radius: 4px; } .nav-pills > li + li { margin-left: 2px; } .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { color: #ffffff; background-color: #2a9fd6; } .nav-stacked > li { float: none; } .nav-stacked > li + li { margin-top: 2px; margin-left: 0; } .nav-justified { width: 100%; } .nav-justified > li { float: none; } .nav-justified > li > a { text-align: center; margin-bottom: 5px; } .nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-justified > li { display: table-cell; width: 1%; } .nav-justified > li > a { margin-bottom: 0; } } .nav-tabs-justified { border-bottom: 0; } .nav-tabs-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border: 1px solid #dddddd; } @media (min-width: 768px) { .nav-tabs-justified > li > a { border-bottom: 1px solid #dddddd; border-radius: 4px 4px 0 0; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border-bottom-color: #060606; } } .tab-content > .tab-pane { display: none; } .tab-content > .active { display: block; } .nav-tabs .dropdown-menu { margin-top: -1px; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar { position: relative; min-height: 50px; margin-bottom: 20px; border: 1px solid transparent; } @media (min-width: 768px) { .navbar { border-radius: 4px; } } @media (min-width: 768px) { .navbar-header { float: left; } } .navbar-collapse { overflow-x: visible; padding-right: 15px; padding-left: 15px; border-top: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); -webkit-overflow-scrolling: touch; } .navbar-collapse.in { overflow-y: auto; } @media (min-width: 768px) { .navbar-collapse { width: auto; border-top: 0; -webkit-box-shadow: none; box-shadow: none; } .navbar-collapse.collapse { display: block !important; height: auto !important; padding-bottom: 0; overflow: visible !important; } .navbar-collapse.in { overflow-y: visible; } .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { padding-left: 0; padding-right: 0; } } .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 340px; } @media (max-device-width: 480px) and (orientation: landscape) { .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 200px; } } .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: 0; margin-left: 0; } } .navbar-static-top { z-index: 1000; border-width: 0 0 1px; } @media (min-width: 768px) { .navbar-static-top { border-radius: 0; } } .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; z-index: 1030; } @media (min-width: 768px) { .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } } .navbar-fixed-top { top: 0; border-width: 0 0 1px; } .navbar-fixed-bottom { bottom: 0; margin-bottom: 0; border-width: 1px 0 0; } .navbar-brand { float: left; padding: 15px 15px; font-size: 18px; line-height: 20px; height: 50px; } .navbar-brand:hover, .navbar-brand:focus { text-decoration: none; } .navbar-brand > img { display: block; } @media (min-width: 768px) { .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { margin-left: -15px; } } .navbar-toggle { position: relative; float: right; margin-right: 15px; padding: 9px 10px; margin-top: 8px; margin-bottom: 8px; background-color: transparent; background-image: none; border: 1px solid transparent; border-radius: 4px; } .navbar-toggle:focus { outline: 0; } .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; } .navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; } @media (min-width: 768px) { .navbar-toggle { display: none; } } .navbar-nav { margin: 7.5px -15px; } .navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 20px; } @media (max-width: 767px) { .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; -webkit-box-shadow: none; box-shadow: none; } .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .dropdown-menu .dropdown-header { padding: 5px 15px 5px 25px; } .navbar-nav .open .dropdown-menu > li > a { line-height: 20px; } .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { background-image: none; } } @media (min-width: 768px) { .navbar-nav { float: left; margin: 0; } .navbar-nav > li { float: left; } .navbar-nav > li > a { padding-top: 15px; padding-bottom: 15px; } } .navbar-form { margin-left: -15px; margin-right: -15px; padding: 10px 15px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); margin-top: 6px; margin-bottom: 6px; } @media (min-width: 768px) { .navbar-form .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .navbar-form .form-control { display: inline-block; width: auto; vertical-align: middle; } .navbar-form .form-control-static { display: inline-block; } .navbar-form .input-group { display: inline-table; vertical-align: middle; } .navbar-form .input-group .input-group-addon, .navbar-form .input-group .input-group-btn, .navbar-form .input-group .form-control { width: auto; } .navbar-form .input-group > .form-control { width: 100%; } .navbar-form .control-label { margin-bottom: 0; vertical-align: middle; } .navbar-form .radio, .navbar-form .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .navbar-form .radio label, .navbar-form .checkbox label { padding-left: 0; } .navbar-form .radio input[type="radio"], .navbar-form .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .navbar-form .has-feedback .form-control-feedback { top: 0; } } @media (max-width: 767px) { .navbar-form .form-group { margin-bottom: 5px; } .navbar-form .form-group:last-child { margin-bottom: 0; } } @media (min-width: 768px) { .navbar-form { width: auto; border: 0; margin-left: 0; margin-right: 0; padding-top: 0; padding-bottom: 0; -webkit-box-shadow: none; box-shadow: none; } } .navbar-nav > li > .dropdown-menu { margin-top: 0; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { margin-bottom: 0; border-top-right-radius: 4px; border-top-left-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .navbar-btn { margin-top: 6px; margin-bottom: 6px; } .navbar-btn.btn-sm { margin-top: 10px; margin-bottom: 10px; } .navbar-btn.btn-xs { margin-top: 14px; margin-bottom: 14px; } .navbar-text { margin-top: 15px; margin-bottom: 15px; } @media (min-width: 768px) { .navbar-text { float: left; margin-left: 15px; margin-right: 15px; } } @media (min-width: 768px) { .navbar-left { float: left !important; } .navbar-right { float: right !important; margin-right: -15px; } .navbar-right ~ .navbar-right { margin-right: 0; } } .navbar-default { background-color: #060606; border-color: #282828; } .navbar-default .navbar-brand { color: #ffffff; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { color: #ffffff; background-color: transparent; } .navbar-default .navbar-text { color: #888888; } .navbar-default .navbar-nav > li > a { color: #888888; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { color: #ffffff; background-color: transparent; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { color: #888888; background-color: transparent; } .navbar-default .navbar-toggle { border-color: #282828; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { background-color: #282828; } .navbar-default .navbar-toggle .icon-bar { background-color: #cccccc; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { border-color: #282828; } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { background-color: transparent; color: #ffffff; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: #888888; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { color: #ffffff; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #888888; background-color: transparent; } } .navbar-default .navbar-link { color: #888888; } .navbar-default .navbar-link:hover { color: #ffffff; } .navbar-default .btn-link { color: #888888; } .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { color: #ffffff; } .navbar-default .btn-link[disabled]:hover, fieldset[disabled] .navbar-default .btn-link:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:focus { color: #888888; } .navbar-inverse { background-color: #222222; border-color: #080808; } .navbar-inverse .navbar-brand { color: #ffffff; } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-text { color: #888888; } .navbar-inverse .navbar-nav > li > a { color: #888888; } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { color: #aaaaaa; background-color: transparent; } .navbar-inverse .navbar-toggle { border-color: #333333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { background-color: #333333; } .navbar-inverse .navbar-toggle .icon-bar { background-color: #ffffff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #101010; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { background-color: transparent; color: #ffffff; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { border-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu .divider { background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { color: #888888; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #aaaaaa; background-color: transparent; } } .navbar-inverse .navbar-link { color: #888888; } .navbar-inverse .navbar-link:hover { color: #ffffff; } .navbar-inverse .btn-link { color: #888888; } .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { color: #ffffff; } .navbar-inverse .btn-link[disabled]:hover, fieldset[disabled] .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:focus { color: #aaaaaa; } .breadcrumb { padding: 8px 15px; margin-bottom: 20px; list-style: none; background-color: #222222; border-radius: 4px; } .breadcrumb > li { display: inline-block; } .breadcrumb > li + li:before { content: "/\00a0"; padding: 0 5px; color: #ffffff; } .breadcrumb > .active { color: #888888; } .pagination { display: inline-block; padding-left: 0; margin: 20px 0; border-radius: 4px; } .pagination > li { display: inline; } .pagination > li > a, .pagination > li > span { position: relative; float: left; padding: 8px 12px; line-height: 1.42857143; text-decoration: none; color: #ffffff; background-color: #222222; border: 1px solid #282828; margin-left: -1px; } .pagination > li:first-child > a, .pagination > li:first-child > span { margin-left: 0; border-bottom-left-radius: 4px; border-top-left-radius: 4px; } .pagination > li:last-child > a, .pagination > li:last-child > span { border-bottom-right-radius: 4px; border-top-right-radius: 4px; } .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { z-index: 3; color: #ffffff; background-color: #2a9fd6; border-color: transparent; } .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 2; color: #ffffff; background-color: #2a9fd6; border-color: transparent; cursor: default; } .pagination > .disabled > span, .pagination > .disabled > span:hover, .pagination > .disabled > span:focus, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #888888; background-color: #222222; border-color: #282828; cursor: not-allowed; } .pagination-lg > li > a, .pagination-lg > li > span { padding: 14px 16px; font-size: 18px; line-height: 1.3333333; } .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { border-bottom-left-radius: 6px; border-top-left-radius: 6px; } .pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { border-bottom-right-radius: 6px; border-top-right-radius: 6px; } .pagination-sm > li > a, .pagination-sm > li > span { padding: 5px 10px; font-size: 12px; line-height: 1.5; } .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { border-bottom-left-radius: 3px; border-top-left-radius: 3px; } .pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { border-bottom-right-radius: 3px; border-top-right-radius: 3px; } .pager { padding-left: 0; margin: 20px 0; list-style: none; text-align: center; } .pager li { display: inline; } .pager li > a, .pager li > span { display: inline-block; padding: 5px 14px; background-color: #222222; border: 1px solid #282828; border-radius: 15px; } .pager li > a:hover, .pager li > a:focus { text-decoration: none; background-color: #2a9fd6; } .pager .next > a, .pager .next > span { float: right; } .pager .previous > a, .pager .previous > span { float: left; } .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { color: #888888; background-color: #222222; cursor: not-allowed; } .label { display: inline; padding: .2em .6em .3em; font-size: 75%; font-weight: bold; line-height: 1; color: #ffffff; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: .25em; } a.label:hover, a.label:focus { color: #ffffff; text-decoration: none; cursor: pointer; } .label:empty { display: none; } .btn .label { position: relative; top: -1px; } .label-default { background-color: #424242; } .label-default[href]:hover, .label-default[href]:focus { background-color: #282828; } .label-primary { background-color: #2a9fd6; } .label-primary[href]:hover, .label-primary[href]:focus { background-color: #2180ac; } .label-success { background-color: #77b300; } .label-success[href]:hover, .label-success[href]:focus { background-color: #558000; } .label-info { background-color: #9933cc; } .label-info[href]:hover, .label-info[href]:focus { background-color: #7a29a3; } .label-warning { background-color: #ff8800; } .label-warning[href]:hover, .label-warning[href]:focus { background-color: #cc6d00; } .label-danger { background-color: #cc0000; } .label-danger[href]:hover, .label-danger[href]:focus { background-color: #990000; } .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 12px; font-weight: bold; color: #ffffff; line-height: 1; vertical-align: middle; white-space: nowrap; text-align: center; background-color: #2a9fd6; border-radius: 10px; } .badge:empty { display: none; } .btn .badge { position: relative; top: -1px; } .btn-xs .badge, .btn-group-xs > .btn .badge { top: 0; padding: 1px 5px; } a.badge:hover, a.badge:focus { color: #ffffff; text-decoration: none; cursor: pointer; } .list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #2a9fd6; background-color: #ffffff; } .list-group-item > .badge { float: right; } .list-group-item > .badge + .badge { margin-right: 5px; } .nav-pills > li > a > .badge { margin-left: 3px; } .jumbotron { padding-top: 30px; padding-bottom: 30px; margin-bottom: 30px; color: inherit; background-color: #151515; } .jumbotron h1, .jumbotron .h1 { color: inherit; } .jumbotron p { margin-bottom: 15px; font-size: 21px; font-weight: 200; } .jumbotron > hr { border-top-color: #000000; } .container .jumbotron, .container-fluid .jumbotron { border-radius: 6px; } .jumbotron .container { max-width: 100%; } @media screen and (min-width: 768px) { .jumbotron { padding-top: 48px; padding-bottom: 48px; } .container .jumbotron, .container-fluid .jumbotron { padding-left: 60px; padding-right: 60px; } .jumbotron h1, .jumbotron .h1 { font-size: 63px; } } .thumbnail { display: block; padding: 4px; margin-bottom: 20px; line-height: 1.42857143; background-color: #282828; border: 1px solid #282828; border-radius: 4px; -webkit-transition: border 0.2s ease-in-out; -o-transition: border 0.2s ease-in-out; transition: border 0.2s ease-in-out; } .thumbnail > img, .thumbnail a > img { margin-left: auto; margin-right: auto; } a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { border-color: #2a9fd6; } .thumbnail .caption { padding: 9px; color: #888888; } .alert { padding: 15px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; } .alert h4 { margin-top: 0; color: inherit; } .alert .alert-link { font-weight: bold; } .alert > p, .alert > ul { margin-bottom: 0; } .alert > p + p { margin-top: 5px; } .alert-dismissable, .alert-dismissible { padding-right: 35px; } .alert-dismissable .close, .alert-dismissible .close { position: relative; top: -2px; right: -21px; color: inherit; } .alert-success { background-color: #77b300; border-color: #809a00; color: #ffffff; } .alert-success hr { border-top-color: #6a8000; } .alert-success .alert-link { color: #e6e6e6; } .alert-info { background-color: #9933cc; border-color: #6e2caf; color: #ffffff; } .alert-info hr { border-top-color: #61279b; } .alert-info .alert-link { color: #e6e6e6; } .alert-warning { background-color: #ff8800; border-color: #f05800; color: #ffffff; } .alert-warning hr { border-top-color: #d64f00; } .alert-warning .alert-link { color: #e6e6e6; } .alert-danger { background-color: #cc0000; border-color: #bd001f; color: #ffffff; } .alert-danger hr { border-top-color: #a3001b; } .alert-danger .alert-link { color: #e6e6e6; } @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @-o-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } .progress { overflow: hidden; height: 20px; margin-bottom: 20px; background-color: #222222; border-radius: 4px; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } .progress-bar { float: left; width: 0%; height: 100%; font-size: 12px; line-height: 20px; color: #ffffff; text-align: center; background-color: #2a9fd6; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -webkit-transition: width 0.6s ease; -o-transition: width 0.6s ease; transition: width 0.6s ease; } .progress-striped .progress-bar, .progress-bar-striped { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -webkit-background-size: 40px 40px; background-size: 40px 40px; } .progress.active .progress-bar, .progress-bar.active { -webkit-animation: progress-bar-stripes 2s linear infinite; -o-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } .progress-bar-success { background-color: #77b300; } .progress-striped .progress-bar-success { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-info { background-color: #9933cc; } .progress-striped .progress-bar-info { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-warning { background-color: #ff8800; } .progress-striped .progress-bar-warning { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-danger { background-color: #cc0000; } .progress-striped .progress-bar-danger { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .media { margin-top: 15px; } .media:first-child { margin-top: 0; } .media, .media-body { zoom: 1; overflow: hidden; } .media-body { width: 10000px; } .media-object { display: block; } .media-object.img-thumbnail { max-width: none; } .media-right, .media > .pull-right { padding-left: 10px; } .media-left, .media > .pull-left { padding-right: 10px; } .media-left, .media-right, .media-body { display: table-cell; vertical-align: top; } .media-middle { vertical-align: middle; } .media-bottom { vertical-align: bottom; } .media-heading { margin-top: 0; margin-bottom: 5px; } .media-list { padding-left: 0; list-style: none; } .list-group { margin-bottom: 20px; padding-left: 0; } .list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; background-color: #222222; border: 1px solid #282828; } .list-group-item:first-child { border-top-right-radius: 4px; border-top-left-radius: 4px; } .list-group-item:last-child { margin-bottom: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } a.list-group-item, button.list-group-item { color: #888888; } a.list-group-item .list-group-item-heading, button.list-group-item .list-group-item-heading { color: #ffffff; } a.list-group-item:hover, button.list-group-item:hover, a.list-group-item:focus, button.list-group-item:focus { text-decoration: none; color: #888888; background-color: #484848; } button.list-group-item { width: 100%; text-align: left; } .list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus { background-color: #adafae; color: #888888; cursor: not-allowed; } .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading { color: inherit; } .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text { color: #888888; } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; color: #ffffff; background-color: #2a9fd6; border-color: #2a9fd6; } .list-group-item.active .list-group-item-heading, .list-group-item.active:hover .list-group-item-heading, .list-group-item.active:focus .list-group-item-heading, .list-group-item.active .list-group-item-heading > small, .list-group-item.active:hover .list-group-item-heading > small, .list-group-item.active:focus .list-group-item-heading > small, .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading > .small { color: inherit; } .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { color: #d5ecf7; } .list-group-item-success { color: #ffffff; background-color: #77b300; } a.list-group-item-success, button.list-group-item-success { color: #ffffff; } a.list-group-item-success .list-group-item-heading, button.list-group-item-success .list-group-item-heading { color: inherit; } a.list-group-item-success:hover, button.list-group-item-success:hover, a.list-group-item-success:focus, button.list-group-item-success:focus { color: #ffffff; background-color: #669a00; } a.list-group-item-success.active, button.list-group-item-success.active, a.list-group-item-success.active:hover, button.list-group-item-success.active:hover, a.list-group-item-success.active:focus, button.list-group-item-success.active:focus { color: #fff; background-color: #ffffff; border-color: #ffffff; } .list-group-item-info { color: #ffffff; background-color: #9933cc; } a.list-group-item-info, button.list-group-item-info { color: #ffffff; } a.list-group-item-info .list-group-item-heading, button.list-group-item-info .list-group-item-heading { color: inherit; } a.list-group-item-info:hover, button.list-group-item-info:hover, a.list-group-item-info:focus, button.list-group-item-info:focus { color: #ffffff; background-color: #8a2eb8; } a.list-group-item-info.active, button.list-group-item-info.active, a.list-group-item-info.active:hover, button.list-group-item-info.active:hover, a.list-group-item-info.active:focus, button.list-group-item-info.active:focus { color: #fff; background-color: #ffffff; border-color: #ffffff; } .list-group-item-warning { color: #ffffff; background-color: #ff8800; } a.list-group-item-warning, button.list-group-item-warning { color: #ffffff; } a.list-group-item-warning .list-group-item-heading, button.list-group-item-warning .list-group-item-heading { color: inherit; } a.list-group-item-warning:hover, button.list-group-item-warning:hover, a.list-group-item-warning:focus, button.list-group-item-warning:focus { color: #ffffff; background-color: #e67a00; } a.list-group-item-warning.active, button.list-group-item-warning.active, a.list-group-item-warning.active:hover, button.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus, button.list-group-item-warning.active:focus { color: #fff; background-color: #ffffff; border-color: #ffffff; } .list-group-item-danger { color: #ffffff; background-color: #cc0000; } a.list-group-item-danger, button.list-group-item-danger { color: #ffffff; } a.list-group-item-danger .list-group-item-heading, button.list-group-item-danger .list-group-item-heading { color: inherit; } a.list-group-item-danger:hover, button.list-group-item-danger:hover, a.list-group-item-danger:focus, button.list-group-item-danger:focus { color: #ffffff; background-color: #b30000; } a.list-group-item-danger.active, button.list-group-item-danger.active, a.list-group-item-danger.active:hover, button.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus, button.list-group-item-danger.active:focus { color: #fff; background-color: #ffffff; border-color: #ffffff; } .list-group-item-heading { margin-top: 0; margin-bottom: 5px; } .list-group-item-text { margin-bottom: 0; line-height: 1.3; } .panel { margin-bottom: 20px; background-color: #222222; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } .panel-body { padding: 15px; } .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-right-radius: 3px; border-top-left-radius: 3px; } .panel-heading > .dropdown .dropdown-toggle { color: inherit; } .panel-title { margin-top: 0; margin-bottom: 0; font-size: 16px; color: inherit; } .panel-title > a, .panel-title > small, .panel-title > .small, .panel-title > small > a, .panel-title > .small > a { color: inherit; } .panel-footer { padding: 10px 15px; background-color: #3c3c3c; border-top: 1px solid #282828; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .list-group, .panel > .panel-collapse > .list-group { margin-bottom: 0; } .panel > .list-group .list-group-item, .panel > .panel-collapse > .list-group .list-group-item { border-width: 1px 0; border-radius: 0; } .panel > .list-group:first-child .list-group-item:first-child, .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { border-top: 0; border-top-right-radius: 3px; border-top-left-radius: 3px; } .panel > .list-group:last-child .list-group-item:last-child, .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { border-bottom: 0; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } .list-group + .panel-footer { border-top-width: 0; } .panel > .table, .panel > .table-responsive > .table, .panel > .panel-collapse > .table { margin-bottom: 0; } .panel > .table caption, .panel > .table-responsive > .table caption, .panel > .panel-collapse > .table caption { padding-left: 15px; padding-right: 15px; } .panel > .table:first-child, .panel > .table-responsive:first-child > .table:first-child { border-top-right-radius: 3px; border-top-left-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { border-top-left-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { border-top-right-radius: 3px; } .panel > .table:last-child, .panel > .table-responsive:last-child > .table:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { border-bottom-right-radius: 3px; } .panel > .panel-body + .table, .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { border-top: 1px solid #282828; } .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { border-top: 0; } .panel > .table-bordered, .panel > .table-responsive > .table-bordered { border: 0; } .panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .panel > .table-bordered > thead > tr:first-child > td, .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, .panel > .table-bordered > tbody > tr:first-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, .panel > .table-bordered > thead > tr:first-child > th, .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, .panel > .table-bordered > tbody > tr:first-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { border-bottom: 0; } .panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { border-bottom: 0; } .panel > .table-responsive { border: 0; margin-bottom: 0; } .panel-group { margin-bottom: 20px; } .panel-group .panel { margin-bottom: 0; border-radius: 4px; } .panel-group .panel + .panel { margin-top: 5px; } .panel-group .panel-heading { border-bottom: 0; } .panel-group .panel-heading + .panel-collapse > .panel-body, .panel-group .panel-heading + .panel-collapse > .list-group { border-top: 1px solid #282828; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid #282828; } .panel-default { border-color: #282828; } .panel-default > .panel-heading { color: #888888; background-color: #3c3c3c; border-color: #282828; } .panel-default > .panel-heading + .panel-collapse > .panel-body { border-top-color: #282828; } .panel-default > .panel-heading .badge { color: #3c3c3c; background-color: #888888; } .panel-default > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #282828; } .panel-primary { border-color: #2a9fd6; } .panel-primary > .panel-heading { color: #ffffff; background-color: #2a9fd6; border-color: #2a9fd6; } .panel-primary > .panel-heading + .panel-collapse > .panel-body { border-top-color: #2a9fd6; } .panel-primary > .panel-heading .badge { color: #2a9fd6; background-color: #ffffff; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #2a9fd6; } .panel-success { border-color: #809a00; } .panel-success > .panel-heading { color: #ffffff; background-color: #77b300; border-color: #809a00; } .panel-success > .panel-heading + .panel-collapse > .panel-body { border-top-color: #809a00; } .panel-success > .panel-heading .badge { color: #77b300; background-color: #ffffff; } .panel-success > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #809a00; } .panel-info { border-color: #6e2caf; } .panel-info > .panel-heading { color: #ffffff; background-color: #9933cc; border-color: #6e2caf; } .panel-info > .panel-heading + .panel-collapse > .panel-body { border-top-color: #6e2caf; } .panel-info > .panel-heading .badge { color: #9933cc; background-color: #ffffff; } .panel-info > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #6e2caf; } .panel-warning { border-color: #f05800; } .panel-warning > .panel-heading { color: #ffffff; background-color: #ff8800; border-color: #f05800; } .panel-warning > .panel-heading + .panel-collapse > .panel-body { border-top-color: #f05800; } .panel-warning > .panel-heading .badge { color: #ff8800; background-color: #ffffff; } .panel-warning > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #f05800; } .panel-danger { border-color: #bd001f; } .panel-danger > .panel-heading { color: #ffffff; background-color: #cc0000; border-color: #bd001f; } .panel-danger > .panel-heading + .panel-collapse > .panel-body { border-top-color: #bd001f; } .panel-danger > .panel-heading .badge { color: #cc0000; background-color: #ffffff; } .panel-danger > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #bd001f; } .embed-responsive { position: relative; display: block; height: 0; padding: 0; overflow: hidden; } .embed-responsive .embed-responsive-item, .embed-responsive iframe, .embed-responsive embed, .embed-responsive object, .embed-responsive video { position: absolute; top: 0; left: 0; bottom: 0; height: 100%; width: 100%; border: 0; } .embed-responsive-16by9 { padding-bottom: 56.25%; } .embed-responsive-4by3 { padding-bottom: 75%; } .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #151515; border: 1px solid #030303; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } .well blockquote { border-color: #ddd; border-color: rgba(0, 0, 0, 0.15); } .well-lg { padding: 24px; border-radius: 6px; } .well-sm { padding: 9px; border-radius: 3px; } .close { float: right; font-size: 21px; font-weight: bold; line-height: 1; color: #000000; text-shadow: 0 1px 0 #ffffff; opacity: 0.2; filter: alpha(opacity=20); } .close:hover, .close:focus { color: #000000; text-decoration: none; cursor: pointer; opacity: 0.5; filter: alpha(opacity=50); } button.close { padding: 0; cursor: pointer; background: transparent; border: 0; -webkit-appearance: none; } .modal-open { overflow: hidden; } .modal { display: none; overflow: hidden; position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1050; -webkit-overflow-scrolling: touch; outline: 0; } .modal.fade .modal-dialog { -webkit-transform: translate(0, -25%); -ms-transform: translate(0, -25%); -o-transform: translate(0, -25%); transform: translate(0, -25%); -webkit-transition: -webkit-transform 0.3s ease-out; -o-transition: -o-transform 0.3s ease-out; transition: transform 0.3s ease-out; } .modal.in .modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); } .modal-open .modal { overflow-x: hidden; overflow-y: auto; } .modal-dialog { position: relative; width: auto; margin: 10px; } .modal-content { position: relative; background-color: #202020; border: 1px solid #999999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); -webkit-background-clip: padding-box; background-clip: padding-box; outline: 0; } .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background-color: #000000; } .modal-backdrop.fade { opacity: 0; filter: alpha(opacity=0); } .modal-backdrop.in { opacity: 0.5; filter: alpha(opacity=50); } .modal-header { padding: 15px; border-bottom: 1px solid #282828; min-height: 16.42857143px; } .modal-header .close { margin-top: -2px; } .modal-title { margin: 0; line-height: 1.42857143; } .modal-body { position: relative; padding: 20px; } .modal-footer { padding: 20px; text-align: right; border-top: 1px solid #282828; } .modal-footer .btn + .btn { margin-left: 5px; margin-bottom: 0; } .modal-footer .btn-group .btn + .btn { margin-left: -1px; } .modal-footer .btn-block + .btn-block { margin-left: 0; } .modal-scrollbar-measure { position: absolute; top: -9999px; width: 50px; height: 50px; overflow: scroll; } @media (min-width: 768px) { .modal-dialog { width: 600px; margin: 30px auto; } .modal-content { -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } .modal-sm { width: 300px; } } @media (min-width: 992px) { .modal-lg { width: 900px; } } .tooltip { position: absolute; z-index: 1070; display: block; font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; font-style: normal; font-weight: normal; letter-spacing: normal; line-break: auto; line-height: 1.42857143; text-align: left; text-align: start; text-decoration: none; text-shadow: none; text-transform: none; white-space: normal; word-break: normal; word-spacing: normal; word-wrap: normal; font-size: 12px; opacity: 0; filter: alpha(opacity=0); } .tooltip.in { opacity: 0.9; filter: alpha(opacity=90); } .tooltip.top { margin-top: -3px; padding: 5px 0; } .tooltip.right { margin-left: 3px; padding: 0 5px; } .tooltip.bottom { margin-top: 3px; padding: 5px 0; } .tooltip.left { margin-left: -3px; padding: 0 5px; } .tooltip-inner { max-width: 200px; padding: 3px 8px; color: #ffffff; text-align: center; background-color: #000000; border-radius: 4px; } .tooltip-arrow { position: absolute; width: 0; height: 0; border-color: transparent; border-style: solid; } .tooltip.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -5px; border-width: 5px 5px 0; border-top-color: #000000; } .tooltip.top-left .tooltip-arrow { bottom: 0; right: 5px; margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000000; } .tooltip.top-right .tooltip-arrow { bottom: 0; left: 5px; margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000000; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-width: 5px 5px 5px 0; border-right-color: #000000; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-width: 5px 0 5px 5px; border-left-color: #000000; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-width: 0 5px 5px; border-bottom-color: #000000; } .tooltip.bottom-left .tooltip-arrow { top: 0; right: 5px; margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000000; } .tooltip.bottom-right .tooltip-arrow { top: 0; left: 5px; margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000000; } .popover { position: absolute; top: 0; left: 0; z-index: 1060; display: none; max-width: 276px; padding: 1px; font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; font-style: normal; font-weight: normal; letter-spacing: normal; line-break: auto; line-height: 1.42857143; text-align: left; text-align: start; text-decoration: none; text-shadow: none; text-transform: none; white-space: normal; word-break: normal; word-spacing: normal; word-wrap: normal; font-size: 14px; background-color: #202020; -webkit-background-clip: padding-box; background-clip: padding-box; border: 1px solid #999999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); } .popover.top { margin-top: -10px; } .popover.right { margin-left: 10px; } .popover.bottom { margin-top: 10px; } .popover.left { margin-left: -10px; } .popover-title { margin: 0; padding: 8px 14px; font-size: 14px; background-color: #181818; border-bottom: 1px solid #0b0b0b; border-radius: 5px 5px 0 0; } .popover-content { padding: 9px 14px; } .popover > .arrow, .popover > .arrow:after { position: absolute; display: block; width: 0; height: 0; border-color: transparent; border-style: solid; } .popover > .arrow { border-width: 11px; } .popover > .arrow:after { border-width: 10px; content: ""; } .popover.top > .arrow { left: 50%; margin-left: -11px; border-bottom-width: 0; border-top-color: #666666; border-top-color: rgba(0, 0, 0, 0.25); bottom: -11px; } .popover.top > .arrow:after { content: " "; bottom: 1px; margin-left: -10px; border-bottom-width: 0; border-top-color: #202020; } .popover.right > .arrow { top: 50%; left: -11px; margin-top: -11px; border-left-width: 0; border-right-color: #666666; border-right-color: rgba(0, 0, 0, 0.25); } .popover.right > .arrow:after { content: " "; left: 1px; bottom: -10px; border-left-width: 0; border-right-color: #202020; } .popover.bottom > .arrow { left: 50%; margin-left: -11px; border-top-width: 0; border-bottom-color: #666666; border-bottom-color: rgba(0, 0, 0, 0.25); top: -11px; } .popover.bottom > .arrow:after { content: " "; top: 1px; margin-left: -10px; border-top-width: 0; border-bottom-color: #202020; } .popover.left > .arrow { top: 50%; right: -11px; margin-top: -11px; border-right-width: 0; border-left-color: #666666; border-left-color: rgba(0, 0, 0, 0.25); } .popover.left > .arrow:after { content: " "; right: 1px; border-right-width: 0; border-left-color: #202020; bottom: -10px; } .carousel { position: relative; } .carousel-inner { position: relative; overflow: hidden; width: 100%; } .carousel-inner > .item { display: none; position: relative; -webkit-transition: 0.6s ease-in-out left; -o-transition: 0.6s ease-in-out left; transition: 0.6s ease-in-out left; } .carousel-inner > .item > img, .carousel-inner > .item > a > img { line-height: 1; } @media all and (transform-3d), (-webkit-transform-3d) { .carousel-inner > .item { -webkit-transition: -webkit-transform 0.6s ease-in-out; -o-transition: -o-transform 0.6s ease-in-out; transition: transform 0.6s ease-in-out; -webkit-backface-visibility: hidden; backface-visibility: hidden; -webkit-perspective: 1000px; perspective: 1000px; } .carousel-inner > .item.next, .carousel-inner > .item.active.right { -webkit-transform: translate3d(100%, 0, 0); transform: translate3d(100%, 0, 0); left: 0; } .carousel-inner > .item.prev, .carousel-inner > .item.active.left { -webkit-transform: translate3d(-100%, 0, 0); transform: translate3d(-100%, 0, 0); left: 0; } .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); left: 0; } } .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { display: block; } .carousel-inner > .active { left: 0; } .carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0; width: 100%; } .carousel-inner > .next { left: 100%; } .carousel-inner > .prev { left: -100%; } .carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0; } .carousel-inner > .active.left { left: -100%; } .carousel-inner > .active.right { left: 100%; } .carousel-control { position: absolute; top: 0; left: 0; bottom: 0; width: 15%; opacity: 0.5; filter: alpha(opacity=50); font-size: 20px; color: #ffffff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } .carousel-control.left { background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); } .carousel-control.right { left: auto; right: 0; background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); } .carousel-control:hover, .carousel-control:focus { outline: 0; color: #ffffff; text-decoration: none; opacity: 0.9; filter: alpha(opacity=90); } .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { position: absolute; top: 50%; margin-top: -10px; z-index: 5; display: inline-block; } .carousel-control .icon-prev, .carousel-control .glyphicon-chevron-left { left: 50%; margin-left: -10px; } .carousel-control .icon-next, .carousel-control .glyphicon-chevron-right { right: 50%; margin-right: -10px; } .carousel-control .icon-prev, .carousel-control .icon-next { width: 20px; height: 20px; line-height: 1; font-family: serif; } .carousel-control .icon-prev:before { content: '\2039'; } .carousel-control .icon-next:before { content: '\203a'; } .carousel-indicators { position: absolute; bottom: 10px; left: 50%; z-index: 15; width: 60%; margin-left: -30%; padding-left: 0; list-style: none; text-align: center; } .carousel-indicators li { display: inline-block; width: 10px; height: 10px; margin: 1px; text-indent: -999px; border: 1px solid #ffffff; border-radius: 10px; cursor: pointer; background-color: #000 \9; background-color: rgba(0, 0, 0, 0); } .carousel-indicators .active { margin: 0; width: 12px; height: 12px; background-color: #ffffff; } .carousel-caption { position: absolute; left: 15%; right: 15%; bottom: 20px; z-index: 10; padding-top: 20px; padding-bottom: 20px; color: #ffffff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } .carousel-caption .btn { text-shadow: none; } @media screen and (min-width: 768px) { .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right, .carousel-control .icon-prev, .carousel-control .icon-next { width: 30px; height: 30px; margin-top: -15px; font-size: 30px; } .carousel-control .glyphicon-chevron-left, .carousel-control .icon-prev { margin-left: -15px; } .carousel-control .glyphicon-chevron-right, .carousel-control .icon-next { margin-right: -15px; } .carousel-caption { left: 20%; right: 20%; padding-bottom: 30px; } .carousel-indicators { bottom: 20px; } } .clearfix:before, .clearfix:after, .dl-horizontal dd:before, .dl-horizontal dd:after, .container:before, .container:after, .container-fluid:before, .container-fluid:after, .row:before, .row:after, .form-horizontal .form-group:before, .form-horizontal .form-group:after, .btn-toolbar:before, .btn-toolbar:after, .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after, .nav:before, .nav:after, .navbar:before, .navbar:after, .navbar-header:before, .navbar-header:after, .navbar-collapse:before, .navbar-collapse:after, .pager:before, .pager:after, .panel-body:before, .panel-body:after, .modal-footer:before, .modal-footer:after { content: " "; display: table; } .clearfix:after, .dl-horizontal dd:after, .container:after, .container-fluid:after, .row:after, .form-horizontal .form-group:after, .btn-toolbar:after, .btn-group-vertical > .btn-group:after, .nav:after, .navbar:after, .navbar-header:after, .navbar-collapse:after, .pager:after, .panel-body:after, .modal-footer:after { clear: both; } .center-block { display: block; margin-left: auto; margin-right: auto; } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none !important; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .hidden { display: none !important; } .affix { position: fixed; } @-ms-viewport { width: device-width; } .visible-xs, .visible-sm, .visible-md, .visible-lg { display: none !important; } .visible-xs-block, .visible-xs-inline, .visible-xs-inline-block, .visible-sm-block, .visible-sm-inline, .visible-sm-inline-block, .visible-md-block, .visible-md-inline, .visible-md-inline-block, .visible-lg-block, .visible-lg-inline, .visible-lg-inline-block { display: none !important; } @media (max-width: 767px) { .visible-xs { display: block !important; } table.visible-xs { display: table !important; } tr.visible-xs { display: table-row !important; } th.visible-xs, td.visible-xs { display: table-cell !important; } } @media (max-width: 767px) { .visible-xs-block { display: block !important; } } @media (max-width: 767px) { .visible-xs-inline { display: inline !important; } } @media (max-width: 767px) { .visible-xs-inline-block { display: inline-block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm { display: block !important; } table.visible-sm { display: table !important; } tr.visible-sm { display: table-row !important; } th.visible-sm, td.visible-sm { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-block { display: block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline { display: inline !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline-block { display: inline-block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md { display: block !important; } table.visible-md { display: table !important; } tr.visible-md { display: table-row !important; } th.visible-md, td.visible-md { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-block { display: block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline { display: inline !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline-block { display: inline-block !important; } } @media (min-width: 1200px) { .visible-lg { display: block !important; } table.visible-lg { display: table !important; } tr.visible-lg { display: table-row !important; } th.visible-lg, td.visible-lg { display: table-cell !important; } } @media (min-width: 1200px) { .visible-lg-block { display: block !important; } } @media (min-width: 1200px) { .visible-lg-inline { display: inline !important; } } @media (min-width: 1200px) { .visible-lg-inline-block { display: inline-block !important; } } @media (max-width: 767px) { .hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-lg { display: none !important; } } .visible-print { display: none !important; } @media print { .visible-print { display: block !important; } table.visible-print { display: table !important; } tr.visible-print { display: table-row !important; } th.visible-print, td.visible-print { display: table-cell !important; } } .visible-print-block { display: none !important; } @media print { .visible-print-block { display: block !important; } } .visible-print-inline { display: none !important; } @media print { .visible-print-inline { display: inline !important; } } .visible-print-inline-block { display: none !important; } @media print { .visible-print-inline-block { display: inline-block !important; } } @media print { .hidden-print { display: none !important; } } .text-primary, .text-primary:hover { color: #2a9fd6; } .text-success, .text-success:hover { color: #77b300; } .text-danger, .text-danger:hover { color: #cc0000; } .text-warning, .text-warning:hover { color: #ff8800; } .text-info, .text-info:hover { color: #9933cc; } table, .table { color: #fff; } table a:not(.btn), .table a:not(.btn) { color: #fff; text-decoration: underline; } table .dropdown-menu a, .table .dropdown-menu a { text-decoration: none; } table .text-muted, .table .text-muted { color: #888888; } .table-responsive > .table { background-color: #181818; } .has-warning .help-block, .has-warning .control-label, .has-warning .form-control-feedback { color: #ff8800; } .has-warning .form-control, .has-warning .form-control:focus, .has-warning .input-group-addon { border-color: #ff8800; } .has-error .help-block, .has-error .control-label, .has-error .form-control-feedback { color: #cc0000; } .has-error .form-control, .has-error .form-control:focus, .has-error .input-group-addon { border-color: #cc0000; } .has-success .help-block, .has-success .control-label, .has-success .form-control-feedback { color: #77b300; } .has-success .form-control, .has-success .form-control:focus, .has-success .input-group-addon { border-color: #77b300; } legend { color: #fff; } .input-group-addon { background-color: #424242; } .nav-tabs a, .nav-pills a, .breadcrumb a, .pager a { color: #fff; } .alert .alert-link, .alert a { color: #ffffff; text-decoration: underline; } .alert .close { text-decoration: none; } .close { color: #fff; text-decoration: none; opacity: 0.4; } .close:hover, .close:focus { color: #fff; opacity: 1; } a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { border-color: #282828; } a.list-group-item.active, a.list-group-item.active:hover, a.list-group-item.active:focus { border-color: #282828; } a.list-group-item-success.active { background-color: #77b300; } a.list-group-item-success.active:hover, a.list-group-item-success.active:focus { background-color: #669a00; } a.list-group-item-warning.active { background-color: #ff8800; } a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus { background-color: #e67a00; } a.list-group-item-danger.active { background-color: #cc0000; } a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus { background-color: #b30000; } .jumbotron h1, .jumbotron h2, .jumbotron h3, .jumbotron h4, .jumbotron h5, .jumbotron h6 { color: #fff; } ================================================ FILE: resources/public/css/bootstrap-slider.css ================================================ /*! ======================================================= VERSION 6.0.10 ========================================================= */ /*! ========================================================= * bootstrap-slider.js * * Maintainers: * Kyle Kemp * - Twitter: @seiyria * - Github: seiyria * Rohit Kalkur * - Twitter: @Rovolutionary * - Github: rovolution * * ========================================================= * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ========================================================= */ .slider { display: inline-block; vertical-align: middle; position: relative; } .slider.slider-horizontal { width: 210px; height: 20px; } .slider.slider-horizontal .slider-track { height: 10px; width: 100%; margin-top: -5px; top: 50%; left: 0; } .slider.slider-horizontal .slider-selection, .slider.slider-horizontal .slider-track-low, .slider.slider-horizontal .slider-track-high { height: 100%; top: 0; bottom: 0; } .slider.slider-horizontal .slider-tick, .slider.slider-horizontal .slider-handle { margin-left: -10px; margin-top: -5px; } .slider.slider-horizontal .slider-tick.triangle, .slider.slider-horizontal .slider-handle.triangle { border-width: 0 10px 10px 10px; width: 0; height: 0; border-bottom-color: #0480be; margin-top: 0; } .slider.slider-horizontal .slider-tick-label-container { white-space: nowrap; margin-top: 20px; } .slider.slider-horizontal .slider-tick-label-container .slider-tick-label { padding-top: 4px; display: inline-block; text-align: center; } .slider.slider-vertical { height: 210px; width: 20px; } .slider.slider-vertical .slider-track { width: 10px; height: 100%; margin-left: -5px; left: 50%; top: 0; } .slider.slider-vertical .slider-selection { width: 100%; left: 0; top: 0; bottom: 0; } .slider.slider-vertical .slider-track-low, .slider.slider-vertical .slider-track-high { width: 100%; left: 0; right: 0; } .slider.slider-vertical .slider-tick, .slider.slider-vertical .slider-handle { margin-left: -5px; margin-top: -10px; } .slider.slider-vertical .slider-tick.triangle, .slider.slider-vertical .slider-handle.triangle { border-width: 10px 0 10px 10px; width: 1px; height: 1px; border-left-color: #0480be; margin-left: 0; } .slider.slider-vertical .slider-tick-label-container { white-space: nowrap; } .slider.slider-vertical .slider-tick-label-container .slider-tick-label { padding-left: 4px; } .slider.slider-disabled .slider-handle { background-image: -webkit-linear-gradient(top, #dfdfdf 0%, #bebebe 100%); background-image: -o-linear-gradient(top, #dfdfdf 0%, #bebebe 100%); background-image: linear-gradient(to bottom, #dfdfdf 0%, #bebebe 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdfdfdf', endColorstr='#ffbebebe', GradientType=0); } .slider.slider-disabled .slider-track { background-image: -webkit-linear-gradient(top, #e5e5e5 0%, #e9e9e9 100%); background-image: -o-linear-gradient(top, #e5e5e5 0%, #e9e9e9 100%); background-image: linear-gradient(to bottom, #e5e5e5 0%, #e9e9e9 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe5e5e5', endColorstr='#ffe9e9e9', GradientType=0); cursor: not-allowed; } .slider input { display: none; } .slider .tooltip.top { margin-top: -36px; } .slider .tooltip-inner { white-space: nowrap; } .slider .hide { display: none; } .slider-track { position: absolute; cursor: pointer; background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #f9f9f9 100%); background-image: -o-linear-gradient(top, #f5f5f5 0%, #f9f9f9 100%); background-image: linear-gradient(to bottom, #f5f5f5 0%, #f9f9f9 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); border-radius: 4px; } .slider-selection { position: absolute; background-image: -webkit-linear-gradient(top, #f9f9f9 0%, #f5f5f5 100%); background-image: -o-linear-gradient(top, #f9f9f9 0%, #f5f5f5 100%); background-image: linear-gradient(to bottom, #f9f9f9 0%, #f5f5f5 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9', endColorstr='#fff5f5f5', GradientType=0); -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; border-radius: 4px; } .slider-selection.tick-slider-selection { background-image: -webkit-linear-gradient(top, #89cdef 0%, #81bfde 100%); background-image: -o-linear-gradient(top, #89cdef 0%, #81bfde 100%); background-image: linear-gradient(to bottom, #89cdef 0%, #81bfde 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff89cdef', endColorstr='#ff81bfde', GradientType=0); } .slider-track-low, .slider-track-high { position: absolute; background: transparent; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; border-radius: 4px; } .slider-handle { position: absolute; width: 20px; height: 20px; background-color: #337ab7; background-image: -webkit-linear-gradient(top, #149bdf 0%, #0480be 100%); background-image: -o-linear-gradient(top, #149bdf 0%, #0480be 100%); background-image: linear-gradient(to bottom, #149bdf 0%, #0480be 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); filter: none; -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); border: 0px solid transparent; } .slider-handle.round { border-radius: 50%; } .slider-handle.triangle { background: transparent none; } .slider-handle.custom { background: transparent none; } .slider-handle.custom::before { line-height: 20px; font-size: 20px; content: '\2605'; color: #726204; } .slider-tick { position: absolute; width: 20px; height: 20px; background-image: -webkit-linear-gradient(top, #f9f9f9 0%, #f5f5f5 100%); background-image: -o-linear-gradient(top, #f9f9f9 0%, #f5f5f5 100%); background-image: linear-gradient(to bottom, #f9f9f9 0%, #f5f5f5 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9', endColorstr='#fff5f5f5', GradientType=0); -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; filter: none; opacity: 0.8; border: 0px solid transparent; } .slider-tick.round { border-radius: 50%; } .slider-tick.triangle { background: transparent none; } .slider-tick.custom { background: transparent none; } .slider-tick.custom::before { line-height: 20px; font-size: 20px; content: '\2605'; color: #726204; } .slider-tick.in-selection { background-image: -webkit-linear-gradient(top, #89cdef 0%, #81bfde 100%); background-image: -o-linear-gradient(top, #89cdef 0%, #81bfde 100%); background-image: linear-gradient(to bottom, #89cdef 0%, #81bfde 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff89cdef', endColorstr='#ff81bfde', GradientType=0); opacity: 1; } ================================================ FILE: resources/public/css/bootstrap-switch.css ================================================ /* ======================================================================== * bootstrap-switch - v3.3.2 * http://www.bootstrap-switch.org * ======================================================================== * Copyright 2012-2013 Mattia Larentis * * ======================================================================== * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ======================================================================== */ .bootstrap-switch { display: inline-block; direction: ltr; cursor: pointer; border-radius: 4px; border: 1px solid; border-color: #cccccc; position: relative; text-align: left; overflow: hidden; line-height: 8px; z-index: 0; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; vertical-align: middle; -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } .bootstrap-switch .bootstrap-switch-container { display: inline-block; top: 0; border-radius: 4px; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } .bootstrap-switch .bootstrap-switch-handle-on, .bootstrap-switch .bootstrap-switch-handle-off, .bootstrap-switch .bootstrap-switch-label { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; cursor: pointer; display: inline-block !important; height: 100%; padding: 6px 12px; font-size: 14px; line-height: 20px; } .bootstrap-switch .bootstrap-switch-handle-on, .bootstrap-switch .bootstrap-switch-handle-off { text-align: center; z-index: 1; } .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary, .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary { color: #fff; background: #337ab7; } .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info, .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info { color: #fff; background: #5bc0de; } .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success, .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success { color: #fff; background: #5cb85c; } .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning, .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning { background: #f0ad4e; color: #fff; } .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger, .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger { color: #fff; background: #d9534f; } .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default, .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default { color: #000; background: #eeeeee; } .bootstrap-switch .bootstrap-switch-label { text-align: center; margin-top: -1px; margin-bottom: -1px; z-index: 100; color: #333333; background: #ffffff; } .bootstrap-switch .bootstrap-switch-handle-on { border-bottom-left-radius: 3px; border-top-left-radius: 3px; } .bootstrap-switch .bootstrap-switch-handle-off { border-bottom-right-radius: 3px; border-top-right-radius: 3px; } .bootstrap-switch input[type='radio'], .bootstrap-switch input[type='checkbox'] { position: absolute !important; top: 0; left: 0; margin: 0; z-index: -1; opacity: 0; filter: alpha(opacity=0); } .bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-on, .bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-off, .bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-label { padding: 1px 5px; font-size: 12px; line-height: 1.5; } .bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-on, .bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-off, .bootstrap-switch.bootstrap-switch-small .bootstrap-switch-label { padding: 5px 10px; font-size: 12px; line-height: 1.5; } .bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-on, .bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-off, .bootstrap-switch.bootstrap-switch-large .bootstrap-switch-label { padding: 6px 16px; font-size: 18px; line-height: 1.3333333; } .bootstrap-switch.bootstrap-switch-disabled, .bootstrap-switch.bootstrap-switch-readonly, .bootstrap-switch.bootstrap-switch-indeterminate { cursor: default !important; } .bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-on, .bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-on, .bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-on, .bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-off, .bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-off, .bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-off, .bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-label, .bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-label, .bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-label { opacity: 0.5; filter: alpha(opacity=50); cursor: default !important; } .bootstrap-switch.bootstrap-switch-animate .bootstrap-switch-container { -webkit-transition: margin-left 0.5s; -o-transition: margin-left 0.5s; transition: margin-left 0.5s; } .bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-on { border-bottom-left-radius: 0; border-top-left-radius: 0; border-bottom-right-radius: 3px; border-top-right-radius: 3px; } .bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-off { border-bottom-right-radius: 0; border-top-right-radius: 0; border-bottom-left-radius: 3px; border-top-left-radius: 3px; } .bootstrap-switch.bootstrap-switch-focused { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); } .bootstrap-switch.bootstrap-switch-on .bootstrap-switch-label, .bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-off .bootstrap-switch-label { border-bottom-right-radius: 3px; border-top-right-radius: 3px; } .bootstrap-switch.bootstrap-switch-off .bootstrap-switch-label, .bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-on .bootstrap-switch-label { border-bottom-left-radius: 3px; border-top-left-radius: 3px; } ================================================ FILE: resources/public/css/bootstrap-theme.css ================================================ /*! * Bootstrap v3.3.5 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ .btn-default, .btn-primary, .btn-success, .btn-info, .btn-warning, .btn-danger { text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); } .btn-default:active, .btn-primary:active, .btn-success:active, .btn-info:active, .btn-warning:active, .btn-danger:active, .btn-default.active, .btn-primary.active, .btn-success.active, .btn-info.active, .btn-warning.active, .btn-danger.active { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); } .btn-default.disabled, .btn-primary.disabled, .btn-success.disabled, .btn-info.disabled, .btn-warning.disabled, .btn-danger.disabled, .btn-default[disabled], .btn-primary[disabled], .btn-success[disabled], .btn-info[disabled], .btn-warning[disabled], .btn-danger[disabled], fieldset[disabled] .btn-default, fieldset[disabled] .btn-primary, fieldset[disabled] .btn-success, fieldset[disabled] .btn-info, fieldset[disabled] .btn-warning, fieldset[disabled] .btn-danger { -webkit-box-shadow: none; box-shadow: none; } .btn-default .badge, .btn-primary .badge, .btn-success .badge, .btn-info .badge, .btn-warning .badge, .btn-danger .badge { text-shadow: none; } .btn:active, .btn.active { background-image: none; } .btn-default { text-shadow: 0 1px 0 #fff; background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #dbdbdb; border-color: #ccc; } .btn-default:hover, .btn-default:focus { background-color: #e0e0e0; background-position: 0 -15px; } .btn-default:active, .btn-default.active { background-color: #e0e0e0; border-color: #dbdbdb; } .btn-default.disabled, .btn-default[disabled], fieldset[disabled] .btn-default, .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus, .btn-default.disabled:active, .btn-default[disabled]:active, fieldset[disabled] .btn-default:active, .btn-default.disabled.active, .btn-default[disabled].active, fieldset[disabled] .btn-default.active { background-color: #e0e0e0; background-image: none; } .btn-primary { background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #245580; } .btn-primary:hover, .btn-primary:focus { background-color: #265a88; background-position: 0 -15px; } .btn-primary:active, .btn-primary.active { background-color: #265a88; border-color: #245580; } .btn-primary.disabled, .btn-primary[disabled], fieldset[disabled] .btn-primary, .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled.focus, .btn-primary[disabled].focus, fieldset[disabled] .btn-primary.focus, .btn-primary.disabled:active, .btn-primary[disabled]:active, fieldset[disabled] .btn-primary:active, .btn-primary.disabled.active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary.active { background-color: #265a88; background-image: none; } .btn-success { background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #3e8f3e; } .btn-success:hover, .btn-success:focus { background-color: #419641; background-position: 0 -15px; } .btn-success:active, .btn-success.active { background-color: #419641; border-color: #3e8f3e; } .btn-success.disabled, .btn-success[disabled], fieldset[disabled] .btn-success, .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled.focus, .btn-success[disabled].focus, fieldset[disabled] .btn-success.focus, .btn-success.disabled:active, .btn-success[disabled]:active, fieldset[disabled] .btn-success:active, .btn-success.disabled.active, .btn-success[disabled].active, fieldset[disabled] .btn-success.active { background-color: #419641; background-image: none; } .btn-info { background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #28a4c9; } .btn-info:hover, .btn-info:focus { background-color: #2aabd2; background-position: 0 -15px; } .btn-info:active, .btn-info.active { background-color: #2aabd2; border-color: #28a4c9; } .btn-info.disabled, .btn-info[disabled], fieldset[disabled] .btn-info, .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled.focus, .btn-info[disabled].focus, fieldset[disabled] .btn-info.focus, .btn-info.disabled:active, .btn-info[disabled]:active, fieldset[disabled] .btn-info:active, .btn-info.disabled.active, .btn-info[disabled].active, fieldset[disabled] .btn-info.active { background-color: #2aabd2; background-image: none; } .btn-warning { background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #e38d13; } .btn-warning:hover, .btn-warning:focus { background-color: #eb9316; background-position: 0 -15px; } .btn-warning:active, .btn-warning.active { background-color: #eb9316; border-color: #e38d13; } .btn-warning.disabled, .btn-warning[disabled], fieldset[disabled] .btn-warning, .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled.focus, .btn-warning[disabled].focus, fieldset[disabled] .btn-warning.focus, .btn-warning.disabled:active, .btn-warning[disabled]:active, fieldset[disabled] .btn-warning:active, .btn-warning.disabled.active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning.active { background-color: #eb9316; background-image: none; } .btn-danger { background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #b92c28; } .btn-danger:hover, .btn-danger:focus { background-color: #c12e2a; background-position: 0 -15px; } .btn-danger:active, .btn-danger.active { background-color: #c12e2a; border-color: #b92c28; } .btn-danger.disabled, .btn-danger[disabled], fieldset[disabled] .btn-danger, .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled.focus, .btn-danger[disabled].focus, fieldset[disabled] .btn-danger.focus, .btn-danger.disabled:active, .btn-danger[disabled]:active, fieldset[disabled] .btn-danger:active, .btn-danger.disabled.active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger.active { background-color: #c12e2a; background-image: none; } .thumbnail, .img-thumbnail { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); box-shadow: 0 1px 2px rgba(0, 0, 0, .075); } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { background-color: #e8e8e8; background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); background-repeat: repeat-x; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { background-color: #2e6da4; background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); background-repeat: repeat-x; } .navbar-default { background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-radius: 4px; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .active > a { background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); background-repeat: repeat-x; -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); } .navbar-brand, .navbar-nav > li > a { text-shadow: 0 1px 0 rgba(255, 255, 255, .25); } .navbar-inverse { background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-radius: 4px; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .active > a { background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); background-repeat: repeat-x; -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); } .navbar-inverse .navbar-brand, .navbar-inverse .navbar-nav > li > a { text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); } .navbar-static-top, .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } @media (max-width: 767px) { .navbar .navbar-nav .open .dropdown-menu > .active > a, .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { color: #fff; background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); background-repeat: repeat-x; } } .alert { text-shadow: 0 1px 0 rgba(255, 255, 255, .2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); } .alert-success { background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); background-repeat: repeat-x; border-color: #b2dba1; } .alert-info { background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); background-repeat: repeat-x; border-color: #9acfea; } .alert-warning { background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); background-repeat: repeat-x; border-color: #f5e79e; } .alert-danger { background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); background-repeat: repeat-x; border-color: #dca7a7; } .progress { background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); background-repeat: repeat-x; } .progress-bar { background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); background-repeat: repeat-x; } .progress-bar-success { background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); background-repeat: repeat-x; } .progress-bar-info { background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); background-repeat: repeat-x; } .progress-bar-warning { background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); background-repeat: repeat-x; } .progress-bar-danger { background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); background-repeat: repeat-x; } .progress-bar-striped { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } .list-group { border-radius: 4px; -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); box-shadow: 0 1px 2px rgba(0, 0, 0, .075); } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { text-shadow: 0 -1px 0 #286090; background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); background-repeat: repeat-x; border-color: #2b669a; } .list-group-item.active .badge, .list-group-item.active:hover .badge, .list-group-item.active:focus .badge { text-shadow: none; } .panel { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); box-shadow: 0 1px 2px rgba(0, 0, 0, .05); } .panel-default > .panel-heading { background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); background-repeat: repeat-x; } .panel-primary > .panel-heading { background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); background-repeat: repeat-x; } .panel-success > .panel-heading { background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); background-repeat: repeat-x; } .panel-info > .panel-heading { background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); background-repeat: repeat-x; } .panel-warning > .panel-heading { background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); background-repeat: repeat-x; } .panel-danger > .panel-heading { background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); background-repeat: repeat-x; } .well { background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); background-repeat: repeat-x; border-color: #dcdcdc; -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); } /*# sourceMappingURL=bootstrap-theme.css.map */ ================================================ FILE: resources/public/css/bootstrap.css ================================================ /*! * Bootstrap v3.3.5 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ html { font-family: sans-serif; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } body { margin: 0; } article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { display: block; } audio, canvas, progress, video { display: inline-block; vertical-align: baseline; } audio:not([controls]) { display: none; height: 0; } [hidden], template { display: none; } a { background-color: transparent; } a:active, a:hover { outline: 0; } abbr[title] { border-bottom: 1px dotted; } b, strong { font-weight: bold; } dfn { font-style: italic; } h1 { margin: .67em 0; font-size: 2em; } mark { color: #000; background: #ff0; } small { font-size: 80%; } sub, sup { position: relative; font-size: 75%; line-height: 0; vertical-align: baseline; } sup { top: -.5em; } sub { bottom: -.25em; } img { border: 0; } svg:not(:root) { overflow: hidden; } figure { margin: 1em 40px; } hr { height: 0; -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; } pre { overflow: auto; } code, kbd, pre, samp { font-family: monospace, monospace; font-size: 1em; } button, input, optgroup, select, textarea { margin: 0; font: inherit; color: inherit; } button { overflow: visible; } button, select { text-transform: none; } button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; cursor: pointer; } button[disabled], html input[disabled] { cursor: default; } button::-moz-focus-inner, input::-moz-focus-inner { padding: 0; border: 0; } input { line-height: normal; } input[type="checkbox"], input[type="radio"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; padding: 0; } input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { height: auto; } input[type="search"] { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; -webkit-appearance: textfield; } input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } fieldset { padding: .35em .625em .75em; margin: 0 2px; border: 1px solid #c0c0c0; } legend { padding: 0; border: 0; } textarea { overflow: auto; } optgroup { font-weight: bold; } table { border-spacing: 0; border-collapse: collapse; } td, th { padding: 0; } /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ @media print { *, *:before, *:after { color: #000 !important; text-shadow: none !important; background: transparent !important; -webkit-box-shadow: none !important; box-shadow: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } a[href^="#"]:after, a[href^="javascript:"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } thead { display: table-header-group; } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } .navbar { display: none; } .btn > .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px solid #000; } .table { border-collapse: collapse !important; } .table td, .table th { background-color: #fff !important; } .table-bordered th, .table-bordered td { border: 1px solid #ddd !important; } } @font-face { font-family: 'Glyphicons Halflings'; src: url('../fonts/glyphicons-halflings-regular.eot'); src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); } .glyphicon { position: relative; top: 1px; display: inline-block; font-family: 'Glyphicons Halflings'; font-style: normal; font-weight: normal; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .glyphicon-asterisk:before { content: "\2a"; } .glyphicon-plus:before { content: "\2b"; } .glyphicon-euro:before, .glyphicon-eur:before { content: "\20ac"; } .glyphicon-minus:before { content: "\2212"; } .glyphicon-cloud:before { content: "\2601"; } .glyphicon-envelope:before { content: "\2709"; } .glyphicon-pencil:before { content: "\270f"; } .glyphicon-glass:before { content: "\e001"; } .glyphicon-music:before { content: "\e002"; } .glyphicon-search:before { content: "\e003"; } .glyphicon-heart:before { content: "\e005"; } .glyphicon-star:before { content: "\e006"; } .glyphicon-star-empty:before { content: "\e007"; } .glyphicon-user:before { content: "\e008"; } .glyphicon-film:before { content: "\e009"; } .glyphicon-th-large:before { content: "\e010"; } .glyphicon-th:before { content: "\e011"; } .glyphicon-th-list:before { content: "\e012"; } .glyphicon-ok:before { content: "\e013"; } .glyphicon-remove:before { content: "\e014"; } .glyphicon-zoom-in:before { content: "\e015"; } .glyphicon-zoom-out:before { content: "\e016"; } .glyphicon-off:before { content: "\e017"; } .glyphicon-signal:before { content: "\e018"; } .glyphicon-cog:before { content: "\e019"; } .glyphicon-trash:before { content: "\e020"; } .glyphicon-home:before { content: "\e021"; } .glyphicon-file:before { content: "\e022"; } .glyphicon-time:before { content: "\e023"; } .glyphicon-road:before { content: "\e024"; } .glyphicon-download-alt:before { content: "\e025"; } .glyphicon-download:before { content: "\e026"; } .glyphicon-upload:before { content: "\e027"; } .glyphicon-inbox:before { content: "\e028"; } .glyphicon-play-circle:before { content: "\e029"; } .glyphicon-repeat:before { content: "\e030"; } .glyphicon-refresh:before { content: "\e031"; } .glyphicon-list-alt:before { content: "\e032"; } .glyphicon-lock:before { content: "\e033"; } .glyphicon-flag:before { content: "\e034"; } .glyphicon-headphones:before { content: "\e035"; } .glyphicon-volume-off:before { content: "\e036"; } .glyphicon-volume-down:before { content: "\e037"; } .glyphicon-volume-up:before { content: "\e038"; } .glyphicon-qrcode:before { content: "\e039"; } .glyphicon-barcode:before { content: "\e040"; } .glyphicon-tag:before { content: "\e041"; } .glyphicon-tags:before { content: "\e042"; } .glyphicon-book:before { content: "\e043"; } .glyphicon-bookmark:before { content: "\e044"; } .glyphicon-print:before { content: "\e045"; } .glyphicon-camera:before { content: "\e046"; } .glyphicon-font:before { content: "\e047"; } .glyphicon-bold:before { content: "\e048"; } .glyphicon-italic:before { content: "\e049"; } .glyphicon-text-height:before { content: "\e050"; } .glyphicon-text-width:before { content: "\e051"; } .glyphicon-align-left:before { content: "\e052"; } .glyphicon-align-center:before { content: "\e053"; } .glyphicon-align-right:before { content: "\e054"; } .glyphicon-align-justify:before { content: "\e055"; } .glyphicon-list:before { content: "\e056"; } .glyphicon-indent-left:before { content: "\e057"; } .glyphicon-indent-right:before { content: "\e058"; } .glyphicon-facetime-video:before { content: "\e059"; } .glyphicon-picture:before { content: "\e060"; } .glyphicon-map-marker:before { content: "\e062"; } .glyphicon-adjust:before { content: "\e063"; } .glyphicon-tint:before { content: "\e064"; } .glyphicon-edit:before { content: "\e065"; } .glyphicon-share:before { content: "\e066"; } .glyphicon-check:before { content: "\e067"; } .glyphicon-move:before { content: "\e068"; } .glyphicon-step-backward:before { content: "\e069"; } .glyphicon-fast-backward:before { content: "\e070"; } .glyphicon-backward:before { content: "\e071"; } .glyphicon-play:before { content: "\e072"; } .glyphicon-pause:before { content: "\e073"; } .glyphicon-stop:before { content: "\e074"; } .glyphicon-forward:before { content: "\e075"; } .glyphicon-fast-forward:before { content: "\e076"; } .glyphicon-step-forward:before { content: "\e077"; } .glyphicon-eject:before { content: "\e078"; } .glyphicon-chevron-left:before { content: "\e079"; } .glyphicon-chevron-right:before { content: "\e080"; } .glyphicon-plus-sign:before { content: "\e081"; } .glyphicon-minus-sign:before { content: "\e082"; } .glyphicon-remove-sign:before { content: "\e083"; } .glyphicon-ok-sign:before { content: "\e084"; } .glyphicon-question-sign:before { content: "\e085"; } .glyphicon-info-sign:before { content: "\e086"; } .glyphicon-screenshot:before { content: "\e087"; } .glyphicon-remove-circle:before { content: "\e088"; } .glyphicon-ok-circle:before { content: "\e089"; } .glyphicon-ban-circle:before { content: "\e090"; } .glyphicon-arrow-left:before { content: "\e091"; } .glyphicon-arrow-right:before { content: "\e092"; } .glyphicon-arrow-up:before { content: "\e093"; } .glyphicon-arrow-down:before { content: "\e094"; } .glyphicon-share-alt:before { content: "\e095"; } .glyphicon-resize-full:before { content: "\e096"; } .glyphicon-resize-small:before { content: "\e097"; } .glyphicon-exclamation-sign:before { content: "\e101"; } .glyphicon-gift:before { content: "\e102"; } .glyphicon-leaf:before { content: "\e103"; } .glyphicon-fire:before { content: "\e104"; } .glyphicon-eye-open:before { content: "\e105"; } .glyphicon-eye-close:before { content: "\e106"; } .glyphicon-warning-sign:before { content: "\e107"; } .glyphicon-plane:before { content: "\e108"; } .glyphicon-calendar:before { content: "\e109"; } .glyphicon-random:before { content: "\e110"; } .glyphicon-comment:before { content: "\e111"; } .glyphicon-magnet:before { content: "\e112"; } .glyphicon-chevron-up:before { content: "\e113"; } .glyphicon-chevron-down:before { content: "\e114"; } .glyphicon-retweet:before { content: "\e115"; } .glyphicon-shopping-cart:before { content: "\e116"; } .glyphicon-folder-close:before { content: "\e117"; } .glyphicon-folder-open:before { content: "\e118"; } .glyphicon-resize-vertical:before { content: "\e119"; } .glyphicon-resize-horizontal:before { content: "\e120"; } .glyphicon-hdd:before { content: "\e121"; } .glyphicon-bullhorn:before { content: "\e122"; } .glyphicon-bell:before { content: "\e123"; } .glyphicon-certificate:before { content: "\e124"; } .glyphicon-thumbs-up:before { content: "\e125"; } .glyphicon-thumbs-down:before { content: "\e126"; } .glyphicon-hand-right:before { content: "\e127"; } .glyphicon-hand-left:before { content: "\e128"; } .glyphicon-hand-up:before { content: "\e129"; } .glyphicon-hand-down:before { content: "\e130"; } .glyphicon-circle-arrow-right:before { content: "\e131"; } .glyphicon-circle-arrow-left:before { content: "\e132"; } .glyphicon-circle-arrow-up:before { content: "\e133"; } .glyphicon-circle-arrow-down:before { content: "\e134"; } .glyphicon-globe:before { content: "\e135"; } .glyphicon-wrench:before { content: "\e136"; } .glyphicon-tasks:before { content: "\e137"; } .glyphicon-filter:before { content: "\e138"; } .glyphicon-briefcase:before { content: "\e139"; } .glyphicon-fullscreen:before { content: "\e140"; } .glyphicon-dashboard:before { content: "\e141"; } .glyphicon-paperclip:before { content: "\e142"; } .glyphicon-heart-empty:before { content: "\e143"; } .glyphicon-link:before { content: "\e144"; } .glyphicon-phone:before { content: "\e145"; } .glyphicon-pushpin:before { content: "\e146"; } .glyphicon-usd:before { content: "\e148"; } .glyphicon-gbp:before { content: "\e149"; } .glyphicon-sort:before { content: "\e150"; } .glyphicon-sort-by-alphabet:before { content: "\e151"; } .glyphicon-sort-by-alphabet-alt:before { content: "\e152"; } .glyphicon-sort-by-order:before { content: "\e153"; } .glyphicon-sort-by-order-alt:before { content: "\e154"; } .glyphicon-sort-by-attributes:before { content: "\e155"; } .glyphicon-sort-by-attributes-alt:before { content: "\e156"; } .glyphicon-unchecked:before { content: "\e157"; } .glyphicon-expand:before { content: "\e158"; } .glyphicon-collapse-down:before { content: "\e159"; } .glyphicon-collapse-up:before { content: "\e160"; } .glyphicon-log-in:before { content: "\e161"; } .glyphicon-flash:before { content: "\e162"; } .glyphicon-log-out:before { content: "\e163"; } .glyphicon-new-window:before { content: "\e164"; } .glyphicon-record:before { content: "\e165"; } .glyphicon-save:before { content: "\e166"; } .glyphicon-open:before { content: "\e167"; } .glyphicon-saved:before { content: "\e168"; } .glyphicon-import:before { content: "\e169"; } .glyphicon-export:before { content: "\e170"; } .glyphicon-send:before { content: "\e171"; } .glyphicon-floppy-disk:before { content: "\e172"; } .glyphicon-floppy-saved:before { content: "\e173"; } .glyphicon-floppy-remove:before { content: "\e174"; } .glyphicon-floppy-save:before { content: "\e175"; } .glyphicon-floppy-open:before { content: "\e176"; } .glyphicon-credit-card:before { content: "\e177"; } .glyphicon-transfer:before { content: "\e178"; } .glyphicon-cutlery:before { content: "\e179"; } .glyphicon-header:before { content: "\e180"; } .glyphicon-compressed:before { content: "\e181"; } .glyphicon-earphone:before { content: "\e182"; } .glyphicon-phone-alt:before { content: "\e183"; } .glyphicon-tower:before { content: "\e184"; } .glyphicon-stats:before { content: "\e185"; } .glyphicon-sd-video:before { content: "\e186"; } .glyphicon-hd-video:before { content: "\e187"; } .glyphicon-subtitles:before { content: "\e188"; } .glyphicon-sound-stereo:before { content: "\e189"; } .glyphicon-sound-dolby:before { content: "\e190"; } .glyphicon-sound-5-1:before { content: "\e191"; } .glyphicon-sound-6-1:before { content: "\e192"; } .glyphicon-sound-7-1:before { content: "\e193"; } .glyphicon-copyright-mark:before { content: "\e194"; } .glyphicon-registration-mark:before { content: "\e195"; } .glyphicon-cloud-download:before { content: "\e197"; } .glyphicon-cloud-upload:before { content: "\e198"; } .glyphicon-tree-conifer:before { content: "\e199"; } .glyphicon-tree-deciduous:before { content: "\e200"; } .glyphicon-cd:before { content: "\e201"; } .glyphicon-save-file:before { content: "\e202"; } .glyphicon-open-file:before { content: "\e203"; } .glyphicon-level-up:before { content: "\e204"; } .glyphicon-copy:before { content: "\e205"; } .glyphicon-paste:before { content: "\e206"; } .glyphicon-alert:before { content: "\e209"; } .glyphicon-equalizer:before { content: "\e210"; } .glyphicon-king:before { content: "\e211"; } .glyphicon-queen:before { content: "\e212"; } .glyphicon-pawn:before { content: "\e213"; } .glyphicon-bishop:before { content: "\e214"; } .glyphicon-knight:before { content: "\e215"; } .glyphicon-baby-formula:before { content: "\e216"; } .glyphicon-tent:before { content: "\26fa"; } .glyphicon-blackboard:before { content: "\e218"; } .glyphicon-bed:before { content: "\e219"; } .glyphicon-apple:before { content: "\f8ff"; } .glyphicon-erase:before { content: "\e221"; } .glyphicon-hourglass:before { content: "\231b"; } .glyphicon-lamp:before { content: "\e223"; } .glyphicon-duplicate:before { content: "\e224"; } .glyphicon-piggy-bank:before { content: "\e225"; } .glyphicon-scissors:before { content: "\e226"; } .glyphicon-bitcoin:before { content: "\e227"; } .glyphicon-btc:before { content: "\e227"; } .glyphicon-xbt:before { content: "\e227"; } .glyphicon-yen:before { content: "\00a5"; } .glyphicon-jpy:before { content: "\00a5"; } .glyphicon-ruble:before { content: "\20bd"; } .glyphicon-rub:before { content: "\20bd"; } .glyphicon-scale:before { content: "\e230"; } .glyphicon-ice-lolly:before { content: "\e231"; } .glyphicon-ice-lolly-tasted:before { content: "\e232"; } .glyphicon-education:before { content: "\e233"; } .glyphicon-option-horizontal:before { content: "\e234"; } .glyphicon-option-vertical:before { content: "\e235"; } .glyphicon-menu-hamburger:before { content: "\e236"; } .glyphicon-modal-window:before { content: "\e237"; } .glyphicon-oil:before { content: "\e238"; } .glyphicon-grain:before { content: "\e239"; } .glyphicon-sunglasses:before { content: "\e240"; } .glyphicon-text-size:before { content: "\e241"; } .glyphicon-text-color:before { content: "\e242"; } .glyphicon-text-background:before { content: "\e243"; } .glyphicon-object-align-top:before { content: "\e244"; } .glyphicon-object-align-bottom:before { content: "\e245"; } .glyphicon-object-align-horizontal:before { content: "\e246"; } .glyphicon-object-align-left:before { content: "\e247"; } .glyphicon-object-align-vertical:before { content: "\e248"; } .glyphicon-object-align-right:before { content: "\e249"; } .glyphicon-triangle-right:before { content: "\e250"; } .glyphicon-triangle-left:before { content: "\e251"; } .glyphicon-triangle-bottom:before { content: "\e252"; } .glyphicon-triangle-top:before { content: "\e253"; } .glyphicon-console:before { content: "\e254"; } .glyphicon-superscript:before { content: "\e255"; } .glyphicon-subscript:before { content: "\e256"; } .glyphicon-menu-left:before { content: "\e257"; } .glyphicon-menu-right:before { content: "\e258"; } .glyphicon-menu-down:before { content: "\e259"; } .glyphicon-menu-up:before { content: "\e260"; } * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } html { font-size: 10px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.42857143; color: #333; background-color: #fff; } input, button, select, textarea { font-family: inherit; font-size: inherit; line-height: inherit; } a { color: #337ab7; text-decoration: none; } a:hover, a:focus { color: #23527c; text-decoration: underline; } a:focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } figure { margin: 0; } img { vertical-align: middle; } .img-responsive, .thumbnail > img, .thumbnail a > img, .carousel-inner > .item > img, .carousel-inner > .item > a > img { display: block; max-width: 100%; height: auto; } .img-rounded { border-radius: 6px; } .img-thumbnail { display: inline-block; max-width: 100%; height: auto; padding: 4px; line-height: 1.42857143; background-color: #fff; border: 1px solid #ddd; border-radius: 4px; -webkit-transition: all .2s ease-in-out; -o-transition: all .2s ease-in-out; transition: all .2s ease-in-out; } .img-circle { border-radius: 50%; } hr { margin-top: 20px; margin-bottom: 20px; border: 0; border-top: 1px solid #eee; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } .sr-only-focusable:active, .sr-only-focusable:focus { position: static; width: auto; height: auto; margin: 0; overflow: visible; clip: auto; } [role="button"] { cursor: pointer; } h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { font-family: inherit; font-weight: 500; line-height: 1.1; color: inherit; } h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small, h1 .small, h2 .small, h3 .small, h4 .small, h5 .small, h6 .small, .h1 .small, .h2 .small, .h3 .small, .h4 .small, .h5 .small, .h6 .small { font-weight: normal; line-height: 1; color: #777; } h1, .h1, h2, .h2, h3, .h3 { margin-top: 20px; margin-bottom: 10px; } h1 small, .h1 small, h2 small, .h2 small, h3 small, .h3 small, h1 .small, .h1 .small, h2 .small, .h2 .small, h3 .small, .h3 .small { font-size: 65%; } h4, .h4, h5, .h5, h6, .h6 { margin-top: 10px; margin-bottom: 10px; } h4 small, .h4 small, h5 small, .h5 small, h6 small, .h6 small, h4 .small, .h4 .small, h5 .small, .h5 .small, h6 .small, .h6 .small { font-size: 75%; } h1, .h1 { font-size: 36px; } h2, .h2 { font-size: 30px; } h3, .h3 { font-size: 24px; } h4, .h4 { font-size: 18px; } h5, .h5 { font-size: 14px; } h6, .h6 { font-size: 12px; } p { margin: 0 0 10px; } .lead { margin-bottom: 20px; font-size: 16px; font-weight: 300; line-height: 1.4; } @media (min-width: 768px) { .lead { font-size: 21px; } } small, .small { font-size: 85%; } mark, .mark { padding: .2em; background-color: #fcf8e3; } .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } .text-justify { text-align: justify; } .text-nowrap { white-space: nowrap; } .text-lowercase { text-transform: lowercase; } .text-uppercase { text-transform: uppercase; } .text-capitalize { text-transform: capitalize; } .text-muted { color: #777; } .text-primary { color: #337ab7; } a.text-primary:hover, a.text-primary:focus { color: #286090; } .text-success { color: #3c763d; } a.text-success:hover, a.text-success:focus { color: #2b542c; } .text-info { color: #31708f; } a.text-info:hover, a.text-info:focus { color: #245269; } .text-warning { color: #8a6d3b; } a.text-warning:hover, a.text-warning:focus { color: #66512c; } .text-danger { color: #a94442; } a.text-danger:hover, a.text-danger:focus { color: #843534; } .bg-primary { color: #fff; background-color: #337ab7; } a.bg-primary:hover, a.bg-primary:focus { background-color: #286090; } .bg-success { background-color: #dff0d8; } a.bg-success:hover, a.bg-success:focus { background-color: #c1e2b3; } .bg-info { background-color: #d9edf7; } a.bg-info:hover, a.bg-info:focus { background-color: #afd9ee; } .bg-warning { background-color: #fcf8e3; } a.bg-warning:hover, a.bg-warning:focus { background-color: #f7ecb5; } .bg-danger { background-color: #f2dede; } a.bg-danger:hover, a.bg-danger:focus { background-color: #e4b9b9; } .page-header { padding-bottom: 9px; margin: 40px 0 20px; border-bottom: 1px solid #eee; } ul, ol { margin-top: 0; margin-bottom: 10px; } ul ul, ol ul, ul ol, ol ol { margin-bottom: 0; } .list-unstyled { padding-left: 0; list-style: none; } .list-inline { padding-left: 0; margin-left: -5px; list-style: none; } .list-inline > li { display: inline-block; padding-right: 5px; padding-left: 5px; } dl { margin-top: 0; margin-bottom: 20px; } dt, dd { line-height: 1.42857143; } dt { font-weight: bold; } dd { margin-left: 0; } @media (min-width: 768px) { .dl-horizontal dt { float: left; width: 160px; overflow: hidden; clear: left; text-align: right; text-overflow: ellipsis; white-space: nowrap; } .dl-horizontal dd { margin-left: 180px; } } abbr[title], abbr[data-original-title] { cursor: help; border-bottom: 1px dotted #777; } .initialism { font-size: 90%; text-transform: uppercase; } blockquote { padding: 10px 20px; margin: 0 0 20px; font-size: 17.5px; border-left: 5px solid #eee; } blockquote p:last-child, blockquote ul:last-child, blockquote ol:last-child { margin-bottom: 0; } blockquote footer, blockquote small, blockquote .small { display: block; font-size: 80%; line-height: 1.42857143; color: #777; } blockquote footer:before, blockquote small:before, blockquote .small:before { content: '\2014 \00A0'; } .blockquote-reverse, blockquote.pull-right { padding-right: 15px; padding-left: 0; text-align: right; border-right: 5px solid #eee; border-left: 0; } .blockquote-reverse footer:before, blockquote.pull-right footer:before, .blockquote-reverse small:before, blockquote.pull-right small:before, .blockquote-reverse .small:before, blockquote.pull-right .small:before { content: ''; } .blockquote-reverse footer:after, blockquote.pull-right footer:after, .blockquote-reverse small:after, blockquote.pull-right small:after, .blockquote-reverse .small:after, blockquote.pull-right .small:after { content: '\00A0 \2014'; } address { margin-bottom: 20px; font-style: normal; line-height: 1.42857143; } code, kbd, pre, samp { font-family: Menlo, Monaco, Consolas, "Courier New", monospace; } code { padding: 2px 4px; font-size: 90%; color: #c7254e; background-color: #f9f2f4; border-radius: 4px; } kbd { padding: 2px 4px; font-size: 90%; color: #fff; background-color: #333; border-radius: 3px; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); } kbd kbd { padding: 0; font-size: 100%; font-weight: bold; -webkit-box-shadow: none; box-shadow: none; } pre { display: block; padding: 9.5px; margin: 0 0 10px; font-size: 13px; line-height: 1.42857143; color: #333; word-break: break-all; word-wrap: break-word; background-color: #f5f5f5; border: 1px solid #ccc; border-radius: 4px; } pre code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border-radius: 0; } .pre-scrollable { max-height: 340px; overflow-y: scroll; } .container { padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; } @media (min-width: 768px) { .container { width: 750px; } } @media (min-width: 992px) { .container { width: 970px; } } @media (min-width: 1200px) { .container { width: 1170px; } } .container-fluid { padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; } .row { margin-right: -15px; margin-left: -15px; } .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { position: relative; min-height: 1px; padding-right: 15px; padding-left: 15px; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { float: left; } .col-xs-12 { width: 100%; } .col-xs-11 { width: 91.66666667%; } .col-xs-10 { width: 83.33333333%; } .col-xs-9 { width: 75%; } .col-xs-8 { width: 66.66666667%; } .col-xs-7 { width: 58.33333333%; } .col-xs-6 { width: 50%; } .col-xs-5 { width: 41.66666667%; } .col-xs-4 { width: 33.33333333%; } .col-xs-3 { width: 25%; } .col-xs-2 { width: 16.66666667%; } .col-xs-1 { width: 8.33333333%; } .col-xs-pull-12 { right: 100%; } .col-xs-pull-11 { right: 91.66666667%; } .col-xs-pull-10 { right: 83.33333333%; } .col-xs-pull-9 { right: 75%; } .col-xs-pull-8 { right: 66.66666667%; } .col-xs-pull-7 { right: 58.33333333%; } .col-xs-pull-6 { right: 50%; } .col-xs-pull-5 { right: 41.66666667%; } .col-xs-pull-4 { right: 33.33333333%; } .col-xs-pull-3 { right: 25%; } .col-xs-pull-2 { right: 16.66666667%; } .col-xs-pull-1 { right: 8.33333333%; } .col-xs-pull-0 { right: auto; } .col-xs-push-12 { left: 100%; } .col-xs-push-11 { left: 91.66666667%; } .col-xs-push-10 { left: 83.33333333%; } .col-xs-push-9 { left: 75%; } .col-xs-push-8 { left: 66.66666667%; } .col-xs-push-7 { left: 58.33333333%; } .col-xs-push-6 { left: 50%; } .col-xs-push-5 { left: 41.66666667%; } .col-xs-push-4 { left: 33.33333333%; } .col-xs-push-3 { left: 25%; } .col-xs-push-2 { left: 16.66666667%; } .col-xs-push-1 { left: 8.33333333%; } .col-xs-push-0 { left: auto; } .col-xs-offset-12 { margin-left: 100%; } .col-xs-offset-11 { margin-left: 91.66666667%; } .col-xs-offset-10 { margin-left: 83.33333333%; } .col-xs-offset-9 { margin-left: 75%; } .col-xs-offset-8 { margin-left: 66.66666667%; } .col-xs-offset-7 { margin-left: 58.33333333%; } .col-xs-offset-6 { margin-left: 50%; } .col-xs-offset-5 { margin-left: 41.66666667%; } .col-xs-offset-4 { margin-left: 33.33333333%; } .col-xs-offset-3 { margin-left: 25%; } .col-xs-offset-2 { margin-left: 16.66666667%; } .col-xs-offset-1 { margin-left: 8.33333333%; } .col-xs-offset-0 { margin-left: 0; } @media (min-width: 768px) { .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { float: left; } .col-sm-12 { width: 100%; } .col-sm-11 { width: 91.66666667%; } .col-sm-10 { width: 83.33333333%; } .col-sm-9 { width: 75%; } .col-sm-8 { width: 66.66666667%; } .col-sm-7 { width: 58.33333333%; } .col-sm-6 { width: 50%; } .col-sm-5 { width: 41.66666667%; } .col-sm-4 { width: 33.33333333%; } .col-sm-3 { width: 25%; } .col-sm-2 { width: 16.66666667%; } .col-sm-1 { width: 8.33333333%; } .col-sm-pull-12 { right: 100%; } .col-sm-pull-11 { right: 91.66666667%; } .col-sm-pull-10 { right: 83.33333333%; } .col-sm-pull-9 { right: 75%; } .col-sm-pull-8 { right: 66.66666667%; } .col-sm-pull-7 { right: 58.33333333%; } .col-sm-pull-6 { right: 50%; } .col-sm-pull-5 { right: 41.66666667%; } .col-sm-pull-4 { right: 33.33333333%; } .col-sm-pull-3 { right: 25%; } .col-sm-pull-2 { right: 16.66666667%; } .col-sm-pull-1 { right: 8.33333333%; } .col-sm-pull-0 { right: auto; } .col-sm-push-12 { left: 100%; } .col-sm-push-11 { left: 91.66666667%; } .col-sm-push-10 { left: 83.33333333%; } .col-sm-push-9 { left: 75%; } .col-sm-push-8 { left: 66.66666667%; } .col-sm-push-7 { left: 58.33333333%; } .col-sm-push-6 { left: 50%; } .col-sm-push-5 { left: 41.66666667%; } .col-sm-push-4 { left: 33.33333333%; } .col-sm-push-3 { left: 25%; } .col-sm-push-2 { left: 16.66666667%; } .col-sm-push-1 { left: 8.33333333%; } .col-sm-push-0 { left: auto; } .col-sm-offset-12 { margin-left: 100%; } .col-sm-offset-11 { margin-left: 91.66666667%; } .col-sm-offset-10 { margin-left: 83.33333333%; } .col-sm-offset-9 { margin-left: 75%; } .col-sm-offset-8 { margin-left: 66.66666667%; } .col-sm-offset-7 { margin-left: 58.33333333%; } .col-sm-offset-6 { margin-left: 50%; } .col-sm-offset-5 { margin-left: 41.66666667%; } .col-sm-offset-4 { margin-left: 33.33333333%; } .col-sm-offset-3 { margin-left: 25%; } .col-sm-offset-2 { margin-left: 16.66666667%; } .col-sm-offset-1 { margin-left: 8.33333333%; } .col-sm-offset-0 { margin-left: 0; } } @media (min-width: 992px) { .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { float: left; } .col-md-12 { width: 100%; } .col-md-11 { width: 91.66666667%; } .col-md-10 { width: 83.33333333%; } .col-md-9 { width: 75%; } .col-md-8 { width: 66.66666667%; } .col-md-7 { width: 58.33333333%; } .col-md-6 { width: 50%; } .col-md-5 { width: 41.66666667%; } .col-md-4 { width: 33.33333333%; } .col-md-3 { width: 25%; } .col-md-2 { width: 16.66666667%; } .col-md-1 { width: 8.33333333%; } .col-md-pull-12 { right: 100%; } .col-md-pull-11 { right: 91.66666667%; } .col-md-pull-10 { right: 83.33333333%; } .col-md-pull-9 { right: 75%; } .col-md-pull-8 { right: 66.66666667%; } .col-md-pull-7 { right: 58.33333333%; } .col-md-pull-6 { right: 50%; } .col-md-pull-5 { right: 41.66666667%; } .col-md-pull-4 { right: 33.33333333%; } .col-md-pull-3 { right: 25%; } .col-md-pull-2 { right: 16.66666667%; } .col-md-pull-1 { right: 8.33333333%; } .col-md-pull-0 { right: auto; } .col-md-push-12 { left: 100%; } .col-md-push-11 { left: 91.66666667%; } .col-md-push-10 { left: 83.33333333%; } .col-md-push-9 { left: 75%; } .col-md-push-8 { left: 66.66666667%; } .col-md-push-7 { left: 58.33333333%; } .col-md-push-6 { left: 50%; } .col-md-push-5 { left: 41.66666667%; } .col-md-push-4 { left: 33.33333333%; } .col-md-push-3 { left: 25%; } .col-md-push-2 { left: 16.66666667%; } .col-md-push-1 { left: 8.33333333%; } .col-md-push-0 { left: auto; } .col-md-offset-12 { margin-left: 100%; } .col-md-offset-11 { margin-left: 91.66666667%; } .col-md-offset-10 { margin-left: 83.33333333%; } .col-md-offset-9 { margin-left: 75%; } .col-md-offset-8 { margin-left: 66.66666667%; } .col-md-offset-7 { margin-left: 58.33333333%; } .col-md-offset-6 { margin-left: 50%; } .col-md-offset-5 { margin-left: 41.66666667%; } .col-md-offset-4 { margin-left: 33.33333333%; } .col-md-offset-3 { margin-left: 25%; } .col-md-offset-2 { margin-left: 16.66666667%; } .col-md-offset-1 { margin-left: 8.33333333%; } .col-md-offset-0 { margin-left: 0; } } @media (min-width: 1200px) { .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { float: left; } .col-lg-12 { width: 100%; } .col-lg-11 { width: 91.66666667%; } .col-lg-10 { width: 83.33333333%; } .col-lg-9 { width: 75%; } .col-lg-8 { width: 66.66666667%; } .col-lg-7 { width: 58.33333333%; } .col-lg-6 { width: 50%; } .col-lg-5 { width: 41.66666667%; } .col-lg-4 { width: 33.33333333%; } .col-lg-3 { width: 25%; } .col-lg-2 { width: 16.66666667%; } .col-lg-1 { width: 8.33333333%; } .col-lg-pull-12 { right: 100%; } .col-lg-pull-11 { right: 91.66666667%; } .col-lg-pull-10 { right: 83.33333333%; } .col-lg-pull-9 { right: 75%; } .col-lg-pull-8 { right: 66.66666667%; } .col-lg-pull-7 { right: 58.33333333%; } .col-lg-pull-6 { right: 50%; } .col-lg-pull-5 { right: 41.66666667%; } .col-lg-pull-4 { right: 33.33333333%; } .col-lg-pull-3 { right: 25%; } .col-lg-pull-2 { right: 16.66666667%; } .col-lg-pull-1 { right: 8.33333333%; } .col-lg-pull-0 { right: auto; } .col-lg-push-12 { left: 100%; } .col-lg-push-11 { left: 91.66666667%; } .col-lg-push-10 { left: 83.33333333%; } .col-lg-push-9 { left: 75%; } .col-lg-push-8 { left: 66.66666667%; } .col-lg-push-7 { left: 58.33333333%; } .col-lg-push-6 { left: 50%; } .col-lg-push-5 { left: 41.66666667%; } .col-lg-push-4 { left: 33.33333333%; } .col-lg-push-3 { left: 25%; } .col-lg-push-2 { left: 16.66666667%; } .col-lg-push-1 { left: 8.33333333%; } .col-lg-push-0 { left: auto; } .col-lg-offset-12 { margin-left: 100%; } .col-lg-offset-11 { margin-left: 91.66666667%; } .col-lg-offset-10 { margin-left: 83.33333333%; } .col-lg-offset-9 { margin-left: 75%; } .col-lg-offset-8 { margin-left: 66.66666667%; } .col-lg-offset-7 { margin-left: 58.33333333%; } .col-lg-offset-6 { margin-left: 50%; } .col-lg-offset-5 { margin-left: 41.66666667%; } .col-lg-offset-4 { margin-left: 33.33333333%; } .col-lg-offset-3 { margin-left: 25%; } .col-lg-offset-2 { margin-left: 16.66666667%; } .col-lg-offset-1 { margin-left: 8.33333333%; } .col-lg-offset-0 { margin-left: 0; } } table { background-color: transparent; } caption { padding-top: 8px; padding-bottom: 8px; color: #777; text-align: left; } th { text-align: left; } .table { width: 100%; max-width: 100%; margin-bottom: 20px; } .table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td { padding: 8px; line-height: 1.42857143; vertical-align: top; border-top: 1px solid #ddd; } .table > thead > tr > th { vertical-align: bottom; border-bottom: 2px solid #ddd; } .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > th, .table > thead:first-child > tr:first-child > th, .table > caption + thead > tr:first-child > td, .table > colgroup + thead > tr:first-child > td, .table > thead:first-child > tr:first-child > td { border-top: 0; } .table > tbody + tbody { border-top: 2px solid #ddd; } .table .table { background-color: #fff; } .table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, .table-condensed > tfoot > tr > th, .table-condensed > thead > tr > td, .table-condensed > tbody > tr > td, .table-condensed > tfoot > tr > td { padding: 5px; } .table-bordered { border: 1px solid #ddd; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { border: 1px solid #ddd; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { border-bottom-width: 2px; } .table-striped > tbody > tr:nth-of-type(odd) { background-color: #f9f9f9; } .table-hover > tbody > tr:hover { background-color: #f5f5f5; } table col[class*="col-"] { position: static; display: table-column; float: none; } table td[class*="col-"], table th[class*="col-"] { position: static; display: table-cell; float: none; } .table > thead > tr > td.active, .table > tbody > tr > td.active, .table > tfoot > tr > td.active, .table > thead > tr > th.active, .table > tbody > tr > th.active, .table > tfoot > tr > th.active, .table > thead > tr.active > td, .table > tbody > tr.active > td, .table > tfoot > tr.active > td, .table > thead > tr.active > th, .table > tbody > tr.active > th, .table > tfoot > tr.active > th { background-color: #f5f5f5; } .table-hover > tbody > tr > td.active:hover, .table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th { background-color: #e8e8e8; } .table > thead > tr > td.success, .table > tbody > tr > td.success, .table > tfoot > tr > td.success, .table > thead > tr > th.success, .table > tbody > tr > th.success, .table > tfoot > tr > th.success, .table > thead > tr.success > td, .table > tbody > tr.success > td, .table > tfoot > tr.success > td, .table > thead > tr.success > th, .table > tbody > tr.success > th, .table > tfoot > tr.success > th { background-color: #dff0d8; } .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th { background-color: #d0e9c6; } .table > thead > tr > td.info, .table > tbody > tr > td.info, .table > tfoot > tr > td.info, .table > thead > tr > th.info, .table > tbody > tr > th.info, .table > tfoot > tr > th.info, .table > thead > tr.info > td, .table > tbody > tr.info > td, .table > tfoot > tr.info > td, .table > thead > tr.info > th, .table > tbody > tr.info > th, .table > tfoot > tr.info > th { background-color: #d9edf7; } .table-hover > tbody > tr > td.info:hover, .table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th { background-color: #c4e3f3; } .table > thead > tr > td.warning, .table > tbody > tr > td.warning, .table > tfoot > tr > td.warning, .table > thead > tr > th.warning, .table > tbody > tr > th.warning, .table > tfoot > tr > th.warning, .table > thead > tr.warning > td, .table > tbody > tr.warning > td, .table > tfoot > tr.warning > td, .table > thead > tr.warning > th, .table > tbody > tr.warning > th, .table > tfoot > tr.warning > th { background-color: #fcf8e3; } .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th { background-color: #faf2cc; } .table > thead > tr > td.danger, .table > tbody > tr > td.danger, .table > tfoot > tr > td.danger, .table > thead > tr > th.danger, .table > tbody > tr > th.danger, .table > tfoot > tr > th.danger, .table > thead > tr.danger > td, .table > tbody > tr.danger > td, .table > tfoot > tr.danger > td, .table > thead > tr.danger > th, .table > tbody > tr.danger > th, .table > tfoot > tr.danger > th { background-color: #f2dede; } .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th { background-color: #ebcccc; } .table-responsive { min-height: .01%; overflow-x: auto; } @media screen and (max-width: 767px) { .table-responsive { width: 100%; margin-bottom: 15px; overflow-y: hidden; -ms-overflow-style: -ms-autohiding-scrollbar; border: 1px solid #ddd; } .table-responsive > .table { margin-bottom: 0; } .table-responsive > .table > thead > tr > th, .table-responsive > .table > tbody > tr > th, .table-responsive > .table > tfoot > tr > th, .table-responsive > .table > thead > tr > td, .table-responsive > .table > tbody > tr > td, .table-responsive > .table > tfoot > tr > td { white-space: nowrap; } .table-responsive > .table-bordered { border: 0; } .table-responsive > .table-bordered > thead > tr > th:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .table-responsive > .table-bordered > thead > tr > th:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .table-responsive > .table-bordered > tbody > tr:last-child > th, .table-responsive > .table-bordered > tfoot > tr:last-child > th, .table-responsive > .table-bordered > tbody > tr:last-child > td, .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } } fieldset { min-width: 0; padding: 0; margin: 0; border: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: 20px; font-size: 21px; line-height: inherit; color: #333; border: 0; border-bottom: 1px solid #e5e5e5; } label { display: inline-block; max-width: 100%; margin-bottom: 5px; font-weight: bold; } input[type="search"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px \9; line-height: normal; } input[type="file"] { display: block; } input[type="range"] { display: block; width: 100%; } select[multiple], select[size] { height: auto; } input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } output { display: block; padding-top: 7px; font-size: 14px; line-height: 1.42857143; color: #555; } .form-control { display: block; width: 100%; height: 34px; padding: 6px 12px; font-size: 14px; line-height: 1.42857143; color: #555; background-color: #fff; background-image: none; border: 1px solid #ccc; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } .form-control:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); } .form-control::-moz-placeholder { color: #999; opacity: 1; } .form-control:-ms-input-placeholder { color: #999; } .form-control::-webkit-input-placeholder { color: #999; } .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { background-color: #eee; opacity: 1; } .form-control[disabled], fieldset[disabled] .form-control { cursor: not-allowed; } textarea.form-control { height: auto; } input[type="search"] { -webkit-appearance: none; } @media screen and (-webkit-min-device-pixel-ratio: 0) { input[type="date"].form-control, input[type="time"].form-control, input[type="datetime-local"].form-control, input[type="month"].form-control { line-height: 34px; } input[type="date"].input-sm, input[type="time"].input-sm, input[type="datetime-local"].input-sm, input[type="month"].input-sm, .input-group-sm input[type="date"], .input-group-sm input[type="time"], .input-group-sm input[type="datetime-local"], .input-group-sm input[type="month"] { line-height: 30px; } input[type="date"].input-lg, input[type="time"].input-lg, input[type="datetime-local"].input-lg, input[type="month"].input-lg, .input-group-lg input[type="date"], .input-group-lg input[type="time"], .input-group-lg input[type="datetime-local"], .input-group-lg input[type="month"] { line-height: 46px; } } .form-group { margin-bottom: 15px; } .radio, .checkbox { position: relative; display: block; margin-top: 10px; margin-bottom: 10px; } .radio label, .checkbox label { min-height: 20px; padding-left: 20px; margin-bottom: 0; font-weight: normal; cursor: pointer; } .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { position: absolute; margin-top: 4px \9; margin-left: -20px; } .radio + .radio, .checkbox + .checkbox { margin-top: -5px; } .radio-inline, .checkbox-inline { position: relative; display: inline-block; padding-left: 20px; margin-bottom: 0; font-weight: normal; vertical-align: middle; cursor: pointer; } .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { margin-top: 0; margin-left: 10px; } input[type="radio"][disabled], input[type="checkbox"][disabled], input[type="radio"].disabled, input[type="checkbox"].disabled, fieldset[disabled] input[type="radio"], fieldset[disabled] input[type="checkbox"] { cursor: not-allowed; } .radio-inline.disabled, .checkbox-inline.disabled, fieldset[disabled] .radio-inline, fieldset[disabled] .checkbox-inline { cursor: not-allowed; } .radio.disabled label, .checkbox.disabled label, fieldset[disabled] .radio label, fieldset[disabled] .checkbox label { cursor: not-allowed; } .form-control-static { min-height: 34px; padding-top: 7px; padding-bottom: 7px; margin-bottom: 0; } .form-control-static.input-lg, .form-control-static.input-sm { padding-right: 0; padding-left: 0; } .input-sm { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-sm { height: 30px; line-height: 30px; } textarea.input-sm, select[multiple].input-sm { height: auto; } .form-group-sm .form-control { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .form-group-sm select.form-control { height: 30px; line-height: 30px; } .form-group-sm textarea.form-control, .form-group-sm select[multiple].form-control { height: auto; } .form-group-sm .form-control-static { height: 30px; min-height: 32px; padding: 6px 10px; font-size: 12px; line-height: 1.5; } .input-lg { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } select.input-lg { height: 46px; line-height: 46px; } textarea.input-lg, select[multiple].input-lg { height: auto; } .form-group-lg .form-control { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } .form-group-lg select.form-control { height: 46px; line-height: 46px; } .form-group-lg textarea.form-control, .form-group-lg select[multiple].form-control { height: auto; } .form-group-lg .form-control-static { height: 46px; min-height: 38px; padding: 11px 16px; font-size: 18px; line-height: 1.3333333; } .has-feedback { position: relative; } .has-feedback .form-control { padding-right: 42.5px; } .form-control-feedback { position: absolute; top: 0; right: 0; z-index: 2; display: block; width: 34px; height: 34px; line-height: 34px; text-align: center; pointer-events: none; } .input-lg + .form-control-feedback, .input-group-lg + .form-control-feedback, .form-group-lg .form-control + .form-control-feedback { width: 46px; height: 46px; line-height: 46px; } .input-sm + .form-control-feedback, .input-group-sm + .form-control-feedback, .form-group-sm .form-control + .form-control-feedback { width: 30px; height: 30px; line-height: 30px; } .has-success .help-block, .has-success .control-label, .has-success .radio, .has-success .checkbox, .has-success .radio-inline, .has-success .checkbox-inline, .has-success.radio label, .has-success.checkbox label, .has-success.radio-inline label, .has-success.checkbox-inline label { color: #3c763d; } .has-success .form-control { border-color: #3c763d; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } .has-success .form-control:focus { border-color: #2b542c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; } .has-success .input-group-addon { color: #3c763d; background-color: #dff0d8; border-color: #3c763d; } .has-success .form-control-feedback { color: #3c763d; } .has-warning .help-block, .has-warning .control-label, .has-warning .radio, .has-warning .checkbox, .has-warning .radio-inline, .has-warning .checkbox-inline, .has-warning.radio label, .has-warning.checkbox label, .has-warning.radio-inline label, .has-warning.checkbox-inline label { color: #8a6d3b; } .has-warning .form-control { border-color: #8a6d3b; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } .has-warning .form-control:focus { border-color: #66512c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; } .has-warning .input-group-addon { color: #8a6d3b; background-color: #fcf8e3; border-color: #8a6d3b; } .has-warning .form-control-feedback { color: #8a6d3b; } .has-error .help-block, .has-error .control-label, .has-error .radio, .has-error .checkbox, .has-error .radio-inline, .has-error .checkbox-inline, .has-error.radio label, .has-error.checkbox label, .has-error.radio-inline label, .has-error.checkbox-inline label { color: #a94442; } .has-error .form-control { border-color: #a94442; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } .has-error .form-control:focus { border-color: #843534; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; } .has-error .input-group-addon { color: #a94442; background-color: #f2dede; border-color: #a94442; } .has-error .form-control-feedback { color: #a94442; } .has-feedback label ~ .form-control-feedback { top: 25px; } .has-feedback label.sr-only ~ .form-control-feedback { top: 0; } .help-block { display: block; margin-top: 5px; margin-bottom: 10px; color: #737373; } @media (min-width: 768px) { .form-inline .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .form-inline .form-control { display: inline-block; width: auto; vertical-align: middle; } .form-inline .form-control-static { display: inline-block; } .form-inline .input-group { display: inline-table; vertical-align: middle; } .form-inline .input-group .input-group-addon, .form-inline .input-group .input-group-btn, .form-inline .input-group .form-control { width: auto; } .form-inline .input-group > .form-control { width: 100%; } .form-inline .control-label { margin-bottom: 0; vertical-align: middle; } .form-inline .radio, .form-inline .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .form-inline .radio label, .form-inline .checkbox label { padding-left: 0; } .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .form-inline .has-feedback .form-control-feedback { top: 0; } } .form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline { padding-top: 7px; margin-top: 0; margin-bottom: 0; } .form-horizontal .radio, .form-horizontal .checkbox { min-height: 27px; } .form-horizontal .form-group { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .form-horizontal .control-label { padding-top: 7px; margin-bottom: 0; text-align: right; } } .form-horizontal .has-feedback .form-control-feedback { right: 15px; } @media (min-width: 768px) { .form-horizontal .form-group-lg .control-label { padding-top: 14.333333px; font-size: 18px; } } @media (min-width: 768px) { .form-horizontal .form-group-sm .control-label { padding-top: 6px; font-size: 12px; } } .btn { display: inline-block; padding: 6px 12px; margin-bottom: 0; font-size: 14px; font-weight: normal; line-height: 1.42857143; text-align: center; white-space: nowrap; vertical-align: middle; -ms-touch-action: manipulation; touch-action: manipulation; cursor: pointer; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; background-image: none; border: 1px solid transparent; border-radius: 4px; } .btn:focus, .btn:active:focus, .btn.active:focus, .btn.focus, .btn:active.focus, .btn.active.focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn:hover, .btn:focus, .btn.focus { color: #333; text-decoration: none; } .btn:active, .btn.active { background-image: none; outline: 0; -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); } .btn.disabled, .btn[disabled], fieldset[disabled] .btn { cursor: not-allowed; filter: alpha(opacity=65); -webkit-box-shadow: none; box-shadow: none; opacity: .65; } a.btn.disabled, fieldset[disabled] a.btn { pointer-events: none; } .btn-default { color: #333; background-color: #fff; border-color: #ccc; } .btn-default:focus, .btn-default.focus { color: #333; background-color: #e6e6e6; border-color: #8c8c8c; } .btn-default:hover { color: #333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { color: #333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active:hover, .btn-default.active:hover, .open > .dropdown-toggle.btn-default:hover, .btn-default:active:focus, .btn-default.active:focus, .open > .dropdown-toggle.btn-default:focus, .btn-default:active.focus, .btn-default.active.focus, .open > .dropdown-toggle.btn-default.focus { color: #333; background-color: #d4d4d4; border-color: #8c8c8c; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { background-image: none; } .btn-default.disabled, .btn-default[disabled], fieldset[disabled] .btn-default, .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus, .btn-default.disabled:active, .btn-default[disabled]:active, fieldset[disabled] .btn-default:active, .btn-default.disabled.active, .btn-default[disabled].active, fieldset[disabled] .btn-default.active { background-color: #fff; border-color: #ccc; } .btn-default .badge { color: #fff; background-color: #333; } .btn-primary { color: #fff; background-color: #337ab7; border-color: #2e6da4; } .btn-primary:focus, .btn-primary.focus { color: #fff; background-color: #286090; border-color: #122b40; } .btn-primary:hover { color: #fff; background-color: #286090; border-color: #204d74; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { color: #fff; background-color: #286090; border-color: #204d74; } .btn-primary:active:hover, .btn-primary.active:hover, .open > .dropdown-toggle.btn-primary:hover, .btn-primary:active:focus, .btn-primary.active:focus, .open > .dropdown-toggle.btn-primary:focus, .btn-primary:active.focus, .btn-primary.active.focus, .open > .dropdown-toggle.btn-primary.focus { color: #fff; background-color: #204d74; border-color: #122b40; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { background-image: none; } .btn-primary.disabled, .btn-primary[disabled], fieldset[disabled] .btn-primary, .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled.focus, .btn-primary[disabled].focus, fieldset[disabled] .btn-primary.focus, .btn-primary.disabled:active, .btn-primary[disabled]:active, fieldset[disabled] .btn-primary:active, .btn-primary.disabled.active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary.active { background-color: #337ab7; border-color: #2e6da4; } .btn-primary .badge { color: #337ab7; background-color: #fff; } .btn-success { color: #fff; background-color: #5cb85c; border-color: #4cae4c; } .btn-success:focus, .btn-success.focus { color: #fff; background-color: #449d44; border-color: #255625; } .btn-success:hover { color: #fff; background-color: #449d44; border-color: #398439; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { color: #fff; background-color: #449d44; border-color: #398439; } .btn-success:active:hover, .btn-success.active:hover, .open > .dropdown-toggle.btn-success:hover, .btn-success:active:focus, .btn-success.active:focus, .open > .dropdown-toggle.btn-success:focus, .btn-success:active.focus, .btn-success.active.focus, .open > .dropdown-toggle.btn-success.focus { color: #fff; background-color: #398439; border-color: #255625; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { background-image: none; } .btn-success.disabled, .btn-success[disabled], fieldset[disabled] .btn-success, .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled.focus, .btn-success[disabled].focus, fieldset[disabled] .btn-success.focus, .btn-success.disabled:active, .btn-success[disabled]:active, fieldset[disabled] .btn-success:active, .btn-success.disabled.active, .btn-success[disabled].active, fieldset[disabled] .btn-success.active { background-color: #5cb85c; border-color: #4cae4c; } .btn-success .badge { color: #5cb85c; background-color: #fff; } .btn-info { color: #fff; background-color: #5bc0de; border-color: #46b8da; } .btn-info:focus, .btn-info.focus { color: #fff; background-color: #31b0d5; border-color: #1b6d85; } .btn-info:hover { color: #fff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { color: #fff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active:hover, .btn-info.active:hover, .open > .dropdown-toggle.btn-info:hover, .btn-info:active:focus, .btn-info.active:focus, .open > .dropdown-toggle.btn-info:focus, .btn-info:active.focus, .btn-info.active.focus, .open > .dropdown-toggle.btn-info.focus { color: #fff; background-color: #269abc; border-color: #1b6d85; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { background-image: none; } .btn-info.disabled, .btn-info[disabled], fieldset[disabled] .btn-info, .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled.focus, .btn-info[disabled].focus, fieldset[disabled] .btn-info.focus, .btn-info.disabled:active, .btn-info[disabled]:active, fieldset[disabled] .btn-info:active, .btn-info.disabled.active, .btn-info[disabled].active, fieldset[disabled] .btn-info.active { background-color: #5bc0de; border-color: #46b8da; } .btn-info .badge { color: #5bc0de; background-color: #fff; } .btn-warning { color: #fff; background-color: #f0ad4e; border-color: #eea236; } .btn-warning:focus, .btn-warning.focus { color: #fff; background-color: #ec971f; border-color: #985f0d; } .btn-warning:hover { color: #fff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { color: #fff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active:hover, .btn-warning.active:hover, .open > .dropdown-toggle.btn-warning:hover, .btn-warning:active:focus, .btn-warning.active:focus, .open > .dropdown-toggle.btn-warning:focus, .btn-warning:active.focus, .btn-warning.active.focus, .open > .dropdown-toggle.btn-warning.focus { color: #fff; background-color: #d58512; border-color: #985f0d; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { background-image: none; } .btn-warning.disabled, .btn-warning[disabled], fieldset[disabled] .btn-warning, .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled.focus, .btn-warning[disabled].focus, fieldset[disabled] .btn-warning.focus, .btn-warning.disabled:active, .btn-warning[disabled]:active, fieldset[disabled] .btn-warning:active, .btn-warning.disabled.active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning.active { background-color: #f0ad4e; border-color: #eea236; } .btn-warning .badge { color: #f0ad4e; background-color: #fff; } .btn-danger { color: #fff; background-color: #d9534f; border-color: #d43f3a; } .btn-danger:focus, .btn-danger.focus { color: #fff; background-color: #c9302c; border-color: #761c19; } .btn-danger:hover { color: #fff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { color: #fff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active:hover, .btn-danger.active:hover, .open > .dropdown-toggle.btn-danger:hover, .btn-danger:active:focus, .btn-danger.active:focus, .open > .dropdown-toggle.btn-danger:focus, .btn-danger:active.focus, .btn-danger.active.focus, .open > .dropdown-toggle.btn-danger.focus { color: #fff; background-color: #ac2925; border-color: #761c19; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { background-image: none; } .btn-danger.disabled, .btn-danger[disabled], fieldset[disabled] .btn-danger, .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled.focus, .btn-danger[disabled].focus, fieldset[disabled] .btn-danger.focus, .btn-danger.disabled:active, .btn-danger[disabled]:active, fieldset[disabled] .btn-danger:active, .btn-danger.disabled.active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger.active { background-color: #d9534f; border-color: #d43f3a; } .btn-danger .badge { color: #d9534f; background-color: #fff; } .btn-link { font-weight: normal; color: #337ab7; border-radius: 0; } .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled], fieldset[disabled] .btn-link { background-color: transparent; -webkit-box-shadow: none; box-shadow: none; } .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { border-color: transparent; } .btn-link:hover, .btn-link:focus { color: #23527c; text-decoration: underline; background-color: transparent; } .btn-link[disabled]:hover, fieldset[disabled] .btn-link:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:focus { color: #777; text-decoration: none; } .btn-lg, .btn-group-lg > .btn { padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } .btn-sm, .btn-group-sm > .btn { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-xs, .btn-group-xs > .btn { padding: 1px 5px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-block { display: block; width: 100%; } .btn-block + .btn-block { margin-top: 5px; } input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { width: 100%; } .fade { opacity: 0; -webkit-transition: opacity .15s linear; -o-transition: opacity .15s linear; transition: opacity .15s linear; } .fade.in { opacity: 1; } .collapse { display: none; } .collapse.in { display: block; } tr.collapse.in { display: table-row; } tbody.collapse.in { display: table-row-group; } .collapsing { position: relative; height: 0; overflow: hidden; -webkit-transition-timing-function: ease; -o-transition-timing-function: ease; transition-timing-function: ease; -webkit-transition-duration: .35s; -o-transition-duration: .35s; transition-duration: .35s; -webkit-transition-property: height, visibility; -o-transition-property: height, visibility; transition-property: height, visibility; } .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: 4px dashed; border-top: 4px solid \9; border-right: 4px solid transparent; border-left: 4px solid transparent; } .dropup, .dropdown { position: relative; } .dropdown-toggle:focus { outline: 0; } .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; font-size: 14px; text-align: left; list-style: none; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, .15); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); box-shadow: 0 6px 12px rgba(0, 0, 0, .175); } .dropdown-menu.pull-right { right: 0; left: auto; } .dropdown-menu .divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .dropdown-menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 1.42857143; color: #333; white-space: nowrap; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { color: #262626; text-decoration: none; background-color: #f5f5f5; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { color: #fff; text-decoration: none; background-color: #337ab7; outline: 0; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { color: #777; } .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { text-decoration: none; cursor: not-allowed; background-color: transparent; background-image: none; filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); } .open > .dropdown-menu { display: block; } .open > a { outline: 0; } .dropdown-menu-right { right: 0; left: auto; } .dropdown-menu-left { right: auto; left: 0; } .dropdown-header { display: block; padding: 3px 20px; font-size: 12px; line-height: 1.42857143; color: #777; white-space: nowrap; } .dropdown-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 990; } .pull-right > .dropdown-menu { right: 0; left: auto; } .dropup .caret, .navbar-fixed-bottom .dropdown .caret { content: ""; border-top: 0; border-bottom: 4px dashed; border-bottom: 4px solid \9; } .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 2px; } @media (min-width: 768px) { .navbar-right .dropdown-menu { right: 0; left: auto; } .navbar-right .dropdown-menu-left { right: auto; left: 0; } } .btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; } .btn-group > .btn, .btn-group-vertical > .btn { position: relative; float: left; } .btn-group > .btn:hover, .btn-group-vertical > .btn:hover, .btn-group > .btn:focus, .btn-group-vertical > .btn:focus, .btn-group > .btn:active, .btn-group-vertical > .btn:active, .btn-group > .btn.active, .btn-group-vertical > .btn.active { z-index: 2; } .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { margin-left: -1px; } .btn-toolbar { margin-left: -5px; } .btn-toolbar .btn, .btn-toolbar .btn-group, .btn-toolbar .input-group { float: left; } .btn-toolbar > .btn, .btn-toolbar > .btn-group, .btn-toolbar > .input-group { margin-left: 5px; } .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } .btn-group > .btn:first-child { margin-left: 0; } .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { border-top-left-radius: 0; border-bottom-left-radius: 0; } .btn-group > .btn-group { float: left; } .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-left-radius: 0; border-bottom-left-radius: 0; } .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } .btn-group > .btn + .dropdown-toggle { padding-right: 8px; padding-left: 8px; } .btn-group > .btn-lg + .dropdown-toggle { padding-right: 12px; padding-left: 12px; } .btn-group.open .dropdown-toggle { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); } .btn-group.open .dropdown-toggle.btn-link { -webkit-box-shadow: none; box-shadow: none; } .btn .caret { margin-left: 0; } .btn-lg .caret { border-width: 5px 5px 0; border-bottom-width: 0; } .dropup .btn-lg .caret { border-width: 0 5px 5px; } .btn-group-vertical > .btn, .btn-group-vertical > .btn-group, .btn-group-vertical > .btn-group > .btn { display: block; float: none; width: 100%; max-width: 100%; } .btn-group-vertical > .btn-group > .btn { float: none; } .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { margin-top: -1px; margin-left: 0; } .btn-group-vertical > .btn:not(:first-child):not(:last-child) { border-radius: 0; } .btn-group-vertical > .btn:first-child:not(:last-child) { border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn:last-child:not(:first-child) { border-top-left-radius: 0; border-top-right-radius: 0; border-bottom-left-radius: 4px; } .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-left-radius: 0; border-top-right-radius: 0; } .btn-group-justified { display: table; width: 100%; table-layout: fixed; border-collapse: separate; } .btn-group-justified > .btn, .btn-group-justified > .btn-group { display: table-cell; float: none; width: 1%; } .btn-group-justified > .btn-group .btn { width: 100%; } .btn-group-justified > .btn-group .dropdown-menu { left: auto; } [data-toggle="buttons"] > .btn input[type="radio"], [data-toggle="buttons"] > .btn-group > .btn input[type="radio"], [data-toggle="buttons"] > .btn input[type="checkbox"], [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { position: absolute; clip: rect(0, 0, 0, 0); pointer-events: none; } .input-group { position: relative; display: table; border-collapse: separate; } .input-group[class*="col-"] { float: none; padding-right: 0; padding-left: 0; } .input-group .form-control { position: relative; z-index: 2; float: left; width: 100%; margin-bottom: 0; } .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { height: 46px; line-height: 46px; } textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, textarea.input-group-lg > .input-group-btn > .btn, select[multiple].input-group-lg > .form-control, select[multiple].input-group-lg > .input-group-addon, select[multiple].input-group-lg > .input-group-btn > .btn { height: auto; } .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { height: 30px; line-height: 30px; } textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, textarea.input-group-sm > .input-group-btn > .btn, select[multiple].input-group-sm > .form-control, select[multiple].input-group-sm > .input-group-addon, select[multiple].input-group-sm > .input-group-btn > .btn { height: auto; } .input-group-addon, .input-group-btn, .input-group .form-control { display: table-cell; } .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { border-radius: 0; } .input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; } .input-group-addon { padding: 6px 12px; font-size: 14px; font-weight: normal; line-height: 1; color: #555; text-align: center; background-color: #eee; border: 1px solid #ccc; border-radius: 4px; } .input-group-addon.input-sm { padding: 5px 10px; font-size: 12px; border-radius: 3px; } .input-group-addon.input-lg { padding: 10px 16px; font-size: 18px; border-radius: 6px; } .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { margin-top: 0; } .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { border-top-right-radius: 0; border-bottom-right-radius: 0; } .input-group-addon:first-child { border-right: 0; } .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child), .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { border-top-left-radius: 0; border-bottom-left-radius: 0; } .input-group-addon:last-child { border-left: 0; } .input-group-btn { position: relative; font-size: 0; white-space: nowrap; } .input-group-btn > .btn { position: relative; } .input-group-btn > .btn + .btn { margin-left: -1px; } .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { z-index: 2; } .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group { margin-right: -1px; } .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { z-index: 2; margin-left: -1px; } .nav { padding-left: 0; margin-bottom: 0; list-style: none; } .nav > li { position: relative; display: block; } .nav > li > a { position: relative; display: block; padding: 10px 15px; } .nav > li > a:hover, .nav > li > a:focus { text-decoration: none; background-color: #eee; } .nav > li.disabled > a { color: #777; } .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { color: #777; text-decoration: none; cursor: not-allowed; background-color: transparent; } .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { background-color: #eee; border-color: #337ab7; } .nav .nav-divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .nav > li > a > img { max-width: none; } .nav-tabs { border-bottom: 1px solid #ddd; } .nav-tabs > li { float: left; margin-bottom: -1px; } .nav-tabs > li > a { margin-right: 2px; line-height: 1.42857143; border: 1px solid transparent; border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { border-color: #eee #eee #ddd; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #555; cursor: default; background-color: #fff; border: 1px solid #ddd; border-bottom-color: transparent; } .nav-tabs.nav-justified { width: 100%; border-bottom: 0; } .nav-tabs.nav-justified > li { float: none; } .nav-tabs.nav-justified > li > a { margin-bottom: 5px; text-align: center; } .nav-tabs.nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-tabs.nav-justified > li { display: table-cell; width: 1%; } .nav-tabs.nav-justified > li > a { margin-bottom: 0; } } .nav-tabs.nav-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border: 1px solid #ddd; } @media (min-width: 768px) { .nav-tabs.nav-justified > li > a { border-bottom: 1px solid #ddd; border-radius: 4px 4px 0 0; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border-bottom-color: #fff; } } .nav-pills > li { float: left; } .nav-pills > li > a { border-radius: 4px; } .nav-pills > li + li { margin-left: 2px; } .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { color: #fff; background-color: #337ab7; } .nav-stacked > li { float: none; } .nav-stacked > li + li { margin-top: 2px; margin-left: 0; } .nav-justified { width: 100%; } .nav-justified > li { float: none; } .nav-justified > li > a { margin-bottom: 5px; text-align: center; } .nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-justified > li { display: table-cell; width: 1%; } .nav-justified > li > a { margin-bottom: 0; } } .nav-tabs-justified { border-bottom: 0; } .nav-tabs-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border: 1px solid #ddd; } @media (min-width: 768px) { .nav-tabs-justified > li > a { border-bottom: 1px solid #ddd; border-radius: 4px 4px 0 0; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border-bottom-color: #fff; } } .tab-content > .tab-pane { display: none; } .tab-content > .active { display: block; } .nav-tabs .dropdown-menu { margin-top: -1px; border-top-left-radius: 0; border-top-right-radius: 0; } .navbar { position: relative; min-height: 50px; margin-bottom: 20px; border: 1px solid transparent; } @media (min-width: 768px) { .navbar { border-radius: 4px; } } @media (min-width: 768px) { .navbar-header { float: left; } } .navbar-collapse { padding-right: 15px; padding-left: 15px; overflow-x: visible; -webkit-overflow-scrolling: touch; border-top: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); } .navbar-collapse.in { overflow-y: auto; } @media (min-width: 768px) { .navbar-collapse { width: auto; border-top: 0; -webkit-box-shadow: none; box-shadow: none; } .navbar-collapse.collapse { display: block !important; height: auto !important; padding-bottom: 0; overflow: visible !important; } .navbar-collapse.in { overflow-y: visible; } .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { padding-right: 0; padding-left: 0; } } .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 340px; } @media (max-device-width: 480px) and (orientation: landscape) { .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 200px; } } .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: 0; margin-left: 0; } } .navbar-static-top { z-index: 1000; border-width: 0 0 1px; } @media (min-width: 768px) { .navbar-static-top { border-radius: 0; } } .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; z-index: 1030; } @media (min-width: 768px) { .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } } .navbar-fixed-top { top: 0; border-width: 0 0 1px; } .navbar-fixed-bottom { bottom: 0; margin-bottom: 0; border-width: 1px 0 0; } .navbar-brand { float: left; height: 50px; padding: 15px 15px; font-size: 18px; line-height: 20px; } .navbar-brand:hover, .navbar-brand:focus { text-decoration: none; } .navbar-brand > img { display: block; } @media (min-width: 768px) { .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { margin-left: -15px; } } .navbar-toggle { position: relative; float: right; padding: 9px 10px; margin-top: 8px; margin-right: 15px; margin-bottom: 8px; background-color: transparent; background-image: none; border: 1px solid transparent; border-radius: 4px; } .navbar-toggle:focus { outline: 0; } .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; } .navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; } @media (min-width: 768px) { .navbar-toggle { display: none; } } .navbar-nav { margin: 7.5px -15px; } .navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 20px; } @media (max-width: 767px) { .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; -webkit-box-shadow: none; box-shadow: none; } .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .dropdown-menu .dropdown-header { padding: 5px 15px 5px 25px; } .navbar-nav .open .dropdown-menu > li > a { line-height: 20px; } .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { background-image: none; } } @media (min-width: 768px) { .navbar-nav { float: left; margin: 0; } .navbar-nav > li { float: left; } .navbar-nav > li > a { padding-top: 15px; padding-bottom: 15px; } } .navbar-form { padding: 10px 15px; margin-top: 8px; margin-right: -15px; margin-bottom: 8px; margin-left: -15px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); } @media (min-width: 768px) { .navbar-form .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .navbar-form .form-control { display: inline-block; width: auto; vertical-align: middle; } .navbar-form .form-control-static { display: inline-block; } .navbar-form .input-group { display: inline-table; vertical-align: middle; } .navbar-form .input-group .input-group-addon, .navbar-form .input-group .input-group-btn, .navbar-form .input-group .form-control { width: auto; } .navbar-form .input-group > .form-control { width: 100%; } .navbar-form .control-label { margin-bottom: 0; vertical-align: middle; } .navbar-form .radio, .navbar-form .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .navbar-form .radio label, .navbar-form .checkbox label { padding-left: 0; } .navbar-form .radio input[type="radio"], .navbar-form .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .navbar-form .has-feedback .form-control-feedback { top: 0; } } @media (max-width: 767px) { .navbar-form .form-group { margin-bottom: 5px; } .navbar-form .form-group:last-child { margin-bottom: 0; } } @media (min-width: 768px) { .navbar-form { width: auto; padding-top: 0; padding-bottom: 0; margin-right: 0; margin-left: 0; border: 0; -webkit-box-shadow: none; box-shadow: none; } } .navbar-nav > li > .dropdown-menu { margin-top: 0; border-top-left-radius: 0; border-top-right-radius: 0; } .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { margin-bottom: 0; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .navbar-btn { margin-top: 8px; margin-bottom: 8px; } .navbar-btn.btn-sm { margin-top: 10px; margin-bottom: 10px; } .navbar-btn.btn-xs { margin-top: 14px; margin-bottom: 14px; } .navbar-text { margin-top: 15px; margin-bottom: 15px; } @media (min-width: 768px) { .navbar-text { float: left; margin-right: 15px; margin-left: 15px; } } @media (min-width: 768px) { .navbar-left { float: left !important; } .navbar-right { float: right !important; margin-right: -15px; } .navbar-right ~ .navbar-right { margin-right: 0; } } .navbar-default { background-color: #f8f8f8; border-color: #e7e7e7; } .navbar-default .navbar-brand { color: #777; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { color: #5e5e5e; background-color: transparent; } .navbar-default .navbar-text { color: #777; } .navbar-default .navbar-nav > li > a { color: #777; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { color: #333; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { color: #555; background-color: #e7e7e7; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { color: #ccc; background-color: transparent; } .navbar-default .navbar-toggle { border-color: #ddd; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { background-color: #ddd; } .navbar-default .navbar-toggle .icon-bar { background-color: #888; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { border-color: #e7e7e7; } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { color: #555; background-color: #e7e7e7; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: #777; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { color: #333; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { color: #555; background-color: #e7e7e7; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #ccc; background-color: transparent; } } .navbar-default .navbar-link { color: #777; } .navbar-default .navbar-link:hover { color: #333; } .navbar-default .btn-link { color: #777; } .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { color: #333; } .navbar-default .btn-link[disabled]:hover, fieldset[disabled] .navbar-default .btn-link:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:focus { color: #ccc; } .navbar-inverse { background-color: #222; border-color: #080808; } .navbar-inverse .navbar-brand { color: #9d9d9d; } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-text { color: #9d9d9d; } .navbar-inverse .navbar-nav > li > a { color: #9d9d9d; } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { color: #fff; background-color: #080808; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { color: #444; background-color: transparent; } .navbar-inverse .navbar-toggle { border-color: #333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { background-color: #333; } .navbar-inverse .navbar-toggle .icon-bar { background-color: #fff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #101010; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { color: #fff; background-color: #080808; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { border-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu .divider { background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { color: #9d9d9d; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { color: #fff; background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #444; background-color: transparent; } } .navbar-inverse .navbar-link { color: #9d9d9d; } .navbar-inverse .navbar-link:hover { color: #fff; } .navbar-inverse .btn-link { color: #9d9d9d; } .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { color: #fff; } .navbar-inverse .btn-link[disabled]:hover, fieldset[disabled] .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:focus { color: #444; } .breadcrumb { padding: 8px 15px; margin-bottom: 20px; list-style: none; background-color: #f5f5f5; border-radius: 4px; } .breadcrumb > li { display: inline-block; } .breadcrumb > li + li:before { padding: 0 5px; color: #ccc; content: "/\00a0"; } .breadcrumb > .active { color: #777; } .pagination { display: inline-block; padding-left: 0; margin: 20px 0; border-radius: 4px; } .pagination > li { display: inline; } .pagination > li > a, .pagination > li > span { position: relative; float: left; padding: 6px 12px; margin-left: -1px; line-height: 1.42857143; color: #337ab7; text-decoration: none; background-color: #fff; border: 1px solid #ddd; } .pagination > li:first-child > a, .pagination > li:first-child > span { margin-left: 0; border-top-left-radius: 4px; border-bottom-left-radius: 4px; } .pagination > li:last-child > a, .pagination > li:last-child > span { border-top-right-radius: 4px; border-bottom-right-radius: 4px; } .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { z-index: 3; color: #23527c; background-color: #eee; border-color: #ddd; } .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 2; color: #fff; cursor: default; background-color: #337ab7; border-color: #337ab7; } .pagination > .disabled > span, .pagination > .disabled > span:hover, .pagination > .disabled > span:focus, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #777; cursor: not-allowed; background-color: #fff; border-color: #ddd; } .pagination-lg > li > a, .pagination-lg > li > span { padding: 10px 16px; font-size: 18px; line-height: 1.3333333; } .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { border-top-left-radius: 6px; border-bottom-left-radius: 6px; } .pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { border-top-right-radius: 6px; border-bottom-right-radius: 6px; } .pagination-sm > li > a, .pagination-sm > li > span { padding: 5px 10px; font-size: 12px; line-height: 1.5; } .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { border-top-left-radius: 3px; border-bottom-left-radius: 3px; } .pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { border-top-right-radius: 3px; border-bottom-right-radius: 3px; } .pager { padding-left: 0; margin: 20px 0; text-align: center; list-style: none; } .pager li { display: inline; } .pager li > a, .pager li > span { display: inline-block; padding: 5px 14px; background-color: #fff; border: 1px solid #ddd; border-radius: 15px; } .pager li > a:hover, .pager li > a:focus { text-decoration: none; background-color: #eee; } .pager .next > a, .pager .next > span { float: right; } .pager .previous > a, .pager .previous > span { float: left; } .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { color: #777; cursor: not-allowed; background-color: #fff; } .label { display: inline; padding: .2em .6em .3em; font-size: 75%; font-weight: bold; line-height: 1; color: #fff; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: .25em; } a.label:hover, a.label:focus { color: #fff; text-decoration: none; cursor: pointer; } .label:empty { display: none; } .btn .label { position: relative; top: -1px; } .label-default { background-color: #777; } .label-default[href]:hover, .label-default[href]:focus { background-color: #5e5e5e; } .label-primary { background-color: #337ab7; } .label-primary[href]:hover, .label-primary[href]:focus { background-color: #286090; } .label-success { background-color: #5cb85c; } .label-success[href]:hover, .label-success[href]:focus { background-color: #449d44; } .label-info { background-color: #5bc0de; } .label-info[href]:hover, .label-info[href]:focus { background-color: #31b0d5; } .label-warning { background-color: #f0ad4e; } .label-warning[href]:hover, .label-warning[href]:focus { background-color: #ec971f; } .label-danger { background-color: #d9534f; } .label-danger[href]:hover, .label-danger[href]:focus { background-color: #c9302c; } .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 12px; font-weight: bold; line-height: 1; color: #fff; text-align: center; white-space: nowrap; vertical-align: middle; background-color: #777; border-radius: 10px; } .badge:empty { display: none; } .btn .badge { position: relative; top: -1px; } .btn-xs .badge, .btn-group-xs > .btn .badge { top: 0; padding: 1px 5px; } a.badge:hover, a.badge:focus { color: #fff; text-decoration: none; cursor: pointer; } .list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #337ab7; background-color: #fff; } .list-group-item > .badge { float: right; } .list-group-item > .badge + .badge { margin-right: 5px; } .nav-pills > li > a > .badge { margin-left: 3px; } .jumbotron { padding-top: 30px; padding-bottom: 30px; margin-bottom: 30px; color: inherit; background-color: #eee; } .jumbotron h1, .jumbotron .h1 { color: inherit; } .jumbotron p { margin-bottom: 15px; font-size: 21px; font-weight: 200; } .jumbotron > hr { border-top-color: #d5d5d5; } .container .jumbotron, .container-fluid .jumbotron { border-radius: 6px; } .jumbotron .container { max-width: 100%; } @media screen and (min-width: 768px) { .jumbotron { padding-top: 48px; padding-bottom: 48px; } .container .jumbotron, .container-fluid .jumbotron { padding-right: 60px; padding-left: 60px; } .jumbotron h1, .jumbotron .h1 { font-size: 63px; } } .thumbnail { display: block; padding: 4px; margin-bottom: 20px; line-height: 1.42857143; background-color: #fff; border: 1px solid #ddd; border-radius: 4px; -webkit-transition: border .2s ease-in-out; -o-transition: border .2s ease-in-out; transition: border .2s ease-in-out; } .thumbnail > img, .thumbnail a > img { margin-right: auto; margin-left: auto; } a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { border-color: #337ab7; } .thumbnail .caption { padding: 9px; color: #333; } .alert { padding: 15px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; } .alert h4 { margin-top: 0; color: inherit; } .alert .alert-link { font-weight: bold; } .alert > p, .alert > ul { margin-bottom: 0; } .alert > p + p { margin-top: 5px; } .alert-dismissable, .alert-dismissible { padding-right: 35px; } .alert-dismissable .close, .alert-dismissible .close { position: relative; top: -2px; right: -21px; color: inherit; } .alert-success { color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } .alert-success hr { border-top-color: #c9e2b3; } .alert-success .alert-link { color: #2b542c; } .alert-info { color: #31708f; background-color: #d9edf7; border-color: #bce8f1; } .alert-info hr { border-top-color: #a6e1ec; } .alert-info .alert-link { color: #245269; } .alert-warning { color: #8a6d3b; background-color: #fcf8e3; border-color: #faebcc; } .alert-warning hr { border-top-color: #f7e1b5; } .alert-warning .alert-link { color: #66512c; } .alert-danger { color: #a94442; background-color: #f2dede; border-color: #ebccd1; } .alert-danger hr { border-top-color: #e4b9c0; } .alert-danger .alert-link { color: #843534; } @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @-o-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } .progress { height: 20px; margin-bottom: 20px; overflow: hidden; background-color: #f5f5f5; border-radius: 4px; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); } .progress-bar { float: left; width: 0; height: 100%; font-size: 12px; line-height: 20px; color: #fff; text-align: center; background-color: #337ab7; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); -webkit-transition: width .6s ease; -o-transition: width .6s ease; transition: width .6s ease; } .progress-striped .progress-bar, .progress-bar-striped { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -webkit-background-size: 40px 40px; background-size: 40px 40px; } .progress.active .progress-bar, .progress-bar.active { -webkit-animation: progress-bar-stripes 2s linear infinite; -o-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } .progress-bar-success { background-color: #5cb85c; } .progress-striped .progress-bar-success { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } .progress-bar-info { background-color: #5bc0de; } .progress-striped .progress-bar-info { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } .progress-bar-warning { background-color: #f0ad4e; } .progress-striped .progress-bar-warning { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } .progress-bar-danger { background-color: #d9534f; } .progress-striped .progress-bar-danger { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } .media { margin-top: 15px; } .media:first-child { margin-top: 0; } .media, .media-body { overflow: hidden; zoom: 1; } .media-body { width: 10000px; } .media-object { display: block; } .media-object.img-thumbnail { max-width: none; } .media-right, .media > .pull-right { padding-left: 10px; } .media-left, .media > .pull-left { padding-right: 10px; } .media-left, .media-right, .media-body { display: table-cell; vertical-align: top; } .media-middle { vertical-align: middle; } .media-bottom { vertical-align: bottom; } .media-heading { margin-top: 0; margin-bottom: 5px; } .media-list { padding-left: 0; list-style: none; } .list-group { padding-left: 0; margin-bottom: 20px; } .list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; background-color: #fff; border: 1px solid #ddd; } .list-group-item:first-child { border-top-left-radius: 4px; border-top-right-radius: 4px; } .list-group-item:last-child { margin-bottom: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } a.list-group-item, button.list-group-item { color: #555; } a.list-group-item .list-group-item-heading, button.list-group-item .list-group-item-heading { color: #333; } a.list-group-item:hover, button.list-group-item:hover, a.list-group-item:focus, button.list-group-item:focus { color: #555; text-decoration: none; background-color: #f5f5f5; } button.list-group-item { width: 100%; text-align: left; } .list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus { color: #777; cursor: not-allowed; background-color: #eee; } .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading { color: inherit; } .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text { color: #777; } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; color: #fff; background-color: #337ab7; border-color: #337ab7; } .list-group-item.active .list-group-item-heading, .list-group-item.active:hover .list-group-item-heading, .list-group-item.active:focus .list-group-item-heading, .list-group-item.active .list-group-item-heading > small, .list-group-item.active:hover .list-group-item-heading > small, .list-group-item.active:focus .list-group-item-heading > small, .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading > .small { color: inherit; } .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { color: #c7ddef; } .list-group-item-success { color: #3c763d; background-color: #dff0d8; } a.list-group-item-success, button.list-group-item-success { color: #3c763d; } a.list-group-item-success .list-group-item-heading, button.list-group-item-success .list-group-item-heading { color: inherit; } a.list-group-item-success:hover, button.list-group-item-success:hover, a.list-group-item-success:focus, button.list-group-item-success:focus { color: #3c763d; background-color: #d0e9c6; } a.list-group-item-success.active, button.list-group-item-success.active, a.list-group-item-success.active:hover, button.list-group-item-success.active:hover, a.list-group-item-success.active:focus, button.list-group-item-success.active:focus { color: #fff; background-color: #3c763d; border-color: #3c763d; } .list-group-item-info { color: #31708f; background-color: #d9edf7; } a.list-group-item-info, button.list-group-item-info { color: #31708f; } a.list-group-item-info .list-group-item-heading, button.list-group-item-info .list-group-item-heading { color: inherit; } a.list-group-item-info:hover, button.list-group-item-info:hover, a.list-group-item-info:focus, button.list-group-item-info:focus { color: #31708f; background-color: #c4e3f3; } a.list-group-item-info.active, button.list-group-item-info.active, a.list-group-item-info.active:hover, button.list-group-item-info.active:hover, a.list-group-item-info.active:focus, button.list-group-item-info.active:focus { color: #fff; background-color: #31708f; border-color: #31708f; } .list-group-item-warning { color: #8a6d3b; background-color: #fcf8e3; } a.list-group-item-warning, button.list-group-item-warning { color: #8a6d3b; } a.list-group-item-warning .list-group-item-heading, button.list-group-item-warning .list-group-item-heading { color: inherit; } a.list-group-item-warning:hover, button.list-group-item-warning:hover, a.list-group-item-warning:focus, button.list-group-item-warning:focus { color: #8a6d3b; background-color: #faf2cc; } a.list-group-item-warning.active, button.list-group-item-warning.active, a.list-group-item-warning.active:hover, button.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus, button.list-group-item-warning.active:focus { color: #fff; background-color: #8a6d3b; border-color: #8a6d3b; } .list-group-item-danger { color: #a94442; background-color: #f2dede; } a.list-group-item-danger, button.list-group-item-danger { color: #a94442; } a.list-group-item-danger .list-group-item-heading, button.list-group-item-danger .list-group-item-heading { color: inherit; } a.list-group-item-danger:hover, button.list-group-item-danger:hover, a.list-group-item-danger:focus, button.list-group-item-danger:focus { color: #a94442; background-color: #ebcccc; } a.list-group-item-danger.active, button.list-group-item-danger.active, a.list-group-item-danger.active:hover, button.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus, button.list-group-item-danger.active:focus { color: #fff; background-color: #a94442; border-color: #a94442; } .list-group-item-heading { margin-top: 0; margin-bottom: 5px; } .list-group-item-text { margin-bottom: 0; line-height: 1.3; } .panel { margin-bottom: 20px; background-color: #fff; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); box-shadow: 0 1px 1px rgba(0, 0, 0, .05); } .panel-body { padding: 15px; } .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel-heading > .dropdown .dropdown-toggle { color: inherit; } .panel-title { margin-top: 0; margin-bottom: 0; font-size: 16px; color: inherit; } .panel-title > a, .panel-title > small, .panel-title > .small, .panel-title > small > a, .panel-title > .small > a { color: inherit; } .panel-footer { padding: 10px 15px; background-color: #f5f5f5; border-top: 1px solid #ddd; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .list-group, .panel > .panel-collapse > .list-group { margin-bottom: 0; } .panel > .list-group .list-group-item, .panel > .panel-collapse > .list-group .list-group-item { border-width: 1px 0; border-radius: 0; } .panel > .list-group:first-child .list-group-item:first-child, .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { border-top: 0; border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .list-group:last-child .list-group-item:last-child, .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { border-bottom: 0; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { border-top-left-radius: 0; border-top-right-radius: 0; } .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } .list-group + .panel-footer { border-top-width: 0; } .panel > .table, .panel > .table-responsive > .table, .panel > .panel-collapse > .table { margin-bottom: 0; } .panel > .table caption, .panel > .table-responsive > .table caption, .panel > .panel-collapse > .table caption { padding-right: 15px; padding-left: 15px; } .panel > .table:first-child, .panel > .table-responsive:first-child > .table:first-child { border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { border-top-left-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { border-top-right-radius: 3px; } .panel > .table:last-child, .panel > .table-responsive:last-child > .table:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { border-bottom-right-radius: 3px; } .panel > .panel-body + .table, .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { border-top: 1px solid #ddd; } .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { border-top: 0; } .panel > .table-bordered, .panel > .table-responsive > .table-bordered { border: 0; } .panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .panel > .table-bordered > thead > tr:first-child > td, .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, .panel > .table-bordered > tbody > tr:first-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, .panel > .table-bordered > thead > tr:first-child > th, .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, .panel > .table-bordered > tbody > tr:first-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { border-bottom: 0; } .panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { border-bottom: 0; } .panel > .table-responsive { margin-bottom: 0; border: 0; } .panel-group { margin-bottom: 20px; } .panel-group .panel { margin-bottom: 0; border-radius: 4px; } .panel-group .panel + .panel { margin-top: 5px; } .panel-group .panel-heading { border-bottom: 0; } .panel-group .panel-heading + .panel-collapse > .panel-body, .panel-group .panel-heading + .panel-collapse > .list-group { border-top: 1px solid #ddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid #ddd; } .panel-default { border-color: #ddd; } .panel-default > .panel-heading { color: #333; background-color: #f5f5f5; border-color: #ddd; } .panel-default > .panel-heading + .panel-collapse > .panel-body { border-top-color: #ddd; } .panel-default > .panel-heading .badge { color: #f5f5f5; background-color: #333; } .panel-default > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #ddd; } .panel-primary { border-color: #337ab7; } .panel-primary > .panel-heading { color: #fff; background-color: #337ab7; border-color: #337ab7; } .panel-primary > .panel-heading + .panel-collapse > .panel-body { border-top-color: #337ab7; } .panel-primary > .panel-heading .badge { color: #337ab7; background-color: #fff; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #337ab7; } .panel-success { border-color: #d6e9c6; } .panel-success > .panel-heading { color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } .panel-success > .panel-heading + .panel-collapse > .panel-body { border-top-color: #d6e9c6; } .panel-success > .panel-heading .badge { color: #dff0d8; background-color: #3c763d; } .panel-success > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #d6e9c6; } .panel-info { border-color: #bce8f1; } .panel-info > .panel-heading { color: #31708f; background-color: #d9edf7; border-color: #bce8f1; } .panel-info > .panel-heading + .panel-collapse > .panel-body { border-top-color: #bce8f1; } .panel-info > .panel-heading .badge { color: #d9edf7; background-color: #31708f; } .panel-info > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #bce8f1; } .panel-warning { border-color: #faebcc; } .panel-warning > .panel-heading { color: #8a6d3b; background-color: #fcf8e3; border-color: #faebcc; } .panel-warning > .panel-heading + .panel-collapse > .panel-body { border-top-color: #faebcc; } .panel-warning > .panel-heading .badge { color: #fcf8e3; background-color: #8a6d3b; } .panel-warning > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #faebcc; } .panel-danger { border-color: #ebccd1; } .panel-danger > .panel-heading { color: #a94442; background-color: #f2dede; border-color: #ebccd1; } .panel-danger > .panel-heading + .panel-collapse > .panel-body { border-top-color: #ebccd1; } .panel-danger > .panel-heading .badge { color: #f2dede; background-color: #a94442; } .panel-danger > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #ebccd1; } .embed-responsive { position: relative; display: block; height: 0; padding: 0; overflow: hidden; } .embed-responsive .embed-responsive-item, .embed-responsive iframe, .embed-responsive embed, .embed-responsive object, .embed-responsive video { position: absolute; top: 0; bottom: 0; left: 0; width: 100%; height: 100%; border: 0; } .embed-responsive-16by9 { padding-bottom: 56.25%; } .embed-responsive-4by3 { padding-bottom: 75%; } .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #f5f5f5; border: 1px solid #e3e3e3; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); } .well blockquote { border-color: #ddd; border-color: rgba(0, 0, 0, .15); } .well-lg { padding: 24px; border-radius: 6px; } .well-sm { padding: 9px; border-radius: 3px; } .close { float: right; font-size: 21px; font-weight: bold; line-height: 1; color: #000; text-shadow: 0 1px 0 #fff; filter: alpha(opacity=20); opacity: .2; } .close:hover, .close:focus { color: #000; text-decoration: none; cursor: pointer; filter: alpha(opacity=50); opacity: .5; } button.close { -webkit-appearance: none; padding: 0; cursor: pointer; background: transparent; border: 0; } .modal-open { overflow: hidden; } .modal { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1050; display: none; overflow: hidden; -webkit-overflow-scrolling: touch; outline: 0; } .modal.fade .modal-dialog { -webkit-transition: -webkit-transform .3s ease-out; -o-transition: -o-transform .3s ease-out; transition: transform .3s ease-out; -webkit-transform: translate(0, -25%); -ms-transform: translate(0, -25%); -o-transform: translate(0, -25%); transform: translate(0, -25%); } .modal.in .modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); } .modal-open .modal { overflow-x: hidden; overflow-y: auto; } .modal-dialog { position: relative; width: auto; margin: 10px; } .modal-content { position: relative; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; border: 1px solid #999; border: 1px solid rgba(0, 0, 0, .2); border-radius: 6px; outline: 0; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); box-shadow: 0 3px 9px rgba(0, 0, 0, .5); } .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background-color: #000; } .modal-backdrop.fade { filter: alpha(opacity=0); opacity: 0; } .modal-backdrop.in { filter: alpha(opacity=50); opacity: .5; } .modal-header { min-height: 16.42857143px; padding: 15px; border-bottom: 1px solid #e5e5e5; } .modal-header .close { margin-top: -2px; } .modal-title { margin: 0; line-height: 1.42857143; } .modal-body { position: relative; padding: 15px; } .modal-footer { padding: 15px; text-align: right; border-top: 1px solid #e5e5e5; } .modal-footer .btn + .btn { margin-bottom: 0; margin-left: 5px; } .modal-footer .btn-group .btn + .btn { margin-left: -1px; } .modal-footer .btn-block + .btn-block { margin-left: 0; } .modal-scrollbar-measure { position: absolute; top: -9999px; width: 50px; height: 50px; overflow: scroll; } @media (min-width: 768px) { .modal-dialog { width: 600px; margin: 30px auto; } .modal-content { -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); box-shadow: 0 5px 15px rgba(0, 0, 0, .5); } .modal-sm { width: 300px; } } @media (min-width: 992px) { .modal-lg { width: 900px; } } .tooltip { position: absolute; z-index: 1070; display: block; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 12px; font-style: normal; font-weight: normal; line-height: 1.42857143; text-align: left; text-align: start; text-decoration: none; text-shadow: none; text-transform: none; letter-spacing: normal; word-break: normal; word-spacing: normal; word-wrap: normal; white-space: normal; filter: alpha(opacity=0); opacity: 0; line-break: auto; } .tooltip.in { filter: alpha(opacity=90); opacity: .9; } .tooltip.top { padding: 5px 0; margin-top: -3px; } .tooltip.right { padding: 0 5px; margin-left: 3px; } .tooltip.bottom { padding: 5px 0; margin-top: 3px; } .tooltip.left { padding: 0 5px; margin-left: -3px; } .tooltip-inner { max-width: 200px; padding: 3px 8px; color: #fff; text-align: center; background-color: #000; border-radius: 4px; } .tooltip-arrow { position: absolute; width: 0; height: 0; border-color: transparent; border-style: solid; } .tooltip.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.top-left .tooltip-arrow { right: 5px; bottom: 0; margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.top-right .tooltip-arrow { bottom: 0; left: 5px; margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-width: 5px 5px 5px 0; border-right-color: #000; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-width: 5px 0 5px 5px; border-left-color: #000; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .tooltip.bottom-left .tooltip-arrow { top: 0; right: 5px; margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .tooltip.bottom-right .tooltip-arrow { top: 0; left: 5px; margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .popover { position: absolute; top: 0; left: 0; z-index: 1060; display: none; max-width: 276px; padding: 1px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; line-height: 1.42857143; text-align: left; text-align: start; text-decoration: none; text-shadow: none; text-transform: none; letter-spacing: normal; word-break: normal; word-spacing: normal; word-wrap: normal; white-space: normal; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, .2); border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); box-shadow: 0 5px 10px rgba(0, 0, 0, .2); line-break: auto; } .popover.top { margin-top: -10px; } .popover.right { margin-left: 10px; } .popover.bottom { margin-top: 10px; } .popover.left { margin-left: -10px; } .popover-title { padding: 8px 14px; margin: 0; font-size: 14px; background-color: #f7f7f7; border-bottom: 1px solid #ebebeb; border-radius: 5px 5px 0 0; } .popover-content { padding: 9px 14px; } .popover > .arrow, .popover > .arrow:after { position: absolute; display: block; width: 0; height: 0; border-color: transparent; border-style: solid; } .popover > .arrow { border-width: 11px; } .popover > .arrow:after { content: ""; border-width: 10px; } .popover.top > .arrow { bottom: -11px; left: 50%; margin-left: -11px; border-top-color: #999; border-top-color: rgba(0, 0, 0, .25); border-bottom-width: 0; } .popover.top > .arrow:after { bottom: 1px; margin-left: -10px; content: " "; border-top-color: #fff; border-bottom-width: 0; } .popover.right > .arrow { top: 50%; left: -11px; margin-top: -11px; border-right-color: #999; border-right-color: rgba(0, 0, 0, .25); border-left-width: 0; } .popover.right > .arrow:after { bottom: -10px; left: 1px; content: " "; border-right-color: #fff; border-left-width: 0; } .popover.bottom > .arrow { top: -11px; left: 50%; margin-left: -11px; border-top-width: 0; border-bottom-color: #999; border-bottom-color: rgba(0, 0, 0, .25); } .popover.bottom > .arrow:after { top: 1px; margin-left: -10px; content: " "; border-top-width: 0; border-bottom-color: #fff; } .popover.left > .arrow { top: 50%; right: -11px; margin-top: -11px; border-right-width: 0; border-left-color: #999; border-left-color: rgba(0, 0, 0, .25); } .popover.left > .arrow:after { right: 1px; bottom: -10px; content: " "; border-right-width: 0; border-left-color: #fff; } .carousel { position: relative; } .carousel-inner { position: relative; width: 100%; overflow: hidden; } .carousel-inner > .item { position: relative; display: none; -webkit-transition: .6s ease-in-out left; -o-transition: .6s ease-in-out left; transition: .6s ease-in-out left; } .carousel-inner > .item > img, .carousel-inner > .item > a > img { line-height: 1; } @media all and (transform-3d), (-webkit-transform-3d) { .carousel-inner > .item { -webkit-transition: -webkit-transform .6s ease-in-out; -o-transition: -o-transform .6s ease-in-out; transition: transform .6s ease-in-out; -webkit-backface-visibility: hidden; backface-visibility: hidden; -webkit-perspective: 1000px; perspective: 1000px; } .carousel-inner > .item.next, .carousel-inner > .item.active.right { left: 0; -webkit-transform: translate3d(100%, 0, 0); transform: translate3d(100%, 0, 0); } .carousel-inner > .item.prev, .carousel-inner > .item.active.left { left: 0; -webkit-transform: translate3d(-100%, 0, 0); transform: translate3d(-100%, 0, 0); } .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active { left: 0; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } } .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { display: block; } .carousel-inner > .active { left: 0; } .carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0; width: 100%; } .carousel-inner > .next { left: 100%; } .carousel-inner > .prev { left: -100%; } .carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0; } .carousel-inner > .active.left { left: -100%; } .carousel-inner > .active.right { left: 100%; } .carousel-control { position: absolute; top: 0; bottom: 0; left: 0; width: 15%; font-size: 20px; color: #fff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, .6); filter: alpha(opacity=50); opacity: .5; } .carousel-control.left { background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); background-repeat: repeat-x; } .carousel-control.right { right: 0; left: auto; background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); background-repeat: repeat-x; } .carousel-control:hover, .carousel-control:focus { color: #fff; text-decoration: none; filter: alpha(opacity=90); outline: 0; opacity: .9; } .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { position: absolute; top: 50%; z-index: 5; display: inline-block; margin-top: -10px; } .carousel-control .icon-prev, .carousel-control .glyphicon-chevron-left { left: 50%; margin-left: -10px; } .carousel-control .icon-next, .carousel-control .glyphicon-chevron-right { right: 50%; margin-right: -10px; } .carousel-control .icon-prev, .carousel-control .icon-next { width: 20px; height: 20px; font-family: serif; line-height: 1; } .carousel-control .icon-prev:before { content: '\2039'; } .carousel-control .icon-next:before { content: '\203a'; } .carousel-indicators { position: absolute; bottom: 10px; left: 50%; z-index: 15; width: 60%; padding-left: 0; margin-left: -30%; text-align: center; list-style: none; } .carousel-indicators li { display: inline-block; width: 10px; height: 10px; margin: 1px; text-indent: -999px; cursor: pointer; background-color: #000 \9; background-color: rgba(0, 0, 0, 0); border: 1px solid #fff; border-radius: 10px; } .carousel-indicators .active { width: 12px; height: 12px; margin: 0; background-color: #fff; } .carousel-caption { position: absolute; right: 15%; bottom: 20px; left: 15%; z-index: 10; padding-top: 20px; padding-bottom: 20px; color: #fff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, .6); } .carousel-caption .btn { text-shadow: none; } @media screen and (min-width: 768px) { .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right, .carousel-control .icon-prev, .carousel-control .icon-next { width: 30px; height: 30px; margin-top: -15px; font-size: 30px; } .carousel-control .glyphicon-chevron-left, .carousel-control .icon-prev { margin-left: -15px; } .carousel-control .glyphicon-chevron-right, .carousel-control .icon-next { margin-right: -15px; } .carousel-caption { right: 20%; left: 20%; padding-bottom: 30px; } .carousel-indicators { bottom: 20px; } } .clearfix:before, .clearfix:after, .dl-horizontal dd:before, .dl-horizontal dd:after, .container:before, .container:after, .container-fluid:before, .container-fluid:after, .row:before, .row:after, .form-horizontal .form-group:before, .form-horizontal .form-group:after, .btn-toolbar:before, .btn-toolbar:after, .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after, .nav:before, .nav:after, .navbar:before, .navbar:after, .navbar-header:before, .navbar-header:after, .navbar-collapse:before, .navbar-collapse:after, .pager:before, .pager:after, .panel-body:before, .panel-body:after, .modal-footer:before, .modal-footer:after { display: table; content: " "; } .clearfix:after, .dl-horizontal dd:after, .container:after, .container-fluid:after, .row:after, .form-horizontal .form-group:after, .btn-toolbar:after, .btn-group-vertical > .btn-group:after, .nav:after, .navbar:after, .navbar-header:after, .navbar-collapse:after, .pager:after, .panel-body:after, .modal-footer:after { clear: both; } .center-block { display: block; margin-right: auto; margin-left: auto; } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none !important; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .hidden { display: none !important; } .affix { position: fixed; } @-ms-viewport { width: device-width; } .visible-xs, .visible-sm, .visible-md, .visible-lg { display: none !important; } .visible-xs-block, .visible-xs-inline, .visible-xs-inline-block, .visible-sm-block, .visible-sm-inline, .visible-sm-inline-block, .visible-md-block, .visible-md-inline, .visible-md-inline-block, .visible-lg-block, .visible-lg-inline, .visible-lg-inline-block { display: none !important; } @media (max-width: 767px) { .visible-xs { display: block !important; } table.visible-xs { display: table !important; } tr.visible-xs { display: table-row !important; } th.visible-xs, td.visible-xs { display: table-cell !important; } } @media (max-width: 767px) { .visible-xs-block { display: block !important; } } @media (max-width: 767px) { .visible-xs-inline { display: inline !important; } } @media (max-width: 767px) { .visible-xs-inline-block { display: inline-block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm { display: block !important; } table.visible-sm { display: table !important; } tr.visible-sm { display: table-row !important; } th.visible-sm, td.visible-sm { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-block { display: block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline { display: inline !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline-block { display: inline-block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md { display: block !important; } table.visible-md { display: table !important; } tr.visible-md { display: table-row !important; } th.visible-md, td.visible-md { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-block { display: block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline { display: inline !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline-block { display: inline-block !important; } } @media (min-width: 1200px) { .visible-lg { display: block !important; } table.visible-lg { display: table !important; } tr.visible-lg { display: table-row !important; } th.visible-lg, td.visible-lg { display: table-cell !important; } } @media (min-width: 1200px) { .visible-lg-block { display: block !important; } } @media (min-width: 1200px) { .visible-lg-inline { display: inline !important; } } @media (min-width: 1200px) { .visible-lg-inline-block { display: inline-block !important; } } @media (max-width: 767px) { .hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-lg { display: none !important; } } .visible-print { display: none !important; } @media print { .visible-print { display: block !important; } table.visible-print { display: table !important; } tr.visible-print { display: table-row !important; } th.visible-print, td.visible-print { display: table-cell !important; } } .visible-print-block { display: none !important; } @media print { .visible-print-block { display: block !important; } } .visible-print-inline { display: none !important; } @media print { .visible-print-inline { display: inline !important; } } .visible-print-inline-block { display: none !important; } @media print { .visible-print-inline-block { display: inline-block !important; } } @media print { .hidden-print { display: none !important; } } /*# sourceMappingURL=bootstrap.css.map */ ================================================ FILE: resources/public/css/jquery.minicolors.css ================================================ .minicolors { position: relative; } .minicolors-sprite { background-image: url(jquery.minicolors.png); } .minicolors-swatch { position: absolute; vertical-align: middle; background-position: -80px 0; border: solid 1px #ccc; cursor: text; padding: 0; margin: 0; display: inline-block; } .minicolors-swatch-color { position: absolute; top: 0; left: 0; right: 0; bottom: 0; } .minicolors input[type=hidden] + .minicolors-swatch { width: 28px; position: static; cursor: pointer; } .minicolors input[type=hidden][disabled] + .minicolors-swatch { cursor: default; } /* Panel */ .minicolors-panel { position: absolute; width: 173px; background: white; border: solid 1px #CCC; box-shadow: 0 0 20px rgba(0, 0, 0, .2); z-index: 99999; box-sizing: content-box; display: none; } .minicolors-panel.minicolors-visible { display: block; } /* Panel positioning */ .minicolors-position-top .minicolors-panel { top: -154px; } .minicolors-position-right .minicolors-panel { right: 0; } .minicolors-position-bottom .minicolors-panel { top: auto; } .minicolors-position-left .minicolors-panel { left: 0; } .minicolors-with-opacity .minicolors-panel { width: 194px; } .minicolors .minicolors-grid { position: relative; top: 1px; left: 1px; /* LTR */ width: 150px; height: 150px; margin-bottom: 2px; background-position: -120px 0; cursor: crosshair; } [dir=rtl] .minicolors .minicolors-grid { right: 1px; } .minicolors .minicolors-grid-inner { position: absolute; top: 0; left: 0; width: 150px; height: 150px; } .minicolors-slider-saturation .minicolors-grid { background-position: -420px 0; } .minicolors-slider-saturation .minicolors-grid-inner { background-position: -270px 0; background-image: inherit; } .minicolors-slider-brightness .minicolors-grid { background-position: -570px 0; } .minicolors-slider-brightness .minicolors-grid-inner { background-color: black; } .minicolors-slider-wheel .minicolors-grid { background-position: -720px 0; } .minicolors-slider, .minicolors-opacity-slider { position: absolute; top: 1px; left: 152px; /* LTR */ width: 20px; height: 150px; background-color: white; background-position: 0 0; cursor: row-resize; } [dir=rtl] .minicolors-slider, [dir=rtl] .minicolors-opacity-slider { right: 152px; } .minicolors-slider-saturation .minicolors-slider { background-position: -60px 0; } .minicolors-slider-brightness .minicolors-slider { background-position: -20px 0; } .minicolors-slider-wheel .minicolors-slider { background-position: -20px 0; } .minicolors-opacity-slider { left: 173px; /* LTR */ background-position: -40px 0; display: none; } [dir=rtl] .minicolors-opacity-slider { right: 173px; } .minicolors-with-opacity .minicolors-opacity-slider { display: block; } /* Pickers */ .minicolors-grid .minicolors-picker { position: absolute; top: 70px; left: 70px; width: 12px; height: 12px; border: solid 1px black; border-radius: 10px; margin-top: -6px; margin-left: -6px; background: none; } .minicolors-grid .minicolors-picker > div { position: absolute; top: 0; left: 0; width: 8px; height: 8px; border-radius: 8px; border: solid 2px white; box-sizing: content-box; } .minicolors-picker { position: absolute; top: 0; left: 0; width: 18px; height: 2px; background: white; border: solid 1px black; margin-top: -2px; box-sizing: content-box; } /* Swatches */ .minicolors-swatches, .minicolors-swatches li { margin: 5px 0 3px 5px; /* LTR */ padding: 0; list-style: none; overflow: hidden; } [dir=rtl] .minicolors-swatches, [dir=rtl] .minicolors-swatches li { margin: 5px 5px 3px 0; } .minicolors-swatches .minicolors-swatch { position: relative; float: left; /* LTR */ cursor: pointer; margin:0 4px 0 0; /* LTR */ } [dir=rtl] .minicolors-swatches .minicolors-swatch { float: right; margin:0 0 0 4px; } .minicolors-with-opacity .minicolors-swatches .minicolors-swatch { margin-right: 7px; /* LTR */ } [dir=rtl] .minicolors-with-opacity .minicolors-swatches .minicolors-swatch { margin-right: 0; margin-left: 7px; } .minicolors-swatch.selected { border-color: #000; } /* Inline controls */ .minicolors-inline { display: inline-block; } .minicolors-inline .minicolors-input { display: none !important; } .minicolors-inline .minicolors-panel { position: relative; top: auto; left: auto; /* LTR */ box-shadow: none; z-index: auto; display: inline-block; } [dir=rtl] .minicolors-inline .minicolors-panel { right: auto; } /* Default theme */ .minicolors-theme-default .minicolors-swatch { top: 5px; left: 5px; /* LTR */ width: 18px; height: 18px; } [dir=rtl] .minicolors-theme-default .minicolors-swatch { right: 5px; } .minicolors-theme-default .minicolors-swatches .minicolors-swatch { margin-bottom: 2px; top: 0; left: 0; /* LTR */ width: 18px; height: 18px; } [dir=rtl] .minicolors-theme-default .minicolors-swatches .minicolors-swatch { right: 0; } .minicolors-theme-default.minicolors-position-right .minicolors-swatch { left: auto; /* LTR */ right: 5px; /* LTR */ } [dir=rtl] .minicolors-theme-default.minicolors-position-left .minicolors-swatch { right: auto; left: 5px; } .minicolors-theme-default.minicolors { width: auto; display: inline-block; } .minicolors-theme-default .minicolors-input { height: 20px; width: auto; display: inline-block; padding-left: 26px; /* LTR */ } [dir=rtl] .minicolors-theme-default .minicolors-input { text-align: right; unicode-bidi: plaintext; padding-left: 1px; padding-right: 26px; } .minicolors-theme-default.minicolors-position-right .minicolors-input { padding-right: 26px; /* LTR */ padding-left: inherit; /* LTR */ } [dir=rtl] .minicolors-theme-default.minicolors-position-left .minicolors-input { padding-right: inherit; padding-left: 26px; } /* Bootstrap theme */ .minicolors-theme-bootstrap .minicolors-swatch { z-index: 2; top: 3px; left: 3px; /* LTR */ width: 28px; height: 28px; border-radius: 3px; } [dir=rtl] .minicolors-theme-bootstrap .minicolors-swatch { right: 3px; } .minicolors-theme-bootstrap .minicolors-swatches .minicolors-swatch { margin-bottom: 2px; top: 0; left: 0; /* LTR */ width: 20px; height: 20px; } [dir=rtl] .minicolors-theme-bootstrap .minicolors-swatches .minicolors-swatch { right: 0; } .minicolors-theme-bootstrap .minicolors-swatch-color { border-radius: inherit; } .minicolors-theme-bootstrap.minicolors-position-right > .minicolors-swatch { left: auto; /* LTR */ right: 3px; /* LTR */ } [dir=rtl] .minicolors-theme-bootstrap.minicolors-position-left > .minicolors-swatch { right: auto; left: 3px; } .minicolors-theme-bootstrap .minicolors-input { float: none; padding-left: 44px; /* LTR */ } [dir=rtl] .minicolors-theme-bootstrap .minicolors-input { text-align: right; unicode-bidi: plaintext; padding-left: 12px; padding-right: 44px; } .minicolors-theme-bootstrap.minicolors-position-right .minicolors-input { padding-right: 44px; /* LTR */ padding-left: 12px; /* LTR */ } [dir=rtl] .minicolors-theme-bootstrap.minicolors-position-left .minicolors-input { padding-right: 12px; padding-left: 44px; } .minicolors-theme-bootstrap .minicolors-input.input-lg + .minicolors-swatch { top: 4px; left: 4px; /* LTR */ width: 37px; height: 37px; border-radius: 5px; } [dir=rtl] .minicolors-theme-bootstrap .minicolors-input.input-lg + .minicolors-swatch { right: 4px; } .minicolors-theme-bootstrap .minicolors-input.input-sm + .minicolors-swatch { width: 24px; height: 24px; } .minicolors-theme-bootstrap .minicolors-input.input-xs + .minicolors-swatch { width: 18px; height: 18px; } .input-group .minicolors-theme-bootstrap:not(:first-child) .minicolors-input { border-top-left-radius: 0; /* LTR */ border-bottom-left-radius: 0; /* LTR */ } [dir=rtl] .input-group .minicolors-theme-bootstrap .minicolors-input { border-radius: 4px; } [dir=rtl] .input-group .minicolors-theme-bootstrap:not(:first-child) .minicolors-input { border-top-right-radius: 0; border-bottom-right-radius: 0; } [dir=rtl] .input-group .minicolors-theme-bootstrap:not(:last-child) .minicolors-input { border-top-left-radius: 0; border-bottom-left-radius: 0; } /* bootstrap input-group rtl override */ [dir=rtl] .input-group .form-control, [dir=rtl] .input-group-addon, [dir=rtl] .input-group-btn > .btn, [dir=rtl] .input-group-btn > .btn-group > .btn, [dir=rtl] .input-group-btn > .dropdown-toggle { border: 1px solid #ccc; border-radius: 4px; } [dir=rtl] .input-group .form-control:first-child, [dir=rtl] .input-group-addon:first-child, [dir=rtl] .input-group-btn:first-child > .btn, [dir=rtl] .input-group-btn:first-child > .btn-group > .btn, [dir=rtl] .input-group-btn:first-child > .dropdown-toggle, [dir=rtl] .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), [dir=rtl] .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { border-top-left-radius: 0; border-bottom-left-radius: 0; border-left: 0; } [dir=rtl] .input-group .form-control:last-child, [dir=rtl] .input-group-addon:last-child, [dir=rtl] .input-group-btn:last-child > .btn, [dir=rtl] .input-group-btn:last-child > .btn-group > .btn, [dir=rtl] .input-group-btn:last-child > .dropdown-toggle, [dir=rtl] .input-group-btn:first-child > .btn:not(:first-child), [dir=rtl] .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { border-top-right-radius: 0; border-bottom-right-radius: 0; } /* Semantic Ui theme */ .minicolors-theme-semanticui .minicolors-swatch { top: 0; left: 0; /* LTR */ padding: 18px; } [dir=rtl] .minicolors-theme-semanticui .minicolors-swatch { right: 0; } .minicolors-theme-semanticui input { text-indent: 30px; } ================================================ FILE: resources/public/css/screen.css ================================================ html, body { font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; height: 100%; padding-top: 35px; } .table>tbody>tr>td { padding: 3px; } .table-bordered>tbody>tr>td { border: 2px solid #060606; } ================================================ FILE: resources/public/css/show.css ================================================ td.cue-cell { width: 90px; max-width: 100px; height: 50px; max-height: 60px; text-align: center; overflow: hidden; -ms-text-overflow: ellipsis; -o-text-overflow: ellipsis; text-overflow: ellipsis; word-wrap: break-word; -webkit-user-select: none; /* webkit (safari, chrome) browsers */ -moz-user-select: none; /* mozilla browsers */ -khtml-user-select: none; /* webkit (konqueror) browsers */ -ms-user-select: none; /* IE10+ */ } .btn-mini { padding: 2px 6px; font-size: 11px; line-height: 13px; } table.metronome { text-align: center; } .table tbody>tr>th.division { text-align: center; } .table>tbody>tr>td.metronome { padding: 0px; -webkit-user-select: none; /* webkit (safari, chrome) browsers */ -moz-user-select: none; /* mozilla browsers */ -khtml-user-select: none; /* webkit (konqueror) browsers */ -ms-user-select: none; /* IE10+ */ } .table>tbody>tr>th.metronome { padding: 0px; -webkit-user-select: none; /* webkit (safari, chrome) browsers */ -moz-user-select: none; /* mozilla browsers */ -khtml-user-select: none; /* webkit (konqueror) browsers */ -ms-user-select: none; /* IE10+ */ } .table tbody>tr>td.metronome-sync { text-align: left; vertical-align: middle; } .table tbody>tr>td.metronome-sync .metronome-active { background-color: lightblue; } .table tbody>tr>td.metronome-sync .metronome-blink { color: yellow; } .table tbody>tr>td.metronome-adjust .metronome-active { color: lightblue; } .table tbody>tr>td.metronome-reset { color: red; } .table tbody>tr>td.metronome-reset .metronome-active { color: #f77; } .time-fraction { color: #aaa; } .slider-track { background-color: slategray; } .slider-track-high { background-color: darkslategray; } .slider-track-low { background-color: slategray; } .slider-selection { background: slategray; } /* #slider-in-bpm .slider-track-high { background: darkslategray; } #slider-in-bpm .slider-selection { background: slategray; } */ #slider-in-grand-master .tooltip-inner { background-color: slategray; } #slider-in-grand-master .tooltip.bottom .tooltip-arrow { border-bottom-color: slategray; } #loadBar { vertical-align: text-top; } #effects-table .tooltip-inner { background-color: gray; } #effects-table .tooltip.top .tooltip-arrow { border-top-color: gray; } #effects-table td { vertical-align: middle; } .effect-var-table { background: transparent; } .effect-var-table td { padding: 1px; background: transparent; } ================================================ FILE: resources/public/css/web-repl.css ================================================ #console { background: #222222; color: #888888; margin: 10px; border-radius: 5px; -moz-border-radius: 5px; border: 1px solid #080808; } #console div.jquery-console-inner { margin: 10px 10px; overflow: auto; text-align: left; } #console div.jquery-console-welcome { color: #55aaff; font-family: sans-serif; font-weight: bold; padding: 0.1em; } #console div.jquery-console-message-value { color: #4488ff; font-family: monospace; padding: 0.1em; } #console div.jquery-console-prompt-box { color: #ffffcc; font-family: monospace; } #console div.jquery-console-focus span.jquery-console-cursor { background: #eee; color: #333; font-weight: bold; } #console div.jquery-console-message-error { color: #ef0505; font-family: sans-serif; font-weight: bold; padding: 0.1em; } #console div.jquery-console-message-success { color: #187718; font-family: monospace; padding: 0.1em; } #console span.jquery-console-prompt-label { font-weight: bold; } ================================================ FILE: resources/public/epl-v10.html ================================================ Eclipse Public License - Version 1.0

Eclipse Public License - v 1.0

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.

1. DEFINITIONS

"Contribution" means:

a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and

b) in the case of each subsequent Contributor:

i) changes to the Program, and

ii) additions to the Program;

where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.

"Contributor" means any person or entity that distributes the Program.

"Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.

"Program" means the Contributions distributed in accordance with this Agreement.

"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.

2. GRANT OF RIGHTS

a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.

b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.

c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.

d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.

3. REQUIREMENTS

A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:

a) it complies with the terms and conditions of this Agreement; and

b) its license agreement:

i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;

ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;

iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and

iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.

When the Program is made available in source code form:

a) it must be made available under this Agreement; and

b) a copy of this Agreement must be included with each copy of the Program.

Contributors may not remove or alter any copyright notices contained within the Program.

Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.

4. COMMERCIAL DISTRIBUTION

Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.

For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.

5. NO WARRANTY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.

6. DISCLAIMER OF LIABILITY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

7. GENERAL

If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.

If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.

All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.

Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.

This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.

================================================ FILE: resources/public/font-awesome-4.5.0/HELP-US-OUT.txt ================================================ I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, Fonticons (https://fonticons.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, comprehensive icon sets or copy and paste your own. Please. Check it out. -Dave Gandy ================================================ FILE: resources/public/font-awesome-4.5.0/css/font-awesome.css ================================================ /*! * Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ /* FONT PATH * -------------------------- */ @font-face { font-family: 'FontAwesome'; src: url('../fonts/fontawesome-webfont.eot?v=4.5.0'); src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.5.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.5.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.5.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.5.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular') format('svg'); font-weight: normal; font-style: normal; } .fa { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* makes the font 33% larger relative to the icon container */ .fa-lg { font-size: 1.33333333em; line-height: 0.75em; vertical-align: -15%; } .fa-2x { font-size: 2em; } .fa-3x { font-size: 3em; } .fa-4x { font-size: 4em; } .fa-5x { font-size: 5em; } .fa-fw { width: 1.28571429em; text-align: center; } .fa-ul { padding-left: 0; margin-left: 2.14285714em; list-style-type: none; } .fa-ul > li { position: relative; } .fa-li { position: absolute; left: -2.14285714em; width: 2.14285714em; top: 0.14285714em; text-align: center; } .fa-li.fa-lg { left: -1.85714286em; } .fa-border { padding: .2em .25em .15em; border: solid 0.08em #eeeeee; border-radius: .1em; } .fa-pull-left { float: left; } .fa-pull-right { float: right; } .fa.fa-pull-left { margin-right: .3em; } .fa.fa-pull-right { margin-left: .3em; } /* Deprecated as of 4.4.0 */ .pull-right { float: right; } .pull-left { float: left; } .fa.pull-left { margin-right: .3em; } .fa.pull-right { margin-left: .3em; } .fa-spin { -webkit-animation: fa-spin 2s infinite linear; animation: fa-spin 2s infinite linear; } .fa-pulse { -webkit-animation: fa-spin 1s infinite steps(8); animation: fa-spin 1s infinite steps(8); } @-webkit-keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } @keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } .fa-rotate-90 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); -webkit-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg); } .fa-rotate-180 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); -webkit-transform: rotate(180deg); -ms-transform: rotate(180deg); transform: rotate(180deg); } .fa-rotate-270 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); -webkit-transform: rotate(270deg); -ms-transform: rotate(270deg); transform: rotate(270deg); } .fa-flip-horizontal { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); -webkit-transform: scale(-1, 1); -ms-transform: scale(-1, 1); transform: scale(-1, 1); } .fa-flip-vertical { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); -webkit-transform: scale(1, -1); -ms-transform: scale(1, -1); transform: scale(1, -1); } :root .fa-rotate-90, :root .fa-rotate-180, :root .fa-rotate-270, :root .fa-flip-horizontal, :root .fa-flip-vertical { filter: none; } .fa-stack { position: relative; display: inline-block; width: 2em; height: 2em; line-height: 2em; vertical-align: middle; } .fa-stack-1x, .fa-stack-2x { position: absolute; left: 0; width: 100%; text-align: center; } .fa-stack-1x { line-height: inherit; } .fa-stack-2x { font-size: 2em; } .fa-inverse { color: #ffffff; } /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .fa-glass:before { content: "\f000"; } .fa-music:before { content: "\f001"; } .fa-search:before { content: "\f002"; } .fa-envelope-o:before { content: "\f003"; } .fa-heart:before { content: "\f004"; } .fa-star:before { content: "\f005"; } .fa-star-o:before { content: "\f006"; } .fa-user:before { content: "\f007"; } .fa-film:before { content: "\f008"; } .fa-th-large:before { content: "\f009"; } .fa-th:before { content: "\f00a"; } .fa-th-list:before { content: "\f00b"; } .fa-check:before { content: "\f00c"; } .fa-remove:before, .fa-close:before, .fa-times:before { content: "\f00d"; } .fa-search-plus:before { content: "\f00e"; } .fa-search-minus:before { content: "\f010"; } .fa-power-off:before { content: "\f011"; } .fa-signal:before { content: "\f012"; } .fa-gear:before, .fa-cog:before { content: "\f013"; } .fa-trash-o:before { content: "\f014"; } .fa-home:before { content: "\f015"; } .fa-file-o:before { content: "\f016"; } .fa-clock-o:before { content: "\f017"; } .fa-road:before { content: "\f018"; } .fa-download:before { content: "\f019"; } .fa-arrow-circle-o-down:before { content: "\f01a"; } .fa-arrow-circle-o-up:before { content: "\f01b"; } .fa-inbox:before { content: "\f01c"; } .fa-play-circle-o:before { content: "\f01d"; } .fa-rotate-right:before, .fa-repeat:before { content: "\f01e"; } .fa-refresh:before { content: "\f021"; } .fa-list-alt:before { content: "\f022"; } .fa-lock:before { content: "\f023"; } .fa-flag:before { content: "\f024"; } .fa-headphones:before { content: "\f025"; } .fa-volume-off:before { content: "\f026"; } .fa-volume-down:before { content: "\f027"; } .fa-volume-up:before { content: "\f028"; } .fa-qrcode:before { content: "\f029"; } .fa-barcode:before { content: "\f02a"; } .fa-tag:before { content: "\f02b"; } .fa-tags:before { content: "\f02c"; } .fa-book:before { content: "\f02d"; } .fa-bookmark:before { content: "\f02e"; } .fa-print:before { content: "\f02f"; } .fa-camera:before { content: "\f030"; } .fa-font:before { content: "\f031"; } .fa-bold:before { content: "\f032"; } .fa-italic:before { content: "\f033"; } .fa-text-height:before { content: "\f034"; } .fa-text-width:before { content: "\f035"; } .fa-align-left:before { content: "\f036"; } .fa-align-center:before { content: "\f037"; } .fa-align-right:before { content: "\f038"; } .fa-align-justify:before { content: "\f039"; } .fa-list:before { content: "\f03a"; } .fa-dedent:before, .fa-outdent:before { content: "\f03b"; } .fa-indent:before { content: "\f03c"; } .fa-video-camera:before { content: "\f03d"; } .fa-photo:before, .fa-image:before, .fa-picture-o:before { content: "\f03e"; } .fa-pencil:before { content: "\f040"; } .fa-map-marker:before { content: "\f041"; } .fa-adjust:before { content: "\f042"; } .fa-tint:before { content: "\f043"; } .fa-edit:before, .fa-pencil-square-o:before { content: "\f044"; } .fa-share-square-o:before { content: "\f045"; } .fa-check-square-o:before { content: "\f046"; } .fa-arrows:before { content: "\f047"; } .fa-step-backward:before { content: "\f048"; } .fa-fast-backward:before { content: "\f049"; } .fa-backward:before { content: "\f04a"; } .fa-play:before { content: "\f04b"; } .fa-pause:before { content: "\f04c"; } .fa-stop:before { content: "\f04d"; } .fa-forward:before { content: "\f04e"; } .fa-fast-forward:before { content: "\f050"; } .fa-step-forward:before { content: "\f051"; } .fa-eject:before { content: "\f052"; } .fa-chevron-left:before { content: "\f053"; } .fa-chevron-right:before { content: "\f054"; } .fa-plus-circle:before { content: "\f055"; } .fa-minus-circle:before { content: "\f056"; } .fa-times-circle:before { content: "\f057"; } .fa-check-circle:before { content: "\f058"; } .fa-question-circle:before { content: "\f059"; } .fa-info-circle:before { content: "\f05a"; } .fa-crosshairs:before { content: "\f05b"; } .fa-times-circle-o:before { content: "\f05c"; } .fa-check-circle-o:before { content: "\f05d"; } .fa-ban:before { content: "\f05e"; } .fa-arrow-left:before { content: "\f060"; } .fa-arrow-right:before { content: "\f061"; } .fa-arrow-up:before { content: "\f062"; } .fa-arrow-down:before { content: "\f063"; } .fa-mail-forward:before, .fa-share:before { content: "\f064"; } .fa-expand:before { content: "\f065"; } .fa-compress:before { content: "\f066"; } .fa-plus:before { content: "\f067"; } .fa-minus:before { content: "\f068"; } .fa-asterisk:before { content: "\f069"; } .fa-exclamation-circle:before { content: "\f06a"; } .fa-gift:before { content: "\f06b"; } .fa-leaf:before { content: "\f06c"; } .fa-fire:before { content: "\f06d"; } .fa-eye:before { content: "\f06e"; } .fa-eye-slash:before { content: "\f070"; } .fa-warning:before, .fa-exclamation-triangle:before { content: "\f071"; } .fa-plane:before { content: "\f072"; } .fa-calendar:before { content: "\f073"; } .fa-random:before { content: "\f074"; } .fa-comment:before { content: "\f075"; } .fa-magnet:before { content: "\f076"; } .fa-chevron-up:before { content: "\f077"; } .fa-chevron-down:before { content: "\f078"; } .fa-retweet:before { content: "\f079"; } .fa-shopping-cart:before { content: "\f07a"; } .fa-folder:before { content: "\f07b"; } .fa-folder-open:before { content: "\f07c"; } .fa-arrows-v:before { content: "\f07d"; } .fa-arrows-h:before { content: "\f07e"; } .fa-bar-chart-o:before, .fa-bar-chart:before { content: "\f080"; } .fa-twitter-square:before { content: "\f081"; } .fa-facebook-square:before { content: "\f082"; } .fa-camera-retro:before { content: "\f083"; } .fa-key:before { content: "\f084"; } .fa-gears:before, .fa-cogs:before { content: "\f085"; } .fa-comments:before { content: "\f086"; } .fa-thumbs-o-up:before { content: "\f087"; } .fa-thumbs-o-down:before { content: "\f088"; } .fa-star-half:before { content: "\f089"; } .fa-heart-o:before { content: "\f08a"; } .fa-sign-out:before { content: "\f08b"; } .fa-linkedin-square:before { content: "\f08c"; } .fa-thumb-tack:before { content: "\f08d"; } .fa-external-link:before { content: "\f08e"; } .fa-sign-in:before { content: "\f090"; } .fa-trophy:before { content: "\f091"; } .fa-github-square:before { content: "\f092"; } .fa-upload:before { content: "\f093"; } .fa-lemon-o:before { content: "\f094"; } .fa-phone:before { content: "\f095"; } .fa-square-o:before { content: "\f096"; } .fa-bookmark-o:before { content: "\f097"; } .fa-phone-square:before { content: "\f098"; } .fa-twitter:before { content: "\f099"; } .fa-facebook-f:before, .fa-facebook:before { content: "\f09a"; } .fa-github:before { content: "\f09b"; } .fa-unlock:before { content: "\f09c"; } .fa-credit-card:before { content: "\f09d"; } .fa-feed:before, .fa-rss:before { content: "\f09e"; } .fa-hdd-o:before { content: "\f0a0"; } .fa-bullhorn:before { content: "\f0a1"; } .fa-bell:before { content: "\f0f3"; } .fa-certificate:before { content: "\f0a3"; } .fa-hand-o-right:before { content: "\f0a4"; } .fa-hand-o-left:before { content: "\f0a5"; } .fa-hand-o-up:before { content: "\f0a6"; } .fa-hand-o-down:before { content: "\f0a7"; } .fa-arrow-circle-left:before { content: "\f0a8"; } .fa-arrow-circle-right:before { content: "\f0a9"; } .fa-arrow-circle-up:before { content: "\f0aa"; } .fa-arrow-circle-down:before { content: "\f0ab"; } .fa-globe:before { content: "\f0ac"; } .fa-wrench:before { content: "\f0ad"; } .fa-tasks:before { content: "\f0ae"; } .fa-filter:before { content: "\f0b0"; } .fa-briefcase:before { content: "\f0b1"; } .fa-arrows-alt:before { content: "\f0b2"; } .fa-group:before, .fa-users:before { content: "\f0c0"; } .fa-chain:before, .fa-link:before { content: "\f0c1"; } .fa-cloud:before { content: "\f0c2"; } .fa-flask:before { content: "\f0c3"; } .fa-cut:before, .fa-scissors:before { content: "\f0c4"; } .fa-copy:before, .fa-files-o:before { content: "\f0c5"; } .fa-paperclip:before { content: "\f0c6"; } .fa-save:before, .fa-floppy-o:before { content: "\f0c7"; } .fa-square:before { content: "\f0c8"; } .fa-navicon:before, .fa-reorder:before, .fa-bars:before { content: "\f0c9"; } .fa-list-ul:before { content: "\f0ca"; } .fa-list-ol:before { content: "\f0cb"; } .fa-strikethrough:before { content: "\f0cc"; } .fa-underline:before { content: "\f0cd"; } .fa-table:before { content: "\f0ce"; } .fa-magic:before { content: "\f0d0"; } .fa-truck:before { content: "\f0d1"; } .fa-pinterest:before { content: "\f0d2"; } .fa-pinterest-square:before { content: "\f0d3"; } .fa-google-plus-square:before { content: "\f0d4"; } .fa-google-plus:before { content: "\f0d5"; } .fa-money:before { content: "\f0d6"; } .fa-caret-down:before { content: "\f0d7"; } .fa-caret-up:before { content: "\f0d8"; } .fa-caret-left:before { content: "\f0d9"; } .fa-caret-right:before { content: "\f0da"; } .fa-columns:before { content: "\f0db"; } .fa-unsorted:before, .fa-sort:before { content: "\f0dc"; } .fa-sort-down:before, .fa-sort-desc:before { content: "\f0dd"; } .fa-sort-up:before, .fa-sort-asc:before { content: "\f0de"; } .fa-envelope:before { content: "\f0e0"; } .fa-linkedin:before { content: "\f0e1"; } .fa-rotate-left:before, .fa-undo:before { content: "\f0e2"; } .fa-legal:before, .fa-gavel:before { content: "\f0e3"; } .fa-dashboard:before, .fa-tachometer:before { content: "\f0e4"; } .fa-comment-o:before { content: "\f0e5"; } .fa-comments-o:before { content: "\f0e6"; } .fa-flash:before, .fa-bolt:before { content: "\f0e7"; } .fa-sitemap:before { content: "\f0e8"; } .fa-umbrella:before { content: "\f0e9"; } .fa-paste:before, .fa-clipboard:before { content: "\f0ea"; } .fa-lightbulb-o:before { content: "\f0eb"; } .fa-exchange:before { content: "\f0ec"; } .fa-cloud-download:before { content: "\f0ed"; } .fa-cloud-upload:before { content: "\f0ee"; } .fa-user-md:before { content: "\f0f0"; } .fa-stethoscope:before { content: "\f0f1"; } .fa-suitcase:before { content: "\f0f2"; } .fa-bell-o:before { content: "\f0a2"; } .fa-coffee:before { content: "\f0f4"; } .fa-cutlery:before { content: "\f0f5"; } .fa-file-text-o:before { content: "\f0f6"; } .fa-building-o:before { content: "\f0f7"; } .fa-hospital-o:before { content: "\f0f8"; } .fa-ambulance:before { content: "\f0f9"; } .fa-medkit:before { content: "\f0fa"; } .fa-fighter-jet:before { content: "\f0fb"; } .fa-beer:before { content: "\f0fc"; } .fa-h-square:before { content: "\f0fd"; } .fa-plus-square:before { content: "\f0fe"; } .fa-angle-double-left:before { content: "\f100"; } .fa-angle-double-right:before { content: "\f101"; } .fa-angle-double-up:before { content: "\f102"; } .fa-angle-double-down:before { content: "\f103"; } .fa-angle-left:before { content: "\f104"; } .fa-angle-right:before { content: "\f105"; } .fa-angle-up:before { content: "\f106"; } .fa-angle-down:before { content: "\f107"; } .fa-desktop:before { content: "\f108"; } .fa-laptop:before { content: "\f109"; } .fa-tablet:before { content: "\f10a"; } .fa-mobile-phone:before, .fa-mobile:before { content: "\f10b"; } .fa-circle-o:before { content: "\f10c"; } .fa-quote-left:before { content: "\f10d"; } .fa-quote-right:before { content: "\f10e"; } .fa-spinner:before { content: "\f110"; } .fa-circle:before { content: "\f111"; } .fa-mail-reply:before, .fa-reply:before { content: "\f112"; } .fa-github-alt:before { content: "\f113"; } .fa-folder-o:before { content: "\f114"; } .fa-folder-open-o:before { content: "\f115"; } .fa-smile-o:before { content: "\f118"; } .fa-frown-o:before { content: "\f119"; } .fa-meh-o:before { content: "\f11a"; } .fa-gamepad:before { content: "\f11b"; } .fa-keyboard-o:before { content: "\f11c"; } .fa-flag-o:before { content: "\f11d"; } .fa-flag-checkered:before { content: "\f11e"; } .fa-terminal:before { content: "\f120"; } .fa-code:before { content: "\f121"; } .fa-mail-reply-all:before, .fa-reply-all:before { content: "\f122"; } .fa-star-half-empty:before, .fa-star-half-full:before, .fa-star-half-o:before { content: "\f123"; } .fa-location-arrow:before { content: "\f124"; } .fa-crop:before { content: "\f125"; } .fa-code-fork:before { content: "\f126"; } .fa-unlink:before, .fa-chain-broken:before { content: "\f127"; } .fa-question:before { content: "\f128"; } .fa-info:before { content: "\f129"; } .fa-exclamation:before { content: "\f12a"; } .fa-superscript:before { content: "\f12b"; } .fa-subscript:before { content: "\f12c"; } .fa-eraser:before { content: "\f12d"; } .fa-puzzle-piece:before { content: "\f12e"; } .fa-microphone:before { content: "\f130"; } .fa-microphone-slash:before { content: "\f131"; } .fa-shield:before { content: "\f132"; } .fa-calendar-o:before { content: "\f133"; } .fa-fire-extinguisher:before { content: "\f134"; } .fa-rocket:before { content: "\f135"; } .fa-maxcdn:before { content: "\f136"; } .fa-chevron-circle-left:before { content: "\f137"; } .fa-chevron-circle-right:before { content: "\f138"; } .fa-chevron-circle-up:before { content: "\f139"; } .fa-chevron-circle-down:before { content: "\f13a"; } .fa-html5:before { content: "\f13b"; } .fa-css3:before { content: "\f13c"; } .fa-anchor:before { content: "\f13d"; } .fa-unlock-alt:before { content: "\f13e"; } .fa-bullseye:before { content: "\f140"; } .fa-ellipsis-h:before { content: "\f141"; } .fa-ellipsis-v:before { content: "\f142"; } .fa-rss-square:before { content: "\f143"; } .fa-play-circle:before { content: "\f144"; } .fa-ticket:before { content: "\f145"; } .fa-minus-square:before { content: "\f146"; } .fa-minus-square-o:before { content: "\f147"; } .fa-level-up:before { content: "\f148"; } .fa-level-down:before { content: "\f149"; } .fa-check-square:before { content: "\f14a"; } .fa-pencil-square:before { content: "\f14b"; } .fa-external-link-square:before { content: "\f14c"; } .fa-share-square:before { content: "\f14d"; } .fa-compass:before { content: "\f14e"; } .fa-toggle-down:before, .fa-caret-square-o-down:before { content: "\f150"; } .fa-toggle-up:before, .fa-caret-square-o-up:before { content: "\f151"; } .fa-toggle-right:before, .fa-caret-square-o-right:before { content: "\f152"; } .fa-euro:before, .fa-eur:before { content: "\f153"; } .fa-gbp:before { content: "\f154"; } .fa-dollar:before, .fa-usd:before { content: "\f155"; } .fa-rupee:before, .fa-inr:before { content: "\f156"; } .fa-cny:before, .fa-rmb:before, .fa-yen:before, .fa-jpy:before { content: "\f157"; } .fa-ruble:before, .fa-rouble:before, .fa-rub:before { content: "\f158"; } .fa-won:before, .fa-krw:before { content: "\f159"; } .fa-bitcoin:before, .fa-btc:before { content: "\f15a"; } .fa-file:before { content: "\f15b"; } .fa-file-text:before { content: "\f15c"; } .fa-sort-alpha-asc:before { content: "\f15d"; } .fa-sort-alpha-desc:before { content: "\f15e"; } .fa-sort-amount-asc:before { content: "\f160"; } .fa-sort-amount-desc:before { content: "\f161"; } .fa-sort-numeric-asc:before { content: "\f162"; } .fa-sort-numeric-desc:before { content: "\f163"; } .fa-thumbs-up:before { content: "\f164"; } .fa-thumbs-down:before { content: "\f165"; } .fa-youtube-square:before { content: "\f166"; } .fa-youtube:before { content: "\f167"; } .fa-xing:before { content: "\f168"; } .fa-xing-square:before { content: "\f169"; } .fa-youtube-play:before { content: "\f16a"; } .fa-dropbox:before { content: "\f16b"; } .fa-stack-overflow:before { content: "\f16c"; } .fa-instagram:before { content: "\f16d"; } .fa-flickr:before { content: "\f16e"; } .fa-adn:before { content: "\f170"; } .fa-bitbucket:before { content: "\f171"; } .fa-bitbucket-square:before { content: "\f172"; } .fa-tumblr:before { content: "\f173"; } .fa-tumblr-square:before { content: "\f174"; } .fa-long-arrow-down:before { content: "\f175"; } .fa-long-arrow-up:before { content: "\f176"; } .fa-long-arrow-left:before { content: "\f177"; } .fa-long-arrow-right:before { content: "\f178"; } .fa-apple:before { content: "\f179"; } .fa-windows:before { content: "\f17a"; } .fa-android:before { content: "\f17b"; } .fa-linux:before { content: "\f17c"; } .fa-dribbble:before { content: "\f17d"; } .fa-skype:before { content: "\f17e"; } .fa-foursquare:before { content: "\f180"; } .fa-trello:before { content: "\f181"; } .fa-female:before { content: "\f182"; } .fa-male:before { content: "\f183"; } .fa-gittip:before, .fa-gratipay:before { content: "\f184"; } .fa-sun-o:before { content: "\f185"; } .fa-moon-o:before { content: "\f186"; } .fa-archive:before { content: "\f187"; } .fa-bug:before { content: "\f188"; } .fa-vk:before { content: "\f189"; } .fa-weibo:before { content: "\f18a"; } .fa-renren:before { content: "\f18b"; } .fa-pagelines:before { content: "\f18c"; } .fa-stack-exchange:before { content: "\f18d"; } .fa-arrow-circle-o-right:before { content: "\f18e"; } .fa-arrow-circle-o-left:before { content: "\f190"; } .fa-toggle-left:before, .fa-caret-square-o-left:before { content: "\f191"; } .fa-dot-circle-o:before { content: "\f192"; } .fa-wheelchair:before { content: "\f193"; } .fa-vimeo-square:before { content: "\f194"; } .fa-turkish-lira:before, .fa-try:before { content: "\f195"; } .fa-plus-square-o:before { content: "\f196"; } .fa-space-shuttle:before { content: "\f197"; } .fa-slack:before { content: "\f198"; } .fa-envelope-square:before { content: "\f199"; } .fa-wordpress:before { content: "\f19a"; } .fa-openid:before { content: "\f19b"; } .fa-institution:before, .fa-bank:before, .fa-university:before { content: "\f19c"; } .fa-mortar-board:before, .fa-graduation-cap:before { content: "\f19d"; } .fa-yahoo:before { content: "\f19e"; } .fa-google:before { content: "\f1a0"; } .fa-reddit:before { content: "\f1a1"; } .fa-reddit-square:before { content: "\f1a2"; } .fa-stumbleupon-circle:before { content: "\f1a3"; } .fa-stumbleupon:before { content: "\f1a4"; } .fa-delicious:before { content: "\f1a5"; } .fa-digg:before { content: "\f1a6"; } .fa-pied-piper:before { content: "\f1a7"; } .fa-pied-piper-alt:before { content: "\f1a8"; } .fa-drupal:before { content: "\f1a9"; } .fa-joomla:before { content: "\f1aa"; } .fa-language:before { content: "\f1ab"; } .fa-fax:before { content: "\f1ac"; } .fa-building:before { content: "\f1ad"; } .fa-child:before { content: "\f1ae"; } .fa-paw:before { content: "\f1b0"; } .fa-spoon:before { content: "\f1b1"; } .fa-cube:before { content: "\f1b2"; } .fa-cubes:before { content: "\f1b3"; } .fa-behance:before { content: "\f1b4"; } .fa-behance-square:before { content: "\f1b5"; } .fa-steam:before { content: "\f1b6"; } .fa-steam-square:before { content: "\f1b7"; } .fa-recycle:before { content: "\f1b8"; } .fa-automobile:before, .fa-car:before { content: "\f1b9"; } .fa-cab:before, .fa-taxi:before { content: "\f1ba"; } .fa-tree:before { content: "\f1bb"; } .fa-spotify:before { content: "\f1bc"; } .fa-deviantart:before { content: "\f1bd"; } .fa-soundcloud:before { content: "\f1be"; } .fa-database:before { content: "\f1c0"; } .fa-file-pdf-o:before { content: "\f1c1"; } .fa-file-word-o:before { content: "\f1c2"; } .fa-file-excel-o:before { content: "\f1c3"; } .fa-file-powerpoint-o:before { content: "\f1c4"; } .fa-file-photo-o:before, .fa-file-picture-o:before, .fa-file-image-o:before { content: "\f1c5"; } .fa-file-zip-o:before, .fa-file-archive-o:before { content: "\f1c6"; } .fa-file-sound-o:before, .fa-file-audio-o:before { content: "\f1c7"; } .fa-file-movie-o:before, .fa-file-video-o:before { content: "\f1c8"; } .fa-file-code-o:before { content: "\f1c9"; } .fa-vine:before { content: "\f1ca"; } .fa-codepen:before { content: "\f1cb"; } .fa-jsfiddle:before { content: "\f1cc"; } .fa-life-bouy:before, .fa-life-buoy:before, .fa-life-saver:before, .fa-support:before, .fa-life-ring:before { content: "\f1cd"; } .fa-circle-o-notch:before { content: "\f1ce"; } .fa-ra:before, .fa-rebel:before { content: "\f1d0"; } .fa-ge:before, .fa-empire:before { content: "\f1d1"; } .fa-git-square:before { content: "\f1d2"; } .fa-git:before { content: "\f1d3"; } .fa-y-combinator-square:before, .fa-yc-square:before, .fa-hacker-news:before { content: "\f1d4"; } .fa-tencent-weibo:before { content: "\f1d5"; } .fa-qq:before { content: "\f1d6"; } .fa-wechat:before, .fa-weixin:before { content: "\f1d7"; } .fa-send:before, .fa-paper-plane:before { content: "\f1d8"; } .fa-send-o:before, .fa-paper-plane-o:before { content: "\f1d9"; } .fa-history:before { content: "\f1da"; } .fa-circle-thin:before { content: "\f1db"; } .fa-header:before { content: "\f1dc"; } .fa-paragraph:before { content: "\f1dd"; } .fa-sliders:before { content: "\f1de"; } .fa-share-alt:before { content: "\f1e0"; } .fa-share-alt-square:before { content: "\f1e1"; } .fa-bomb:before { content: "\f1e2"; } .fa-soccer-ball-o:before, .fa-futbol-o:before { content: "\f1e3"; } .fa-tty:before { content: "\f1e4"; } .fa-binoculars:before { content: "\f1e5"; } .fa-plug:before { content: "\f1e6"; } .fa-slideshare:before { content: "\f1e7"; } .fa-twitch:before { content: "\f1e8"; } .fa-yelp:before { content: "\f1e9"; } .fa-newspaper-o:before { content: "\f1ea"; } .fa-wifi:before { content: "\f1eb"; } .fa-calculator:before { content: "\f1ec"; } .fa-paypal:before { content: "\f1ed"; } .fa-google-wallet:before { content: "\f1ee"; } .fa-cc-visa:before { content: "\f1f0"; } .fa-cc-mastercard:before { content: "\f1f1"; } .fa-cc-discover:before { content: "\f1f2"; } .fa-cc-amex:before { content: "\f1f3"; } .fa-cc-paypal:before { content: "\f1f4"; } .fa-cc-stripe:before { content: "\f1f5"; } .fa-bell-slash:before { content: "\f1f6"; } .fa-bell-slash-o:before { content: "\f1f7"; } .fa-trash:before { content: "\f1f8"; } .fa-copyright:before { content: "\f1f9"; } .fa-at:before { content: "\f1fa"; } .fa-eyedropper:before { content: "\f1fb"; } .fa-paint-brush:before { content: "\f1fc"; } .fa-birthday-cake:before { content: "\f1fd"; } .fa-area-chart:before { content: "\f1fe"; } .fa-pie-chart:before { content: "\f200"; } .fa-line-chart:before { content: "\f201"; } .fa-lastfm:before { content: "\f202"; } .fa-lastfm-square:before { content: "\f203"; } .fa-toggle-off:before { content: "\f204"; } .fa-toggle-on:before { content: "\f205"; } .fa-bicycle:before { content: "\f206"; } .fa-bus:before { content: "\f207"; } .fa-ioxhost:before { content: "\f208"; } .fa-angellist:before { content: "\f209"; } .fa-cc:before { content: "\f20a"; } .fa-shekel:before, .fa-sheqel:before, .fa-ils:before { content: "\f20b"; } .fa-meanpath:before { content: "\f20c"; } .fa-buysellads:before { content: "\f20d"; } .fa-connectdevelop:before { content: "\f20e"; } .fa-dashcube:before { content: "\f210"; } .fa-forumbee:before { content: "\f211"; } .fa-leanpub:before { content: "\f212"; } .fa-sellsy:before { content: "\f213"; } .fa-shirtsinbulk:before { content: "\f214"; } .fa-simplybuilt:before { content: "\f215"; } .fa-skyatlas:before { content: "\f216"; } .fa-cart-plus:before { content: "\f217"; } .fa-cart-arrow-down:before { content: "\f218"; } .fa-diamond:before { content: "\f219"; } .fa-ship:before { content: "\f21a"; } .fa-user-secret:before { content: "\f21b"; } .fa-motorcycle:before { content: "\f21c"; } .fa-street-view:before { content: "\f21d"; } .fa-heartbeat:before { content: "\f21e"; } .fa-venus:before { content: "\f221"; } .fa-mars:before { content: "\f222"; } .fa-mercury:before { content: "\f223"; } .fa-intersex:before, .fa-transgender:before { content: "\f224"; } .fa-transgender-alt:before { content: "\f225"; } .fa-venus-double:before { content: "\f226"; } .fa-mars-double:before { content: "\f227"; } .fa-venus-mars:before { content: "\f228"; } .fa-mars-stroke:before { content: "\f229"; } .fa-mars-stroke-v:before { content: "\f22a"; } .fa-mars-stroke-h:before { content: "\f22b"; } .fa-neuter:before { content: "\f22c"; } .fa-genderless:before { content: "\f22d"; } .fa-facebook-official:before { content: "\f230"; } .fa-pinterest-p:before { content: "\f231"; } .fa-whatsapp:before { content: "\f232"; } .fa-server:before { content: "\f233"; } .fa-user-plus:before { content: "\f234"; } .fa-user-times:before { content: "\f235"; } .fa-hotel:before, .fa-bed:before { content: "\f236"; } .fa-viacoin:before { content: "\f237"; } .fa-train:before { content: "\f238"; } .fa-subway:before { content: "\f239"; } .fa-medium:before { content: "\f23a"; } .fa-yc:before, .fa-y-combinator:before { content: "\f23b"; } .fa-optin-monster:before { content: "\f23c"; } .fa-opencart:before { content: "\f23d"; } .fa-expeditedssl:before { content: "\f23e"; } .fa-battery-4:before, .fa-battery-full:before { content: "\f240"; } .fa-battery-3:before, .fa-battery-three-quarters:before { content: "\f241"; } .fa-battery-2:before, .fa-battery-half:before { content: "\f242"; } .fa-battery-1:before, .fa-battery-quarter:before { content: "\f243"; } .fa-battery-0:before, .fa-battery-empty:before { content: "\f244"; } .fa-mouse-pointer:before { content: "\f245"; } .fa-i-cursor:before { content: "\f246"; } .fa-object-group:before { content: "\f247"; } .fa-object-ungroup:before { content: "\f248"; } .fa-sticky-note:before { content: "\f249"; } .fa-sticky-note-o:before { content: "\f24a"; } .fa-cc-jcb:before { content: "\f24b"; } .fa-cc-diners-club:before { content: "\f24c"; } .fa-clone:before { content: "\f24d"; } .fa-balance-scale:before { content: "\f24e"; } .fa-hourglass-o:before { content: "\f250"; } .fa-hourglass-1:before, .fa-hourglass-start:before { content: "\f251"; } .fa-hourglass-2:before, .fa-hourglass-half:before { content: "\f252"; } .fa-hourglass-3:before, .fa-hourglass-end:before { content: "\f253"; } .fa-hourglass:before { content: "\f254"; } .fa-hand-grab-o:before, .fa-hand-rock-o:before { content: "\f255"; } .fa-hand-stop-o:before, .fa-hand-paper-o:before { content: "\f256"; } .fa-hand-scissors-o:before { content: "\f257"; } .fa-hand-lizard-o:before { content: "\f258"; } .fa-hand-spock-o:before { content: "\f259"; } .fa-hand-pointer-o:before { content: "\f25a"; } .fa-hand-peace-o:before { content: "\f25b"; } .fa-trademark:before { content: "\f25c"; } .fa-registered:before { content: "\f25d"; } .fa-creative-commons:before { content: "\f25e"; } .fa-gg:before { content: "\f260"; } .fa-gg-circle:before { content: "\f261"; } .fa-tripadvisor:before { content: "\f262"; } .fa-odnoklassniki:before { content: "\f263"; } .fa-odnoklassniki-square:before { content: "\f264"; } .fa-get-pocket:before { content: "\f265"; } .fa-wikipedia-w:before { content: "\f266"; } .fa-safari:before { content: "\f267"; } .fa-chrome:before { content: "\f268"; } .fa-firefox:before { content: "\f269"; } .fa-opera:before { content: "\f26a"; } .fa-internet-explorer:before { content: "\f26b"; } .fa-tv:before, .fa-television:before { content: "\f26c"; } .fa-contao:before { content: "\f26d"; } .fa-500px:before { content: "\f26e"; } .fa-amazon:before { content: "\f270"; } .fa-calendar-plus-o:before { content: "\f271"; } .fa-calendar-minus-o:before { content: "\f272"; } .fa-calendar-times-o:before { content: "\f273"; } .fa-calendar-check-o:before { content: "\f274"; } .fa-industry:before { content: "\f275"; } .fa-map-pin:before { content: "\f276"; } .fa-map-signs:before { content: "\f277"; } .fa-map-o:before { content: "\f278"; } .fa-map:before { content: "\f279"; } .fa-commenting:before { content: "\f27a"; } .fa-commenting-o:before { content: "\f27b"; } .fa-houzz:before { content: "\f27c"; } .fa-vimeo:before { content: "\f27d"; } .fa-black-tie:before { content: "\f27e"; } .fa-fonticons:before { content: "\f280"; } .fa-reddit-alien:before { content: "\f281"; } .fa-edge:before { content: "\f282"; } .fa-credit-card-alt:before { content: "\f283"; } .fa-codiepie:before { content: "\f284"; } .fa-modx:before { content: "\f285"; } .fa-fort-awesome:before { content: "\f286"; } .fa-usb:before { content: "\f287"; } .fa-product-hunt:before { content: "\f288"; } .fa-mixcloud:before { content: "\f289"; } .fa-scribd:before { content: "\f28a"; } .fa-pause-circle:before { content: "\f28b"; } .fa-pause-circle-o:before { content: "\f28c"; } .fa-stop-circle:before { content: "\f28d"; } .fa-stop-circle-o:before { content: "\f28e"; } .fa-shopping-bag:before { content: "\f290"; } .fa-shopping-basket:before { content: "\f291"; } .fa-hashtag:before { content: "\f292"; } .fa-bluetooth:before { content: "\f293"; } .fa-bluetooth-b:before { content: "\f294"; } .fa-percent:before { content: "\f295"; } ================================================ FILE: resources/public/font-awesome-4.5.0/less/animated.less ================================================ // Animated Icons // -------------------------- .@{fa-css-prefix}-spin { -webkit-animation: fa-spin 2s infinite linear; animation: fa-spin 2s infinite linear; } .@{fa-css-prefix}-pulse { -webkit-animation: fa-spin 1s infinite steps(8); animation: fa-spin 1s infinite steps(8); } @-webkit-keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } @keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } ================================================ FILE: resources/public/font-awesome-4.5.0/less/bordered-pulled.less ================================================ // Bordered & Pulled // ------------------------- .@{fa-css-prefix}-border { padding: .2em .25em .15em; border: solid .08em @fa-border-color; border-radius: .1em; } .@{fa-css-prefix}-pull-left { float: left; } .@{fa-css-prefix}-pull-right { float: right; } .@{fa-css-prefix} { &.@{fa-css-prefix}-pull-left { margin-right: .3em; } &.@{fa-css-prefix}-pull-right { margin-left: .3em; } } /* Deprecated as of 4.4.0 */ .pull-right { float: right; } .pull-left { float: left; } .@{fa-css-prefix} { &.pull-left { margin-right: .3em; } &.pull-right { margin-left: .3em; } } ================================================ FILE: resources/public/font-awesome-4.5.0/less/core.less ================================================ // Base Class Definition // ------------------------- .@{fa-css-prefix} { display: inline-block; font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration font-size: inherit; // can't have font-size inherit on line above, so need to override text-rendering: auto; // optimizelegibility throws things off #1094 -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } ================================================ FILE: resources/public/font-awesome-4.5.0/less/fixed-width.less ================================================ // Fixed Width Icons // ------------------------- .@{fa-css-prefix}-fw { width: (18em / 14); text-align: center; } ================================================ FILE: resources/public/font-awesome-4.5.0/less/font-awesome.less ================================================ /*! * Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ @import "variables.less"; @import "mixins.less"; @import "path.less"; @import "core.less"; @import "larger.less"; @import "fixed-width.less"; @import "list.less"; @import "bordered-pulled.less"; @import "animated.less"; @import "rotated-flipped.less"; @import "stacked.less"; @import "icons.less"; ================================================ FILE: resources/public/font-awesome-4.5.0/less/icons.less ================================================ /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .@{fa-css-prefix}-glass:before { content: @fa-var-glass; } .@{fa-css-prefix}-music:before { content: @fa-var-music; } .@{fa-css-prefix}-search:before { content: @fa-var-search; } .@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; } .@{fa-css-prefix}-heart:before { content: @fa-var-heart; } .@{fa-css-prefix}-star:before { content: @fa-var-star; } .@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; } .@{fa-css-prefix}-user:before { content: @fa-var-user; } .@{fa-css-prefix}-film:before { content: @fa-var-film; } .@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; } .@{fa-css-prefix}-th:before { content: @fa-var-th; } .@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; } .@{fa-css-prefix}-check:before { content: @fa-var-check; } .@{fa-css-prefix}-remove:before, .@{fa-css-prefix}-close:before, .@{fa-css-prefix}-times:before { content: @fa-var-times; } .@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; } .@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; } .@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; } .@{fa-css-prefix}-signal:before { content: @fa-var-signal; } .@{fa-css-prefix}-gear:before, .@{fa-css-prefix}-cog:before { content: @fa-var-cog; } .@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; } .@{fa-css-prefix}-home:before { content: @fa-var-home; } .@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; } .@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; } .@{fa-css-prefix}-road:before { content: @fa-var-road; } .@{fa-css-prefix}-download:before { content: @fa-var-download; } .@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; } .@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; } .@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; } .@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; } .@{fa-css-prefix}-rotate-right:before, .@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; } .@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; } .@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; } .@{fa-css-prefix}-lock:before { content: @fa-var-lock; } .@{fa-css-prefix}-flag:before { content: @fa-var-flag; } .@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; } .@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; } .@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; } .@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; } .@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; } .@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; } .@{fa-css-prefix}-tag:before { content: @fa-var-tag; } .@{fa-css-prefix}-tags:before { content: @fa-var-tags; } .@{fa-css-prefix}-book:before { content: @fa-var-book; } .@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; } .@{fa-css-prefix}-print:before { content: @fa-var-print; } .@{fa-css-prefix}-camera:before { content: @fa-var-camera; } .@{fa-css-prefix}-font:before { content: @fa-var-font; } .@{fa-css-prefix}-bold:before { content: @fa-var-bold; } .@{fa-css-prefix}-italic:before { content: @fa-var-italic; } .@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; } .@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; } .@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; } .@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; } .@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; } .@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; } .@{fa-css-prefix}-list:before { content: @fa-var-list; } .@{fa-css-prefix}-dedent:before, .@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; } .@{fa-css-prefix}-indent:before { content: @fa-var-indent; } .@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; } .@{fa-css-prefix}-photo:before, .@{fa-css-prefix}-image:before, .@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; } .@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; } .@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; } .@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; } .@{fa-css-prefix}-tint:before { content: @fa-var-tint; } .@{fa-css-prefix}-edit:before, .@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; } .@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; } .@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; } .@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; } .@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; } .@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; } .@{fa-css-prefix}-backward:before { content: @fa-var-backward; } .@{fa-css-prefix}-play:before { content: @fa-var-play; } .@{fa-css-prefix}-pause:before { content: @fa-var-pause; } .@{fa-css-prefix}-stop:before { content: @fa-var-stop; } .@{fa-css-prefix}-forward:before { content: @fa-var-forward; } .@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; } .@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; } .@{fa-css-prefix}-eject:before { content: @fa-var-eject; } .@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; } .@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; } .@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; } .@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; } .@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; } .@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; } .@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; } .@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; } .@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; } .@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; } .@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; } .@{fa-css-prefix}-ban:before { content: @fa-var-ban; } .@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; } .@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; } .@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; } .@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; } .@{fa-css-prefix}-mail-forward:before, .@{fa-css-prefix}-share:before { content: @fa-var-share; } .@{fa-css-prefix}-expand:before { content: @fa-var-expand; } .@{fa-css-prefix}-compress:before { content: @fa-var-compress; } .@{fa-css-prefix}-plus:before { content: @fa-var-plus; } .@{fa-css-prefix}-minus:before { content: @fa-var-minus; } .@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; } .@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; } .@{fa-css-prefix}-gift:before { content: @fa-var-gift; } .@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; } .@{fa-css-prefix}-fire:before { content: @fa-var-fire; } .@{fa-css-prefix}-eye:before { content: @fa-var-eye; } .@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; } .@{fa-css-prefix}-warning:before, .@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; } .@{fa-css-prefix}-plane:before { content: @fa-var-plane; } .@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; } .@{fa-css-prefix}-random:before { content: @fa-var-random; } .@{fa-css-prefix}-comment:before { content: @fa-var-comment; } .@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; } .@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; } .@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; } .@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; } .@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; } .@{fa-css-prefix}-folder:before { content: @fa-var-folder; } .@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; } .@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; } .@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; } .@{fa-css-prefix}-bar-chart-o:before, .@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; } .@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; } .@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; } .@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; } .@{fa-css-prefix}-key:before { content: @fa-var-key; } .@{fa-css-prefix}-gears:before, .@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; } .@{fa-css-prefix}-comments:before { content: @fa-var-comments; } .@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; } .@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; } .@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; } .@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; } .@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; } .@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; } .@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; } .@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; } .@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; } .@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; } .@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; } .@{fa-css-prefix}-upload:before { content: @fa-var-upload; } .@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; } .@{fa-css-prefix}-phone:before { content: @fa-var-phone; } .@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; } .@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; } .@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; } .@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; } .@{fa-css-prefix}-facebook-f:before, .@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; } .@{fa-css-prefix}-github:before { content: @fa-var-github; } .@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; } .@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; } .@{fa-css-prefix}-feed:before, .@{fa-css-prefix}-rss:before { content: @fa-var-rss; } .@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; } .@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; } .@{fa-css-prefix}-bell:before { content: @fa-var-bell; } .@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; } .@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; } .@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; } .@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; } .@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; } .@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; } .@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; } .@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; } .@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; } .@{fa-css-prefix}-globe:before { content: @fa-var-globe; } .@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; } .@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; } .@{fa-css-prefix}-filter:before { content: @fa-var-filter; } .@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; } .@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; } .@{fa-css-prefix}-group:before, .@{fa-css-prefix}-users:before { content: @fa-var-users; } .@{fa-css-prefix}-chain:before, .@{fa-css-prefix}-link:before { content: @fa-var-link; } .@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; } .@{fa-css-prefix}-flask:before { content: @fa-var-flask; } .@{fa-css-prefix}-cut:before, .@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; } .@{fa-css-prefix}-copy:before, .@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; } .@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; } .@{fa-css-prefix}-save:before, .@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; } .@{fa-css-prefix}-square:before { content: @fa-var-square; } .@{fa-css-prefix}-navicon:before, .@{fa-css-prefix}-reorder:before, .@{fa-css-prefix}-bars:before { content: @fa-var-bars; } .@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; } .@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; } .@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; } .@{fa-css-prefix}-underline:before { content: @fa-var-underline; } .@{fa-css-prefix}-table:before { content: @fa-var-table; } .@{fa-css-prefix}-magic:before { content: @fa-var-magic; } .@{fa-css-prefix}-truck:before { content: @fa-var-truck; } .@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; } .@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; } .@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; } .@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; } .@{fa-css-prefix}-money:before { content: @fa-var-money; } .@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; } .@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; } .@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; } .@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; } .@{fa-css-prefix}-columns:before { content: @fa-var-columns; } .@{fa-css-prefix}-unsorted:before, .@{fa-css-prefix}-sort:before { content: @fa-var-sort; } .@{fa-css-prefix}-sort-down:before, .@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; } .@{fa-css-prefix}-sort-up:before, .@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; } .@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; } .@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; } .@{fa-css-prefix}-rotate-left:before, .@{fa-css-prefix}-undo:before { content: @fa-var-undo; } .@{fa-css-prefix}-legal:before, .@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; } .@{fa-css-prefix}-dashboard:before, .@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; } .@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; } .@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; } .@{fa-css-prefix}-flash:before, .@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; } .@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; } .@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; } .@{fa-css-prefix}-paste:before, .@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; } .@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; } .@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; } .@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; } .@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; } .@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; } .@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; } .@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; } .@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; } .@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; } .@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; } .@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; } .@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; } .@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; } .@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; } .@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; } .@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; } .@{fa-css-prefix}-beer:before { content: @fa-var-beer; } .@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; } .@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; } .@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; } .@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; } .@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; } .@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; } .@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; } .@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; } .@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; } .@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; } .@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; } .@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; } .@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; } .@{fa-css-prefix}-mobile-phone:before, .@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; } .@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; } .@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; } .@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; } .@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; } .@{fa-css-prefix}-circle:before { content: @fa-var-circle; } .@{fa-css-prefix}-mail-reply:before, .@{fa-css-prefix}-reply:before { content: @fa-var-reply; } .@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; } .@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; } .@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; } .@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; } .@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; } .@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; } .@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; } .@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; } .@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; } .@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; } .@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; } .@{fa-css-prefix}-code:before { content: @fa-var-code; } .@{fa-css-prefix}-mail-reply-all:before, .@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; } .@{fa-css-prefix}-star-half-empty:before, .@{fa-css-prefix}-star-half-full:before, .@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; } .@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; } .@{fa-css-prefix}-crop:before { content: @fa-var-crop; } .@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; } .@{fa-css-prefix}-unlink:before, .@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; } .@{fa-css-prefix}-question:before { content: @fa-var-question; } .@{fa-css-prefix}-info:before { content: @fa-var-info; } .@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; } .@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; } .@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; } .@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; } .@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; } .@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; } .@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; } .@{fa-css-prefix}-shield:before { content: @fa-var-shield; } .@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; } .@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; } .@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; } .@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; } .@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; } .@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; } .@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; } .@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; } .@{fa-css-prefix}-html5:before { content: @fa-var-html5; } .@{fa-css-prefix}-css3:before { content: @fa-var-css3; } .@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; } .@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; } .@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; } .@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; } .@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; } .@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; } .@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; } .@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; } .@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; } .@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; } .@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; } .@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; } .@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; } .@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; } .@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; } .@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; } .@{fa-css-prefix}-compass:before { content: @fa-var-compass; } .@{fa-css-prefix}-toggle-down:before, .@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; } .@{fa-css-prefix}-toggle-up:before, .@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; } .@{fa-css-prefix}-toggle-right:before, .@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; } .@{fa-css-prefix}-euro:before, .@{fa-css-prefix}-eur:before { content: @fa-var-eur; } .@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; } .@{fa-css-prefix}-dollar:before, .@{fa-css-prefix}-usd:before { content: @fa-var-usd; } .@{fa-css-prefix}-rupee:before, .@{fa-css-prefix}-inr:before { content: @fa-var-inr; } .@{fa-css-prefix}-cny:before, .@{fa-css-prefix}-rmb:before, .@{fa-css-prefix}-yen:before, .@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; } .@{fa-css-prefix}-ruble:before, .@{fa-css-prefix}-rouble:before, .@{fa-css-prefix}-rub:before { content: @fa-var-rub; } .@{fa-css-prefix}-won:before, .@{fa-css-prefix}-krw:before { content: @fa-var-krw; } .@{fa-css-prefix}-bitcoin:before, .@{fa-css-prefix}-btc:before { content: @fa-var-btc; } .@{fa-css-prefix}-file:before { content: @fa-var-file; } .@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; } .@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; } .@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; } .@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; } .@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; } .@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; } .@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; } .@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; } .@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; } .@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; } .@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; } .@{fa-css-prefix}-xing:before { content: @fa-var-xing; } .@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; } .@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; } .@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; } .@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; } .@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; } .@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; } .@{fa-css-prefix}-adn:before { content: @fa-var-adn; } .@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; } .@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; } .@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; } .@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; } .@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; } .@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; } .@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; } .@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; } .@{fa-css-prefix}-apple:before { content: @fa-var-apple; } .@{fa-css-prefix}-windows:before { content: @fa-var-windows; } .@{fa-css-prefix}-android:before { content: @fa-var-android; } .@{fa-css-prefix}-linux:before { content: @fa-var-linux; } .@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; } .@{fa-css-prefix}-skype:before { content: @fa-var-skype; } .@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; } .@{fa-css-prefix}-trello:before { content: @fa-var-trello; } .@{fa-css-prefix}-female:before { content: @fa-var-female; } .@{fa-css-prefix}-male:before { content: @fa-var-male; } .@{fa-css-prefix}-gittip:before, .@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; } .@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; } .@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; } .@{fa-css-prefix}-archive:before { content: @fa-var-archive; } .@{fa-css-prefix}-bug:before { content: @fa-var-bug; } .@{fa-css-prefix}-vk:before { content: @fa-var-vk; } .@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; } .@{fa-css-prefix}-renren:before { content: @fa-var-renren; } .@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; } .@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; } .@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; } .@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; } .@{fa-css-prefix}-toggle-left:before, .@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; } .@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; } .@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; } .@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; } .@{fa-css-prefix}-turkish-lira:before, .@{fa-css-prefix}-try:before { content: @fa-var-try; } .@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; } .@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; } .@{fa-css-prefix}-slack:before { content: @fa-var-slack; } .@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; } .@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; } .@{fa-css-prefix}-openid:before { content: @fa-var-openid; } .@{fa-css-prefix}-institution:before, .@{fa-css-prefix}-bank:before, .@{fa-css-prefix}-university:before { content: @fa-var-university; } .@{fa-css-prefix}-mortar-board:before, .@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; } .@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; } .@{fa-css-prefix}-google:before { content: @fa-var-google; } .@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; } .@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; } .@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; } .@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; } .@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; } .@{fa-css-prefix}-digg:before { content: @fa-var-digg; } .@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; } .@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; } .@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; } .@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; } .@{fa-css-prefix}-language:before { content: @fa-var-language; } .@{fa-css-prefix}-fax:before { content: @fa-var-fax; } .@{fa-css-prefix}-building:before { content: @fa-var-building; } .@{fa-css-prefix}-child:before { content: @fa-var-child; } .@{fa-css-prefix}-paw:before { content: @fa-var-paw; } .@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; } .@{fa-css-prefix}-cube:before { content: @fa-var-cube; } .@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; } .@{fa-css-prefix}-behance:before { content: @fa-var-behance; } .@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; } .@{fa-css-prefix}-steam:before { content: @fa-var-steam; } .@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; } .@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; } .@{fa-css-prefix}-automobile:before, .@{fa-css-prefix}-car:before { content: @fa-var-car; } .@{fa-css-prefix}-cab:before, .@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; } .@{fa-css-prefix}-tree:before { content: @fa-var-tree; } .@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; } .@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; } .@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; } .@{fa-css-prefix}-database:before { content: @fa-var-database; } .@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; } .@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; } .@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; } .@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; } .@{fa-css-prefix}-file-photo-o:before, .@{fa-css-prefix}-file-picture-o:before, .@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; } .@{fa-css-prefix}-file-zip-o:before, .@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; } .@{fa-css-prefix}-file-sound-o:before, .@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; } .@{fa-css-prefix}-file-movie-o:before, .@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; } .@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; } .@{fa-css-prefix}-vine:before { content: @fa-var-vine; } .@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; } .@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; } .@{fa-css-prefix}-life-bouy:before, .@{fa-css-prefix}-life-buoy:before, .@{fa-css-prefix}-life-saver:before, .@{fa-css-prefix}-support:before, .@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; } .@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; } .@{fa-css-prefix}-ra:before, .@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; } .@{fa-css-prefix}-ge:before, .@{fa-css-prefix}-empire:before { content: @fa-var-empire; } .@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; } .@{fa-css-prefix}-git:before { content: @fa-var-git; } .@{fa-css-prefix}-y-combinator-square:before, .@{fa-css-prefix}-yc-square:before, .@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; } .@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; } .@{fa-css-prefix}-qq:before { content: @fa-var-qq; } .@{fa-css-prefix}-wechat:before, .@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; } .@{fa-css-prefix}-send:before, .@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; } .@{fa-css-prefix}-send-o:before, .@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; } .@{fa-css-prefix}-history:before { content: @fa-var-history; } .@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; } .@{fa-css-prefix}-header:before { content: @fa-var-header; } .@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; } .@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; } .@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; } .@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; } .@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; } .@{fa-css-prefix}-soccer-ball-o:before, .@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; } .@{fa-css-prefix}-tty:before { content: @fa-var-tty; } .@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; } .@{fa-css-prefix}-plug:before { content: @fa-var-plug; } .@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; } .@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; } .@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; } .@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; } .@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; } .@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; } .@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; } .@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; } .@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; } .@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; } .@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; } .@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; } .@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; } .@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; } .@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; } .@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; } .@{fa-css-prefix}-trash:before { content: @fa-var-trash; } .@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; } .@{fa-css-prefix}-at:before { content: @fa-var-at; } .@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; } .@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; } .@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; } .@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; } .@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; } .@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; } .@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; } .@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; } .@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; } .@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; } .@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; } .@{fa-css-prefix}-bus:before { content: @fa-var-bus; } .@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; } .@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; } .@{fa-css-prefix}-cc:before { content: @fa-var-cc; } .@{fa-css-prefix}-shekel:before, .@{fa-css-prefix}-sheqel:before, .@{fa-css-prefix}-ils:before { content: @fa-var-ils; } .@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; } .@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; } .@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; } .@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; } .@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; } .@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; } .@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; } .@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; } .@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; } .@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; } .@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; } .@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; } .@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; } .@{fa-css-prefix}-ship:before { content: @fa-var-ship; } .@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; } .@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; } .@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; } .@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; } .@{fa-css-prefix}-venus:before { content: @fa-var-venus; } .@{fa-css-prefix}-mars:before { content: @fa-var-mars; } .@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; } .@{fa-css-prefix}-intersex:before, .@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; } .@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; } .@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; } .@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; } .@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; } .@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; } .@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; } .@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; } .@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; } .@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; } .@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; } .@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; } .@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; } .@{fa-css-prefix}-server:before { content: @fa-var-server; } .@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; } .@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; } .@{fa-css-prefix}-hotel:before, .@{fa-css-prefix}-bed:before { content: @fa-var-bed; } .@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; } .@{fa-css-prefix}-train:before { content: @fa-var-train; } .@{fa-css-prefix}-subway:before { content: @fa-var-subway; } .@{fa-css-prefix}-medium:before { content: @fa-var-medium; } .@{fa-css-prefix}-yc:before, .@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; } .@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; } .@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; } .@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; } .@{fa-css-prefix}-battery-4:before, .@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; } .@{fa-css-prefix}-battery-3:before, .@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; } .@{fa-css-prefix}-battery-2:before, .@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; } .@{fa-css-prefix}-battery-1:before, .@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; } .@{fa-css-prefix}-battery-0:before, .@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; } .@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; } .@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; } .@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; } .@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; } .@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; } .@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; } .@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; } .@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; } .@{fa-css-prefix}-clone:before { content: @fa-var-clone; } .@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; } .@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; } .@{fa-css-prefix}-hourglass-1:before, .@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; } .@{fa-css-prefix}-hourglass-2:before, .@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; } .@{fa-css-prefix}-hourglass-3:before, .@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; } .@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; } .@{fa-css-prefix}-hand-grab-o:before, .@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; } .@{fa-css-prefix}-hand-stop-o:before, .@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; } .@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; } .@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; } .@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; } .@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; } .@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; } .@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; } .@{fa-css-prefix}-registered:before { content: @fa-var-registered; } .@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; } .@{fa-css-prefix}-gg:before { content: @fa-var-gg; } .@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; } .@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; } .@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; } .@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; } .@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; } .@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; } .@{fa-css-prefix}-safari:before { content: @fa-var-safari; } .@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; } .@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; } .@{fa-css-prefix}-opera:before { content: @fa-var-opera; } .@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; } .@{fa-css-prefix}-tv:before, .@{fa-css-prefix}-television:before { content: @fa-var-television; } .@{fa-css-prefix}-contao:before { content: @fa-var-contao; } .@{fa-css-prefix}-500px:before { content: @fa-var-500px; } .@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; } .@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; } .@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; } .@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; } .@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; } .@{fa-css-prefix}-industry:before { content: @fa-var-industry; } .@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; } .@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; } .@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; } .@{fa-css-prefix}-map:before { content: @fa-var-map; } .@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; } .@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; } .@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; } .@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; } .@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; } .@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; } .@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; } .@{fa-css-prefix}-edge:before { content: @fa-var-edge; } .@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; } .@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; } .@{fa-css-prefix}-modx:before { content: @fa-var-modx; } .@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; } .@{fa-css-prefix}-usb:before { content: @fa-var-usb; } .@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; } .@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; } .@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; } .@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; } .@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; } .@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; } .@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; } .@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; } .@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; } .@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; } .@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; } .@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; } .@{fa-css-prefix}-percent:before { content: @fa-var-percent; } ================================================ FILE: resources/public/font-awesome-4.5.0/less/larger.less ================================================ // Icon Sizes // ------------------------- /* makes the font 33% larger relative to the icon container */ .@{fa-css-prefix}-lg { font-size: (4em / 3); line-height: (3em / 4); vertical-align: -15%; } .@{fa-css-prefix}-2x { font-size: 2em; } .@{fa-css-prefix}-3x { font-size: 3em; } .@{fa-css-prefix}-4x { font-size: 4em; } .@{fa-css-prefix}-5x { font-size: 5em; } ================================================ FILE: resources/public/font-awesome-4.5.0/less/list.less ================================================ // List Icons // ------------------------- .@{fa-css-prefix}-ul { padding-left: 0; margin-left: @fa-li-width; list-style-type: none; > li { position: relative; } } .@{fa-css-prefix}-li { position: absolute; left: -@fa-li-width; width: @fa-li-width; top: (2em / 14); text-align: center; &.@{fa-css-prefix}-lg { left: (-@fa-li-width + (4em / 14)); } } ================================================ FILE: resources/public/font-awesome-4.5.0/less/mixins.less ================================================ // Mixins // -------------------------- .fa-icon() { display: inline-block; font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration font-size: inherit; // can't have font-size inherit on line above, so need to override text-rendering: auto; // optimizelegibility throws things off #1094 -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .fa-icon-rotate(@degrees, @rotation) { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation); -webkit-transform: rotate(@degrees); -ms-transform: rotate(@degrees); transform: rotate(@degrees); } .fa-icon-flip(@horiz, @vert, @rotation) { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1); -webkit-transform: scale(@horiz, @vert); -ms-transform: scale(@horiz, @vert); transform: scale(@horiz, @vert); } ================================================ FILE: resources/public/font-awesome-4.5.0/less/path.less ================================================ /* FONT PATH * -------------------------- */ @font-face { font-family: 'FontAwesome'; src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts font-weight: normal; font-style: normal; } ================================================ FILE: resources/public/font-awesome-4.5.0/less/rotated-flipped.less ================================================ // Rotated & Flipped Icons // ------------------------- .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } // Hook for IE8-9 // ------------------------- :root .@{fa-css-prefix}-rotate-90, :root .@{fa-css-prefix}-rotate-180, :root .@{fa-css-prefix}-rotate-270, :root .@{fa-css-prefix}-flip-horizontal, :root .@{fa-css-prefix}-flip-vertical { filter: none; } ================================================ FILE: resources/public/font-awesome-4.5.0/less/stacked.less ================================================ // Stacked Icons // ------------------------- .@{fa-css-prefix}-stack { position: relative; display: inline-block; width: 2em; height: 2em; line-height: 2em; vertical-align: middle; } .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { position: absolute; left: 0; width: 100%; text-align: center; } .@{fa-css-prefix}-stack-1x { line-height: inherit; } .@{fa-css-prefix}-stack-2x { font-size: 2em; } .@{fa-css-prefix}-inverse { color: @fa-inverse; } ================================================ FILE: resources/public/font-awesome-4.5.0/less/variables.less ================================================ // Variables // -------------------------- @fa-font-path: "../fonts"; @fa-font-size-base: 14px; @fa-line-height-base: 1; //@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.5.0/fonts"; // for referencing Bootstrap CDN font files directly @fa-css-prefix: fa; @fa-version: "4.5.0"; @fa-border-color: #eee; @fa-inverse: #fff; @fa-li-width: (30em / 14); @fa-var-500px: "\f26e"; @fa-var-adjust: "\f042"; @fa-var-adn: "\f170"; @fa-var-align-center: "\f037"; @fa-var-align-justify: "\f039"; @fa-var-align-left: "\f036"; @fa-var-align-right: "\f038"; @fa-var-amazon: "\f270"; @fa-var-ambulance: "\f0f9"; @fa-var-anchor: "\f13d"; @fa-var-android: "\f17b"; @fa-var-angellist: "\f209"; @fa-var-angle-double-down: "\f103"; @fa-var-angle-double-left: "\f100"; @fa-var-angle-double-right: "\f101"; @fa-var-angle-double-up: "\f102"; @fa-var-angle-down: "\f107"; @fa-var-angle-left: "\f104"; @fa-var-angle-right: "\f105"; @fa-var-angle-up: "\f106"; @fa-var-apple: "\f179"; @fa-var-archive: "\f187"; @fa-var-area-chart: "\f1fe"; @fa-var-arrow-circle-down: "\f0ab"; @fa-var-arrow-circle-left: "\f0a8"; @fa-var-arrow-circle-o-down: "\f01a"; @fa-var-arrow-circle-o-left: "\f190"; @fa-var-arrow-circle-o-right: "\f18e"; @fa-var-arrow-circle-o-up: "\f01b"; @fa-var-arrow-circle-right: "\f0a9"; @fa-var-arrow-circle-up: "\f0aa"; @fa-var-arrow-down: "\f063"; @fa-var-arrow-left: "\f060"; @fa-var-arrow-right: "\f061"; @fa-var-arrow-up: "\f062"; @fa-var-arrows: "\f047"; @fa-var-arrows-alt: "\f0b2"; @fa-var-arrows-h: "\f07e"; @fa-var-arrows-v: "\f07d"; @fa-var-asterisk: "\f069"; @fa-var-at: "\f1fa"; @fa-var-automobile: "\f1b9"; @fa-var-backward: "\f04a"; @fa-var-balance-scale: "\f24e"; @fa-var-ban: "\f05e"; @fa-var-bank: "\f19c"; @fa-var-bar-chart: "\f080"; @fa-var-bar-chart-o: "\f080"; @fa-var-barcode: "\f02a"; @fa-var-bars: "\f0c9"; @fa-var-battery-0: "\f244"; @fa-var-battery-1: "\f243"; @fa-var-battery-2: "\f242"; @fa-var-battery-3: "\f241"; @fa-var-battery-4: "\f240"; @fa-var-battery-empty: "\f244"; @fa-var-battery-full: "\f240"; @fa-var-battery-half: "\f242"; @fa-var-battery-quarter: "\f243"; @fa-var-battery-three-quarters: "\f241"; @fa-var-bed: "\f236"; @fa-var-beer: "\f0fc"; @fa-var-behance: "\f1b4"; @fa-var-behance-square: "\f1b5"; @fa-var-bell: "\f0f3"; @fa-var-bell-o: "\f0a2"; @fa-var-bell-slash: "\f1f6"; @fa-var-bell-slash-o: "\f1f7"; @fa-var-bicycle: "\f206"; @fa-var-binoculars: "\f1e5"; @fa-var-birthday-cake: "\f1fd"; @fa-var-bitbucket: "\f171"; @fa-var-bitbucket-square: "\f172"; @fa-var-bitcoin: "\f15a"; @fa-var-black-tie: "\f27e"; @fa-var-bluetooth: "\f293"; @fa-var-bluetooth-b: "\f294"; @fa-var-bold: "\f032"; @fa-var-bolt: "\f0e7"; @fa-var-bomb: "\f1e2"; @fa-var-book: "\f02d"; @fa-var-bookmark: "\f02e"; @fa-var-bookmark-o: "\f097"; @fa-var-briefcase: "\f0b1"; @fa-var-btc: "\f15a"; @fa-var-bug: "\f188"; @fa-var-building: "\f1ad"; @fa-var-building-o: "\f0f7"; @fa-var-bullhorn: "\f0a1"; @fa-var-bullseye: "\f140"; @fa-var-bus: "\f207"; @fa-var-buysellads: "\f20d"; @fa-var-cab: "\f1ba"; @fa-var-calculator: "\f1ec"; @fa-var-calendar: "\f073"; @fa-var-calendar-check-o: "\f274"; @fa-var-calendar-minus-o: "\f272"; @fa-var-calendar-o: "\f133"; @fa-var-calendar-plus-o: "\f271"; @fa-var-calendar-times-o: "\f273"; @fa-var-camera: "\f030"; @fa-var-camera-retro: "\f083"; @fa-var-car: "\f1b9"; @fa-var-caret-down: "\f0d7"; @fa-var-caret-left: "\f0d9"; @fa-var-caret-right: "\f0da"; @fa-var-caret-square-o-down: "\f150"; @fa-var-caret-square-o-left: "\f191"; @fa-var-caret-square-o-right: "\f152"; @fa-var-caret-square-o-up: "\f151"; @fa-var-caret-up: "\f0d8"; @fa-var-cart-arrow-down: "\f218"; @fa-var-cart-plus: "\f217"; @fa-var-cc: "\f20a"; @fa-var-cc-amex: "\f1f3"; @fa-var-cc-diners-club: "\f24c"; @fa-var-cc-discover: "\f1f2"; @fa-var-cc-jcb: "\f24b"; @fa-var-cc-mastercard: "\f1f1"; @fa-var-cc-paypal: "\f1f4"; @fa-var-cc-stripe: "\f1f5"; @fa-var-cc-visa: "\f1f0"; @fa-var-certificate: "\f0a3"; @fa-var-chain: "\f0c1"; @fa-var-chain-broken: "\f127"; @fa-var-check: "\f00c"; @fa-var-check-circle: "\f058"; @fa-var-check-circle-o: "\f05d"; @fa-var-check-square: "\f14a"; @fa-var-check-square-o: "\f046"; @fa-var-chevron-circle-down: "\f13a"; @fa-var-chevron-circle-left: "\f137"; @fa-var-chevron-circle-right: "\f138"; @fa-var-chevron-circle-up: "\f139"; @fa-var-chevron-down: "\f078"; @fa-var-chevron-left: "\f053"; @fa-var-chevron-right: "\f054"; @fa-var-chevron-up: "\f077"; @fa-var-child: "\f1ae"; @fa-var-chrome: "\f268"; @fa-var-circle: "\f111"; @fa-var-circle-o: "\f10c"; @fa-var-circle-o-notch: "\f1ce"; @fa-var-circle-thin: "\f1db"; @fa-var-clipboard: "\f0ea"; @fa-var-clock-o: "\f017"; @fa-var-clone: "\f24d"; @fa-var-close: "\f00d"; @fa-var-cloud: "\f0c2"; @fa-var-cloud-download: "\f0ed"; @fa-var-cloud-upload: "\f0ee"; @fa-var-cny: "\f157"; @fa-var-code: "\f121"; @fa-var-code-fork: "\f126"; @fa-var-codepen: "\f1cb"; @fa-var-codiepie: "\f284"; @fa-var-coffee: "\f0f4"; @fa-var-cog: "\f013"; @fa-var-cogs: "\f085"; @fa-var-columns: "\f0db"; @fa-var-comment: "\f075"; @fa-var-comment-o: "\f0e5"; @fa-var-commenting: "\f27a"; @fa-var-commenting-o: "\f27b"; @fa-var-comments: "\f086"; @fa-var-comments-o: "\f0e6"; @fa-var-compass: "\f14e"; @fa-var-compress: "\f066"; @fa-var-connectdevelop: "\f20e"; @fa-var-contao: "\f26d"; @fa-var-copy: "\f0c5"; @fa-var-copyright: "\f1f9"; @fa-var-creative-commons: "\f25e"; @fa-var-credit-card: "\f09d"; @fa-var-credit-card-alt: "\f283"; @fa-var-crop: "\f125"; @fa-var-crosshairs: "\f05b"; @fa-var-css3: "\f13c"; @fa-var-cube: "\f1b2"; @fa-var-cubes: "\f1b3"; @fa-var-cut: "\f0c4"; @fa-var-cutlery: "\f0f5"; @fa-var-dashboard: "\f0e4"; @fa-var-dashcube: "\f210"; @fa-var-database: "\f1c0"; @fa-var-dedent: "\f03b"; @fa-var-delicious: "\f1a5"; @fa-var-desktop: "\f108"; @fa-var-deviantart: "\f1bd"; @fa-var-diamond: "\f219"; @fa-var-digg: "\f1a6"; @fa-var-dollar: "\f155"; @fa-var-dot-circle-o: "\f192"; @fa-var-download: "\f019"; @fa-var-dribbble: "\f17d"; @fa-var-dropbox: "\f16b"; @fa-var-drupal: "\f1a9"; @fa-var-edge: "\f282"; @fa-var-edit: "\f044"; @fa-var-eject: "\f052"; @fa-var-ellipsis-h: "\f141"; @fa-var-ellipsis-v: "\f142"; @fa-var-empire: "\f1d1"; @fa-var-envelope: "\f0e0"; @fa-var-envelope-o: "\f003"; @fa-var-envelope-square: "\f199"; @fa-var-eraser: "\f12d"; @fa-var-eur: "\f153"; @fa-var-euro: "\f153"; @fa-var-exchange: "\f0ec"; @fa-var-exclamation: "\f12a"; @fa-var-exclamation-circle: "\f06a"; @fa-var-exclamation-triangle: "\f071"; @fa-var-expand: "\f065"; @fa-var-expeditedssl: "\f23e"; @fa-var-external-link: "\f08e"; @fa-var-external-link-square: "\f14c"; @fa-var-eye: "\f06e"; @fa-var-eye-slash: "\f070"; @fa-var-eyedropper: "\f1fb"; @fa-var-facebook: "\f09a"; @fa-var-facebook-f: "\f09a"; @fa-var-facebook-official: "\f230"; @fa-var-facebook-square: "\f082"; @fa-var-fast-backward: "\f049"; @fa-var-fast-forward: "\f050"; @fa-var-fax: "\f1ac"; @fa-var-feed: "\f09e"; @fa-var-female: "\f182"; @fa-var-fighter-jet: "\f0fb"; @fa-var-file: "\f15b"; @fa-var-file-archive-o: "\f1c6"; @fa-var-file-audio-o: "\f1c7"; @fa-var-file-code-o: "\f1c9"; @fa-var-file-excel-o: "\f1c3"; @fa-var-file-image-o: "\f1c5"; @fa-var-file-movie-o: "\f1c8"; @fa-var-file-o: "\f016"; @fa-var-file-pdf-o: "\f1c1"; @fa-var-file-photo-o: "\f1c5"; @fa-var-file-picture-o: "\f1c5"; @fa-var-file-powerpoint-o: "\f1c4"; @fa-var-file-sound-o: "\f1c7"; @fa-var-file-text: "\f15c"; @fa-var-file-text-o: "\f0f6"; @fa-var-file-video-o: "\f1c8"; @fa-var-file-word-o: "\f1c2"; @fa-var-file-zip-o: "\f1c6"; @fa-var-files-o: "\f0c5"; @fa-var-film: "\f008"; @fa-var-filter: "\f0b0"; @fa-var-fire: "\f06d"; @fa-var-fire-extinguisher: "\f134"; @fa-var-firefox: "\f269"; @fa-var-flag: "\f024"; @fa-var-flag-checkered: "\f11e"; @fa-var-flag-o: "\f11d"; @fa-var-flash: "\f0e7"; @fa-var-flask: "\f0c3"; @fa-var-flickr: "\f16e"; @fa-var-floppy-o: "\f0c7"; @fa-var-folder: "\f07b"; @fa-var-folder-o: "\f114"; @fa-var-folder-open: "\f07c"; @fa-var-folder-open-o: "\f115"; @fa-var-font: "\f031"; @fa-var-fonticons: "\f280"; @fa-var-fort-awesome: "\f286"; @fa-var-forumbee: "\f211"; @fa-var-forward: "\f04e"; @fa-var-foursquare: "\f180"; @fa-var-frown-o: "\f119"; @fa-var-futbol-o: "\f1e3"; @fa-var-gamepad: "\f11b"; @fa-var-gavel: "\f0e3"; @fa-var-gbp: "\f154"; @fa-var-ge: "\f1d1"; @fa-var-gear: "\f013"; @fa-var-gears: "\f085"; @fa-var-genderless: "\f22d"; @fa-var-get-pocket: "\f265"; @fa-var-gg: "\f260"; @fa-var-gg-circle: "\f261"; @fa-var-gift: "\f06b"; @fa-var-git: "\f1d3"; @fa-var-git-square: "\f1d2"; @fa-var-github: "\f09b"; @fa-var-github-alt: "\f113"; @fa-var-github-square: "\f092"; @fa-var-gittip: "\f184"; @fa-var-glass: "\f000"; @fa-var-globe: "\f0ac"; @fa-var-google: "\f1a0"; @fa-var-google-plus: "\f0d5"; @fa-var-google-plus-square: "\f0d4"; @fa-var-google-wallet: "\f1ee"; @fa-var-graduation-cap: "\f19d"; @fa-var-gratipay: "\f184"; @fa-var-group: "\f0c0"; @fa-var-h-square: "\f0fd"; @fa-var-hacker-news: "\f1d4"; @fa-var-hand-grab-o: "\f255"; @fa-var-hand-lizard-o: "\f258"; @fa-var-hand-o-down: "\f0a7"; @fa-var-hand-o-left: "\f0a5"; @fa-var-hand-o-right: "\f0a4"; @fa-var-hand-o-up: "\f0a6"; @fa-var-hand-paper-o: "\f256"; @fa-var-hand-peace-o: "\f25b"; @fa-var-hand-pointer-o: "\f25a"; @fa-var-hand-rock-o: "\f255"; @fa-var-hand-scissors-o: "\f257"; @fa-var-hand-spock-o: "\f259"; @fa-var-hand-stop-o: "\f256"; @fa-var-hashtag: "\f292"; @fa-var-hdd-o: "\f0a0"; @fa-var-header: "\f1dc"; @fa-var-headphones: "\f025"; @fa-var-heart: "\f004"; @fa-var-heart-o: "\f08a"; @fa-var-heartbeat: "\f21e"; @fa-var-history: "\f1da"; @fa-var-home: "\f015"; @fa-var-hospital-o: "\f0f8"; @fa-var-hotel: "\f236"; @fa-var-hourglass: "\f254"; @fa-var-hourglass-1: "\f251"; @fa-var-hourglass-2: "\f252"; @fa-var-hourglass-3: "\f253"; @fa-var-hourglass-end: "\f253"; @fa-var-hourglass-half: "\f252"; @fa-var-hourglass-o: "\f250"; @fa-var-hourglass-start: "\f251"; @fa-var-houzz: "\f27c"; @fa-var-html5: "\f13b"; @fa-var-i-cursor: "\f246"; @fa-var-ils: "\f20b"; @fa-var-image: "\f03e"; @fa-var-inbox: "\f01c"; @fa-var-indent: "\f03c"; @fa-var-industry: "\f275"; @fa-var-info: "\f129"; @fa-var-info-circle: "\f05a"; @fa-var-inr: "\f156"; @fa-var-instagram: "\f16d"; @fa-var-institution: "\f19c"; @fa-var-internet-explorer: "\f26b"; @fa-var-intersex: "\f224"; @fa-var-ioxhost: "\f208"; @fa-var-italic: "\f033"; @fa-var-joomla: "\f1aa"; @fa-var-jpy: "\f157"; @fa-var-jsfiddle: "\f1cc"; @fa-var-key: "\f084"; @fa-var-keyboard-o: "\f11c"; @fa-var-krw: "\f159"; @fa-var-language: "\f1ab"; @fa-var-laptop: "\f109"; @fa-var-lastfm: "\f202"; @fa-var-lastfm-square: "\f203"; @fa-var-leaf: "\f06c"; @fa-var-leanpub: "\f212"; @fa-var-legal: "\f0e3"; @fa-var-lemon-o: "\f094"; @fa-var-level-down: "\f149"; @fa-var-level-up: "\f148"; @fa-var-life-bouy: "\f1cd"; @fa-var-life-buoy: "\f1cd"; @fa-var-life-ring: "\f1cd"; @fa-var-life-saver: "\f1cd"; @fa-var-lightbulb-o: "\f0eb"; @fa-var-line-chart: "\f201"; @fa-var-link: "\f0c1"; @fa-var-linkedin: "\f0e1"; @fa-var-linkedin-square: "\f08c"; @fa-var-linux: "\f17c"; @fa-var-list: "\f03a"; @fa-var-list-alt: "\f022"; @fa-var-list-ol: "\f0cb"; @fa-var-list-ul: "\f0ca"; @fa-var-location-arrow: "\f124"; @fa-var-lock: "\f023"; @fa-var-long-arrow-down: "\f175"; @fa-var-long-arrow-left: "\f177"; @fa-var-long-arrow-right: "\f178"; @fa-var-long-arrow-up: "\f176"; @fa-var-magic: "\f0d0"; @fa-var-magnet: "\f076"; @fa-var-mail-forward: "\f064"; @fa-var-mail-reply: "\f112"; @fa-var-mail-reply-all: "\f122"; @fa-var-male: "\f183"; @fa-var-map: "\f279"; @fa-var-map-marker: "\f041"; @fa-var-map-o: "\f278"; @fa-var-map-pin: "\f276"; @fa-var-map-signs: "\f277"; @fa-var-mars: "\f222"; @fa-var-mars-double: "\f227"; @fa-var-mars-stroke: "\f229"; @fa-var-mars-stroke-h: "\f22b"; @fa-var-mars-stroke-v: "\f22a"; @fa-var-maxcdn: "\f136"; @fa-var-meanpath: "\f20c"; @fa-var-medium: "\f23a"; @fa-var-medkit: "\f0fa"; @fa-var-meh-o: "\f11a"; @fa-var-mercury: "\f223"; @fa-var-microphone: "\f130"; @fa-var-microphone-slash: "\f131"; @fa-var-minus: "\f068"; @fa-var-minus-circle: "\f056"; @fa-var-minus-square: "\f146"; @fa-var-minus-square-o: "\f147"; @fa-var-mixcloud: "\f289"; @fa-var-mobile: "\f10b"; @fa-var-mobile-phone: "\f10b"; @fa-var-modx: "\f285"; @fa-var-money: "\f0d6"; @fa-var-moon-o: "\f186"; @fa-var-mortar-board: "\f19d"; @fa-var-motorcycle: "\f21c"; @fa-var-mouse-pointer: "\f245"; @fa-var-music: "\f001"; @fa-var-navicon: "\f0c9"; @fa-var-neuter: "\f22c"; @fa-var-newspaper-o: "\f1ea"; @fa-var-object-group: "\f247"; @fa-var-object-ungroup: "\f248"; @fa-var-odnoklassniki: "\f263"; @fa-var-odnoklassniki-square: "\f264"; @fa-var-opencart: "\f23d"; @fa-var-openid: "\f19b"; @fa-var-opera: "\f26a"; @fa-var-optin-monster: "\f23c"; @fa-var-outdent: "\f03b"; @fa-var-pagelines: "\f18c"; @fa-var-paint-brush: "\f1fc"; @fa-var-paper-plane: "\f1d8"; @fa-var-paper-plane-o: "\f1d9"; @fa-var-paperclip: "\f0c6"; @fa-var-paragraph: "\f1dd"; @fa-var-paste: "\f0ea"; @fa-var-pause: "\f04c"; @fa-var-pause-circle: "\f28b"; @fa-var-pause-circle-o: "\f28c"; @fa-var-paw: "\f1b0"; @fa-var-paypal: "\f1ed"; @fa-var-pencil: "\f040"; @fa-var-pencil-square: "\f14b"; @fa-var-pencil-square-o: "\f044"; @fa-var-percent: "\f295"; @fa-var-phone: "\f095"; @fa-var-phone-square: "\f098"; @fa-var-photo: "\f03e"; @fa-var-picture-o: "\f03e"; @fa-var-pie-chart: "\f200"; @fa-var-pied-piper: "\f1a7"; @fa-var-pied-piper-alt: "\f1a8"; @fa-var-pinterest: "\f0d2"; @fa-var-pinterest-p: "\f231"; @fa-var-pinterest-square: "\f0d3"; @fa-var-plane: "\f072"; @fa-var-play: "\f04b"; @fa-var-play-circle: "\f144"; @fa-var-play-circle-o: "\f01d"; @fa-var-plug: "\f1e6"; @fa-var-plus: "\f067"; @fa-var-plus-circle: "\f055"; @fa-var-plus-square: "\f0fe"; @fa-var-plus-square-o: "\f196"; @fa-var-power-off: "\f011"; @fa-var-print: "\f02f"; @fa-var-product-hunt: "\f288"; @fa-var-puzzle-piece: "\f12e"; @fa-var-qq: "\f1d6"; @fa-var-qrcode: "\f029"; @fa-var-question: "\f128"; @fa-var-question-circle: "\f059"; @fa-var-quote-left: "\f10d"; @fa-var-quote-right: "\f10e"; @fa-var-ra: "\f1d0"; @fa-var-random: "\f074"; @fa-var-rebel: "\f1d0"; @fa-var-recycle: "\f1b8"; @fa-var-reddit: "\f1a1"; @fa-var-reddit-alien: "\f281"; @fa-var-reddit-square: "\f1a2"; @fa-var-refresh: "\f021"; @fa-var-registered: "\f25d"; @fa-var-remove: "\f00d"; @fa-var-renren: "\f18b"; @fa-var-reorder: "\f0c9"; @fa-var-repeat: "\f01e"; @fa-var-reply: "\f112"; @fa-var-reply-all: "\f122"; @fa-var-retweet: "\f079"; @fa-var-rmb: "\f157"; @fa-var-road: "\f018"; @fa-var-rocket: "\f135"; @fa-var-rotate-left: "\f0e2"; @fa-var-rotate-right: "\f01e"; @fa-var-rouble: "\f158"; @fa-var-rss: "\f09e"; @fa-var-rss-square: "\f143"; @fa-var-rub: "\f158"; @fa-var-ruble: "\f158"; @fa-var-rupee: "\f156"; @fa-var-safari: "\f267"; @fa-var-save: "\f0c7"; @fa-var-scissors: "\f0c4"; @fa-var-scribd: "\f28a"; @fa-var-search: "\f002"; @fa-var-search-minus: "\f010"; @fa-var-search-plus: "\f00e"; @fa-var-sellsy: "\f213"; @fa-var-send: "\f1d8"; @fa-var-send-o: "\f1d9"; @fa-var-server: "\f233"; @fa-var-share: "\f064"; @fa-var-share-alt: "\f1e0"; @fa-var-share-alt-square: "\f1e1"; @fa-var-share-square: "\f14d"; @fa-var-share-square-o: "\f045"; @fa-var-shekel: "\f20b"; @fa-var-sheqel: "\f20b"; @fa-var-shield: "\f132"; @fa-var-ship: "\f21a"; @fa-var-shirtsinbulk: "\f214"; @fa-var-shopping-bag: "\f290"; @fa-var-shopping-basket: "\f291"; @fa-var-shopping-cart: "\f07a"; @fa-var-sign-in: "\f090"; @fa-var-sign-out: "\f08b"; @fa-var-signal: "\f012"; @fa-var-simplybuilt: "\f215"; @fa-var-sitemap: "\f0e8"; @fa-var-skyatlas: "\f216"; @fa-var-skype: "\f17e"; @fa-var-slack: "\f198"; @fa-var-sliders: "\f1de"; @fa-var-slideshare: "\f1e7"; @fa-var-smile-o: "\f118"; @fa-var-soccer-ball-o: "\f1e3"; @fa-var-sort: "\f0dc"; @fa-var-sort-alpha-asc: "\f15d"; @fa-var-sort-alpha-desc: "\f15e"; @fa-var-sort-amount-asc: "\f160"; @fa-var-sort-amount-desc: "\f161"; @fa-var-sort-asc: "\f0de"; @fa-var-sort-desc: "\f0dd"; @fa-var-sort-down: "\f0dd"; @fa-var-sort-numeric-asc: "\f162"; @fa-var-sort-numeric-desc: "\f163"; @fa-var-sort-up: "\f0de"; @fa-var-soundcloud: "\f1be"; @fa-var-space-shuttle: "\f197"; @fa-var-spinner: "\f110"; @fa-var-spoon: "\f1b1"; @fa-var-spotify: "\f1bc"; @fa-var-square: "\f0c8"; @fa-var-square-o: "\f096"; @fa-var-stack-exchange: "\f18d"; @fa-var-stack-overflow: "\f16c"; @fa-var-star: "\f005"; @fa-var-star-half: "\f089"; @fa-var-star-half-empty: "\f123"; @fa-var-star-half-full: "\f123"; @fa-var-star-half-o: "\f123"; @fa-var-star-o: "\f006"; @fa-var-steam: "\f1b6"; @fa-var-steam-square: "\f1b7"; @fa-var-step-backward: "\f048"; @fa-var-step-forward: "\f051"; @fa-var-stethoscope: "\f0f1"; @fa-var-sticky-note: "\f249"; @fa-var-sticky-note-o: "\f24a"; @fa-var-stop: "\f04d"; @fa-var-stop-circle: "\f28d"; @fa-var-stop-circle-o: "\f28e"; @fa-var-street-view: "\f21d"; @fa-var-strikethrough: "\f0cc"; @fa-var-stumbleupon: "\f1a4"; @fa-var-stumbleupon-circle: "\f1a3"; @fa-var-subscript: "\f12c"; @fa-var-subway: "\f239"; @fa-var-suitcase: "\f0f2"; @fa-var-sun-o: "\f185"; @fa-var-superscript: "\f12b"; @fa-var-support: "\f1cd"; @fa-var-table: "\f0ce"; @fa-var-tablet: "\f10a"; @fa-var-tachometer: "\f0e4"; @fa-var-tag: "\f02b"; @fa-var-tags: "\f02c"; @fa-var-tasks: "\f0ae"; @fa-var-taxi: "\f1ba"; @fa-var-television: "\f26c"; @fa-var-tencent-weibo: "\f1d5"; @fa-var-terminal: "\f120"; @fa-var-text-height: "\f034"; @fa-var-text-width: "\f035"; @fa-var-th: "\f00a"; @fa-var-th-large: "\f009"; @fa-var-th-list: "\f00b"; @fa-var-thumb-tack: "\f08d"; @fa-var-thumbs-down: "\f165"; @fa-var-thumbs-o-down: "\f088"; @fa-var-thumbs-o-up: "\f087"; @fa-var-thumbs-up: "\f164"; @fa-var-ticket: "\f145"; @fa-var-times: "\f00d"; @fa-var-times-circle: "\f057"; @fa-var-times-circle-o: "\f05c"; @fa-var-tint: "\f043"; @fa-var-toggle-down: "\f150"; @fa-var-toggle-left: "\f191"; @fa-var-toggle-off: "\f204"; @fa-var-toggle-on: "\f205"; @fa-var-toggle-right: "\f152"; @fa-var-toggle-up: "\f151"; @fa-var-trademark: "\f25c"; @fa-var-train: "\f238"; @fa-var-transgender: "\f224"; @fa-var-transgender-alt: "\f225"; @fa-var-trash: "\f1f8"; @fa-var-trash-o: "\f014"; @fa-var-tree: "\f1bb"; @fa-var-trello: "\f181"; @fa-var-tripadvisor: "\f262"; @fa-var-trophy: "\f091"; @fa-var-truck: "\f0d1"; @fa-var-try: "\f195"; @fa-var-tty: "\f1e4"; @fa-var-tumblr: "\f173"; @fa-var-tumblr-square: "\f174"; @fa-var-turkish-lira: "\f195"; @fa-var-tv: "\f26c"; @fa-var-twitch: "\f1e8"; @fa-var-twitter: "\f099"; @fa-var-twitter-square: "\f081"; @fa-var-umbrella: "\f0e9"; @fa-var-underline: "\f0cd"; @fa-var-undo: "\f0e2"; @fa-var-university: "\f19c"; @fa-var-unlink: "\f127"; @fa-var-unlock: "\f09c"; @fa-var-unlock-alt: "\f13e"; @fa-var-unsorted: "\f0dc"; @fa-var-upload: "\f093"; @fa-var-usb: "\f287"; @fa-var-usd: "\f155"; @fa-var-user: "\f007"; @fa-var-user-md: "\f0f0"; @fa-var-user-plus: "\f234"; @fa-var-user-secret: "\f21b"; @fa-var-user-times: "\f235"; @fa-var-users: "\f0c0"; @fa-var-venus: "\f221"; @fa-var-venus-double: "\f226"; @fa-var-venus-mars: "\f228"; @fa-var-viacoin: "\f237"; @fa-var-video-camera: "\f03d"; @fa-var-vimeo: "\f27d"; @fa-var-vimeo-square: "\f194"; @fa-var-vine: "\f1ca"; @fa-var-vk: "\f189"; @fa-var-volume-down: "\f027"; @fa-var-volume-off: "\f026"; @fa-var-volume-up: "\f028"; @fa-var-warning: "\f071"; @fa-var-wechat: "\f1d7"; @fa-var-weibo: "\f18a"; @fa-var-weixin: "\f1d7"; @fa-var-whatsapp: "\f232"; @fa-var-wheelchair: "\f193"; @fa-var-wifi: "\f1eb"; @fa-var-wikipedia-w: "\f266"; @fa-var-windows: "\f17a"; @fa-var-won: "\f159"; @fa-var-wordpress: "\f19a"; @fa-var-wrench: "\f0ad"; @fa-var-xing: "\f168"; @fa-var-xing-square: "\f169"; @fa-var-y-combinator: "\f23b"; @fa-var-y-combinator-square: "\f1d4"; @fa-var-yahoo: "\f19e"; @fa-var-yc: "\f23b"; @fa-var-yc-square: "\f1d4"; @fa-var-yelp: "\f1e9"; @fa-var-yen: "\f157"; @fa-var-youtube: "\f167"; @fa-var-youtube-play: "\f16a"; @fa-var-youtube-square: "\f166"; ================================================ FILE: resources/public/font-awesome-4.5.0/scss/_animated.scss ================================================ // Spinning Icons // -------------------------- .#{$fa-css-prefix}-spin { -webkit-animation: fa-spin 2s infinite linear; animation: fa-spin 2s infinite linear; } .#{$fa-css-prefix}-pulse { -webkit-animation: fa-spin 1s infinite steps(8); animation: fa-spin 1s infinite steps(8); } @-webkit-keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } @keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } ================================================ FILE: resources/public/font-awesome-4.5.0/scss/_bordered-pulled.scss ================================================ // Bordered & Pulled // ------------------------- .#{$fa-css-prefix}-border { padding: .2em .25em .15em; border: solid .08em $fa-border-color; border-radius: .1em; } .#{$fa-css-prefix}-pull-left { float: left; } .#{$fa-css-prefix}-pull-right { float: right; } .#{$fa-css-prefix} { &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } } /* Deprecated as of 4.4.0 */ .pull-right { float: right; } .pull-left { float: left; } .#{$fa-css-prefix} { &.pull-left { margin-right: .3em; } &.pull-right { margin-left: .3em; } } ================================================ FILE: resources/public/font-awesome-4.5.0/scss/_core.scss ================================================ // Base Class Definition // ------------------------- .#{$fa-css-prefix} { display: inline-block; font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration font-size: inherit; // can't have font-size inherit on line above, so need to override text-rendering: auto; // optimizelegibility throws things off #1094 -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } ================================================ FILE: resources/public/font-awesome-4.5.0/scss/_fixed-width.scss ================================================ // Fixed Width Icons // ------------------------- .#{$fa-css-prefix}-fw { width: (18em / 14); text-align: center; } ================================================ FILE: resources/public/font-awesome-4.5.0/scss/_icons.scss ================================================ /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } .#{$fa-css-prefix}-music:before { content: $fa-var-music; } .#{$fa-css-prefix}-search:before { content: $fa-var-search; } .#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } .#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } .#{$fa-css-prefix}-star:before { content: $fa-var-star; } .#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } .#{$fa-css-prefix}-user:before { content: $fa-var-user; } .#{$fa-css-prefix}-film:before { content: $fa-var-film; } .#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } .#{$fa-css-prefix}-th:before { content: $fa-var-th; } .#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } .#{$fa-css-prefix}-check:before { content: $fa-var-check; } .#{$fa-css-prefix}-remove:before, .#{$fa-css-prefix}-close:before, .#{$fa-css-prefix}-times:before { content: $fa-var-times; } .#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } .#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } .#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } .#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } .#{$fa-css-prefix}-gear:before, .#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } .#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } .#{$fa-css-prefix}-home:before { content: $fa-var-home; } .#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } .#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } .#{$fa-css-prefix}-road:before { content: $fa-var-road; } .#{$fa-css-prefix}-download:before { content: $fa-var-download; } .#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } .#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } .#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } .#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } .#{$fa-css-prefix}-rotate-right:before, .#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } .#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } .#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } .#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } .#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } .#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } .#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } .#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } .#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } .#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } .#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } .#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } .#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } .#{$fa-css-prefix}-book:before { content: $fa-var-book; } .#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } .#{$fa-css-prefix}-print:before { content: $fa-var-print; } .#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } .#{$fa-css-prefix}-font:before { content: $fa-var-font; } .#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } .#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } .#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } .#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } .#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } .#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } .#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } .#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } .#{$fa-css-prefix}-list:before { content: $fa-var-list; } .#{$fa-css-prefix}-dedent:before, .#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } .#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } .#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } .#{$fa-css-prefix}-photo:before, .#{$fa-css-prefix}-image:before, .#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } .#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } .#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } .#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } .#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } .#{$fa-css-prefix}-edit:before, .#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } .#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } .#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } .#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } .#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } .#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } .#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } .#{$fa-css-prefix}-play:before { content: $fa-var-play; } .#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } .#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } .#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } .#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } .#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } .#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } .#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } .#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } .#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } .#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } .#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } .#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } .#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } .#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } .#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } .#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } .#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } .#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } .#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } .#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } .#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } .#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } .#{$fa-css-prefix}-mail-forward:before, .#{$fa-css-prefix}-share:before { content: $fa-var-share; } .#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } .#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } .#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } .#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } .#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } .#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } .#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } .#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } .#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } .#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } .#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } .#{$fa-css-prefix}-warning:before, .#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } .#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } .#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } .#{$fa-css-prefix}-random:before { content: $fa-var-random; } .#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } .#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } .#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } .#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } .#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } .#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } .#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } .#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } .#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } .#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } .#{$fa-css-prefix}-bar-chart-o:before, .#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } .#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } .#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } .#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } .#{$fa-css-prefix}-key:before { content: $fa-var-key; } .#{$fa-css-prefix}-gears:before, .#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } .#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } .#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } .#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } .#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } .#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } .#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } .#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } .#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } .#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } .#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } .#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } .#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } .#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } .#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } .#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } .#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } .#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } .#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } .#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } .#{$fa-css-prefix}-facebook-f:before, .#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } .#{$fa-css-prefix}-github:before { content: $fa-var-github; } .#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } .#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } .#{$fa-css-prefix}-feed:before, .#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } .#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } .#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } .#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } .#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } .#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } .#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } .#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } .#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } .#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } .#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } .#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } .#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } .#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } .#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } .#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } .#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } .#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } .#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } .#{$fa-css-prefix}-group:before, .#{$fa-css-prefix}-users:before { content: $fa-var-users; } .#{$fa-css-prefix}-chain:before, .#{$fa-css-prefix}-link:before { content: $fa-var-link; } .#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } .#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } .#{$fa-css-prefix}-cut:before, .#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } .#{$fa-css-prefix}-copy:before, .#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } .#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } .#{$fa-css-prefix}-save:before, .#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } .#{$fa-css-prefix}-square:before { content: $fa-var-square; } .#{$fa-css-prefix}-navicon:before, .#{$fa-css-prefix}-reorder:before, .#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } .#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } .#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } .#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } .#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } .#{$fa-css-prefix}-table:before { content: $fa-var-table; } .#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } .#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } .#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } .#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } .#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } .#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } .#{$fa-css-prefix}-money:before { content: $fa-var-money; } .#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } .#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } .#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } .#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } .#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } .#{$fa-css-prefix}-unsorted:before, .#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } .#{$fa-css-prefix}-sort-down:before, .#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } .#{$fa-css-prefix}-sort-up:before, .#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } .#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } .#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } .#{$fa-css-prefix}-rotate-left:before, .#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } .#{$fa-css-prefix}-legal:before, .#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } .#{$fa-css-prefix}-dashboard:before, .#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } .#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } .#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } .#{$fa-css-prefix}-flash:before, .#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } .#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } .#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } .#{$fa-css-prefix}-paste:before, .#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } .#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } .#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } .#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } .#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } .#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } .#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } .#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } .#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } .#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } .#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } .#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } .#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } .#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } .#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } .#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } .#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } .#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } .#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } .#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } .#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } .#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } .#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } .#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } .#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } .#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } .#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } .#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } .#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } .#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } .#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } .#{$fa-css-prefix}-mobile-phone:before, .#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } .#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } .#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } .#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } .#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } .#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } .#{$fa-css-prefix}-mail-reply:before, .#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } .#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } .#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } .#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } .#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } .#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } .#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } .#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } .#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } .#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } .#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } .#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } .#{$fa-css-prefix}-code:before { content: $fa-var-code; } .#{$fa-css-prefix}-mail-reply-all:before, .#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } .#{$fa-css-prefix}-star-half-empty:before, .#{$fa-css-prefix}-star-half-full:before, .#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } .#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } .#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } .#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } .#{$fa-css-prefix}-unlink:before, .#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } .#{$fa-css-prefix}-question:before { content: $fa-var-question; } .#{$fa-css-prefix}-info:before { content: $fa-var-info; } .#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } .#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } .#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } .#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } .#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } .#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } .#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } .#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } .#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } .#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } .#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } .#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } .#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } .#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } .#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } .#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } .#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } .#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } .#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } .#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } .#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } .#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } .#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } .#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } .#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } .#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } .#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } .#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } .#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } .#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } .#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } .#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } .#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } .#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } .#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } .#{$fa-css-prefix}-toggle-down:before, .#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } .#{$fa-css-prefix}-toggle-up:before, .#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } .#{$fa-css-prefix}-toggle-right:before, .#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } .#{$fa-css-prefix}-euro:before, .#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } .#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } .#{$fa-css-prefix}-dollar:before, .#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } .#{$fa-css-prefix}-rupee:before, .#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } .#{$fa-css-prefix}-cny:before, .#{$fa-css-prefix}-rmb:before, .#{$fa-css-prefix}-yen:before, .#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } .#{$fa-css-prefix}-ruble:before, .#{$fa-css-prefix}-rouble:before, .#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } .#{$fa-css-prefix}-won:before, .#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } .#{$fa-css-prefix}-bitcoin:before, .#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } .#{$fa-css-prefix}-file:before { content: $fa-var-file; } .#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } .#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } .#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } .#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } .#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } .#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } .#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } .#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } .#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } .#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } .#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } .#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } .#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } .#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } .#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } .#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } .#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } .#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } .#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } .#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } .#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } .#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } .#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } .#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } .#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } .#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } .#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } .#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } .#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } .#{$fa-css-prefix}-android:before { content: $fa-var-android; } .#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } .#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } .#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } .#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } .#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } .#{$fa-css-prefix}-female:before { content: $fa-var-female; } .#{$fa-css-prefix}-male:before { content: $fa-var-male; } .#{$fa-css-prefix}-gittip:before, .#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; } .#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } .#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } .#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } .#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } .#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } .#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } .#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } .#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } .#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } .#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } .#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } .#{$fa-css-prefix}-toggle-left:before, .#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } .#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } .#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } .#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } .#{$fa-css-prefix}-turkish-lira:before, .#{$fa-css-prefix}-try:before { content: $fa-var-try; } .#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } .#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } .#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } .#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } .#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } .#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } .#{$fa-css-prefix}-institution:before, .#{$fa-css-prefix}-bank:before, .#{$fa-css-prefix}-university:before { content: $fa-var-university; } .#{$fa-css-prefix}-mortar-board:before, .#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } .#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } .#{$fa-css-prefix}-google:before { content: $fa-var-google; } .#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } .#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } .#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } .#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } .#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } .#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } .#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } .#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } .#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } .#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } .#{$fa-css-prefix}-language:before { content: $fa-var-language; } .#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } .#{$fa-css-prefix}-building:before { content: $fa-var-building; } .#{$fa-css-prefix}-child:before { content: $fa-var-child; } .#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } .#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } .#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } .#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } .#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } .#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } .#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } .#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } .#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } .#{$fa-css-prefix}-automobile:before, .#{$fa-css-prefix}-car:before { content: $fa-var-car; } .#{$fa-css-prefix}-cab:before, .#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } .#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } .#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } .#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } .#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } .#{$fa-css-prefix}-database:before { content: $fa-var-database; } .#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } .#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } .#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } .#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } .#{$fa-css-prefix}-file-photo-o:before, .#{$fa-css-prefix}-file-picture-o:before, .#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } .#{$fa-css-prefix}-file-zip-o:before, .#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } .#{$fa-css-prefix}-file-sound-o:before, .#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } .#{$fa-css-prefix}-file-movie-o:before, .#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } .#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } .#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } .#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } .#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } .#{$fa-css-prefix}-life-bouy:before, .#{$fa-css-prefix}-life-buoy:before, .#{$fa-css-prefix}-life-saver:before, .#{$fa-css-prefix}-support:before, .#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } .#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } .#{$fa-css-prefix}-ra:before, .#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } .#{$fa-css-prefix}-ge:before, .#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } .#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } .#{$fa-css-prefix}-git:before { content: $fa-var-git; } .#{$fa-css-prefix}-y-combinator-square:before, .#{$fa-css-prefix}-yc-square:before, .#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } .#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } .#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } .#{$fa-css-prefix}-wechat:before, .#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } .#{$fa-css-prefix}-send:before, .#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } .#{$fa-css-prefix}-send-o:before, .#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } .#{$fa-css-prefix}-history:before { content: $fa-var-history; } .#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } .#{$fa-css-prefix}-header:before { content: $fa-var-header; } .#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } .#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } .#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } .#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } .#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } .#{$fa-css-prefix}-soccer-ball-o:before, .#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } .#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } .#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } .#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } .#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } .#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } .#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } .#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } .#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } .#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } .#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } .#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } .#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } .#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } .#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } .#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } .#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } .#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } .#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } .#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } .#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } .#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } .#{$fa-css-prefix}-at:before { content: $fa-var-at; } .#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } .#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } .#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } .#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } .#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } .#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } .#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } .#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } .#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } .#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } .#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } .#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } .#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } .#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } .#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } .#{$fa-css-prefix}-shekel:before, .#{$fa-css-prefix}-sheqel:before, .#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } .#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } .#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; } .#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; } .#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; } .#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; } .#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; } .#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; } .#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; } .#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; } .#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; } .#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; } .#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; } .#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; } .#{$fa-css-prefix}-ship:before { content: $fa-var-ship; } .#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; } .#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; } .#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; } .#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; } .#{$fa-css-prefix}-venus:before { content: $fa-var-venus; } .#{$fa-css-prefix}-mars:before { content: $fa-var-mars; } .#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; } .#{$fa-css-prefix}-intersex:before, .#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; } .#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; } .#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; } .#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; } .#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; } .#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; } .#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; } .#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; } .#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; } .#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; } .#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; } .#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; } .#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; } .#{$fa-css-prefix}-server:before { content: $fa-var-server; } .#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; } .#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; } .#{$fa-css-prefix}-hotel:before, .#{$fa-css-prefix}-bed:before { content: $fa-var-bed; } .#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; } .#{$fa-css-prefix}-train:before { content: $fa-var-train; } .#{$fa-css-prefix}-subway:before { content: $fa-var-subway; } .#{$fa-css-prefix}-medium:before { content: $fa-var-medium; } .#{$fa-css-prefix}-yc:before, .#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; } .#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; } .#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; } .#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; } .#{$fa-css-prefix}-battery-4:before, .#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; } .#{$fa-css-prefix}-battery-3:before, .#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; } .#{$fa-css-prefix}-battery-2:before, .#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; } .#{$fa-css-prefix}-battery-1:before, .#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; } .#{$fa-css-prefix}-battery-0:before, .#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; } .#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; } .#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; } .#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; } .#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; } .#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; } .#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; } .#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; } .#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; } .#{$fa-css-prefix}-clone:before { content: $fa-var-clone; } .#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; } .#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; } .#{$fa-css-prefix}-hourglass-1:before, .#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; } .#{$fa-css-prefix}-hourglass-2:before, .#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; } .#{$fa-css-prefix}-hourglass-3:before, .#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; } .#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; } .#{$fa-css-prefix}-hand-grab-o:before, .#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; } .#{$fa-css-prefix}-hand-stop-o:before, .#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; } .#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; } .#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; } .#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; } .#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; } .#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; } .#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; } .#{$fa-css-prefix}-registered:before { content: $fa-var-registered; } .#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; } .#{$fa-css-prefix}-gg:before { content: $fa-var-gg; } .#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; } .#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; } .#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; } .#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; } .#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; } .#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; } .#{$fa-css-prefix}-safari:before { content: $fa-var-safari; } .#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; } .#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; } .#{$fa-css-prefix}-opera:before { content: $fa-var-opera; } .#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; } .#{$fa-css-prefix}-tv:before, .#{$fa-css-prefix}-television:before { content: $fa-var-television; } .#{$fa-css-prefix}-contao:before { content: $fa-var-contao; } .#{$fa-css-prefix}-500px:before { content: $fa-var-500px; } .#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; } .#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; } .#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; } .#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; } .#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; } .#{$fa-css-prefix}-industry:before { content: $fa-var-industry; } .#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; } .#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; } .#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; } .#{$fa-css-prefix}-map:before { content: $fa-var-map; } .#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; } .#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; } .#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; } .#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; } .#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; } .#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; } .#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; } .#{$fa-css-prefix}-edge:before { content: $fa-var-edge; } .#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; } .#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; } .#{$fa-css-prefix}-modx:before { content: $fa-var-modx; } .#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; } .#{$fa-css-prefix}-usb:before { content: $fa-var-usb; } .#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; } .#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; } .#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; } .#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; } .#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; } .#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; } .#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; } .#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; } .#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; } .#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; } .#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; } .#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; } .#{$fa-css-prefix}-percent:before { content: $fa-var-percent; } ================================================ FILE: resources/public/font-awesome-4.5.0/scss/_larger.scss ================================================ // Icon Sizes // ------------------------- /* makes the font 33% larger relative to the icon container */ .#{$fa-css-prefix}-lg { font-size: (4em / 3); line-height: (3em / 4); vertical-align: -15%; } .#{$fa-css-prefix}-2x { font-size: 2em; } .#{$fa-css-prefix}-3x { font-size: 3em; } .#{$fa-css-prefix}-4x { font-size: 4em; } .#{$fa-css-prefix}-5x { font-size: 5em; } ================================================ FILE: resources/public/font-awesome-4.5.0/scss/_list.scss ================================================ // List Icons // ------------------------- .#{$fa-css-prefix}-ul { padding-left: 0; margin-left: $fa-li-width; list-style-type: none; > li { position: relative; } } .#{$fa-css-prefix}-li { position: absolute; left: -$fa-li-width; width: $fa-li-width; top: (2em / 14); text-align: center; &.#{$fa-css-prefix}-lg { left: -$fa-li-width + (4em / 14); } } ================================================ FILE: resources/public/font-awesome-4.5.0/scss/_mixins.scss ================================================ // Mixins // -------------------------- @mixin fa-icon() { display: inline-block; font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration font-size: inherit; // can't have font-size inherit on line above, so need to override text-rendering: auto; // optimizelegibility throws things off #1094 -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } @mixin fa-icon-rotate($degrees, $rotation) { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); -webkit-transform: rotate($degrees); -ms-transform: rotate($degrees); transform: rotate($degrees); } @mixin fa-icon-flip($horiz, $vert, $rotation) { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); -webkit-transform: scale($horiz, $vert); -ms-transform: scale($horiz, $vert); transform: scale($horiz, $vert); } ================================================ FILE: resources/public/font-awesome-4.5.0/scss/_path.scss ================================================ /* FONT PATH * -------------------------- */ @font-face { font-family: 'FontAwesome'; src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts font-weight: normal; font-style: normal; } ================================================ FILE: resources/public/font-awesome-4.5.0/scss/_rotated-flipped.scss ================================================ // Rotated & Flipped Icons // ------------------------- .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } // Hook for IE8-9 // ------------------------- :root .#{$fa-css-prefix}-rotate-90, :root .#{$fa-css-prefix}-rotate-180, :root .#{$fa-css-prefix}-rotate-270, :root .#{$fa-css-prefix}-flip-horizontal, :root .#{$fa-css-prefix}-flip-vertical { filter: none; } ================================================ FILE: resources/public/font-awesome-4.5.0/scss/_stacked.scss ================================================ // Stacked Icons // ------------------------- .#{$fa-css-prefix}-stack { position: relative; display: inline-block; width: 2em; height: 2em; line-height: 2em; vertical-align: middle; } .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { position: absolute; left: 0; width: 100%; text-align: center; } .#{$fa-css-prefix}-stack-1x { line-height: inherit; } .#{$fa-css-prefix}-stack-2x { font-size: 2em; } .#{$fa-css-prefix}-inverse { color: $fa-inverse; } ================================================ FILE: resources/public/font-awesome-4.5.0/scss/_variables.scss ================================================ // Variables // -------------------------- $fa-font-path: "../fonts" !default; $fa-font-size-base: 14px !default; $fa-line-height-base: 1 !default; //$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.5.0/fonts" !default; // for referencing Bootstrap CDN font files directly $fa-css-prefix: fa !default; $fa-version: "4.5.0" !default; $fa-border-color: #eee !default; $fa-inverse: #fff !default; $fa-li-width: (30em / 14) !default; $fa-var-500px: "\f26e"; $fa-var-adjust: "\f042"; $fa-var-adn: "\f170"; $fa-var-align-center: "\f037"; $fa-var-align-justify: "\f039"; $fa-var-align-left: "\f036"; $fa-var-align-right: "\f038"; $fa-var-amazon: "\f270"; $fa-var-ambulance: "\f0f9"; $fa-var-anchor: "\f13d"; $fa-var-android: "\f17b"; $fa-var-angellist: "\f209"; $fa-var-angle-double-down: "\f103"; $fa-var-angle-double-left: "\f100"; $fa-var-angle-double-right: "\f101"; $fa-var-angle-double-up: "\f102"; $fa-var-angle-down: "\f107"; $fa-var-angle-left: "\f104"; $fa-var-angle-right: "\f105"; $fa-var-angle-up: "\f106"; $fa-var-apple: "\f179"; $fa-var-archive: "\f187"; $fa-var-area-chart: "\f1fe"; $fa-var-arrow-circle-down: "\f0ab"; $fa-var-arrow-circle-left: "\f0a8"; $fa-var-arrow-circle-o-down: "\f01a"; $fa-var-arrow-circle-o-left: "\f190"; $fa-var-arrow-circle-o-right: "\f18e"; $fa-var-arrow-circle-o-up: "\f01b"; $fa-var-arrow-circle-right: "\f0a9"; $fa-var-arrow-circle-up: "\f0aa"; $fa-var-arrow-down: "\f063"; $fa-var-arrow-left: "\f060"; $fa-var-arrow-right: "\f061"; $fa-var-arrow-up: "\f062"; $fa-var-arrows: "\f047"; $fa-var-arrows-alt: "\f0b2"; $fa-var-arrows-h: "\f07e"; $fa-var-arrows-v: "\f07d"; $fa-var-asterisk: "\f069"; $fa-var-at: "\f1fa"; $fa-var-automobile: "\f1b9"; $fa-var-backward: "\f04a"; $fa-var-balance-scale: "\f24e"; $fa-var-ban: "\f05e"; $fa-var-bank: "\f19c"; $fa-var-bar-chart: "\f080"; $fa-var-bar-chart-o: "\f080"; $fa-var-barcode: "\f02a"; $fa-var-bars: "\f0c9"; $fa-var-battery-0: "\f244"; $fa-var-battery-1: "\f243"; $fa-var-battery-2: "\f242"; $fa-var-battery-3: "\f241"; $fa-var-battery-4: "\f240"; $fa-var-battery-empty: "\f244"; $fa-var-battery-full: "\f240"; $fa-var-battery-half: "\f242"; $fa-var-battery-quarter: "\f243"; $fa-var-battery-three-quarters: "\f241"; $fa-var-bed: "\f236"; $fa-var-beer: "\f0fc"; $fa-var-behance: "\f1b4"; $fa-var-behance-square: "\f1b5"; $fa-var-bell: "\f0f3"; $fa-var-bell-o: "\f0a2"; $fa-var-bell-slash: "\f1f6"; $fa-var-bell-slash-o: "\f1f7"; $fa-var-bicycle: "\f206"; $fa-var-binoculars: "\f1e5"; $fa-var-birthday-cake: "\f1fd"; $fa-var-bitbucket: "\f171"; $fa-var-bitbucket-square: "\f172"; $fa-var-bitcoin: "\f15a"; $fa-var-black-tie: "\f27e"; $fa-var-bluetooth: "\f293"; $fa-var-bluetooth-b: "\f294"; $fa-var-bold: "\f032"; $fa-var-bolt: "\f0e7"; $fa-var-bomb: "\f1e2"; $fa-var-book: "\f02d"; $fa-var-bookmark: "\f02e"; $fa-var-bookmark-o: "\f097"; $fa-var-briefcase: "\f0b1"; $fa-var-btc: "\f15a"; $fa-var-bug: "\f188"; $fa-var-building: "\f1ad"; $fa-var-building-o: "\f0f7"; $fa-var-bullhorn: "\f0a1"; $fa-var-bullseye: "\f140"; $fa-var-bus: "\f207"; $fa-var-buysellads: "\f20d"; $fa-var-cab: "\f1ba"; $fa-var-calculator: "\f1ec"; $fa-var-calendar: "\f073"; $fa-var-calendar-check-o: "\f274"; $fa-var-calendar-minus-o: "\f272"; $fa-var-calendar-o: "\f133"; $fa-var-calendar-plus-o: "\f271"; $fa-var-calendar-times-o: "\f273"; $fa-var-camera: "\f030"; $fa-var-camera-retro: "\f083"; $fa-var-car: "\f1b9"; $fa-var-caret-down: "\f0d7"; $fa-var-caret-left: "\f0d9"; $fa-var-caret-right: "\f0da"; $fa-var-caret-square-o-down: "\f150"; $fa-var-caret-square-o-left: "\f191"; $fa-var-caret-square-o-right: "\f152"; $fa-var-caret-square-o-up: "\f151"; $fa-var-caret-up: "\f0d8"; $fa-var-cart-arrow-down: "\f218"; $fa-var-cart-plus: "\f217"; $fa-var-cc: "\f20a"; $fa-var-cc-amex: "\f1f3"; $fa-var-cc-diners-club: "\f24c"; $fa-var-cc-discover: "\f1f2"; $fa-var-cc-jcb: "\f24b"; $fa-var-cc-mastercard: "\f1f1"; $fa-var-cc-paypal: "\f1f4"; $fa-var-cc-stripe: "\f1f5"; $fa-var-cc-visa: "\f1f0"; $fa-var-certificate: "\f0a3"; $fa-var-chain: "\f0c1"; $fa-var-chain-broken: "\f127"; $fa-var-check: "\f00c"; $fa-var-check-circle: "\f058"; $fa-var-check-circle-o: "\f05d"; $fa-var-check-square: "\f14a"; $fa-var-check-square-o: "\f046"; $fa-var-chevron-circle-down: "\f13a"; $fa-var-chevron-circle-left: "\f137"; $fa-var-chevron-circle-right: "\f138"; $fa-var-chevron-circle-up: "\f139"; $fa-var-chevron-down: "\f078"; $fa-var-chevron-left: "\f053"; $fa-var-chevron-right: "\f054"; $fa-var-chevron-up: "\f077"; $fa-var-child: "\f1ae"; $fa-var-chrome: "\f268"; $fa-var-circle: "\f111"; $fa-var-circle-o: "\f10c"; $fa-var-circle-o-notch: "\f1ce"; $fa-var-circle-thin: "\f1db"; $fa-var-clipboard: "\f0ea"; $fa-var-clock-o: "\f017"; $fa-var-clone: "\f24d"; $fa-var-close: "\f00d"; $fa-var-cloud: "\f0c2"; $fa-var-cloud-download: "\f0ed"; $fa-var-cloud-upload: "\f0ee"; $fa-var-cny: "\f157"; $fa-var-code: "\f121"; $fa-var-code-fork: "\f126"; $fa-var-codepen: "\f1cb"; $fa-var-codiepie: "\f284"; $fa-var-coffee: "\f0f4"; $fa-var-cog: "\f013"; $fa-var-cogs: "\f085"; $fa-var-columns: "\f0db"; $fa-var-comment: "\f075"; $fa-var-comment-o: "\f0e5"; $fa-var-commenting: "\f27a"; $fa-var-commenting-o: "\f27b"; $fa-var-comments: "\f086"; $fa-var-comments-o: "\f0e6"; $fa-var-compass: "\f14e"; $fa-var-compress: "\f066"; $fa-var-connectdevelop: "\f20e"; $fa-var-contao: "\f26d"; $fa-var-copy: "\f0c5"; $fa-var-copyright: "\f1f9"; $fa-var-creative-commons: "\f25e"; $fa-var-credit-card: "\f09d"; $fa-var-credit-card-alt: "\f283"; $fa-var-crop: "\f125"; $fa-var-crosshairs: "\f05b"; $fa-var-css3: "\f13c"; $fa-var-cube: "\f1b2"; $fa-var-cubes: "\f1b3"; $fa-var-cut: "\f0c4"; $fa-var-cutlery: "\f0f5"; $fa-var-dashboard: "\f0e4"; $fa-var-dashcube: "\f210"; $fa-var-database: "\f1c0"; $fa-var-dedent: "\f03b"; $fa-var-delicious: "\f1a5"; $fa-var-desktop: "\f108"; $fa-var-deviantart: "\f1bd"; $fa-var-diamond: "\f219"; $fa-var-digg: "\f1a6"; $fa-var-dollar: "\f155"; $fa-var-dot-circle-o: "\f192"; $fa-var-download: "\f019"; $fa-var-dribbble: "\f17d"; $fa-var-dropbox: "\f16b"; $fa-var-drupal: "\f1a9"; $fa-var-edge: "\f282"; $fa-var-edit: "\f044"; $fa-var-eject: "\f052"; $fa-var-ellipsis-h: "\f141"; $fa-var-ellipsis-v: "\f142"; $fa-var-empire: "\f1d1"; $fa-var-envelope: "\f0e0"; $fa-var-envelope-o: "\f003"; $fa-var-envelope-square: "\f199"; $fa-var-eraser: "\f12d"; $fa-var-eur: "\f153"; $fa-var-euro: "\f153"; $fa-var-exchange: "\f0ec"; $fa-var-exclamation: "\f12a"; $fa-var-exclamation-circle: "\f06a"; $fa-var-exclamation-triangle: "\f071"; $fa-var-expand: "\f065"; $fa-var-expeditedssl: "\f23e"; $fa-var-external-link: "\f08e"; $fa-var-external-link-square: "\f14c"; $fa-var-eye: "\f06e"; $fa-var-eye-slash: "\f070"; $fa-var-eyedropper: "\f1fb"; $fa-var-facebook: "\f09a"; $fa-var-facebook-f: "\f09a"; $fa-var-facebook-official: "\f230"; $fa-var-facebook-square: "\f082"; $fa-var-fast-backward: "\f049"; $fa-var-fast-forward: "\f050"; $fa-var-fax: "\f1ac"; $fa-var-feed: "\f09e"; $fa-var-female: "\f182"; $fa-var-fighter-jet: "\f0fb"; $fa-var-file: "\f15b"; $fa-var-file-archive-o: "\f1c6"; $fa-var-file-audio-o: "\f1c7"; $fa-var-file-code-o: "\f1c9"; $fa-var-file-excel-o: "\f1c3"; $fa-var-file-image-o: "\f1c5"; $fa-var-file-movie-o: "\f1c8"; $fa-var-file-o: "\f016"; $fa-var-file-pdf-o: "\f1c1"; $fa-var-file-photo-o: "\f1c5"; $fa-var-file-picture-o: "\f1c5"; $fa-var-file-powerpoint-o: "\f1c4"; $fa-var-file-sound-o: "\f1c7"; $fa-var-file-text: "\f15c"; $fa-var-file-text-o: "\f0f6"; $fa-var-file-video-o: "\f1c8"; $fa-var-file-word-o: "\f1c2"; $fa-var-file-zip-o: "\f1c6"; $fa-var-files-o: "\f0c5"; $fa-var-film: "\f008"; $fa-var-filter: "\f0b0"; $fa-var-fire: "\f06d"; $fa-var-fire-extinguisher: "\f134"; $fa-var-firefox: "\f269"; $fa-var-flag: "\f024"; $fa-var-flag-checkered: "\f11e"; $fa-var-flag-o: "\f11d"; $fa-var-flash: "\f0e7"; $fa-var-flask: "\f0c3"; $fa-var-flickr: "\f16e"; $fa-var-floppy-o: "\f0c7"; $fa-var-folder: "\f07b"; $fa-var-folder-o: "\f114"; $fa-var-folder-open: "\f07c"; $fa-var-folder-open-o: "\f115"; $fa-var-font: "\f031"; $fa-var-fonticons: "\f280"; $fa-var-fort-awesome: "\f286"; $fa-var-forumbee: "\f211"; $fa-var-forward: "\f04e"; $fa-var-foursquare: "\f180"; $fa-var-frown-o: "\f119"; $fa-var-futbol-o: "\f1e3"; $fa-var-gamepad: "\f11b"; $fa-var-gavel: "\f0e3"; $fa-var-gbp: "\f154"; $fa-var-ge: "\f1d1"; $fa-var-gear: "\f013"; $fa-var-gears: "\f085"; $fa-var-genderless: "\f22d"; $fa-var-get-pocket: "\f265"; $fa-var-gg: "\f260"; $fa-var-gg-circle: "\f261"; $fa-var-gift: "\f06b"; $fa-var-git: "\f1d3"; $fa-var-git-square: "\f1d2"; $fa-var-github: "\f09b"; $fa-var-github-alt: "\f113"; $fa-var-github-square: "\f092"; $fa-var-gittip: "\f184"; $fa-var-glass: "\f000"; $fa-var-globe: "\f0ac"; $fa-var-google: "\f1a0"; $fa-var-google-plus: "\f0d5"; $fa-var-google-plus-square: "\f0d4"; $fa-var-google-wallet: "\f1ee"; $fa-var-graduation-cap: "\f19d"; $fa-var-gratipay: "\f184"; $fa-var-group: "\f0c0"; $fa-var-h-square: "\f0fd"; $fa-var-hacker-news: "\f1d4"; $fa-var-hand-grab-o: "\f255"; $fa-var-hand-lizard-o: "\f258"; $fa-var-hand-o-down: "\f0a7"; $fa-var-hand-o-left: "\f0a5"; $fa-var-hand-o-right: "\f0a4"; $fa-var-hand-o-up: "\f0a6"; $fa-var-hand-paper-o: "\f256"; $fa-var-hand-peace-o: "\f25b"; $fa-var-hand-pointer-o: "\f25a"; $fa-var-hand-rock-o: "\f255"; $fa-var-hand-scissors-o: "\f257"; $fa-var-hand-spock-o: "\f259"; $fa-var-hand-stop-o: "\f256"; $fa-var-hashtag: "\f292"; $fa-var-hdd-o: "\f0a0"; $fa-var-header: "\f1dc"; $fa-var-headphones: "\f025"; $fa-var-heart: "\f004"; $fa-var-heart-o: "\f08a"; $fa-var-heartbeat: "\f21e"; $fa-var-history: "\f1da"; $fa-var-home: "\f015"; $fa-var-hospital-o: "\f0f8"; $fa-var-hotel: "\f236"; $fa-var-hourglass: "\f254"; $fa-var-hourglass-1: "\f251"; $fa-var-hourglass-2: "\f252"; $fa-var-hourglass-3: "\f253"; $fa-var-hourglass-end: "\f253"; $fa-var-hourglass-half: "\f252"; $fa-var-hourglass-o: "\f250"; $fa-var-hourglass-start: "\f251"; $fa-var-houzz: "\f27c"; $fa-var-html5: "\f13b"; $fa-var-i-cursor: "\f246"; $fa-var-ils: "\f20b"; $fa-var-image: "\f03e"; $fa-var-inbox: "\f01c"; $fa-var-indent: "\f03c"; $fa-var-industry: "\f275"; $fa-var-info: "\f129"; $fa-var-info-circle: "\f05a"; $fa-var-inr: "\f156"; $fa-var-instagram: "\f16d"; $fa-var-institution: "\f19c"; $fa-var-internet-explorer: "\f26b"; $fa-var-intersex: "\f224"; $fa-var-ioxhost: "\f208"; $fa-var-italic: "\f033"; $fa-var-joomla: "\f1aa"; $fa-var-jpy: "\f157"; $fa-var-jsfiddle: "\f1cc"; $fa-var-key: "\f084"; $fa-var-keyboard-o: "\f11c"; $fa-var-krw: "\f159"; $fa-var-language: "\f1ab"; $fa-var-laptop: "\f109"; $fa-var-lastfm: "\f202"; $fa-var-lastfm-square: "\f203"; $fa-var-leaf: "\f06c"; $fa-var-leanpub: "\f212"; $fa-var-legal: "\f0e3"; $fa-var-lemon-o: "\f094"; $fa-var-level-down: "\f149"; $fa-var-level-up: "\f148"; $fa-var-life-bouy: "\f1cd"; $fa-var-life-buoy: "\f1cd"; $fa-var-life-ring: "\f1cd"; $fa-var-life-saver: "\f1cd"; $fa-var-lightbulb-o: "\f0eb"; $fa-var-line-chart: "\f201"; $fa-var-link: "\f0c1"; $fa-var-linkedin: "\f0e1"; $fa-var-linkedin-square: "\f08c"; $fa-var-linux: "\f17c"; $fa-var-list: "\f03a"; $fa-var-list-alt: "\f022"; $fa-var-list-ol: "\f0cb"; $fa-var-list-ul: "\f0ca"; $fa-var-location-arrow: "\f124"; $fa-var-lock: "\f023"; $fa-var-long-arrow-down: "\f175"; $fa-var-long-arrow-left: "\f177"; $fa-var-long-arrow-right: "\f178"; $fa-var-long-arrow-up: "\f176"; $fa-var-magic: "\f0d0"; $fa-var-magnet: "\f076"; $fa-var-mail-forward: "\f064"; $fa-var-mail-reply: "\f112"; $fa-var-mail-reply-all: "\f122"; $fa-var-male: "\f183"; $fa-var-map: "\f279"; $fa-var-map-marker: "\f041"; $fa-var-map-o: "\f278"; $fa-var-map-pin: "\f276"; $fa-var-map-signs: "\f277"; $fa-var-mars: "\f222"; $fa-var-mars-double: "\f227"; $fa-var-mars-stroke: "\f229"; $fa-var-mars-stroke-h: "\f22b"; $fa-var-mars-stroke-v: "\f22a"; $fa-var-maxcdn: "\f136"; $fa-var-meanpath: "\f20c"; $fa-var-medium: "\f23a"; $fa-var-medkit: "\f0fa"; $fa-var-meh-o: "\f11a"; $fa-var-mercury: "\f223"; $fa-var-microphone: "\f130"; $fa-var-microphone-slash: "\f131"; $fa-var-minus: "\f068"; $fa-var-minus-circle: "\f056"; $fa-var-minus-square: "\f146"; $fa-var-minus-square-o: "\f147"; $fa-var-mixcloud: "\f289"; $fa-var-mobile: "\f10b"; $fa-var-mobile-phone: "\f10b"; $fa-var-modx: "\f285"; $fa-var-money: "\f0d6"; $fa-var-moon-o: "\f186"; $fa-var-mortar-board: "\f19d"; $fa-var-motorcycle: "\f21c"; $fa-var-mouse-pointer: "\f245"; $fa-var-music: "\f001"; $fa-var-navicon: "\f0c9"; $fa-var-neuter: "\f22c"; $fa-var-newspaper-o: "\f1ea"; $fa-var-object-group: "\f247"; $fa-var-object-ungroup: "\f248"; $fa-var-odnoklassniki: "\f263"; $fa-var-odnoklassniki-square: "\f264"; $fa-var-opencart: "\f23d"; $fa-var-openid: "\f19b"; $fa-var-opera: "\f26a"; $fa-var-optin-monster: "\f23c"; $fa-var-outdent: "\f03b"; $fa-var-pagelines: "\f18c"; $fa-var-paint-brush: "\f1fc"; $fa-var-paper-plane: "\f1d8"; $fa-var-paper-plane-o: "\f1d9"; $fa-var-paperclip: "\f0c6"; $fa-var-paragraph: "\f1dd"; $fa-var-paste: "\f0ea"; $fa-var-pause: "\f04c"; $fa-var-pause-circle: "\f28b"; $fa-var-pause-circle-o: "\f28c"; $fa-var-paw: "\f1b0"; $fa-var-paypal: "\f1ed"; $fa-var-pencil: "\f040"; $fa-var-pencil-square: "\f14b"; $fa-var-pencil-square-o: "\f044"; $fa-var-percent: "\f295"; $fa-var-phone: "\f095"; $fa-var-phone-square: "\f098"; $fa-var-photo: "\f03e"; $fa-var-picture-o: "\f03e"; $fa-var-pie-chart: "\f200"; $fa-var-pied-piper: "\f1a7"; $fa-var-pied-piper-alt: "\f1a8"; $fa-var-pinterest: "\f0d2"; $fa-var-pinterest-p: "\f231"; $fa-var-pinterest-square: "\f0d3"; $fa-var-plane: "\f072"; $fa-var-play: "\f04b"; $fa-var-play-circle: "\f144"; $fa-var-play-circle-o: "\f01d"; $fa-var-plug: "\f1e6"; $fa-var-plus: "\f067"; $fa-var-plus-circle: "\f055"; $fa-var-plus-square: "\f0fe"; $fa-var-plus-square-o: "\f196"; $fa-var-power-off: "\f011"; $fa-var-print: "\f02f"; $fa-var-product-hunt: "\f288"; $fa-var-puzzle-piece: "\f12e"; $fa-var-qq: "\f1d6"; $fa-var-qrcode: "\f029"; $fa-var-question: "\f128"; $fa-var-question-circle: "\f059"; $fa-var-quote-left: "\f10d"; $fa-var-quote-right: "\f10e"; $fa-var-ra: "\f1d0"; $fa-var-random: "\f074"; $fa-var-rebel: "\f1d0"; $fa-var-recycle: "\f1b8"; $fa-var-reddit: "\f1a1"; $fa-var-reddit-alien: "\f281"; $fa-var-reddit-square: "\f1a2"; $fa-var-refresh: "\f021"; $fa-var-registered: "\f25d"; $fa-var-remove: "\f00d"; $fa-var-renren: "\f18b"; $fa-var-reorder: "\f0c9"; $fa-var-repeat: "\f01e"; $fa-var-reply: "\f112"; $fa-var-reply-all: "\f122"; $fa-var-retweet: "\f079"; $fa-var-rmb: "\f157"; $fa-var-road: "\f018"; $fa-var-rocket: "\f135"; $fa-var-rotate-left: "\f0e2"; $fa-var-rotate-right: "\f01e"; $fa-var-rouble: "\f158"; $fa-var-rss: "\f09e"; $fa-var-rss-square: "\f143"; $fa-var-rub: "\f158"; $fa-var-ruble: "\f158"; $fa-var-rupee: "\f156"; $fa-var-safari: "\f267"; $fa-var-save: "\f0c7"; $fa-var-scissors: "\f0c4"; $fa-var-scribd: "\f28a"; $fa-var-search: "\f002"; $fa-var-search-minus: "\f010"; $fa-var-search-plus: "\f00e"; $fa-var-sellsy: "\f213"; $fa-var-send: "\f1d8"; $fa-var-send-o: "\f1d9"; $fa-var-server: "\f233"; $fa-var-share: "\f064"; $fa-var-share-alt: "\f1e0"; $fa-var-share-alt-square: "\f1e1"; $fa-var-share-square: "\f14d"; $fa-var-share-square-o: "\f045"; $fa-var-shekel: "\f20b"; $fa-var-sheqel: "\f20b"; $fa-var-shield: "\f132"; $fa-var-ship: "\f21a"; $fa-var-shirtsinbulk: "\f214"; $fa-var-shopping-bag: "\f290"; $fa-var-shopping-basket: "\f291"; $fa-var-shopping-cart: "\f07a"; $fa-var-sign-in: "\f090"; $fa-var-sign-out: "\f08b"; $fa-var-signal: "\f012"; $fa-var-simplybuilt: "\f215"; $fa-var-sitemap: "\f0e8"; $fa-var-skyatlas: "\f216"; $fa-var-skype: "\f17e"; $fa-var-slack: "\f198"; $fa-var-sliders: "\f1de"; $fa-var-slideshare: "\f1e7"; $fa-var-smile-o: "\f118"; $fa-var-soccer-ball-o: "\f1e3"; $fa-var-sort: "\f0dc"; $fa-var-sort-alpha-asc: "\f15d"; $fa-var-sort-alpha-desc: "\f15e"; $fa-var-sort-amount-asc: "\f160"; $fa-var-sort-amount-desc: "\f161"; $fa-var-sort-asc: "\f0de"; $fa-var-sort-desc: "\f0dd"; $fa-var-sort-down: "\f0dd"; $fa-var-sort-numeric-asc: "\f162"; $fa-var-sort-numeric-desc: "\f163"; $fa-var-sort-up: "\f0de"; $fa-var-soundcloud: "\f1be"; $fa-var-space-shuttle: "\f197"; $fa-var-spinner: "\f110"; $fa-var-spoon: "\f1b1"; $fa-var-spotify: "\f1bc"; $fa-var-square: "\f0c8"; $fa-var-square-o: "\f096"; $fa-var-stack-exchange: "\f18d"; $fa-var-stack-overflow: "\f16c"; $fa-var-star: "\f005"; $fa-var-star-half: "\f089"; $fa-var-star-half-empty: "\f123"; $fa-var-star-half-full: "\f123"; $fa-var-star-half-o: "\f123"; $fa-var-star-o: "\f006"; $fa-var-steam: "\f1b6"; $fa-var-steam-square: "\f1b7"; $fa-var-step-backward: "\f048"; $fa-var-step-forward: "\f051"; $fa-var-stethoscope: "\f0f1"; $fa-var-sticky-note: "\f249"; $fa-var-sticky-note-o: "\f24a"; $fa-var-stop: "\f04d"; $fa-var-stop-circle: "\f28d"; $fa-var-stop-circle-o: "\f28e"; $fa-var-street-view: "\f21d"; $fa-var-strikethrough: "\f0cc"; $fa-var-stumbleupon: "\f1a4"; $fa-var-stumbleupon-circle: "\f1a3"; $fa-var-subscript: "\f12c"; $fa-var-subway: "\f239"; $fa-var-suitcase: "\f0f2"; $fa-var-sun-o: "\f185"; $fa-var-superscript: "\f12b"; $fa-var-support: "\f1cd"; $fa-var-table: "\f0ce"; $fa-var-tablet: "\f10a"; $fa-var-tachometer: "\f0e4"; $fa-var-tag: "\f02b"; $fa-var-tags: "\f02c"; $fa-var-tasks: "\f0ae"; $fa-var-taxi: "\f1ba"; $fa-var-television: "\f26c"; $fa-var-tencent-weibo: "\f1d5"; $fa-var-terminal: "\f120"; $fa-var-text-height: "\f034"; $fa-var-text-width: "\f035"; $fa-var-th: "\f00a"; $fa-var-th-large: "\f009"; $fa-var-th-list: "\f00b"; $fa-var-thumb-tack: "\f08d"; $fa-var-thumbs-down: "\f165"; $fa-var-thumbs-o-down: "\f088"; $fa-var-thumbs-o-up: "\f087"; $fa-var-thumbs-up: "\f164"; $fa-var-ticket: "\f145"; $fa-var-times: "\f00d"; $fa-var-times-circle: "\f057"; $fa-var-times-circle-o: "\f05c"; $fa-var-tint: "\f043"; $fa-var-toggle-down: "\f150"; $fa-var-toggle-left: "\f191"; $fa-var-toggle-off: "\f204"; $fa-var-toggle-on: "\f205"; $fa-var-toggle-right: "\f152"; $fa-var-toggle-up: "\f151"; $fa-var-trademark: "\f25c"; $fa-var-train: "\f238"; $fa-var-transgender: "\f224"; $fa-var-transgender-alt: "\f225"; $fa-var-trash: "\f1f8"; $fa-var-trash-o: "\f014"; $fa-var-tree: "\f1bb"; $fa-var-trello: "\f181"; $fa-var-tripadvisor: "\f262"; $fa-var-trophy: "\f091"; $fa-var-truck: "\f0d1"; $fa-var-try: "\f195"; $fa-var-tty: "\f1e4"; $fa-var-tumblr: "\f173"; $fa-var-tumblr-square: "\f174"; $fa-var-turkish-lira: "\f195"; $fa-var-tv: "\f26c"; $fa-var-twitch: "\f1e8"; $fa-var-twitter: "\f099"; $fa-var-twitter-square: "\f081"; $fa-var-umbrella: "\f0e9"; $fa-var-underline: "\f0cd"; $fa-var-undo: "\f0e2"; $fa-var-university: "\f19c"; $fa-var-unlink: "\f127"; $fa-var-unlock: "\f09c"; $fa-var-unlock-alt: "\f13e"; $fa-var-unsorted: "\f0dc"; $fa-var-upload: "\f093"; $fa-var-usb: "\f287"; $fa-var-usd: "\f155"; $fa-var-user: "\f007"; $fa-var-user-md: "\f0f0"; $fa-var-user-plus: "\f234"; $fa-var-user-secret: "\f21b"; $fa-var-user-times: "\f235"; $fa-var-users: "\f0c0"; $fa-var-venus: "\f221"; $fa-var-venus-double: "\f226"; $fa-var-venus-mars: "\f228"; $fa-var-viacoin: "\f237"; $fa-var-video-camera: "\f03d"; $fa-var-vimeo: "\f27d"; $fa-var-vimeo-square: "\f194"; $fa-var-vine: "\f1ca"; $fa-var-vk: "\f189"; $fa-var-volume-down: "\f027"; $fa-var-volume-off: "\f026"; $fa-var-volume-up: "\f028"; $fa-var-warning: "\f071"; $fa-var-wechat: "\f1d7"; $fa-var-weibo: "\f18a"; $fa-var-weixin: "\f1d7"; $fa-var-whatsapp: "\f232"; $fa-var-wheelchair: "\f193"; $fa-var-wifi: "\f1eb"; $fa-var-wikipedia-w: "\f266"; $fa-var-windows: "\f17a"; $fa-var-won: "\f159"; $fa-var-wordpress: "\f19a"; $fa-var-wrench: "\f0ad"; $fa-var-xing: "\f168"; $fa-var-xing-square: "\f169"; $fa-var-y-combinator: "\f23b"; $fa-var-y-combinator-square: "\f1d4"; $fa-var-yahoo: "\f19e"; $fa-var-yc: "\f23b"; $fa-var-yc-square: "\f1d4"; $fa-var-yelp: "\f1e9"; $fa-var-yen: "\f157"; $fa-var-youtube: "\f167"; $fa-var-youtube-play: "\f16a"; $fa-var-youtube-square: "\f166"; ================================================ FILE: resources/public/font-awesome-4.5.0/scss/font-awesome.scss ================================================ /*! * Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ @import "variables"; @import "mixins"; @import "path"; @import "core"; @import "larger"; @import "fixed-width"; @import "list"; @import "bordered-pulled"; @import "animated"; @import "rotated-flipped"; @import "stacked"; @import "icons"; ================================================ FILE: resources/public/fonts/Lekton/SIL Open Font License.txt ================================================ This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. ================================================ FILE: resources/public/fonts/Open_Sans_Condensed/LICENSE.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: resources/public/fonts/Roboto/LICENSE.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: resources/public/js/BootstrapMenu.js ================================================ /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports; /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ exports: {}, /******/ id: moduleId, /******/ loaded: false /******/ }; /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ // Load entry module and return exports /******/ return __webpack_require__(0); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ function(module, exports, __webpack_require__) { /* webpack entry file to build a standalone browser script. */ window.BootstrapMenu = __webpack_require__(1); /***/ }, /* 1 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; var classNames = __webpack_require__(2); var $ = __webpack_require__(3); __webpack_require__(4); // modular lodash requires var _ = function() { throw new Error('Custom lodash build for BootstrapMenu. lodash chaining is not included'); }; _.noop = __webpack_require__(5); _.each = __webpack_require__(6); _.contains = __webpack_require__(33); _.extend = __webpack_require__(41); _.uniqueId = __webpack_require__(48); _.isFunction = __webpack_require__(18); var defaultOptions = { /* container of the context menu, where it will be created and where * event listeners will be installed. */ container: 'body', /* user-defined function to obtain specific data about the currently * opened element, to pass it to the rest of user-defined functions * of an action. */ fetchElementData: _.noop, /* what the source of the context menu should be when opened. * Valid values are 'mouse' and 'element'. */ menuSource: 'mouse', /* how to calculate the position of the context menu based on its source. * Valid values are 'aboveLeft', 'aboveRight', 'belowLeft', and 'belowRight'. */ menuPosition: 'belowLeft', /* the event to listen to open the menu. * Valid values are 'click', 'right-click', 'hover' */ menuEvent: 'right-click', // TODO rename to menuAction in next mayor version /* group actions to render them next to each other, with a separator * between each group. */ actionsGroups: [], /* In some weird cases, another plugin may be installing 'click' listeners * in the anchors used for each action of the context menu, and stopping * the event bubbling before it reachs this plugin's listener. * * For those cases, _actionSelectEvent can be used to change the event we * listen to, for example to 'mousedown'. * * Unless the context menu is not working due to this and a workaround is * needed, this option can be safely ignored. */ _actionSelectEvent: 'click' }; function renderMenu(_this) { var $menu = $('