Repository: the-paperless-project/paperless Branch: master Commit: 9b0063c9731f Files: 258 Total size: 2.0 MB Directory structure: gitextract_yqrokexp/ ├── .docker-hub-test ├── .editorconfig ├── .gitattributes ├── .gitignore ├── .travis.yml ├── CODE_OF_CONDUCT.md ├── Dockerfile ├── LICENSE ├── Pipfile ├── README-de.md ├── README-el.md ├── README.md ├── THANKS.md ├── ci/ │ └── deploy-docker ├── data/ │ └── .keep ├── docker-compose.env.example ├── docker-compose.yml.example ├── docs/ │ ├── Dockerfile │ ├── Makefile │ ├── _static/ │ │ ├── .keep │ │ └── custom.css │ ├── api.rst │ ├── changelog.rst │ ├── conf.py │ ├── consumption.rst │ ├── contributing.rst │ ├── customising.rst │ ├── examples/ │ │ └── lxc/ │ │ ├── lxc-install.sh │ │ └── paperless.conf │ ├── extending.rst │ ├── guesswork.rst │ ├── index.rst │ ├── migrating.rst │ ├── requirements.rst │ ├── requirements.txt │ ├── scanners.rst │ ├── screenshots.rst │ ├── setup.rst │ ├── troubleshooting.rst │ └── utilities.rst ├── management/ │ └── commands/ │ └── create_superuser_with_password.py ├── overrides/ │ └── README.md ├── paperless.conf.example ├── presentation/ │ ├── README.md │ ├── contrib/ │ │ ├── font-awesome-4.3.0/ │ │ │ ├── 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 │ │ └── google/ │ │ └── css/ │ │ └── lato.css │ ├── css/ │ │ ├── print/ │ │ │ ├── paper.css │ │ │ └── pdf.css │ │ ├── reveal.css │ │ ├── reveal.scss │ │ └── theme/ │ │ ├── README.md │ │ ├── beige.css │ │ ├── black.css │ │ ├── blood.css │ │ ├── league.css │ │ ├── moon.css │ │ ├── night.css │ │ ├── serif.css │ │ ├── simple.css │ │ ├── sky.css │ │ ├── solarized.css │ │ ├── source/ │ │ │ ├── beige.scss │ │ │ ├── black.scss │ │ │ ├── blood.scss │ │ │ ├── league.scss │ │ │ ├── moon.scss │ │ │ ├── night.scss │ │ │ ├── serif.scss │ │ │ ├── simple.scss │ │ │ ├── sky.scss │ │ │ ├── solarized.scss │ │ │ └── white.scss │ │ ├── template/ │ │ │ ├── mixins.scss │ │ │ ├── settings.scss │ │ │ └── theme.scss │ │ └── white.css │ ├── index.html │ ├── js/ │ │ └── reveal.js │ ├── lib/ │ │ ├── css/ │ │ │ └── zenburn.css │ │ ├── font/ │ │ │ ├── league-gothic/ │ │ │ │ ├── LICENSE │ │ │ │ └── league-gothic.css │ │ │ └── source-sans-pro/ │ │ │ ├── LICENSE │ │ │ └── source-sans-pro.css │ │ └── js/ │ │ ├── classList.js │ │ └── html5shiv.js │ └── plugin/ │ ├── highlight/ │ │ └── highlight.js │ ├── leap/ │ │ └── leap.js │ ├── markdown/ │ │ ├── example.html │ │ ├── example.md │ │ ├── markdown.js │ │ └── marked.js │ ├── math/ │ │ └── math.js │ ├── multiplex/ │ │ ├── client.js │ │ ├── index.js │ │ └── master.js │ ├── notes/ │ │ ├── notes.html │ │ └── notes.js │ ├── notes-server/ │ │ ├── client.js │ │ ├── index.js │ │ └── notes.html │ ├── print-pdf/ │ │ └── print-pdf.js │ ├── remotes/ │ │ └── remotes.js │ ├── search/ │ │ └── search.js │ └── zoom-js/ │ └── zoom.js ├── requirements.txt ├── resources/ │ └── logo/ │ └── print/ │ └── eps/ │ ├── Black logo - no background.eps │ ├── Color logo - no background.eps │ ├── Color logo with background.eps │ └── White logo - no background.eps ├── scripts/ │ ├── docker-entrypoint.sh │ ├── gunicorn.conf │ ├── paperless-consumer.service │ ├── paperless-webserver.service │ └── post-consumption-example.sh └── src/ ├── documents/ │ ├── __init__.py │ ├── actions.py │ ├── admin.py │ ├── apps.py │ ├── checks.py │ ├── consumer.py │ ├── filters.py │ ├── forms.py │ ├── loggers.py │ ├── mail.py │ ├── management/ │ │ ├── __init__.py │ │ └── commands/ │ │ ├── __init__.py │ │ ├── change_storage_type.py │ │ ├── document_consumer.py │ │ ├── document_correspondents.py │ │ ├── document_exporter.py │ │ ├── document_importer.py │ │ ├── document_logs.py │ │ ├── document_renamer.py │ │ ├── document_retagger.py │ │ └── loaddata_stdin.py │ ├── managers.py │ ├── migrations/ │ │ ├── 0001_initial.py │ │ ├── 0002_auto_20151226_1316.py │ │ ├── 0003_sender.py │ │ ├── 0004_auto_20160114_1844.py │ │ ├── 0005_auto_20160123_0313.py │ │ ├── 0006_auto_20160123_0430.py │ │ ├── 0007_auto_20160126_2114.py │ │ ├── 0008_document_file_type.py │ │ ├── 0009_auto_20160214_0040.py │ │ ├── 0010_log.py │ │ ├── 0011_auto_20160303_1929.py │ │ ├── 0012_auto_20160305_0040.py │ │ ├── 0013_auto_20160325_2111.py │ │ ├── 0014_document_checksum.py │ │ ├── 0015_add_insensitive_to_match.py │ │ ├── 0016_auto_20170325_1558.py │ │ ├── 0017_auto_20170512_0507.py │ │ ├── 0018_auto_20170715_1712.py │ │ ├── 0019_add_consumer_user.py │ │ ├── 0020_document_added.py │ │ ├── 0021_document_storage_type.py │ │ ├── 0022_auto_20181007_1420.py │ │ ├── 0023_document_current_filename.py │ │ └── __init__.py │ ├── mixins.py │ ├── models.py │ ├── parsers.py │ ├── serialisers.py │ ├── settings.py │ ├── signals/ │ │ ├── __init__.py │ │ └── handlers.py │ ├── static/ │ │ ├── js/ │ │ │ └── colours.js │ │ └── paperless.css │ ├── templates/ │ │ ├── admin/ │ │ │ ├── base_site.html │ │ │ ├── documents/ │ │ │ │ └── document/ │ │ │ │ ├── change_form.html │ │ │ │ ├── change_list.html │ │ │ │ ├── change_list_results.html │ │ │ │ └── select_object.html │ │ │ └── index.html │ │ └── documents/ │ │ └── index.html │ ├── templatetags/ │ │ ├── __init__.py │ │ ├── customisation.py │ │ └── hacks.py │ ├── tests/ │ │ ├── __init__.py │ │ ├── factories.py │ │ ├── samples/ │ │ │ ├── inline_mail.txt │ │ │ └── mail.txt │ │ ├── test_checks.py │ │ ├── test_consumer.py │ │ ├── test_document_model.py │ │ ├── test_file_handling.py │ │ ├── test_importer.py │ │ ├── test_logger.py │ │ ├── test_mail.py │ │ ├── test_matchables.py │ │ └── test_models.py │ └── views.py ├── manage.py ├── paperless/ │ ├── __init__.py │ ├── checks.py │ ├── db.py │ ├── middleware.py │ ├── mixins.py │ ├── models.py │ ├── settings.py │ ├── urls.py │ ├── version.py │ ├── views.py │ └── wsgi.py ├── paperless_tesseract/ │ ├── __init__.py │ ├── apps.py │ ├── languages.py │ ├── parsers.py │ ├── signals.py │ └── tests/ │ ├── __init__.py │ ├── test_date.py │ ├── test_ocr.py │ └── test_signals.py ├── paperless_text/ │ ├── __init__.py │ ├── apps.py │ ├── parsers.py │ └── signals.py ├── reminders/ │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── filters.py │ ├── migrations/ │ │ ├── 0001_initial.py │ │ ├── 0002_auto_20181007_1420.py │ │ └── __init__.py │ ├── models.py │ ├── serialisers.py │ ├── tests.py │ └── views.py ├── setup.cfg └── tox.ini ================================================ FILE CONTENTS ================================================ ================================================ FILE: .docker-hub-test ================================================ Docker Hub test 2 ================================================ FILE: .editorconfig ================================================ # EditorConfig: http://EditorConfig.org root = true [*] indent_style = tab indent_size = 2 insert_final_newline = true trim_trailing_whitespace = true end_of_line = lf charset = utf-8 max_line_length = 79 [{*.html,*.css,*.js}] max_line_length = off [*.py] indent_size = 4 indent_style = space [*.yml] indent_style = space # Tests don't get a line width restriction. It's still a good idea to follow # the 79 character rule, but in the interests of clarity, tests often need to # violate it. [**/test_*.py] max_line_length = off ================================================ FILE: .gitattributes ================================================ THANKS.md merge=union ================================================ FILE: .gitignore ================================================ # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] # C extensions *.so # Distribution / packaging .Python env/ build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ #lib/ lib64/ parts/ sdist/ var/ *.egg-info/ .installed.cfg *.egg # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *,cover .pytest_cache # Translations *.mo *.pot # Django stuff: *.log # Sphinx documentation docs/_build/ # PyBuilder target/ # Stored PDFs media/documents/*.gpg media/documents/thumbnails/* media/documents/originals/* media/overrides.css media/overrides.js # Sqlite database db.sqlite3 db.sqlite3-journal # PyCharm .idea # Other stuff that doesn't belong .virtualenv virtualenv docker-compose.yml docker-compose.env # Used for development scripts/import-for-development scripts/nuke # Static files collected by the collectstatic command ./static/ ================================================ FILE: .travis.yml ================================================ language: python before_install: - sudo apt-get update -qq - sudo apt-get install -qq libpoppler-cpp-dev unpaper tesseract-ocr imagemagick ghostscript optipng sudo: false matrix: include: - python: "3.5" - python: "3.6" - python: "3.7-dev" - env: - BUILD_DOCKER=1 # Variable to add to publish the Docker image: # * DOCKER_USERNAME # * DOCKER_PASSWORD, to be encrypted, use `travis encrypt DOCKER_PASSWORD=` services: - docker before_install: - true install: - true script: - docker build --tag=the-paperless-project/paperless . after_success: - true install: - pip install --upgrade pip pipenv sphinx - pipenv lock -r > requirements.txt - pip install -r requirements.txt script: - cd src/ - pytest --cov - pycodestyle - sphinx-build -b html ../docs ../docs/_build -W after_success: - coveralls deploy: - provider: script skip_cleanup: true script: ci/deploy-docker on: tags: true condition: '"${BUILD_DOCKER}" = 1' - provider: script skip_cleanup: true script: ci/deploy-docker on: branch: master condition: '"${BUILD_DOCKER}" = 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: * 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 code@danielquinn.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 to remove puritanical language. The original is available at [http://contributor-covenant.org/version/1/4][version] [homepage]: http://contributor-covenant.org [version]: http://contributor-covenant.org/version/1/4/ ================================================ FILE: Dockerfile ================================================ FROM alpine:3.12 LABEL maintainer="The Paperless Project https://github.com/the-paperless-project/paperless" \ contributors="Guy Addadi , Pit Kleyersburg , \ Sven Fischer " # Copy Pipfiles file, init script and gunicorn.conf COPY Pipfile* /usr/src/paperless/ COPY scripts/docker-entrypoint.sh /sbin/docker-entrypoint.sh COPY scripts/gunicorn.conf /usr/src/paperless/ # Set export and consumption directories ENV PAPERLESS_EXPORT_DIR=/export \ PAPERLESS_CONSUMPTION_DIR=/consume RUN apk add --no-cache \ bash \ curl \ ghostscript \ gnupg \ imagemagick \ libmagic \ libpq \ optipng \ poppler \ python3 \ shadow \ sudo \ tesseract-ocr \ tzdata \ unpaper && \ apk add --no-cache --virtual .build-dependencies \ g++ \ gcc \ jpeg-dev \ musl-dev \ poppler-dev \ postgresql-dev \ python3-dev \ zlib-dev && \ # Install python dependencies python3 -m ensurepip && \ rm -r /usr/lib/python*/ensurepip && \ cd /usr/src/paperless && \ pip3 install --upgrade pip pipenv && \ pipenv install --system --deploy && \ # Remove build dependencies apk del .build-dependencies && \ # Create the consumption directory mkdir -p $PAPERLESS_CONSUMPTION_DIR && \ # Create user addgroup -g 1000 paperless && \ adduser -D -u 1000 -G paperless -h /usr/src/paperless paperless && \ chown -Rh paperless:paperless /usr/src/paperless && \ mkdir -p $PAPERLESS_EXPORT_DIR && \ # Avoid setrlimit warnings # See: https://gitlab.alpinelinux.org/alpine/aports/issues/11122 echo 'Set disable_coredump false' >> /etc/sudo.conf && \ # Setup entrypoint chmod 755 /sbin/docker-entrypoint.sh WORKDIR /usr/src/paperless/src # Mount volumes and set Entrypoint VOLUME ["/usr/src/paperless/data", "/usr/src/paperless/media", "/consume", "/export"] ENTRYPOINT ["/sbin/docker-entrypoint.sh"] CMD ["--help"] # Copy application COPY src/ /usr/src/paperless/src/ COPY data/ /usr/src/paperless/data/ COPY media/ /usr/src/paperless/media/ # Collect static files RUN sudo -HEu paperless /usr/src/paperless/src/manage.py collectstatic --clear --no-input ================================================ FILE: LICENSE ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. {one line to give the program's name and a brief idea of what it does.} Copyright (C) {year} {name of author} This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: {project} Copyright (C) {year} {fullname} This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: Pipfile ================================================ [[source]] url = "https://pypi.python.org/simple" verify_ssl = true name = "pypi" [packages] django = "<2.1,>=2.0" pillow = "*" coveralls = "*" dateparser = "*" django-cors-headers = "*" django-crispy-forms = "*" django-extensions = "*" django-filter = "*" djangorestframework = "*" factory-boy = "*" filemagic = "*" fuzzywuzzy = {extras = ["speedup"],version = "==0.15.0"} gunicorn = "*" inotify-simple = "*" langdetect = "*" pdftotext = "*" pyocr = "*" python-dateutil = "*" python-dotenv = "*" python-gnupg = "*" pytz = "*" sphinx = "*" tox = "*" pycodestyle = "*" pytest = "*" pytest-cov = "*" pytest-django = "*" pytest-sugar = "*" pytest-env = "*" pytest-xdist = "*" psycopg2 = "*" djangoql = "*" whitenoise = "*" brotli = "*" [dev-packages] ipython = "*" ================================================ FILE: README-de.md ================================================ [ [en](README.md) | de | [el](README-el.md) ] ![Paperless](https://raw.githubusercontent.com/the-paperless-project/paperless/master/src/paperless/static/paperless/img/logo-dark.png) [![Dokumentation](https://readthedocs.org/projects/paperless/badge/?version=latest)](https://paperless.readthedocs.org/) [![Chat](https://badges.gitter.im/the-paperless-project/paperless.svg)](https://gitter.im/danielquinn/paperless) [![Travis](https://travis-ci.org/the-paperless-project/paperless.svg?branch=master)](https://travis-ci.org/the-paperless-project/paperless) [![Coverage Status](https://coveralls.io/repos/github/the-paperless-project/paperless/badge.svg?branch=master)](https://coveralls.io/github/the-paperless-project/paperless?branch=master) [![Danke](https://img.shields.io/badge/THANKS-md-ff69b4.svg)](https://github.com/the-paperless-project/paperless/blob/master/THANKS.md) Indexiere und archiviere alle deine eingescannten Papierdokumente Ich hasse Papier. Abgesehen von Umweltproblemen, ist es der Albtraum einer technisch-interessierten Person: * Es gibt keine Suchfunktion * Es braucht physischen Platz * Sicherungen bedeuten mehr Papier In den vergangenen Monaten hatte ich mehrmals das Problem, das richtige Dokument nicht zur Hand zu haben. Manchmal warf ich Dokumente weg, die ich noch gebraucht hätte (wer behält schon Wasserrechnungen für zwei Jahre?), andere verlor ich einfach... weil PAPIER. Ich schrieb dies, um mein Leben einfacher zu machen. ## Wie es funktioniert Paperless steuert nicht deinen Scanner, es hilft nur damit umzugehen, was der Scanner herausspuckt 1. Kaufe einen Dokumentenscanner, der an einen Ort in deinem Netzwerk schreiben kann. Wenn du Inspirationen brauchst, schau in die [Scannerempfehlungen](https://paperless.readthedocs.io/en/latest/scanners.html). 2. Stelle "Scanne zu FTP" oder ähnliches ein. Es sollte möglich sein, eingescannte Bilder ohne etwas tun zu müssen an einen Server hochzuladen. Natürlich kannst du auch die einscannte Datei händisch hochladen, wenn der Scanner automatisches Hochladen nicht unterstützt. Paperless ist es egal, wie die Dokumente in seinen lokalen Konsumordner gelangen. 3. Besitze einen Zielserver, lasse das Paperless-Konsumskript laufen, um die Datei mit OCR zu versehen und sie in einer lokalen Datenbank zu indexieren. 4. Benutze die Weboberfläche, um die Datenbank zu durchforsten und zu finden, was du suchst. 5. Lade die PDF-Datei, die du brauchst/möchtest über die Weboberfläche herunter und mach was auch immer du willst damit. Du kannst es auch drucken und versenden, so als wäre es das Original. In den meisten Fällen wird das niemanden interessieren oder bemerken. Hier das, was du bekommt: ![Vorher und Nachher](https://raw.githubusercontent.com/the-paperless-project/paperless/master/docs/_static/screenshot.png) ## Dokumentation Diese ist komplett verfügbar auf [ReadTheDocs](https://paperless.readthedocs.org/). ## Anforderungen Dies alles ist eine wirklich ziemlich einfache, glänzende und benutzerfreundliche Hülle rund um einige sehr mächtige Werkzeuge. * [ImageMagick](http://imagemagick.org/) wandelt Bilder zwischen Farbe und Graustufen um. * [Tesseract](https://github.com/tesseract-ocr) erledigt die Buchstabenerkennung. * [Unpaper](https://github.com/unpaper/unpaper) bereinigt und begradigt das eingescannte Bild. * [GNU Privacy Guard](https://gnupg.org/) wird als Verschlüsselungsbackend genutzt. * [Python 3](https://python.org/) ist die Sprache des Projekts. * [Pillow](https://pypi.python.org/pypi/pillowfight/) lädt die Bilddaten als Python-Objekt, um sie mit PyOCR zu verwenden. * [PyOCR](https://github.com/jflesch/pyocr) ist ein glatter, programmatischer Wrapper um Tesseract. * [Django](https://www.djangoproject.com/) ist das Framework, auf das dieses Projekt aufbaut. * [Python-GNUPG](http://pythonhosted.org/python-gnupg/) entschlüsselt die PDFs auf Abruf, um das Herunterladen unverschlüsselter Dateien zu ermöglichen, während die verschlüsselten Dateien auf der Festplatte bleiben. ## Status des Projekts Dieses Projekt wurde um 2015 gestartet und es gibt viele Leute, die es verwenden. Warum auch immer ist es ziemlich beliebt in Deutschland -- vielleicht kann jemand dort drüben mich über das Warum aufklären. Ich entwickle keine neuen Funktionen mehr für Paperless, weil es genau das tut, was ich brauche und meine Aufmerksamkeit meinem neuesten Projekt [Aletheia](https://github.com/danielquinn/aletheia) gewidmet ist. Ich verlasse jedoch nicht das Projekt. Ich bin glücklich damit, Pull Requests zu begutachten und Fragen im Issue-Bereich zu beantworten. Wenn du ein Entwickler bist und eine neue Funktion willst, reihe sie in den Issues ein und/oder sende einen PR! Ich bin glücklich damit, neue Sachen hinzuzufügen, habe aber einfach nicht die Zeit, sie selbst zu erarbeiten. ## Verknüpfte Projekte Paperless gibt es bereits seit einer Weile und Leute haben damit angefangen, Sachen rund um Paperless zu entwickeln. Wenn du einer dieser Menschen bist, kannst du dein Projekt zu dieser Liste hinzufügen: * [Paperless App](https://github.com/bauerj/paperless_app): Eine Android/iOS-App für Paperless. * [Paperless Desktop](https://github.com/thomasbrueggemann/paperless-desktop): Eine Desktop-Oberfläche für deine Paperless-Installation. Läuft auf Mac, Linux und Windows. * [ansible-role-paperless](https://github.com/ovv/ansible-role-paperless): Eine einfache Möglichkeit, Paperless via Ansible laufen zu lassen. * [paperless-cli](https://github.com/stgarf/paperless-cli): Ein golang Kommandozeilenprogramm, welches mit Paperless interagiert. ## Ähnliche Projekte Es gibt da draußen auch das Projekt [Mayan EDMS](https://mayan.readthedocs.org/en/latest/), welches überraschenderweise sehr große überschneidende Techniken hat wie Paperless. Mayan EDMS ist *viel* funktionsreicher und kommt ebenso mit einer glatten UI, aber kommt noch mit Python2; basiert jedoch auch auf Django und verwendet ein Konsummodell mit Tesseract und Unpaper. Es kann sein, dass Paperless weniger Ressourcen verbraucht, aber um ehrlich zu sein, hab ich das noch nicht selbst getestet. Eine Sache jedoch ist klar, *Paperless* ist ein **viel** besserer Name. ## Wichtiger Hinweis Dokumentenscanner werden typischerweise verwendet, um sensible Dokumente zu scannen. Dinge wie die Sozialversicherungsnummer, Steueraufzeichnungen, Rechnungen, etc. Während Paperless die Originaldateien über das Konsumskript verschlüsselt, sind die OCR-Texte *nicht* verschlüsselt und demnach in Klartext gespeichert (es muss durchsuchbar sein, also wenn jemand eine Idee hat, wie man das mit verschlüsselten Daten tun kann: Ich bin ganz Ohr). Das bedeutet, dass Paperless niemals auf einem nicht vertrauten Host laufen sollte. Stattdessen empfehle ich, wenn du es verwenden willst, es lokal auf einem Server in deinem Zuhause laufen zu lassen. ## Spenden Wie mit aller Freier Software, liegt die Macht weniger in den Finanzen als mehr in den gemeinsamen Bemühungen. Ich schätze wirklich jeden Pull Request und Bugreport, der von Benutzern von Paperless getätigt wird, also bitte macht damit weiter. Wenn du jedoch nicht einer für Programmieren/Design/Dokumentation bist und mich wirklich finanziell unterstützen willst, sage ich nicht nein dazu ;-) Das Ding ist, mir geht es finanziell OK, also würde ich dich darum bitten, an den [Hochkommissar der Vereinten Nationen für Flüchtlinge](https://donate.unhcr.org/int-en/general) zu spenden. Diese machen wichtige Arbeit und brauchen das Geld viel dringender als ich. ================================================ FILE: README-el.md ================================================ [ [en](README.md) | [de](README-de.md) | el ] ![Paperless](https://raw.githubusercontent.com/the-paperless-project/paperless/master/src/paperless/static/paperless/img/logo-dark.png) [![Documentation](https://readthedocs.org/projects/paperless/badge/?version=latest)](https://paperless.readthedocs.org/) [![Chat](https://badges.gitter.im/the-paperless-project/paperless.svg)](https://gitter.im/danielquinn/paperless) [![Travis](https://travis-ci.org/the-paperless-project/paperless.svg?branch=master)](https://travis-ci.org/the-paperless-project/paperless) [![Coverage Status](https://coveralls.io/repos/github/the-paperless-project/paperless/badge.svg?branch=master)](https://coveralls.io/github/the-paperless-project/paperless?branch=master) [![Thanks](https://img.shields.io/badge/THANKS-md-ff69b4.svg)](https://github.com/the-paperless-project/paperless/blob/master/THANKS.md) Ευρετήριο και αρχείο για όλα σας τα σκαναρισμένα έγγραφα Μισώ το χαρτί. Πέρα από τα περιβαλλοντικά ζητήματα, είναι ο εφιάλτης ενός τεχνικού. * Δεν υπάρχει η δυνατότητα της αναζήτησης * Πιάνουν πολύ χώρο * Τα αντίγραφα ασφαλείας σημάινουν περισσότερο χαρτί Τους τελευταίους μήνες μου έχει τύχει αρκετές φορές να μην μπορώ να βρω το σωστό έγγραφο. Κάποιες φορές ανακύκλωνα το έγγραφο που χρειαζόμουν (ποιος κρατάει τους λογαριασμούς του νερού για 2 χρόνια;;;) και κάποιες φορές απλά το έχανα ... επειδή έτσι είναι τα χαρτιά. Το έκανα αυτό για να κάνω την ζωή μου πιο εύκολη ## Πως δουλεύει Η εφαρμογή Paperless δεν ελέγχει το scanner σας, αλλά σας βοηθάει με τα αποτελέσματα του scanner σας. 1. Αγοράστε ένα scanner με πρόσβαση στο δίκτυο σας. Αν χρειάζεστε έμπνευση, δείτε την σελίδα με τα [προτεινόμενα scanner](https://paperless.readthedocs.io/en/latest/scanners.html). 2. Κάντε την ρύθμιση "scan to FTP" ή κάτι παρόμοιο. Θα μπορεί να αποθηκεύει τις σκαναρισμένες εικόνες σε έναν server χωρίς να χρειάζεται να κάνετε κάτι. Φυσικά άμα το scanner σας δεν μπορεί να αποθηκεύσει κάπου τις εικόνες σας αυτόματα μπορείτε να το κάνετε χειροκίνητα. Το Paperless δεν ενδιαφέρεται πως καταλήγουν κάπου τα αρχεία. 3. Να έχετε τον server που τρέχει το OCR script του Paperless να έχει ευρετήριο στην τοπική βάση δεδομένων. 4. Χρησιμοποιήστε το web frontend για να επιλέξετε βάση δεδομένων και να βρείτε αυτό που θέλετε. 5. Κατεβάστε το PDF που θέλετε/χρειάζεστε μέσω του web interface και κάντε ότι θέλετε με αυτό. Μπορείτε ακόμη να το εκτυπώσετε και να το στείλετε, σαν να ήταν το αρχικό. Στις περισσότερες περιπτώσεις κανείς δεν θα το προσέξει ή θα νοιαστεί. Αυτό είναι που θα πάρετε: ![Το πριν και το μετά](https://raw.githubusercontent.com/the-paperless-project/paperless/master/docs/_static/screenshot.png) ## Documentation Είναι όλα διαθέσιμα εδώ [ReadTheDocs](https://paperless.readthedocs.org/). ## Απαιτήσεις Όλα αυτά είναι πολύ απλά, και φιλικά προς τον χρήστη, μια συλλογή με πολύτιμα εργαλεία. * [ImageMagick](http://imagemagick.org/) μετατρέπει τις εικόνες σε έγχρωμες και ασπρόμαυρες. * [Tesseract](https://github.com/tesseract-ocr) κάνει την αναγνώρηση των χαρακτήρων. * [Unpaper](https://github.com/unpaper/unpaper) despeckles and deskews the scanned image. * [GNU Privacy Guard](https://gnupg.org/) χρησιμοποιείται για κρυπτογράφηση στο backend. * [Python 3](https://python.org/) είναι η γλώσσα του project. * [Pillow](https://pypi.python.org/pypi/pillowfight/) Φορτώνει την εικόνα σαν αντικείμενο στην python και μπορεί να χρησιμοποιηθεί με PyOCR * [PyOCR](https://github.com/jflesch/pyocr) is a slick programmatic wrapper around tesseract. * [Django](https://www.djangoproject.com/) το framework με το οποίο έγινε το project. * [Python-GNUPG](http://pythonhosted.org/python-gnupg/) Αποκρυπτογραφεί τα PDF αρχεία στη στιγμή ώστε να κατεβάζετε αποκρυπτογραφημένα αρχεία, αφήνοντας τα κρυπτογραφημένα στον δίσκο. ## Σταθερότητα Αυτό το project υπάρχει από το 2015 και υπάρχουν αρκετοί άνθρωποι που το χρησιμοποιούν, παρόλα αυτά βρίσκεται σε διαρκή ανάπτυξη (απλά δείτε πότε commit έχουν γίνει στο git history) οπότε μην περιμένετε να είναι 100% σταθερό. Μπορείτε να κάνετε backup την βάση δεδομένων sqlite3, τον φάκελο media και το configuration αρχείο σας ώστε να είστε ασφαλείς. ## Affiliated Projects Το Paperless υπάρχει εδώ και κάποιο καιρό και άνθρωποι έχουν αρχίσει να φτιάχνουν πράγματα γύρω από αυτό. Αν είσαι ένας από αυτούς τους ανθρώπους, μπορούμε να βάλουμε το project σου σε αυτήν την λίστα: * [Paperless App](https://github.com/bauerj/paperless_app): Μια εφαρμογή Android / iOS για Paperless. * [Paperless Desktop](https://github.com/thomasbrueggemann/paperless-desktop): Μια desktop εφαρμογή για εγκατάσταση του Paperless. Τρέχει σε Mac, Linux, και Windows. * [ansible-role-paperless](https://github.com/ovv/ansible-role-paperless): Ένας εύκολο τρόπος για να τρέχει το Paperless μέσω Ansible. ## Παρόμοια Projects Υπάρχει ένα άλλο ṕroject που λέγεται [Mayan EDMS](https://mayan.readthedocs.org/en/latest/) το οποίο έχει παρόμοια τεχνικά χαρακτηριστικά με το Paperless σε εντυπωσιακό βαθμό. Επίσης βασισμένο στο Django και χρησιμοποιώντας το consumer model με Tesseract και Unpaper, Mayan EDMS έχει *πολλά* περισσότερα χαρακτηριστικά και έρχεται με ένα επιδέξιο UI, αλλά είναι ακόμα σε Python 2. Μπορεί να είναι ότι το Paperless καταναλώνει λιγότερους πόρους, αλλά για να είμαι ειλικρινής, αυτό είναι μια εικασία την οποία δεν έχω επιβεβαιώσει μόνος μου. Ένα πράγμα είναι σίγουρο, το *Paperless* έχει **πολύ** καλύτερο όνομα. ## Σημαντική Σημείωση Τα scanner για αρχεία συνήθως χρησιμοποιούνται για ευαίσθητα αρχεία. Πράγματα όπως το ΑΜΚΑ, φορολογικά αρχεία, τιμολόγια κτλπ. Παρόλο που το Paperless κρυπτογραφεί τα αρχικά αρχεία μέσω του consumption script, το κείμενο OCR *δεν είναι* κρυπτογραφημένο και για αυτό αποθηκεύεται (πρέπει να είναι αναζητήσιμο, οπότε αν κάποιος ξέρει να το κάνει αυτό με κρυπτογραφημένα δεδομένα είμαι όλος αυτιά). Αυτό σημάνει ότι το Paperless δεν πρέπει ποτέ να τρέχει σε μη αξιόπιστο πάροχο. Για αυτό συστήνω αν θέλετε να το τρέξετε να το τρέξετε σε έναν τοπικό server σπίτι σας. ## Δωρεές Όπως με όλα τα δωρεάν λογισμικά, η δύναμη δεν βρίσκεται στα οικονομικά αλλά στην συλλογική προσπάθεια. Αλήθεια εκτιμώ κάθε pull request και bug report που προσφέρεται από τους χρήστες του Paperless, οπότε σας παρακαλώ συνεχίστε. Αν παρόλα αυτά, δεν μπορείτε να γράψετε κώδικα/να κάνέτε design/να γράψετε documentation, και θέλετε να συνεισφέρετε οικονομικά, δεν θα πω όχι ;-) Το θέμα είναι ότι είμαι οικονομικά εντάξει, οπότε θα σας ζητήσω να δωρίσετε τα χρήματα σας εδώ [United Nations High Commissioner for Refugees](https://donate.unhcr.org/int-en/general). Κάνουν σημαντική δουλειά και χρειάζονται τα χρήματα πολύ περισσότερο από ότι εγώ. ================================================ FILE: README.md ================================================ [ en | [de](README-de.md) | [el](README-el.md) ] ![Paperless](https://raw.githubusercontent.com/the-paperless-project/paperless/master/src/paperless/static/paperless/img/logo-dark.png) > ## Important news about the future of this project > > It's been more than 5 years since I started this project on a whim as an effort to try to get a handle on the massive amount of paper I was dealing with in relation to various visa applications (expat life is complicated!) Since then, the project has *exploded* in popularity, so much so that it overwhelmed me and working on it stopped being "fun" and started becoming a serious source of stress. > > In an effort to fix this, I created the Paperless GitHub [organisation](https://github.com/the-paperless-project), and brought on a few people to manage the issue and pull request load. Unfortunately, that model has proven to be unworkable too. With 23 pull requests waiting and 157 issues slowly filling up with confused/annoyed people wanting to get their contributions in, my whole "appoint a few strangers and hope they've got time" idea is showing my lack of foresight and organisational skill. > > In the shadow of these difficulties, a fork called [Paperless-ng](https://github.com/jonaswinkler/paperless-ng) written by [Jonas Winkler](https://github.com/jonaswinkler) has cropped up. It's *really* good, and unlike this project, it's actively maintained (at the time of this writing anyway). With 564 forks currently tracked by GitHub, I suspect there are a few more forks worth looking into out there as well. > > So, with all of the above in mind, I've decided to archive this project as read-only and suggest that those interested in new updates or submitting patches have a look at Paperless-ng. If you really like "Old Paperless", that's ok too! The project is [GPL licensed](https://github.com/the-paperless-project/paperless/blob/master/LICENSE), so you can fork it and run it on whatever you like so long as you respect the terms of said license. > > In time, I may transfer ownership of this organisation to Jonas if he's interested in taking that on, but for the moment, he's happy to run Paperless-ng out of its [current repo](https://github.com/jonaswinkler/paperless-ng). Regardless, if we do decide to make the transfer, I'll post a notification here a few months in advance so that people won't be surprised by new code at this location. > > For my part, I'm really happy & proud to have been part of this project, and I'm sorry I've been unable to commit more time to it for everyone. I hope you all understand, and I'm really pleased that this work has been able to continue to live and be useful in a new project. Thank you to everyone who contributed, and for making Free software awesome. > > Sincerely, > [Daniel Quinn](https://github.com/danielquinn) [![Documentation](https://readthedocs.org/projects/paperless/badge/?version=latest)](https://paperless.readthedocs.org/) [![Chat](https://badges.gitter.im/the-paperless-project/paperless.svg)](https://gitter.im/danielquinn/paperless) [![Travis](https://travis-ci.org/the-paperless-project/paperless.svg?branch=master)](https://travis-ci.org/the-paperless-project/paperless) [![Coverage Status](https://coveralls.io/repos/github/the-paperless-project/paperless/badge.svg?branch=master)](https://coveralls.io/github/the-paperless-project/paperless?branch=master) [![StackShare](https://img.shields.io/badge/tech-stack-0690fa.svg?style=flat)](https://stackshare.io/the-paperless-project/the-paperless-project) [![Thanks](https://img.shields.io/badge/THANKS-md-ff69b4.svg)](https://github.com/the-paperless-project/paperless/blob/master/THANKS.md) Index and archive all of your scanned paper documents I hate paper. Environmental issues aside, it's a tech person's nightmare: * There's no search feature * It takes up physical space * Backups mean more paper In the past few months I've been bitten more than a few times by the problem of not having the right document around. Sometimes I recycled a document I needed (who keeps water bills for two years?) and other times I just lost it... because paper. I wrote this to make my life easier. ## How it Works Paperless does not control your scanner, it only helps you deal with what your scanner produces 1. Buy a document scanner that can write to a place on your network. If you need some inspiration, have a look at the [scanner recommendations](https://paperless.readthedocs.io/en/latest/scanners.html) page. 2. Set it up to "scan to FTP" or something similar. It should be able to push scanned images to a server without you having to do anything. Of course if your scanner doesn't know how to automatically upload the file somewhere, you can always do that manually. Paperless doesn't care how the documents get into its local consumption directory. 3. Have the target server run the Paperless consumption script to OCR the file and index it into a local database. 4. Use the web frontend to sift through the database and find what you want. 5. Download the PDF you need/want via the web interface and do whatever you like with it. You can even print it and send it as if it's the original. In most cases, no one will care or notice. Here's what you get: ![The before and after](https://raw.githubusercontent.com/the-paperless-project/paperless/master/docs/_static/screenshot.png) ## Documentation It's all available on [ReadTheDocs](https://paperless.readthedocs.io/). ## Requirements This is all really a quite simple, shiny, user-friendly wrapper around some very powerful tools. * [ImageMagick](http://imagemagick.org/) converts the images between colour and greyscale. * [Tesseract](https://github.com/tesseract-ocr) does the character recognition. * [Unpaper](https://github.com/unpaper/unpaper) despeckles and deskews the scanned image. * [GNU Privacy Guard](https://gnupg.org/) is used as the encryption backend. * [Python 3](https://python.org/) is the language of the project. * [Pillow](https://pypi.python.org/pypi/pillowfight/) loads the image data as a python object to be used with PyOCR. * [PyOCR](https://github.com/jflesch/pyocr) is a slick programmatic wrapper around tesseract. * [Django](https://www.djangoproject.com/) is the framework this project is written against. * [Python-GNUPG](http://pythonhosted.org/python-gnupg/) decrypts the PDFs on-the-fly to allow you to download unencrypted files, leaving the encrypted ones on-disk. ## Project Status This project has been around since 2015, and there's lots of people using it. For some reason, it's really popular in Germany -- maybe someone over there can clue me in as to why? I am no longer doing new development on Paperless as it does exactly what I need it to and have since turned my attention to my latest project, [Aletheia](https://github.com/danielquinn/aletheia). However, I'm not abandoning this project. I am happy to field pull requests and answer questions in the issue queue. If you're a developer yourself and want a new feature, float it in the issue queue and/or send me a pull request! I'm happy to add new stuff, but I just don't have the time to do that work myself. ## Affiliated Projects Paperless has been around a while now, and people are starting to build stuff on top of it. If you're one of those people, we can add your project to this list: * [Paperless App](https://github.com/bauerj/paperless_app): An Android/iOS app for Paperless. * [Paperless Desktop](https://github.com/thomasbrueggemann/paperless-desktop): A desktop UI for your Paperless installation. Runs on Mac, Linux, and Windows. * [ansible-role-paperless](https://github.com/ovv/ansible-role-paperless): An easy way to get Paperless running via Ansible. * [paperless-cli](https://github.com/stgarf/paperless-cli): A golang command line binary to interact with a Paperless instance. ## Similar Projects There's another project out there called [Mayan EDMS](https://www.mayan-edms.com/) that has a surprising amount of technical overlap with Paperless. Also based on Django and using a consumer model with Tesseract and Unpaper, Mayan EDMS is *much* more featureful and comes with a slick UI as well, but still in Python 2. It may be that Paperless consumes fewer resources, but to be honest, this is just a guess as I haven't tested this myself. One thing's for certain though, *Paperless* is a **way** better name. ## Important Note Document scanners are typically used to scan sensitive documents. Things like your social insurance number, tax records, invoices, etc. While Paperless encrypts the original files via the consumption script, the OCR'd text is *not* encrypted and is therefore stored in the clear (it needs to be searchable, so if someone has ideas on how to do that on encrypted data, I'm all ears). This means that Paperless should never be run on an untrusted host. Instead, I recommend that if you do want to use it, run it locally on a server in your own home. ## Donations As with all Free software, the power is less in the finances and more in the collective efforts. I really appreciate every pull request and bug report offered up by Paperless' users, so please keep that stuff coming. If however, you're not one for coding/design/documentation, and would like to contribute financially, I won't say no ;-) The thing is, I'm doing ok for money, so I would instead ask you to donate to the [United Nations High Commissioner for Refugees](https://donate.unhcr.org/int-en/general). They're doing important work and they need the money a lot more than I do. ================================================ FILE: THANKS.md ================================================ # Thanks for using Paperless! Working on this project has been exhausting, but rewarding at the same time. It's just wonderful that so many people are using this thing, and in so many crazy ways. This file is here for everyone to post their own stories about how you use this code. It helps me to understand who's using it and why, and maybe to give others an idea of how it might be used. It's based on a Twitter exchange between [John Glanville](https://twitter.com/hexapodium) and [Julia Evans](https://github.com/jvns) and later better defined [here](https://github.com/paulmolluzzo/thanks-md). To contribute, simply issue a pull request that appends to this file something like this: ``` ### Your Name Some friendly message ``` ================================================ FILE: ci/deploy-docker ================================================ #!/bin/bash if [ "${DOCKER_USERNAME}" == "" -o "${DOCKER_PASSWORD}" == "" ] then exit 0 fi docker login --username=${DOCKER_USERNAME} --password=${DOCKER_PASSWORD} if [ "${TRAVIS_TAG}" != "" ] then docker tag the-paperless-project/paperless the-paperless-project/paperless:${TRAVIS_TAG} docker push the-paperless-project/paperless:${TRAVIS_TAG} else docker push the-paperless-project/paperless fi ================================================ FILE: data/.keep ================================================ ================================================ FILE: docker-compose.env.example ================================================ # Environment variables to set for Paperless # Commented out variables will be replaced with a default within Paperless. # # In addition to what you see here, you can also define any values you find in # paperless.conf.example here. Values like: # # * PAPERLESS_PASSPHRASE # * PAPERLESS_CONSUMPTION_DIR # * PAPERLESS_CONSUME_MAIL_HOST # # ...are all explained in that file but can be defined here, since the Docker # installation doesn't make use of paperless.conf. # # NOTE: values in paperless.conf should be wrapped in double quotes, but not in this file # Example: # paperless.conf: PAPERLESS_FORGIVING_OCR="true" # docker-compose.env (this file): PAPERLESS_FORGIVING_OCR=true # Use this variable to set a timezone for the Paperless Docker containers. If not specified, defaults to UTC. # TZ=America/Los_Angeles # Additional languages to install for text recognition. Note that this is # different from PAPERLESS_OCR_LANGUAGE (default=eng), which defines the # default language used when guessing the language from the OCR output. # PAPERLESS_OCR_LANGUAGES=deu ita # Set Paperless to use SSL for the web interface. # Enabling this will require ssl.key and ssl.cert files in paperless' data directory. # PAPERLESS_USE_SSL=false # You can change the default user and group id to a custom one # USERMAP_UID=1000 # USERMAP_GID=1000 ================================================ FILE: docker-compose.yml.example ================================================ version: '2.1' services: webserver: build: ./ # uncomment the following line to start automatically on system boot # restart: always ports: # You can adapt the port you want Paperless to listen on by # modifying the part before the `:`. - "8000:8000" healthcheck: test: ["CMD", "curl" , "-f", "http://localhost:8000"] interval: 30s timeout: 10s retries: 5 volumes: - data:/usr/src/paperless/data - media:/usr/src/paperless/media # You have to adapt the local path you want the consumption # directory to mount to by modifying the part before the ':'. - ./consume:/consume env_file: docker-compose.env # The reason the line is here is so that the webserver that doesn't do # any text recognition and doesn't have to install unnecessary # languages the user might have set in the env-file by overwriting the # value with nothing. environment: - PAPERLESS_OCR_LANGUAGES= command: ["gunicorn", "-b", "0.0.0.0:8000"] consumer: build: ./ # uncomment the following line to start automatically on system boot # restart: always depends_on: webserver: condition: service_healthy volumes: - data:/usr/src/paperless/data - media:/usr/src/paperless/media # This should be set to the same value as the consume directory # in the webserver service above. - ./consume:/consume # Likewise, you can add a local path to mount a directory for # exporting. This is not strictly needed for paperless to # function, only if you're exporting your files: uncomment # it and fill in a local path if you know you're going to # want to export your documents. # - /path/to/another/arbitrary/place:/export env_file: docker-compose.env command: ["document_consumer"] volumes: data: media: ================================================ FILE: docs/Dockerfile ================================================ FROM python:3.5.1 MAINTAINER Pit Kleyersburg # Install Sphinx and Pygments RUN pip install Sphinx Pygments # Setup directories, copy data RUN mkdir /build COPY . /build WORKDIR /build/docs # Build documentation RUN make html # Start webserver WORKDIR /build/docs/_build/html EXPOSE 8000/tcp CMD ["python3", "-m", "http.server"] ================================================ FILE: docs/Makefile ================================================ # Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/RIPEAtlasToolsMagellan.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/RIPEAtlasToolsMagellan.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/RIPEAtlasToolsMagellan" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/RIPEAtlasToolsMagellan" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." latexpdfja: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." xml: $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml @echo @echo "Build finished. The XML files are in $(BUILDDIR)/xml." pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." ================================================ FILE: docs/_static/.keep ================================================ ================================================ FILE: docs/_static/custom.css ================================================ /* override table width restrictions */ @media screen and (min-width: 767px) { .wy-table-responsive table td { /* !important prevents the common CSS stylesheets from overriding this as on RTD they are loaded after this stylesheet */ white-space: normal !important; } .wy-table-responsive { overflow: visible !important; } } ================================================ FILE: docs/api.rst ================================================ .. _api: The REST API ############ Paperless makes use of the `Django REST Framework`_ standard API interface because of its inherent awesomeness. Conveniently, the system is also self-documenting, so to learn more about the access points, schema, what's accepted and what isn't, you need only visit ``/api`` on your local Paperless installation. .. _Django REST Framework: http://django-rest-framework.org/ .. _api-uploading: Uploading --------- File uploads in an API are hard and so far as I've been able to tell, there's no standard way of accepting them, so rather than crowbar file uploads into the REST API and endure that headache, I've left that process to a simple HTTP POST, documented on the :ref:`consumption page `. ================================================ FILE: docs/changelog.rst ================================================ Changelog ######### 2.7.0 ===== * `syntonym`_ submitted a pull request to catch IMAP connection errors `#475`_. * `Stéphane Brunner`_ added ``psycopg2`` to the Pipfile `#489`_. He also fixed a syntax error in ``docker-compose.yml.example`` `#488`_ and added [DjangoQL](https://github.com/ivelum/djangoql), which allows a litany of handy search functionality `#492`_. * `CkuT`_ and `JOKer`_ hacked out a simple, but super-helpful optimisation to how the thumbnails are served up, improving performance considerably `#481`_. * `tsia`_ added a few fields to the tags REST API. `#483`_. * `Brian Cribbs`_ improved the documentation to help people using Paperless over NFS `#484`_. * `Brendan M. Sleight`_ updated the documentation to include a note for setting the ``DEBUG`` value. The ``paperless.conf.example`` file was also updated to mirror the project defaults. 2.6.1 ===== * We now have a logo, complete with a favicon :-) * Removed some problematic tests. * Fix the docker-compose example config to include a shared consume volume so that using the push API will work for users of the Docker install. Thanks to `Colin Frei`_ for fixing this in `#466`_. * `khrise`_ submitted a pull request to include the ``added`` property to the REST API `#471`_. 2.6.0 ===== * Allow an infinite number of logs to be deleted. Thanks to `Ulli`_ for noting the problem in `#433`_. * Fix the ``RecentCorrespondentsFilter`` correspondents filter that was added in 2.4 to play nice with the defaults. Thanks to `tsia`_ and `Sblop`_ who pointed this out. `#423`_. * Updated dependencies to include (among other things) a security patch to requests. * Fix text in sample data for tests so that the language guesser stops thinking that everything is in Catalan because we had *Lorem ipsum* in there. * Tweaked the gunicorn sample command to use filesystem paths instead of Python paths. `#441`_ * Added pretty colour boxes next to the hex values in the Tags section, thanks to a pull request from `Joshua Taillon`_ `#442`_. * Added a ``.editorconfig`` file to better specify coding style. * `Joshua Taillon`_ also added some logic to tie Paperless' date guessing logic into how it parses file names on import. `#440`_ 2.5.0 ===== * **New dependency**: Paperless now optimises thumbnail generation with `optipng`_, so you'll need to install that somewhere in your PATH or declare its location in ``PAPERLESS_OPTIPNG_BINARY``. The Docker image has already been updated on the Docker Hub, so you just need to pull the latest one from there if you're a Docker user. * "Login free" instances of Paperless were breaking whenever you tried to edit objects in the admin: adding/deleting tags or correspondents, or even fixing spelling. This was due to the "user hack" we were applying to sessions that weren't using a login, as that hack user didn't have a valid id. The fix was to attribute the first user id in the system to this hack user. `#394`_ * A problem in how we handle slug values on Tags and Correspondents required a few changes to how we handle this field `#393`_: 1. Slugs are no longer editable. They're derived from the name of the tag or correspondent at save time, so if you wanna change the slug, you have to change the name, and even then you're restricted to the rules of the ``slugify()`` function. The slug value is still visible in the admin though. 2. I've added a migration to go over all existing tags & correspondents and rewrite the ``.slug`` values to ones conforming to the ``slugify()`` rules. 3. The consumption process now uses the same rules as ``.save()`` in determining a slug and using that to check for an existing tag/correspondent. * An annoying bug in the date capture code was causing some bogus dates to be attached to documents, which in turn busted the UI. Thanks to `Andrew Peng`_ for reporting this. `#414`_. * A bug in the Dockerfile meant that Tesseract language files weren't being installed correctly. `euri10`_ was quick to provide a fix: `#406`_, `#413`_. * Document consumption is now wrapped in a transaction as per an old ticket `#262`_. * The ``get_date()`` functionality of the parsers has been consolidated onto the ``DocumentParser`` class since much of that code was redundant anyway. 2.4.0 ===== * A new set of actions are now available thanks to `jonaswinkler`_'s very first pull request! You can now do nifty things like tag documents in bulk, or set correspondents in bulk. `#405`_ * The import/export system is now a little smarter. By default, documents are tagged as ``unencrypted``, since exports are by their nature unencrypted. It's now in the import step that we decide the storage type. This allows you to export from an encrypted system and import into an unencrypted one, or vice-versa. * The migration history has been slightly modified to accommodate PostgreSQL users. Additionally, you can now tell paperless to use PostgreSQL simply by declaring ``PAPERLESS_DBUSER`` in your environment. This will attempt to connect to your Postgres database without a password unless you also set ``PAPERLESS_DBPASS``. * A bug was found in the REST API filter system that was the result of an update of django-filter some time ago. This has now been patched in `#412`_. Thanks to `thepill`_ for spotting it! 2.3.0 ===== * Support for consuming plain text & markdown documents was added by `Joshua Taillon`_! This was a long-requested feature, and it's addition is likely to be greatly appreciated by the community: `#395`_ Thanks also to `David Martin`_ for his assistance on the issue. * `dubit0`_ found & fixed a bug that prevented management commands from running before we had an operational database: `#396`_ * Joshua also added a simple update to the thumbnail generation process to improve performance: `#399`_ * As his last bit of effort on this release, Joshua also added some code to allow you to view the documents inline rather than download them as an attachment. `#400`_ * Finally, `ahyear`_ found a slip in the Docker documentation and patched it. `#401`_ 2.2.1 ===== * `Kyle Lucy`_ reported a bug quickly after the release of 2.2.0 where we broke the ``DISABLE_LOGIN`` feature: `#392`_. 2.2.0 ===== * Thanks to `dadosch`_, `Wolfgang Mader`_, and `Tim Brooks`_ this is the first version of Paperless that supports Django 2.0! As a result of their hard work, you can now also run Paperless on Python 3.7 as well: `#386`_ & `#390`_. * `Stéphane Brunner`_ added a few lines of code that made tagging interface a lot easier on those of us with lots of different tags: `#391`_. * `Kilian Koeltzsch`_ noticed a bug in how we capture & automatically create tags, so that's fixed now too: `#384`_. * `erikarvstedt`_ tweaked the behaviour of the test suite to be better behaved for packaging environments: `#383`_. * `Lukasz Soluch`_ added CORS support to make building a new Javascript-based front-end cleaner & easier: `#387`_. 2.1.0 ===== * `Enno Lohmeier`_ added three simple features that make Paperless a lot more user (and developer) friendly: 1. There's a new search box on the front page: `#374`_. 2. The correspondents & tags pages now have a column showing the number of relevant documents: `#375`_. 3. The Dockerfile has been tweaked to build faster for those of us who are doing active development on Paperless using the Docker environment: `#376`_. * You now also have the ability to customise the interface to your heart's content by creating a file called ``overrides.css`` and/or ``overrides.js`` in the root of your media directory. Thanks to `Mark McFate`_ for this idea: `#371`_ 2.0.0 ===== This is a big release as we've changed a core-functionality of Paperless: we no longer encrypt files with GPG by default. The reasons for this are many, but it boils down to that the encryption wasn't really all that useful, as files on-disk were still accessible so long as you had the key, and the key was most typically stored in the config file. In other words, your files are only as safe as the ``paperless`` user is. In addition to that, *the contents of the documents were never encrypted*, so important numbers etc. were always accessible simply by querying the database. Still, it was better than nothing, but the consensus from users appears to be that it was more an annoyance than anything else, so this feature is now turned off unless you explicitly set a passphrase in your config file. Migrating from 1.x ------------------ Encryption isn't gone, it's just off for new users. So long as you have ``PAPERLESS_PASSPHRASE`` set in your config or your environment, Paperless should continue to operate as it always has. If however, you want to drop encryption too, you only need to do two things: 1. Run ``./manage.py migrate && ./manage.py change_storage_type gpg unencrypted``. This will go through your entire database and Decrypt All The Things. 2. Remove ``PAPERLESS_PASSPHRASE`` from your ``paperless.conf`` file, or simply stop declaring it in your environment. Special thanks to `erikarvstedt`_, `matthewmoto`_, and `mcronce`_ who did the bulk of the work on this big change. 1.4.0 ===== * `Quentin Dawans`_ has refactored the document consumer to allow for some command-line options. Notably, you can now direct it to consume from a particular ``--directory``, limit the ``--loop-time``, set the time between mail server checks with ``--mail-delta`` or just run it as a one-off with ``--one-shot``. See `#305`_ & `#313`_ for more information. * Refactor the use of travis/tox/pytest/coverage into two files: ``.travis.yml`` and ``setup.cfg``. * Start generating requirements.txt from a Pipfile. I'll probably switch over to just using pipenv in the future. * All for a alternative FreeBSD-friendly location for ``paperless.conf``. Thanks to `Martin Arendtsen`_ who provided this (`#322`_). * Document consumption events are now logged in the Django admin events log. Thanks to `CkuT`_ for doing the legwork on this one and to `Quentin Dawans`_ & `David Martin`_ for helping to coordinate & work out how the feature would be developed. * `erikarvstedt`_ contributed a pull request (`#328`_) to add ``--noreload`` to the default server start process. This helps reduce the load imposed by the running webservice. * Through some discussion on `#253`_ and `#323`_, we've removed a few of the hardcoded URL values to make it easier for people to host Paperless on a subdirectory. Thanks to `Quentin Dawans`_ and `Kyle Lucy`_ for helping to work this out. * The clickable area for documents on the listing page has been increased to a more predictable space thanks to a glorious hack from `erikarvstedt`_ in `#344`_. * `Strubbl`_ noticed an annoying bug in the bash script wrapping the Docker entrypoint and fixed it with some very creating Bash skills: `#352`_. * You can now use the search field to find documents by tag thanks to `thinkjk`_'s *first ever issue*: `#354`_. * Inotify is now being used to detect additions to the consume directory thanks to some excellent work from `erikarvstedt`_ on `#351`_ 1.3.0 ===== * You can now run Paperless without a login, though you'll still have to create at least one user. This is thanks to a pull-request from `matthewmoto`_: `#295`_. Note that logins are still required by default, and that you need to disable them by setting ``PAPERLESS_DISABLE_LOGIN="true"`` in your environment or in ``/etc/paperless.conf``. * Fix for `#303`_ where sketchily-formatted documents could cause the consumer to break and insert half-records into the database breaking all sorts of things. We now capture the return codes of both ``convert`` and ``unpaper`` and fail-out nicely. * Fix for additional date types thanks to input from `Isaac`_ and code from `BastianPoe`_ (`#301`_). * Fix for running migrations in the Docker container (`#299`_). Thanks to `Georgi Todorov`_ for the fix (`#300`_) and to `Pit`_ for the review. * Fix for Docker cases where the issuing user is not UID 1000. This was a collaborative fix between `Jeffrey Portman`_ and `Pit`_ in `#311`_ and `#312`_ to fix `#306`_. * Patch the historical migrations to support MySQL's um, *interesting* way of handing indexes (`#308`_). Thanks to `Simon Taddiken`_ for reporting the problem and helping me find where to fix it. 1.2.0 ===== * New Docker image, now based on Alpine, thanks to the efforts of `addadi`_ and `Pit`_. This new image is dramatically smaller than the Debian-based one, and it also has `a new home on Docker Hub`_. A proper thank-you to `Pit`_ for hosting the image on his Docker account all this time, but after some discussion, we decided the image needed a more *official-looking* home. * `BastianPoe`_ has added the long-awaited feature to automatically skip the OCR step when the PDF already contains text. This can be overridden by setting ``PAPERLESS_OCR_ALWAYS=YES`` either in your ``paperless.conf`` or in the environment. Note that this also means that Paperless now requires ``libpoppler-cpp-dev`` to be installed. **Important**: You'll need to run ``pip install -r requirements.txt`` after the usual ``git pull`` to properly update. * `BastianPoe`_ has also contributed a monumental amount of work (`#291`_) to solving `#158`_: setting the document creation date based on finding a date in the document text. 1.1.0 ===== * Fix for `#283`_, a redirect bug which broke interactions with paperless-desktop. Thanks to `chris-aeviator`_ for reporting it. * Addition of an optional new financial year filter, courtesy of `David Martin`_ `#256`_ * Fixed a typo in how thumbnails were named in exports `#285`_, courtesy of `Dan Panzarella`_ 1.0.0 ===== * Upgrade to Django 1.11. **You'll need to run ``pip install -r requirements.txt`` after the usual ``git pull`` to properly update**. * Replace the templatetag-based hack we had for document listing in favour of a slightly less ugly solution in the form of another template tag with less copypasta. * Support for multi-word-matches for auto-tagging thanks to an excellent patch from `ishirav`_ `#277`_. * Fixed a CSS bug reported by `Stefan Hagen`_ that caused an overlapping of the text and checkboxes under some resolutions `#272`_. * Patched the Docker config to force the serving of static files. Credit for this one goes to `dev-rke`_ via `#248`_. * Fix file permissions during Docker start up thanks to `Pit`_ on `#268`_. * Date fields in the admin are now expressed as HTML5 date fields thanks to `Lukas Winkler`_'s issue `#278`_ 0.8.0 ===== * Paperless can now run in a subdirectory on a host (``/paperless``), rather than always running in the root (``/``) thanks to `maphy-psd`_'s work on `#255`_. 0.7.0 ===== * **Potentially breaking change**: As per `#235`_, Paperless will no longer automatically delete documents attached to correspondents when those correspondents are themselves deleted. This was Django's default behaviour, but didn't make much sense in Paperless' case. Thanks to `Thomas Brueggemann`_ and `David Martin`_ for their input on this one. * Fix for `#232`_ wherein Paperless wasn't recognising ``.tif`` files properly. Thanks to `ayounggun`_ for reporting this one and to `Kusti Skytén`_ for posting the correct solution in the Github issue. 0.6.0 ===== * Abandon the shared-secret trick we were using for the POST API in favour of BasicAuth or Django session. * Fix the POST API so it actually works. `#236`_ * **Breaking change**: We've dropped the use of ``PAPERLESS_SHARED_SECRET`` as it was being used both for the API (now replaced with a normal auth) and form email polling. Now that we're only using it for email, this variable has been renamed to ``PAPERLESS_EMAIL_SECRET``. The old value will still work for a while, but you should change your config if you've been using the email polling feature. Thanks to `Joshua Gilman`_ for all the help with this feature. 0.5.0 ===== * Support for fuzzy matching in the auto-tagger & auto-correspondent systems thanks to `Jake Gysland`_'s patch `#220`_. * Modified the Dockerfile to prepare an export directory (`#212`_). Thanks to combined efforts from `Pit`_ and `Strubbl`_ in working out the kinks on this one. * Updated the import/export scripts to include support for thumbnails. Big thanks to `CkuT`_ for finding this shortcoming and doing the work to get it fixed in `#224`_. * All of the following changes are thanks to `David Martin`_: * Bumped the dependency on pyocr to 0.4.7 so new users can make use of Tesseract 4 if they so prefer (`#226`_). * Fixed a number of issues with the automated mail handler (`#227`_, `#228`_) * Amended the documentation for better handling of systemd service files (`#229`_) * Amended the Django Admin configuration to have nice headers (`#230`_) 0.4.1 ===== * Fix for `#206`_ wherein the pluggable parser didn't recognise files with all-caps suffixes like ``.PDF`` 0.4.0 ===== * Introducing reminders. See `#199`_ for more information, but the short explanation is that you can now attach simple notes & times to documents which are made available via the API. Currently, the default API (basically just the Django admin) doesn't really make use of this, but `Thomas Brueggemann`_ over at `Paperless Desktop`_ has said that he would like to make use of this feature in his project. 0.3.6 ===== * Fix for `#200`_ (!!) where the API wasn't configured to allow updating the correspondent or the tags for a document. * The ``content`` field is now optional, to allow for the edge case of a purely graphical document. * You can no longer add documents via the admin. This never worked in the first place, so all I've done here is remove the link to the broken form. * The consumer code has been heavily refactored to support a pluggable interface. Install a paperless consumer via pip and tell paperless about it with an environment variable, and you're good to go. Proper documentation is on its way. 0.3.5 ===== * A serious facelift for the documents listing page wherein we drop the tabular layout in favour of a tiled interface. * Users can now configure the number of items per page. * Fix for `#171`_: Allow users to specify their own ``SECRET_KEY`` value. * Moved the dotenv loading to the top of settings.py * Fix for `#112`_: Added checks for binaries required for document consumption. 0.3.4 ===== * Removal of django-suit due to a licensing conflict I bumped into in 0.3.3. Note that you *can* use Django Suit with Paperless, but only in a non-profit situation as their free license prohibits for-profit use. As a result, I can't bundle Suit with Paperless without conflicting with the GPL. Further development will be done against the stock Django admin. * I shrunk the thumbnails a little 'cause they were too big for me, even on my high-DPI monitor. * BasicAuth support for document and thumbnail downloads, as well as the Push API thanks to @thomasbrueggemann. See `#179`_. 0.3.3 ===== * Thumbnails in the UI and a Django-suit -based face-lift courtesy of @ekw! * Timezone, items per page, and default language are now all configurable, also thanks to @ekw. 0.3.2 ===== * Fix for `#172`_: defaulting ALLOWED_HOSTS to ``["*"]`` and allowing the user to set her own value via ``PAPERLESS_ALLOWED_HOSTS`` should the need arise. 0.3.1 ===== * Added a default value for ``CONVERT_BINARY`` 0.3.0 ===== * Updated to using django-filter 1.x * Added some system checks so new users aren't confused by misconfigurations. * Consumer loop time is now configurable for systems with slow writes. Just set ``PAPERLESS_CONSUMER_LOOP_TIME`` to a number of seconds. The default is 10. * As per `#44`_, we've removed support for ``PAPERLESS_CONVERT``, ``PAPERLESS_CONSUME``, and ``PAPERLESS_SECRET``. Please use ``PAPERLESS_CONVERT_BINARY``, ``PAPERLESS_CONSUMPTION_DIR``, and ``PAPERLESS_SHARED_SECRET`` respectively instead. 0.2.0 ===== * `#150`_: The media root is now a variable you can set in ``paperless.conf``. * `#148`_: The database location (sqlite) is now a variable you can set in ``paperless.conf``. * `#146`_: Fixed a bug that allowed unauthorised access to the ``/fetch`` URL. * `#131`_: Document files are now automatically removed from disk when they're deleted in Paperless. * `#121`_: Fixed a bug where Paperless wasn't setting document creation time based on the file naming scheme. * `#81`_: Added a hook to run an arbitrary script after every document is consumed. * `#98`_: Added optional environment variables for ImageMagick so that it doesn't explode when handling Very Large Documents or when it's just running on a low-memory system. Thanks to `Florian Harr`_ for his help on this one. * `#89`_ Ported the auto-tagging code to correspondents as well. Thanks to `Justin Snyman`_ for the pointers in the issue queue. * Added support for guessing the date from the file name along with the correspondent, title, and tags. Thanks to `Tikitu de Jager`_ for his pull request that I took forever to merge and to `Pit`_ for his efforts on the regex front. * `#94`_: Restored support for changing the created date in the UI. Thanks to `Martin Honermeyer`_ and `Tim White`_ for working with me on this. 0.1.1 ===== * Potentially **Breaking Change**: All references to "sender" in the code have been renamed to "correspondent" to better reflect the nature of the property (one could quite reasonably scan a document before sending it to someone.) * `#67`_: Rewrote the document exporter and added a new importer that allows for full metadata retention without depending on the file name and modification time. A big thanks to `Tikitu de Jager`_, `Pit`_, `Florian Jung`_, and `Christopher Luu`_ for their code snippets and contributing conversation that lead to this change. * `#20`_: Added *unpaper* support to help in cleaning up the scanned image before it's OCR'd. Thanks to `Pit`_ for this one. * `#71`_ Added (encrypted) thumbnails in anticipation of a proper UI. * `#68`_: Added support for using a proper config file at ``/etc/paperless.conf`` and modified the systemd unit files to use it. * Refactored the Vagrant installation process to use environment variables rather than asking the user to modify ``settings.py``. * `#44`_: Harmonise environment variable names with constant names. * `#60`_: Setup logging to actually use the Python native logging framework. * `#53`_: Fixed an annoying bug that caused ``.jpeg`` and ``.JPG`` images to be imported but made unavailable. 0.1.0 ===== * Docker support! Big thanks to `Wayne Werner`_, `Brian Conn`_, and `Tikitu de Jager`_ for this one, and especially to `Pit`_ who spearheadded this effort. * A simple REST API is in place, but it should be considered unstable. * Cleaned up the consumer to use temporary directories instead of a single scratch space. (Thanks `Pit`_) * Improved the efficiency of the consumer by parsing pages more intelligently and introducing a threaded OCR process (thanks again `Pit`_). * `#45`_: Cleaned up the logic for tag matching. Reported by `darkmatter`_. * `#47`_: Auto-rotate landscape documents. Reported by `Paul`_ and fixed by `Pit`_. * `#48`_: Matching algorithms should do so on a word boundary (`darkmatter`_) * `#54`_: Documented the re-tagger (`zedster`_) * `#57`_: Make sure file is preserved on import failure (`darkmatter`_) * Added tox with pep8 checking 0.0.6 ===== * Added support for parallel OCR (significant work from `Pit`_) * Sped up the language detection (significant work from `Pit`_) * Added simple logging 0.0.5 ===== * Added support for image files as documents (png, jpg, gif, tiff) * Added a crude means of HTTP POST for document imports * Added IMAP mail support * Added a re-tagging utility * Documentation for the above as well as data migration 0.0.4 ===== * Added automated tagging basted on keyword matching * Cleaned up the document listing page * Removed ``User`` and ``Group`` from the admin * Added ``pytz`` to the list of requirements 0.0.3 ===== * Added basic tagging 0.0.2 ===== * Added language detection * Added datestamps to ``document_exporter``. * Changed ``settings.TESSERACT_LANGUAGE`` to ``settings.OCR_LANGUAGE``. 0.0.1 ===== * Initial release .. _Brian Conn: https://github.com/TheConnMan .. _Christopher Luu: https://github.com/nuudles .. _Florian Jung: https://github.com/the01 .. _Tikitu de Jager: https://github.com/tikitu .. _Paul: https://github.com/polo2ro .. _Pit: https://github.com/pitkley .. _Wayne Werner: https://github.com/waynew .. _darkmatter: https://github.com/darkmatter .. _zedster: https://github.com/zedster .. _Martin Honermeyer: https://github.com/djmaze .. _Tim White: https://github.com/timwhite .. _Florian Harr: https://github.com/evils .. _Justin Snyman: https://github.com/stringlytyped .. _Thomas Brueggemann: https://github.com/thomasbrueggemann .. _Jake Gysland: https://github.com/jgysland .. _Strubbl: https://github.com/strubbl .. _CkuT: https://github.com/CkuT .. _David Martin: https://github.com/ddddavidmartin .. _Paperless Desktop: https://github.com/thomasbrueggemann/paperless-desktop .. _Joshua Gilman: https://github.com/jmgilman .. _ayounggun: https://github.com/ayounggun .. _Kusti Skytén: https://github.com/kskyten .. _maphy-psd: https://github.com/maphy-psd .. _ishirav: https://github.com/ishirav .. _Stefan Hagen: https://github.com/xkpd3 .. _dev-rke: https://github.com/dev-rke .. _Lukas Winkler: https://github.com/Findus23 .. _chris-aeviator: https://github.com/chris-aeviator .. _Dan Panzarella: https://github.com/pzl .. _addadi: https://github.com/addadi .. _BastianPoe: https://github.com/BastianPoe .. _matthewmoto: https://github.com/matthewmoto .. _Isaac: https://github.com/isaacsando .. _Georgi Todorov: https://github.com/TeraHz .. _Jeffrey Portman: https://github.com/ChromoX .. _Simon Taddiken: https://github.com/skuzzle .. _Quentin Dawans: https://github.com/ovv .. _Martin Arendtsen: https://github.com/Arendtsen .. _erikarvstedt: https://github.com/erikarvstedt .. _Kyle Lucy: https://github.com/kmlucy .. _thinkjk: https://github.com/thinkjk .. _mcronce: https://github.com/mcronce .. _Enno Lohmeier: https://github.com/elohmeier .. _Mark McFate: https://github.com/SummittDweller .. _dadosch: https://github.com/dadosch .. _Wolfgang Mader: https://github.com/wmader .. _Tim Brooks: https://github.com/brookst .. _Stéphane Brunner: https://github.com/sbrunner .. _Kilian Koeltzsch: https://github.com/kiliankoe .. _Lukasz Soluch: https://github.com/LukaszSolo .. _Joshua Taillon: https://github.com/jat255 .. _dubit0: https://github.com/dubit0 .. _ahyear: https://github.com/ahyear .. _jonaswinkler: https://github.com/jonaswinkler .. _thepill: https://github.com/thepill .. _Andrew Peng: https://github.com/pengc99 .. _euri10: https://github.com/euri10 .. _Ulli: https://github.com/Ulli2k .. _tsia: https://github.com/tsia .. _Sblop: https://github.com/Sblop .. _Colin Frei: https://github.com/colinfrei .. _khrise: https://github.com/khrise .. _syntonym: https://github.com/syntonym .. _JOKer: https://github.com/MasterofJOKers .. _Brian Cribbs: https://github.com/cribbstechnolog .. _Brendan M. Sleight: https://github.com/bmsleight .. _#20: https://github.com/the-paperless-project/paperless/issues/20 .. _#44: https://github.com/the-paperless-project/paperless/issues/44 .. _#45: https://github.com/the-paperless-project/paperless/issues/45 .. _#47: https://github.com/the-paperless-project/paperless/issues/47 .. _#48: https://github.com/the-paperless-project/paperless/issues/48 .. _#53: https://github.com/the-paperless-project/paperless/issues/53 .. _#54: https://github.com/the-paperless-project/paperless/issues/54 .. _#57: https://github.com/the-paperless-project/paperless/issues/57 .. _#60: https://github.com/the-paperless-project/paperless/issues/60 .. _#67: https://github.com/the-paperless-project/paperless/issues/67 .. _#68: https://github.com/the-paperless-project/paperless/issues/68 .. _#71: https://github.com/the-paperless-project/paperless/issues/71 .. _#81: https://github.com/the-paperless-project/paperless/issues/81 .. _#89: https://github.com/the-paperless-project/paperless/issues/89 .. _#94: https://github.com/the-paperless-project/paperless/issues/94 .. _#98: https://github.com/the-paperless-project/paperless/issues/98 .. _#112: https://github.com/the-paperless-project/paperless/issues/112 .. _#121: https://github.com/the-paperless-project/paperless/issues/121 .. _#131: https://github.com/the-paperless-project/paperless/issues/131 .. _#146: https://github.com/the-paperless-project/paperless/issues/146 .. _#148: https://github.com/the-paperless-project/paperless/pull/148 .. _#150: https://github.com/the-paperless-project/paperless/pull/150 .. _#158: https://github.com/the-paperless-project/paperless/issues/158 .. _#171: https://github.com/the-paperless-project/paperless/issues/171 .. _#172: https://github.com/the-paperless-project/paperless/issues/172 .. _#179: https://github.com/the-paperless-project/paperless/pull/179 .. _#199: https://github.com/the-paperless-project/paperless/issues/199 .. _#200: https://github.com/the-paperless-project/paperless/issues/200 .. _#206: https://github.com/the-paperless-project/paperless/issues/206 .. _#212: https://github.com/the-paperless-project/paperless/pull/212 .. _#220: https://github.com/the-paperless-project/paperless/pull/220 .. _#224: https://github.com/the-paperless-project/paperless/pull/224 .. _#226: https://github.com/the-paperless-project/paperless/pull/226 .. _#227: https://github.com/the-paperless-project/paperless/pull/227 .. _#228: https://github.com/the-paperless-project/paperless/pull/228 .. _#229: https://github.com/the-paperless-project/paperless/pull/229 .. _#230: https://github.com/the-paperless-project/paperless/pull/230 .. _#232: https://github.com/the-paperless-project/paperless/issues/232 .. _#235: https://github.com/the-paperless-project/paperless/issues/235 .. _#236: https://github.com/the-paperless-project/paperless/issues/236 .. _#255: https://github.com/the-paperless-project/paperless/pull/255 .. _#268: https://github.com/the-paperless-project/paperless/pull/268 .. _#277: https://github.com/the-paperless-project/paperless/pull/277 .. _#272: https://github.com/the-paperless-project/paperless/issues/272 .. _#248: https://github.com/the-paperless-project/paperless/issues/248 .. _#278: https://github.com/the-paperless-project/paperless/issues/248 .. _#283: https://github.com/the-paperless-project/paperless/issues/283 .. _#256: https://github.com/the-paperless-project/paperless/pull/256 .. _#285: https://github.com/the-paperless-project/paperless/pull/285 .. _#291: https://github.com/the-paperless-project/paperless/pull/291 .. _#295: https://github.com/the-paperless-project/paperless/pull/295 .. _#299: https://github.com/the-paperless-project/paperless/issues/299 .. _#300: https://github.com/the-paperless-project/paperless/pull/300 .. _#301: https://github.com/the-paperless-project/paperless/issues/301 .. _#303: https://github.com/the-paperless-project/paperless/issues/303 .. _#305: https://github.com/the-paperless-project/paperless/issues/305 .. _#306: https://github.com/the-paperless-project/paperless/issues/306 .. _#308: https://github.com/the-paperless-project/paperless/issues/308 .. _#311: https://github.com/the-paperless-project/paperless/pull/311 .. _#312: https://github.com/the-paperless-project/paperless/pull/312 .. _#313: https://github.com/the-paperless-project/paperless/pull/313 .. _#322: https://github.com/the-paperless-project/paperless/pull/322 .. _#328: https://github.com/the-paperless-project/paperless/pull/328 .. _#253: https://github.com/the-paperless-project/paperless/issues/253 .. _#262: https://github.com/the-paperless-project/paperless/issues/262 .. _#323: https://github.com/the-paperless-project/paperless/issues/323 .. _#344: https://github.com/the-paperless-project/paperless/pull/344 .. _#351: https://github.com/the-paperless-project/paperless/pull/351 .. _#352: https://github.com/the-paperless-project/paperless/pull/352 .. _#354: https://github.com/the-paperless-project/paperless/issues/354 .. _#371: https://github.com/the-paperless-project/paperless/issues/371 .. _#374: https://github.com/the-paperless-project/paperless/pull/374 .. _#375: https://github.com/the-paperless-project/paperless/pull/375 .. _#376: https://github.com/the-paperless-project/paperless/pull/376 .. _#383: https://github.com/the-paperless-project/paperless/pull/383 .. _#384: https://github.com/the-paperless-project/paperless/issues/384 .. _#386: https://github.com/the-paperless-project/paperless/issues/386 .. _#387: https://github.com/the-paperless-project/paperless/pull/387 .. _#391: https://github.com/the-paperless-project/paperless/pull/391 .. _#390: https://github.com/the-paperless-project/paperless/pull/390 .. _#392: https://github.com/the-paperless-project/paperless/issues/392 .. _#393: https://github.com/the-paperless-project/paperless/issues/393 .. _#395: https://github.com/the-paperless-project/paperless/pull/395 .. _#394: https://github.com/the-paperless-project/paperless/issues/394 .. _#396: https://github.com/the-paperless-project/paperless/pull/396 .. _#399: https://github.com/the-paperless-project/paperless/pull/399 .. _#400: https://github.com/the-paperless-project/paperless/pull/400 .. _#401: https://github.com/the-paperless-project/paperless/pull/401 .. _#405: https://github.com/the-paperless-project/paperless/pull/405 .. _#406: https://github.com/the-paperless-project/paperless/issues/406 .. _#412: https://github.com/the-paperless-project/paperless/issues/412 .. _#413: https://github.com/the-paperless-project/paperless/pull/413 .. _#414: https://github.com/the-paperless-project/paperless/issues/414 .. _#423: https://github.com/the-paperless-project/paperless/issues/423 .. _#433: https://github.com/the-paperless-project/paperless/issues/433 .. _#440: https://github.com/the-paperless-project/paperless/pull/440 .. _#441: https://github.com/the-paperless-project/paperless/pull/441 .. _#442: https://github.com/the-paperless-project/paperless/pull/442 .. _#466: https://github.com/the-paperless-project/paperless/pull/466 .. _#471: https://github.com/the-paperless-project/paperless/pull/471 .. _#475: https://github.com/the-paperless-project/paperless/pull/475 .. _#481: https://github.com/the-paperless-project/paperless/pull/481 .. _#483: https://github.com/the-paperless-project/paperless/pull/483 .. _#484: https://github.com/the-paperless-project/paperless/pull/484 .. _#488: https://github.com/the-paperless-project/paperless/pull/488 .. _#489: https://github.com/the-paperless-project/paperless/pull/489 .. _#492: https://github.com/the-paperless-project/paperless/pull/492 .. _pipenv: https://docs.pipenv.org/ .. _a new home on Docker Hub: https://hub.docker.com/r/danielquinn/paperless/ .. _optipng: http://optipng.sourceforge.net/ ================================================ FILE: docs/conf.py ================================================ # -*- coding: utf-8 -*- # # Paperless documentation build configuration file, created by # sphinx-quickstart on Mon Oct 26 18:36:52 2015. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys import os __version__ = None exec(open("../src/paperless/version.py").read()) # Believe it or not, this is the officially sanctioned way to add custom CSS. def setup(app): app.add_stylesheet("custom.css") # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. #sys.path.insert(0, os.path.abspath('.')) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'sphinx.ext.todo', 'sphinx.ext.imgmath', 'sphinx.ext.viewcode', ] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'Paperless' copyright = u'2015, Daniel Quinn' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # # If the build process ever explodes here, it's because you've set the version # number in paperless.version to a tuple with 3 numbers in it. # # The short X.Y version. version = ".".join([str(_) for _ in __version__[:2]]) # The full version, including alpha/beta/rc tags. release = ".".join([str(_) for _ in __version__[:3]]) # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build'] # The reST default role (used for this markup: `text`) to use for all # documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. #keep_warnings = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. #html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'paperless' # # Attempt to use the ReadTheDocs theme. If it's not installed, fallback to # the default. # try: import sphinx_rtd_theme html_theme = "sphinx_rtd_theme" html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] except ImportError: pass # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). #'pointsize': '10pt', # Additional stuff for the LaTeX preamble. #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ ('index', 'paperless.tex', u'Paperless Documentation', u'Daniel Quinn', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'paperless', u'Paperless Documentation', [u'Daniel Quinn'], 1) ] # If true, show URL addresses after external links. #man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ('index', 'Paperless', u'Paperless Documentation', u'Daniel Quinn', 'paperless', 'Scan, index, and archive all of your paper documents.', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. #texinfo_appendices = [] # If false, no module index is generated. #texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. #texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. #texinfo_no_detailmenu = False # -- Options for Epub output ---------------------------------------------- # Bibliographic Dublin Core info. epub_title = u'Paperless' epub_author = u'Daniel Quinn' epub_publisher = u'Daniel Quinn' epub_copyright = u'2015, Daniel Quinn' # The basename for the epub file. It defaults to the project name. #epub_basename = u'Paperless' # The HTML theme for the epub output. Since the default themes are not optimized # for small screen space, using the same theme for HTML and epub output is # usually not wise. This defaults to 'epub', a theme designed to save visual # space. #epub_theme = 'epub' # The language of the text. It defaults to the language option # or en if the language is not set. #epub_language = '' # The scheme of the identifier. Typical schemes are ISBN or URL. #epub_scheme = '' # The unique identifier of the text. This can be a ISBN number # or the project homepage. #epub_identifier = '' # A unique identification for the text. #epub_uid = '' # A tuple containing the cover image and cover page html template filenames. #epub_cover = () # A sequence of (type, uri, title) tuples for the guide element of content.opf. #epub_guide = () # HTML files that should be inserted before the pages created by sphinx. # The format is a list of tuples containing the path and title. #epub_pre_files = [] # HTML files shat should be inserted after the pages created by sphinx. # The format is a list of tuples containing the path and title. #epub_post_files = [] # A list of files that should not be packed into the epub file. epub_exclude_files = ['search.html'] # The depth of the table of contents in toc.ncx. #epub_tocdepth = 3 # Allow duplicate toc entries. #epub_tocdup = True # Choose between 'default' and 'includehidden'. #epub_tocscope = 'default' # Fix unsupported image types using the PIL. #epub_fix_images = False # Scale large images. #epub_max_image_width = 0 # How to display URL addresses: 'footnote', 'no', or 'inline'. #epub_show_urls = 'inline' # If false, no index is generated. #epub_use_index = True # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = {'http://docs.python.org/': None} ================================================ FILE: docs/consumption.rst ================================================ .. _consumption: Consumption ########### Once you've got Paperless setup, you need to start feeding documents into it. Currently, there are three options: the consumption directory, IMAP (email), and HTTP POST. .. _consumption-directory: The Consumption Directory ========================= The primary method of getting documents into your database is by putting them in the consumption directory. The ``document_consumer`` script runs in an infinite loop looking for new additions to this directory and when it finds them, it goes about the process of parsing them with the OCR, indexing what it finds, and encrypting the PDF (if ``PAPERLESS_PASSPHRASE`` is set), storing it in the media directory. Getting stuff into this directory is up to you. If you're running Paperless on your local computer, you might just want to drag and drop files there, but if you're running this on a server and want your scanner to automatically push files to this directory, you'll need to setup some sort of service to accept the files from the scanner. Typically, you're looking at an FTP server like `Proftpd`_ or `Samba`_. .. _Proftpd: http://www.proftpd.org/ .. _Samba: http://www.samba.org/ So where is this consumption directory? It's wherever you define it. Look for the ``CONSUMPTION_DIR`` value in ``settings.py``. Set that to somewhere appropriate for your use and put some documents in there. When you're ready, follow the :ref:`consumer ` instructions to get it running. .. _consumption-directory-hook: Hooking into the Consumption Process ------------------------------------ Sometimes you may want to do something arbitrary whenever a document is consumed. Rather than try to predict what you may want to do, Paperless lets you execute scripts of your own choosing just before or after a document is consumed using a couple simple hooks. Just write a script, put it somewhere that Paperless can read & execute, and then put the path to that script in ``paperless.conf`` with the variable name of either ``PAPERLESS_PRE_CONSUME_SCRIPT`` or ``PAPERLESS_POST_CONSUME_SCRIPT``. The script will be executed before or or after the document is consumed respectively. .. important:: These scripts are executed in a **blocking** process, which means that if a script takes a long time to run, it can significantly slow down your document consumption flow. If you want things to run asynchronously, you'll have to fork the process in your script and exit. .. _consumption-directory-hook-variables: What Can These Scripts Do? .......................... It's your script, so you're only limited by your imagination and the laws of physics. However, the following values are passed to the scripts in order: .. _consumption-director-hook-variables-pre: Pre-consumption script :::::::::::::::::::::: * Document file name A simple but common example for this would be creating a simple script like this: ``/usr/local/bin/ocr-pdf`` .. code:: bash #!/usr/bin/env bash pdf2pdfocr.py -i ${1} ``/etc/paperless.conf`` .. code:: bash ... PAPERLESS_PRE_CONSUME_SCRIPT="/usr/local/bin/ocr-pdf" ... This will pass the path to the document about to be consumed to ``/usr/local/bin/ocr-pdf``, which will in turn call `pdf2pdfocr.py`_ on your document, which will then overwrite the file with an OCR'd version of the file and exit. At which point, the consumption process will begin with the newly modified file. .. _pdf2pdfocr.py: https://github.com/LeoFCardoso/pdf2pdfocr .. _consumption-director-hook-variables-post: Post-consumption script ::::::::::::::::::::::: * Document id * Generated file name * Source path * Thumbnail path * Download URL * Thumbnail URL * Correspondent * Tags The script can be in any language you like, but for a simple shell script example, you can take a look at ``post-consumption-example.sh`` in the ``scripts`` directory in this project. .. _consumption-imap: IMAP (Email) ============ Another handy way to get documents into your database is to email them to yourself. The typical use-case would be to be out for lunch and want to send a copy of the receipt back to your system at home. Paperless can be taught to pull emails down from an arbitrary account and dump them into the consumption directory where the process :ref:`above ` will follow the usual pattern on consuming the document. Some things you need to know about this feature: * It's disabled by default. By setting the values below it will be enabled. * It's been tested in a limited environment, so it may not work for you (please submit a pull request if you can!) * It's designed to **delete mail from the server once consumed**. So don't go pointing this to your personal email account and wonder where all your stuff went. * Currently, only one photo (attachment) per email will work. So, with all that in mind, here's what you do to get it running: 1. Setup a new email account somewhere, or if you're feeling daring, create a folder in an existing email box and note the path to that folder. 2. In ``/etc/paperless.conf`` set all of the appropriate values in ``PATHS AND FOLDERS`` and ``SECURITY``. If you decided to use a subfolder of an existing account, then make sure you set ``PAPERLESS_CONSUME_MAIL_INBOX`` accordingly here. You also have to set the ``PAPERLESS_EMAIL_SECRET`` to something you can remember 'cause you'll have to include that in every email you send. 3. Restart the :ref:`consumer `. The consumer will check the configured email account at startup and from then on every 10 minutes for something new and pulls down whatever it finds. 4. Send yourself an email! Note that the subject is treated as the file name, so if you set the subject to ``Correspondent - Title - tag,tag,tag``, you'll get what you expect. Also, you must include the aforementioned secret string in every email so the fetcher knows that it's safe to import. Note that Paperless only allows the email title to consist of safe characters to be imported. These consist of alpha-numeric characters and ``-_ ,.'``. 5. After a few minutes, the consumer will poll your mailbox, pull down the message, and place the attachment in the consumption directory with the appropriate name. A few minutes later, the consumer will import it like any other file. .. _consumption-http: HTTP POST ========= You can also submit a document via HTTP POST, so long as you do so after authenticating. To push your document to Paperless, send an HTTP POST to the server with the following name/value pairs: * ``correspondent``: The name of the document's correspondent. Note that there are restrictions on what characters you can use here. Specifically, alphanumeric characters, `-`, `,`, `.`, and `'` are ok, everything else is out. You also can't use the sequence ` - ` (space, dash, space). * ``title``: The title of the document. The rules for characters is the same here as the correspondent. * ``document``: The file you're uploading Specify ``enctype="multipart/form-data"``, and then POST your file with:: Content-Disposition: form-data; name="document"; filename="whatever.pdf" An example of this in HTML is a typical form: .. code:: html
But a potentially more useful way to do this would be in Python. Here we use the requests library to handle basic authentication and to send the POST data to the URL. .. code:: python import os from hashlib import sha256 import requests from requests.auth import HTTPBasicAuth # You authenticate via BasicAuth or with a session id. # We use BasicAuth here username = "my-username" password = "my-super-secret-password" # Where you have Paperless installed and listening url = "http://localhost:8000/push" # Document metadata correspondent = "Test Correspondent" title = "Test Title" # The local file you want to push path = "/path/to/some/directory/my-document.pdf" with open(path, "rb") as f: response = requests.post( url=url, data={"title": title, "correspondent": correspondent}, files={"document": (os.path.basename(path), f, "application/pdf")}, auth=HTTPBasicAuth(username, password), allow_redirects=False ) if response.status_code == 202: # Everything worked out ok print("Upload successful") else: # If you don't get a 202, it's probably because your credentials # are wrong or something. This will give you a rough idea of what # happened. print("We got HTTP status code: {}".format(response.status_code)) for k, v in response.headers.items(): print("{}: {}".format(k, v)) ================================================ FILE: docs/contributing.rst ================================================ .. _contributing: Contributing to Paperless ######################### Maybe you've been using Paperless for a while and want to add a feature or two, or maybe you've come across a bug that you have some ideas how to solve. The beauty of Free software is that you can see what's wrong and help to get it fixed for everyone! How to Get Your Changes Rolled Into Paperless ============================================= If you've found a bug, but don't know how to fix it, you can always post an issue on `GitHub`_ in the hopes that someone will have the time to fix it for you. If however you're the one with the time, pull requests are always welcome, you just have to make sure that your code conforms to a few standards: Pep8 ---- It's the standard for all Python development, so it's `very well documented`_. The short version is: * Lines should wrap at 79 characters * Use ``snake_case`` for variables, ``CamelCase`` for classes, and ``ALL_CAPS`` for constants. * Space out your operators: ``stuff + 7`` instead of ``stuff+7`` * Two empty lines between classes, and functions, but 1 empty line between class methods. There's more to it than that, but if you follow those, you'll probably be alright. When you submit your pull request, there's a pep8 checker that'll look at your code to see if anything is off. If it finds anything, it'll complain at you until you fix it. Additional Style Guides ----------------------- Where pep8 is ambiguous, I've tried to be a little more specific. These rules aren't hard-and-fast, but if you can conform to them, I'll appreciate it and spend less time trying to conform your PR before merging: Function calls .............. If you're calling a function and that necessitates more than one line of code, please format it like this: .. code:: python my_function( argument1, kwarg1="x", kwarg2="y" another_really_long_kwarg="some big value" a_kwarg_calling_another_long_function=another_function( another_arg, another_kwarg="kwarg!" ) ) This is all in the interest of code uniformity rather than anything else. If we stick to a style, everything is understandable in the same way. Quoting Strings ............... pep8 is a little too open-minded on this for my liking. Python strings should be quoted with double quotes (``"``) except in cases where the resulting string would require too much escaping of a double quote, in which case, a single quoted, or triple-quoted string will do: .. code:: python my_string = "This is my string" problematic_string = 'This is a "string" with "quotes" in it' In HTML templates, please use double-quotes for tag attributes, and single quotes for arguments passed to Django tempalte tags: .. code:: html This is to keep linters happy they look at an HTML file and see an attribute closing the ``"`` before it should have been. -- That's all there is in terms of guidelines, so I hope it's not too daunting. Indentation & Spacing ..................... When it comes to indentation: * For Python, the rule is: follow pep8 and use 4 spaces. * For Javascript, CSS, and HTML, please use 1 tab. Additionally, Django templates making use of block elements like ``{% if %}``, ``{% for %}``, and ``{% block %}`` etc. should be indented: Good: .. code:: html {% block stuff %}

This is the stuff

{% endblock %} Bad: .. code:: html {% block stuff %}

This is the stuff

{% endblock %} The Code of Conduct =================== Paperless has a `code of conduct`_. It's a lot like the other ones you see out there, with a few small changes, but basically it boils down to: > Don't be an ass, or you might get banned. I'm proud to say that the CoC has never had to be enforced because everyone has been awesome, friendly, and professional. .. _GitHub: https://github.com/the-paperless-project/paperless/issues .. _very well documented: https://www.python.org/dev/peps/pep-0008/ .. _code of conduct: https://github.com/the-paperless-project/paperless/blob/master/CODE_OF_CONDUCT.md ================================================ FILE: docs/customising.rst ================================================ .. _customising: Customising Paperless ##################### Currently, the Paperless' interface is just the default Django admin, which while powerful, is rather boring. If you'd like to give the site a bit of a face-lift, or if you simply want to adjust the colours, contrast, or font size to make things easier to read, you can do that by adding your own CSS or Javascript quite easily. .. _customising-overrides: Overrides ========= On every page load, Paperless looks for two files in your media root directory (the directory defined by your ``PAPERLESS_MEDIADIR`` configuration variable or the default, ``/media/``) for two files: * ``overrides.css`` * ``overrides.js`` If it finds either or both of those files, they'll be loaded into the page: the CSS in the ````, and the Javascript stuffed into the last line of the ````. .. _customising-overrides-note: An important note about customisation ------------------------------------- Any changes you make to the site with your CSS or Javascript are likely to depend on the structure of the current HTML and/or the existing CSS rules. For the most part it's safe to assume that these bits won't change, but *sometimes they do* as features are added or bugs are fixed. If you make a change that you think others would appreciate though, submit it as a pull request and maybe we can find a way to work it into the project by default! ================================================ FILE: docs/examples/lxc/lxc-install.sh ================================================ #!/usr/bin/env bash # Bash script to install paperless in lxc containter # paperless.lan # # Will set-up paperless, apache2 and proftpd # # lxc launch ubuntu: paperless # lxc exec paperless -- sh -c "sudo apt-get update && sudo apt-get install -y wget" # lxc exec paperless -- sh -c "wget https://raw.githubusercontent.com/the-paperless-project/paperless/master/docs/examples/lxc/lxc-install.sh && /bin/bash lxc-install.sh --email " # # set +e PASSWORD=$(< /dev/urandom tr -dc _A-Z-a-z-0-9+@%^{} | head -c20;echo;) EMAIL= function displayHelp() { echo "available parameters: -e | --email -p | --password " } POSITIONAL=() while [[ $# -gt 0 ]] do key="$1" i=$key case $i in -e|--email) EMAIL="${2}" shift shift ;; -p|--password) PASSWORD="${2}" shift shift ;; --default|-h|--help) shift displayHelp exit 0 ;; *) echo "argument: $i not recognized" exit 2 ;; esac done set -- "${POSITIONAL[@]}" # restore positional parameters if [ -z $EMAIL ]; then echo "missing email, try running with -h " exit 3 fi if [[ $(/usr/bin/id -u) -ne 0 ]]; then echo "Not running as root" exit fi if [ $(grep -c paperless /etc/passwd) -eq 0 ]; then # Add paperless user with no password adduser --disabled-password --gecos "" paperless fi if [ $(grep -c ftpupload /etc/passwd) -eq 0 ]; then # Add ftpupload adduser --disabled-password --gecos "" ftpupload echo "Set ftpupload password: " #passwd ftpupload #TODO: generate some password and allow parameter echo "ftpupload:ftpuploadpassword" | chpasswd fi if [ $(id -nG paperless | grep -Fcw ftpupload) -eq 0 ]; then # Allow paperless group to access adduser paperless ftpupload chmod g+w /home/ftpupload fi # Get apt up to date apt-get update # Needed for plain Paperless apt-get -y install unpaper gnupg libpoppler-cpp-dev python3-pyocr tesseract-ocr imagemagick optipng git # Needed for Apache apt-get -y install apache2 libapache2-mod-wsgi-py3 if [ ! -f /etc/proftpd/proftpd.conf ]; then # Install ftp server and make sure all uplaoded files are owned by paperless apt-get -y install proftpd fi if [ $(grep -c paperless /etc/proftpd/proftpd.conf) -eq 0 ]; then cat <> /etc/proftpd/proftpd.conf UserOwner paperless GroupOwner paperless EOF systemctl restart proftpd fi #Get Paperless from git su -c "cd /home/paperless ; git clone https://github.com/the-paperless-project/paperless" paperless # Install Pip Requirements apt-get -y install python3-pip python3-venv libpq-dev cd /home/paperless/paperless pip3 install -r requirements.txt # Take paperless.conf.example and set consumuption dir (ftp dir) sed -e '/PAPERLESS_CONSUMPTION_DIR=/s/=.*/=\"\/home\/ftpupload\/\"/' \ /home/paperless/paperless/paperless.conf.example >/etc/paperless.conf # Update /etc/paperless.conf with PAPERLESS_SECRET_KEY SECRET=$(strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 30 | tr -d '\n'; echo) sed -i "s/#PAPERLESS_SECRET_KEY.*/PAPERLESS_SECRET_KEY=$SECRET/" /etc/paperless.conf #Initialise the SQLite database su -c "cd /home/paperless/paperless/src/ ; ./manage.py migrate" paperless echo "if superuser doesn't exists, create one with login: paperless and password: ${PASSWORD}" #Create a user for your Paperless instance su -c "cd /home/paperless/paperless/src/ ; echo ./manage.py create_superuser_with_password --username paperless --email ${EMAIL} --password ${PASSWORD} --preserve" paperless su -c "cd /home/paperless/paperless/src/ ; ./manage.py create_superuser_with_password --username paperless --email ${EMAIL} --password ${PASSWORD} --preserve" paperless if [ ! -d /home/paperless/paperless/static ]; then # 167 static files copied to '/home/paperless/paperless/static'. su -c "cd /home/paperless/paperless/src/ ; ./manage.py collectstatic" paperless fi if [ ! -f /etc/apache2/sites-available/paperless.conf ]; then # Set-up apache cp /home/paperless/paperless/docs/examples/lxc/paperless.conf /etc/apache2/sites-available/ a2dissite 000-default.conf a2ensite paperless.conf systemctl reload apache2 fi sed -e "s:home/paperless/project/virtualenv/bin/python:usr/bin/python3:" \ /home/paperless/paperless/scripts/paperless-consumer.service \ >/etc/systemd/system/paperless-consumer.service sed -i "s:/home/paperless/project/src/manage.py:/home/paperless/paperless/src/manage.py:" \ /etc/systemd/system/paperless-consumer.service systemctl enable paperless-consumer systemctl start paperless-consumer # convert-im6.q16: not authorized # Security risk ? # https://stackoverflow.com/questions/42928765/convertnot-authorized-aaaa-error-constitute-c-readimage-453 if [ -f /etc/ImageMagick-6/policy.xml ]; then mv /etc/ImageMagick-6/policy.xml /etc/ImageMagick-6/policy.xmlout fi ================================================ FILE: docs/examples/lxc/paperless.conf ================================================ ServerName paperless.lan Alias /static/ /home/paperless/paperless/static/ Require all granted WSGIScriptAlias / /home/paperless/paperless/src/paperless/wsgi.py WSGIDaemonProcess paperless.lan user=paperless group=paperless threads=5 python-path=/home/paperless/paperless/src WSGIProcessGroup paperless.lan Require all granted ================================================ FILE: docs/extending.rst ================================================ .. _extending: Extending Paperless =================== For the most part, Paperless is monolithic, so extending it is often best managed by way of modifying the code directly and issuing a pull request on `GitHub`_. However, over time the project has been evolving to be a little more "pluggable" so that users can write their own stuff that talks to it. .. _GitHub: https://github.com/the-paperless-project/paperless .. _extending-parsers: Parsers ------- You can leverage Paperless' consumption model to have it consume files *other* than ones handled by default like ``.pdf``, ``.jpg``, and ``.tiff``. To do so, you simply follow Django's convention of creating a new app, with a few key requirements. .. _extending-parsers-parserspy: parsers.py .......... In this file, you create a class that extends ``documents.parsers.DocumentParser`` and go about implementing the three required methods: * ``get_thumbnail()``: Returns the path to a file we can use as a thumbnail for this document. * ``get_text()``: Returns the text from the document and only the text. * ``get_date()``: If possible, this returns the date of the document, otherwise it should return ``None``. .. _extending-parsers-signalspy: signals.py .......... At consumption time, Paperless emits a ``document_consumer_declaration`` signal which your module has to react to in order to let the consumer know whether or not it's capable of handling a particular file. Think of it like this: 1. Consumer finds a file in the consumption directory. 2. It asks all the available parsers: *"Hey, can you handle this file?"* 3. Each parser responds with either ``None`` meaning they can't handle the file, or a dictionary in the following format: .. code:: python { "parser": , "weight": } The consumer compares the ``weight`` values from all respondents and uses the class with the highest value to consume the document. The default parser, ``RasterisedDocumentParser`` has a weight of ``0``. .. _extending-parsers-appspy: apps.py ....... This is a standard Django file, but you'll need to add some code to it to connect your parser to the ``document_consumer_declaration`` signal. .. _extending-parsers-finally: Finally ....... The last step is to update ``settings.py`` to include your new module. Eventually, this will be dynamic, but at the moment, you have to edit the ``INSTALLED_APPS`` section manually. Simply add the path to your AppConfig to the list like this: .. code:: python INSTALLED_APPS = [ ... "my_module.apps.MyModuleConfig", ... ] Order doesn't matter, but generally it's a good idea to place your module lower in the list so that you don't end up accidentally overriding project defaults somewhere. .. _extending-parsers-example: An Example .......... The core Paperless functionality is based on this design, so if you want to see what a parser module should look like, have a look at `parsers.py`_, `signals.py`_, and `apps.py`_ in the `paperless_tesseract`_ module. .. _parsers.py: https://github.com/the-paperless-project/paperless/blob/master/src/paperless_tesseract/parsers.py .. _signals.py: https://github.com/the-paperless-project/paperless/blob/master/src/paperless_tesseract/signals.py .. _apps.py: https://github.com/the-paperless-project/paperless/blob/master/src/paperless_tesseract/apps.py .. _paperless_tesseract: https://github.com/the-paperless-project/paperless/blob/master/src/paperless_tesseract/ ================================================ FILE: docs/guesswork.rst ================================================ .. _guesswork: Guesswork ######### During the consumption process, Paperless tries to guess some of the attributes of the document it's looking at. To do this it uses two approaches: .. _guesswork-naming: File Naming =========== Any document you put into the consumption directory will be consumed, but if you name the file right, it'll automatically set some values in the database for you. This is is the logic the consumer follows: 1. Try to find the correspondent, title, and tags in the file name following the pattern: ``Date - Correspondent - Title - tag,tag,tag.pdf``. Note that the format of the date is **rigidly defined** as ``YYYYMMDDHHMMSSZ`` or ``YYYYMMDDZ``. The ``Z`` refers "Zulu time" AKA "UTC". The tags are optional, so the format ``Date - Correspondent - Title.pdf`` works as well. 2. If that doesn't work, we skip the date and try this pattern: ``Correspondent - Title - tag,tag,tag.pdf``. 3. If that doesn't work, we try to find the correspondent and title in the file name following the pattern: ``Correspondent - Title.pdf``. 4. If that doesn't work, just assume that the name of the file is the title. So given the above, the following examples would work as you'd expect: * ``20150314000700Z - Some Company Name - Invoice 2016-01-01 - money,invoices.pdf`` * ``20150314Z - Some Company Name - Invoice 2016-01-01 - money,invoices.pdf`` * ``Some Company Name - Invoice 2016-01-01 - money,invoices.pdf`` * ``Another Company - Letter of Reference.jpg`` * ``Dad's Recipe for Pancakes.png`` These however wouldn't work: * ``2015-03-14 00:07:00 UTC - Some Company Name, Invoice 2016-01-01, money, invoices.pdf`` * ``2015-03-14 - Some Company Name, Invoice 2016-01-01, money, invoices.pdf`` * ``Some Company Name, Invoice 2016-01-01, money, invoices.pdf`` * ``Another Company- Letter of Reference.jpg`` Do I have to be so strict about naming? --------------------------------------- Rather than using the strict document naming rules, one can also set the option ``PAPERLESS_FILENAME_DATE_ORDER`` in ``paperless.conf`` to any date order that is accepted by dateparser_. Doing so will cause ``paperless`` to default to any date format that is found in the title, instead of a date pulled from the document's text, without requiring the strict formatting of the document filename as described above. .. _dateparser: https://github.com/scrapinghub/dateparser/blob/v0.7.0/docs/usage.rst#settings Transforming filenames for parsing ---------------------------------- Some devices can't produce filenames that can be parsed by the default parser. By configuring the option ``PAPERLESS_FILENAME_PARSE_TRANSFORMS`` in ``paperless.conf`` one can add transformations that are applied to the filename before it's parsed. The option contains a list of dictionaries of regular expressions (key: ``pattern``) and replacements (key: ``repl``) in JSON format, which are applied in order by passing them to ``re.subn``. Transformation stops after the first match, so at most one transformation is applied. The general syntax is .. code:: python [{"pattern":"pattern1", "repl":"repl1"}, {"pattern":"pattern2", "repl":"repl2"}, ..., {"pattern":"patternN", "repl":"replN"}] The example below is for a Brother ADS-2400N, a scanner that allows different names to different hardware buttons (useful for handling multiple entities in one instance), but insists on adding ``_`` to the filename. .. code:: python # Brother profile configuration, support "Name_Date_Count" (the default # setting) and "Name_Count" (use "Name" as tag and "Count" as title). PAPERLESS_FILENAME_PARSE_TRANSFORMS=[{"pattern":"^([a-z]+)_(\\d{8})_(\\d{6})_([0-9]+)\\.", "repl":"\\2\\3Z - \\4 - \\1."}, {"pattern":"^([a-z]+)_([0-9]+)\\.", "repl":" - \\2 - \\1."}] .. _guesswork-content: Reading the Document Contents ============================= After the consumer has tried to figure out what it could from the file name, it starts looking at the content of the document itself. It will compare the matching algorithms defined by every tag and correspondent already set in your database to see if they apply to the text in that document. In other words, if you defined a tag called ``Home Utility`` that had a ``match`` property of ``bc hydro`` and a ``matching_algorithm`` of ``literal``, Paperless will automatically tag your newly-consumed document with your ``Home Utility`` tag so long as the text ``bc hydro`` appears in the body of the document somewhere. The matching logic is quite powerful, and supports searching the text of your document with different algorithms, and as such, some experimentation may be necessary to get things Just Right. .. _guesswork-content-howto: How Do I Set Up These Matching Algorithms? ------------------------------------------ Setting up of the algorithms is easily done through the admin interface. When you create a new correspondent or tag, there are optional fields for matching text and matching algorithm. From the help info there: .. note:: Which algorithm you want to use when matching text to the OCR'd PDF. Here, "any" looks for any occurrence of any word provided in the PDF, while "all" requires that every word provided appear in the PDF, albeit not in the order provided. A "literal" match means that the text you enter must appear in the PDF exactly as you've entered it, and "regular expression" uses a regex to match the PDF. If you don't know what a regex is, you probably don't want this option. When using the "any" or "all" matching algorithms, you can search for terms that consist of multiple words by enclosing them in double quotes. For example, defining a match text of ``"Bank of America" BofA`` using the "any" algorithm, will match documents that contain either "Bank of America" or "BofA", but will not match documents containing "Bank of South America". Then just save your tag/correspondent and run another document through the consumer. Once complete, you should see the newly-created document, automatically tagged with the appropriate data. ================================================ FILE: docs/index.rst ================================================ .. _index: Paperless ========= Paperless is a simple Django application running in two parts: a :ref:`consumer ` (the thing that does the indexing) and the :ref:`webserver ` (the part that lets you search & download already-indexed documents). If you want to learn more about its functions keep on reading after the installation section. .. _index-why-this-exists: Why This Exists =============== Paper is a nightmare. Environmental issues aside, there's no excuse for it in the 21st century. It takes up space, collects dust, doesn't support any form of a search feature, indexing is tedious, it's heavy and prone to damage & loss. I wrote this to make "going paperless" easier. I do not have to worry about finding stuff again. I feed documents right from the post box into the scanner and then shred them. Perhaps you might find it useful too. Contents ======== .. toctree:: :maxdepth: 2 requirements setup consumption api utilities guesswork migrating customising extending troubleshooting contributing scanners screenshots changelog ================================================ FILE: docs/migrating.rst ================================================ .. _migrating: Migrating, Updates, and Backups =============================== As Paperless is still under active development, there's a lot that can change as software updates roll out. You should backup often, so if anything goes wrong during an update, you at least have a means of restoring to something usable. Thankfully, there are automated ways of backing up, restoring, and updating the software. .. _migrating-backup: Backing Up ---------- So you're bored of this whole project, or you want to make a remote backup of your files for whatever reason. This is easy to do, simply use the :ref:`exporter ` to dump your documents and database out into an arbitrary directory. .. _migrating-restoring: Restoring --------- Restoring your data is just as easy, since nearly all of your data exists either in the file names, or in the contents of the files themselves. You just need to create an empty database (just follow the :ref:`installation instructions ` again) and then import the ``tags.json`` file you created as part of your backup. Lastly, copy your exported documents into the consumption directory and start up the consumer. .. code-block:: shell-session $ cd /path/to/project $ rm data/db.sqlite3 # Delete the database $ cd src $ ./manage.py migrate # Create the database $ ./manage.py createsuperuser $ ./manage.py loaddata /path/to/arbitrary/place/tags.json $ cp /path/to/exported/docs/* /path/to/consumption/dir/ $ ./manage.py document_consumer Importing your data if you are :ref:`using Docker ` is almost as simple: .. code-block:: shell-session # Stop and remove your current containers $ docker-compose stop $ docker-compose rm -f # Recreate them, add the superuser $ docker-compose up -d $ docker-compose run --rm webserver createsuperuser # Load the tags $ cat /path/to/arbitrary/place/tags.json | docker-compose run --rm webserver loaddata_stdin - # Load your exported documents into the consumption directory # (How you do this highly depends on how you have set this up) $ cp /path/to/exported/docs/* /path/to/mounted/consumption/dir/ After loading the documents into the consumption directory the consumer will immediately start consuming the documents. .. _migrating-updates: Updates ------- For the most part, all you have to do to update Paperless is run ``git pull`` on the directory containing the project files, and then use Django's ``migrate`` command to execute any database schema updates that might have been rolled in as part of the update: .. code-block:: shell-session $ cd /path/to/project $ git pull $ pip install -r requirements.txt $ cd src $ ./manage.py migrate Note that it's possible (even likely) that while ``git pull`` may update some files, the ``migrate`` step may not update anything. This is totally normal. Additionally, as new features are added, the ability to control those features is typically added by way of an environment variable set in ``paperless.conf``. You may want to take a look at the ``paperless.conf.example`` file to see if there's anything new in there compared to what you've got in ``/etc``. If you are :ref:`using Docker ` the update process is similar: .. code-block:: shell-session $ cd /path/to/project $ git pull $ docker build -t paperless . $ docker-compose run --rm consumer migrate $ docker-compose up -d If ``git pull`` doesn't report any changes, there is no need to continue with the remaining steps. ================================================ FILE: docs/requirements.rst ================================================ .. _requirements: Requirements ============ You need a Linux machine or Unix-like setup (theoretically an Apple machine should work) that has the following software installed: * `Python3`_ (with development libraries, pip and virtualenv) * `GNU Privacy Guard`_ * `Tesseract`_, plus its language files matching your document base. * `Imagemagick`_ version 6.7.5 or higher * `unpaper`_ * `libpoppler-cpp-dev`_ PDF rendering library * `optipng`_ .. _Python3: https://python.org/ .. _GNU Privacy Guard: https://gnupg.org .. _Tesseract: https://github.com/tesseract-ocr .. _Imagemagick: http://imagemagick.org/ .. _unpaper: https://github.com/unpaper/unpaper .. _libpoppler-cpp-dev: https://poppler.freedesktop.org/ .. _optipng: http://optipng.sourceforge.net/ Notably, you should confirm how you access your Python3 installation. Many Linux distributions will install Python3 in parallel to Python2, using the names ``python3`` and ``python`` respectively. The same goes for ``pip3`` and ``pip``. Running Paperless with Python2 will likely break things, so make sure that you're using the right version. For the purposes of simplicity, ``python`` and ``pip`` is used everywhere to refer to their Python3 versions. In addition to the above, there are a number of Python requirements, all of which are listed in a file called ``requirements.txt`` in the project root directory. If you're not working on a virtual environment (like Docker), you should probably be using a virtualenv, but that's your call. The reasons why you might choose a virtualenv or not aren't really within the scope of this document. Needless to say if you don't know what a virtualenv is, you should probably figure that out before continuing. .. _requirements-apple: Problems with Imagemagick & PDFs -------------------------------- Some users have `run into problems`_ with getting ImageMagick to do its thing with PDFs. Often this is the case with Apple systems using HomeBrew, but other Linuxes have been a problem as well. The solution appears to be to install ghostscript as well as ImageMagick: .. _run into problems: https://github.com/the-paperless-project/paperless/issues/25 .. code:: bash $ brew install ghostscript $ brew install imagemagick $ brew install libmagic .. _requirements-baremetal: Python-specific Requirements: No Virtualenv ------------------------------------------- If you don't care to use a virtual env, then installation of the Python dependencies is easy: .. code:: bash $ pip install --user --requirement /path/to/paperless/requirements.txt This will download and install all of the requirements into ``${HOME}/.local``. Remember that your distribution may be using ``pip3`` as mentioned above. .. _requirements-virtualenv: Python-specific Requirements: Virtualenv ---------------------------------------- Using a virtualenv for this is pretty straightforward: create a virtualenv, enter it, and install the requirements using the ``requirements.txt`` file: .. code:: bash $ virtualenv --python=/path/to/python3 /path/to/arbitrary/directory $ . /path/to/arbitrary/directory/bin/activate $ pip install --requirement /path/to/paperless/requirements.txt Now you're ready to go. Just remember to enter (activate) your virtualenv whenever you want to use Paperless. .. _requirements-documentation: Documentation ------------- As generation of the documentation is not required for the use of Paperless, dependencies for this process are not included in ``requirements.txt``. If you'd like to generate your own docs locally, you'll need to: .. code:: bash $ pip install sphinx and then cd into the ``docs`` directory and type ``make html``. If you are using Docker, you can use the following commands to build the documentation and run a webserver serving it on `port 8001`_: .. code:: bash $ pwd /path/to/paperless $ docker build -t paperless:docs -f docs/Dockerfile . $ docker run --rm -it -p "8001:8000" paperless:docs .. _port 8001: http://127.0.0.1:8001 ================================================ FILE: docs/requirements.txt ================================================ ================================================ FILE: docs/scanners.rst ================================================ .. _scanners: Scanner Recommendations ======================= As Paperless operates by watching a folder for new files, doesn't care what scanner you use, but sometimes finding a scanner that will write to an FTP, NFS, or SMB server can be difficult. This page is here to help you find one that works right for you based on recommentations from other Paperless users. Physical scanners ----------------- +---------+----------------+-----+-----+-----+----------------+ | Brand | Model | Supports | Recommended By | +---------+----------------+-----+-----+-----+----------------+ | | | FTP | NFS | SMB | | +=========+================+=====+=====+=====+================+ | Brother | `ADS-1500W`_ | yes | no | yes | `danielquinn`_ | +---------+----------------+-----+-----+-----+----------------+ | Brother | `MFC-J6930DW`_ | yes | | | `ayounggun`_ | +---------+----------------+-----+-----+-----+----------------+ | Brother | `MFC-J5910DW`_ | yes | | | `bmsleight`_ | +---------+----------------+-----+-----+-----+----------------+ | Brother | `MFC-9142CDN`_ | yes | | yes | `REOLDEV`_ | +---------+----------------+-----+-----+-----+----------------+ | Fujitsu | `ix500`_ | yes | | yes | `eonist`_ | +---------+----------------+-----+-----+-----+----------------+ .. _ADS-1500W: https://www.brother.ca/en/p/ads1500w .. _MFC-J6930DW: https://www.brother.ca/en/p/MFCJ6930DW .. _MFC-J5910DW: https://www.brother.co.uk/printers/inkjet-printers/mfcj5910dw .. _MFC-9142CDN: https://www.brother.co.uk/printers/laser-printers/mfc9140cdn .. _ix500: http://www.fujitsu.com/us/products/computing/peripheral/scanners/scansnap/ix500/ .. _danielquinn: https://github.com/danielquinn .. _ayounggun: https://github.com/ayounggun .. _bmsleight: https://github.com/bmsleight .. _eonist: https://github.com/eonist .. _REOLDEV: https://github.com/REOLDEV Mobile phone software ----------------------- You can use your phone to "scan" documents. The regular camera app will work, but may have too low contrast for OCR to work well. Apps specifically for scanning are recommended. +-------------------+----------------+-----+-----+-----+-------+--------+----------------+ | Name | OS | Supports | Recommended By | +-------------------+----------------+-----+-----+-----+-------+--------+----------------+ | | | FTP | NFS | SMB | Email | WebDav | | +===================+================+=====+=====+=====+=======+========+================+ | `Genius Scan`_ | Android | yes | no | yes | yes | yes | `hannahswain`_ | +-------------------+----------------+-----+-----+-----+-------+--------+----------------+ .. _Genius Scan: https://play.google.com/store/apps/details?id=com.thegrizzlylabs.geniusscan.free .. _hannahswain: https://github.com/hannahswain ================================================ FILE: docs/screenshots.rst ================================================ .. _screenshots: Screenshots =========== Once everything is set-up login to paperless using the web front-end .. image:: ./_static/Screenshot_first_run_login.png Nice clean interface .. image:: ./_static/Screenshot_first_logged.png Some documents loaded in via ftp or using the scanners ftp. .. image:: ./_static/Screenshot_upload_and_scanned.png ================================================ FILE: docs/setup.rst ================================================ .. _setup: Setup ===== Paperless isn't a very complicated app, but there are a few components, so some basic documentation is in order. If you follow along in this document and still have trouble, please open an `issue on GitHub`_ so I can fill in the gaps. .. _issue on GitHub: https://github.com/the-paperless-project/paperless/issues .. _setup-download: Download -------- The source is currently only available via GitHub, so grab it from there, either by using ``git``: .. code:: bash $ git clone https://github.com/the-paperless-project/paperless.git $ cd paperless or just download the tarball and go that route: .. code:: bash $ cd to the directory where you want to run Paperless $ wget https://github.com/the-paperless-project/paperless/archive/master.zip $ unzip master.zip $ cd paperless-master .. _setup-installation: Installation & Configuration ---------------------------- You can go multiple routes with setting up and running Paperless: * The `bare metal route`_ * The `docker route`_ * A suggested `linux containers route`_ The `docker route`_ is quick & easy. The `bare metal route`_ is a bit more complicated to setup but makes it easier should you want to contribute some code back. The `linux containers route`_ is quick, but makes alot of assumptions on the set-up, on the other hand the script could be used to install on a base debian or ubuntu server. .. _docker route: setup-installation-docker_ .. _bare metal route: setup-installation-bare-metal_ .. _Docker Machine: https://docs.docker.com/machine/ .. _linux containers route: setup-installation-linux-containers_ .. _setup-installation-bare-metal: Standard (Bare Metal) +++++++++++++++++++++ 1. Install the requirements as per the :ref:`requirements ` page. 2. Within the extract of master.zip go to the ``src`` directory. 3. Copy ``../paperless.conf.example`` to ``/etc/paperless.conf`` and open it in your favourite editor. As this file contains passwords. It should only be readable by user root and paperless! Set the values for: Set the values for: * ``PAPERLESS_CONSUMPTION_DIR``: this is where your documents will be dumped to be consumed by Paperless. * ``PAPERLESS_OCR_THREADS``: this is the number of threads the OCR process will spawn to process document pages in parallel. * ``PAPERLESS_PASSPHRASE``: this is only required if you want to use GPG to encrypt your document files. This is the passphrase Paperless uses to encrypt/decrypt the original documents. Don't worry about defining this if you don't want to use encryption (the default). Note also that if you're using the ``runserver`` as mentioned below, you should make sure that PAPERLESS_DEBUG="true" or is just commented out as this is the default. 4. Initialise the SQLite database with ``./manage.py migrate``. 5. Collect the static files for the webserver with ``./manage.py collectstatic``. 6. Create a user for your Paperless instance with ``./manage.py createsuperuser``. Follow the prompts to create your user. 7. Start the webserver with ``./manage.py runserver :``. If no specific IP or port is given, the default is ``127.0.0.1:8000`` also known as http://localhost:8000/. You should now be able to visit your (empty) installation at `Paperless webserver`_ or whatever you chose before. You can login with the user/pass you created in #5. 8. In a separate window, change to the ``src`` directory in this repo again, but this time, you should start the consumer script with ``./manage.py document_consumer``. 9. Scan something or put a file into the ``CONSUMPTION_DIR``. 10. Wait a few minutes 11. Visit the document list on your webserver, and it should be there, indexed and downloadable. .. caution:: This installation is not secure. Once everything is working head over to `Making things more permanent`_ .. _Paperless webserver: http://127.0.0.1:8000 .. _Making things more permanent: setup-permanent_ .. _setup-installation-docker: Docker Method +++++++++++++ 1. Install `Docker`_. .. caution:: As mentioned earlier, this guide assumes that you use Docker natively under Linux. If you are using `Docker Machine`_ under Mac OS X or Windows, you will have to adapt IP addresses, volume-mounting, command execution and maybe more. 2. Install `docker-compose`_. [#compose]_ .. caution:: If you want to use the included ``docker-compose.yml.example`` file, you need to have at least Docker version **1.12.0** and docker-compose version **1.9.0**. See the `Docker installation guide`_ on how to install the current version of Docker for your operating system or Linux distribution of choice. To get an up-to-date version of docker-compose, follow the `docker-compose installation guide`_ if your package repository doesn't include it. .. _Docker installation guide: https://docs.docker.com/engine/installation/ .. _docker-compose installation guide: https://docs.docker.com/compose/install/ 3. Create a copy of ``docker-compose.yml.example`` as ``docker-compose.yml`` and a copy of ``docker-compose.env.example`` as ``docker-compose.env``. You'll be editing both these files: taking a copy ensures that you can ``git pull`` to receive updates without risking merge conflicts with your modified versions of the configuration files. 4. Modify ``docker-compose.yml`` to your preferences, following the instructions in comments in the file. The only change that is a hard requirement is to specify where the consumption directory should mount.[#dockercomposeyml]_ .. caution:: If you are using NFS mounts for the consume directory you also need to change the command to turn off inotify as it doesn't work with NFS ``command: ["document_consumer", "--no-inotify"]`` 5. Modify ``docker-compose.env`` and adapt the following environment variables: ``PAPERLESS_PASSPHRASE`` This is the passphrase Paperless uses to encrypt/decrypt the original document. If you aren't planning on using GPG encryption, you can just leave this undefined. ``PAPERLESS_OCR_THREADS`` This is the number of threads the OCR process will spawn to process document pages in parallel. If the variable is not set, Python determines the core-count of your CPU and uses that value. ``PAPERLESS_OCR_LANGUAGES`` If you want the OCR to recognize other languages in addition to the default English, set this parameter to a space separated list of three-letter language-codes after `ISO 639-2/T`_. For a list of available languages -- including their three letter codes -- see the `Alpine packagelist`_. ``USERMAP_UID`` and ``USERMAP_GID`` If you want to mount the consumption volume (directory ``/consume`` within the containers) to a host-directory -- which you probably want to do -- access rights might be an issue. The default user and group ``paperless`` in the containers have an id of 1000. The containers will enforce that the owning group of the consumption directory will be ``paperless`` to be able to delete consumed documents. If your host-system has a group with an ID of 1000 and you don't want this group to have access rights to the consumption directory, you can use ``USERMAP_GID`` to change the id in the container and thus the one of the consumption directory. Furthermore, you can change the id of the default user as well using ``USERMAP_UID``. ``PAPERLESS_USE_SSL`` If you want Paperless to use SSL for the user interface, set this variable to ``true``. You also need to copy your certificate and key to the ``data`` directory, named ``ssl.cert`` and ``ssl.key``. This is not an ideal solution and, if possible, a reverse proxy with nginx is preferred. 6. Run ``docker-compose up -d``. This will create and start the necessary containers. 7. To be able to login, you will need a super user. To create it, execute the following command: .. code-block:: shell-session $ docker-compose run --rm webserver createsuperuser This will prompt you to set a username (default ``paperless``), an optional e-mail address and finally a password. 8. The default ``docker-compose.yml`` exports the webserver on your local port 8000. If you haven't adapted this, you should now be able to visit your `Paperless webserver`_ at ``http://127.0.0.1:8000`` (or ``https://127.0.0.1:8000`` if you enabled SSL). You can login with the user and password you just created. 9. Add files to consumption directory the way you prefer to. Following are two possible options: 1. Mount the consumption directory to a local host path by modifying your ``docker-compose.yml``: .. code-block:: diff diff --git a/docker-compose.yml b/docker-compose.yml --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,9 +18,8 @@ services: volumes: - paperless-data:/usr/src/paperless/data - paperless-media:/usr/src/paperless/media - - /consume + - /local/path/you/choose:/consume .. danger:: While the consumption container will ensure at startup that it can **delete** a consumed file from a host-mounted directory, it might not be able to **read** the document in the first place if the access rights to the file are incorrect. Make sure that the documents you put into the consumption directory will either be readable by everyone (``chmod o+r file.pdf``) or readable by the default user or group id 1000 (or the one you have set with ``USERMAP_UID`` or ``USERMAP_GID`` respectively). 2. Use ``docker cp`` to copy your files directly into the container: .. code-block:: shell-session $ # Identify your containers $ docker-compose ps Name Command State Ports ------------------------------------------------------------------------- paperless_consumer_1 /sbin/docker-entrypoint.sh ... Exit 0 paperless_webserver_1 /sbin/docker-entrypoint.sh ... Exit 0 $ docker cp /path/to/your/file.pdf paperless_consumer_1:/consume ``docker cp`` is a one-shot-command, just like ``cp``. This means that every time you want to consume a new document, you will have to execute ``docker cp`` again. You can of course automate this process, but option 1 is generally the preferred one. .. danger:: ``docker cp`` will change the owning user and group of a copied file to the acting user at the destination, which will be ``root``. You therefore need to ensure that the documents you want to copy into the container are readable by everyone (``chmod o+r file.pdf``) before copying them. .. _Docker: https://www.docker.com/ .. _docker-compose: https://docs.docker.com/compose/install/ .. _ISO 639-2/T: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes .. _Alpine packagelist: https://pkgs.alpinelinux.org/packages?name=tesseract-ocr-data*&arch=x86_64 .. [#compose] You of course don't have to use docker-compose, but it simplifies deployment immensely. If you know your way around Docker, feel free to tinker around without using compose! .. [#dockercomposeyml] If you're upgrading your docker-compose images from version 1.1.0 or earlier, you might need to change in the ``docker-compose.yml`` file the ``image: pitkley/paperless`` directive in both the ``webserver`` and ``consumer`` sections to ``build: ./`` as per the newer ``docker-compose.yml.example`` file .. _setup-permanent: Making Things a Little more Permanent ------------------------------------- Once you've tested things and are happy with the work flow, you should secure the installation and automate the process of starting the webserver and consumer. .. _setup-permanent-webserver: Using a Real Webserver ++++++++++++++++++++++ The default is to use Django's development server, as that's easy and does the job well enough on a home network. However it is heavily discouraged to use it for more than that. If you want to do things right you should use a real webserver capable of handling more than one thread. You will also have to let the webserver serve the static files (CSS, JavaScript) from the directory configured in ``PAPERLESS_STATICDIR``. The default static files directory is ``../static``. For that you need to activate your virtual environment and collect the static files with the command: .. code:: bash $ cd /src $ ./manage.py collectstatic Apache ~~~~~~ This is a configuration supplied by `steckerhalter`_ on GitHub. It uses Apache and mod_wsgi, with a Paperless installation in ``/home/paperless/``: .. code:: apache ServerName example.com Alias /static/ /home/paperless/paperless/static/ Require all granted WSGIScriptAlias / /home/paperless/paperless/src/paperless/wsgi.py WSGIDaemonProcess example.com user=paperless group=paperless threads=5 python-path=/home/paperless/paperless/src:/home/paperless/.env/lib/python3.6/site-packages WSGIProcessGroup example.com Require all granted .. _steckerhalter: https://github.com/steckerhalter Nginx + Gunicorn ~~~~~~~~~~~~~~~~ If you're using Nginx, the most common setup is to combine it with a Python-based server like Gunicorn so that Nginx is acting as a proxy. Below is a copy of a simple Nginx configuration fragment making use of a gunicorn instance listening on localhost port 8000. .. code:: nginx server { listen 80; index index.html index.htm index.php; access_log /var/log/nginx/paperless_access.log; error_log /var/log/nginx/paperless_error.log; location /static { autoindex on; alias ; } location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://127.0.0.1:8000; } } The gunicorn server can be started with the command: .. code-block:: shell $ /bin/gunicorn --pythonpath=/src paperless.wsgi -w 2 .. _setup-permanent-standard-systemd: Standard (Bare Metal + Systemd) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you're running on a bare metal system that's using Systemd, you can use the service unit files in the ``scripts`` directory to set this up. 1. You'll need to create a group and user called ``paperless`` (without login) 2. Setup Paperless to be in a place that this new user can read and write to. 3. Ensure ``/etc/paperless`` is readable by the ``paperless`` user. 4. Copy the service file from the ``scripts`` directory to ``/etc/systemd/system``. .. code-block:: bash $ cp /path/to/paperless/scripts/paperless-consumer.service /etc/systemd/system/ $ cp /path/to/paperless/scripts/paperless-webserver.service /etc/systemd/system/ 5. Edit the service file to point the ``ExecStart`` line to the proper location of your paperless install, referencing the appropriate Python binary. For example: ``ExecStart=/path/to/python3 /path/to/paperless/src/manage.py document_consumer``. 6. Start and enable (so they start on boot) the services. .. code-block:: bash $ systemctl enable paperless-consumer $ systemctl enable paperless-webserver $ systemctl start paperless-consumer $ systemctl start paperless-webserver .. _setup-permanent-standard-upstart: Standard (Bare Metal + Upstart) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Ubuntu 14.04 and earlier use the `Upstart`_ init system to start services during the boot process. To configure Upstart to run Paperless automatically after restarting your system: 1. Change to the directory where Upstart's configuration files are kept: ``cd /etc/init`` 2. Create a new file: ``sudo nano paperless-server.conf`` 3. In the newly-created file enter:: start on (local-filesystems and net-device-up IFACE=eth0) stop on shutdown respawn respawn limit 10 5 script exec /bin/gunicorn --pythonpath=/src paperless.wsgi -w 2 end script Note that you'll need to replace ``/srv/paperless/src/manage.py`` with the path to the ``manage.py`` script in your installation directory. If you are using a network interface other than ``eth0``, you will have to change ``IFACE=eth0``. For example, if you are connected via WiFi, you will likely need to replace ``eth0`` above with ``wlan0``. To see all interfaces, run ``ifconfig -a``. Save the file. 4. Create a new file: ``sudo nano paperless-consumer.conf`` 5. In the newly-created file enter:: start on (local-filesystems and net-device-up IFACE=eth0) stop on shutdown respawn respawn limit 10 5 script exec /bin/python /manage.py document_consumer end script Replace the path placeholder and ``eth0`` with the appropriate value and save the file. These two configuration files together will start both the Paperless webserver and document consumer processes when the file system and network interface specified is available after boot. Furthermore, if either process ever exits unexpectedly, Upstart will try to restart it a maximum of 10 times within a 5 second period. .. _Upstart: http://upstart.ubuntu.com/ .. _setup-permanent-docker: Docker ~~~~~~ If you're using Docker, you can set a restart-policy_ in the ``docker-compose.yml`` to have the containers automatically start with the Docker daemon. .. _restart-policy: https://docs.docker.com/engine/reference/commandline/run/#restart-policies-restart .. _setup-installation-linux-containers: Suggested way for Linux Container Method ++++++++++++++++++++++++++++++++++++++++ This method uses some rigid assumptions, for the best set-up:- * Ubuntu lts as the container * Apache as the webserver * proftpd as ftp server * ftpupload as the ftp user * paperless as the main user for website * http://paperless.lan is the desired lan url * LXC set to give ip addresses on your lan This could also be used as an install on a base debain/ubuntu server, if the above assumptions are acceptable. 1. Install lxc 2. Lanch paperless container .. code:: bash $ lxc launch ubuntu: paperless 3. Run install script within container .. code:: bash $ lxc exec paperless -- sh -c "wget https://raw.githubusercontent.com/the-paperless-project/paperless/master/docs/examples/lxc/lxc-install.sh && /bin/bash lxc-install.sh --email" The script will ask you for an ftpupload password. As well as the super-user for paperless web front-end. After around 10 mins, http://paperless.lan is ready and ftp://paperless.lan with user: ftpupload See the `Installation recording <_static/lxc-install.svg>`_. ================================================ FILE: docs/troubleshooting.rst ================================================ .. _troubleshooting: Troubleshooting =============== .. _troubleshooting-languagemissing: Consumer warns ``OCR for XX failed`` ------------------------------------ If you find the OCR accuracy to be too low, and/or the document consumer warns that ``OCR for XX failed, but we're going to stick with what we've got since FORGIVING_OCR is enabled``, then you might need to install the `Tesseract language files `_ marching your document's languages. As an example, if you are running Paperless from any Ubuntu or Debian box, and your documents are written in Spanish you may need to run:: apt-get install -y tesseract-ocr-spa .. _troubleshooting-convertpixelcache: Consumer dies with ``convert: unable to extent pixel cache`` ------------------------------------------------------------ During the consumption process, Paperless invokes ImageMagick's ``convert`` program to translate the source document into something that the OCR engine can understand and this can burn a Very Large amount of memory if the original document is rather long. Similarly, if your system doesn't have a lot of memory to begin with (ie. a Raspberry Pi), then this can happen for even medium-sized documents. The solution is to tell ImageMagick *not* to Use All The RAM, as is its default, and instead tell it to used a fixed amount. ``convert`` will then break up the job into hundreds of individual files and use them to slowly compile the finished image. Simply set ``PAPERLESS_CONVERT_MEMORY_LIMIT`` in ``/etc/paperless.conf`` to something like ``32000000`` and you'll limit ``convert`` to 32MB. Fiddle with this value as you like. **HOWEVER**: Simply setting this value may not be enough on system where ``/tmp`` is mounted as tmpfs, as this is where ``convert`` will write its temporary files. In these cases (most Systemd machines), you need to tell ImageMagick to use a different space for its scratch work. You do this by setting ``PAPERLESS_CONVERT_TMPDIR`` in ``/etc/paperless.conf`` to somewhere that's actually on a physical disk (and writable by the user running Paperless), like ``/var/tmp/paperless`` or ``/home/my_user/tmp`` in a pinch. .. _troubleshooting-decompressionbombwarning: DecompressionBombWarning and/or no text in the OCR output --------------------------------------------------------- Some users have had issues using Paperless to consume PDFs that were created by merging Very Large Scanned Images into one PDF. If this happens to you, it's likely because the PDF you've created contains some very large pages (millions of pixels) and the process of converting the PDF to a OCR-friendly image is exploding. Typically, this happens because the scanned images are created with a high DPI and then rolled into the PDF with an assumed DPI of 72 (the default). The best solution then is to specify the DPI used in the scan in the conversion-to-PDF step. So for example, if you scanned the original image with a DPI of 300, then merging the images into the single PDF with ``convert`` should look like this: .. code:: bash $ convert -density 300 *.jpg finished.pdf For more information on this and situations like it, you should take a look at `Issue #118`_ as that's where this tip originated. .. _Issue #118: https://github.com/the-paperless-project/paperless/issues/118 ================================================ FILE: docs/utilities.rst ================================================ .. _utilities: Utilities ========= There's basically three utilities to Paperless: the webserver, consumer, and if needed, the exporter. They're all detailed here. .. _utilities-webserver: The Webserver ------------- At the heart of it, Paperless is a simple Django webservice, and the entire interface is based on Django's standard admin interface. Once running, visiting the URL for your service delivers the admin, through which you can get a detailed listing of all available documents, search for specific files, and download whatever it is you're looking for. .. _utilities-webserver-howto: How to Use It ............. The webserver is started via the ``manage.py`` script: .. code-block:: shell-session $ /path/to/paperless/src/manage.py runserver By default, the server runs on localhost, port 8000, but you can change this with a few arguments, run ``manage.py --help`` for more information. Add the option ``--noreload`` to reduce resource usage. Otherwise, the server continuously polls all source files for changes to auto-reload them. Note that when exiting this command your webserver will disappear. If you want to run this full-time (which is kind of the point) you'll need to have it start in the background -- something you'll need to figure out for your own system. To get you started though, there are Systemd service files in the ``scripts`` directory. .. _utilities-consumer: The Consumer ------------ The consumer script runs in an infinite loop, constantly looking at a directory for documents to parse and index. The process is pretty straightforward: 1. Look in ``CONSUMPTION_DIR`` for a document. If one is found, go to #2. If not, wait 10 seconds and try again. On Linux, new documents are detected instantly via inotify, so there's no waiting involved. 2. Parse the document with Tesseract 3. Create a new record in the database with the OCR'd text 4. Attempt to automatically assign document attributes by doing some guesswork. Read up on the :ref:`guesswork documentation` for more information about this process. 5. Encrypt the document (if you have a passphrase set) and store it in the ``media`` directory under ``documents/originals``. 6. Go to #1. .. _utilities-consumer-howto: How to Use It ............. The consumer is started via the ``manage.py`` script: .. code-block:: shell-session $ /path/to/paperless/src/manage.py document_consumer This starts the service that will consume documents as they appear in ``CONSUMPTION_DIR``. Note that this command runs continuously, so exiting it will mean your webserver disappears. If you want to run this full-time (which is kind of the point) you'll need to have it start in the background -- something you'll need to figure out for your own system. To get you started though, there are Systemd service files in the ``scripts`` directory. Some command line arguments are available to customize the behavior of the consumer. By default it will use ``/etc/paperless.conf`` values. Display the help with: .. code-block:: shell-session $ /path/to/paperless/src/manage.py document_consumer --help .. _utilities-exporter: The Exporter ------------ Tired of fiddling with Paperless, or just want to do something stupid and are afraid of accidentally damaging your files? You can export all of your documents into neatly named, dated, and unencrypted files. .. _utilities-exporter-howto: How to Use It ............. This too is done via the ``manage.py`` script: .. code-block:: shell-session $ /path/to/paperless/src/manage.py document_exporter /path/to/somewhere/ This will dump all of your unencrypted documents into ``/path/to/somewhere`` for you to do with as you please. The files are accompanied with a special file, ``manifest.json`` which can be used to :ref:`import the files ` at a later date if you wish. .. _utilities-exporter-howto-docker: Docker ______ If you are :ref:`using Docker `, running the expoorter is almost as easy. To mount a volume for exports, follow the instructions in the ``docker-compose.yml.example`` file for the ``/export`` volume (making the changes in your own ``docker-compose.yml`` file, of course). Once you have the volume mounted, the command to run an export is: .. code-block:: shell-session $ docker-compose run --rm consumer document_exporter /export If you prefer to use ``docker run`` directly, supplying the necessary commandline options: .. code-block:: shell-session $ # Identify your containers $ docker-compose ps Name Command State Ports ------------------------------------------------------------------------- paperless_consumer_1 /sbin/docker-entrypoint.sh ... Exit 0 paperless_webserver_1 /sbin/docker-entrypoint.sh ... Exit 0 $ # Make sure to replace your passphrase and remove or adapt the id mapping $ docker run --rm \ --volumes-from paperless_data_1 \ --volume /path/to/arbitrary/place:/export \ -e PAPERLESS_PASSPHRASE=YOUR_PASSPHRASE \ -e USERMAP_UID=1000 -e USERMAP_GID=1000 \ paperless document_exporter /export .. _utilities-importer: The Importer ------------ Looking to transfer Paperless data from one instance to another, or just want to restore from a backup? This is your go-to toy. .. _utilities-importer-howto: How to Use It ............. The importer works just like the exporter. You point it at a directory, and the script does the rest of the work: .. code-block:: shell-session $ /path/to/paperless/src/manage.py document_importer /path/to/somewhere/ Docker ______ Assuming that you've already gone through the steps above in the :ref:`export ` section, then the easiest thing to do is just re-use the ``/export`` path you already setup: .. code-block:: shell-session $ docker-compose run --rm consumer document_importer /export Similarly, if you're not using docker-compose, you can adjust the export instructions above to do the import. .. _utilities-retagger: Re-running your tagging and correspondent matchers -------------------------------------------------- Say you've imported a few hundred documents and now want to introduce a tag or set up a new correspondent, and apply its matching to all of the currently-imported docs. This problem is common enough that there are tools for it. .. _utilities-retagger-howto: How to Do It ............ This too is done via the ``manage.py`` script: .. code:: bash $ /path/to/paperless/src/manage.py document_retagger Run this after changing or adding tagging rules. It'll loop over all of the documents in your database and attempt to match all of your tags to them. If one matches, it'll be applied. And don't worry, you can run this as often as you like, it won't double-tag a document. .. code:: bash $ /path/to/paperless/src/manage.py document_correspondents This is the similar command to run after adding or changing a correspondent. .. _utilities-encyption: Enabling Encrpytion ------------------- Let's say you've imported a few documents to play around with paperless and now you are using it more seriously and want to enable encryption of your files. .. utilities-encryption-howto: Basic Syntax ............. Again we'll use the ``manage.py`` script, passing ``change_storage_type``: .. code:: console $ /path/to/paperless/src/manage.py change_storage_type --help usage: manage.py change_storage_type [-h] [--version] [-v {0,1,2,3}] [--settings SETTINGS] [--pythonpath PYTHONPATH] [--traceback] [--no-color] [--passphrase PASSPHRASE] {gpg,unencrypted} {gpg,unencrypted} This is how you migrate your stored documents from an encrypted state to an unencrypted one (or vice-versa) positional arguments: {gpg,unencrypted} The state you want to change your documents from {gpg,unencrypted} The state you want to change your documents to optional arguments: --passphrase PASSPHRASE If PAPERLESS_PASSPHRASE isn't set already, you need to specify it here Enabling Encryption ................... Basic usage to enable encryption of your document store (**USE A MORE SECURE PASSPHRASE**): (Note: If ``PAPERLESS_PASSPHRASE`` isn't set already, you need to specify it here) .. code:: bash $ /path/to/paperless/src/manage.py change_storage_type [--passphrase SECR3TP4SSPHRA$E] unencrypted gpg Disabling Encryption .................... Basic usage to enable encryption of your document store: (Note: Again, if ``PAPERLESS_PASSPHRASE`` isn't set already, you need to specify it here) .. code:: bash $ /path/to/paperless/src/manage.py change_storage_type [--passphrase SECR3TP4SSPHRA$E] gpg unencrypted ================================================ FILE: management/commands/create_superuser_with_password.py ================================================ from django.contrib.auth.management.commands import createsuperuser from django.core.management import CommandError class Command(createsuperuser.Command): help = 'Crate a superuser, and allow password to be provided' def add_arguments(self, parser): super(Command, self).add_arguments(parser) parser.add_argument( '--password', dest='password', default=None, help='Specifies the password for the superuser.', ) parser.add_argument( '--preserve', dest='preserve', default=False, action='store_true', help='Exit normally if the user already exists.', ) def handle(self, *args, **options): password = options.get('password') username = options.get('username') database = options.get('database') if password and not username: raise CommandError("--username is required if specifying --password") if username and options.get('preserve'): exists = self.UserModel._default_manager.db_manager(database).filter(username=username).exists() if exists: self.stdout.write("User exists, exiting normally due to --preserve") return super(Command, self).handle(*args, **options) if password: user = self.UserModel._default_manager.db_manager(database).get(username=username) user.set_password(password) user.save() ================================================ FILE: overrides/README.md ================================================ # Customizing Paperless *See customization [documentation](https://paperless.readthedocs.io/en/latest/customising.html) for more detail!* The example `.css` and `.js` snippets in this folder can be placed into one of two files in your ``PAPERLESS_MEDIADIR`` folder: `overrides.js` or `overrides.css`. Please feel free to submit pull requests to the main repository with other examples of customizations that you think others may find useful. ================================================ FILE: paperless.conf.example ================================================ # Sample paperless.conf # Copy this file to /etc/paperless.conf and modify it to suit your needs. # As this file contains passwords it should only be readable by the user # running paperless. ############################################################################### #### Paths & Folders #### ############################################################################### # This where your documents should go to be consumed. Make sure that it exists # and that the user running the paperless service can read/write its contents # before you start Paperless. PAPERLESS_CONSUMPTION_DIR="" # You can specify where you want the SQLite database to be stored instead of # the default location of /data/ within the install directory. #PAPERLESS_DBDIR=/path/to/database/file # Override the default MEDIA_ROOT here. This is where all files are stored. # The default location is /media/documents/ within the install folder. #PAPERLESS_MEDIADIR=/path/to/media # Override the default STATIC_ROOT here. This is where all static files # created using "collectstatic" manager command are stored. #PAPERLESS_STATICDIR="" # Override the MEDIA_URL here. Unless you're hosting Paperless off a subdomain # like /paperless/, you probably don't need to change this. #PAPERLESS_MEDIA_URL="/media/" # Override the STATIC_URL here. Unless you're hosting Paperless off a # subdomain like /paperless/, you probably don't need to change this. #PAPERLESS_STATIC_URL="/static/" # These values are required if you want paperless to check a particular email # box every 10 minutes and attempt to consume documents from there. If you # don't define a HOST, mail checking will just be disabled. PAPERLESS_CONSUME_MAIL_HOST="" PAPERLESS_CONSUME_MAIL_PORT="" PAPERLESS_CONSUME_MAIL_USER="" PAPERLESS_CONSUME_MAIL_PASS="" # Override the default IMAP inbox here. If not set Paperless defaults to # "INBOX". #PAPERLESS_CONSUME_MAIL_INBOX="INBOX" # Any email sent to the target account that does not contain this text will be # ignored. PAPERLESS_EMAIL_SECRET="" # Specify a filename format for the document (directories are supported) # Use the following placeholders: # * {correspondent} # * {title} # * {created} # * {added} # * {tags[KEY]} If your tags conform to key_value or key-value # * {tags[INDEX]} If your tags are strings, select the tag by index # Uniqueness of filenames is ensured, as an incrementing counter is attached # to each filename. #PAPERLESS_FILENAME_FORMAT="" ############################################################################### #### Security #### ############################################################################### # Controls whether django's debug mode is enabled. Disable this on production # systems. Debug mode is enabled by default. #PAPERLESS_DEBUG="true" # Paperless can be instructed to attempt to encrypt your PDF files with GPG # using the PAPERLESS_PASSPHRASE specified below. If however you're not # concerned about encrypting these files (for example if you have disk # encryption locally) then you don't need this and can safely leave this value # un-set. # # One final note about the passphrase. Once you've consumed a document with # one passphrase, DON'T CHANGE IT. Paperless assumes this to be a constant and # can't properly export documents that were encrypted with an old passphrase if # you've since changed it to a new one. # # The default is to not use encryption at all. #PAPERLESS_PASSPHRASE="secret" # The secret key has a default that should be fine so long as you're hosting # Paperless on a closed network. However, if you're putting this anywhere # public, you should change the key to something unique and verbose. #PAPERLESS_SECRET_KEY="change-me" # If you're planning on putting Paperless on the open internet, then you # really should set this value to the domain name you're using. Failing to do # so leaves you open to HTTP host header attacks: # https://docs.djangoproject.com/en/1.10/topics/security/#host-headers-virtual-hosting # # Just remember that this is a comma-separated list, so "example.com" is fine, # as is "example.com,www.example.com", but NOT " example.com" or "example.com," #PAPERLESS_ALLOWED_HOSTS="example.com,www.example.com" # If you decide to use the Paperless API in an ajax call, you need to add your # servers to the list of allowed hosts that can do CORS calls. By default # Paperless allows calls from localhost:8080, but you'd like to change that, # you can set this value to a comma-separated list. #PAPERLESS_CORS_ALLOWED_HOSTS="localhost:8080,example.com,localhost:8000" # To host paperless under a subpath url like example.com/paperless you set # this value to /paperless. No trailing slash! # # https://docs.djangoproject.com/en/1.11/ref/settings/#force-script-name #PAPERLESS_FORCE_SCRIPT_NAME="" # If you are using alternative authentication means or are just using paperless # as a single user on a small private network, this option allows you to disable # user authentication if you set it to "true" #PAPERLESS_DISABLE_LOGIN="false" ############################################################################### #### Software Tweaks #### ############################################################################### # After a document is consumed, Paperless can trigger an arbitrary script if # you like. This script will be passed a number of arguments for you to work # with. The default is blank, which means nothing will be executed. For more # information, take a look at the docs: # http://paperless.readthedocs.org/en/latest/consumption.html#hooking-into-the-consumption-process #PAPERLESS_POST_CONSUME_SCRIPT="/path/to/an/arbitrary/script.sh" # By default, when clicking on a document within the web interface, the # browser will prompt the user to save the document to disk. By setting this to # "true", the document will instead be opened in the browser, if possible. #PAPERLESS_INLINE_DOC="false" # By default, paperless will check the document text for document date information. # Uncomment the line below to enable checking the document filename for date # information. The date order can be set to any option as specified in # https://dateparser.readthedocs.io/en/latest/#settings. The filename will be # checked first, and if nothing is found, the document text will be checked # as normal. #PAPERLESS_FILENAME_DATE_ORDER="YMD" # Sometimes devices won't create filenames which can be parsed properly # by the filename parser (see # https://paperless.readthedocs.io/en/latest/guesswork.html). # # This setting allows to specify a list of transformations # in regular expression syntax, which are passed in order to re.sub. # Transformation stops after the first match, so at most one transformation # is applied. # # Syntax is a JSON array of dictionaries containing "pattern" and "repl" # as keys. # # The example below transforms filenames created by a Brother ADS-2400N # document scanner in its standard configuration `Name_Date_Count', so that # count is used as title, name as tag and date can be parsed by paperless. #PAPERLESS_FILENAME_PARSE_TRANSFORMS=[{"pattern":"^([a-z]+)_(\\d{8})_(\\d{6})_([0-9]+)\\.", "repl":"\\2\\3Z - \\4 - \\1."}] # # The following values use sensible defaults for modern systems, but if you're # running Paperless on a low-resource device (like a Raspberry Pi), modifying # some of these values may be necessary. # # By default, Paperless will attempt to use all available CPU cores to process # a document, but if you would like to limit that, you can set this value to # an integer: #PAPERLESS_OCR_THREADS=1 # Customize the default language that tesseract will attempt to use when # parsing documents. It should be a 3-letter language code consistent with ISO # 639: https://www.loc.gov/standards/iso639-2/php/code_list.php #PAPERLESS_OCR_LANGUAGE=eng # On smaller systems, or even in the case of Very Large Documents, the consumer # may explode, complaining about how it's "unable to extend pixel cache". In # such cases, try setting this to a reasonably low value, like 32000000. The # default is to use whatever is necessary to do everything without writing to # disk, and units are in megabytes. # # For more information on how to use this value, you should probably search # the web for "MAGICK_MEMORY_LIMIT". #PAPERLESS_CONVERT_MEMORY_LIMIT=0 # Similar to the memory limit, if you've got a small system and your OS mounts # /tmp as tmpfs, you should set this to a path that's on a physical disk, like # /home/your_user/tmp or something. ImageMagick will use this as scratch space # when crunching through very large documents. # # For more information on how to use this value, you should probably search # the web for "MAGICK_TMPDIR". #PAPERLESS_CONVERT_TMPDIR=/var/tmp/paperless # By default the conversion density setting for documents is 300DPI, in some # cases it has proven useful to configure a lesser value. # This setting has a high impact on the physical size of tmp page files, # the speed of document conversion, and can affect the accuracy of OCR # results. Individual results can vary and this setting should be tested # thoroughly against the documents you are importing to see if it has any # impacts either negative or positive. # Testing on limited document sets has shown a setting of 200 can cut the # size of tmp files by 1/3, and speed up conversion by up to 4x # with little impact to OCR accuracy. #PAPERLESS_CONVERT_DENSITY=300 # (This setting is ignored on Linux where inotify is used instead of a # polling loop.) # The number of seconds that Paperless will wait between checking # PAPERLESS_CONSUMPTION_DIR. If you tend to write documents to this directory # rarely, you may want to use a higher value than the default (10). #PAPERLESS_CONSUMER_LOOP_TIME=10 # By default Paperless stops consuming a document if no language can be # detected. Set to true to consume documents even if the language detection # fails. #PAPERLESS_FORGIVING_OCR="false" # By default Paperless does not OCR a document if the text can be retrieved from # the document directly. Set to true to always OCR documents. #PAPERLESS_OCR_ALWAYS="false" ############################################################################### #### Interface #### ############################################################################### # Override the default UTC time zone here. # See https://docs.djangoproject.com/en/1.10/ref/settings/#std:setting-TIME_ZONE # for details on how to set it. #PAPERLESS_TIME_ZONE=UTC # If set, Paperless will show document filters per financial year. # The dates must be in the format "mm-dd", for example "07-15" for July 15. #PAPERLESS_FINANCIAL_YEAR_START="mm-dd" #PAPERLESS_FINANCIAL_YEAR_END="mm-dd" # The number of items on each page in the web UI. This value must be a # positive integer, but if you don't define one in paperless.conf, a default of # 100 will be used. #PAPERLESS_LIST_PER_PAGE=100 # The number of years for which a correspondent will be included in the recent # correspondents filter. #PAPERLESS_RECENT_CORRESPONDENT_YEARS=1 ############################################################################### #### Third-Party Binaries #### ############################################################################### # There are a few external software packages that Paperless expects to find on # your system when it starts up. Unless you've done something creative with # their installation, you probably won't need to edit any of these. However, # if you've installed these programs somewhere where simply typing the name of # the program doesn't automatically execute it (ie. the program isn't in your # $PATH), then you'll need to specify the literal path for that program here. # Convert (part of the ImageMagick suite) #PAPERLESS_CONVERT_BINARY=/usr/bin/convert # Ghostscript #PAPERLESS_GS_BINARY = /usr/bin/gs # Unpaper #PAPERLESS_UNPAPER_BINARY=/usr/bin/unpaper # Optipng (for optimising thumbnail sizes) #PAPERLESS_OPTIPNG_BINARY=/usr/bin/optipng ================================================ FILE: presentation/README.md ================================================ # Presentation This presentation was written with [reaveal.js](http://lab.hakim.se/reveal-js/), and requires no special software to view. Simply open `index.html` in a browser and you're good to go. ================================================ FILE: presentation/contrib/font-awesome-4.3.0/css/font-awesome.css ================================================ /*! * Font Awesome 4.3.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.3.0'); src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.3.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; transform: translate(0, 0); } /* 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; } .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-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-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-genderless:before, .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-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-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"; } ================================================ FILE: presentation/contrib/font-awesome-4.3.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: presentation/contrib/font-awesome-4.3.0/less/bordered-pulled.less ================================================ // Bordered & Pulled // ------------------------- .@{fa-css-prefix}-border { padding: .2em .25em .15em; border: solid .08em @fa-border-color; border-radius: .1em; } .pull-right { float: right; } .pull-left { float: left; } .@{fa-css-prefix} { &.pull-left { margin-right: .3em; } &.pull-right { margin-left: .3em; } } ================================================ FILE: presentation/contrib/font-awesome-4.3.0/less/core.less ================================================ // Base Class Definition // ------------------------- .@{fa-css-prefix} { display: inline-block; font: normal normal normal @fa-font-size-base/1 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; transform: translate(0, 0); // ensures no half-pixel rendering in firefox } ================================================ FILE: presentation/contrib/font-awesome-4.3.0/less/fixed-width.less ================================================ // Fixed Width Icons // ------------------------- .@{fa-css-prefix}-fw { width: (18em / 14); text-align: center; } ================================================ FILE: presentation/contrib/font-awesome-4.3.0/less/font-awesome.less ================================================ /*! * Font Awesome 4.3.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: presentation/contrib/font-awesome-4.3.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}-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}-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}-genderless:before, .@{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}-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}-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; } ================================================ FILE: presentation/contrib/font-awesome-4.3.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: presentation/contrib/font-awesome-4.3.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: presentation/contrib/font-awesome-4.3.0/less/mixins.less ================================================ // Mixins // -------------------------- .fa-icon() { display: inline-block; font: normal normal normal @fa-font-size-base/1 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; transform: translate(0, 0); // ensures no half-pixel rendering in firefox } .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: presentation/contrib/font-awesome-4.3.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: presentation/contrib/font-awesome-4.3.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: presentation/contrib/font-awesome-4.3.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: presentation/contrib/font-awesome-4.3.0/less/variables.less ================================================ // Variables // -------------------------- @fa-font-path: "../fonts"; @fa-font-size-base: 14px; //@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.3.0/fonts"; // for referencing Bootstrap CDN font files directly @fa-css-prefix: fa; @fa-version: "4.3.0"; @fa-border-color: #eee; @fa-inverse: #fff; @fa-li-width: (30em / 14); @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-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-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-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-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-o: "\f133"; @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-discover: "\f1f2"; @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-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-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-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-comments: "\f086"; @fa-var-comments-o: "\f0e6"; @fa-var-compass: "\f14e"; @fa-var-compress: "\f066"; @fa-var-connectdevelop: "\f20e"; @fa-var-copy: "\f0c5"; @fa-var-copyright: "\f1f9"; @fa-var-credit-card: "\f09d"; @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-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-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-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-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-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: "\f1db"; @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-o-down: "\f0a7"; @fa-var-hand-o-left: "\f0a5"; @fa-var-hand-o-right: "\f0a4"; @fa-var-hand-o-up: "\f0a6"; @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-html5: "\f13b"; @fa-var-ils: "\f20b"; @fa-var-image: "\f03e"; @fa-var-inbox: "\f01c"; @fa-var-indent: "\f03c"; @fa-var-info: "\f129"; @fa-var-info-circle: "\f05a"; @fa-var-inr: "\f156"; @fa-var-instagram: "\f16d"; @fa-var-institution: "\f19c"; @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-marker: "\f041"; @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-mobile: "\f10b"; @fa-var-mobile-phone: "\f10b"; @fa-var-money: "\f0d6"; @fa-var-moon-o: "\f186"; @fa-var-mortar-board: "\f19d"; @fa-var-motorcycle: "\f21c"; @fa-var-music: "\f001"; @fa-var-navicon: "\f0c9"; @fa-var-neuter: "\f22c"; @fa-var-newspaper-o: "\f1ea"; @fa-var-openid: "\f19b"; @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-paw: "\f1b0"; @fa-var-paypal: "\f1ed"; @fa-var-pencil: "\f040"; @fa-var-pencil-square: "\f14b"; @fa-var-pencil-square-o: "\f044"; @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-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-square: "\f1a2"; @fa-var-refresh: "\f021"; @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-save: "\f0c7"; @fa-var-scissors: "\f0c4"; @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-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-stop: "\f04d"; @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-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-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-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-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-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-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-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-yahoo: "\f19e"; @fa-var-yelp: "\f1e9"; @fa-var-yen: "\f157"; @fa-var-youtube: "\f167"; @fa-var-youtube-play: "\f16a"; @fa-var-youtube-square: "\f166"; ================================================ FILE: presentation/contrib/font-awesome-4.3.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: presentation/contrib/font-awesome-4.3.0/scss/_bordered-pulled.scss ================================================ // Bordered & Pulled // ------------------------- .#{$fa-css-prefix}-border { padding: .2em .25em .15em; border: solid .08em $fa-border-color; border-radius: .1em; } .pull-right { float: right; } .pull-left { float: left; } .#{$fa-css-prefix} { &.pull-left { margin-right: .3em; } &.pull-right { margin-left: .3em; } } ================================================ FILE: presentation/contrib/font-awesome-4.3.0/scss/_core.scss ================================================ // Base Class Definition // ------------------------- .#{$fa-css-prefix} { display: inline-block; font: normal normal normal #{$fa-font-size-base}/1 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; transform: translate(0, 0); // ensures no half-pixel rendering in firefox } ================================================ FILE: presentation/contrib/font-awesome-4.3.0/scss/_fixed-width.scss ================================================ // Fixed Width Icons // ------------------------- .#{$fa-css-prefix}-fw { width: (18em / 14); text-align: center; } ================================================ FILE: presentation/contrib/font-awesome-4.3.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}-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}-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}-genderless:before, .#{$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}-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}-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; } ================================================ FILE: presentation/contrib/font-awesome-4.3.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: presentation/contrib/font-awesome-4.3.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: presentation/contrib/font-awesome-4.3.0/scss/_mixins.scss ================================================ // Mixins // -------------------------- @mixin fa-icon() { display: inline-block; font: normal normal normal #{$fa-font-size-base}/1 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; transform: translate(0, 0); // ensures no half-pixel rendering in firefox } @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: presentation/contrib/font-awesome-4.3.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: presentation/contrib/font-awesome-4.3.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: presentation/contrib/font-awesome-4.3.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: presentation/contrib/font-awesome-4.3.0/scss/_variables.scss ================================================ // Variables // -------------------------- $fa-font-path: "../fonts" !default; $fa-font-size-base: 14px !default; //$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.3.0/fonts" !default; // for referencing Bootstrap CDN font files directly $fa-css-prefix: fa !default; $fa-version: "4.3.0" !default; $fa-border-color: #eee !default; $fa-inverse: #fff !default; $fa-li-width: (30em / 14) !default; $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-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-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-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-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-o: "\f133"; $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-discover: "\f1f2"; $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-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-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-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-comments: "\f086"; $fa-var-comments-o: "\f0e6"; $fa-var-compass: "\f14e"; $fa-var-compress: "\f066"; $fa-var-connectdevelop: "\f20e"; $fa-var-copy: "\f0c5"; $fa-var-copyright: "\f1f9"; $fa-var-credit-card: "\f09d"; $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-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-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-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-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-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: "\f1db"; $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-o-down: "\f0a7"; $fa-var-hand-o-left: "\f0a5"; $fa-var-hand-o-right: "\f0a4"; $fa-var-hand-o-up: "\f0a6"; $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-html5: "\f13b"; $fa-var-ils: "\f20b"; $fa-var-image: "\f03e"; $fa-var-inbox: "\f01c"; $fa-var-indent: "\f03c"; $fa-var-info: "\f129"; $fa-var-info-circle: "\f05a"; $fa-var-inr: "\f156"; $fa-var-instagram: "\f16d"; $fa-var-institution: "\f19c"; $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-marker: "\f041"; $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-mobile: "\f10b"; $fa-var-mobile-phone: "\f10b"; $fa-var-money: "\f0d6"; $fa-var-moon-o: "\f186"; $fa-var-mortar-board: "\f19d"; $fa-var-motorcycle: "\f21c"; $fa-var-music: "\f001"; $fa-var-navicon: "\f0c9"; $fa-var-neuter: "\f22c"; $fa-var-newspaper-o: "\f1ea"; $fa-var-openid: "\f19b"; $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-paw: "\f1b0"; $fa-var-paypal: "\f1ed"; $fa-var-pencil: "\f040"; $fa-var-pencil-square: "\f14b"; $fa-var-pencil-square-o: "\f044"; $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-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-square: "\f1a2"; $fa-var-refresh: "\f021"; $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-save: "\f0c7"; $fa-var-scissors: "\f0c4"; $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-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-stop: "\f04d"; $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-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-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-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-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-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-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-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-yahoo: "\f19e"; $fa-var-yelp: "\f1e9"; $fa-var-yen: "\f157"; $fa-var-youtube: "\f167"; $fa-var-youtube-play: "\f16a"; $fa-var-youtube-square: "\f166"; ================================================ FILE: presentation/contrib/font-awesome-4.3.0/scss/font-awesome.scss ================================================ /*! * Font Awesome 4.3.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: presentation/contrib/google/css/lato.css ================================================ @font-face { font-family: 'Lato'; font-style: normal; font-weight: 400; src: local('Lato Regular'), local('Lato-Regular'), url(../fonts/v0SdcGFAl2aezM9Vq_aFTQ.ttf) format('truetype'); } @font-face { font-family: 'Lato'; font-style: normal; font-weight: 700; src: local('Lato Bold'), local('Lato-Bold'), url(../fonts/DvlFBScY1r-FMtZSYIYoYw.ttf) format('truetype'); } @font-face { font-family: 'Lato'; font-style: italic; font-weight: 400; src: local('Lato Italic'), local('Lato-Italic'), url(../fonts/LqowQDslGv4DmUBAfWa2Vw.ttf) format('truetype'); } @font-face { font-family: 'Lato'; font-style: italic; font-weight: 700; src: local('Lato Bold Italic'), local('Lato-BoldItalic'), url(../fonts/HkF_qI1x_noxlxhrhMQYEKCWcynf_cDxXwCLxiixG1c.ttf) format('truetype'); } ================================================ FILE: presentation/css/print/paper.css ================================================ /* Default Print Stylesheet Template by Rob Glazebrook of CSSnewbie.com Last Updated: June 4, 2008 Feel free (nay, compelled) to edit, append, and manipulate this file as you see fit. */ @media print { /* SECTION 1: Set default width, margin, float, and background. This prevents elements from extending beyond the edge of the printed page, and prevents unnecessary background images from printing */ html { background: #fff; width: auto; height: auto; overflow: visible; } body { background: #fff; font-size: 20pt; width: auto; height: auto; border: 0; margin: 0 5%; padding: 0; overflow: visible; float: none !important; } /* SECTION 2: Remove any elements not needed in print. This would include navigation, ads, sidebars, etc. */ .nestedarrow, .controls, .fork-reveal, .share-reveal, .state-background, .reveal .progress, .reveal .backgrounds { display: none !important; } /* SECTION 3: Set body font face, size, and color. Consider using a serif font for readability. */ body, p, td, li, div { font-size: 20pt!important; font-family: Georgia, "Times New Roman", Times, serif !important; color: #000; } /* SECTION 4: Set heading font face, sizes, and color. Differentiate your headings from your body text. Perhaps use a large sans-serif for distinction. */ h1,h2,h3,h4,h5,h6 { color: #000!important; height: auto; line-height: normal; font-family: Georgia, "Times New Roman", Times, serif !important; text-shadow: 0 0 0 #000 !important; text-align: left; letter-spacing: normal; } /* Need to reduce the size of the fonts for printing */ h1 { font-size: 28pt !important; } h2 { font-size: 24pt !important; } h3 { font-size: 22pt !important; } h4 { font-size: 22pt !important; font-variant: small-caps; } h5 { font-size: 21pt !important; } h6 { font-size: 20pt !important; font-style: italic; } /* SECTION 5: Make hyperlinks more usable. Ensure links are underlined, and consider appending the URL to the end of the link for usability. */ a:link, a:visited { color: #000 !important; font-weight: bold; text-decoration: underline; } /* .reveal a:link:after, .reveal a:visited:after { content: " (" attr(href) ") "; color: #222 !important; font-size: 90%; } */ /* SECTION 6: more reveal.js specific additions by @skypanther */ ul, ol, div, p { visibility: visible; position: static; width: auto; height: auto; display: block; overflow: visible; margin: 0; text-align: left !important; } .reveal pre, .reveal table { margin-left: 0; margin-right: 0; } .reveal pre code { padding: 20px; border: 1px solid #ddd; } .reveal blockquote { margin: 20px 0; } .reveal .slides { position: static !important; width: auto !important; height: auto !important; left: 0 !important; top: 0 !important; margin-left: 0 !important; margin-top: 0 !important; padding: 0 !important; zoom: 1 !important; overflow: visible !important; display: block !important; text-align: left !important; -webkit-perspective: none; -moz-perspective: none; -ms-perspective: none; perspective: none; -webkit-perspective-origin: 50% 50%; -moz-perspective-origin: 50% 50%; -ms-perspective-origin: 50% 50%; perspective-origin: 50% 50%; } .reveal .slides section { visibility: visible !important; position: static !important; width: 100% !important; height: auto !important; display: block !important; overflow: visible !important; left: 0 !important; top: 0 !important; margin-left: 0 !important; margin-top: 0 !important; padding: 60px 20px !important; z-index: auto !important; opacity: 1 !important; page-break-after: always !important; -webkit-transform-style: flat !important; -moz-transform-style: flat !important; -ms-transform-style: flat !important; transform-style: flat !important; -webkit-transform: none !important; -moz-transform: none !important; -ms-transform: none !important; transform: none !important; -webkit-transition: none !important; -moz-transition: none !important; -ms-transition: none !important; transition: none !important; } .reveal .slides section.stack { padding: 0 !important; } .reveal section:last-of-type { page-break-after: avoid !important; } .reveal section .fragment { opacity: 1 !important; visibility: visible !important; -webkit-transform: none !important; -moz-transform: none !important; -ms-transform: none !important; transform: none !important; } .reveal section img { display: block; margin: 15px 0px; background: rgba(255,255,255,1); border: 1px solid #666; box-shadow: none; } .reveal section small { font-size: 0.8em; } } ================================================ FILE: presentation/css/print/pdf.css ================================================ /* Default Print Stylesheet Template by Rob Glazebrook of CSSnewbie.com Last Updated: June 4, 2008 Feel free (nay, compelled) to edit, append, and manipulate this file as you see fit. */ /* SECTION 1: Set default width, margin, float, and background. This prevents elements from extending beyond the edge of the printed page, and prevents unnecessary background images from printing */ * { -webkit-print-color-adjust: exact; } body { margin: 0 auto !important; border: 0; padding: 0; float: none !important; overflow: visible; } html { width: 100%; height: 100%; overflow: visible; } /* SECTION 2: Remove any elements not needed in print. This would include navigation, ads, sidebars, etc. */ .nestedarrow, .reveal .controls, .reveal .progress, .reveal .slide-number, .reveal .playback, .reveal.overview, .fork-reveal, .share-reveal, .state-background { display: none !important; } /* SECTION 3: Set body font face, size, and color. Consider using a serif font for readability. */ body, p, td, li, div { } /* SECTION 4: Set heading font face, sizes, and color. Differentiate your headings from your body text. Perhaps use a large sans-serif for distinction. */ h1,h2,h3,h4,h5,h6 { text-shadow: 0 0 0 #000 !important; } .reveal pre code { overflow: hidden !important; font-family: Courier, 'Courier New', monospace !important; } /* SECTION 5: more reveal.js specific additions by @skypanther */ ul, ol, div, p { visibility: visible; position: static; width: auto; height: auto; display: block; overflow: visible; margin: auto; } .reveal { width: auto !important; height: auto !important; overflow: hidden !important; } .reveal .slides { position: static; width: 100%; height: auto; left: auto; top: auto; margin: 0 !important; padding: 0 !important; overflow: visible; display: block; -webkit-perspective: none; -moz-perspective: none; -ms-perspective: none; perspective: none; -webkit-perspective-origin: 50% 50%; /* there isn't a none/auto value but 50-50 is the default */ -moz-perspective-origin: 50% 50%; -ms-perspective-origin: 50% 50%; perspective-origin: 50% 50%; } .reveal .slides section { page-break-after: always !important; visibility: visible !important; position: relative !important; display: block !important; position: relative !important; margin: 0 !important; padding: 0 !important; box-sizing: border-box !important; min-height: 1px; opacity: 1 !important; -webkit-transform-style: flat !important; -moz-transform-style: flat !important; -ms-transform-style: flat !important; transform-style: flat !important; -webkit-transform: none !important; -moz-transform: none !important; -ms-transform: none !important; transform: none !important; } .reveal section.stack { margin: 0 !important; padding: 0 !important; page-break-after: avoid !important; height: auto !important; min-height: auto !important; } .reveal img { box-shadow: none; } .reveal .roll { overflow: visible; line-height: 1em; } /* Slide backgrounds are placed inside of their slide when exporting to PDF */ .reveal section .slide-background { display: block !important; position: absolute; top: 0; left: 0; width: 100%; z-index: -1; } /* All elements should be above the slide-background */ .reveal section>* { position: relative; z-index: 1; } ================================================ FILE: presentation/css/reveal.css ================================================ /*! * reveal.js * http://lab.hakim.se/reveal-js * MIT licensed * * Copyright (C) 2015 Hakim El Hattab, http://hakim.se */ /********************************************* * RESET STYLES *********************************************/ html, body, .reveal div, .reveal span, .reveal applet, .reveal object, .reveal iframe, .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6, .reveal p, .reveal blockquote, .reveal pre, .reveal a, .reveal abbr, .reveal acronym, .reveal address, .reveal big, .reveal cite, .reveal code, .reveal del, .reveal dfn, .reveal em, .reveal img, .reveal ins, .reveal kbd, .reveal q, .reveal s, .reveal samp, .reveal small, .reveal strike, .reveal strong, .reveal sub, .reveal sup, .reveal tt, .reveal var, .reveal b, .reveal u, .reveal center, .reveal dl, .reveal dt, .reveal dd, .reveal ol, .reveal ul, .reveal li, .reveal fieldset, .reveal form, .reveal label, .reveal legend, .reveal table, .reveal caption, .reveal tbody, .reveal tfoot, .reveal thead, .reveal tr, .reveal th, .reveal td, .reveal article, .reveal aside, .reveal canvas, .reveal details, .reveal embed, .reveal figure, .reveal figcaption, .reveal footer, .reveal header, .reveal hgroup, .reveal menu, .reveal nav, .reveal output, .reveal ruby, .reveal section, .reveal summary, .reveal time, .reveal mark, .reveal audio, video { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; } .reveal article, .reveal aside, .reveal details, .reveal figcaption, .reveal figure, .reveal footer, .reveal header, .reveal hgroup, .reveal menu, .reveal nav, .reveal section { display: block; } /********************************************* * GLOBAL STYLES *********************************************/ html, body { width: 100%; height: 100%; overflow: hidden; } body { position: relative; line-height: 1; background-color: #fff; color: #000; } ::-moz-selection { background: #FF5E99; color: #fff; text-shadow: none; } ::selection { background: #FF5E99; color: #fff; text-shadow: none; } /********************************************* * VIEW FRAGMENTS *********************************************/ .reveal .slides section .fragment { opacity: 0; visibility: hidden; -webkit-transition: all 0.2s ease; transition: all 0.2s ease; } .reveal .slides section .fragment.visible { opacity: 1; visibility: visible; } .reveal .slides section .fragment.grow { opacity: 1; visibility: visible; } .reveal .slides section .fragment.grow.visible { -webkit-transform: scale(1.3); -ms-transform: scale(1.3); transform: scale(1.3); } .reveal .slides section .fragment.shrink { opacity: 1; visibility: visible; } .reveal .slides section .fragment.shrink.visible { -webkit-transform: scale(0.7); -ms-transform: scale(0.7); transform: scale(0.7); } .reveal .slides section .fragment.zoom-in { -webkit-transform: scale(0.1); -ms-transform: scale(0.1); transform: scale(0.1); } .reveal .slides section .fragment.zoom-in.visible { -webkit-transform: scale(1); -ms-transform: scale(1); transform: scale(1); } .reveal .slides section .fragment.roll-in { -webkit-transform: rotateX(90deg); transform: rotateX(90deg); } .reveal .slides section .fragment.roll-in.visible { -webkit-transform: rotateX(0); transform: rotateX(0); } .reveal .slides section .fragment.fade-out { opacity: 1; visibility: visible; } .reveal .slides section .fragment.fade-out.visible { opacity: 0; visibility: hidden; } .reveal .slides section .fragment.semi-fade-out { opacity: 1; visibility: visible; } .reveal .slides section .fragment.semi-fade-out.visible { opacity: 0.5; visibility: visible; } .reveal .slides section .fragment.strike { opacity: 1; } .reveal .slides section .fragment.strike.visible { text-decoration: line-through; } .reveal .slides section .fragment.current-visible { opacity: 0; visibility: hidden; } .reveal .slides section .fragment.current-visible.current-fragment { opacity: 1; visibility: visible; } .reveal .slides section .fragment.highlight-red, .reveal .slides section .fragment.highlight-current-red, .reveal .slides section .fragment.highlight-green, .reveal .slides section .fragment.highlight-current-green, .reveal .slides section .fragment.highlight-blue, .reveal .slides section .fragment.highlight-current-blue { opacity: 1; visibility: visible; } .reveal .slides section .fragment.highlight-red.visible { color: #ff2c2d; } .reveal .slides section .fragment.highlight-green.visible { color: #17ff2e; } .reveal .slides section .fragment.highlight-blue.visible { color: #1b91ff; } .reveal .slides section .fragment.highlight-current-red.current-fragment { color: #ff2c2d; } .reveal .slides section .fragment.highlight-current-green.current-fragment { color: #17ff2e; } .reveal .slides section .fragment.highlight-current-blue.current-fragment { color: #1b91ff; } /********************************************* * DEFAULT ELEMENT STYLES *********************************************/ /* Fixes issue in Chrome where italic fonts did not appear when printing to PDF */ .reveal:after { content: ''; font-style: italic; } .reveal iframe { z-index: 1; } /** Prevents layering issues in certain browser/transition combinations */ .reveal a { position: relative; } .reveal .stretch { max-width: none; max-height: none; } .reveal pre.stretch code { height: 100%; max-height: 100%; -moz-box-sizing: border-box; box-sizing: border-box; } /********************************************* * CONTROLS *********************************************/ .reveal .controls { display: none; position: fixed; width: 110px; height: 110px; z-index: 30; right: 10px; bottom: 10px; -webkit-user-select: none; } .reveal .controls div { position: absolute; opacity: 0.05; width: 0; height: 0; border: 12px solid transparent; -webkit-transform: scale(0.9999); -ms-transform: scale(0.9999); transform: scale(0.9999); -webkit-transition: all 0.2s ease; transition: all 0.2s ease; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } .reveal .controls div.enabled { opacity: 0.7; cursor: pointer; } .reveal .controls div.enabled:active { margin-top: 1px; } .reveal .controls div.navigate-left { top: 42px; border-right-width: 22px; border-right-color: #000; } .reveal .controls div.navigate-left.fragmented { opacity: 0.3; } .reveal .controls div.navigate-right { left: 74px; top: 42px; border-left-width: 22px; border-left-color: #000; } .reveal .controls div.navigate-right.fragmented { opacity: 0.3; } .reveal .controls div.navigate-up { left: 42px; border-bottom-width: 22px; border-bottom-color: #000; } .reveal .controls div.navigate-up.fragmented { opacity: 0.3; } .reveal .controls div.navigate-down { left: 42px; top: 74px; border-top-width: 22px; border-top-color: #000; } .reveal .controls div.navigate-down.fragmented { opacity: 0.3; } /********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { position: fixed; display: none; height: 3px; width: 100%; bottom: 0; left: 0; z-index: 10; background-color: rgba(0, 0, 0, 0.2); } .reveal .progress:after { content: ''; display: block; position: absolute; height: 20px; width: 100%; top: -20px; } .reveal .progress span { display: block; height: 100%; width: 0px; background-color: #000; -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } /********************************************* * SLIDE NUMBER *********************************************/ .reveal .slide-number { position: fixed; display: block; right: 15px; bottom: 15px; opacity: 0.5; z-index: 31; font-size: 12px; } /********************************************* * SLIDES *********************************************/ .reveal { position: relative; width: 100%; height: 100%; -ms-touch-action: none; touch-action: none; } .reveal .slides { position: absolute; width: 100%; height: 100%; top: 0; right: 0; bottom: 0; left: 0; margin: auto; overflow: visible; z-index: 1; text-align: center; -webkit-perspective: 600px; perspective: 600px; -webkit-perspective-origin: 50% 40%; perspective-origin: 50% 40%; } .reveal .slides > section { -ms-perspective: 600px; } .reveal .slides > section, .reveal .slides > section > section { display: none; position: absolute; width: 100%; padding: 20px 0px; z-index: 10; -webkit-transform-style: preserve-3d; transform-style: preserve-3d; -webkit-transition: -webkit-transform-origin 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), -webkit-transform 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), visibility 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), opacity 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); transition: -ms-transform-origin 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), transform 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), visibility 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), opacity 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); transition: transform-origin 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), transform 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), visibility 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), opacity 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } /* Global transition speed settings */ .reveal[data-transition-speed="fast"] .slides section { -webkit-transition-duration: 400ms; transition-duration: 400ms; } .reveal[data-transition-speed="slow"] .slides section { -webkit-transition-duration: 1200ms; transition-duration: 1200ms; } /* Slide-specific transition speed overrides */ .reveal .slides section[data-transition-speed="fast"] { -webkit-transition-duration: 400ms; transition-duration: 400ms; } .reveal .slides section[data-transition-speed="slow"] { -webkit-transition-duration: 1200ms; transition-duration: 1200ms; } .reveal .slides > section.stack { padding-top: 0; padding-bottom: 0; } .reveal .slides > section.present, .reveal .slides > section > section.present { display: block; z-index: 11; opacity: 1; } .reveal.center, .reveal.center .slides, .reveal.center .slides section { min-height: 0 !important; } /* Don't allow interaction with invisible slides */ .reveal .slides > section.future, .reveal .slides > section > section.future, .reveal .slides > section.past, .reveal .slides > section > section.past { pointer-events: none; } .reveal.overview .slides > section, .reveal.overview .slides > section > section { pointer-events: auto; } .reveal .slides > section.past, .reveal .slides > section.future, .reveal .slides > section > section.past, .reveal .slides > section > section.future { opacity: 0; } /********************************************* * SLIDE TRANSITION * Aliased 'linear' for backwards compatibility *********************************************/ .reveal.slide section, .reveal.linear section { -webkit-backface-visibility: hidden; backface-visibility: hidden; } .reveal .slides > section[data-transition=slide].past, .reveal.slide .slides > section:not([data-transition]).past, .reveal .slides > section[data-transition=linear].past, .reveal.linear .slides > section:not([data-transition]).past { -webkit-transform: translate(-150%, 0); -ms-transform: translate(-150%, 0); transform: translate(-150%, 0); } .reveal .slides > section[data-transition=slide].future, .reveal.slide .slides > section:not([data-transition]).future, .reveal .slides > section[data-transition=linear].future, .reveal.linear .slides > section:not([data-transition]).future { -webkit-transform: translate(150%, 0); -ms-transform: translate(150%, 0); transform: translate(150%, 0); } .reveal .slides > section > section[data-transition=slide].past, .reveal.slide .slides > section > section:not([data-transition]).past, .reveal .slides > section > section[data-transition=linear].past, .reveal.linear .slides > section > section:not([data-transition]).past { -webkit-transform: translate(0, -150%); -ms-transform: translate(0, -150%); transform: translate(0, -150%); } .reveal .slides > section > section[data-transition=slide].future, .reveal.slide .slides > section > section:not([data-transition]).future, .reveal .slides > section > section[data-transition=linear].future, .reveal.linear .slides > section > section:not([data-transition]).future { -webkit-transform: translate(0, 150%); -ms-transform: translate(0, 150%); transform: translate(0, 150%); } /********************************************* * CONVEX TRANSITION * Aliased 'default' for backwards compatibility *********************************************/ .reveal .slides > section[data-transition=default].past, .reveal.default .slides > section:not([data-transition]).past, .reveal .slides > section[data-transition=convex].past, .reveal.convex .slides > section:not([data-transition]).past { -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); } .reveal .slides > section[data-transition=default].future, .reveal.default .slides > section:not([data-transition]).future, .reveal .slides > section[data-transition=convex].future, .reveal.convex .slides > section:not([data-transition]).future { -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); } .reveal .slides > section > section[data-transition=default].past, .reveal.default .slides > section > section:not([data-transition]).past, .reveal .slides > section > section[data-transition=convex].past, .reveal.convex .slides > section > section:not([data-transition]).past { -webkit-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); } .reveal .slides > section > section[data-transition=default].future, .reveal.default .slides > section > section:not([data-transition]).future, .reveal .slides > section > section[data-transition=convex].future, .reveal.convex .slides > section > section:not([data-transition]).future { -webkit-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); } /********************************************* * CONCAVE TRANSITION *********************************************/ .reveal .slides > section[data-transition=concave].past, .reveal.concave .slides > section:not([data-transition]).past { -webkit-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); } .reveal .slides > section[data-transition=concave].future, .reveal.concave .slides > section:not([data-transition]).future { -webkit-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); } .reveal .slides > section > section[data-transition=concave].past, .reveal.concave .slides > section > section:not([data-transition]).past { -webkit-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); } .reveal .slides > section > section[data-transition=concave].future, .reveal.concave .slides > section > section:not([data-transition]).future { -webkit-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); } /********************************************* * ZOOM TRANSITION *********************************************/ .reveal .slides > section[data-transition=zoom], .reveal.zoom .slides > section:not([data-transition]) { -webkit-transition-timing-function: ease; transition-timing-function: ease; } .reveal .slides > section[data-transition=zoom].past, .reveal.zoom .slides > section:not([data-transition]).past { visibility: hidden; -webkit-transform: scale(16); -ms-transform: scale(16); transform: scale(16); } .reveal .slides > section[data-transition=zoom].future, .reveal.zoom .slides > section:not([data-transition]).future { visibility: hidden; -webkit-transform: scale(0.2); -ms-transform: scale(0.2); transform: scale(0.2); } .reveal .slides > section > section[data-transition=zoom].past, .reveal.zoom .slides > section > section:not([data-transition]).past { -webkit-transform: translate(0, -150%); -ms-transform: translate(0, -150%); transform: translate(0, -150%); } .reveal .slides > section > section[data-transition=zoom].future, .reveal.zoom .slides > section > section:not([data-transition]).future { -webkit-transform: translate(0, 150%); -ms-transform: translate(0, 150%); transform: translate(0, 150%); } /********************************************* * CUBE TRANSITION *********************************************/ .reveal.cube .slides { -webkit-perspective: 1300px; perspective: 1300px; } .reveal.cube .slides section { padding: 30px; min-height: 700px; -webkit-backface-visibility: hidden; backface-visibility: hidden; -moz-box-sizing: border-box; box-sizing: border-box; } .reveal.center.cube .slides section { min-height: 0; } .reveal.cube .slides section:not(.stack):before { content: ''; position: absolute; display: block; width: 100%; height: 100%; left: 0; top: 0; background: rgba(0, 0, 0, 0.1); border-radius: 4px; -webkit-transform: translateZ(-20px); transform: translateZ(-20px); } .reveal.cube .slides section:not(.stack):after { content: ''; position: absolute; display: block; width: 90%; height: 30px; left: 5%; bottom: 0; background: none; z-index: 1; border-radius: 4px; box-shadow: 0px 95px 25px rgba(0, 0, 0, 0.2); -webkit-transform: translateZ(-90px) rotateX(65deg); transform: translateZ(-90px) rotateX(65deg); } .reveal.cube .slides > section.stack { padding: 0; background: none; } .reveal.cube .slides > section.past { -webkit-transform-origin: 100% 0%; -ms-transform-origin: 100% 0%; transform-origin: 100% 0%; -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg); transform: translate3d(-100%, 0, 0) rotateY(-90deg); } .reveal.cube .slides > section.future { -webkit-transform-origin: 0% 0%; -ms-transform-origin: 0% 0%; transform-origin: 0% 0%; -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg); transform: translate3d(100%, 0, 0) rotateY(90deg); } .reveal.cube .slides > section > section.past { -webkit-transform-origin: 0% 100%; -ms-transform-origin: 0% 100%; transform-origin: 0% 100%; -webkit-transform: translate3d(0, -100%, 0) rotateX(90deg); transform: translate3d(0, -100%, 0) rotateX(90deg); } .reveal.cube .slides > section > section.future { -webkit-transform-origin: 0% 0%; -ms-transform-origin: 0% 0%; transform-origin: 0% 0%; -webkit-transform: translate3d(0, 100%, 0) rotateX(-90deg); transform: translate3d(0, 100%, 0) rotateX(-90deg); } /********************************************* * PAGE TRANSITION *********************************************/ .reveal.page .slides { -webkit-perspective-origin: 0% 50%; perspective-origin: 0% 50%; -webkit-perspective: 3000px; perspective: 3000px; } .reveal.page .slides section { padding: 30px; min-height: 700px; -moz-box-sizing: border-box; box-sizing: border-box; } .reveal.page .slides section.past { z-index: 12; } .reveal.page .slides section:not(.stack):before { content: ''; position: absolute; display: block; width: 100%; height: 100%; left: 0; top: 0; background: rgba(0, 0, 0, 0.1); -webkit-transform: translateZ(-20px); transform: translateZ(-20px); } .reveal.page .slides section:not(.stack):after { content: ''; position: absolute; display: block; width: 90%; height: 30px; left: 5%; bottom: 0; background: none; z-index: 1; border-radius: 4px; box-shadow: 0px 95px 25px rgba(0, 0, 0, 0.2); -webkit-transform: translateZ(-90px) rotateX(65deg); } .reveal.page .slides > section.stack { padding: 0; background: none; } .reveal.page .slides > section.past { -webkit-transform-origin: 0% 0%; -ms-transform-origin: 0% 0%; transform-origin: 0% 0%; -webkit-transform: translate3d(-40%, 0, 0) rotateY(-80deg); transform: translate3d(-40%, 0, 0) rotateY(-80deg); } .reveal.page .slides > section.future { -webkit-transform-origin: 100% 0%; -ms-transform-origin: 100% 0%; transform-origin: 100% 0%; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } .reveal.page .slides > section > section.past { -webkit-transform-origin: 0% 0%; -ms-transform-origin: 0% 0%; transform-origin: 0% 0%; -webkit-transform: translate3d(0, -40%, 0) rotateX(80deg); transform: translate3d(0, -40%, 0) rotateX(80deg); } .reveal.page .slides > section > section.future { -webkit-transform-origin: 0% 100%; -ms-transform-origin: 0% 100%; transform-origin: 0% 100%; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } /********************************************* * FADE TRANSITION *********************************************/ .reveal .slides section[data-transition=fade], .reveal.fade .slides section:not([data-transition]), .reveal.fade .slides > section > section:not([data-transition]) { -webkit-transform: none; -ms-transform: none; transform: none; -webkit-transition: opacity 0.5s; transition: opacity 0.5s; } .reveal.fade.overview .slides section, .reveal.fade.overview .slides > section > section { -webkit-transition: none; transition: none; } /********************************************* * NO TRANSITION *********************************************/ .reveal .slides section[data-transition=none], .reveal.none .slides section:not([data-transition]) { -webkit-transform: none; -ms-transform: none; transform: none; -webkit-transition: none; transition: none; } /********************************************* * OVERVIEW *********************************************/ .reveal.overview .slides { -webkit-perspective-origin: 50% 50%; perspective-origin: 50% 50%; -webkit-perspective: 700px; perspective: 700px; } .reveal.overview .slides section { height: 700px; overflow: hidden; opacity: 1 !important; visibility: visible !important; cursor: pointer; background: rgba(0, 0, 0, 0.1); -moz-box-sizing: border-box; box-sizing: border-box; } .reveal.overview .slides section, .reveal.overview-deactivating .slides section { -webkit-transition: none !important; transition: none !important; } .reveal.overview .slides section .fragment { opacity: 1; } .reveal.overview .slides section:after, .reveal.overview .slides section:before { display: none !important; } .reveal.overview .slides section > section { opacity: 1; cursor: pointer; } .reveal.overview .slides section:hover { background: rgba(0, 0, 0, 0.3); } .reveal.overview .slides section.present { background: rgba(0, 0, 0, 0.3); } .reveal.overview .slides > section.stack { padding: 0; top: 0 !important; background: none; overflow: visible; } /********************************************* * PAUSED MODE *********************************************/ .reveal .pause-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: black; visibility: hidden; opacity: 0; z-index: 100; -webkit-transition: all 1s ease; transition: all 1s ease; } .reveal.paused .pause-overlay { visibility: visible; opacity: 1; } /********************************************* * FALLBACK *********************************************/ .no-transforms { overflow-y: auto; } .no-transforms .reveal .slides { position: relative; width: 80%; height: auto !important; top: 0; left: 50%; margin: 0; text-align: center; } .no-transforms .reveal .controls, .no-transforms .reveal .progress { display: none !important; } .no-transforms .reveal .slides section { display: block !important; opacity: 1 !important; position: relative !important; height: auto; min-height: 0; top: 0; left: -50%; margin: 70px 0; -webkit-transform: none; -ms-transform: none; transform: none; } .no-transforms .reveal .slides section section { left: 0; } .reveal .no-transition, .reveal .no-transition * { -webkit-transition: none !important; transition: none !important; } /********************************************* * PER-SLIDE BACKGROUNDS *********************************************/ .reveal > .backgrounds { position: absolute; width: 100%; height: 100%; top: 0; left: 0; -webkit-perspective: 600px; perspective: 600px; } .reveal .slide-background { display: none; position: absolute; width: 100%; height: 100%; opacity: 0; visibility: hidden; background-color: rgba(0, 0, 0, 0); background-position: 50% 50%; background-repeat: no-repeat; background-size: cover; -webkit-transition: all 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); transition: all 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } .reveal .slide-background.stack { display: block; } .reveal .slide-background.present { opacity: 1; visibility: visible; } .print-pdf .reveal .slide-background { opacity: 1 !important; visibility: visible !important; } /* Video backgrounds */ .reveal .slide-background video { position: absolute; width: 100%; height: 100%; max-width: none; max-height: none; top: 0; left: 0; } /* Immediate transition style */ .reveal[data-background-transition=none] > .backgrounds .slide-background, .reveal > .backgrounds .slide-background[data-background-transition=none] { -webkit-transition: none; transition: none; } /* Slide */ .reveal[data-background-transition=slide] > .backgrounds .slide-background, .reveal > .backgrounds .slide-background[data-background-transition=slide] { opacity: 1; -webkit-backface-visibility: hidden; backface-visibility: hidden; } .reveal[data-background-transition=slide] > .backgrounds .slide-background.past, .reveal > .backgrounds .slide-background.past[data-background-transition=slide] { -webkit-transform: translate(-100%, 0); -ms-transform: translate(-100%, 0); transform: translate(-100%, 0); } .reveal[data-background-transition=slide] > .backgrounds .slide-background.future, .reveal > .backgrounds .slide-background.future[data-background-transition=slide] { -webkit-transform: translate(100%, 0); -ms-transform: translate(100%, 0); transform: translate(100%, 0); } .reveal[data-background-transition=slide] > .backgrounds .slide-background > .slide-background.past, .reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=slide] { -webkit-transform: translate(0, -100%); -ms-transform: translate(0, -100%); transform: translate(0, -100%); } .reveal[data-background-transition=slide] > .backgrounds .slide-background > .slide-background.future, .reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=slide] { -webkit-transform: translate(0, 100%); -ms-transform: translate(0, 100%); transform: translate(0, 100%); } /* Convex */ .reveal[data-background-transition=convex] > .backgrounds .slide-background.past, .reveal > .backgrounds .slide-background.past[data-background-transition=convex] { opacity: 0; -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); } .reveal[data-background-transition=convex] > .backgrounds .slide-background.future, .reveal > .backgrounds .slide-background.future[data-background-transition=convex] { opacity: 0; -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); } .reveal[data-background-transition=convex] > .backgrounds .slide-background > .slide-background.past, .reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=convex] { opacity: 0; -webkit-transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0); transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0); } .reveal[data-background-transition=convex] > .backgrounds .slide-background > .slide-background.future, .reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=convex] { opacity: 0; -webkit-transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0); transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0); } /* Concave */ .reveal[data-background-transition=concave] > .backgrounds .slide-background.past, .reveal > .backgrounds .slide-background.past[data-background-transition=concave] { opacity: 0; -webkit-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); } .reveal[data-background-transition=concave] > .backgrounds .slide-background.future, .reveal > .backgrounds .slide-background.future[data-background-transition=concave] { opacity: 0; -webkit-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); } .reveal[data-background-transition=concave] > .backgrounds .slide-background > .slide-background.past, .reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=concave] { opacity: 0; -webkit-transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0); transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0); } .reveal[data-background-transition=concave] > .backgrounds .slide-background > .slide-background.future, .reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=concave] { opacity: 0; -webkit-transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0); transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0); } /* Zoom */ .reveal[data-background-transition=zoom] > .backgrounds .slide-background, .reveal > .backgrounds .slide-background[data-background-transition=zoom] { -webkit-transition-timing-function: ease; transition-timing-function: ease; } .reveal[data-background-transition=zoom] > .backgrounds .slide-background.past, .reveal > .backgrounds .slide-background.past[data-background-transition=zoom] { opacity: 0; visibility: hidden; -webkit-transform: scale(16); -ms-transform: scale(16); transform: scale(16); } .reveal[data-background-transition=zoom] > .backgrounds .slide-background.future, .reveal > .backgrounds .slide-background.future[data-background-transition=zoom] { opacity: 0; visibility: hidden; -webkit-transform: scale(0.2); -ms-transform: scale(0.2); transform: scale(0.2); } .reveal[data-background-transition=zoom] > .backgrounds .slide-background > .slide-background.past, .reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=zoom] { opacity: 0; visibility: hidden; -webkit-transform: scale(16); -ms-transform: scale(16); transform: scale(16); } .reveal[data-background-transition=zoom] > .backgrounds .slide-background > .slide-background.future, .reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=zoom] { opacity: 0; visibility: hidden; -webkit-transform: scale(0.2); -ms-transform: scale(0.2); transform: scale(0.2); } /* Global transition speed settings */ .reveal[data-transition-speed="fast"] > .backgrounds .slide-background { -webkit-transition-duration: 400ms; transition-duration: 400ms; } .reveal[data-transition-speed="slow"] > .backgrounds .slide-background { -webkit-transition-duration: 1200ms; transition-duration: 1200ms; } /********************************************* * RTL SUPPORT *********************************************/ .reveal.rtl .slides, .reveal.rtl .slides h1, .reveal.rtl .slides h2, .reveal.rtl .slides h3, .reveal.rtl .slides h4, .reveal.rtl .slides h5, .reveal.rtl .slides h6 { direction: rtl; font-family: sans-serif; } .reveal.rtl pre, .reveal.rtl code { direction: ltr; } .reveal.rtl ol, .reveal.rtl ul { text-align: right; } .reveal.rtl .progress span { float: right; } /********************************************* * PARALLAX BACKGROUND *********************************************/ .reveal.has-parallax-background .backgrounds { -webkit-transition: all 0.8s ease; transition: all 0.8s ease; } /* Global transition speed settings */ .reveal.has-parallax-background[data-transition-speed="fast"] .backgrounds { -webkit-transition-duration: 400ms; transition-duration: 400ms; } .reveal.has-parallax-background[data-transition-speed="slow"] .backgrounds { -webkit-transition-duration: 1200ms; transition-duration: 1200ms; } /********************************************* * LINK PREVIEW OVERLAY *********************************************/ .reveal .overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 1000; background: rgba(0, 0, 0, 0.9); opacity: 0; visibility: hidden; -webkit-transition: all 0.3s ease; transition: all 0.3s ease; } .reveal .overlay.visible { opacity: 1; visibility: visible; } .reveal .overlay .spinner { position: absolute; display: block; top: 50%; left: 50%; width: 32px; height: 32px; margin: -16px 0 0 -16px; z-index: 10; background-image: url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D); visibility: visible; opacity: 0.6; -webkit-transition: all 0.3s ease; transition: all 0.3s ease; } .reveal .overlay header { position: absolute; left: 0; top: 0; width: 100%; height: 40px; z-index: 2; border-bottom: 1px solid #222; } .reveal .overlay header a { display: inline-block; width: 40px; height: 40px; padding: 0 10px; float: right; opacity: 0.6; -moz-box-sizing: border-box; box-sizing: border-box; } .reveal .overlay header a:hover { opacity: 1; } .reveal .overlay header a .icon { display: inline-block; width: 20px; height: 20px; background-position: 50% 50%; background-size: 100%; background-repeat: no-repeat; } .reveal .overlay header a.close .icon { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC); } .reveal .overlay header a.external .icon { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==); } .reveal .overlay .viewport { position: absolute; top: 40px; right: 0; bottom: 0; left: 0; } .reveal .overlay.overlay-preview .viewport iframe { width: 100%; height: 100%; max-width: 100%; max-height: 100%; border: 0; opacity: 0; visibility: hidden; -webkit-transition: all 0.3s ease; transition: all 0.3s ease; } .reveal .overlay.overlay-preview.loaded .viewport iframe { opacity: 1; visibility: visible; } .reveal .overlay.overlay-preview.loaded .spinner { opacity: 0; visibility: hidden; -webkit-transform: scale(0.2); -ms-transform: scale(0.2); transform: scale(0.2); } .reveal .overlay.overlay-help .viewport { overflow: auto; color: #fff; } .reveal .overlay.overlay-help .viewport .viewport-inner { width: 600px; margin: 0 auto; padding: 60px; text-align: center; letter-spacing: normal; } .reveal .overlay.overlay-help .viewport .viewport-inner .title { font-size: 20px; } .reveal .overlay.overlay-help .viewport .viewport-inner table { border: 1px solid #fff; border-collapse: collapse; font-size: 14px; } .reveal .overlay.overlay-help .viewport .viewport-inner table th, .reveal .overlay.overlay-help .viewport .viewport-inner table td { width: 200px; padding: 10px; border: 1px solid #fff; vertical-align: middle; } .reveal .overlay.overlay-help .viewport .viewport-inner table th { padding-top: 20px; padding-bottom: 20px; } /********************************************* * PLAYBACK COMPONENT *********************************************/ .reveal .playback { position: fixed; left: 15px; bottom: 15px; z-index: 30; cursor: pointer; -webkit-transition: all 400ms ease; transition: all 400ms ease; } .reveal.overview .playback { opacity: 0; visibility: hidden; } /********************************************* * ROLLING LINKS *********************************************/ .reveal .roll { display: inline-block; line-height: 1.2; overflow: hidden; vertical-align: top; -webkit-perspective: 400px; perspective: 400px; -webkit-perspective-origin: 50% 50%; perspective-origin: 50% 50%; } .reveal .roll:hover { background: none; text-shadow: none; } .reveal .roll span { display: block; position: relative; padding: 0 2px; pointer-events: none; -webkit-transition: all 400ms ease; transition: all 400ms ease; -webkit-transform-origin: 50% 0%; -ms-transform-origin: 50% 0%; transform-origin: 50% 0%; -webkit-transform-style: preserve-3d; transform-style: preserve-3d; -webkit-backface-visibility: hidden; backface-visibility: hidden; } .reveal .roll:hover span { background: rgba(0, 0, 0, 0.5); -webkit-transform: translate3d(0px, 0px, -45px) rotateX(90deg); transform: translate3d(0px, 0px, -45px) rotateX(90deg); } .reveal .roll span:after { content: attr(data-title); display: block; position: absolute; left: 0; top: 0; padding: 0 2px; -webkit-backface-visibility: hidden; backface-visibility: hidden; -webkit-transform-origin: 50% 0%; -ms-transform-origin: 50% 0%; transform-origin: 50% 0%; -webkit-transform: translate3d(0px, 110%, 0px) rotateX(-90deg); transform: translate3d(0px, 110%, 0px) rotateX(-90deg); } /********************************************* * SPEAKER NOTES *********************************************/ .reveal aside.notes { display: none; } /********************************************* * ZOOM PLUGIN *********************************************/ .zoomed .reveal *, .zoomed .reveal *:before, .zoomed .reveal *:after { -webkit-backface-visibility: visible !important; backface-visibility: visible !important; } .zoomed .reveal .progress, .zoomed .reveal .controls { opacity: 0; } .zoomed .reveal .roll span { background: none; } .zoomed .reveal .roll span:after { visibility: hidden; } ================================================ FILE: presentation/css/reveal.scss ================================================ /*! * reveal.js * http://lab.hakim.se/reveal-js * MIT licensed * * Copyright (C) 2015 Hakim El Hattab, http://hakim.se */ /********************************************* * RESET STYLES *********************************************/ html, body, .reveal div, .reveal span, .reveal applet, .reveal object, .reveal iframe, .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6, .reveal p, .reveal blockquote, .reveal pre, .reveal a, .reveal abbr, .reveal acronym, .reveal address, .reveal big, .reveal cite, .reveal code, .reveal del, .reveal dfn, .reveal em, .reveal img, .reveal ins, .reveal kbd, .reveal q, .reveal s, .reveal samp, .reveal small, .reveal strike, .reveal strong, .reveal sub, .reveal sup, .reveal tt, .reveal var, .reveal b, .reveal u, .reveal center, .reveal dl, .reveal dt, .reveal dd, .reveal ol, .reveal ul, .reveal li, .reveal fieldset, .reveal form, .reveal label, .reveal legend, .reveal table, .reveal caption, .reveal tbody, .reveal tfoot, .reveal thead, .reveal tr, .reveal th, .reveal td, .reveal article, .reveal aside, .reveal canvas, .reveal details, .reveal embed, .reveal figure, .reveal figcaption, .reveal footer, .reveal header, .reveal hgroup, .reveal menu, .reveal nav, .reveal output, .reveal ruby, .reveal section, .reveal summary, .reveal time, .reveal mark, .reveal audio, video { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; } .reveal article, .reveal aside, .reveal details, .reveal figcaption, .reveal figure, .reveal footer, .reveal header, .reveal hgroup, .reveal menu, .reveal nav, .reveal section { display: block; } /********************************************* * GLOBAL STYLES *********************************************/ html, body { width: 100%; height: 100%; overflow: hidden; } body { position: relative; line-height: 1; background-color: #fff; color: #000; } ::-moz-selection { background: #FF5E99; color: #fff; text-shadow: none; } ::selection { background: #FF5E99; color: #fff; text-shadow: none; } /********************************************* * VIEW FRAGMENTS *********************************************/ .reveal .slides section .fragment { opacity: 0; visibility: hidden; transition: all .2s ease; &.visible { opacity: 1; visibility: visible; } } .reveal .slides section .fragment.grow { opacity: 1; visibility: visible; &.visible { transform: scale( 1.3 ); } } .reveal .slides section .fragment.shrink { opacity: 1; visibility: visible; &.visible { transform: scale( 0.7 ); } } .reveal .slides section .fragment.zoom-in { transform: scale( 0.1 ); &.visible { transform: scale( 1 ); } } .reveal .slides section .fragment.roll-in { transform: rotateX( 90deg ); &.visible { transform: rotateX( 0 ); } } .reveal .slides section .fragment.fade-out { opacity: 1; visibility: visible; &.visible { opacity: 0; visibility: hidden; } } .reveal .slides section .fragment.semi-fade-out { opacity: 1; visibility: visible; &.visible { opacity: 0.5; visibility: visible; } } .reveal .slides section .fragment.strike { opacity: 1; &.visible { text-decoration: line-through; } } .reveal .slides section .fragment.current-visible { opacity: 0; visibility: hidden; &.current-fragment { opacity: 1; visibility: visible; } } .reveal .slides section .fragment.highlight-red, .reveal .slides section .fragment.highlight-current-red, .reveal .slides section .fragment.highlight-green, .reveal .slides section .fragment.highlight-current-green, .reveal .slides section .fragment.highlight-blue, .reveal .slides section .fragment.highlight-current-blue { opacity: 1; visibility: visible; } .reveal .slides section .fragment.highlight-red.visible { color: #ff2c2d } .reveal .slides section .fragment.highlight-green.visible { color: #17ff2e; } .reveal .slides section .fragment.highlight-blue.visible { color: #1b91ff; } .reveal .slides section .fragment.highlight-current-red.current-fragment { color: #ff2c2d } .reveal .slides section .fragment.highlight-current-green.current-fragment { color: #17ff2e; } .reveal .slides section .fragment.highlight-current-blue.current-fragment { color: #1b91ff; } /********************************************* * DEFAULT ELEMENT STYLES *********************************************/ /* Fixes issue in Chrome where italic fonts did not appear when printing to PDF */ .reveal:after { content: ''; font-style: italic; } .reveal iframe { z-index: 1; } /** Prevents layering issues in certain browser/transition combinations */ .reveal a { position: relative; } .reveal .stretch { max-width: none; max-height: none; } .reveal pre.stretch code { height: 100%; max-height: 100%; box-sizing: border-box; } /********************************************* * CONTROLS *********************************************/ .reveal .controls { display: none; position: fixed; width: 110px; height: 110px; z-index: 30; right: 10px; bottom: 10px; -webkit-user-select: none; } .reveal .controls div { position: absolute; opacity: 0.05; width: 0; height: 0; border: 12px solid transparent; transform: scale(.9999); transition: all 0.2s ease; -webkit-tap-highlight-color: rgba( 0, 0, 0, 0 ); } .reveal .controls div.enabled { opacity: 0.7; cursor: pointer; } .reveal .controls div.enabled:active { margin-top: 1px; } .reveal .controls div.navigate-left { top: 42px; border-right-width: 22px; border-right-color: #000; } .reveal .controls div.navigate-left.fragmented { opacity: 0.3; } .reveal .controls div.navigate-right { left: 74px; top: 42px; border-left-width: 22px; border-left-color: #000; } .reveal .controls div.navigate-right.fragmented { opacity: 0.3; } .reveal .controls div.navigate-up { left: 42px; border-bottom-width: 22px; border-bottom-color: #000; } .reveal .controls div.navigate-up.fragmented { opacity: 0.3; } .reveal .controls div.navigate-down { left: 42px; top: 74px; border-top-width: 22px; border-top-color: #000; } .reveal .controls div.navigate-down.fragmented { opacity: 0.3; } /********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { position: fixed; display: none; height: 3px; width: 100%; bottom: 0; left: 0; z-index: 10; background-color: rgba( 0, 0, 0, 0.2 ); } .reveal .progress:after { content: ''; display: block; position: absolute; height: 20px; width: 100%; top: -20px; } .reveal .progress span { display: block; height: 100%; width: 0px; background-color: #000; transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); } /********************************************* * SLIDE NUMBER *********************************************/ .reveal .slide-number { position: fixed; display: block; right: 15px; bottom: 15px; opacity: 0.5; z-index: 31; font-size: 12px; } /********************************************* * SLIDES *********************************************/ .reveal { position: relative; width: 100%; height: 100%; touch-action: none; } .reveal .slides { position: absolute; width: 100%; height: 100%; top: 0; right: 0; bottom: 0; left: 0; margin: auto; overflow: visible; z-index: 1; text-align: center; perspective: 600px; perspective-origin: 50% 40%; } .reveal .slides>section { -ms-perspective: 600px; } .reveal .slides>section, .reveal .slides>section>section { display: none; position: absolute; width: 100%; padding: 20px 0px; z-index: 10; transform-style: preserve-3d; transition: transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); } /* Global transition speed settings */ .reveal[data-transition-speed="fast"] .slides section { transition-duration: 400ms; } .reveal[data-transition-speed="slow"] .slides section { transition-duration: 1200ms; } /* Slide-specific transition speed overrides */ .reveal .slides section[data-transition-speed="fast"] { transition-duration: 400ms; } .reveal .slides section[data-transition-speed="slow"] { transition-duration: 1200ms; } .reveal .slides>section.stack { padding-top: 0; padding-bottom: 0; } .reveal .slides>section.present, .reveal .slides>section>section.present { display: block; z-index: 11; opacity: 1; } .reveal.center, .reveal.center .slides, .reveal.center .slides section { min-height: 0 !important; } /* Don't allow interaction with invisible slides */ .reveal .slides>section.future, .reveal .slides>section>section.future, .reveal .slides>section.past, .reveal .slides>section>section.past { pointer-events: none; } .reveal.overview .slides>section, .reveal.overview .slides>section>section { pointer-events: auto; } .reveal .slides>section.past, .reveal .slides>section.future, .reveal .slides>section>section.past, .reveal .slides>section>section.future { opacity: 0; } /********************************************* * SLIDE TRANSITION * Aliased 'linear' for backwards compatibility *********************************************/ .reveal.slide section, .reveal.linear section { backface-visibility: hidden; } .reveal .slides>section[data-transition=slide].past, .reveal.slide .slides>section:not([data-transition]).past, .reveal .slides>section[data-transition=linear].past, .reveal.linear .slides>section:not([data-transition]).past { transform: translate(-150%, 0); } .reveal .slides>section[data-transition=slide].future, .reveal.slide .slides>section:not([data-transition]).future, .reveal .slides>section[data-transition=linear].future, .reveal.linear .slides>section:not([data-transition]).future { transform: translate(150%, 0); } .reveal .slides>section>section[data-transition=slide].past, .reveal.slide .slides>section>section:not([data-transition]).past, .reveal .slides>section>section[data-transition=linear].past, .reveal.linear .slides>section>section:not([data-transition]).past { transform: translate(0, -150%); } .reveal .slides>section>section[data-transition=slide].future, .reveal.slide .slides>section>section:not([data-transition]).future, .reveal .slides>section>section[data-transition=linear].future, .reveal.linear .slides>section>section:not([data-transition]).future { transform: translate(0, 150%); } /********************************************* * CONVEX TRANSITION * Aliased 'default' for backwards compatibility *********************************************/ .reveal .slides>section[data-transition=default].past, .reveal.default .slides>section:not([data-transition]).past, .reveal .slides>section[data-transition=convex].past, .reveal.convex .slides>section:not([data-transition]).past { transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); } .reveal .slides>section[data-transition=default].future, .reveal.default .slides>section:not([data-transition]).future, .reveal .slides>section[data-transition=convex].future, .reveal.convex .slides>section:not([data-transition]).future { transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); } .reveal .slides>section>section[data-transition=default].past, .reveal.default .slides>section>section:not([data-transition]).past, .reveal .slides>section>section[data-transition=convex].past, .reveal.convex .slides>section>section:not([data-transition]).past { transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); } .reveal .slides>section>section[data-transition=default].future, .reveal.default .slides>section>section:not([data-transition]).future, .reveal .slides>section>section[data-transition=convex].future, .reveal.convex .slides>section>section:not([data-transition]).future { transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); } /********************************************* * CONCAVE TRANSITION *********************************************/ .reveal .slides>section[data-transition=concave].past, .reveal.concave .slides>section:not([data-transition]).past { transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); } .reveal .slides>section[data-transition=concave].future, .reveal.concave .slides>section:not([data-transition]).future { transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); } .reveal .slides>section>section[data-transition=concave].past, .reveal.concave .slides>section>section:not([data-transition]).past { transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); } .reveal .slides>section>section[data-transition=concave].future, .reveal.concave .slides>section>section:not([data-transition]).future { transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); } /********************************************* * ZOOM TRANSITION *********************************************/ .reveal .slides>section[data-transition=zoom], .reveal.zoom .slides>section:not([data-transition]) { transition-timing-function: ease; } .reveal .slides>section[data-transition=zoom].past, .reveal.zoom .slides>section:not([data-transition]).past { visibility: hidden; transform: scale(16); } .reveal .slides>section[data-transition=zoom].future, .reveal.zoom .slides>section:not([data-transition]).future { visibility: hidden; transform: scale(0.2); } .reveal .slides>section>section[data-transition=zoom].past, .reveal.zoom .slides>section>section:not([data-transition]).past { transform: translate(0, -150%); } .reveal .slides>section>section[data-transition=zoom].future, .reveal.zoom .slides>section>section:not([data-transition]).future { transform: translate(0, 150%); } /********************************************* * CUBE TRANSITION *********************************************/ .reveal.cube .slides { perspective: 1300px; } .reveal.cube .slides section { padding: 30px; min-height: 700px; backface-visibility: hidden; box-sizing: border-box; } .reveal.center.cube .slides section { min-height: 0; } .reveal.cube .slides section:not(.stack):before { content: ''; position: absolute; display: block; width: 100%; height: 100%; left: 0; top: 0; background: rgba(0,0,0,0.1); border-radius: 4px; transform: translateZ( -20px ); } .reveal.cube .slides section:not(.stack):after { content: ''; position: absolute; display: block; width: 90%; height: 30px; left: 5%; bottom: 0; background: none; z-index: 1; border-radius: 4px; box-shadow: 0px 95px 25px rgba(0,0,0,0.2); transform: translateZ(-90px) rotateX( 65deg ); } .reveal.cube .slides>section.stack { padding: 0; background: none; } .reveal.cube .slides>section.past { transform-origin: 100% 0%; transform: translate3d(-100%, 0, 0) rotateY(-90deg); } .reveal.cube .slides>section.future { transform-origin: 0% 0%; transform: translate3d(100%, 0, 0) rotateY(90deg); } .reveal.cube .slides>section>section.past { transform-origin: 0% 100%; transform: translate3d(0, -100%, 0) rotateX(90deg); } .reveal.cube .slides>section>section.future { transform-origin: 0% 0%; transform: translate3d(0, 100%, 0) rotateX(-90deg); } /********************************************* * PAGE TRANSITION *********************************************/ .reveal.page .slides { perspective-origin: 0% 50%; perspective: 3000px; } .reveal.page .slides section { padding: 30px; min-height: 700px; box-sizing: border-box; } .reveal.page .slides section.past { z-index: 12; } .reveal.page .slides section:not(.stack):before { content: ''; position: absolute; display: block; width: 100%; height: 100%; left: 0; top: 0; background: rgba(0,0,0,0.1); transform: translateZ( -20px ); } .reveal.page .slides section:not(.stack):after { content: ''; position: absolute; display: block; width: 90%; height: 30px; left: 5%; bottom: 0; background: none; z-index: 1; border-radius: 4px; box-shadow: 0px 95px 25px rgba(0,0,0,0.2); -webkit-transform: translateZ(-90px) rotateX( 65deg ); } .reveal.page .slides>section.stack { padding: 0; background: none; } .reveal.page .slides>section.past { transform-origin: 0% 0%; transform: translate3d(-40%, 0, 0) rotateY(-80deg); } .reveal.page .slides>section.future { transform-origin: 100% 0%; transform: translate3d(0, 0, 0); } .reveal.page .slides>section>section.past { transform-origin: 0% 0%; transform: translate3d(0, -40%, 0) rotateX(80deg); } .reveal.page .slides>section>section.future { transform-origin: 0% 100%; transform: translate3d(0, 0, 0); } /********************************************* * FADE TRANSITION *********************************************/ .reveal .slides section[data-transition=fade], .reveal.fade .slides section:not([data-transition]), .reveal.fade .slides>section>section:not([data-transition]) { transform: none; transition: opacity 0.5s; } .reveal.fade.overview .slides section, .reveal.fade.overview .slides>section>section { transition: none; } /********************************************* * NO TRANSITION *********************************************/ .reveal .slides section[data-transition=none], .reveal.none .slides section:not([data-transition]) { transform: none; transition: none; } /********************************************* * OVERVIEW *********************************************/ .reveal.overview .slides { perspective-origin: 50% 50%; perspective: 700px; } .reveal.overview .slides section { height: 700px; overflow: hidden; opacity: 1 !important; visibility: visible !important; cursor: pointer; background: rgba(0,0,0,0.1); box-sizing: border-box; } .reveal.overview .slides section, .reveal.overview-deactivating .slides section { transition: none !important; } .reveal.overview .slides section .fragment { opacity: 1; } .reveal.overview .slides section:after, .reveal.overview .slides section:before { display: none !important; } .reveal.overview .slides section>section { opacity: 1; cursor: pointer; } .reveal.overview .slides section:hover { background: rgba(0,0,0,0.3); } .reveal.overview .slides section.present { background: rgba(0,0,0,0.3); } .reveal.overview .slides>section.stack { padding: 0; top: 0 !important; background: none; overflow: visible; } /********************************************* * PAUSED MODE *********************************************/ .reveal .pause-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: black; visibility: hidden; opacity: 0; z-index: 100; transition: all 1s ease; } .reveal.paused .pause-overlay { visibility: visible; opacity: 1; } /********************************************* * FALLBACK *********************************************/ .no-transforms { overflow-y: auto; } .no-transforms .reveal .slides { position: relative; width: 80%; height: auto !important; top: 0; left: 50%; margin: 0; text-align: center; } .no-transforms .reveal .controls, .no-transforms .reveal .progress { display: none !important; } .no-transforms .reveal .slides section { display: block !important; opacity: 1 !important; position: relative !important; height: auto; min-height: 0; top: 0; left: -50%; margin: 70px 0; transform: none; } .no-transforms .reveal .slides section section { left: 0; } .reveal .no-transition, .reveal .no-transition * { transition: none !important; } /********************************************* * PER-SLIDE BACKGROUNDS *********************************************/ .reveal>.backgrounds { position: absolute; width: 100%; height: 100%; top: 0; left: 0; perspective: 600px; } .reveal .slide-background { display: none; position: absolute; width: 100%; height: 100%; opacity: 0; visibility: hidden; background-color: rgba( 0, 0, 0, 0 ); background-position: 50% 50%; background-repeat: no-repeat; background-size: cover; transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); } .reveal .slide-background.stack { display: block; } .reveal .slide-background.present { opacity: 1; visibility: visible; } .print-pdf .reveal .slide-background { opacity: 1 !important; visibility: visible !important; } /* Video backgrounds */ .reveal .slide-background video { position: absolute; width: 100%; height: 100%; max-width: none; max-height: none; top: 0; left: 0; } /* Immediate transition style */ .reveal[data-background-transition=none]>.backgrounds .slide-background, .reveal>.backgrounds .slide-background[data-background-transition=none] { transition: none; } /* Slide */ .reveal[data-background-transition=slide]>.backgrounds .slide-background, .reveal>.backgrounds .slide-background[data-background-transition=slide] { opacity: 1; backface-visibility: hidden; } .reveal[data-background-transition=slide]>.backgrounds .slide-background.past, .reveal>.backgrounds .slide-background.past[data-background-transition=slide] { transform: translate(-100%, 0); } .reveal[data-background-transition=slide]>.backgrounds .slide-background.future, .reveal>.backgrounds .slide-background.future[data-background-transition=slide] { transform: translate(100%, 0); } .reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past, .reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide] { transform: translate(0, -100%); } .reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future, .reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide] { transform: translate(0, 100%); } /* Convex */ .reveal[data-background-transition=convex]>.backgrounds .slide-background.past, .reveal>.backgrounds .slide-background.past[data-background-transition=convex] { opacity: 0; transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); } .reveal[data-background-transition=convex]>.backgrounds .slide-background.future, .reveal>.backgrounds .slide-background.future[data-background-transition=convex] { opacity: 0; transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); } .reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.past, .reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=convex] { opacity: 0; transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0); } .reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.future, .reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=convex] { opacity: 0; transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0); } /* Concave */ .reveal[data-background-transition=concave]>.backgrounds .slide-background.past, .reveal>.backgrounds .slide-background.past[data-background-transition=concave] { opacity: 0; transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); } .reveal[data-background-transition=concave]>.backgrounds .slide-background.future, .reveal>.backgrounds .slide-background.future[data-background-transition=concave] { opacity: 0; transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); } .reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.past, .reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=concave] { opacity: 0; transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0); } .reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.future, .reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=concave] { opacity: 0; transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0); } /* Zoom */ .reveal[data-background-transition=zoom]>.backgrounds .slide-background, .reveal>.backgrounds .slide-background[data-background-transition=zoom] { transition-timing-function: ease; } .reveal[data-background-transition=zoom]>.backgrounds .slide-background.past, .reveal>.backgrounds .slide-background.past[data-background-transition=zoom] { opacity: 0; visibility: hidden; transform: scale(16); } .reveal[data-background-transition=zoom]>.backgrounds .slide-background.future, .reveal>.backgrounds .slide-background.future[data-background-transition=zoom] { opacity: 0; visibility: hidden; transform: scale(0.2); } .reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.past, .reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=zoom] { opacity: 0; visibility: hidden; transform: scale(16); } .reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.future, .reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=zoom] { opacity: 0; visibility: hidden; transform: scale(0.2); } /* Global transition speed settings */ .reveal[data-transition-speed="fast"]>.backgrounds .slide-background { transition-duration: 400ms; } .reveal[data-transition-speed="slow"]>.backgrounds .slide-background { transition-duration: 1200ms; } /********************************************* * RTL SUPPORT *********************************************/ .reveal.rtl .slides, .reveal.rtl .slides h1, .reveal.rtl .slides h2, .reveal.rtl .slides h3, .reveal.rtl .slides h4, .reveal.rtl .slides h5, .reveal.rtl .slides h6 { direction: rtl; font-family: sans-serif; } .reveal.rtl pre, .reveal.rtl code { direction: ltr; } .reveal.rtl ol, .reveal.rtl ul { text-align: right; } .reveal.rtl .progress span { float: right } /********************************************* * PARALLAX BACKGROUND *********************************************/ .reveal.has-parallax-background .backgrounds { transition: all 0.8s ease; } /* Global transition speed settings */ .reveal.has-parallax-background[data-transition-speed="fast"] .backgrounds { transition-duration: 400ms; } .reveal.has-parallax-background[data-transition-speed="slow"] .backgrounds { transition-duration: 1200ms; } /********************************************* * LINK PREVIEW OVERLAY *********************************************/ .reveal .overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 1000; background: rgba( 0, 0, 0, 0.9 ); opacity: 0; visibility: hidden; transition: all 0.3s ease; } .reveal .overlay.visible { opacity: 1; visibility: visible; } .reveal .overlay .spinner { position: absolute; display: block; top: 50%; left: 50%; width: 32px; height: 32px; margin: -16px 0 0 -16px; z-index: 10; background-image: url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D); visibility: visible; opacity: 0.6; transition: all 0.3s ease; } .reveal .overlay header { position: absolute; left: 0; top: 0; width: 100%; height: 40px; z-index: 2; border-bottom: 1px solid #222; } .reveal .overlay header a { display: inline-block; width: 40px; height: 40px; padding: 0 10px; float: right; opacity: 0.6; box-sizing: border-box; } .reveal .overlay header a:hover { opacity: 1; } .reveal .overlay header a .icon { display: inline-block; width: 20px; height: 20px; background-position: 50% 50%; background-size: 100%; background-repeat: no-repeat; } .reveal .overlay header a.close .icon { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC); } .reveal .overlay header a.external .icon { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==); } .reveal .overlay .viewport { position: absolute; top: 40px; right: 0; bottom: 0; left: 0; } .reveal .overlay.overlay-preview .viewport iframe { width: 100%; height: 100%; max-width: 100%; max-height: 100%; border: 0; opacity: 0; visibility: hidden; transition: all 0.3s ease; } .reveal .overlay.overlay-preview.loaded .viewport iframe { opacity: 1; visibility: visible; } .reveal .overlay.overlay-preview.loaded .spinner { opacity: 0; visibility: hidden; transform: scale(0.2); } .reveal .overlay.overlay-help .viewport { overflow: auto; color: #fff; } .reveal .overlay.overlay-help .viewport .viewport-inner { width: 600px; margin: 0 auto; padding: 60px; text-align: center; letter-spacing: normal; } .reveal .overlay.overlay-help .viewport .viewport-inner .title { font-size: 20px; } .reveal .overlay.overlay-help .viewport .viewport-inner table { border: 1px solid #fff; border-collapse: collapse; font-size: 14px; } .reveal .overlay.overlay-help .viewport .viewport-inner table th, .reveal .overlay.overlay-help .viewport .viewport-inner table td { width: 200px; padding: 10px; border: 1px solid #fff; vertical-align: middle; } .reveal .overlay.overlay-help .viewport .viewport-inner table th { padding-top: 20px; padding-bottom: 20px; } /********************************************* * PLAYBACK COMPONENT *********************************************/ .reveal .playback { position: fixed; left: 15px; bottom: 15px; z-index: 30; cursor: pointer; transition: all 400ms ease; } .reveal.overview .playback { opacity: 0; visibility: hidden; } /********************************************* * ROLLING LINKS *********************************************/ .reveal .roll { display: inline-block; line-height: 1.2; overflow: hidden; vertical-align: top; perspective: 400px; perspective-origin: 50% 50%; } .reveal .roll:hover { background: none; text-shadow: none; } .reveal .roll span { display: block; position: relative; padding: 0 2px; pointer-events: none; transition: all 400ms ease; transform-origin: 50% 0%; transform-style: preserve-3d; backface-visibility: hidden; } .reveal .roll:hover span { background: rgba(0,0,0,0.5); transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg ); } .reveal .roll span:after { content: attr(data-title); display: block; position: absolute; left: 0; top: 0; padding: 0 2px; backface-visibility: hidden; transform-origin: 50% 0%; transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg ); } /********************************************* * SPEAKER NOTES *********************************************/ .reveal aside.notes { display: none; } /********************************************* * ZOOM PLUGIN *********************************************/ .zoomed .reveal *, .zoomed .reveal *:before, .zoomed .reveal *:after { backface-visibility: visible !important; } .zoomed .reveal .progress, .zoomed .reveal .controls { opacity: 0; } .zoomed .reveal .roll span { background: none; } .zoomed .reveal .roll span:after { visibility: hidden; } ================================================ FILE: presentation/css/theme/README.md ================================================ ## Dependencies Themes are written using Sass to keep things modular and reduce the need for repeated selectors across files. Make sure that you have the reveal.js development environment including the Grunt dependencies installed before proceding: https://github.com/hakimel/reveal.js#full-setup You also need to install Ruby and then Sass (with `gem install sass`). ## Creating a Theme To create your own theme, start by duplicating any ```.scss``` file in [/css/theme/source](https://github.com/hakimel/reveal.js/blob/master/css/theme/source) and adding it to the compilation list in the [Gruntfile](https://github.com/hakimel/reveal.js/blob/master/Gruntfile.js). Each theme file does four things in the following order: 1. **Include [/css/theme/template/mixins.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/mixins.scss)** Shared utility functions. 2. **Include [/css/theme/template/settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss)** Declares a set of custom variables that the template file (step 4) expects. Can be overridden in step 3. 3. **Override** This is where you override the default theme. Either by specifying variables (see [settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss) for reference) or by adding full selectors with hardcoded styles. 4. **Include [/css/theme/template/theme.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/theme.scss)** The template theme file which will generate final CSS output based on the currently defined variables. When you are done, run `grunt css-themes` to compile the Sass file to CSS and you are ready to use your new theme. ================================================ FILE: presentation/css/theme/beige.css ================================================ @import url(../../lib/font/league-gothic/league-gothic.css); @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); /** * Beige theme for reveal.js. * * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se */ /********************************************* * GLOBAL STYLES *********************************************/ body { background: #f7f2d3; background: -moz-radial-gradient(center, circle cover, #ffffff 0%, #f7f2d3 100%); background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #ffffff), color-stop(100%, #f7f2d3)); background: -webkit-radial-gradient(center, circle cover, #ffffff 0%, #f7f2d3 100%); background: -o-radial-gradient(center, circle cover, #ffffff 0%, #f7f2d3 100%); background: -ms-radial-gradient(center, circle cover, #ffffff 0%, #f7f2d3 100%); background: radial-gradient(center, circle cover, #ffffff 0%, #f7f2d3 100%); background-color: #f7f3de; } .reveal { font-family: 'Lato', sans-serif; font-size: 36px; font-weight: normal; color: #333; } ::selection { color: #fff; background: rgba(79, 64, 28, 0.99); text-shadow: none; } .reveal .slides > section, .reveal .slides > section > section { line-height: 1.3; font-weight: inherit; } /********************************************* * HEADERS *********************************************/ .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 { margin: 0 0 20px 0; color: #333; font-family: 'League Gothic', Impact, sans-serif; font-weight: normal; line-height: 1.2; letter-spacing: normal; text-transform: uppercase; text-shadow: none; word-wrap: break-word; } .reveal h1 { font-size: 3.77em; } .reveal h2 { font-size: 2.11em; } .reveal h3 { font-size: 1.55em; } .reveal h4 { font-size: 1em; } .reveal h1 { text-shadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); } /********************************************* * OTHER *********************************************/ .reveal p { margin: 20px 0; line-height: 1.3; } /* Ensure certain elements are never larger than the slide itself */ .reveal img, .reveal video, .reveal iframe { max-width: 95%; max-height: 95%; } .reveal strong, .reveal b { font-weight: bold; } .reveal em { font-style: italic; } .reveal ol, .reveal dl, .reveal ul { display: inline-block; text-align: left; margin: 0 0 0 1em; } .reveal ol { list-style-type: decimal; } .reveal ul { list-style-type: disc; } .reveal ul ul { list-style-type: square; } .reveal ul ul ul { list-style-type: circle; } .reveal ul ul, .reveal ul ol, .reveal ol ol, .reveal ol ul { display: block; margin-left: 40px; } .reveal dt { font-weight: bold; } .reveal dd { margin-left: 40px; } .reveal q, .reveal blockquote { quotes: none; } .reveal blockquote { display: block; position: relative; width: 70%; margin: 20px auto; padding: 5px; font-style: italic; background: rgba(255, 255, 255, 0.05); box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } .reveal blockquote p:first-child, .reveal blockquote p:last-child { display: inline-block; } .reveal q { font-style: italic; } .reveal pre { display: block; position: relative; width: 90%; margin: 20px auto; text-align: left; font-size: 0.55em; font-family: monospace; line-height: 1.2em; word-wrap: break-word; box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } .reveal code { font-family: monospace; } .reveal pre code { display: block; padding: 5px; overflow: auto; max-height: 400px; word-wrap: normal; background: #3F3F3F; color: #DCDCDC; } .reveal table { margin: auto; border-collapse: collapse; border-spacing: 0; } .reveal table th { font-weight: bold; } .reveal table th, .reveal table td { text-align: left; padding: 0.2em 0.5em 0.2em 0.5em; border-bottom: 1px solid; } .reveal table tr:last-child td { border-bottom: none; } .reveal sup { vertical-align: super; } .reveal sub { vertical-align: sub; } .reveal small { display: inline-block; font-size: 0.6em; line-height: 1.2em; vertical-align: top; } .reveal small * { vertical-align: top; } /********************************************* * LINKS *********************************************/ .reveal a { color: #8b743d; text-decoration: none; -webkit-transition: color 0.15s ease; -moz-transition: color 0.15s ease; transition: color 0.15s ease; } .reveal a:hover { color: #c0a76e; text-shadow: none; border: none; } .reveal .roll span:after { color: #fff; background: #564726; } /********************************************* * IMAGES *********************************************/ .reveal section img { margin: 15px 0px; background: rgba(255, 255, 255, 0.12); border: 4px solid #333; box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } .reveal a img { -webkit-transition: all 0.15s linear; -moz-transition: all 0.15s linear; transition: all 0.15s linear; } .reveal a:hover img { background: rgba(255, 255, 255, 0.2); border-color: #8b743d; box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } /********************************************* * NAVIGATION CONTROLS *********************************************/ .reveal .controls div.navigate-left, .reveal .controls div.navigate-left.enabled { border-right-color: #8b743d; } .reveal .controls div.navigate-right, .reveal .controls div.navigate-right.enabled { border-left-color: #8b743d; } .reveal .controls div.navigate-up, .reveal .controls div.navigate-up.enabled { border-bottom-color: #8b743d; } .reveal .controls div.navigate-down, .reveal .controls div.navigate-down.enabled { border-top-color: #8b743d; } .reveal .controls div.navigate-left.enabled:hover { border-right-color: #c0a76e; } .reveal .controls div.navigate-right.enabled:hover { border-left-color: #c0a76e; } .reveal .controls div.navigate-up.enabled:hover { border-bottom-color: #c0a76e; } .reveal .controls div.navigate-down.enabled:hover { border-top-color: #c0a76e; } /********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { background: rgba(0, 0, 0, 0.2); } .reveal .progress span { background: #8b743d; -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } /********************************************* * SLIDE NUMBER *********************************************/ .reveal .slide-number { color: #8b743d; } ================================================ FILE: presentation/css/theme/black.css ================================================ @import url(../../lib/font/source-sans-pro/source-sans-pro.css); /** * Black theme for reveal.js. This is the opposite of the 'white' theme. * * Copyright (C) 2015 Hakim El Hattab, http://hakim.se */ section.has-light-background, section.has-light-background h1, section.has-light-background h2, section.has-light-background h3, section.has-light-background h4, section.has-light-background h5, section.has-light-background h6 { color: #222; } /********************************************* * GLOBAL STYLES *********************************************/ body { background: #222; background-color: #222; } .reveal { font-family: 'Source Sans Pro', Helvetica, sans-serif; font-size: 38px; font-weight: normal; color: #fff; } ::selection { color: #fff; background: #bee4fd; text-shadow: none; } .reveal .slides > section, .reveal .slides > section > section { line-height: 1.3; font-weight: inherit; } /********************************************* * HEADERS *********************************************/ .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 { margin: 0 0 20px 0; color: #fff; font-family: 'Source Sans Pro', Helvetica, sans-serif; font-weight: 600; line-height: 1.2; letter-spacing: normal; text-transform: uppercase; text-shadow: none; word-wrap: break-word; } .reveal h1 { font-size: 2.5em; } .reveal h2 { font-size: 1.6em; } .reveal h3 { font-size: 1.3em; } .reveal h4 { font-size: 1em; } .reveal h1 { text-shadow: none; } /********************************************* * OTHER *********************************************/ .reveal p { margin: 20px 0; line-height: 1.3; } /* Ensure certain elements are never larger than the slide itself */ .reveal img, .reveal video, .reveal iframe { max-width: 95%; max-height: 95%; } .reveal strong, .reveal b { font-weight: bold; } .reveal em { font-style: italic; } .reveal ol, .reveal dl, .reveal ul { display: inline-block; text-align: left; margin: 0 0 0 1em; } .reveal ol { list-style-type: decimal; } .reveal ul { list-style-type: disc; } .reveal ul ul { list-style-type: square; } .reveal ul ul ul { list-style-type: circle; } .reveal ul ul, .reveal ul ol, .reveal ol ol, .reveal ol ul { display: block; margin-left: 40px; } .reveal dt { font-weight: bold; } .reveal dd { margin-left: 40px; } .reveal q, .reveal blockquote { quotes: none; } .reveal blockquote { display: block; position: relative; width: 70%; margin: 20px auto; padding: 5px; font-style: italic; background: rgba(255, 255, 255, 0.05); box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } .reveal blockquote p:first-child, .reveal blockquote p:last-child { display: inline-block; } .reveal q { font-style: italic; } .reveal pre { display: block; position: relative; width: 90%; margin: 20px auto; text-align: left; font-size: 0.55em; font-family: monospace; line-height: 1.2em; word-wrap: break-word; box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } .reveal code { font-family: monospace; } .reveal pre code { display: block; padding: 5px; overflow: auto; max-height: 400px; word-wrap: normal; background: #3F3F3F; color: #DCDCDC; } .reveal table { margin: auto; border-collapse: collapse; border-spacing: 0; } .reveal table th { font-weight: bold; } .reveal table th, .reveal table td { text-align: left; padding: 0.2em 0.5em 0.2em 0.5em; border-bottom: 1px solid; } .reveal table tr:last-child td { border-bottom: none; } .reveal sup { vertical-align: super; } .reveal sub { vertical-align: sub; } .reveal small { display: inline-block; font-size: 0.6em; line-height: 1.2em; vertical-align: top; } .reveal small * { vertical-align: top; } /********************************************* * LINKS *********************************************/ .reveal a { color: #42affa; text-decoration: none; -webkit-transition: color 0.15s ease; -moz-transition: color 0.15s ease; transition: color 0.15s ease; } .reveal a:hover { color: #8dcffc; text-shadow: none; border: none; } .reveal .roll span:after { color: #fff; background: #068ee9; } /********************************************* * IMAGES *********************************************/ .reveal section img { margin: 15px 0px; background: rgba(255, 255, 255, 0.12); border: 4px solid #fff; box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } .reveal a img { -webkit-transition: all 0.15s linear; -moz-transition: all 0.15s linear; transition: all 0.15s linear; } .reveal a:hover img { background: rgba(255, 255, 255, 0.2); border-color: #42affa; box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } /********************************************* * NAVIGATION CONTROLS *********************************************/ .reveal .controls div.navigate-left, .reveal .controls div.navigate-left.enabled { border-right-color: #42affa; } .reveal .controls div.navigate-right, .reveal .controls div.navigate-right.enabled { border-left-color: #42affa; } .reveal .controls div.navigate-up, .reveal .controls div.navigate-up.enabled { border-bottom-color: #42affa; } .reveal .controls div.navigate-down, .reveal .controls div.navigate-down.enabled { border-top-color: #42affa; } .reveal .controls div.navigate-left.enabled:hover { border-right-color: #8dcffc; } .reveal .controls div.navigate-right.enabled:hover { border-left-color: #8dcffc; } .reveal .controls div.navigate-up.enabled:hover { border-bottom-color: #8dcffc; } .reveal .controls div.navigate-down.enabled:hover { border-top-color: #8dcffc; } /********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { background: rgba(0, 0, 0, 0.2); } .reveal .progress span { background: #42affa; -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } /********************************************* * SLIDE NUMBER *********************************************/ .reveal .slide-number { color: #42affa; } ================================================ FILE: presentation/css/theme/blood.css ================================================ @import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic); /** * Blood theme for reveal.js * Author: Walther http://github.com/Walther * * Designed to be used with highlight.js theme * "monokai_sublime.css" available from * https://github.com/isagalaev/highlight.js/ * * For other themes, change $codeBackground accordingly. * */ /********************************************* * GLOBAL STYLES *********************************************/ body { background: #222; background: -moz-radial-gradient(center, circle cover, #626262 0%, #222 100%); background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #626262), color-stop(100%, #222)); background: -webkit-radial-gradient(center, circle cover, #626262 0%, #222 100%); background: -o-radial-gradient(center, circle cover, #626262 0%, #222 100%); background: -ms-radial-gradient(center, circle cover, #626262 0%, #222 100%); background: radial-gradient(center, circle cover, #626262 0%, #222 100%); background-color: #2b2b2b; } .reveal { font-family: Ubuntu, 'sans-serif'; font-size: 36px; font-weight: normal; color: #eee; } ::selection { color: #fff; background: #a23; text-shadow: none; } .reveal .slides > section, .reveal .slides > section > section { line-height: 1.3; font-weight: inherit; } /********************************************* * HEADERS *********************************************/ .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 { margin: 0 0 20px 0; color: #eee; font-family: Ubuntu, 'sans-serif'; font-weight: normal; line-height: 1.2; letter-spacing: normal; text-transform: uppercase; text-shadow: 2px 2px 2px #222; word-wrap: break-word; } .reveal h1 { font-size: 3.77em; } .reveal h2 { font-size: 2.11em; } .reveal h3 { font-size: 1.55em; } .reveal h4 { font-size: 1em; } .reveal h1 { text-shadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); } /********************************************* * OTHER *********************************************/ .reveal p { margin: 20px 0; line-height: 1.3; } /* Ensure certain elements are never larger than the slide itself */ .reveal img, .reveal video, .reveal iframe { max-width: 95%; max-height: 95%; } .reveal strong, .reveal b { font-weight: bold; } .reveal em { font-style: italic; } .reveal ol, .reveal dl, .reveal ul { display: inline-block; text-align: left; margin: 0 0 0 1em; } .reveal ol { list-style-type: decimal; } .reveal ul { list-style-type: disc; } .reveal ul ul { list-style-type: square; } .reveal ul ul ul { list-style-type: circle; } .reveal ul ul, .reveal ul ol, .reveal ol ol, .reveal ol ul { display: block; margin-left: 40px; } .reveal dt { font-weight: bold; } .reveal dd { margin-left: 40px; } .reveal q, .reveal blockquote { quotes: none; } .reveal blockquote { display: block; position: relative; width: 70%; margin: 20px auto; padding: 5px; font-style: italic; background: rgba(255, 255, 255, 0.05); box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } .reveal blockquote p:first-child, .reveal blockquote p:last-child { display: inline-block; } .reveal q { font-style: italic; } .reveal pre { display: block; position: relative; width: 90%; margin: 20px auto; text-align: left; font-size: 0.55em; font-family: monospace; line-height: 1.2em; word-wrap: break-word; box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } .reveal code { font-family: monospace; } .reveal pre code { display: block; padding: 5px; overflow: auto; max-height: 400px; word-wrap: normal; background: #3F3F3F; color: #DCDCDC; } .reveal table { margin: auto; border-collapse: collapse; border-spacing: 0; } .reveal table th { font-weight: bold; } .reveal table th, .reveal table td { text-align: left; padding: 0.2em 0.5em 0.2em 0.5em; border-bottom: 1px solid; } .reveal table tr:last-child td { border-bottom: none; } .reveal sup { vertical-align: super; } .reveal sub { vertical-align: sub; } .reveal small { display: inline-block; font-size: 0.6em; line-height: 1.2em; vertical-align: top; } .reveal small * { vertical-align: top; } /********************************************* * LINKS *********************************************/ .reveal a { color: #a23; text-decoration: none; -webkit-transition: color 0.15s ease; -moz-transition: color 0.15s ease; transition: color 0.15s ease; } .reveal a:hover { color: #dd5567; text-shadow: none; border: none; } .reveal .roll span:after { color: #fff; background: #6a1521; } /********************************************* * IMAGES *********************************************/ .reveal section img { margin: 15px 0px; background: rgba(255, 255, 255, 0.12); border: 4px solid #eee; box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } .reveal a img { -webkit-transition: all 0.15s linear; -moz-transition: all 0.15s linear; transition: all 0.15s linear; } .reveal a:hover img { background: rgba(255, 255, 255, 0.2); border-color: #a23; box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } /********************************************* * NAVIGATION CONTROLS *********************************************/ .reveal .controls div.navigate-left, .reveal .controls div.navigate-left.enabled { border-right-color: #a23; } .reveal .controls div.navigate-right, .reveal .controls div.navigate-right.enabled { border-left-color: #a23; } .reveal .controls div.navigate-up, .reveal .controls div.navigate-up.enabled { border-bottom-color: #a23; } .reveal .controls div.navigate-down, .reveal .controls div.navigate-down.enabled { border-top-color: #a23; } .reveal .controls div.navigate-left.enabled:hover { border-right-color: #dd5567; } .reveal .controls div.navigate-right.enabled:hover { border-left-color: #dd5567; } .reveal .controls div.navigate-up.enabled:hover { border-bottom-color: #dd5567; } .reveal .controls div.navigate-down.enabled:hover { border-top-color: #dd5567; } /********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { background: rgba(0, 0, 0, 0.2); } .reveal .progress span { background: #a23; -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } /********************************************* * SLIDE NUMBER *********************************************/ .reveal .slide-number { color: #a23; } .reveal p { font-weight: 300; text-shadow: 1px 1px #222; } .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 { font-weight: 700; } .reveal a, .reveal a:hover { text-shadow: 2px 2px 2px #000; } .reveal small a, .reveal small a:hover { text-shadow: 1px 1px 1px #000; } .reveal p code { background-color: #23241f; display: inline-block; border-radius: 7px; } .reveal small code { vertical-align: baseline; } ================================================ FILE: presentation/css/theme/league.css ================================================ @import url(../../lib/font/league-gothic/league-gothic.css); @import url(../../contrib/google/css/lato.css); /** * League theme for reveal.js. * * This was the default theme pre-3.0.0. * * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se */ /********************************************* * GLOBAL STYLES *********************************************/ body { background: #1c1e20; background: -moz-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #555a5f), color-stop(100%, #1c1e20)); background: -webkit-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); background: -o-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); background: -ms-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); background: radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); background-color: #2b2b2b; } .reveal { font-family: 'Lato', sans-serif; font-size: 36px; font-weight: normal; color: #eee; } ::selection { color: #fff; background: #FF5E99; text-shadow: none; } .reveal .slides > section, .reveal .slides > section > section { line-height: 1.3; font-weight: inherit; } /********************************************* * HEADERS *********************************************/ .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 { margin: 0 0 20px 0; color: #eee; font-family: 'League Gothic', Impact, sans-serif; font-weight: normal; line-height: 1.2; letter-spacing: normal; text-transform: uppercase; text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); word-wrap: break-word; } .reveal h1 { font-size: 3.77em; } .reveal h2 { font-size: 2.11em; } .reveal h3 { font-size: 1.55em; } .reveal h4 { font-size: 1em; } .reveal h1 { text-shadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); } /********************************************* * OTHER *********************************************/ .reveal p { margin: 20px 0; line-height: 1.3; } /* Ensure certain elements are never larger than the slide itself */ .reveal img, .reveal video, .reveal iframe { max-width: 95%; max-height: 95%; } .reveal strong, .reveal b { font-weight: bold; } .reveal em { font-style: italic; } .reveal ol, .reveal dl, .reveal ul { display: inline-block; text-align: left; margin: 0 0 0 1em; } .reveal ol { list-style-type: decimal; } .reveal ul { list-style-type: disc; } .reveal ul ul { list-style-type: square; } .reveal ul ul ul { list-style-type: circle; } .reveal ul ul, .reveal ul ol, .reveal ol ol, .reveal ol ul { display: block; margin-left: 40px; } .reveal dt { font-weight: bold; } .reveal dd { margin-left: 40px; } .reveal q, .reveal blockquote { quotes: none; } .reveal blockquote { display: block; position: relative; width: 70%; margin: 20px auto; padding: 5px; font-style: italic; background: rgba(255, 255, 255, 0.05); box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } .reveal blockquote p:first-child, .reveal blockquote p:last-child { display: inline-block; } .reveal q { font-style: italic; } .reveal pre { display: block; position: relative; width: 90%; margin: 20px auto; text-align: left; font-size: 0.55em; font-family: monospace; line-height: 1.2em; word-wrap: break-word; box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } .reveal code { font-family: monospace; } .reveal pre code { display: block; padding: 5px; overflow: auto; max-height: 400px; word-wrap: normal; background: #3F3F3F; color: #DCDCDC; } .reveal table { margin: auto; border-collapse: collapse; border-spacing: 0; } .reveal table th { font-weight: bold; } .reveal table th, .reveal table td { text-align: left; padding: 0.2em 0.5em 0.2em 0.5em; border-bottom: 1px solid; } .reveal table tr:last-child td { border-bottom: none; } .reveal sup { vertical-align: super; } .reveal sub { vertical-align: sub; } .reveal small { display: inline-block; font-size: 0.6em; line-height: 1.2em; vertical-align: top; } .reveal small * { vertical-align: top; } /********************************************* * LINKS *********************************************/ .reveal a { color: #13DAEC; text-decoration: none; -webkit-transition: color 0.15s ease; -moz-transition: color 0.15s ease; transition: color 0.15s ease; } .reveal a:hover { color: #71ebf4; text-shadow: none; border: none; } .reveal .roll span:after { color: #fff; background: #0d9ba5; } /********************************************* * IMAGES *********************************************/ .reveal section img { margin: 15px 0px; background: rgba(255, 255, 255, 0.12); border: 4px solid #eee; box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } .reveal a img { -webkit-transition: all 0.15s linear; -moz-transition: all 0.15s linear; transition: all 0.15s linear; } .reveal a:hover img { background: rgba(255, 255, 255, 0.2); border-color: #13DAEC; box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } /********************************************* * NAVIGATION CONTROLS *********************************************/ .reveal .controls div.navigate-left, .reveal .controls div.navigate-left.enabled { border-right-color: #13DAEC; } .reveal .controls div.navigate-right, .reveal .controls div.navigate-right.enabled { border-left-color: #13DAEC; } .reveal .controls div.navigate-up, .reveal .controls div.navigate-up.enabled { border-bottom-color: #13DAEC; } .reveal .controls div.navigate-down, .reveal .controls div.navigate-down.enabled { border-top-color: #13DAEC; } .reveal .controls div.navigate-left.enabled:hover { border-right-color: #71ebf4; } .reveal .controls div.navigate-right.enabled:hover { border-left-color: #71ebf4; } .reveal .controls div.navigate-up.enabled:hover { border-bottom-color: #71ebf4; } .reveal .controls div.navigate-down.enabled:hover { border-top-color: #71ebf4; } /********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { background: rgba(0, 0, 0, 0.2); } .reveal .progress span { background: #13DAEC; -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } /********************************************* * SLIDE NUMBER *********************************************/ .reveal .slide-number { color: #13DAEC; } ================================================ FILE: presentation/css/theme/moon.css ================================================ @import url(../../lib/font/league-gothic/league-gothic.css); @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); /** * Solarized Dark theme for reveal.js. * Author: Achim Staebler */ /** * Solarized colors by Ethan Schoonover */ html * { color-profile: sRGB; rendering-intent: auto; } /********************************************* * GLOBAL STYLES *********************************************/ body { background: #002b36; background-color: #002b36; } .reveal { font-family: 'Lato', sans-serif; font-size: 36px; font-weight: normal; color: #93a1a1; } ::selection { color: #fff; background: #d33682; text-shadow: none; } .reveal .slides > section, .reveal .slides > section > section { line-height: 1.3; font-weight: inherit; } /********************************************* * HEADERS *********************************************/ .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 { margin: 0 0 20px 0; color: #eee8d5; font-family: 'League Gothic', Impact, sans-serif; font-weight: normal; line-height: 1.2; letter-spacing: normal; text-transform: uppercase; text-shadow: none; word-wrap: break-word; } .reveal h1 { font-size: 3.77em; } .reveal h2 { font-size: 2.11em; } .reveal h3 { font-size: 1.55em; } .reveal h4 { font-size: 1em; } .reveal h1 { text-shadow: none; } /********************************************* * OTHER *********************************************/ .reveal p { margin: 20px 0; line-height: 1.3; } /* Ensure certain elements are never larger than the slide itself */ .reveal img, .reveal video, .reveal iframe { max-width: 95%; max-height: 95%; } .reveal strong, .reveal b { font-weight: bold; } .reveal em { font-style: italic; } .reveal ol, .reveal dl, .reveal ul { display: inline-block; text-align: left; margin: 0 0 0 1em; } .reveal ol { list-style-type: decimal; } .reveal ul { list-style-type: disc; } .reveal ul ul { list-style-type: square; } .reveal ul ul ul { list-style-type: circle; } .reveal ul ul, .reveal ul ol, .reveal ol ol, .reveal ol ul { display: block; margin-left: 40px; } .reveal dt { font-weight: bold; } .reveal dd { margin-left: 40px; } .reveal q, .reveal blockquote { quotes: none; } .reveal blockquote { display: block; position: relative; width: 70%; margin: 20px auto; padding: 5px; font-style: italic; background: rgba(255, 255, 255, 0.05); box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } .reveal blockquote p:first-child, .reveal blockquote p:last-child { display: inline-block; } .reveal q { font-style: italic; } .reveal pre { display: block; position: relative; width: 90%; margin: 20px auto; text-align: left; font-size: 0.55em; font-family: monospace; line-height: 1.2em; word-wrap: break-word; box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } .reveal code { font-family: monospace; } .reveal pre code { display: block; padding: 5px; overflow: auto; max-height: 400px; word-wrap: normal; background: #3F3F3F; color: #DCDCDC; } .reveal table { margin: auto; border-collapse: collapse; border-spacing: 0; } .reveal table th { font-weight: bold; } .reveal table th, .reveal table td { text-align: left; padding: 0.2em 0.5em 0.2em 0.5em; border-bottom: 1px solid; } .reveal table tr:last-child td { border-bottom: none; } .reveal sup { vertical-align: super; } .reveal sub { vertical-align: sub; } .reveal small { display: inline-block; font-size: 0.6em; line-height: 1.2em; vertical-align: top; } .reveal small * { vertical-align: top; } /********************************************* * LINKS *********************************************/ .reveal a { color: #268bd2; text-decoration: none; -webkit-transition: color 0.15s ease; -moz-transition: color 0.15s ease; transition: color 0.15s ease; } .reveal a:hover { color: #78bae6; text-shadow: none; border: none; } .reveal .roll span:after { color: #fff; background: #1a6291; } /********************************************* * IMAGES *********************************************/ .reveal section img { margin: 15px 0px; background: rgba(255, 255, 255, 0.12); border: 4px solid #93a1a1; box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } .reveal a img { -webkit-transition: all 0.15s linear; -moz-transition: all 0.15s linear; transition: all 0.15s linear; } .reveal a:hover img { background: rgba(255, 255, 255, 0.2); border-color: #268bd2; box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } /********************************************* * NAVIGATION CONTROLS *********************************************/ .reveal .controls div.navigate-left, .reveal .controls div.navigate-left.enabled { border-right-color: #268bd2; } .reveal .controls div.navigate-right, .reveal .controls div.navigate-right.enabled { border-left-color: #268bd2; } .reveal .controls div.navigate-up, .reveal .controls div.navigate-up.enabled { border-bottom-color: #268bd2; } .reveal .controls div.navigate-down, .reveal .controls div.navigate-down.enabled { border-top-color: #268bd2; } .reveal .controls div.navigate-left.enabled:hover { border-right-color: #78bae6; } .reveal .controls div.navigate-right.enabled:hover { border-left-color: #78bae6; } .reveal .controls div.navigate-up.enabled:hover { border-bottom-color: #78bae6; } .reveal .controls div.navigate-down.enabled:hover { border-top-color: #78bae6; } /********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { background: rgba(0, 0, 0, 0.2); } .reveal .progress span { background: #268bd2; -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } /********************************************* * SLIDE NUMBER *********************************************/ .reveal .slide-number { color: #268bd2; } ================================================ FILE: presentation/css/theme/night.css ================================================ @import url(https://fonts.googleapis.com/css?family=Montserrat:700); @import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic); /** * Black theme for reveal.js. * * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se */ /********************************************* * GLOBAL STYLES *********************************************/ body { background: #111; background-color: #111; } .reveal { font-family: 'Open Sans', sans-serif; font-size: 30px; font-weight: normal; color: #eee; } ::selection { color: #fff; background: #e7ad52; text-shadow: none; } .reveal .slides > section, .reveal .slides > section > section { line-height: 1.3; font-weight: inherit; } /********************************************* * HEADERS *********************************************/ .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 { margin: 0 0 20px 0; color: #eee; font-family: 'Montserrat', Impact, sans-serif; font-weight: normal; line-height: 1.2; letter-spacing: -0.03em; text-transform: none; text-shadow: none; word-wrap: break-word; } .reveal h1 { font-size: 3.77em; } .reveal h2 { font-size: 2.11em; } .reveal h3 { font-size: 1.55em; } .reveal h4 { font-size: 1em; } .reveal h1 { text-shadow: none; } /********************************************* * OTHER *********************************************/ .reveal p { margin: 20px 0; line-height: 1.3; } /* Ensure certain elements are never larger than the slide itself */ .reveal img, .reveal video, .reveal iframe { max-width: 95%; max-height: 95%; } .reveal strong, .reveal b { font-weight: bold; } .reveal em { font-style: italic; } .reveal ol, .reveal dl, .reveal ul { display: inline-block; text-align: left; margin: 0 0 0 1em; } .reveal ol { list-style-type: decimal; } .reveal ul { list-style-type: disc; } .reveal ul ul { list-style-type: square; } .reveal ul ul ul { list-style-type: circle; } .reveal ul ul, .reveal ul ol, .reveal ol ol, .reveal ol ul { display: block; margin-left: 40px; } .reveal dt { font-weight: bold; } .reveal dd { margin-left: 40px; } .reveal q, .reveal blockquote { quotes: none; } .reveal blockquote { display: block; position: relative; width: 70%; margin: 20px auto; padding: 5px; font-style: italic; background: rgba(255, 255, 255, 0.05); box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } .reveal blockquote p:first-child, .reveal blockquote p:last-child { display: inline-block; } .reveal q { font-style: italic; } .reveal pre { display: block; position: relative; width: 90%; margin: 20px auto; text-align: left; font-size: 0.55em; font-family: monospace; line-height: 1.2em; word-wrap: break-word; box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } .reveal code { font-family: monospace; } .reveal pre code { display: block; padding: 5px; overflow: auto; max-height: 400px; word-wrap: normal; background: #3F3F3F; color: #DCDCDC; } .reveal table { margin: auto; border-collapse: collapse; border-spacing: 0; } .reveal table th { font-weight: bold; } .reveal table th, .reveal table td { text-align: left; padding: 0.2em 0.5em 0.2em 0.5em; border-bottom: 1px solid; } .reveal table tr:last-child td { border-bottom: none; } .reveal sup { vertical-align: super; } .reveal sub { vertical-align: sub; } .reveal small { display: inline-block; font-size: 0.6em; line-height: 1.2em; vertical-align: top; } .reveal small * { vertical-align: top; } /********************************************* * LINKS *********************************************/ .reveal a { color: #e7ad52; text-decoration: none; -webkit-transition: color 0.15s ease; -moz-transition: color 0.15s ease; transition: color 0.15s ease; } .reveal a:hover { color: #f3d7ac; text-shadow: none; border: none; } .reveal .roll span:after { color: #fff; background: #d0881d; } /********************************************* * IMAGES *********************************************/ .reveal section img { margin: 15px 0px; background: rgba(255, 255, 255, 0.12); border: 4px solid #eee; box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } .reveal a img { -webkit-transition: all 0.15s linear; -moz-transition: all 0.15s linear; transition: all 0.15s linear; } .reveal a:hover img { background: rgba(255, 255, 255, 0.2); border-color: #e7ad52; box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } /********************************************* * NAVIGATION CONTROLS *********************************************/ .reveal .controls div.navigate-left, .reveal .controls div.navigate-left.enabled { border-right-color: #e7ad52; } .reveal .controls div.navigate-right, .reveal .controls div.navigate-right.enabled { border-left-color: #e7ad52; } .reveal .controls div.navigate-up, .reveal .controls div.navigate-up.enabled { border-bottom-color: #e7ad52; } .reveal .controls div.navigate-down, .reveal .controls div.navigate-down.enabled { border-top-color: #e7ad52; } .reveal .controls div.navigate-left.enabled:hover { border-right-color: #f3d7ac; } .reveal .controls div.navigate-right.enabled:hover { border-left-color: #f3d7ac; } .reveal .controls div.navigate-up.enabled:hover { border-bottom-color: #f3d7ac; } .reveal .controls div.navigate-down.enabled:hover { border-top-color: #f3d7ac; } /********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { background: rgba(0, 0, 0, 0.2); } .reveal .progress span { background: #e7ad52; -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } /********************************************* * SLIDE NUMBER *********************************************/ .reveal .slide-number { color: #e7ad52; } ================================================ FILE: presentation/css/theme/serif.css ================================================ /** * A simple theme for reveal.js presentations, similar * to the default theme. The accent color is brown. * * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed. */ .reveal a { line-height: 1.3em; } /********************************************* * GLOBAL STYLES *********************************************/ body { background: #F0F1EB; background-color: #F0F1EB; } .reveal { font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; font-size: 36px; font-weight: normal; color: #000; } ::selection { color: #fff; background: #26351C; text-shadow: none; } .reveal .slides > section, .reveal .slides > section > section { line-height: 1.3; font-weight: inherit; } /********************************************* * HEADERS *********************************************/ .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 { margin: 0 0 20px 0; color: #383D3D; font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; font-weight: normal; line-height: 1.2; letter-spacing: normal; text-transform: none; text-shadow: none; word-wrap: break-word; } .reveal h1 { font-size: 3.77em; } .reveal h2 { font-size: 2.11em; } .reveal h3 { font-size: 1.55em; } .reveal h4 { font-size: 1em; } .reveal h1 { text-shadow: none; } /********************************************* * OTHER *********************************************/ .reveal p { margin: 20px 0; line-height: 1.3; } /* Ensure certain elements are never larger than the slide itself */ .reveal img, .reveal video, .reveal iframe { max-width: 95%; max-height: 95%; } .reveal strong, .reveal b { font-weight: bold; } .reveal em { font-style: italic; } .reveal ol, .reveal dl, .reveal ul { display: inline-block; text-align: left; margin: 0 0 0 1em; } .reveal ol { list-style-type: decimal; } .reveal ul { list-style-type: disc; } .reveal ul ul { list-style-type: square; } .reveal ul ul ul { list-style-type: circle; } .reveal ul ul, .reveal ul ol, .reveal ol ol, .reveal ol ul { display: block; margin-left: 40px; } .reveal dt { font-weight: bold; } .reveal dd { margin-left: 40px; } .reveal q, .reveal blockquote { quotes: none; } .reveal blockquote { display: block; position: relative; width: 70%; margin: 20px auto; padding: 5px; font-style: italic; background: rgba(255, 255, 255, 0.05); box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } .reveal blockquote p:first-child, .reveal blockquote p:last-child { display: inline-block; } .reveal q { font-style: italic; } .reveal pre { display: block; position: relative; width: 90%; margin: 20px auto; text-align: left; font-size: 0.55em; font-family: monospace; line-height: 1.2em; word-wrap: break-word; box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } .reveal code { font-family: monospace; } .reveal pre code { display: block; padding: 5px; overflow: auto; max-height: 400px; word-wrap: normal; background: #3F3F3F; color: #DCDCDC; } .reveal table { margin: auto; border-collapse: collapse; border-spacing: 0; } .reveal table th { font-weight: bold; } .reveal table th, .reveal table td { text-align: left; padding: 0.2em 0.5em 0.2em 0.5em; border-bottom: 1px solid; } .reveal table tr:last-child td { border-bottom: none; } .reveal sup { vertical-align: super; } .reveal sub { vertical-align: sub; } .reveal small { display: inline-block; font-size: 0.6em; line-height: 1.2em; vertical-align: top; } .reveal small * { vertical-align: top; } /********************************************* * LINKS *********************************************/ .reveal a { color: #51483D; text-decoration: none; -webkit-transition: color 0.15s ease; -moz-transition: color 0.15s ease; transition: color 0.15s ease; } .reveal a:hover { color: #8b7b69; text-shadow: none; border: none; } .reveal .roll span:after { color: #fff; background: #25211c; } /********************************************* * IMAGES *********************************************/ .reveal section img { margin: 15px 0px; background: rgba(255, 255, 255, 0.12); border: 4px solid #000; box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } .reveal a img { -webkit-transition: all 0.15s linear; -moz-transition: all 0.15s linear; transition: all 0.15s linear; } .reveal a:hover img { background: rgba(255, 255, 255, 0.2); border-color: #51483D; box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } /********************************************* * NAVIGATION CONTROLS *********************************************/ .reveal .controls div.navigate-left, .reveal .controls div.navigate-left.enabled { border-right-color: #51483D; } .reveal .controls div.navigate-right, .reveal .controls div.navigate-right.enabled { border-left-color: #51483D; } .reveal .controls div.navigate-up, .reveal .controls div.navigate-up.enabled { border-bottom-color: #51483D; } .reveal .controls div.navigate-down, .reveal .controls div.navigate-down.enabled { border-top-color: #51483D; } .reveal .controls div.navigate-left.enabled:hover { border-right-color: #8b7b69; } .reveal .controls div.navigate-right.enabled:hover { border-left-color: #8b7b69; } .reveal .controls div.navigate-up.enabled:hover { border-bottom-color: #8b7b69; } .reveal .controls div.navigate-down.enabled:hover { border-top-color: #8b7b69; } /********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { background: rgba(0, 0, 0, 0.2); } .reveal .progress span { background: #51483D; -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } /********************************************* * SLIDE NUMBER *********************************************/ .reveal .slide-number { color: #51483D; } ================================================ FILE: presentation/css/theme/simple.css ================================================ @import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700); @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); /** * A simple theme for reveal.js presentations, similar * to the default theme. The accent color is darkblue. * * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed. * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se */ /********************************************* * GLOBAL STYLES *********************************************/ body { background: #fff; background-color: #fff; } .reveal { font-family: 'Lato', sans-serif; font-size: 36px; font-weight: normal; color: #000; } ::selection { color: #fff; background: rgba(0, 0, 0, 0.99); text-shadow: none; } .reveal .slides > section, .reveal .slides > section > section { line-height: 1.3; font-weight: inherit; } /********************************************* * HEADERS *********************************************/ .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 { margin: 0 0 20px 0; color: #000; font-family: 'News Cycle', Impact, sans-serif; font-weight: normal; line-height: 1.2; letter-spacing: normal; text-transform: none; text-shadow: none; word-wrap: break-word; } .reveal h1 { font-size: 3.77em; } .reveal h2 { font-size: 2.11em; } .reveal h3 { font-size: 1.55em; } .reveal h4 { font-size: 1em; } .reveal h1 { text-shadow: none; } /********************************************* * OTHER *********************************************/ .reveal p { margin: 20px 0; line-height: 1.3; } /* Ensure certain elements are never larger than the slide itself */ .reveal img, .reveal video, .reveal iframe { max-width: 95%; max-height: 95%; } .reveal strong, .reveal b { font-weight: bold; } .reveal em { font-style: italic; } .reveal ol, .reveal dl, .reveal ul { display: inline-block; text-align: left; margin: 0 0 0 1em; } .reveal ol { list-style-type: decimal; } .reveal ul { list-style-type: disc; } .reveal ul ul { list-style-type: square; } .reveal ul ul ul { list-style-type: circle; } .reveal ul ul, .reveal ul ol, .reveal ol ol, .reveal ol ul { display: block; margin-left: 40px; } .reveal dt { font-weight: bold; } .reveal dd { margin-left: 40px; } .reveal q, .reveal blockquote { quotes: none; } .reveal blockquote { display: block; position: relative; width: 70%; margin: 20px auto; padding: 5px; font-style: italic; background: rgba(255, 255, 255, 0.05); box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } .reveal blockquote p:first-child, .reveal blockquote p:last-child { display: inline-block; } .reveal q { font-style: italic; } .reveal pre { display: block; position: relative; width: 90%; margin: 20px auto; text-align: left; font-size: 0.55em; font-family: monospace; line-height: 1.2em; word-wrap: break-word; box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } .reveal code { font-family: monospace; } .reveal pre code { display: block; padding: 5px; overflow: auto; max-height: 400px; word-wrap: normal; background: #3F3F3F; color: #DCDCDC; } .reveal table { margin: auto; border-collapse: collapse; border-spacing: 0; } .reveal table th { font-weight: bold; } .reveal table th, .reveal table td { text-align: left; padding: 0.2em 0.5em 0.2em 0.5em; border-bottom: 1px solid; } .reveal table tr:last-child td { border-bottom: none; } .reveal sup { vertical-align: super; } .reveal sub { vertical-align: sub; } .reveal small { display: inline-block; font-size: 0.6em; line-height: 1.2em; vertical-align: top; } .reveal small * { vertical-align: top; } /********************************************* * LINKS *********************************************/ .reveal a { color: #00008B; text-decoration: none; -webkit-transition: color 0.15s ease; -moz-transition: color 0.15s ease; transition: color 0.15s ease; } .reveal a:hover { color: #0000f1; text-shadow: none; border: none; } .reveal .roll span:after { color: #fff; background: #00003f; } /********************************************* * IMAGES *********************************************/ .reveal section img { margin: 15px 0px; background: rgba(255, 255, 255, 0.12); border: 4px solid #000; box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } .reveal a img { -webkit-transition: all 0.15s linear; -moz-transition: all 0.15s linear; transition: all 0.15s linear; } .reveal a:hover img { background: rgba(255, 255, 255, 0.2); border-color: #00008B; box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } /********************************************* * NAVIGATION CONTROLS *********************************************/ .reveal .controls div.navigate-left, .reveal .controls div.navigate-left.enabled { border-right-color: #00008B; } .reveal .controls div.navigate-right, .reveal .controls div.navigate-right.enabled { border-left-color: #00008B; } .reveal .controls div.navigate-up, .reveal .controls div.navigate-up.enabled { border-bottom-color: #00008B; } .reveal .controls div.navigate-down, .reveal .controls div.navigate-down.enabled { border-top-color: #00008B; } .reveal .controls div.navigate-left.enabled:hover { border-right-color: #0000f1; } .reveal .controls div.navigate-right.enabled:hover { border-left-color: #0000f1; } .reveal .controls div.navigate-up.enabled:hover { border-bottom-color: #0000f1; } .reveal .controls div.navigate-down.enabled:hover { border-top-color: #0000f1; } /********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { background: rgba(0, 0, 0, 0.2); } .reveal .progress span { background: #00008B; -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } /********************************************* * SLIDE NUMBER *********************************************/ .reveal .slide-number { color: #00008B; } ================================================ FILE: presentation/css/theme/sky.css ================================================ @import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic); @import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700); /** * Sky theme for reveal.js. * * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se */ .reveal a { line-height: 1.3em; } /********************************************* * GLOBAL STYLES *********************************************/ body { background: #add9e4; background: -moz-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #f7fbfc), color-stop(100%, #add9e4)); background: -webkit-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); background: -o-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); background: -ms-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); background: radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); background-color: #f7fbfc; } .reveal { font-family: 'Open Sans', sans-serif; font-size: 36px; font-weight: normal; color: #333; } ::selection { color: #fff; background: #134674; text-shadow: none; } .reveal .slides > section, .reveal .slides > section > section { line-height: 1.3; font-weight: inherit; } /********************************************* * HEADERS *********************************************/ .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 { margin: 0 0 20px 0; color: #333; font-family: 'Quicksand', sans-serif; font-weight: normal; line-height: 1.2; letter-spacing: -0.08em; text-transform: uppercase; text-shadow: none; word-wrap: break-word; } .reveal h1 { font-size: 3.77em; } .reveal h2 { font-size: 2.11em; } .reveal h3 { font-size: 1.55em; } .reveal h4 { font-size: 1em; } .reveal h1 { text-shadow: none; } /********************************************* * OTHER *********************************************/ .reveal p { margin: 20px 0; line-height: 1.3; } /* Ensure certain elements are never larger than the slide itself */ .reveal img, .reveal video, .reveal iframe { max-width: 95%; max-height: 95%; } .reveal strong, .reveal b { font-weight: bold; } .reveal em { font-style: italic; } .reveal ol, .reveal dl, .reveal ul { display: inline-block; text-align: left; margin: 0 0 0 1em; } .reveal ol { list-style-type: decimal; } .reveal ul { list-style-type: disc; } .reveal ul ul { list-style-type: square; } .reveal ul ul ul { list-style-type: circle; } .reveal ul ul, .reveal ul ol, .reveal ol ol, .reveal ol ul { display: block; margin-left: 40px; } .reveal dt { font-weight: bold; } .reveal dd { margin-left: 40px; } .reveal q, .reveal blockquote { quotes: none; } .reveal blockquote { display: block; position: relative; width: 70%; margin: 20px auto; padding: 5px; font-style: italic; background: rgba(255, 255, 255, 0.05); box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } .reveal blockquote p:first-child, .reveal blockquote p:last-child { display: inline-block; } .reveal q { font-style: italic; } .reveal pre { display: block; position: relative; width: 90%; margin: 20px auto; text-align: left; font-size: 0.55em; font-family: monospace; line-height: 1.2em; word-wrap: break-word; box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } .reveal code { font-family: monospace; } .reveal pre code { display: block; padding: 5px; overflow: auto; max-height: 400px; word-wrap: normal; background: #3F3F3F; color: #DCDCDC; } .reveal table { margin: auto; border-collapse: collapse; border-spacing: 0; } .reveal table th { font-weight: bold; } .reveal table th, .reveal table td { text-align: left; padding: 0.2em 0.5em 0.2em 0.5em; border-bottom: 1px solid; } .reveal table tr:last-child td { border-bottom: none; } .reveal sup { vertical-align: super; } .reveal sub { vertical-align: sub; } .reveal small { display: inline-block; font-size: 0.6em; line-height: 1.2em; vertical-align: top; } .reveal small * { vertical-align: top; } /********************************************* * LINKS *********************************************/ .reveal a { color: #3b759e; text-decoration: none; -webkit-transition: color 0.15s ease; -moz-transition: color 0.15s ease; transition: color 0.15s ease; } .reveal a:hover { color: #74a8cb; text-shadow: none; border: none; } .reveal .roll span:after { color: #fff; background: #264d66; } /********************************************* * IMAGES *********************************************/ .reveal section img { margin: 15px 0px; background: rgba(255, 255, 255, 0.12); border: 4px solid #333; box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } .reveal a img { -webkit-transition: all 0.15s linear; -moz-transition: all 0.15s linear; transition: all 0.15s linear; } .reveal a:hover img { background: rgba(255, 255, 255, 0.2); border-color: #3b759e; box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } /********************************************* * NAVIGATION CONTROLS *********************************************/ .reveal .controls div.navigate-left, .reveal .controls div.navigate-left.enabled { border-right-color: #3b759e; } .reveal .controls div.navigate-right, .reveal .controls div.navigate-right.enabled { border-left-color: #3b759e; } .reveal .controls div.navigate-up, .reveal .controls div.navigate-up.enabled { border-bottom-color: #3b759e; } .reveal .controls div.navigate-down, .reveal .controls div.navigate-down.enabled { border-top-color: #3b759e; } .reveal .controls div.navigate-left.enabled:hover { border-right-color: #74a8cb; } .reveal .controls div.navigate-right.enabled:hover { border-left-color: #74a8cb; } .reveal .controls div.navigate-up.enabled:hover { border-bottom-color: #74a8cb; } .reveal .controls div.navigate-down.enabled:hover { border-top-color: #74a8cb; } /********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { background: rgba(0, 0, 0, 0.2); } .reveal .progress span { background: #3b759e; -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } /********************************************* * SLIDE NUMBER *********************************************/ .reveal .slide-number { color: #3b759e; } ================================================ FILE: presentation/css/theme/solarized.css ================================================ @import url(../../lib/font/league-gothic/league-gothic.css); @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); /** * Solarized Light theme for reveal.js. * Author: Achim Staebler */ /** * Solarized colors by Ethan Schoonover */ html * { color-profile: sRGB; rendering-intent: auto; } /********************************************* * GLOBAL STYLES *********************************************/ body { background: #fdf6e3; background-color: #fdf6e3; } .reveal { font-family: 'Lato', sans-serif; font-size: 36px; font-weight: normal; color: #657b83; } ::selection { color: #fff; background: #d33682; text-shadow: none; } .reveal .slides > section, .reveal .slides > section > section { line-height: 1.3; font-weight: inherit; } /********************************************* * HEADERS *********************************************/ .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 { margin: 0 0 20px 0; color: #586e75; font-family: 'League Gothic', Impact, sans-serif; font-weight: normal; line-height: 1.2; letter-spacing: normal; text-transform: uppercase; text-shadow: none; word-wrap: break-word; } .reveal h1 { font-size: 3.77em; } .reveal h2 { font-size: 2.11em; } .reveal h3 { font-size: 1.55em; } .reveal h4 { font-size: 1em; } .reveal h1 { text-shadow: none; } /********************************************* * OTHER *********************************************/ .reveal p { margin: 20px 0; line-height: 1.3; } /* Ensure certain elements are never larger than the slide itself */ .reveal img, .reveal video, .reveal iframe { max-width: 95%; max-height: 95%; } .reveal strong, .reveal b { font-weight: bold; } .reveal em { font-style: italic; } .reveal ol, .reveal dl, .reveal ul { display: inline-block; text-align: left; margin: 0 0 0 1em; } .reveal ol { list-style-type: decimal; } .reveal ul { list-style-type: disc; } .reveal ul ul { list-style-type: square; } .reveal ul ul ul { list-style-type: circle; } .reveal ul ul, .reveal ul ol, .reveal ol ol, .reveal ol ul { display: block; margin-left: 40px; } .reveal dt { font-weight: bold; } .reveal dd { margin-left: 40px; } .reveal q, .reveal blockquote { quotes: none; } .reveal blockquote { display: block; position: relative; width: 70%; margin: 20px auto; padding: 5px; font-style: italic; background: rgba(255, 255, 255, 0.05); box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } .reveal blockquote p:first-child, .reveal blockquote p:last-child { display: inline-block; } .reveal q { font-style: italic; } .reveal pre { display: block; position: relative; width: 90%; margin: 20px auto; text-align: left; font-size: 0.55em; font-family: monospace; line-height: 1.2em; word-wrap: break-word; box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } .reveal code { font-family: monospace; } .reveal pre code { display: block; padding: 5px; overflow: auto; max-height: 400px; word-wrap: normal; background: #3F3F3F; color: #DCDCDC; } .reveal table { margin: auto; border-collapse: collapse; border-spacing: 0; } .reveal table th { font-weight: bold; } .reveal table th, .reveal table td { text-align: left; padding: 0.2em 0.5em 0.2em 0.5em; border-bottom: 1px solid; } .reveal table tr:last-child td { border-bottom: none; } .reveal sup { vertical-align: super; } .reveal sub { vertical-align: sub; } .reveal small { display: inline-block; font-size: 0.6em; line-height: 1.2em; vertical-align: top; } .reveal small * { vertical-align: top; } /********************************************* * LINKS *********************************************/ .reveal a { color: #268bd2; text-decoration: none; -webkit-transition: color 0.15s ease; -moz-transition: color 0.15s ease; transition: color 0.15s ease; } .reveal a:hover { color: #78bae6; text-shadow: none; border: none; } .reveal .roll span:after { color: #fff; background: #1a6291; } /********************************************* * IMAGES *********************************************/ .reveal section img { margin: 15px 0px; background: rgba(255, 255, 255, 0.12); border: 4px solid #657b83; box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } .reveal a img { -webkit-transition: all 0.15s linear; -moz-transition: all 0.15s linear; transition: all 0.15s linear; } .reveal a:hover img { background: rgba(255, 255, 255, 0.2); border-color: #268bd2; box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } /********************************************* * NAVIGATION CONTROLS *********************************************/ .reveal .controls div.navigate-left, .reveal .controls div.navigate-left.enabled { border-right-color: #268bd2; } .reveal .controls div.navigate-right, .reveal .controls div.navigate-right.enabled { border-left-color: #268bd2; } .reveal .controls div.navigate-up, .reveal .controls div.navigate-up.enabled { border-bottom-color: #268bd2; } .reveal .controls div.navigate-down, .reveal .controls div.navigate-down.enabled { border-top-color: #268bd2; } .reveal .controls div.navigate-left.enabled:hover { border-right-color: #78bae6; } .reveal .controls div.navigate-right.enabled:hover { border-left-color: #78bae6; } .reveal .controls div.navigate-up.enabled:hover { border-bottom-color: #78bae6; } .reveal .controls div.navigate-down.enabled:hover { border-top-color: #78bae6; } /********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { background: rgba(0, 0, 0, 0.2); } .reveal .progress span { background: #268bd2; -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } /********************************************* * SLIDE NUMBER *********************************************/ .reveal .slide-number { color: #268bd2; } ================================================ FILE: presentation/css/theme/source/beige.scss ================================================ /** * Beige theme for reveal.js. * * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se */ // Default mixins and settings ----------------- @import "../template/mixins"; @import "../template/settings"; // --------------------------------------------- // Include theme-specific fonts @import url(../../lib/font/league-gothic/league-gothic.css); @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); // Override theme settings (see ../template/settings.scss) $mainColor: #333; $headingColor: #333; $headingTextShadow: none; $backgroundColor: #f7f3de; $linkColor: #8b743d; $linkColorHover: lighten( $linkColor, 20% ); $selectionBackgroundColor: rgba(79, 64, 28, 0.99); $heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); // Background generator @mixin bodyBackground() { @include radial-gradient( rgba(247,242,211,1), rgba(255,255,255,1) ); } // Theme template ------------------------------ @import "../template/theme"; // --------------------------------------------- ================================================ FILE: presentation/css/theme/source/black.scss ================================================ /** * Black theme for reveal.js. This is the opposite of the 'white' theme. * * Copyright (C) 2015 Hakim El Hattab, http://hakim.se */ // Default mixins and settings ----------------- @import "../template/mixins"; @import "../template/settings"; // --------------------------------------------- // Include theme-specific fonts @import url(../../lib/font/source-sans-pro/source-sans-pro.css); // Override theme settings (see ../template/settings.scss) $backgroundColor: #222; $mainColor: #fff; $headingColor: #fff; $mainFontSize: 38px; $mainFont: 'Source Sans Pro', Helvetica, sans-serif; $headingFont: 'Source Sans Pro', Helvetica, sans-serif; $headingTextShadow: none; $headingLetterSpacing: normal; $headingTextTransform: uppercase; $headingFontWeight: 600; $linkColor: #42affa; $linkColorHover: lighten( $linkColor, 15% ); $selectionBackgroundColor: lighten( $linkColor, 25% ); $heading1Size: 2.5em; $heading2Size: 1.6em; $heading3Size: 1.3em; $heading4Size: 1.0em; section.has-light-background { &, h1, h2, h3, h4, h5, h6 { color: #222; } } // Theme template ------------------------------ @import "../template/theme"; // --------------------------------------------- ================================================ FILE: presentation/css/theme/source/blood.scss ================================================ /** * Blood theme for reveal.js * Author: Walther http://github.com/Walther * * Designed to be used with highlight.js theme * "monokai_sublime.css" available from * https://github.com/isagalaev/highlight.js/ * * For other themes, change $codeBackground accordingly. * */ // Default mixins and settings ----------------- @import "../template/mixins"; @import "../template/settings"; // --------------------------------------------- // Include theme-specific fonts @import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic); // Colors used in the theme $blood: #a23; $coal: #222; $codeBackground: #23241f; // Main text $mainFont: Ubuntu, 'sans-serif'; $mainFontSize: 36px; $mainColor: #eee; // Headings $headingFont: Ubuntu, 'sans-serif'; $headingTextShadow: 2px 2px 2px $coal; // h1 shadow, borrowed humbly from // (c) Default theme by Hakim El Hattab $heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); // Links $linkColor: $blood; $linkColorHover: lighten( $linkColor, 20% ); // Text selection $selectionBackgroundColor: $blood; $selectionColor: #fff; // Background generator @mixin bodyBackground() { @include radial-gradient( $coal, lighten( $coal, 25% ) ); } // Theme template ------------------------------ @import "../template/theme"; // --------------------------------------------- // some overrides after theme template import .reveal p { font-weight: 300; text-shadow: 1px 1px $coal; } .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 { font-weight: 700; } .reveal a, .reveal a:hover { text-shadow: 2px 2px 2px #000; } .reveal small a, .reveal small a:hover { text-shadow: 1px 1px 1px #000; } .reveal p code { background-color: $codeBackground; display: inline-block; border-radius: 7px; } .reveal small code { vertical-align: baseline; } ================================================ FILE: presentation/css/theme/source/league.scss ================================================ /** * League theme for reveal.js. * * This was the default theme pre-3.0.0. * * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se */ // Default mixins and settings ----------------- @import "../template/mixins"; @import "../template/settings"; // --------------------------------------------- // Include theme-specific fonts @import url(../../lib/font/league-gothic/league-gothic.css); @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); // Override theme settings (see ../template/settings.scss) $headingTextShadow: 0px 0px 6px rgba(0,0,0,0.2); $heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); // Background generator @mixin bodyBackground() { @include radial-gradient( rgba(28,30,32,1), rgba(85,90,95,1) ); } // Theme template ------------------------------ @import "../template/theme"; // --------------------------------------------- ================================================ FILE: presentation/css/theme/source/moon.scss ================================================ /** * Solarized Dark theme for reveal.js. * Author: Achim Staebler */ // Default mixins and settings ----------------- @import "../template/mixins"; @import "../template/settings"; // --------------------------------------------- // Include theme-specific fonts @import url(../../lib/font/league-gothic/league-gothic.css); @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); /** * Solarized colors by Ethan Schoonover */ html * { color-profile: sRGB; rendering-intent: auto; } // Solarized colors $base03: #002b36; $base02: #073642; $base01: #586e75; $base00: #657b83; $base0: #839496; $base1: #93a1a1; $base2: #eee8d5; $base3: #fdf6e3; $yellow: #b58900; $orange: #cb4b16; $red: #dc322f; $magenta: #d33682; $violet: #6c71c4; $blue: #268bd2; $cyan: #2aa198; $green: #859900; // Override theme settings (see ../template/settings.scss) $mainColor: $base1; $headingColor: $base2; $headingTextShadow: none; $backgroundColor: $base03; $linkColor: $blue; $linkColorHover: lighten( $linkColor, 20% ); $selectionBackgroundColor: $magenta; // Theme template ------------------------------ @import "../template/theme"; // --------------------------------------------- ================================================ FILE: presentation/css/theme/source/night.scss ================================================ /** * Black theme for reveal.js. * * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se */ // Default mixins and settings ----------------- @import "../template/mixins"; @import "../template/settings"; // --------------------------------------------- // Include theme-specific fonts @import url(https://fonts.googleapis.com/css?family=Montserrat:700); @import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic); // Override theme settings (see ../template/settings.scss) $backgroundColor: #111; $mainFont: 'Open Sans', sans-serif; $linkColor: #e7ad52; $linkColorHover: lighten( $linkColor, 20% ); $headingFont: 'Montserrat', Impact, sans-serif; $headingTextShadow: none; $headingLetterSpacing: -0.03em; $headingTextTransform: none; $selectionBackgroundColor: #e7ad52; $mainFontSize: 30px; // Theme template ------------------------------ @import "../template/theme"; // --------------------------------------------- ================================================ FILE: presentation/css/theme/source/serif.scss ================================================ /** * A simple theme for reveal.js presentations, similar * to the default theme. The accent color is brown. * * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed. */ // Default mixins and settings ----------------- @import "../template/mixins"; @import "../template/settings"; // --------------------------------------------- // Override theme settings (see ../template/settings.scss) $mainFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; $mainColor: #000; $headingFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; $headingColor: #383D3D; $headingTextShadow: none; $headingTextTransform: none; $backgroundColor: #F0F1EB; $linkColor: #51483D; $linkColorHover: lighten( $linkColor, 20% ); $selectionBackgroundColor: #26351C; .reveal a { line-height: 1.3em; } // Theme template ------------------------------ @import "../template/theme"; // --------------------------------------------- ================================================ FILE: presentation/css/theme/source/simple.scss ================================================ /** * A simple theme for reveal.js presentations, similar * to the default theme. The accent color is darkblue. * * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed. * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se */ // Default mixins and settings ----------------- @import "../template/mixins"; @import "../template/settings"; // --------------------------------------------- // Include theme-specific fonts @import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700); @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); // Override theme settings (see ../template/settings.scss) $mainFont: 'Lato', sans-serif; $mainColor: #000; $headingFont: 'News Cycle', Impact, sans-serif; $headingColor: #000; $headingTextShadow: none; $headingTextTransform: none; $backgroundColor: #fff; $linkColor: #00008B; $linkColorHover: lighten( $linkColor, 20% ); $selectionBackgroundColor: rgba(0, 0, 0, 0.99); // Theme template ------------------------------ @import "../template/theme"; // --------------------------------------------- ================================================ FILE: presentation/css/theme/source/sky.scss ================================================ /** * Sky theme for reveal.js. * * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se */ // Default mixins and settings ----------------- @import "../template/mixins"; @import "../template/settings"; // --------------------------------------------- // Include theme-specific fonts @import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic); @import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700); // Override theme settings (see ../template/settings.scss) $mainFont: 'Open Sans', sans-serif; $mainColor: #333; $headingFont: 'Quicksand', sans-serif; $headingColor: #333; $headingLetterSpacing: -0.08em; $headingTextShadow: none; $backgroundColor: #f7fbfc; $linkColor: #3b759e; $linkColorHover: lighten( $linkColor, 20% ); $selectionBackgroundColor: #134674; // Fix links so they are not cut off .reveal a { line-height: 1.3em; } // Background generator @mixin bodyBackground() { @include radial-gradient( #add9e4, #f7fbfc ); } // Theme template ------------------------------ @import "../template/theme"; // --------------------------------------------- ================================================ FILE: presentation/css/theme/source/solarized.scss ================================================ /** * Solarized Light theme for reveal.js. * Author: Achim Staebler */ // Default mixins and settings ----------------- @import "../template/mixins"; @import "../template/settings"; // --------------------------------------------- // Include theme-specific fonts @import url(../../lib/font/league-gothic/league-gothic.css); @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); /** * Solarized colors by Ethan Schoonover */ html * { color-profile: sRGB; rendering-intent: auto; } // Solarized colors $base03: #002b36; $base02: #073642; $base01: #586e75; $base00: #657b83; $base0: #839496; $base1: #93a1a1; $base2: #eee8d5; $base3: #fdf6e3; $yellow: #b58900; $orange: #cb4b16; $red: #dc322f; $magenta: #d33682; $violet: #6c71c4; $blue: #268bd2; $cyan: #2aa198; $green: #859900; // Override theme settings (see ../template/settings.scss) $mainColor: $base00; $headingColor: $base01; $headingTextShadow: none; $backgroundColor: $base3; $linkColor: $blue; $linkColorHover: lighten( $linkColor, 20% ); $selectionBackgroundColor: $magenta; // Background generator // @mixin bodyBackground() { // @include radial-gradient( rgba($base3,1), rgba(lighten($base3, 20%),1) ); // } // Theme template ------------------------------ @import "../template/theme"; // --------------------------------------------- ================================================ FILE: presentation/css/theme/source/white.scss ================================================ /** * White theme for reveal.js. This is the opposite of the 'black' theme. * * Copyright (C) 2015 Hakim El Hattab, http://hakim.se */ // Default mixins and settings ----------------- @import "../template/mixins"; @import "../template/settings"; // --------------------------------------------- // Include theme-specific fonts @import url(../../lib/font/source-sans-pro/source-sans-pro.css); // Override theme settings (see ../template/settings.scss) $backgroundColor: #fff; $mainColor: #222; $headingColor: #222; $mainFontSize: 38px; $mainFont: 'Source Sans Pro', Helvetica, sans-serif; $headingFont: 'Source Sans Pro', Helvetica, sans-serif; $headingTextShadow: none; $headingLetterSpacing: normal; $headingTextTransform: uppercase; $headingFontWeight: 600; $linkColor: #2a76dd; $linkColorHover: lighten( $linkColor, 15% ); $selectionBackgroundColor: lighten( $linkColor, 25% ); $heading1Size: 2.5em; $heading2Size: 1.6em; $heading3Size: 1.3em; $heading4Size: 1.0em; section.has-dark-background { &, h1, h2, h3, h4, h5, h6 { color: #fff; } } // Theme template ------------------------------ @import "../template/theme"; // --------------------------------------------- ================================================ FILE: presentation/css/theme/template/mixins.scss ================================================ @mixin vertical-gradient( $top, $bottom ) { background: $top; background: -moz-linear-gradient( top, $top 0%, $bottom 100% ); background: -webkit-gradient( linear, left top, left bottom, color-stop(0%,$top), color-stop(100%,$bottom) ); background: -webkit-linear-gradient( top, $top 0%, $bottom 100% ); background: -o-linear-gradient( top, $top 0%, $bottom 100% ); background: -ms-linear-gradient( top, $top 0%, $bottom 100% ); background: linear-gradient( top, $top 0%, $bottom 100% ); } @mixin horizontal-gradient( $top, $bottom ) { background: $top; background: -moz-linear-gradient( left, $top 0%, $bottom 100% ); background: -webkit-gradient( linear, left top, right top, color-stop(0%,$top), color-stop(100%,$bottom) ); background: -webkit-linear-gradient( left, $top 0%, $bottom 100% ); background: -o-linear-gradient( left, $top 0%, $bottom 100% ); background: -ms-linear-gradient( left, $top 0%, $bottom 100% ); background: linear-gradient( left, $top 0%, $bottom 100% ); } @mixin radial-gradient( $outer, $inner, $type: circle ) { background: $outer; background: -moz-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); background: -webkit-gradient( radial, center center, 0px, center center, 100%, color-stop(0%,$inner), color-stop(100%,$outer) ); background: -webkit-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); background: -o-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); background: -ms-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); background: radial-gradient( center, $type cover, $inner 0%, $outer 100% ); } ================================================ FILE: presentation/css/theme/template/settings.scss ================================================ // Base settings for all themes that can optionally be // overridden by the super-theme // Background of the presentation $backgroundColor: #2b2b2b; // Primary/body text $mainFont: 'Lato', sans-serif; $mainFontSize: 36px; $mainColor: #eee; // Vertical spacing between blocks of text $blockMargin: 20px; // Headings $headingMargin: 0 0 $blockMargin 0; $headingFont: 'League Gothic', Impact, sans-serif; $headingColor: #eee; $headingLineHeight: 1.2; $headingLetterSpacing: normal; $headingTextTransform: uppercase; $headingTextShadow: none; $headingFontWeight: normal; $heading1TextShadow: $headingTextShadow; $heading1Size: 3.77em; $heading2Size: 2.11em; $heading3Size: 1.55em; $heading4Size: 1.00em; // Links and actions $linkColor: #13DAEC; $linkColorHover: lighten( $linkColor, 20% ); // Text selection $selectionBackgroundColor: #FF5E99; $selectionColor: #fff; // Generates the presentation background, can be overridden // to return a background image or gradient @mixin bodyBackground() { background: $backgroundColor; } ================================================ FILE: presentation/css/theme/template/theme.scss ================================================ // Base theme template for reveal.js /********************************************* * GLOBAL STYLES *********************************************/ body { @include bodyBackground(); background-color: $backgroundColor; } .reveal { font-family: $mainFont; font-size: $mainFontSize; font-weight: normal; color: $mainColor; } ::selection { color: $selectionColor; background: $selectionBackgroundColor; text-shadow: none; } .reveal .slides>section, .reveal .slides>section>section { line-height: 1.3; font-weight: inherit; } /********************************************* * HEADERS *********************************************/ .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 { margin: $headingMargin; color: $headingColor; font-family: $headingFont; font-weight: $headingFontWeight; line-height: $headingLineHeight; letter-spacing: $headingLetterSpacing; text-transform: $headingTextTransform; text-shadow: $headingTextShadow; word-wrap: break-word; } .reveal h1 {font-size: $heading1Size; } .reveal h2 {font-size: $heading2Size; } .reveal h3 {font-size: $heading3Size; } .reveal h4 {font-size: $heading4Size; } .reveal h1 { text-shadow: $heading1TextShadow; } /********************************************* * OTHER *********************************************/ .reveal p { margin: $blockMargin 0; line-height: 1.3; } /* Ensure certain elements are never larger than the slide itself */ .reveal img, .reveal video, .reveal iframe { max-width: 95%; max-height: 95%; } .reveal strong, .reveal b { font-weight: bold; } .reveal em { font-style: italic; } .reveal ol, .reveal dl, .reveal ul { display: inline-block; text-align: left; margin: 0 0 0 1em; } .reveal ol { list-style-type: decimal; } .reveal ul { list-style-type: disc; } .reveal ul ul { list-style-type: square; } .reveal ul ul ul { list-style-type: circle; } .reveal ul ul, .reveal ul ol, .reveal ol ol, .reveal ol ul { display: block; margin-left: 40px; } .reveal dt { font-weight: bold; } .reveal dd { margin-left: 40px; } .reveal q, .reveal blockquote { quotes: none; } .reveal blockquote { display: block; position: relative; width: 70%; margin: $blockMargin auto; padding: 5px; font-style: italic; background: rgba(255, 255, 255, 0.05); box-shadow: 0px 0px 2px rgba(0,0,0,0.2); } .reveal blockquote p:first-child, .reveal blockquote p:last-child { display: inline-block; } .reveal q { font-style: italic; } .reveal pre { display: block; position: relative; width: 90%; margin: $blockMargin auto; text-align: left; font-size: 0.55em; font-family: monospace; line-height: 1.2em; word-wrap: break-word; box-shadow: 0px 0px 6px rgba(0,0,0,0.3); } .reveal code { font-family: monospace; } .reveal pre code { display: block; padding: 5px; overflow: auto; max-height: 400px; word-wrap: normal; background: #3F3F3F; color: #DCDCDC; } .reveal table { margin: auto; border-collapse: collapse; border-spacing: 0; } .reveal table th { font-weight: bold; } .reveal table th, .reveal table td { text-align: left; padding: 0.2em 0.5em 0.2em 0.5em; border-bottom: 1px solid; } .reveal table tr:last-child td { border-bottom: none; } .reveal sup { vertical-align: super; } .reveal sub { vertical-align: sub; } .reveal small { display: inline-block; font-size: 0.6em; line-height: 1.2em; vertical-align: top; } .reveal small * { vertical-align: top; } /********************************************* * LINKS *********************************************/ .reveal a { color: $linkColor; text-decoration: none; -webkit-transition: color .15s ease; -moz-transition: color .15s ease; transition: color .15s ease; } .reveal a:hover { color: $linkColorHover; text-shadow: none; border: none; } .reveal .roll span:after { color: #fff; background: darken( $linkColor, 15% ); } /********************************************* * IMAGES *********************************************/ .reveal section img { margin: 15px 0px; background: rgba(255,255,255,0.12); border: 4px solid $mainColor; box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } .reveal a img { -webkit-transition: all .15s linear; -moz-transition: all .15s linear; transition: all .15s linear; } .reveal a:hover img { background: rgba(255,255,255,0.2); border-color: $linkColor; box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } /********************************************* * NAVIGATION CONTROLS *********************************************/ .reveal .controls div.navigate-left, .reveal .controls div.navigate-left.enabled { border-right-color: $linkColor; } .reveal .controls div.navigate-right, .reveal .controls div.navigate-right.enabled { border-left-color: $linkColor; } .reveal .controls div.navigate-up, .reveal .controls div.navigate-up.enabled { border-bottom-color: $linkColor; } .reveal .controls div.navigate-down, .reveal .controls div.navigate-down.enabled { border-top-color: $linkColor; } .reveal .controls div.navigate-left.enabled:hover { border-right-color: $linkColorHover; } .reveal .controls div.navigate-right.enabled:hover { border-left-color: $linkColorHover; } .reveal .controls div.navigate-up.enabled:hover { border-bottom-color: $linkColorHover; } .reveal .controls div.navigate-down.enabled:hover { border-top-color: $linkColorHover; } /********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { background: rgba(0,0,0,0.2); } .reveal .progress span { background: $linkColor; -webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); } /********************************************* * SLIDE NUMBER *********************************************/ .reveal .slide-number { color: $linkColor; } ================================================ FILE: presentation/css/theme/white.css ================================================ @import url(../../lib/font/source-sans-pro/source-sans-pro.css); /** * White theme for reveal.js. This is the opposite of the 'black' theme. * * Copyright (C) 2015 Hakim El Hattab, http://hakim.se */ section.has-dark-background, section.has-dark-background h1, section.has-dark-background h2, section.has-dark-background h3, section.has-dark-background h4, section.has-dark-background h5, section.has-dark-background h6 { color: #fff; } /********************************************* * GLOBAL STYLES *********************************************/ body { background: #fff; background-color: #fff; } .reveal { font-family: 'Source Sans Pro', Helvetica, sans-serif; font-size: 38px; font-weight: normal; color: #222; } ::selection { color: #fff; background: #98bdef; text-shadow: none; } .reveal .slides > section, .reveal .slides > section > section { line-height: 1.3; font-weight: inherit; } /********************************************* * HEADERS *********************************************/ .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 { margin: 0 0 20px 0; color: #222; font-family: 'Source Sans Pro', Helvetica, sans-serif; font-weight: 600; line-height: 1.2; letter-spacing: normal; text-transform: uppercase; text-shadow: none; word-wrap: break-word; } .reveal h1 { font-size: 2.5em; } .reveal h2 { font-size: 1.6em; } .reveal h3 { font-size: 1.3em; } .reveal h4 { font-size: 1em; } .reveal h1 { text-shadow: none; } /********************************************* * OTHER *********************************************/ .reveal p { margin: 20px 0; line-height: 1.3; } /* Ensure certain elements are never larger than the slide itself */ .reveal img, .reveal video, .reveal iframe { max-width: 95%; max-height: 95%; } .reveal strong, .reveal b { font-weight: bold; } .reveal em { font-style: italic; } .reveal ol, .reveal dl, .reveal ul { display: inline-block; text-align: left; margin: 0 0 0 1em; } .reveal ol { list-style-type: decimal; } .reveal ul { list-style-type: disc; } .reveal ul ul { list-style-type: square; } .reveal ul ul ul { list-style-type: circle; } .reveal ul ul, .reveal ul ol, .reveal ol ol, .reveal ol ul { display: block; margin-left: 40px; } .reveal dt { font-weight: bold; } .reveal dd { margin-left: 40px; } .reveal q, .reveal blockquote { quotes: none; } .reveal blockquote { display: block; position: relative; width: 70%; margin: 20px auto; padding: 5px; font-style: italic; background: rgba(255, 255, 255, 0.05); box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } .reveal blockquote p:first-child, .reveal blockquote p:last-child { display: inline-block; } .reveal q { font-style: italic; } .reveal pre { display: block; position: relative; width: 90%; margin: 20px auto; text-align: left; font-size: 0.55em; font-family: monospace; line-height: 1.2em; word-wrap: break-word; box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } .reveal code { font-family: monospace; } .reveal pre code { display: block; padding: 5px; overflow: auto; max-height: 400px; word-wrap: normal; background: #3F3F3F; color: #DCDCDC; } .reveal table { margin: auto; border-collapse: collapse; border-spacing: 0; } .reveal table th { font-weight: bold; } .reveal table th, .reveal table td { text-align: left; padding: 0.2em 0.5em 0.2em 0.5em; border-bottom: 1px solid; } .reveal table tr:last-child td { border-bottom: none; } .reveal sup { vertical-align: super; } .reveal sub { vertical-align: sub; } .reveal small { display: inline-block; font-size: 0.6em; line-height: 1.2em; vertical-align: top; } .reveal small * { vertical-align: top; } /********************************************* * LINKS *********************************************/ .reveal a { color: #2a76dd; text-decoration: none; -webkit-transition: color 0.15s ease; -moz-transition: color 0.15s ease; transition: color 0.15s ease; } .reveal a:hover { color: #6ca2e8; text-shadow: none; border: none; } .reveal .roll span:after { color: #fff; background: #1a54a1; } /********************************************* * IMAGES *********************************************/ .reveal section img { margin: 15px 0px; background: rgba(255, 255, 255, 0.12); border: 4px solid #222; box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } .reveal a img { -webkit-transition: all 0.15s linear; -moz-transition: all 0.15s linear; transition: all 0.15s linear; } .reveal a:hover img { background: rgba(255, 255, 255, 0.2); border-color: #2a76dd; box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } /********************************************* * NAVIGATION CONTROLS *********************************************/ .reveal .controls div.navigate-left, .reveal .controls div.navigate-left.enabled { border-right-color: #2a76dd; } .reveal .controls div.navigate-right, .reveal .controls div.navigate-right.enabled { border-left-color: #2a76dd; } .reveal .controls div.navigate-up, .reveal .controls div.navigate-up.enabled { border-bottom-color: #2a76dd; } .reveal .controls div.navigate-down, .reveal .controls div.navigate-down.enabled { border-top-color: #2a76dd; } .reveal .controls div.navigate-left.enabled:hover { border-right-color: #6ca2e8; } .reveal .controls div.navigate-right.enabled:hover { border-left-color: #6ca2e8; } .reveal .controls div.navigate-up.enabled:hover { border-bottom-color: #6ca2e8; } .reveal .controls div.navigate-down.enabled:hover { border-top-color: #6ca2e8; } /********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { background: rgba(0, 0, 0, 0.2); } .reveal .progress span { background: #2a76dd; -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } /********************************************* * SLIDE NUMBER *********************************************/ .reveal .slide-number { color: #2a76dd; } ================================================ FILE: presentation/index.html ================================================ Paperless


Paperless

  @searchingfortao   |     danielquinn   |     danielquinn.org


My Inspiration


Paper Sucks

Paper Loves Being Mysterious

There's No Ctrl+F

Paper Hates Your Spine

It's heavy and takes up space

Paper Wants to Breed

Backups? More Paper!

Paper Hates the Planet

It's 2016

We shouldn't even need to use this stuff anymore

So I made Paperless

What's it Do?

  • Consumes documents from a directory, API, or mailbox
  • OCRs them and puts the text in a database
  • Automatically tags the db record based on user-rules
  • Encrypts and stores the original

It's Just a Wrapper

  • ImageMagick
  • Tesseract
  • GnuPG
  • Python3/Django

How's it Work?

1: The Consumer

(Imports documents)

  • Runs in a loop
  • Reads from a directory
  • Occasionally checking a mailbox

2: The Webserver

(Lets you find stuff)

  • Currently the Django Admin (I know)
  • Provides a DRF API
  • Users are building proper UIs

Demo!

TODO

It works, but it needs polish

  • The UI is the Django admin
  • Mail consumption is really raw
  • Some sort of plugin architecture?
  • OMG Tests

Fork Me

  https://github.com/the-paperless-project/paperless


================================================ FILE: presentation/js/reveal.js ================================================ /*! * reveal.js * http://lab.hakim.se/reveal-js * MIT licensed * * Copyright (C) 2015 Hakim El Hattab, http://hakim.se */ (function( root, factory ) { if( typeof define === 'function' && define.amd ) { // AMD. Register as an anonymous module. define( function() { root.Reveal = factory(); return root.Reveal; } ); } else if( typeof exports === 'object' ) { // Node. Does not work with strict CommonJS. module.exports = factory(); } else { // Browser globals. root.Reveal = factory(); } }( this, function() { 'use strict'; var Reveal; var SLIDES_SELECTOR = '.slides section', HORIZONTAL_SLIDES_SELECTOR = '.slides>section', VERTICAL_SLIDES_SELECTOR = '.slides>section.present>section', HOME_SLIDE_SELECTOR = '.slides>section:first-of-type', // Configurations defaults, can be overridden at initialization time config = { // The "normal" size of the presentation, aspect ratio will be preserved // when the presentation is scaled to fit different resolutions width: 960, height: 700, // Factor of the display size that should remain empty around the content margin: 0.1, // Bounds for smallest/largest possible scale to apply to content minScale: 0.2, maxScale: 1.5, // Display controls in the bottom right corner controls: true, // Display a presentation progress bar progress: true, // Display the page number of the current slide slideNumber: false, // Push each slide change to the browser history history: false, // Enable keyboard shortcuts for navigation keyboard: true, // Optional function that blocks keyboard events when retuning false keyboardCondition: null, // Enable the slide overview mode overview: true, // Vertical centering of slides center: true, // Enables touch navigation on devices with touch input touch: true, // Loop the presentation loop: false, // Change the presentation direction to be RTL rtl: false, // Turns fragments on and off globally fragments: true, // Flags if the presentation is running in an embedded mode, // i.e. contained within a limited portion of the screen embedded: false, // Flags if we should show a help overlay when the questionmark // key is pressed help: true, // Flags if it should be possible to pause the presentation (blackout) pause: true, // Number of milliseconds between automatically proceeding to the // next slide, disabled when set to 0, this value can be overwritten // by using a data-autoslide attribute on your slides autoSlide: 0, // Stop auto-sliding after user input autoSlideStoppable: true, // Enable slide navigation via mouse wheel mouseWheel: false, // Apply a 3D roll to links on hover rollingLinks: false, // Hides the address bar on mobile devices hideAddressBar: true, // Opens links in an iframe preview overlay previewLinks: false, // Exposes the reveal.js API through window.postMessage postMessage: true, // Dispatches all reveal.js events to the parent window through postMessage postMessageEvents: false, // Focuses body when page changes visiblity to ensure keyboard shortcuts work focusBodyOnPageVisibilityChange: true, // Transition style transition: 'slide', // none/fade/slide/convex/concave/zoom // Transition speed transitionSpeed: 'default', // default/fast/slow // Transition style for full page slide backgrounds backgroundTransition: 'fade', // none/fade/slide/convex/concave/zoom // Parallax background image parallaxBackgroundImage: '', // CSS syntax, e.g. "a.jpg" // Parallax background size parallaxBackgroundSize: '', // CSS syntax, e.g. "3000px 2000px" // Number of slides away from the current that are visible viewDistance: 3, // Script dependencies to load dependencies: [] }, // Flags if reveal.js is loaded (has dispatched the 'ready' event) loaded = false, // The horizontal and vertical index of the currently active slide indexh, indexv, // The previous and current slide HTML elements previousSlide, currentSlide, previousBackground, // Slides may hold a data-state attribute which we pick up and apply // as a class to the body. This list contains the combined state of // all current slides. state = [], // The current scale of the presentation (see width/height config) scale = 1, // Cached references to DOM elements dom = {}, // Features supported by the browser, see #checkCapabilities() features = {}, // Client is a mobile device, see #checkCapabilities() isMobileDevice, // Throttles mouse wheel navigation lastMouseWheelStep = 0, // Delays updates to the URL due to a Chrome thumbnailer bug writeURLTimeout = 0, // Flags if the interaction event listeners are bound eventsAreBound = false, // The current auto-slide duration autoSlide = 0, // Auto slide properties autoSlidePlayer, autoSlideTimeout = 0, autoSlideStartTime = -1, autoSlidePaused = false, // Holds information about the currently ongoing touch input touch = { startX: 0, startY: 0, startSpan: 0, startCount: 0, captured: false, threshold: 40 }, // Holds information about the keyboard shortcuts keyboardShortcuts = { 'N , SPACE': 'Next slide', 'P': 'Previous slide', '← , H': 'Navigate left', '→ , L': 'Navigate right', '↑ , K': 'Navigate up', '↓ , J': 'Navigate down', 'Home': 'First slide', 'End': 'Last slide', 'B , .': 'Pause', 'F': 'Fullscreen', 'ESC, O': 'Slide overview' }; /** * Starts up the presentation if the client is capable. */ function initialize( options ) { checkCapabilities(); if( !features.transforms2d && !features.transforms3d ) { document.body.setAttribute( 'class', 'no-transforms' ); // Since JS won't be running any further, we need to load all // images that were intended to lazy load now var images = document.getElementsByTagName( 'img' ); for( var i = 0, len = images.length; i < len; i++ ) { var image = images[i]; if( image.getAttribute( 'data-src' ) ) { image.setAttribute( 'src', image.getAttribute( 'data-src' ) ); image.removeAttribute( 'data-src' ); } } // If the browser doesn't support core features we won't be // using JavaScript to control the presentation return; } // Cache references to key DOM elements dom.wrapper = document.querySelector( '.reveal' ); dom.slides = document.querySelector( '.reveal .slides' ); // Force a layout when the whole page, incl fonts, has loaded window.addEventListener( 'load', layout, false ); var query = Reveal.getQueryHash(); // Do not accept new dependencies via query config to avoid // the potential of malicious script injection if( typeof query['dependencies'] !== 'undefined' ) delete query['dependencies']; // Copy options over to our config object extend( config, options ); extend( config, query ); // Hide the address bar in mobile browsers hideAddressBar(); // Loads the dependencies and continues to #start() once done load(); } /** * Inspect the client to see what it's capable of, this * should only happens once per runtime. */ function checkCapabilities() { features.transforms3d = 'WebkitPerspective' in document.body.style || 'MozPerspective' in document.body.style || 'msPerspective' in document.body.style || 'OPerspective' in document.body.style || 'perspective' in document.body.style; features.transforms2d = 'WebkitTransform' in document.body.style || 'MozTransform' in document.body.style || 'msTransform' in document.body.style || 'OTransform' in document.body.style || 'transform' in document.body.style; features.requestAnimationFrameMethod = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame; features.requestAnimationFrame = typeof features.requestAnimationFrameMethod === 'function'; features.canvas = !!document.createElement( 'canvas' ).getContext; features.touch = !!( 'ontouchstart' in window ); isMobileDevice = navigator.userAgent.match( /(iphone|ipod|ipad|android)/gi ); } /** * Loads the dependencies of reveal.js. Dependencies are * defined via the configuration option 'dependencies' * and will be loaded prior to starting/binding reveal.js. * Some dependencies may have an 'async' flag, if so they * will load after reveal.js has been started up. */ function load() { var scripts = [], scriptsAsync = [], scriptsToPreload = 0; // Called once synchronous scripts finish loading function proceed() { if( scriptsAsync.length ) { // Load asynchronous scripts head.js.apply( null, scriptsAsync ); } start(); } function loadScript( s ) { head.ready( s.src.match( /([\w\d_\-]*)\.?js$|[^\\\/]*$/i )[0], function() { // Extension may contain callback functions if( typeof s.callback === 'function' ) { s.callback.apply( this ); } if( --scriptsToPreload === 0 ) { proceed(); } }); } for( var i = 0, len = config.dependencies.length; i < len; i++ ) { var s = config.dependencies[i]; // Load if there's no condition or the condition is truthy if( !s.condition || s.condition() ) { if( s.async ) { scriptsAsync.push( s.src ); } else { scripts.push( s.src ); } loadScript( s ); } } if( scripts.length ) { scriptsToPreload = scripts.length; // Load synchronous scripts head.js.apply( null, scripts ); } else { proceed(); } } /** * Starts up reveal.js by binding input events and navigating * to the current URL deeplink if there is one. */ function start() { // Make sure we've got all the DOM elements we need setupDOM(); // Listen to messages posted to this window setupPostMessage(); // Resets all vertical slides so that only the first is visible resetVerticalSlides(); // Updates the presentation to match the current configuration values configure(); // Read the initial hash readURL(); // Update all backgrounds updateBackground( true ); // Notify listeners that the presentation is ready but use a 1ms // timeout to ensure it's not fired synchronously after #initialize() setTimeout( function() { // Enable transitions now that we're loaded dom.slides.classList.remove( 'no-transition' ); loaded = true; dispatchEvent( 'ready', { 'indexh': indexh, 'indexv': indexv, 'currentSlide': currentSlide } ); }, 1 ); // Special setup and config is required when printing to PDF if( isPrintingPDF() ) { removeEventListeners(); // The document needs to have loaded for the PDF layout // measurements to be accurate if( document.readyState === 'complete' ) { setupPDF(); } else { window.addEventListener( 'load', setupPDF ); } } } /** * Finds and stores references to DOM elements which are * required by the presentation. If a required element is * not found, it is created. */ function setupDOM() { // Prevent transitions while we're loading dom.slides.classList.add( 'no-transition' ); // Background element dom.background = createSingletonNode( dom.wrapper, 'div', 'backgrounds', null ); // Progress bar dom.progress = createSingletonNode( dom.wrapper, 'div', 'progress', '' ); dom.progressbar = dom.progress.querySelector( 'span' ); // Arrow controls createSingletonNode( dom.wrapper, 'aside', 'controls', '' + '' + '' + '' ); // Slide number dom.slideNumber = createSingletonNode( dom.wrapper, 'div', 'slide-number', '' ); // Overlay graphic which is displayed during the paused mode createSingletonNode( dom.wrapper, 'div', 'pause-overlay', null ); // Cache references to elements dom.controls = document.querySelector( '.reveal .controls' ); dom.theme = document.querySelector( '#theme' ); dom.wrapper.setAttribute( 'role', 'application' ); // There can be multiple instances of controls throughout the page dom.controlsLeft = toArray( document.querySelectorAll( '.navigate-left' ) ); dom.controlsRight = toArray( document.querySelectorAll( '.navigate-right' ) ); dom.controlsUp = toArray( document.querySelectorAll( '.navigate-up' ) ); dom.controlsDown = toArray( document.querySelectorAll( '.navigate-down' ) ); dom.controlsPrev = toArray( document.querySelectorAll( '.navigate-prev' ) ); dom.controlsNext = toArray( document.querySelectorAll( '.navigate-next' ) ); dom.statusDiv = createStatusDiv(); } /** * Creates a hidden div with role aria-live to announce the * current slide content. Hide the div off-screen to make it * available only to Assistive Technologies. */ function createStatusDiv() { var statusDiv = document.getElementById( 'aria-status-div' ); if( !statusDiv ) { statusDiv = document.createElement( 'div' ); statusDiv.style.position = 'absolute'; statusDiv.style.height = '1px'; statusDiv.style.width = '1px'; statusDiv.style.overflow ='hidden'; statusDiv.style.clip = 'rect( 1px, 1px, 1px, 1px )'; statusDiv.setAttribute( 'id', 'aria-status-div' ); statusDiv.setAttribute( 'aria-live', 'polite' ); statusDiv.setAttribute( 'aria-atomic','true' ); dom.wrapper.appendChild( statusDiv ); } return statusDiv; } /** * Configures the presentation for printing to a static * PDF. */ function setupPDF() { var slideSize = getComputedSlideSize( window.innerWidth, window.innerHeight ); // Dimensions of the PDF pages var pageWidth = Math.floor( slideSize.width * ( 1 + config.margin ) ), pageHeight = Math.floor( slideSize.height * ( 1 + config.margin ) ); // Dimensions of slides within the pages var slideWidth = slideSize.width, slideHeight = slideSize.height; // Let the browser know what page size we want to print injectStyleSheet( '@page{size:'+ pageWidth +'px '+ pageHeight +'px; margin: 0;}' ); // Limit the size of certain elements to the dimensions of the slide injectStyleSheet( '.reveal section>img, .reveal section>video, .reveal section>iframe{max-width: '+ slideWidth +'px; max-height:'+ slideHeight +'px}' ); document.body.classList.add( 'print-pdf' ); document.body.style.width = pageWidth + 'px'; document.body.style.height = pageHeight + 'px'; // Slide and slide background layout toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ).forEach( function( slide ) { // Vertical stacks are not centred since their section // children will be if( slide.classList.contains( 'stack' ) === false ) { // Center the slide inside of the page, giving the slide some margin var left = ( pageWidth - slideWidth ) / 2, top = ( pageHeight - slideHeight ) / 2; var contentHeight = getAbsoluteHeight( slide ); var numberOfPages = Math.max( Math.ceil( contentHeight / pageHeight ), 1 ); // Center slides vertically if( numberOfPages === 1 && config.center || slide.classList.contains( 'center' ) ) { top = Math.max( ( pageHeight - contentHeight ) / 2, 0 ); } // Position the slide inside of the page slide.style.left = left + 'px'; slide.style.top = top + 'px'; slide.style.width = slideWidth + 'px'; // TODO Backgrounds need to be multiplied when the slide // stretches over multiple pages var background = slide.querySelector( '.slide-background' ); if( background ) { background.style.width = pageWidth + 'px'; background.style.height = ( pageHeight * numberOfPages ) + 'px'; background.style.top = -top + 'px'; background.style.left = -left + 'px'; } } } ); // Show all fragments toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR + ' .fragment' ) ).forEach( function( fragment ) { fragment.classList.add( 'visible' ); } ); } /** * Creates an HTML element and returns a reference to it. * If the element already exists the existing instance will * be returned. */ function createSingletonNode( container, tagname, classname, innerHTML ) { // Find all nodes matching the description var nodes = container.querySelectorAll( '.' + classname ); // Check all matches to find one which is a direct child of // the specified container for( var i = 0; i < nodes.length; i++ ) { var testNode = nodes[i]; if( testNode.parentNode === container ) { return testNode; } } // If no node was found, create it now var node = document.createElement( tagname ); node.classList.add( classname ); if( typeof innerHTML === 'string' ) { node.innerHTML = innerHTML; } container.appendChild( node ); return node; } /** * Creates the slide background elements and appends them * to the background container. One element is created per * slide no matter if the given slide has visible background. */ function createBackgrounds() { var printMode = isPrintingPDF(); // Clear prior backgrounds dom.background.innerHTML = ''; dom.background.classList.add( 'no-transition' ); // Iterate over all horizontal slides toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).forEach( function( slideh ) { var backgroundStack; if( printMode ) { backgroundStack = createBackground( slideh, slideh ); } else { backgroundStack = createBackground( slideh, dom.background ); } // Iterate over all vertical slides toArray( slideh.querySelectorAll( 'section' ) ).forEach( function( slidev ) { if( printMode ) { createBackground( slidev, slidev ); } else { createBackground( slidev, backgroundStack ); } backgroundStack.classList.add( 'stack' ); } ); } ); // Add parallax background if specified if( config.parallaxBackgroundImage ) { dom.background.style.backgroundImage = 'url("' + config.parallaxBackgroundImage + '")'; dom.background.style.backgroundSize = config.parallaxBackgroundSize; // Make sure the below properties are set on the element - these properties are // needed for proper transitions to be set on the element via CSS. To remove // annoying background slide-in effect when the presentation starts, apply // these properties after short time delay setTimeout( function() { dom.wrapper.classList.add( 'has-parallax-background' ); }, 1 ); } else { dom.background.style.backgroundImage = ''; dom.wrapper.classList.remove( 'has-parallax-background' ); } } /** * Creates a background for the given slide. * * @param {HTMLElement} slide * @param {HTMLElement} container The element that the background * should be appended to */ function createBackground( slide, container ) { var data = { background: slide.getAttribute( 'data-background' ), backgroundSize: slide.getAttribute( 'data-background-size' ), backgroundImage: slide.getAttribute( 'data-background-image' ), backgroundVideo: slide.getAttribute( 'data-background-video' ), backgroundIframe: slide.getAttribute( 'data-background-iframe' ), backgroundColor: slide.getAttribute( 'data-background-color' ), backgroundRepeat: slide.getAttribute( 'data-background-repeat' ), backgroundPosition: slide.getAttribute( 'data-background-position' ), backgroundTransition: slide.getAttribute( 'data-background-transition' ) }; var element = document.createElement( 'div' ); // Carry over custom classes from the slide to the background element.className = 'slide-background ' + slide.className.replace( /present|past|future/, '' ); if( data.background ) { // Auto-wrap image urls in url(...) if( /^(http|file|\/\/)/gi.test( data.background ) || /\.(svg|png|jpg|jpeg|gif|bmp)$/gi.test( data.background ) ) { slide.setAttribute( 'data-background-image', data.background ); } else { element.style.background = data.background; } } // Create a hash for this combination of background settings. // This is used to determine when two slide backgrounds are // the same. if( data.background || data.backgroundColor || data.backgroundImage || data.backgroundVideo || data.backgroundIframe ) { element.setAttribute( 'data-background-hash', data.background + data.backgroundSize + data.backgroundImage + data.backgroundVideo + data.backgroundIframe + data.backgroundColor + data.backgroundRepeat + data.backgroundPosition + data.backgroundTransition ); } // Additional and optional background properties if( data.backgroundSize ) element.style.backgroundSize = data.backgroundSize; if( data.backgroundColor ) element.style.backgroundColor = data.backgroundColor; if( data.backgroundRepeat ) element.style.backgroundRepeat = data.backgroundRepeat; if( data.backgroundPosition ) element.style.backgroundPosition = data.backgroundPosition; if( data.backgroundTransition ) element.setAttribute( 'data-background-transition', data.backgroundTransition ); container.appendChild( element ); // If backgrounds are being recreated, clear old classes slide.classList.remove( 'has-dark-background' ); slide.classList.remove( 'has-light-background' ); // If this slide has a background color, add a class that // signals if it is light or dark. If the slide has no background // color, no class will be set var computedBackgroundColor = window.getComputedStyle( element ).backgroundColor; if( computedBackgroundColor ) { var rgb = colorToRgb( computedBackgroundColor ); // Ignore fully transparent backgrounds. Some browsers return // rgba(0,0,0,0) when reading the computed background color of // an element with no background if( rgb && rgb.a !== 0 ) { if( colorBrightness( computedBackgroundColor ) < 128 ) { slide.classList.add( 'has-dark-background' ); } else { slide.classList.add( 'has-light-background' ); } } } return element; } /** * Registers a listener to postMessage events, this makes it * possible to call all reveal.js API methods from another * window. For example: * * revealWindow.postMessage( JSON.stringify({ * method: 'slide', * args: [ 2 ] * }), '*' ); */ function setupPostMessage() { if( config.postMessage ) { window.addEventListener( 'message', function ( event ) { var data = event.data; // Make sure we're dealing with JSON if( data.charAt( 0 ) === '{' && data.charAt( data.length - 1 ) === '}' ) { data = JSON.parse( data ); // Check if the requested method can be found if( data.method && typeof Reveal[data.method] === 'function' ) { Reveal[data.method].apply( Reveal, data.args ); } } }, false ); } } /** * Applies the configuration settings from the config * object. May be called multiple times. */ function configure( options ) { var numberOfSlides = dom.wrapper.querySelectorAll( SLIDES_SELECTOR ).length; dom.wrapper.classList.remove( config.transition ); // New config options may be passed when this method // is invoked through the API after initialization if( typeof options === 'object' ) extend( config, options ); // Force linear transition based on browser capabilities if( features.transforms3d === false ) config.transition = 'linear'; dom.wrapper.classList.add( config.transition ); dom.wrapper.setAttribute( 'data-transition-speed', config.transitionSpeed ); dom.wrapper.setAttribute( 'data-background-transition', config.backgroundTransition ); dom.controls.style.display = config.controls ? 'block' : 'none'; dom.progress.style.display = config.progress ? 'block' : 'none'; if( config.rtl ) { dom.wrapper.classList.add( 'rtl' ); } else { dom.wrapper.classList.remove( 'rtl' ); } if( config.center ) { dom.wrapper.classList.add( 'center' ); } else { dom.wrapper.classList.remove( 'center' ); } // Exit the paused mode if it was configured off if( config.pause === false ) { resume(); } if( config.mouseWheel ) { document.addEventListener( 'DOMMouseScroll', onDocumentMouseScroll, false ); // FF document.addEventListener( 'mousewheel', onDocumentMouseScroll, false ); } else { document.removeEventListener( 'DOMMouseScroll', onDocumentMouseScroll, false ); // FF document.removeEventListener( 'mousewheel', onDocumentMouseScroll, false ); } // Rolling 3D links if( config.rollingLinks ) { enableRollingLinks(); } else { disableRollingLinks(); } // Iframe link previews if( config.previewLinks ) { enablePreviewLinks(); } else { disablePreviewLinks(); enablePreviewLinks( '[data-preview-link]' ); } // Remove existing auto-slide controls if( autoSlidePlayer ) { autoSlidePlayer.destroy(); autoSlidePlayer = null; } // Generate auto-slide controls if needed if( numberOfSlides > 1 && config.autoSlide && config.autoSlideStoppable && features.canvas && features.requestAnimationFrame ) { autoSlidePlayer = new Playback( dom.wrapper, function() { return Math.min( Math.max( ( Date.now() - autoSlideStartTime ) / autoSlide, 0 ), 1 ); } ); autoSlidePlayer.on( 'click', onAutoSlidePlayerClick ); autoSlidePaused = false; } // When fragments are turned off they should be visible if( config.fragments === false ) { toArray( dom.slides.querySelectorAll( '.fragment' ) ).forEach( function( element ) { element.classList.add( 'visible' ); element.classList.remove( 'current-fragment' ); } ); } sync(); } /** * Binds all event listeners. */ function addEventListeners() { eventsAreBound = true; window.addEventListener( 'hashchange', onWindowHashChange, false ); window.addEventListener( 'resize', onWindowResize, false ); if( config.touch ) { dom.wrapper.addEventListener( 'touchstart', onTouchStart, false ); dom.wrapper.addEventListener( 'touchmove', onTouchMove, false ); dom.wrapper.addEventListener( 'touchend', onTouchEnd, false ); // Support pointer-style touch interaction as well if( window.navigator.pointerEnabled ) { // IE 11 uses un-prefixed version of pointer events dom.wrapper.addEventListener( 'pointerdown', onPointerDown, false ); dom.wrapper.addEventListener( 'pointermove', onPointerMove, false ); dom.wrapper.addEventListener( 'pointerup', onPointerUp, false ); } else if( window.navigator.msPointerEnabled ) { // IE 10 uses prefixed version of pointer events dom.wrapper.addEventListener( 'MSPointerDown', onPointerDown, false ); dom.wrapper.addEventListener( 'MSPointerMove', onPointerMove, false ); dom.wrapper.addEventListener( 'MSPointerUp', onPointerUp, false ); } } if( config.keyboard ) { document.addEventListener( 'keydown', onDocumentKeyDown, false ); document.addEventListener( 'keypress', onDocumentKeyPress, false ); } if( config.progress && dom.progress ) { dom.progress.addEventListener( 'click', onProgressClicked, false ); } if( config.focusBodyOnPageVisibilityChange ) { var visibilityChange; if( 'hidden' in document ) { visibilityChange = 'visibilitychange'; } else if( 'msHidden' in document ) { visibilityChange = 'msvisibilitychange'; } else if( 'webkitHidden' in document ) { visibilityChange = 'webkitvisibilitychange'; } if( visibilityChange ) { document.addEventListener( visibilityChange, onPageVisibilityChange, false ); } } // Listen to both touch and click events, in case the device // supports both var pointerEvents = [ 'touchstart', 'click' ]; // Only support touch for Android, fixes double navigations in // stock browser if( navigator.userAgent.match( /android/gi ) ) { pointerEvents = [ 'touchstart' ]; } pointerEvents.forEach( function( eventName ) { dom.controlsLeft.forEach( function( el ) { el.addEventListener( eventName, onNavigateLeftClicked, false ); } ); dom.controlsRight.forEach( function( el ) { el.addEventListener( eventName, onNavigateRightClicked, false ); } ); dom.controlsUp.forEach( function( el ) { el.addEventListener( eventName, onNavigateUpClicked, false ); } ); dom.controlsDown.forEach( function( el ) { el.addEventListener( eventName, onNavigateDownClicked, false ); } ); dom.controlsPrev.forEach( function( el ) { el.addEventListener( eventName, onNavigatePrevClicked, false ); } ); dom.controlsNext.forEach( function( el ) { el.addEventListener( eventName, onNavigateNextClicked, false ); } ); } ); } /** * Unbinds all event listeners. */ function removeEventListeners() { eventsAreBound = false; document.removeEventListener( 'keydown', onDocumentKeyDown, false ); document.removeEventListener( 'keypress', onDocumentKeyPress, false ); window.removeEventListener( 'hashchange', onWindowHashChange, false ); window.removeEventListener( 'resize', onWindowResize, false ); dom.wrapper.removeEventListener( 'touchstart', onTouchStart, false ); dom.wrapper.removeEventListener( 'touchmove', onTouchMove, false ); dom.wrapper.removeEventListener( 'touchend', onTouchEnd, false ); // IE11 if( window.navigator.pointerEnabled ) { dom.wrapper.removeEventListener( 'pointerdown', onPointerDown, false ); dom.wrapper.removeEventListener( 'pointermove', onPointerMove, false ); dom.wrapper.removeEventListener( 'pointerup', onPointerUp, false ); } // IE10 else if( window.navigator.msPointerEnabled ) { dom.wrapper.removeEventListener( 'MSPointerDown', onPointerDown, false ); dom.wrapper.removeEventListener( 'MSPointerMove', onPointerMove, false ); dom.wrapper.removeEventListener( 'MSPointerUp', onPointerUp, false ); } if ( config.progress && dom.progress ) { dom.progress.removeEventListener( 'click', onProgressClicked, false ); } [ 'touchstart', 'click' ].forEach( function( eventName ) { dom.controlsLeft.forEach( function( el ) { el.removeEventListener( eventName, onNavigateLeftClicked, false ); } ); dom.controlsRight.forEach( function( el ) { el.removeEventListener( eventName, onNavigateRightClicked, false ); } ); dom.controlsUp.forEach( function( el ) { el.removeEventListener( eventName, onNavigateUpClicked, false ); } ); dom.controlsDown.forEach( function( el ) { el.removeEventListener( eventName, onNavigateDownClicked, false ); } ); dom.controlsPrev.forEach( function( el ) { el.removeEventListener( eventName, onNavigatePrevClicked, false ); } ); dom.controlsNext.forEach( function( el ) { el.removeEventListener( eventName, onNavigateNextClicked, false ); } ); } ); } /** * Extend object a with the properties of object b. * If there's a conflict, object b takes precedence. */ function extend( a, b ) { for( var i in b ) { a[ i ] = b[ i ]; } } /** * Converts the target object to an array. */ function toArray( o ) { return Array.prototype.slice.call( o ); } /** * Utility for deserializing a value. */ function deserialize( value ) { if( typeof value === 'string' ) { if( value === 'null' ) return null; else if( value === 'true' ) return true; else if( value === 'false' ) return false; else if( value.match( /^\d+$/ ) ) return parseFloat( value ); } return value; } /** * Measures the distance in pixels between point a * and point b. * * @param {Object} a point with x/y properties * @param {Object} b point with x/y properties */ function distanceBetween( a, b ) { var dx = a.x - b.x, dy = a.y - b.y; return Math.sqrt( dx*dx + dy*dy ); } /** * Applies a CSS transform to the target element. */ function transformElement( element, transform ) { element.style.WebkitTransform = transform; element.style.MozTransform = transform; element.style.msTransform = transform; element.style.OTransform = transform; element.style.transform = transform; } /** * Injects the given CSS styles into the DOM. */ function injectStyleSheet( value ) { var tag = document.createElement( 'style' ); tag.type = 'text/css'; if( tag.styleSheet ) { tag.styleSheet.cssText = value; } else { tag.appendChild( document.createTextNode( value ) ); } document.getElementsByTagName( 'head' )[0].appendChild( tag ); } /** * Measures the distance in pixels between point a and point b. * * @param {String} color The string representation of a color, * the following formats are supported: * - #000 * - #000000 * - rgb(0,0,0) */ function colorToRgb( color ) { var hex3 = color.match( /^#([0-9a-f]{3})$/i ); if( hex3 && hex3[1] ) { hex3 = hex3[1]; return { r: parseInt( hex3.charAt( 0 ), 16 ) * 0x11, g: parseInt( hex3.charAt( 1 ), 16 ) * 0x11, b: parseInt( hex3.charAt( 2 ), 16 ) * 0x11 }; } var hex6 = color.match( /^#([0-9a-f]{6})$/i ); if( hex6 && hex6[1] ) { hex6 = hex6[1]; return { r: parseInt( hex6.substr( 0, 2 ), 16 ), g: parseInt( hex6.substr( 2, 2 ), 16 ), b: parseInt( hex6.substr( 4, 2 ), 16 ) }; } var rgb = color.match( /^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i ); if( rgb ) { return { r: parseInt( rgb[1], 10 ), g: parseInt( rgb[2], 10 ), b: parseInt( rgb[3], 10 ) }; } var rgba = color.match( /^rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\,\s*([\d]+|[\d]*.[\d]+)\s*\)$/i ); if( rgba ) { return { r: parseInt( rgba[1], 10 ), g: parseInt( rgba[2], 10 ), b: parseInt( rgba[3], 10 ), a: parseFloat( rgba[4] ) }; } return null; } /** * Calculates brightness on a scale of 0-255. * * @param color See colorStringToRgb for supported formats. */ function colorBrightness( color ) { if( typeof color === 'string' ) color = colorToRgb( color ); if( color ) { return ( color.r * 299 + color.g * 587 + color.b * 114 ) / 1000; } return null; } /** * Retrieves the height of the given element by looking * at the position and height of its immediate children. */ function getAbsoluteHeight( element ) { var height = 0; if( element ) { var absoluteChildren = 0; toArray( element.childNodes ).forEach( function( child ) { if( typeof child.offsetTop === 'number' && child.style ) { // Count # of abs children if( window.getComputedStyle( child ).position === 'absolute' ) { absoluteChildren += 1; } height = Math.max( height, child.offsetTop + child.offsetHeight ); } } ); // If there are no absolute children, use offsetHeight if( absoluteChildren === 0 ) { height = element.offsetHeight; } } return height; } /** * Returns the remaining height within the parent of the * target element. * * remaining height = [ configured parent height ] - [ current parent height ] */ function getRemainingHeight( element, height ) { height = height || 0; if( element ) { var newHeight, oldHeight = element.style.height; // Change the .stretch element height to 0 in order find the height of all // the other elements element.style.height = '0px'; newHeight = height - element.parentNode.offsetHeight; // Restore the old height, just in case element.style.height = oldHeight + 'px'; return newHeight; } return height; } /** * Checks if this instance is being used to print a PDF. */ function isPrintingPDF() { return ( /print-pdf/gi ).test( window.location.search ); } /** * Hides the address bar if we're on a mobile device. */ function hideAddressBar() { if( config.hideAddressBar && isMobileDevice ) { // Events that should trigger the address bar to hide window.addEventListener( 'load', removeAddressBar, false ); window.addEventListener( 'orientationchange', removeAddressBar, false ); } } /** * Causes the address bar to hide on mobile devices, * more vertical space ftw. */ function removeAddressBar() { setTimeout( function() { window.scrollTo( 0, 1 ); }, 10 ); } /** * Dispatches an event of the specified type from the * reveal DOM element. */ function dispatchEvent( type, args ) { var event = document.createEvent( 'HTMLEvents', 1, 2 ); event.initEvent( type, true, true ); extend( event, args ); dom.wrapper.dispatchEvent( event ); // If we're in an iframe, post each reveal.js event to the // parent window. Used by the notes plugin if( config.postMessageEvents && window.parent !== window.self ) { window.parent.postMessage( JSON.stringify({ namespace: 'reveal', eventName: type, state: getState() }), '*' ); } } /** * Wrap all links in 3D goodness. */ function enableRollingLinks() { if( features.transforms3d && !( 'msPerspective' in document.body.style ) ) { var anchors = dom.wrapper.querySelectorAll( SLIDES_SELECTOR + ' a' ); for( var i = 0, len = anchors.length; i < len; i++ ) { var anchor = anchors[i]; if( anchor.textContent && !anchor.querySelector( '*' ) && ( !anchor.className || !anchor.classList.contains( anchor, 'roll' ) ) ) { var span = document.createElement('span'); span.setAttribute('data-title', anchor.text); span.innerHTML = anchor.innerHTML; anchor.classList.add( 'roll' ); anchor.innerHTML = ''; anchor.appendChild(span); } } } } /** * Unwrap all 3D links. */ function disableRollingLinks() { var anchors = dom.wrapper.querySelectorAll( SLIDES_SELECTOR + ' a.roll' ); for( var i = 0, len = anchors.length; i < len; i++ ) { var anchor = anchors[i]; var span = anchor.querySelector( 'span' ); if( span ) { anchor.classList.remove( 'roll' ); anchor.innerHTML = span.innerHTML; } } } /** * Bind preview frame links. */ function enablePreviewLinks( selector ) { var anchors = toArray( document.querySelectorAll( selector ? selector : 'a' ) ); anchors.forEach( function( element ) { if( /^(http|www)/gi.test( element.getAttribute( 'href' ) ) ) { element.addEventListener( 'click', onPreviewLinkClicked, false ); } } ); } /** * Unbind preview frame links. */ function disablePreviewLinks() { var anchors = toArray( document.querySelectorAll( 'a' ) ); anchors.forEach( function( element ) { if( /^(http|www)/gi.test( element.getAttribute( 'href' ) ) ) { element.removeEventListener( 'click', onPreviewLinkClicked, false ); } } ); } /** * Opens a preview window for the target URL. */ function showPreview( url ) { closeOverlay(); dom.overlay = document.createElement( 'div' ); dom.overlay.classList.add( 'overlay' ); dom.overlay.classList.add( 'overlay-preview' ); dom.wrapper.appendChild( dom.overlay ); dom.overlay.innerHTML = [ '
', '', '', '
', '
', '
', '', '
' ].join(''); dom.overlay.querySelector( 'iframe' ).addEventListener( 'load', function( event ) { dom.overlay.classList.add( 'loaded' ); }, false ); dom.overlay.querySelector( '.close' ).addEventListener( 'click', function( event ) { closeOverlay(); event.preventDefault(); }, false ); dom.overlay.querySelector( '.external' ).addEventListener( 'click', function( event ) { closeOverlay(); }, false ); setTimeout( function() { dom.overlay.classList.add( 'visible' ); }, 1 ); } /** * Opens a overlay window with help material. */ function showHelp() { if( config.help ) { closeOverlay(); dom.overlay = document.createElement( 'div' ); dom.overlay.classList.add( 'overlay' ); dom.overlay.classList.add( 'overlay-help' ); dom.wrapper.appendChild( dom.overlay ); var html = '

Keyboard Shortcuts


'; html += ''; for( var key in keyboardShortcuts ) { html += ''; } html += '
KEYACTION
' + key + '' + keyboardShortcuts[ key ] + '
'; dom.overlay.innerHTML = [ '
', '', '
', '
', '
'+ html +'
', '
' ].join(''); dom.overlay.querySelector( '.close' ).addEventListener( 'click', function( event ) { closeOverlay(); event.preventDefault(); }, false ); setTimeout( function() { dom.overlay.classList.add( 'visible' ); }, 1 ); } } /** * Closes any currently open overlay. */ function closeOverlay() { if( dom.overlay ) { dom.overlay.parentNode.removeChild( dom.overlay ); dom.overlay = null; } } /** * Applies JavaScript-controlled layout rules to the * presentation. */ function layout() { if( dom.wrapper && !isPrintingPDF() ) { var size = getComputedSlideSize(); var slidePadding = 20; // TODO Dig this out of DOM // Layout the contents of the slides layoutSlideContents( config.width, config.height, slidePadding ); dom.slides.style.width = size.width + 'px'; dom.slides.style.height = size.height + 'px'; // Determine scale of content to fit within available space scale = Math.min( size.presentationWidth / size.width, size.presentationHeight / size.height ); // Respect max/min scale settings scale = Math.max( scale, config.minScale ); scale = Math.min( scale, config.maxScale ); // Don't apply any scaling styles if scale is 1 if( scale === 1 ) { dom.slides.style.zoom = ''; dom.slides.style.left = ''; dom.slides.style.top = ''; dom.slides.style.bottom = ''; dom.slides.style.right = ''; transformElement( dom.slides, '' ); } else { // Prefer zooming in desktop Chrome so that content remains crisp if( !isMobileDevice && /chrome/i.test( navigator.userAgent ) && typeof dom.slides.style.zoom !== 'undefined' ) { dom.slides.style.zoom = scale; } // Apply scale transform as a fallback else { dom.slides.style.left = '50%'; dom.slides.style.top = '50%'; dom.slides.style.bottom = 'auto'; dom.slides.style.right = 'auto'; transformElement( dom.slides, 'translate(-50%, -50%) scale('+ scale +')' ); } } // Select all slides, vertical and horizontal var slides = toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ); for( var i = 0, len = slides.length; i < len; i++ ) { var slide = slides[ i ]; // Don't bother updating invisible slides if( slide.style.display === 'none' ) { continue; } if( config.center || slide.classList.contains( 'center' ) ) { // Vertical stacks are not centred since their section // children will be if( slide.classList.contains( 'stack' ) ) { slide.style.top = 0; } else { slide.style.top = Math.max( ( ( size.height - getAbsoluteHeight( slide ) ) / 2 ) - slidePadding, 0 ) + 'px'; } } else { slide.style.top = ''; } } updateProgress(); updateParallax(); } } /** * Applies layout logic to the contents of all slides in * the presentation. */ function layoutSlideContents( width, height, padding ) { // Handle sizing of elements with the 'stretch' class toArray( dom.slides.querySelectorAll( 'section > .stretch' ) ).forEach( function( element ) { // Determine how much vertical space we can use var remainingHeight = getRemainingHeight( element, height ); // Consider the aspect ratio of media elements if( /(img|video)/gi.test( element.nodeName ) ) { var nw = element.naturalWidth || element.videoWidth, nh = element.naturalHeight || element.videoHeight; var es = Math.min( width / nw, remainingHeight / nh ); element.style.width = ( nw * es ) + 'px'; element.style.height = ( nh * es ) + 'px'; } else { element.style.width = width + 'px'; element.style.height = remainingHeight + 'px'; } } ); } /** * Calculates the computed pixel size of our slides. These * values are based on the width and height configuration * options. */ function getComputedSlideSize( presentationWidth, presentationHeight ) { var size = { // Slide size width: config.width, height: config.height, // Presentation size presentationWidth: presentationWidth || dom.wrapper.offsetWidth, presentationHeight: presentationHeight || dom.wrapper.offsetHeight }; // Reduce available space by margin size.presentationWidth -= ( size.presentationHeight * config.margin ); size.presentationHeight -= ( size.presentationHeight * config.margin ); // Slide width may be a percentage of available width if( typeof size.width === 'string' && /%$/.test( size.width ) ) { size.width = parseInt( size.width, 10 ) / 100 * size.presentationWidth; } // Slide height may be a percentage of available height if( typeof size.height === 'string' && /%$/.test( size.height ) ) { size.height = parseInt( size.height, 10 ) / 100 * size.presentationHeight; } return size; } /** * Stores the vertical index of a stack so that the same * vertical slide can be selected when navigating to and * from the stack. * * @param {HTMLElement} stack The vertical stack element * @param {int} v Index to memorize */ function setPreviousVerticalIndex( stack, v ) { if( typeof stack === 'object' && typeof stack.setAttribute === 'function' ) { stack.setAttribute( 'data-previous-indexv', v || 0 ); } } /** * Retrieves the vertical index which was stored using * #setPreviousVerticalIndex() or 0 if no previous index * exists. * * @param {HTMLElement} stack The vertical stack element */ function getPreviousVerticalIndex( stack ) { if( typeof stack === 'object' && typeof stack.setAttribute === 'function' && stack.classList.contains( 'stack' ) ) { // Prefer manually defined start-indexv var attributeName = stack.hasAttribute( 'data-start-indexv' ) ? 'data-start-indexv' : 'data-previous-indexv'; return parseInt( stack.getAttribute( attributeName ) || 0, 10 ); } return 0; } /** * Displays the overview of slides (quick nav) by * scaling down and arranging all slide elements. * * Experimental feature, might be dropped if perf * can't be improved. */ function activateOverview() { // Only proceed if enabled in config if( config.overview ) { // Don't auto-slide while in overview mode cancelAutoSlide(); var wasActive = dom.wrapper.classList.contains( 'overview' ); // Vary the depth of the overview based on screen size var depth = window.innerWidth < 400 ? 1000 : 2500; dom.wrapper.classList.add( 'overview' ); dom.wrapper.classList.remove( 'overview-deactivating' ); var horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ); for( var i = 0, len1 = horizontalSlides.length; i < len1; i++ ) { var hslide = horizontalSlides[i], hoffset = config.rtl ? -105 : 105; hslide.setAttribute( 'data-index-h', i ); // Apply CSS transform transformElement( hslide, 'translateZ(-'+ depth +'px) translate(' + ( ( i - indexh ) * hoffset ) + '%, 0%)' ); if( hslide.classList.contains( 'stack' ) ) { var verticalSlides = hslide.querySelectorAll( 'section' ); for( var j = 0, len2 = verticalSlides.length; j < len2; j++ ) { var verticalIndex = i === indexh ? indexv : getPreviousVerticalIndex( hslide ); var vslide = verticalSlides[j]; vslide.setAttribute( 'data-index-h', i ); vslide.setAttribute( 'data-index-v', j ); // Apply CSS transform transformElement( vslide, 'translate(0%, ' + ( ( j - verticalIndex ) * 105 ) + '%)' ); // Navigate to this slide on click vslide.addEventListener( 'click', onOverviewSlideClicked, true ); } } else { // Navigate to this slide on click hslide.addEventListener( 'click', onOverviewSlideClicked, true ); } } updateSlidesVisibility(); layout(); if( !wasActive ) { // Notify observers of the overview showing dispatchEvent( 'overviewshown', { 'indexh': indexh, 'indexv': indexv, 'currentSlide': currentSlide } ); } } } /** * Exits the slide overview and enters the currently * active slide. */ function deactivateOverview() { // Only proceed if enabled in config if( config.overview ) { dom.wrapper.classList.remove( 'overview' ); // Temporarily add a class so that transitions can do different things // depending on whether they are exiting/entering overview, or just // moving from slide to slide dom.wrapper.classList.add( 'overview-deactivating' ); setTimeout( function () { dom.wrapper.classList.remove( 'overview-deactivating' ); }, 1 ); // Select all slides toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ).forEach( function( slide ) { // Resets all transforms to use the external styles transformElement( slide, '' ); slide.removeEventListener( 'click', onOverviewSlideClicked, true ); } ); slide( indexh, indexv ); cueAutoSlide(); // Notify observers of the overview hiding dispatchEvent( 'overviewhidden', { 'indexh': indexh, 'indexv': indexv, 'currentSlide': currentSlide } ); } } /** * Toggles the slide overview mode on and off. * * @param {Boolean} override Optional flag which overrides the * toggle logic and forcibly sets the desired state. True means * overview is open, false means it's closed. */ function toggleOverview( override ) { if( typeof override === 'boolean' ) { override ? activateOverview() : deactivateOverview(); } else { isOverview() ? deactivateOverview() : activateOverview(); } } /** * Checks if the overview is currently active. * * @return {Boolean} true if the overview is active, * false otherwise */ function isOverview() { return dom.wrapper.classList.contains( 'overview' ); } /** * Checks if the current or specified slide is vertical * (nested within another slide). * * @param {HTMLElement} slide [optional] The slide to check * orientation of */ function isVerticalSlide( slide ) { // Prefer slide argument, otherwise use current slide slide = slide ? slide : currentSlide; return slide && slide.parentNode && !!slide.parentNode.nodeName.match( /section/i ); } /** * Handling the fullscreen functionality via the fullscreen API * * @see http://fullscreen.spec.whatwg.org/ * @see https://developer.mozilla.org/en-US/docs/DOM/Using_fullscreen_mode */ function enterFullscreen() { var element = document.body; // Check which implementation is available var requestMethod = element.requestFullScreen || element.webkitRequestFullscreen || element.webkitRequestFullScreen || element.mozRequestFullScreen || element.msRequestFullscreen; if( requestMethod ) { requestMethod.apply( element ); } } /** * Enters the paused mode which fades everything on screen to * black. */ function pause() { if( config.pause ) { var wasPaused = dom.wrapper.classList.contains( 'paused' ); cancelAutoSlide(); dom.wrapper.classList.add( 'paused' ); if( wasPaused === false ) { dispatchEvent( 'paused' ); } } } /** * Exits from the paused mode. */ function resume() { var wasPaused = dom.wrapper.classList.contains( 'paused' ); dom.wrapper.classList.remove( 'paused' ); cueAutoSlide(); if( wasPaused ) { dispatchEvent( 'resumed' ); } } /** * Toggles the paused mode on and off. */ function togglePause( override ) { if( typeof override === 'boolean' ) { override ? pause() : resume(); } else { isPaused() ? resume() : pause(); } } /** * Checks if we are currently in the paused mode. */ function isPaused() { return dom.wrapper.classList.contains( 'paused' ); } /** * Toggles the auto slide mode on and off. * * @param {Boolean} override Optional flag which sets the desired state. * True means autoplay starts, false means it stops. */ function toggleAutoSlide( override ) { if( typeof override === 'boolean' ) { override ? resumeAutoSlide() : pauseAutoSlide(); } else { autoSlidePaused ? resumeAutoSlide() : pauseAutoSlide(); } } /** * Checks if the auto slide mode is currently on. */ function isAutoSliding() { return !!( autoSlide && !autoSlidePaused ); } /** * Steps from the current point in the presentation to the * slide which matches the specified horizontal and vertical * indices. * * @param {int} h Horizontal index of the target slide * @param {int} v Vertical index of the target slide * @param {int} f Optional index of a fragment within the * target slide to activate * @param {int} o Optional origin for use in multimaster environments */ function slide( h, v, f, o ) { // Remember where we were at before previousSlide = currentSlide; // Query all horizontal slides in the deck var horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ); // If no vertical index is specified and the upcoming slide is a // stack, resume at its previous vertical index if( v === undefined ) { v = getPreviousVerticalIndex( horizontalSlides[ h ] ); } // If we were on a vertical stack, remember what vertical index // it was on so we can resume at the same position when returning if( previousSlide && previousSlide.parentNode && previousSlide.parentNode.classList.contains( 'stack' ) ) { setPreviousVerticalIndex( previousSlide.parentNode, indexv ); } // Remember the state before this slide var stateBefore = state.concat(); // Reset the state array state.length = 0; var indexhBefore = indexh || 0, indexvBefore = indexv || 0; // Activate and transition to the new slide indexh = updateSlides( HORIZONTAL_SLIDES_SELECTOR, h === undefined ? indexh : h ); indexv = updateSlides( VERTICAL_SLIDES_SELECTOR, v === undefined ? indexv : v ); // Update the visibility of slides now that the indices have changed updateSlidesVisibility(); layout(); // Apply the new state stateLoop: for( var i = 0, len = state.length; i < len; i++ ) { // Check if this state existed on the previous slide. If it // did, we will avoid adding it repeatedly for( var j = 0; j < stateBefore.length; j++ ) { if( stateBefore[j] === state[i] ) { stateBefore.splice( j, 1 ); continue stateLoop; } } document.documentElement.classList.add( state[i] ); // Dispatch custom event matching the state's name dispatchEvent( state[i] ); } // Clean up the remains of the previous state while( stateBefore.length ) { document.documentElement.classList.remove( stateBefore.pop() ); } // If the overview is active, re-activate it to update positions if( isOverview() ) { activateOverview(); } // Find the current horizontal slide and any possible vertical slides // within it var currentHorizontalSlide = horizontalSlides[ indexh ], currentVerticalSlides = currentHorizontalSlide.querySelectorAll( 'section' ); // Store references to the previous and current slides currentSlide = currentVerticalSlides[ indexv ] || currentHorizontalSlide; // Show fragment, if specified if( typeof f !== 'undefined' ) { navigateFragment( f ); } // Dispatch an event if the slide changed var slideChanged = ( indexh !== indexhBefore || indexv !== indexvBefore ); if( slideChanged ) { dispatchEvent( 'slidechanged', { 'indexh': indexh, 'indexv': indexv, 'previousSlide': previousSlide, 'currentSlide': currentSlide, 'origin': o } ); } else { // Ensure that the previous slide is never the same as the current previousSlide = null; } // Solves an edge case where the previous slide maintains the // 'present' class when navigating between adjacent vertical // stacks if( previousSlide ) { previousSlide.classList.remove( 'present' ); previousSlide.setAttribute( 'aria-hidden', 'true' ); // Reset all slides upon navigate to home // Issue: #285 if ( dom.wrapper.querySelector( HOME_SLIDE_SELECTOR ).classList.contains( 'present' ) ) { // Launch async task setTimeout( function () { var slides = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.stack') ), i; for( i in slides ) { if( slides[i] ) { // Reset stack setPreviousVerticalIndex( slides[i], 0 ); } } }, 0 ); } } // Handle embedded content if( slideChanged || !previousSlide ) { stopEmbeddedContent( previousSlide ); startEmbeddedContent( currentSlide ); } // Announce the current slide contents, for screen readers dom.statusDiv.textContent = currentSlide.textContent; updateControls(); updateProgress(); updateBackground(); updateParallax(); updateSlideNumber(); // Update the URL hash writeURL(); cueAutoSlide(); } /** * Syncs the presentation with the current DOM. Useful * when new slides or control elements are added or when * the configuration has changed. */ function sync() { // Subscribe to input removeEventListeners(); addEventListeners(); // Force a layout to make sure the current config is accounted for layout(); // Reflect the current autoSlide value autoSlide = config.autoSlide; // Start auto-sliding if it's enabled cueAutoSlide(); // Re-create the slide backgrounds createBackgrounds(); // Write the current hash to the URL writeURL(); sortAllFragments(); updateControls(); updateProgress(); updateBackground( true ); updateSlideNumber(); updateSlidesVisibility(); formatEmbeddedContent(); } /** * Resets all vertical slides so that only the first * is visible. */ function resetVerticalSlides() { var horizontalSlides = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ); horizontalSlides.forEach( function( horizontalSlide ) { var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ); verticalSlides.forEach( function( verticalSlide, y ) { if( y > 0 ) { verticalSlide.classList.remove( 'present' ); verticalSlide.classList.remove( 'past' ); verticalSlide.classList.add( 'future' ); verticalSlide.setAttribute( 'aria-hidden', 'true' ); } } ); } ); } /** * Sorts and formats all of fragments in the * presentation. */ function sortAllFragments() { var horizontalSlides = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ); horizontalSlides.forEach( function( horizontalSlide ) { var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ); verticalSlides.forEach( function( verticalSlide, y ) { sortFragments( verticalSlide.querySelectorAll( '.fragment' ) ); } ); if( verticalSlides.length === 0 ) sortFragments( horizontalSlide.querySelectorAll( '.fragment' ) ); } ); } /** * Updates one dimension of slides by showing the slide * with the specified index. * * @param {String} selector A CSS selector that will fetch * the group of slides we are working with * @param {Number} index The index of the slide that should be * shown * * @return {Number} The index of the slide that is now shown, * might differ from the passed in index if it was out of * bounds. */ function updateSlides( selector, index ) { // Select all slides and convert the NodeList result to // an array var slides = toArray( dom.wrapper.querySelectorAll( selector ) ), slidesLength = slides.length; var printMode = isPrintingPDF(); if( slidesLength ) { // Should the index loop? if( config.loop ) { index %= slidesLength; if( index < 0 ) { index = slidesLength + index; } } // Enforce max and minimum index bounds index = Math.max( Math.min( index, slidesLength - 1 ), 0 ); for( var i = 0; i < slidesLength; i++ ) { var element = slides[i]; var reverse = config.rtl && !isVerticalSlide( element ); element.classList.remove( 'past' ); element.classList.remove( 'present' ); element.classList.remove( 'future' ); // http://www.w3.org/html/wg/drafts/html/master/editing.html#the-hidden-attribute element.setAttribute( 'hidden', '' ); element.setAttribute( 'aria-hidden', 'true' ); // If this element contains vertical slides if( element.querySelector( 'section' ) ) { element.classList.add( 'stack' ); } // If we're printing static slides, all slides are "present" if( printMode ) { element.classList.add( 'present' ); continue; } if( i < index ) { // Any element previous to index is given the 'past' class element.classList.add( reverse ? 'future' : 'past' ); if( config.fragments ) { var pastFragments = toArray( element.querySelectorAll( '.fragment' ) ); // Show all fragments on prior slides while( pastFragments.length ) { var pastFragment = pastFragments.pop(); pastFragment.classList.add( 'visible' ); pastFragment.classList.remove( 'current-fragment' ); } } } else if( i > index ) { // Any element subsequent to index is given the 'future' class element.classList.add( reverse ? 'past' : 'future' ); if( config.fragments ) { var futureFragments = toArray( element.querySelectorAll( '.fragment.visible' ) ); // No fragments in future slides should be visible ahead of time while( futureFragments.length ) { var futureFragment = futureFragments.pop(); futureFragment.classList.remove( 'visible' ); futureFragment.classList.remove( 'current-fragment' ); } } } } // Mark the current slide as present slides[index].classList.add( 'present' ); slides[index].removeAttribute( 'hidden' ); slides[index].removeAttribute( 'aria-hidden' ); // If this slide has a state associated with it, add it // onto the current state of the deck var slideState = slides[index].getAttribute( 'data-state' ); if( slideState ) { state = state.concat( slideState.split( ' ' ) ); } } else { // Since there are no slides we can't be anywhere beyond the // zeroth index index = 0; } return index; } /** * Optimization method; hide all slides that are far away * from the present slide. */ function updateSlidesVisibility() { // Select all slides and convert the NodeList result to // an array var horizontalSlides = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ), horizontalSlidesLength = horizontalSlides.length, distanceX, distanceY; if( horizontalSlidesLength && typeof indexh !== 'undefined' ) { // The number of steps away from the present slide that will // be visible var viewDistance = isOverview() ? 10 : config.viewDistance; // Limit view distance on weaker devices if( isMobileDevice ) { viewDistance = isOverview() ? 6 : 2; } // Limit view distance on weaker devices if( isPrintingPDF() ) { viewDistance = Number.MAX_VALUE; } for( var x = 0; x < horizontalSlidesLength; x++ ) { var horizontalSlide = horizontalSlides[x]; var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ), verticalSlidesLength = verticalSlides.length; // Loops so that it measures 1 between the first and last slides distanceX = Math.abs( ( ( indexh || 0 ) - x ) % ( horizontalSlidesLength - viewDistance ) ) || 0; // Show the horizontal slide if it's within the view distance if( distanceX < viewDistance ) { showSlide( horizontalSlide ); } else { hideSlide( horizontalSlide ); } if( verticalSlidesLength ) { var oy = getPreviousVerticalIndex( horizontalSlide ); for( var y = 0; y < verticalSlidesLength; y++ ) { var verticalSlide = verticalSlides[y]; distanceY = x === ( indexh || 0 ) ? Math.abs( ( indexv || 0 ) - y ) : Math.abs( y - oy ); if( distanceX + distanceY < viewDistance ) { showSlide( verticalSlide ); } else { hideSlide( verticalSlide ); } } } } } } /** * Updates the progress bar to reflect the current slide. */ function updateProgress() { // Update progress if enabled if( config.progress && dom.progressbar ) { dom.progressbar.style.width = getProgress() * dom.wrapper.offsetWidth + 'px'; } } /** * Updates the slide number div to reflect the current slide. */ function updateSlideNumber() { // Update slide number if enabled if( config.slideNumber && dom.slideNumber) { // Display the number of the page using 'indexh - indexv' format var indexString = indexh; if( indexv > 0 ) { indexString += ' - ' + indexv; } dom.slideNumber.innerHTML = indexString; } } /** * Updates the state of all control/navigation arrows. */ function updateControls() { var routes = availableRoutes(); var fragments = availableFragments(); // Remove the 'enabled' class from all directions dom.controlsLeft.concat( dom.controlsRight ) .concat( dom.controlsUp ) .concat( dom.controlsDown ) .concat( dom.controlsPrev ) .concat( dom.controlsNext ).forEach( function( node ) { node.classList.remove( 'enabled' ); node.classList.remove( 'fragmented' ); } ); // Add the 'enabled' class to the available routes if( routes.left ) dom.controlsLeft.forEach( function( el ) { el.classList.add( 'enabled' ); } ); if( routes.right ) dom.controlsRight.forEach( function( el ) { el.classList.add( 'enabled' ); } ); if( routes.up ) dom.controlsUp.forEach( function( el ) { el.classList.add( 'enabled' ); } ); if( routes.down ) dom.controlsDown.forEach( function( el ) { el.classList.add( 'enabled' ); } ); // Prev/next buttons if( routes.left || routes.up ) dom.controlsPrev.forEach( function( el ) { el.classList.add( 'enabled' ); } ); if( routes.right || routes.down ) dom.controlsNext.forEach( function( el ) { el.classList.add( 'enabled' ); } ); // Highlight fragment directions if( currentSlide ) { // Always apply fragment decorator to prev/next buttons if( fragments.prev ) dom.controlsPrev.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); if( fragments.next ) dom.controlsNext.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); // Apply fragment decorators to directional buttons based on // what slide axis they are in if( isVerticalSlide( currentSlide ) ) { if( fragments.prev ) dom.controlsUp.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); if( fragments.next ) dom.controlsDown.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); } else { if( fragments.prev ) dom.controlsLeft.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); if( fragments.next ) dom.controlsRight.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); } } } /** * Updates the background elements to reflect the current * slide. * * @param {Boolean} includeAll If true, the backgrounds of * all vertical slides (not just the present) will be updated. */ function updateBackground( includeAll ) { var currentBackground = null; // Reverse past/future classes when in RTL mode var horizontalPast = config.rtl ? 'future' : 'past', horizontalFuture = config.rtl ? 'past' : 'future'; // Update the classes of all backgrounds to match the // states of their slides (past/present/future) toArray( dom.background.childNodes ).forEach( function( backgroundh, h ) { backgroundh.classList.remove( 'past' ); backgroundh.classList.remove( 'present' ); backgroundh.classList.remove( 'future' ); if( h < indexh ) { backgroundh.classList.add( horizontalPast ); } else if ( h > indexh ) { backgroundh.classList.add( horizontalFuture ); } else { backgroundh.classList.add( 'present' ); // Store a reference to the current background element currentBackground = backgroundh; } if( includeAll || h === indexh ) { toArray( backgroundh.querySelectorAll( '.slide-background' ) ).forEach( function( backgroundv, v ) { backgroundv.classList.remove( 'past' ); backgroundv.classList.remove( 'present' ); backgroundv.classList.remove( 'future' ); if( v < indexv ) { backgroundv.classList.add( 'past' ); } else if ( v > indexv ) { backgroundv.classList.add( 'future' ); } else { backgroundv.classList.add( 'present' ); // Only if this is the present horizontal and vertical slide if( h === indexh ) currentBackground = backgroundv; } } ); } } ); // Stop any currently playing video background if( previousBackground ) { var previousVideo = previousBackground.querySelector( 'video' ); if( previousVideo ) previousVideo.pause(); } if( currentBackground ) { // Start video playback var currentVideo = currentBackground.querySelector( 'video' ); if( currentVideo ) { currentVideo.currentTime = 0; currentVideo.play(); } // Don't transition between identical backgrounds. This // prevents unwanted flicker. var previousBackgroundHash = previousBackground ? previousBackground.getAttribute( 'data-background-hash' ) : null; var currentBackgroundHash = currentBackground.getAttribute( 'data-background-hash' ); if( currentBackgroundHash && currentBackgroundHash === previousBackgroundHash && currentBackground !== previousBackground ) { dom.background.classList.add( 'no-transition' ); } previousBackground = currentBackground; } // If there's a background brightness flag for this slide, // bubble it to the .reveal container if( currentSlide ) { [ 'has-light-background', 'has-dark-background' ].forEach( function( classToBubble ) { if( currentSlide.classList.contains( classToBubble ) ) { dom.wrapper.classList.add( classToBubble ); } else { dom.wrapper.classList.remove( classToBubble ); } } ); } // Allow the first background to apply without transition setTimeout( function() { dom.background.classList.remove( 'no-transition' ); }, 1 ); } /** * Updates the position of the parallax background based * on the current slide index. */ function updateParallax() { if( config.parallaxBackgroundImage ) { var horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ), verticalSlides = dom.wrapper.querySelectorAll( VERTICAL_SLIDES_SELECTOR ); var backgroundSize = dom.background.style.backgroundSize.split( ' ' ), backgroundWidth, backgroundHeight; if( backgroundSize.length === 1 ) { backgroundWidth = backgroundHeight = parseInt( backgroundSize[0], 10 ); } else { backgroundWidth = parseInt( backgroundSize[0], 10 ); backgroundHeight = parseInt( backgroundSize[1], 10 ); } var slideWidth = dom.background.offsetWidth; var horizontalSlideCount = horizontalSlides.length; var horizontalOffset = -( backgroundWidth - slideWidth ) / ( horizontalSlideCount-1 ) * indexh; var slideHeight = dom.background.offsetHeight; var verticalSlideCount = verticalSlides.length; var verticalOffset = verticalSlideCount > 1 ? -( backgroundHeight - slideHeight ) / ( verticalSlideCount-1 ) * indexv : 0; dom.background.style.backgroundPosition = horizontalOffset + 'px ' + verticalOffset + 'px'; } } /** * Called when the given slide is within the configured view * distance. Shows the slide element and loads any content * that is set to load lazily (data-src). */ function showSlide( slide ) { // Show the slide element slide.style.display = 'block'; // Media elements with data-src attributes toArray( slide.querySelectorAll( 'img[data-src], video[data-src], audio[data-src], iframe[data-src]' ) ).forEach( function( element ) { element.setAttribute( 'src', element.getAttribute( 'data-src' ) ); element.removeAttribute( 'data-src' ); } ); // Media elements with children toArray( slide.querySelectorAll( 'video, audio' ) ).forEach( function( media ) { var sources = 0; toArray( media.querySelectorAll( 'source[data-src]' ) ).forEach( function( source ) { source.setAttribute( 'src', source.getAttribute( 'data-src' ) ); source.removeAttribute( 'data-src' ); sources += 1; } ); // If we rewrote sources for this video/audio element, we need // to manually tell it to load from its new origin if( sources > 0 ) { media.load(); } } ); // Show the corresponding background element var indices = getIndices( slide ); var background = getSlideBackground( indices.h, indices.v ); if( background ) { background.style.display = 'block'; // If the background contains media, load it if( background.hasAttribute( 'data-loaded' ) === false ) { background.setAttribute( 'data-loaded', 'true' ); var backgroundImage = slide.getAttribute( 'data-background-image' ), backgroundVideo = slide.getAttribute( 'data-background-video' ), backgroundIframe = slide.getAttribute( 'data-background-iframe' ); // Images if( backgroundImage ) { background.style.backgroundImage = 'url('+ backgroundImage +')'; } // Videos else if ( backgroundVideo && !isSpeakerNotes() ) { var video = document.createElement( 'video' ); // Support comma separated lists of video sources backgroundVideo.split( ',' ).forEach( function( source ) { video.innerHTML += ''; } ); background.appendChild( video ); } // Iframes else if ( backgroundIframe ) { var iframe = document.createElement( 'iframe' ); iframe.setAttribute( 'src', backgroundIframe ); iframe.style.width = '100%'; iframe.style.height = '100%'; iframe.style.maxHeight = '100%'; iframe.style.maxWidth = '100%'; background.appendChild( iframe ); } } } } /** * Called when the given slide is moved outside of the * configured view distance. */ function hideSlide( slide ) { // Hide the slide element slide.style.display = 'none'; // Hide the corresponding background element var indices = getIndices( slide ); var background = getSlideBackground( indices.h, indices.v ); if( background ) { background.style.display = 'none'; } } /** * Determine what available routes there are for navigation. * * @return {Object} containing four booleans: left/right/up/down */ function availableRoutes() { var horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ), verticalSlides = dom.wrapper.querySelectorAll( VERTICAL_SLIDES_SELECTOR ); var routes = { left: indexh > 0 || config.loop, right: indexh < horizontalSlides.length - 1 || config.loop, up: indexv > 0, down: indexv < verticalSlides.length - 1 }; // reverse horizontal controls for rtl if( config.rtl ) { var left = routes.left; routes.left = routes.right; routes.right = left; } return routes; } /** * Returns an object describing the available fragment * directions. * * @return {Object} two boolean properties: prev/next */ function availableFragments() { if( currentSlide && config.fragments ) { var fragments = currentSlide.querySelectorAll( '.fragment' ); var hiddenFragments = currentSlide.querySelectorAll( '.fragment:not(.visible)' ); return { prev: fragments.length - hiddenFragments.length > 0, next: !!hiddenFragments.length }; } else { return { prev: false, next: false }; } } /** * Enforces origin-specific format rules for embedded media. */ function formatEmbeddedContent() { // YouTube frames must include "?enablejsapi=1" toArray( dom.slides.querySelectorAll( 'iframe[src*="youtube.com/embed/"]' ) ).forEach( function( el ) { var src = el.getAttribute( 'src' ); if( !/enablejsapi\=1/gi.test( src ) ) { el.setAttribute( 'src', src + ( !/\?/.test( src ) ? '?' : '&' ) + 'enablejsapi=1' ); } }); // Vimeo frames must include "?api=1" toArray( dom.slides.querySelectorAll( 'iframe[src*="player.vimeo.com/"]' ) ).forEach( function( el ) { var src = el.getAttribute( 'src' ); if( !/api\=1/gi.test( src ) ) { el.setAttribute( 'src', src + ( !/\?/.test( src ) ? '?' : '&' ) + 'api=1' ); } }); } /** * Start playback of any embedded content inside of * the targeted slide. */ function startEmbeddedContent( slide ) { if( slide && !isSpeakerNotes() ) { // HTML5 media elements toArray( slide.querySelectorAll( 'video, audio' ) ).forEach( function( el ) { if( el.hasAttribute( 'data-autoplay' ) ) { el.play(); } } ); // iframe embeds toArray( slide.querySelectorAll( 'iframe' ) ).forEach( function( el ) { el.contentWindow.postMessage( 'slide:start', '*' ); }); // YouTube embeds toArray( slide.querySelectorAll( 'iframe[src*="youtube.com/embed/"]' ) ).forEach( function( el ) { if( el.hasAttribute( 'data-autoplay' ) ) { el.contentWindow.postMessage( '{"event":"command","func":"playVideo","args":""}', '*' ); } }); // Vimeo embeds toArray( slide.querySelectorAll( 'iframe[src*="player.vimeo.com/"]' ) ).forEach( function( el ) { if( el.hasAttribute( 'data-autoplay' ) ) { el.contentWindow.postMessage( '{"method":"play"}', '*' ); } }); } } /** * Stop playback of any embedded content inside of * the targeted slide. */ function stopEmbeddedContent( slide ) { if( slide && slide.parentNode ) { // HTML5 media elements toArray( slide.querySelectorAll( 'video, audio' ) ).forEach( function( el ) { if( !el.hasAttribute( 'data-ignore' ) ) { el.pause(); } } ); // iframe embeds toArray( slide.querySelectorAll( 'iframe' ) ).forEach( function( el ) { el.contentWindow.postMessage( 'slide:stop', '*' ); }); // YouTube embeds toArray( slide.querySelectorAll( 'iframe[src*="youtube.com/embed/"]' ) ).forEach( function( el ) { if( !el.hasAttribute( 'data-ignore' ) && typeof el.contentWindow.postMessage === 'function' ) { el.contentWindow.postMessage( '{"event":"command","func":"pauseVideo","args":""}', '*' ); } }); // Vimeo embeds toArray( slide.querySelectorAll( 'iframe[src*="player.vimeo.com/"]' ) ).forEach( function( el ) { if( !el.hasAttribute( 'data-ignore' ) && typeof el.contentWindow.postMessage === 'function' ) { el.contentWindow.postMessage( '{"method":"pause"}', '*' ); } }); } } /** * Returns a value ranging from 0-1 that represents * how far into the presentation we have navigated. */ function getProgress() { var horizontalSlides = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ); // The number of past and total slides var totalCount = getTotalSlides(); var pastCount = 0; // Step through all slides and count the past ones mainLoop: for( var i = 0; i < horizontalSlides.length; i++ ) { var horizontalSlide = horizontalSlides[i]; var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ); for( var j = 0; j < verticalSlides.length; j++ ) { // Stop as soon as we arrive at the present if( verticalSlides[j].classList.contains( 'present' ) ) { break mainLoop; } pastCount++; } // Stop as soon as we arrive at the present if( horizontalSlide.classList.contains( 'present' ) ) { break; } // Don't count the wrapping section for vertical slides if( horizontalSlide.classList.contains( 'stack' ) === false ) { pastCount++; } } if( currentSlide ) { var allFragments = currentSlide.querySelectorAll( '.fragment' ); // If there are fragments in the current slide those should be // accounted for in the progress. if( allFragments.length > 0 ) { var visibleFragments = currentSlide.querySelectorAll( '.fragment.visible' ); // This value represents how big a portion of the slide progress // that is made up by its fragments (0-1) var fragmentWeight = 0.9; // Add fragment progress to the past slide count pastCount += ( visibleFragments.length / allFragments.length ) * fragmentWeight; } } return pastCount / ( totalCount - 1 ); } /** * Checks if this presentation is running inside of the * speaker notes window. */ function isSpeakerNotes() { return !!window.location.search.match( /receiver/gi ); } /** * Reads the current URL (hash) and navigates accordingly. */ function readURL() { var hash = window.location.hash; // Attempt to parse the hash as either an index or name var bits = hash.slice( 2 ).split( '/' ), name = hash.replace( /#|\//gi, '' ); // If the first bit is invalid and there is a name we can // assume that this is a named link if( isNaN( parseInt( bits[0], 10 ) ) && name.length ) { var element; // Ensure the named link is a valid HTML ID attribute if( /^[a-zA-Z][\w:.-]*$/.test( name ) ) { // Find the slide with the specified ID element = document.querySelector( '#' + name ); } if( element ) { // Find the position of the named slide and navigate to it var indices = Reveal.getIndices( element ); slide( indices.h, indices.v ); } // If the slide doesn't exist, navigate to the current slide else { slide( indexh || 0, indexv || 0 ); } } else { // Read the index components of the hash var h = parseInt( bits[0], 10 ) || 0, v = parseInt( bits[1], 10 ) || 0; if( h !== indexh || v !== indexv ) { slide( h, v ); } } } /** * Updates the page URL (hash) to reflect the current * state. * * @param {Number} delay The time in ms to wait before * writing the hash */ function writeURL( delay ) { if( config.history ) { // Make sure there's never more than one timeout running clearTimeout( writeURLTimeout ); // If a delay is specified, timeout this call if( typeof delay === 'number' ) { writeURLTimeout = setTimeout( writeURL, delay ); } else if( currentSlide ) { var url = '/'; // Attempt to create a named link based on the slide's ID var id = currentSlide.getAttribute( 'id' ); if( id ) { id = id.toLowerCase(); id = id.replace( /[^a-zA-Z0-9\-\_\:\.]/g, '' ); } // If the current slide has an ID, use that as a named link if( typeof id === 'string' && id.length ) { url = '/' + id; } // Otherwise use the /h/v index else { if( indexh > 0 || indexv > 0 ) url += indexh; if( indexv > 0 ) url += '/' + indexv; } window.location.hash = url; } } } /** * Retrieves the h/v location of the current, or specified, * slide. * * @param {HTMLElement} slide If specified, the returned * index will be for this slide rather than the currently * active one * * @return {Object} { h: , v: , f: } */ function getIndices( slide ) { // By default, return the current indices var h = indexh, v = indexv, f; // If a slide is specified, return the indices of that slide if( slide ) { var isVertical = isVerticalSlide( slide ); var slideh = isVertical ? slide.parentNode : slide; // Select all horizontal slides var horizontalSlides = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ); // Now that we know which the horizontal slide is, get its index h = Math.max( horizontalSlides.indexOf( slideh ), 0 ); // Assume we're not vertical v = undefined; // If this is a vertical slide, grab the vertical index if( isVertical ) { v = Math.max( toArray( slide.parentNode.querySelectorAll( 'section' ) ).indexOf( slide ), 0 ); } } if( !slide && currentSlide ) { var hasFragments = currentSlide.querySelectorAll( '.fragment' ).length > 0; if( hasFragments ) { var currentFragment = currentSlide.querySelector( '.current-fragment' ); if( currentFragment && currentFragment.hasAttribute( 'data-fragment-index' ) ) { f = parseInt( currentFragment.getAttribute( 'data-fragment-index' ), 10 ); } else { f = currentSlide.querySelectorAll( '.fragment.visible' ).length - 1; } } } return { h: h, v: v, f: f }; } /** * Retrieves the total number of slides in this presentation. */ function getTotalSlides() { return dom.wrapper.querySelectorAll( SLIDES_SELECTOR + ':not(.stack)' ).length; } /** * Returns the slide element matching the specified index. */ function getSlide( x, y ) { var horizontalSlide = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR )[ x ]; var verticalSlides = horizontalSlide && horizontalSlide.querySelectorAll( 'section' ); if( verticalSlides && verticalSlides.length && typeof y === 'number' ) { return verticalSlides ? verticalSlides[ y ] : undefined; } return horizontalSlide; } /** * Returns the background element for the given slide. * All slides, even the ones with no background properties * defined, have a background element so as long as the * index is valid an element will be returned. */ function getSlideBackground( x, y ) { // When printing to PDF the slide backgrounds are nested // inside of the slides if( isPrintingPDF() ) { var slide = getSlide( x, y ); if( slide ) { var background = slide.querySelector( '.slide-background' ); if( background && background.parentNode === slide ) { return background; } } return undefined; } var horizontalBackground = dom.wrapper.querySelectorAll( '.backgrounds>.slide-background' )[ x ]; var verticalBackgrounds = horizontalBackground && horizontalBackground.querySelectorAll( '.slide-background' ); if( verticalBackgrounds && verticalBackgrounds.length && typeof y === 'number' ) { return verticalBackgrounds ? verticalBackgrounds[ y ] : undefined; } return horizontalBackground; } /** * Retrieves the current state of the presentation as * an object. This state can then be restored at any * time. */ function getState() { var indices = getIndices(); return { indexh: indices.h, indexv: indices.v, indexf: indices.f, paused: isPaused(), overview: isOverview() }; } /** * Restores the presentation to the given state. * * @param {Object} state As generated by getState() */ function setState( state ) { if( typeof state === 'object' ) { slide( deserialize( state.indexh ), deserialize( state.indexv ), deserialize( state.indexf ) ); var pausedFlag = deserialize( state.paused ), overviewFlag = deserialize( state.overview ); if( typeof pausedFlag === 'boolean' && pausedFlag !== isPaused() ) { togglePause( pausedFlag ); } if( typeof overviewFlag === 'boolean' && overviewFlag !== isOverview() ) { toggleOverview( overviewFlag ); } } } /** * Return a sorted fragments list, ordered by an increasing * "data-fragment-index" attribute. * * Fragments will be revealed in the order that they are returned by * this function, so you can use the index attributes to control the * order of fragment appearance. * * To maintain a sensible default fragment order, fragments are presumed * to be passed in document order. This function adds a "fragment-index" * attribute to each node if such an attribute is not already present, * and sets that attribute to an integer value which is the position of * the fragment within the fragments list. */ function sortFragments( fragments ) { fragments = toArray( fragments ); var ordered = [], unordered = [], sorted = []; // Group ordered and unordered elements fragments.forEach( function( fragment, i ) { if( fragment.hasAttribute( 'data-fragment-index' ) ) { var index = parseInt( fragment.getAttribute( 'data-fragment-index' ), 10 ); if( !ordered[index] ) { ordered[index] = []; } ordered[index].push( fragment ); } else { unordered.push( [ fragment ] ); } } ); // Append fragments without explicit indices in their // DOM order ordered = ordered.concat( unordered ); // Manually count the index up per group to ensure there // are no gaps var index = 0; // Push all fragments in their sorted order to an array, // this flattens the groups ordered.forEach( function( group ) { group.forEach( function( fragment ) { sorted.push( fragment ); fragment.setAttribute( 'data-fragment-index', index ); } ); index ++; } ); return sorted; } /** * Navigate to the specified slide fragment. * * @param {Number} index The index of the fragment that * should be shown, -1 means all are invisible * @param {Number} offset Integer offset to apply to the * fragment index * * @return {Boolean} true if a change was made in any * fragments visibility as part of this call */ function navigateFragment( index, offset ) { if( currentSlide && config.fragments ) { var fragments = sortFragments( currentSlide.querySelectorAll( '.fragment' ) ); if( fragments.length ) { // If no index is specified, find the current if( typeof index !== 'number' ) { var lastVisibleFragment = sortFragments( currentSlide.querySelectorAll( '.fragment.visible' ) ).pop(); if( lastVisibleFragment ) { index = parseInt( lastVisibleFragment.getAttribute( 'data-fragment-index' ) || 0, 10 ); } else { index = -1; } } // If an offset is specified, apply it to the index if( typeof offset === 'number' ) { index += offset; } var fragmentsShown = [], fragmentsHidden = []; toArray( fragments ).forEach( function( element, i ) { if( element.hasAttribute( 'data-fragment-index' ) ) { i = parseInt( element.getAttribute( 'data-fragment-index' ), 10 ); } // Visible fragments if( i <= index ) { if( !element.classList.contains( 'visible' ) ) fragmentsShown.push( element ); element.classList.add( 'visible' ); element.classList.remove( 'current-fragment' ); // Announce the fragments one by one to the Screen Reader dom.statusDiv.textContent = element.textContent; if( i === index ) { element.classList.add( 'current-fragment' ); } } // Hidden fragments else { if( element.classList.contains( 'visible' ) ) fragmentsHidden.push( element ); element.classList.remove( 'visible' ); element.classList.remove( 'current-fragment' ); } } ); if( fragmentsHidden.length ) { dispatchEvent( 'fragmenthidden', { fragment: fragmentsHidden[0], fragments: fragmentsHidden } ); } if( fragmentsShown.length ) { dispatchEvent( 'fragmentshown', { fragment: fragmentsShown[0], fragments: fragmentsShown } ); } updateControls(); updateProgress(); return !!( fragmentsShown.length || fragmentsHidden.length ); } } return false; } /** * Navigate to the next slide fragment. * * @return {Boolean} true if there was a next fragment, * false otherwise */ function nextFragment() { return navigateFragment( null, 1 ); } /** * Navigate to the previous slide fragment. * * @return {Boolean} true if there was a previous fragment, * false otherwise */ function previousFragment() { return navigateFragment( null, -1 ); } /** * Cues a new automated slide if enabled in the config. */ function cueAutoSlide() { cancelAutoSlide(); if( currentSlide ) { var currentFragment = currentSlide.querySelector( '.current-fragment' ); var fragmentAutoSlide = currentFragment ? currentFragment.getAttribute( 'data-autoslide' ) : null; var parentAutoSlide = currentSlide.parentNode ? currentSlide.parentNode.getAttribute( 'data-autoslide' ) : null; var slideAutoSlide = currentSlide.getAttribute( 'data-autoslide' ); // Pick value in the following priority order: // 1. Current fragment's data-autoslide // 2. Current slide's data-autoslide // 3. Parent slide's data-autoslide // 4. Global autoSlide setting if( fragmentAutoSlide ) { autoSlide = parseInt( fragmentAutoSlide, 10 ); } else if( slideAutoSlide ) { autoSlide = parseInt( slideAutoSlide, 10 ); } else if( parentAutoSlide ) { autoSlide = parseInt( parentAutoSlide, 10 ); } else { autoSlide = config.autoSlide; } // If there are media elements with data-autoplay, // automatically set the autoSlide duration to the // length of that media toArray( currentSlide.querySelectorAll( 'video, audio' ) ).forEach( function( el ) { if( el.hasAttribute( 'data-autoplay' ) ) { if( autoSlide && el.duration * 1000 > autoSlide ) { autoSlide = ( el.duration * 1000 ) + 1000; } } } ); // Cue the next auto-slide if: // - There is an autoSlide value // - Auto-sliding isn't paused by the user // - The presentation isn't paused // - The overview isn't active // - The presentation isn't over if( autoSlide && !autoSlidePaused && !isPaused() && !isOverview() && ( !Reveal.isLastSlide() || availableFragments().next || config.loop === true ) ) { autoSlideTimeout = setTimeout( navigateNext, autoSlide ); autoSlideStartTime = Date.now(); } if( autoSlidePlayer ) { autoSlidePlayer.setPlaying( autoSlideTimeout !== -1 ); } } } /** * Cancels any ongoing request to auto-slide. */ function cancelAutoSlide() { clearTimeout( autoSlideTimeout ); autoSlideTimeout = -1; } function pauseAutoSlide() { if( autoSlide && !autoSlidePaused ) { autoSlidePaused = true; dispatchEvent( 'autoslidepaused' ); clearTimeout( autoSlideTimeout ); if( autoSlidePlayer ) { autoSlidePlayer.setPlaying( false ); } } } function resumeAutoSlide() { if( autoSlide && autoSlidePaused ) { autoSlidePaused = false; dispatchEvent( 'autoslideresumed' ); cueAutoSlide(); } } function navigateLeft() { // Reverse for RTL if( config.rtl ) { if( ( isOverview() || nextFragment() === false ) && availableRoutes().left ) { slide( indexh + 1 ); } } // Normal navigation else if( ( isOverview() || previousFragment() === false ) && availableRoutes().left ) { slide( indexh - 1 ); } } function navigateRight() { // Reverse for RTL if( config.rtl ) { if( ( isOverview() || previousFragment() === false ) && availableRoutes().right ) { slide( indexh - 1 ); } } // Normal navigation else if( ( isOverview() || nextFragment() === false ) && availableRoutes().right ) { slide( indexh + 1 ); } } function navigateUp() { // Prioritize hiding fragments if( ( isOverview() || previousFragment() === false ) && availableRoutes().up ) { slide( indexh, indexv - 1 ); } } function navigateDown() { // Prioritize revealing fragments if( ( isOverview() || nextFragment() === false ) && availableRoutes().down ) { slide( indexh, indexv + 1 ); } } /** * Navigates backwards, prioritized in the following order: * 1) Previous fragment * 2) Previous vertical slide * 3) Previous horizontal slide */ function navigatePrev() { // Prioritize revealing fragments if( previousFragment() === false ) { if( availableRoutes().up ) { navigateUp(); } else { // Fetch the previous horizontal slide, if there is one var previousSlide; if( config.rtl ) { previousSlide = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.future' ) ).pop(); } else { previousSlide = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.past' ) ).pop(); } if( previousSlide ) { var v = ( previousSlide.querySelectorAll( 'section' ).length - 1 ) || undefined; var h = indexh - 1; slide( h, v ); } } } } /** * The reverse of #navigatePrev(). */ function navigateNext() { // Prioritize revealing fragments if( nextFragment() === false ) { if( availableRoutes().down ) { navigateDown(); } else if( config.rtl ) { navigateLeft(); } else { navigateRight(); } } // If auto-sliding is enabled we need to cue up // another timeout cueAutoSlide(); } // --------------------------------------------------------------------// // ----------------------------- EVENTS -------------------------------// // --------------------------------------------------------------------// /** * Called by all event handlers that are based on user * input. */ function onUserInput( event ) { if( config.autoSlideStoppable ) { pauseAutoSlide(); } } /** * Handler for the document level 'keypress' event. */ function onDocumentKeyPress( event ) { // Check if the pressed key is question mark if( event.shiftKey && event.charCode === 63 ) { if( dom.overlay ) { closeOverlay(); } else { showHelp( true ); } } } /** * Handler for the document level 'keydown' event. */ function onDocumentKeyDown( event ) { // If there's a condition specified and it returns false, // ignore this event if( typeof config.keyboardCondition === 'function' && config.keyboardCondition() === false ) { return true; } // Remember if auto-sliding was paused so we can toggle it var autoSlideWasPaused = autoSlidePaused; onUserInput( event ); // Check if there's a focused element that could be using // the keyboard var activeElementIsCE = document.activeElement && document.activeElement.contentEditable !== 'inherit'; var activeElementIsInput = document.activeElement && document.activeElement.tagName && /input|textarea/i.test( document.activeElement.tagName ); // Disregard the event if there's a focused element or a // keyboard modifier key is present if( activeElementIsCE || activeElementIsInput || (event.shiftKey && event.keyCode !== 32) || event.altKey || event.ctrlKey || event.metaKey ) return; // While paused only allow "unpausing" keyboard events (b and .) if( isPaused() && [66,190,191].indexOf( event.keyCode ) === -1 ) { return false; } var triggered = false; // 1. User defined key bindings if( typeof config.keyboard === 'object' ) { for( var key in config.keyboard ) { // Check if this binding matches the pressed key if( parseInt( key, 10 ) === event.keyCode ) { var value = config.keyboard[ key ]; // Callback function if( typeof value === 'function' ) { value.apply( null, [ event ] ); } // String shortcuts to reveal.js API else if( typeof value === 'string' && typeof Reveal[ value ] === 'function' ) { Reveal[ value ].call(); } triggered = true; } } } // 2. System defined key bindings if( triggered === false ) { // Assume true and try to prove false triggered = true; switch( event.keyCode ) { // p, page up case 80: case 33: navigatePrev(); break; // n, page down case 78: case 34: navigateNext(); break; // h, left case 72: case 37: navigateLeft(); break; // l, right case 76: case 39: navigateRight(); break; // k, up case 75: case 38: navigateUp(); break; // j, down case 74: case 40: navigateDown(); break; // home case 36: slide( 0 ); break; // end case 35: slide( Number.MAX_VALUE ); break; // space case 32: isOverview() ? deactivateOverview() : event.shiftKey ? navigatePrev() : navigateNext(); break; // return case 13: isOverview() ? deactivateOverview() : triggered = false; break; // two-spot, semicolon, b, period, Logitech presenter tools "black screen" button case 58: case 59: case 66: case 190: case 191: togglePause(); break; // f case 70: enterFullscreen(); break; // a case 65: if ( config.autoSlideStoppable ) toggleAutoSlide( autoSlideWasPaused ); break; default: triggered = false; } } // If the input resulted in a triggered action we should prevent // the browsers default behavior if( triggered ) { event.preventDefault && event.preventDefault(); } // ESC or O key else if ( ( event.keyCode === 27 || event.keyCode === 79 ) && features.transforms3d ) { if( dom.overlay ) { closeOverlay(); } else { toggleOverview(); } event.preventDefault && event.preventDefault(); } // If auto-sliding is enabled we need to cue up // another timeout cueAutoSlide(); } /** * Handler for the 'touchstart' event, enables support for * swipe and pinch gestures. */ function onTouchStart( event ) { touch.startX = event.touches[0].clientX; touch.startY = event.touches[0].clientY; touch.startCount = event.touches.length; // If there's two touches we need to memorize the distance // between those two points to detect pinching if( event.touches.length === 2 && config.overview ) { touch.startSpan = distanceBetween( { x: event.touches[1].clientX, y: event.touches[1].clientY }, { x: touch.startX, y: touch.startY } ); } } /** * Handler for the 'touchmove' event. */ function onTouchMove( event ) { // Each touch should only trigger one action if( !touch.captured ) { onUserInput( event ); var currentX = event.touches[0].clientX; var currentY = event.touches[0].clientY; // If the touch started with two points and still has // two active touches; test for the pinch gesture if( event.touches.length === 2 && touch.startCount === 2 && config.overview ) { // The current distance in pixels between the two touch points var currentSpan = distanceBetween( { x: event.touches[1].clientX, y: event.touches[1].clientY }, { x: touch.startX, y: touch.startY } ); // If the span is larger than the desire amount we've got // ourselves a pinch if( Math.abs( touch.startSpan - currentSpan ) > touch.threshold ) { touch.captured = true; if( currentSpan < touch.startSpan ) { activateOverview(); } else { deactivateOverview(); } } event.preventDefault(); } // There was only one touch point, look for a swipe else if( event.touches.length === 1 && touch.startCount !== 2 ) { var deltaX = currentX - touch.startX, deltaY = currentY - touch.startY; if( deltaX > touch.threshold && Math.abs( deltaX ) > Math.abs( deltaY ) ) { touch.captured = true; navigateLeft(); } else if( deltaX < -touch.threshold && Math.abs( deltaX ) > Math.abs( deltaY ) ) { touch.captured = true; navigateRight(); } else if( deltaY > touch.threshold ) { touch.captured = true; navigateUp(); } else if( deltaY < -touch.threshold ) { touch.captured = true; navigateDown(); } // If we're embedded, only block touch events if they have // triggered an action if( config.embedded ) { if( touch.captured || isVerticalSlide( currentSlide ) ) { event.preventDefault(); } } // Not embedded? Block them all to avoid needless tossing // around of the viewport in iOS else { event.preventDefault(); } } } // There's a bug with swiping on some Android devices unless // the default action is always prevented else if( navigator.userAgent.match( /android/gi ) ) { event.preventDefault(); } } /** * Handler for the 'touchend' event. */ function onTouchEnd( event ) { touch.captured = false; } /** * Convert pointer down to touch start. */ function onPointerDown( event ) { if( event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === "touch" ) { event.touches = [{ clientX: event.clientX, clientY: event.clientY }]; onTouchStart( event ); } } /** * Convert pointer move to touch move. */ function onPointerMove( event ) { if( event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === "touch" ) { event.touches = [{ clientX: event.clientX, clientY: event.clientY }]; onTouchMove( event ); } } /** * Convert pointer up to touch end. */ function onPointerUp( event ) { if( event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === "touch" ) { event.touches = [{ clientX: event.clientX, clientY: event.clientY }]; onTouchEnd( event ); } } /** * Handles mouse wheel scrolling, throttled to avoid skipping * multiple slides. */ function onDocumentMouseScroll( event ) { if( Date.now() - lastMouseWheelStep > 600 ) { lastMouseWheelStep = Date.now(); var delta = event.detail || -event.wheelDelta; if( delta > 0 ) { navigateNext(); } else { navigatePrev(); } } } /** * Clicking on the progress bar results in a navigation to the * closest approximate horizontal slide using this equation: * * ( clickX / presentationWidth ) * numberOfSlides */ function onProgressClicked( event ) { onUserInput( event ); event.preventDefault(); var slidesTotal = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).length; var slideIndex = Math.floor( ( event.clientX / dom.wrapper.offsetWidth ) * slidesTotal ); slide( slideIndex ); } /** * Event handler for navigation control buttons. */ function onNavigateLeftClicked( event ) { event.preventDefault(); onUserInput(); navigateLeft(); } function onNavigateRightClicked( event ) { event.preventDefault(); onUserInput(); navigateRight(); } function onNavigateUpClicked( event ) { event.preventDefault(); onUserInput(); navigateUp(); } function onNavigateDownClicked( event ) { event.preventDefault(); onUserInput(); navigateDown(); } function onNavigatePrevClicked( event ) { event.preventDefault(); onUserInput(); navigatePrev(); } function onNavigateNextClicked( event ) { event.preventDefault(); onUserInput(); navigateNext(); } /** * Handler for the window level 'hashchange' event. */ function onWindowHashChange( event ) { readURL(); } /** * Handler for the window level 'resize' event. */ function onWindowResize( event ) { layout(); } /** * Handle for the window level 'visibilitychange' event. */ function onPageVisibilityChange( event ) { var isHidden = document.webkitHidden || document.msHidden || document.hidden; // If, after clicking a link or similar and we're coming back, // focus the document.body to ensure we can use keyboard shortcuts if( isHidden === false && document.activeElement !== document.body ) { document.activeElement.blur(); document.body.focus(); } } /** * Invoked when a slide is and we're in the overview. */ function onOverviewSlideClicked( event ) { // TODO There's a bug here where the event listeners are not // removed after deactivating the overview. if( eventsAreBound && isOverview() ) { event.preventDefault(); var element = event.target; while( element && !element.nodeName.match( /section/gi ) ) { element = element.parentNode; } if( element && !element.classList.contains( 'disabled' ) ) { deactivateOverview(); if( element.nodeName.match( /section/gi ) ) { var h = parseInt( element.getAttribute( 'data-index-h' ), 10 ), v = parseInt( element.getAttribute( 'data-index-v' ), 10 ); slide( h, v ); } } } } /** * Handles clicks on links that are set to preview in the * iframe overlay. */ function onPreviewLinkClicked( event ) { if( event.currentTarget && event.currentTarget.hasAttribute( 'href' ) ) { var url = event.currentTarget.getAttribute( 'href' ); if( url ) { showPreview( url ); event.preventDefault(); } } } /** * Handles click on the auto-sliding controls element. */ function onAutoSlidePlayerClick( event ) { // Replay if( Reveal.isLastSlide() && config.loop === false ) { slide( 0, 0 ); resumeAutoSlide(); } // Resume else if( autoSlidePaused ) { resumeAutoSlide(); } // Pause else { pauseAutoSlide(); } } // --------------------------------------------------------------------// // ------------------------ PLAYBACK COMPONENT ------------------------// // --------------------------------------------------------------------// /** * Constructor for the playback component, which displays * play/pause/progress controls. * * @param {HTMLElement} container The component will append * itself to this * @param {Function} progressCheck A method which will be * called frequently to get the current progress on a range * of 0-1 */ function Playback( container, progressCheck ) { // Cosmetics this.diameter = 50; this.thickness = 3; // Flags if we are currently playing this.playing = false; // Current progress on a 0-1 range this.progress = 0; // Used to loop the animation smoothly this.progressOffset = 1; this.container = container; this.progressCheck = progressCheck; this.canvas = document.createElement( 'canvas' ); this.canvas.className = 'playback'; this.canvas.width = this.diameter; this.canvas.height = this.diameter; this.context = this.canvas.getContext( '2d' ); this.container.appendChild( this.canvas ); this.render(); } Playback.prototype.setPlaying = function( value ) { var wasPlaying = this.playing; this.playing = value; // Start repainting if we weren't already if( !wasPlaying && this.playing ) { this.animate(); } else { this.render(); } }; Playback.prototype.animate = function() { var progressBefore = this.progress; this.progress = this.progressCheck(); // When we loop, offset the progress so that it eases // smoothly rather than immediately resetting if( progressBefore > 0.8 && this.progress < 0.2 ) { this.progressOffset = this.progress; } this.render(); if( this.playing ) { features.requestAnimationFrameMethod.call( window, this.animate.bind( this ) ); } }; /** * Renders the current progress and playback state. */ Playback.prototype.render = function() { var progress = this.playing ? this.progress : 0, radius = ( this.diameter / 2 ) - this.thickness, x = this.diameter / 2, y = this.diameter / 2, iconSize = 14; // Ease towards 1 this.progressOffset += ( 1 - this.progressOffset ) * 0.1; var endAngle = ( - Math.PI / 2 ) + ( progress * ( Math.PI * 2 ) ); var startAngle = ( - Math.PI / 2 ) + ( this.progressOffset * ( Math.PI * 2 ) ); this.context.save(); this.context.clearRect( 0, 0, this.diameter, this.diameter ); // Solid background color this.context.beginPath(); this.context.arc( x, y, radius + 2, 0, Math.PI * 2, false ); this.context.fillStyle = 'rgba( 0, 0, 0, 0.4 )'; this.context.fill(); // Draw progress track this.context.beginPath(); this.context.arc( x, y, radius, 0, Math.PI * 2, false ); this.context.lineWidth = this.thickness; this.context.strokeStyle = '#666'; this.context.stroke(); if( this.playing ) { // Draw progress on top of track this.context.beginPath(); this.context.arc( x, y, radius, startAngle, endAngle, false ); this.context.lineWidth = this.thickness; this.context.strokeStyle = '#fff'; this.context.stroke(); } this.context.translate( x - ( iconSize / 2 ), y - ( iconSize / 2 ) ); // Draw play/pause icons if( this.playing ) { this.context.fillStyle = '#fff'; this.context.fillRect( 0, 0, iconSize / 2 - 2, iconSize ); this.context.fillRect( iconSize / 2 + 2, 0, iconSize / 2 - 2, iconSize ); } else { this.context.beginPath(); this.context.translate( 2, 0 ); this.context.moveTo( 0, 0 ); this.context.lineTo( iconSize - 2, iconSize / 2 ); this.context.lineTo( 0, iconSize ); this.context.fillStyle = '#fff'; this.context.fill(); } this.context.restore(); }; Playback.prototype.on = function( type, listener ) { this.canvas.addEventListener( type, listener, false ); }; Playback.prototype.off = function( type, listener ) { this.canvas.removeEventListener( type, listener, false ); }; Playback.prototype.destroy = function() { this.playing = false; if( this.canvas.parentNode ) { this.container.removeChild( this.canvas ); } }; // --------------------------------------------------------------------// // ------------------------------- API --------------------------------// // --------------------------------------------------------------------// Reveal = { initialize: initialize, configure: configure, sync: sync, // Navigation methods slide: slide, left: navigateLeft, right: navigateRight, up: navigateUp, down: navigateDown, prev: navigatePrev, next: navigateNext, // Fragment methods navigateFragment: navigateFragment, prevFragment: previousFragment, nextFragment: nextFragment, // Deprecated aliases navigateTo: slide, navigateLeft: navigateLeft, navigateRight: navigateRight, navigateUp: navigateUp, navigateDown: navigateDown, navigatePrev: navigatePrev, navigateNext: navigateNext, // Forces an update in slide layout layout: layout, // Returns an object with the available routes as booleans (left/right/top/bottom) availableRoutes: availableRoutes, // Returns an object with the available fragments as booleans (prev/next) availableFragments: availableFragments, // Toggles the overview mode on/off toggleOverview: toggleOverview, // Toggles the "black screen" mode on/off togglePause: togglePause, // Toggles the auto slide mode on/off toggleAutoSlide: toggleAutoSlide, // State checks isOverview: isOverview, isPaused: isPaused, isAutoSliding: isAutoSliding, // Adds or removes all internal event listeners (such as keyboard) addEventListeners: addEventListeners, removeEventListeners: removeEventListeners, // Facility for persisting and restoring the presentation state getState: getState, setState: setState, // Presentation progress on range of 0-1 getProgress: getProgress, // Returns the indices of the current, or specified, slide getIndices: getIndices, getTotalSlides: getTotalSlides, // Returns the slide element at the specified index getSlide: getSlide, // Returns the slide background element at the specified index getSlideBackground: getSlideBackground, // Returns the previous slide element, may be null getPreviousSlide: function() { return previousSlide; }, // Returns the current slide element getCurrentSlide: function() { return currentSlide; }, // Returns the current scale of the presentation content getScale: function() { return scale; }, // Returns the current configuration object getConfig: function() { return config; }, // Helper method, retrieves query string as a key/value hash getQueryHash: function() { var query = {}; location.search.replace( /[A-Z0-9]+?=([\w\.%-]*)/gi, function(a) { query[ a.split( '=' ).shift() ] = a.split( '=' ).pop(); } ); // Basic deserialization for( var i in query ) { var value = query[ i ]; query[ i ] = deserialize( unescape( value ) ); } return query; }, // Returns true if we're currently on the first slide isFirstSlide: function() { return ( indexh === 0 && indexv === 0 ); }, // Returns true if we're currently on the last slide isLastSlide: function() { if( currentSlide ) { // Does this slide has next a sibling? if( currentSlide.nextElementSibling ) return false; // If it's vertical, does its parent have a next sibling? if( isVerticalSlide( currentSlide ) && currentSlide.parentNode.nextElementSibling ) return false; return true; } return false; }, // Checks if reveal.js has been loaded and is ready for use isReady: function() { return loaded; }, // Forward event binding to the reveal DOM element addEventListener: function( type, listener, useCapture ) { if( 'addEventListener' in window ) { ( dom.wrapper || document.querySelector( '.reveal' ) ).addEventListener( type, listener, useCapture ); } }, removeEventListener: function( type, listener, useCapture ) { if( 'addEventListener' in window ) { ( dom.wrapper || document.querySelector( '.reveal' ) ).removeEventListener( type, listener, useCapture ); } }, // Programatically triggers a keyboard event triggerKey: function( keyCode ) { onDocumentKeyDown( { keyCode: keyCode } ); } }; return Reveal; })); ================================================ FILE: presentation/lib/css/zenburn.css ================================================ /* Zenburn style from voldmar.ru (c) Vladimir Epifanov based on dark.css by Ivan Sagalaev */ .hljs { display: block; padding: 0.5em; background: #3F3F3F; color: #DCDCDC; } .hljs-keyword, .hljs-tag, .css .hljs-class, .css .hljs-id, .lisp .hljs-title, .nginx .hljs-title, .hljs-request, .hljs-status, .clojure .hljs-attribute { color: #E3CEAB; } .django .hljs-template_tag, .django .hljs-variable, .django .hljs-filter .hljs-argument { color: #DCDCDC; } .hljs-number, .hljs-date { color: #8CD0D3; } .dos .hljs-envvar, .dos .hljs-stream, .hljs-variable, .apache .hljs-sqbracket { color: #EFDCBC; } .dos .hljs-flow, .diff .hljs-change, .python .exception, .python .hljs-built_in, .hljs-literal, .tex .hljs-special { color: #EFEFAF; } .diff .hljs-chunk, .hljs-subst { color: #8F8F8F; } .dos .hljs-keyword, .python .hljs-decorator, .hljs-title, .haskell .hljs-type, .diff .hljs-header, .ruby .hljs-class .hljs-parent, .apache .hljs-tag, .nginx .hljs-built_in, .tex .hljs-command, .hljs-prompt { color: #efef8f; } .dos .hljs-winutils, .ruby .hljs-symbol, .ruby .hljs-symbol .hljs-string, .ruby .hljs-string { color: #DCA3A3; } .diff .hljs-deletion, .hljs-string, .hljs-tag .hljs-value, .hljs-preprocessor, .hljs-pragma, .hljs-built_in, .sql .hljs-aggregate, .hljs-javadoc, .smalltalk .hljs-class, .smalltalk .hljs-localvars, .smalltalk .hljs-array, .css .hljs-rules .hljs-value, .hljs-attr_selector, .hljs-pseudo, .apache .hljs-cbracket, .tex .hljs-formula, .coffeescript .hljs-attribute { color: #CC9393; } .hljs-shebang, .diff .hljs-addition, .hljs-comment, .java .hljs-annotation, .hljs-template_comment, .hljs-pi, .hljs-doctype { color: #7F9F7F; } .coffeescript .javascript, .javascript .xml, .tex .hljs-formula, .xml .javascript, .xml .vbscript, .xml .css, .xml .hljs-cdata { opacity: 0.5; } ================================================ FILE: presentation/lib/font/league-gothic/LICENSE ================================================ SIL Open Font License (OFL) http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL ================================================ FILE: presentation/lib/font/league-gothic/league-gothic.css ================================================ @font-face { font-family: 'League Gothic'; src: url('league-gothic.eot'); src: url('league-gothic.eot?#iefix') format('embedded-opentype'), url('league-gothic.woff') format('woff'), url('league-gothic.ttf') format('truetype'); font-weight: normal; font-style: normal; } ================================================ FILE: presentation/lib/font/source-sans-pro/LICENSE ================================================ SIL Open Font License Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name ‘Source’. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. 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: presentation/lib/font/source-sans-pro/source-sans-pro.css ================================================ @font-face { font-family: 'Source Sans Pro'; src: url('source-sans-pro-regular.eot'); src: url('source-sans-pro-regular.eot?#iefix') format('embedded-opentype'), url('source-sans-pro-regular.woff') format('woff'), url('source-sans-pro-regular.ttf') format('truetype'); font-weight: normal; font-style: normal; } @font-face { font-family: 'Source Sans Pro'; src: url('source-sans-pro-italic.eot'); src: url('source-sans-pro-italic.eot?#iefix') format('embedded-opentype'), url('source-sans-pro-italic.woff') format('woff'), url('source-sans-pro-italic.ttf') format('truetype'); font-weight: normal; font-style: italic; } @font-face { font-family: 'Source Sans Pro'; src: url('source-sans-pro-semibold.eot'); src: url('source-sans-pro-semibold.eot?#iefix') format('embedded-opentype'), url('source-sans-pro-semibold.woff') format('woff'), url('source-sans-pro-semibold.ttf') format('truetype'); font-weight: 600; font-style: normal; } @font-face { font-family: 'Source Sans Pro'; src: url('source-sans-pro-semibolditalic.eot'); src: url('source-sans-pro-semibolditalic.eot?#iefix') format('embedded-opentype'), url('source-sans-pro-semibolditalic.woff') format('woff'), url('source-sans-pro-semibolditalic.ttf') format('truetype'); font-weight: 600; font-style: italic; } ================================================ FILE: presentation/lib/js/classList.js ================================================ /*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/ if(typeof document!=="undefined"&&!("classList" in document.createElement("a"))){(function(j){var a="classList",f="prototype",m=(j.HTMLElement||j.Element)[f],b=Object,k=String[f].trim||function(){return this.replace(/^\s+|\s+$/g,"")},c=Array[f].indexOf||function(q){var p=0,o=this.length;for(;p/g,">"); } // re-highlight when focus is lost (for edited code) element.addEventListener( 'focusout', function( event ) { hljs.highlightBlock( event.currentTarget ); }, false ); } } })(); // END CUSTOM REVEAL.JS INTEGRATION // highlight.js v8.2 with support for all available languages var hljs=new function(){function j(v){return v.replace(/&/gm,"&").replace(//gm,">")}function t(v){return v.nodeName.toLowerCase()}function h(w,x){var v=w&&w.exec(x);return v&&v.index==0}function r(w){var v=(w.className+" "+(w.parentNode?w.parentNode.className:"")).split(/\s+/);v=v.map(function(x){return x.replace(/^lang(uage)?-/,"")});return v.filter(function(x){return i(x)||/no(-?)highlight/.test(x)})[0]}function o(x,y){var v={};for(var w in x){v[w]=x[w]}if(y){for(var w in y){v[w]=y[w]}}return v}function u(x){var v=[];(function w(y,z){for(var A=y.firstChild;A;A=A.nextSibling){if(A.nodeType==3){z+=A.nodeValue.length}else{if(A.nodeType==1){v.push({event:"start",offset:z,node:A});z=w(A,z);if(!t(A).match(/br|hr|img|input/)){v.push({event:"stop",offset:z,node:A})}}}}return z})(x,0);return v}function q(w,y,C){var x=0;var F="";var z=[];function B(){if(!w.length||!y.length){return w.length?w:y}if(w[0].offset!=y[0].offset){return(w[0].offset"}function E(G){F+=""}function v(G){(G.event=="start"?A:E)(G.node)}while(w.length||y.length){var D=B();F+=j(C.substr(x,D[0].offset-x));x=D[0].offset;if(D==w){z.reverse().forEach(E);do{v(D.splice(0,1)[0]);D=B()}while(D==w&&D.length&&D[0].offset==x);z.reverse().forEach(A)}else{if(D[0].event=="start"){z.push(D[0].node)}else{z.pop()}v(D.splice(0,1)[0])}}return F+j(C.substr(x))}function m(y){function v(z){return(z&&z.source)||z}function w(A,z){return RegExp(v(A),"m"+(y.cI?"i":"")+(z?"g":""))}function x(D,C){if(D.compiled){return}D.compiled=true;D.k=D.k||D.bK;if(D.k){var z={};var E=function(G,F){if(y.cI){F=F.toLowerCase()}F.split(" ").forEach(function(H){var I=H.split("|");z[I[0]]=[G,I[1]?Number(I[1]):1]})};if(typeof D.k=="string"){E("keyword",D.k)}else{Object.keys(D.k).forEach(function(F){E(F,D.k[F])})}D.k=z}D.lR=w(D.l||/\b[A-Za-z0-9_]+\b/,true);if(C){if(D.bK){D.b="\\b("+D.bK.split(" ").join("|")+")\\b"}if(!D.b){D.b=/\B|\b/}D.bR=w(D.b);if(!D.e&&!D.eW){D.e=/\B|\b/}if(D.e){D.eR=w(D.e)}D.tE=v(D.e)||"";if(D.eW&&C.tE){D.tE+=(D.e?"|":"")+C.tE}}if(D.i){D.iR=w(D.i)}if(D.r===undefined){D.r=1}if(!D.c){D.c=[]}var B=[];D.c.forEach(function(F){if(F.v){F.v.forEach(function(G){B.push(o(F,G))})}else{B.push(F=="self"?D:F)}});D.c=B;D.c.forEach(function(F){x(F,D)});if(D.starts){x(D.starts,C)}var A=D.c.map(function(F){return F.bK?"\\.?("+F.b+")\\.?":F.b}).concat([D.tE,D.i]).map(v).filter(Boolean);D.t=A.length?w(A.join("|"),true):{exec:function(F){return null}}}x(y)}function c(T,L,J,R){function v(V,W){for(var U=0;U";V+=aa+'">';return V+Y+Z}function N(){if(!I.k){return j(C)}var U="";var X=0;I.lR.lastIndex=0;var V=I.lR.exec(C);while(V){U+=j(C.substr(X,V.index-X));var W=E(I,V);if(W){H+=W[1];U+=w(W[0],j(V[0]))}else{U+=j(V[0])}X=I.lR.lastIndex;V=I.lR.exec(C)}return U+j(C.substr(X))}function F(){if(I.sL&&!f[I.sL]){return j(C)}var U=I.sL?c(I.sL,C,true,S):e(C);if(I.r>0){H+=U.r}if(I.subLanguageMode=="continuous"){S=U.top}return w(U.language,U.value,false,true)}function Q(){return I.sL!==undefined?F():N()}function P(W,V){var U=W.cN?w(W.cN,"",true):"";if(W.rB){D+=U;C=""}else{if(W.eB){D+=j(V)+U;C=""}else{D+=U;C=V}}I=Object.create(W,{parent:{value:I}})}function G(U,Y){C+=U;if(Y===undefined){D+=Q();return 0}var W=v(Y,I);if(W){D+=Q();P(W,Y);return W.rB?0:Y.length}var X=z(I,Y);if(X){var V=I;if(!(V.rE||V.eE)){C+=Y}D+=Q();do{if(I.cN){D+=""}H+=I.r;I=I.parent}while(I!=X.parent);if(V.eE){D+=j(Y)}C="";if(X.starts){P(X.starts,"")}return V.rE?0:Y.length}if(A(Y,I)){throw new Error('Illegal lexeme "'+Y+'" for mode "'+(I.cN||"")+'"')}C+=Y;return Y.length||1}var M=i(T);if(!M){throw new Error('Unknown language: "'+T+'"')}m(M);var I=R||M;var S;var D="";for(var K=I;K!=M;K=K.parent){if(K.cN){D=w(K.cN,"",true)+D}}var C="";var H=0;try{var B,y,x=0;while(true){I.t.lastIndex=x;B=I.t.exec(L);if(!B){break}y=G(L.substr(x,B.index-x),B[0]);x=B.index+y}G(L.substr(x));for(var K=I;K.parent;K=K.parent){if(K.cN){D+=""}}return{r:H,value:D,language:T,top:I}}catch(O){if(O.message.indexOf("Illegal")!=-1){return{r:0,value:j(L)}}else{throw O}}}function e(y,x){x=x||b.languages||Object.keys(f);var v={r:0,value:j(y)};var w=v;x.forEach(function(z){if(!i(z)){return}var A=c(z,y,false);A.language=z;if(A.r>w.r){w=A}if(A.r>v.r){w=v;v=A}});if(w.language){v.second_best=w}return v}function g(v){if(b.tabReplace){v=v.replace(/^((<[^>]+>|\t)+)/gm,function(w,z,y,x){return z.replace(/\t/g,b.tabReplace)})}if(b.useBR){v=v.replace(/\n/g,"
")}return v}function p(A){var B=r(A);if(/no(-?)highlight/.test(B)){return}var y;if(b.useBR){y=document.createElementNS("http://www.w3.org/1999/xhtml","div");y.innerHTML=A.innerHTML.replace(/\n/g,"").replace(//g,"\n")}else{y=A}var z=y.textContent;var v=B?c(B,z,true):e(z);var x=u(y);if(x.length){var w=document.createElementNS("http://www.w3.org/1999/xhtml","div");w.innerHTML=v.value;v.value=q(x,u(w),z)}v.value=g(v.value);A.innerHTML=v.value;A.className+=" hljs "+(!B&&v.language||"");A.result={language:v.language,re:v.r};if(v.second_best){A.second_best={language:v.second_best.language,re:v.second_best.r}}}var b={classPrefix:"hljs-",tabReplace:null,useBR:false,languages:undefined};function s(v){b=o(b,v)}function l(){if(l.called){return}l.called=true;var v=document.querySelectorAll("pre code");Array.prototype.forEach.call(v,p)}function a(){addEventListener("DOMContentLoaded",l,false);addEventListener("load",l,false)}var f={};var n={};function d(v,x){var w=f[v]=x(this);if(w.aliases){w.aliases.forEach(function(y){n[y]=v})}}function k(){return Object.keys(f)}function i(v){return f[v]||f[n[v]]}this.highlight=c;this.highlightAuto=e;this.fixMarkup=g;this.highlightBlock=p;this.configure=s;this.initHighlighting=l;this.initHighlightingOnLoad=a;this.registerLanguage=d;this.listLanguages=k;this.getLanguage=i;this.inherit=o;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE]};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE]};this.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/};this.CLCM={cN:"comment",b:"//",e:"$",c:[this.PWM]};this.CBCM={cN:"comment",b:"/\\*",e:"\\*/",c:[this.PWM]};this.HCM={cN:"comment",b:"#",e:"$",c:[this.PWM]};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.CSSNM={cN:"number",b:this.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0};this.RM={cN:"regexp",b:/\//,e:/\/[gim]*/,i:/\n/,c:[this.BE,{b:/\[/,e:/\]/,r:0,c:[this.BE]}]};this.TM={cN:"title",b:this.IR,r:0};this.UTM={cN:"title",b:this.UIR,r:0}}();hljs.registerLanguage("bash",function(b){var a={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)\}/}]};var d={cN:"string",b:/"/,e:/"/,c:[b.BE,a,{cN:"variable",b:/\$\(/,e:/\)/,c:[b.BE]}]};var c={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/-?[a-z\.]+/,k:{keyword:"if then else elif fi for break continue while in do done exit return set declare case esac export exec",literal:"true false",built_in:"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo",operator:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"shebang",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:true,c:[b.inherit(b.TM,{b:/\w[\w\d_]*/})],r:0},b.HCM,b.NM,d,c,a]}});hljs.registerLanguage("fix",function(a){return{c:[{b:/[^\u2401\u0001]+/,e:/[\u2401\u0001]/,eE:true,rB:true,rE:false,c:[{b:/([^\u2401\u0001=]+)/,e:/=([^\u2401\u0001=]+)/,rE:true,rB:false,cN:"attribute"},{b:/=/,e:/([\u2401\u0001])/,eE:true,eB:true,cN:"string"}]}],cI:true}});hljs.registerLanguage("nsis",function(a){var c={cN:"symbol",b:"\\$(ADMINTOOLS|APPDATA|CDBURN_AREA|CMDLINE|COMMONFILES32|COMMONFILES64|COMMONFILES|COOKIES|DESKTOP|DOCUMENTS|EXEDIR|EXEFILE|EXEPATH|FAVORITES|FONTS|HISTORY|HWNDPARENT|INSTDIR|INTERNET_CACHE|LANGUAGE|LOCALAPPDATA|MUSIC|NETHOOD|OUTDIR|PICTURES|PLUGINSDIR|PRINTHOOD|PROFILE|PROGRAMFILES32|PROGRAMFILES64|PROGRAMFILES|QUICKLAUNCH|RECENT|RESOURCES_LOCALIZED|RESOURCES|SENDTO|SMPROGRAMS|SMSTARTUP|STARTMENU|SYSDIR|TEMP|TEMPLATES|VIDEOS|WINDIR)"};var b={cN:"constant",b:"\\$+{[a-zA-Z0-9_]+}"};var f={cN:"variable",b:"\\$+[a-zA-Z0-9_]+",i:"\\(\\){}"};var e={cN:"constant",b:"\\$+\\([a-zA-Z0-9_]+\\)"};var g={cN:"params",b:"(ARCHIVE|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_OFFLINE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_TEMPORARY|HKCR|HKCU|HKDD|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_DYN_DATA|HKEY_LOCAL_MACHINE|HKEY_PERFORMANCE_DATA|HKEY_USERS|HKLM|HKPD|HKU|IDABORT|IDCANCEL|IDIGNORE|IDNO|IDOK|IDRETRY|IDYES|MB_ABORTRETRYIGNORE|MB_DEFBUTTON1|MB_DEFBUTTON2|MB_DEFBUTTON3|MB_DEFBUTTON4|MB_ICONEXCLAMATION|MB_ICONINFORMATION|MB_ICONQUESTION|MB_ICONSTOP|MB_OK|MB_OKCANCEL|MB_RETRYCANCEL|MB_RIGHT|MB_RTLREADING|MB_SETFOREGROUND|MB_TOPMOST|MB_USERICON|MB_YESNO|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY)"};var d={cN:"constant",b:"\\!(addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversionsystem|ifdef|ifmacrodef|ifmacrondef|ifndef|if|include|insertmacro|macroend|macro|packhdr|searchparse|searchreplace|tempfile|undef|verbose|warning)"};return{cI:false,k:{keyword:"Abort AddBrandingImage AddSize AllowRootDirInstall AllowSkipFiles AutoCloseWindow BGFont BGGradient BrandingText BringToFront Call CallInstDLL Caption ChangeUI CheckBitmap ClearErrors CompletedText ComponentText CopyFiles CRCCheck CreateDirectory CreateFont CreateShortCut Delete DeleteINISec DeleteINIStr DeleteRegKey DeleteRegValue DetailPrint DetailsButtonText DirText DirVar DirVerify EnableWindow EnumRegKey EnumRegValue Exch Exec ExecShell ExecWait ExpandEnvStrings File FileBufSize FileClose FileErrorText FileOpen FileRead FileReadByte FileReadUTF16LE FileReadWord FileSeek FileWrite FileWriteByte FileWriteUTF16LE FileWriteWord FindClose FindFirst FindNext FindWindow FlushINI FunctionEnd GetCurInstType GetCurrentAddress GetDlgItem GetDLLVersion GetDLLVersionLocal GetErrorLevel GetFileTime GetFileTimeLocal GetFullPathName GetFunctionAddress GetInstDirError GetLabelAddress GetTempFileName Goto HideWindow Icon IfAbort IfErrors IfFileExists IfRebootFlag IfSilent InitPluginsDir InstallButtonText InstallColors InstallDir InstallDirRegKey InstProgressFlags InstType InstTypeGetText InstTypeSetText IntCmp IntCmpU IntFmt IntOp IsWindow LangString LicenseBkColor LicenseData LicenseForceSelection LicenseLangString LicenseText LoadLanguageFile LockWindow LogSet LogText ManifestDPIAware ManifestSupportedOS MessageBox MiscButtonText Name Nop OutFile Page PageCallbacks PageExEnd Pop Push Quit ReadEnvStr ReadINIStr ReadRegDWORD ReadRegStr Reboot RegDLL Rename RequestExecutionLevel ReserveFile Return RMDir SearchPath SectionEnd SectionGetFlags SectionGetInstTypes SectionGetSize SectionGetText SectionGroupEnd SectionIn SectionSetFlags SectionSetInstTypes SectionSetSize SectionSetText SendMessage SetAutoClose SetBrandingImage SetCompress SetCompressor SetCompressorDictSize SetCtlColors SetCurInstType SetDatablockOptimize SetDateSave SetDetailsPrint SetDetailsView SetErrorLevel SetErrors SetFileAttributes SetFont SetOutPath SetOverwrite SetPluginUnload SetRebootFlag SetRegView SetShellVarContext SetSilent ShowInstDetails ShowUninstDetails ShowWindow SilentInstall SilentUnInstall Sleep SpaceTexts StrCmp StrCmpS StrCpy StrLen SubCaption SubSectionEnd Unicode UninstallButtonText UninstallCaption UninstallIcon UninstallSubCaption UninstallText UninstPage UnRegDLL Var VIAddVersionKey VIFileVersion VIProductVersion WindowIcon WriteINIStr WriteRegBin WriteRegDWORD WriteRegExpandStr WriteRegStr WriteUninstaller XPStyle",literal:"admin all auto both colored current false force hide highest lastused leave listonly none normal notset off on open print show silent silentlog smooth textonly true user "},c:[a.HCM,a.CBCM,{cN:"string",b:'"',e:'"',i:"\\n",c:[{cN:"symbol",b:"\\$(\\\\(n|r|t)|\\$)"},c,b,f,e]},{cN:"comment",b:";",e:"$",r:0},{cN:"function",bK:"Function PageEx Section SectionGroup SubSection",e:"$"},d,b,f,e,g,a.NM,{cN:"literal",b:a.IR+"::"+a.IR}]}});hljs.registerLanguage("haxe",function(a){var c="[a-zA-Z_$][a-zA-Z0-9_$]*";var b="([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)";return{aliases:["hx"],k:{keyword:"break callback case cast catch class continue default do dynamic else enum extends extern for function here if implements import in inline interface never new override package private public return static super switch this throw trace try typedef untyped using var while",literal:"true false null"},c:[a.ASM,a.QSM,a.CLCM,a.CBCM,a.CNM,{cN:"class",bK:"class interface",e:"{",eE:true,c:[{bK:"extends implements"},a.TM]},{cN:"preprocessor",b:"#",e:"$",k:"if else elseif end error"},{cN:"function",bK:"function",e:"[{;]",eE:true,i:"\\S",c:[a.TM,{cN:"params",b:"\\(",e:"\\)",c:[a.ASM,a.QSM,a.CLCM,a.CBCM]},{cN:"type",b:":",e:b,r:10}]}]}});hljs.registerLanguage("erlang",function(i){var c="[a-z'][a-zA-Z0-9_']*";var o="("+c+":"+c+"|"+c+")";var f={keyword:"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun if let not of orelse|10 query receive rem try when xor",literal:"false true"};var l={cN:"comment",b:"%",e:"$"};var e={cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0};var g={b:"fun\\s+"+c+"/\\d+"};var n={b:o+"\\(",e:"\\)",rB:true,r:0,c:[{cN:"function_name",b:o,r:0},{b:"\\(",e:"\\)",eW:true,rE:true,r:0}]};var h={cN:"tuple",b:"{",e:"}",r:0};var a={cN:"variable",b:"\\b_([A-Z][A-Za-z0-9_]*)?",r:0};var m={cN:"variable",b:"[A-Z][a-zA-Z0-9_]*",r:0};var b={b:"#"+i.UIR,r:0,rB:true,c:[{cN:"record_name",b:"#"+i.UIR,r:0},{b:"{",e:"}",r:0}]};var k={bK:"fun receive if try case",e:"end",k:f};k.c=[l,g,i.inherit(i.ASM,{cN:""}),k,n,i.QSM,e,h,a,m,b];var j=[l,g,k,n,i.QSM,e,h,a,m,b];n.c[1].c=j;h.c=j;b.c[1].c=j;var d={cN:"params",b:"\\(",e:"\\)",c:j};return{aliases:["erl"],k:f,i:"(",rB:true,i:"\\(|#|//|/\\*|\\\\|:|;",c:[d,i.inherit(i.TM,{b:c})],starts:{e:";|\\.",k:f,c:j}},l,{cN:"pp",b:"^-",e:"\\.",r:0,eE:true,rB:true,l:"-"+i.IR,k:"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior -spec",c:[d]},e,i.QSM,b,a,m,h,{b:/\.$/}]}});hljs.registerLanguage("cs",function(c){var b="abstract as base bool break byte case catch char checked const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await protected public private internal ascending descending from get group into join let orderby partial select set value var where yield";var a=c.IR+"(<"+c.IR+">)?";return{aliases:["csharp"],k:b,i:/::/,c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",v:[{b:"///",r:0},{b:""},{b:""}]}]},c.CLCM,c.CBCM,{cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line region endregion pragma checksum"},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},c.ASM,c.QSM,c.CNM,{bK:"class namespace interface",e:/[{;=]/,i:/[^\s:]/,c:[c.TM,c.CLCM,c.CBCM]},{bK:"new",e:/\s/,r:0},{cN:"function",b:"("+a+"\\s+)+"+c.IR+"\\s*\\(",rB:true,e:/[{;=]/,eE:true,k:b,c:[{b:c.IR+"\\s*\\(",rB:true,c:[c.TM]},{cN:"params",b:/\(/,e:/\)/,k:b,c:[c.ASM,c.QSM,c.CNM,c.CBCM]},c.CLCM,c.CBCM]}]}});hljs.registerLanguage("protobuf",function(a){return{k:{keyword:"package import option optional required repeated group",built_in:"double float int32 int64 uint32 uint64 sint32 sint64 fixed32 fixed64 sfixed32 sfixed64 bool string bytes",literal:"true false"},c:[a.QSM,a.NM,a.CLCM,{cN:"class",bK:"message enum service",e:/\{/,i:/\n/,c:[a.inherit(a.TM,{starts:{eW:true,eE:true}})]},{cN:"function",bK:"rpc",e:/;/,eE:true,k:"rpc returns"},{cN:"constant",b:/^\s*[A-Z_]+/,e:/\s*=/,eE:true}]}});hljs.registerLanguage("vim",function(a){return{l:/[!#@\w]+/,k:{keyword:"N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope cp cpf cq cr cs cst cu cuna cunme cw d|0 delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu g|0 go gr grepa gu gv ha h|0 helpf helpg helpt hi hid his i|0 ia iabc if ij il im imapc ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs n|0 new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf q|0 quita qa r|0 rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv s|0 sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor so spelld spe spelli spellr spellu spellw sp spr sre st sta startg startr star stopi stj sts sun sunm sunme sus sv sw sy synti sync t|0 tN tabN tabc tabdo tabe tabf tabfir tabl tabm tabnew tabn tabo tabp tabr tabs tab ta tags tc tcld tclf te tf th tj tl tm tn to tp tr try ts tu u|0 undoj undol una unh unl unlo unm unme uns up v|0 ve verb vert vim vimgrepa vi viu vie vm vmapc vme vne vn vnoreme vs vu vunme windo w|0 wN wa wh wi winc winp wn wp wq wqa ws wu wv x|0 xa xmapc xm xme xn xnoreme xu xunme y|0 z|0 ~ Next Print append abbreviate abclear aboveleft all amenu anoremenu args argadd argdelete argedit argglobal arglocal argument ascii autocmd augroup aunmenu buffer bNext ball badd bdelete behave belowright bfirst blast bmodified bnext botright bprevious brewind break breakadd breakdel breaklist browse bunload bwipeout change cNext cNfile cabbrev cabclear caddbuffer caddexpr caddfile call catch cbuffer cclose center cexpr cfile cfirst cgetbuffer cgetexpr cgetfile chdir checkpath checktime clist clast close cmap cmapclear cmenu cnext cnewer cnfile cnoremap cnoreabbrev cnoremenu copy colder colorscheme command comclear compiler continue confirm copen cprevious cpfile cquit crewind cscope cstag cunmap cunabbrev cunmenu cwindow delete delmarks debug debuggreedy delcommand delfunction diffupdate diffget diffoff diffpatch diffput diffsplit digraphs display deletel djump dlist doautocmd doautoall deletep drop dsearch dsplit edit earlier echo echoerr echohl echomsg else elseif emenu endif endfor endfunction endtry endwhile enew execute exit exusage file filetype find finally finish first fixdel fold foldclose folddoopen folddoclosed foldopen function global goto grep grepadd gui gvim hardcopy help helpfind helpgrep helptags highlight hide history insert iabbrev iabclear ijump ilist imap imapclear imenu inoremap inoreabbrev inoremenu intro isearch isplit iunmap iunabbrev iunmenu join jumps keepalt keepmarks keepjumps lNext lNfile list laddexpr laddbuffer laddfile last language later lbuffer lcd lchdir lclose lcscope left leftabove lexpr lfile lfirst lgetbuffer lgetexpr lgetfile lgrep lgrepadd lhelpgrep llast llist lmake lmap lmapclear lnext lnewer lnfile lnoremap loadkeymap loadview lockmarks lockvar lolder lopen lprevious lpfile lrewind ltag lunmap luado luafile lvimgrep lvimgrepadd lwindow move mark make mapclear match menu menutranslate messages mkexrc mksession mkspell mkvimrc mkview mode mzscheme mzfile nbclose nbkey nbsart next nmap nmapclear nmenu nnoremap nnoremenu noautocmd noremap nohlsearch noreabbrev noremenu normal number nunmap nunmenu oldfiles open omap omapclear omenu only onoremap onoremenu options ounmap ounmenu ownsyntax print profdel profile promptfind promptrepl pclose pedit perl perldo pop popup ppop preserve previous psearch ptag ptNext ptfirst ptjump ptlast ptnext ptprevious ptrewind ptselect put pwd py3do py3file python pydo pyfile quit quitall qall read recover redo redir redraw redrawstatus registers resize retab return rewind right rightbelow ruby rubydo rubyfile rundo runtime rviminfo substitute sNext sandbox sargument sall saveas sbuffer sbNext sball sbfirst sblast sbmodified sbnext sbprevious sbrewind scriptnames scriptencoding scscope set setfiletype setglobal setlocal sfind sfirst shell simalt sign silent sleep slast smagic smapclear smenu snext sniff snomagic snoremap snoremenu sort source spelldump spellgood spellinfo spellrepall spellundo spellwrong split sprevious srewind stop stag startgreplace startreplace startinsert stopinsert stjump stselect sunhide sunmap sunmenu suspend sview swapname syntax syntime syncbind tNext tabNext tabclose tabedit tabfind tabfirst tablast tabmove tabnext tabonly tabprevious tabrewind tag tcl tcldo tclfile tearoff tfirst throw tjump tlast tmenu tnext topleft tprevious trewind tselect tunmenu undo undojoin undolist unabbreviate unhide unlet unlockvar unmap unmenu unsilent update vglobal version verbose vertical vimgrep vimgrepadd visual viusage view vmap vmapclear vmenu vnew vnoremap vnoremenu vsplit vunmap vunmenu write wNext wall while winsize wincmd winpos wnext wprevious wqall wsverb wundo wviminfo xit xall xmapclear xmap xmenu xnoremap xnoremenu xunmap xunmenu yank",built_in:"abs acos add and append argc argidx argv asin atan atan2 browse browsedir bufexists buflisted bufloaded bufname bufnr bufwinnr byte2line byteidx call ceil changenr char2nr cindent clearmatches col complete complete_add complete_check confirm copy cos cosh count cscope_connection cursor deepcopy delete did_filetype diff_filler diff_hlID empty escape eval eventhandler executable exists exp expand extend feedkeys filereadable filewritable filter finddir findfile float2nr floor fmod fnameescape fnamemodify foldclosed foldclosedend foldlevel foldtext foldtextresult foreground function garbagecollect get getbufline getbufvar getchar getcharmod getcmdline getcmdpos getcmdtype getcwd getfontname getfperm getfsize getftime getftype getline getloclist getmatches getpid getpos getqflist getreg getregtype gettabvar gettabwinvar getwinposx getwinposy getwinvar glob globpath has has_key haslocaldir hasmapto histadd histdel histget histnr hlexists hlID hostname iconv indent index input inputdialog inputlist inputrestore inputsave inputsecret insert invert isdirectory islocked items join keys len libcall libcallnr line line2byte lispindent localtime log log10 luaeval map maparg mapcheck match matchadd matcharg matchdelete matchend matchlist matchstr max min mkdir mode mzeval nextnonblank nr2char or pathshorten pow prevnonblank printf pumvisible py3eval pyeval range readfile reltime reltimestr remote_expr remote_foreground remote_peek remote_read remote_send remove rename repeat resolve reverse round screenattr screenchar screencol screenrow search searchdecl searchpair searchpairpos searchpos server2client serverlist setbufvar setcmdpos setline setloclist setmatches setpos setqflist setreg settabvar settabwinvar setwinvar sha256 shellescape shiftwidth simplify sin sinh sort soundfold spellbadword spellsuggest split sqrt str2float str2nr strchars strdisplaywidth strftime stridx string strlen strpart strridx strtrans strwidth submatch substitute synconcealed synID synIDattr synIDtrans synstack system tabpagebuflist tabpagenr tabpagewinnr tagfiles taglist tan tanh tempname tolower toupper tr trunc type undofile undotree values virtcol visualmode wildmenumode winbufnr wincol winheight winline winnr winrestcmd winrestview winsaveview winwidth writefile xor"},i:/[{:]/,c:[a.NM,a.ASM,{cN:"string",b:/"((\\")|[^"\n])*("|\n)/},{cN:"variable",b:/[bwtglsav]:[\w\d_]*/},{cN:"function",bK:"function function!",e:"$",r:0,c:[a.TM,{cN:"params",b:"\\(",e:"\\)"}]}]}});hljs.registerLanguage("brainfuck",function(b){var a={cN:"literal",b:"[\\+\\-]",r:0};return{aliases:["bf"],c:[{cN:"comment",b:"[^\\[\\]\\.,\\+\\-<> \r\n]",rE:true,e:"[\\[\\]\\.,\\+\\-<> \r\n]",r:0},{cN:"title",b:"[\\[\\]]",r:0},{cN:"string",b:"[\\.,]",r:0},{b:/\+\+|\-\-/,rB:true,c:[a]},a]}});hljs.registerLanguage("ruby",function(f){var j="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var i="and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor";var b={cN:"yardoctag",b:"@[A-Za-z]+"};var c={cN:"value",b:"#<",e:">"};var k={cN:"comment",v:[{b:"#",e:"$",c:[b]},{b:"^\\=begin",e:"^\\=end",c:[b],r:10},{b:"^__END__",e:"\\n$"}]};var d={cN:"subst",b:"#\\{",e:"}",k:i};var e={cN:"string",c:[f.BE,d],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:"%[qw]?\\(",e:"\\)"},{b:"%[qw]?\\[",e:"\\]"},{b:"%[qw]?{",e:"}"},{b:"%[qw]?<",e:">"},{b:"%[qw]?/",e:"/"},{b:"%[qw]?%",e:"%"},{b:"%[qw]?-",e:"-"},{b:"%[qw]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/}]};var a={cN:"params",b:"\\(",e:"\\)",k:i};var h=[e,c,k,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[f.inherit(f.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+f.IR+"::)?"+f.IR}]},k]},{cN:"function",bK:"def",e:" |$|;",r:0,c:[f.inherit(f.TM,{b:j}),a,k]},{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:f.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":",c:[e,{b:j}],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+f.RSR+")\\s*",c:[c,k,{cN:"regexp",c:[f.BE,d],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}],r:0}];d.c=h;a.c=h;var g=[{b:/^\s*=>/,cN:"status",starts:{e:"$",c:h}},{cN:"prompt",b:/^\S[^=>\n]*>+/,starts:{e:"$",c:h}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:i,c:[k].concat(g).concat(h)}});hljs.registerLanguage("nimrod",function(a){return{k:{keyword:"addr and as asm bind block break|0 case|0 cast const|0 continue|0 converter discard distinct|10 div do elif else|0 end|0 enum|0 except export finally for from generic if|0 import|0 in include|0 interface is isnot|10 iterator|10 let|0 macro method|10 mixin mod nil not notin|10 object|0 of or out proc|10 ptr raise ref|10 return shl shr static template|10 try|0 tuple type|0 using|0 var|0 when while|0 with without xor yield",literal:"shared guarded stdin stdout stderr result|10 true false"},c:[{cN:"decorator",b:/{\./,e:/\.}/,r:10},{cN:"string",b:/[a-zA-Z]\w*"/,e:/"/,c:[{b:/""/}]},{cN:"string",b:/([a-zA-Z]\w*)?"""/,e:/"""/},{cN:"string",b:/"/,e:/"/,i:/\n/,c:[{b:/\\./}]},{cN:"type",b:/\b[A-Z]\w+\b/,r:0},{cN:"type",b:/\b(int|int8|int16|int32|int64|uint|uint8|uint16|uint32|uint64|float|float32|float64|bool|char|string|cstring|pointer|expr|stmt|void|auto|any|range|array|openarray|varargs|seq|set|clong|culong|cchar|cschar|cshort|cint|csize|clonglong|cfloat|cdouble|clongdouble|cuchar|cushort|cuint|culonglong|cstringarray|semistatic)\b/},{cN:"number",b:/\b(0[xX][0-9a-fA-F][_0-9a-fA-F]*)('?[iIuU](8|16|32|64))?/,r:0},{cN:"number",b:/\b(0o[0-7][_0-7]*)('?[iIuUfF](8|16|32|64))?/,r:0},{cN:"number",b:/\b(0(b|B)[01][_01]*)('?[iIuUfF](8|16|32|64))?/,r:0},{cN:"number",b:/\b(\d[_\d]*)('?[iIuUfF](8|16|32|64))?/,r:0},a.HCM]}});hljs.registerLanguage("rust",function(a){return{aliases:["rs"],k:{keyword:"alignof as be box break const continue crate do else enum extern false fn for if impl in let loop match mod mut offsetof once priv proc pub pure ref return self sizeof static struct super trait true type typeof unsafe unsized use virtual while yield int i8 i16 i32 i64 uint u8 u32 u64 float f32 f64 str char bool",built_in:"assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! fail! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln!"},l:a.IR+"!?",i:""}]}});hljs.registerLanguage("ruleslanguage",function(a){return{k:{keyword:"BILL_PERIOD BILL_START BILL_STOP RS_EFFECTIVE_START RS_EFFECTIVE_STOP RS_JURIS_CODE RS_OPCO_CODE INTDADDATTRIBUTE|5 INTDADDVMSG|5 INTDBLOCKOP|5 INTDBLOCKOPNA|5 INTDCLOSE|5 INTDCOUNT|5 INTDCOUNTSTATUSCODE|5 INTDCREATEMASK|5 INTDCREATEDAYMASK|5 INTDCREATEFACTORMASK|5 INTDCREATEHANDLE|5 INTDCREATEOVERRIDEDAYMASK|5 INTDCREATEOVERRIDEMASK|5 INTDCREATESTATUSCODEMASK|5 INTDCREATETOUPERIOD|5 INTDDELETE|5 INTDDIPTEST|5 INTDEXPORT|5 INTDGETERRORCODE|5 INTDGETERRORMESSAGE|5 INTDISEQUAL|5 INTDJOIN|5 INTDLOAD|5 INTDLOADACTUALCUT|5 INTDLOADDATES|5 INTDLOADHIST|5 INTDLOADLIST|5 INTDLOADLISTDATES|5 INTDLOADLISTENERGY|5 INTDLOADLISTHIST|5 INTDLOADRELATEDCHANNEL|5 INTDLOADSP|5 INTDLOADSTAGING|5 INTDLOADUOM|5 INTDLOADUOMDATES|5 INTDLOADUOMHIST|5 INTDLOADVERSION|5 INTDOPEN|5 INTDREADFIRST|5 INTDREADNEXT|5 INTDRECCOUNT|5 INTDRELEASE|5 INTDREPLACE|5 INTDROLLAVG|5 INTDROLLPEAK|5 INTDSCALAROP|5 INTDSCALE|5 INTDSETATTRIBUTE|5 INTDSETDSTPARTICIPANT|5 INTDSETSTRING|5 INTDSETVALUE|5 INTDSETVALUESTATUS|5 INTDSHIFTSTARTTIME|5 INTDSMOOTH|5 INTDSORT|5 INTDSPIKETEST|5 INTDSUBSET|5 INTDTOU|5 INTDTOURELEASE|5 INTDTOUVALUE|5 INTDUPDATESTATS|5 INTDVALUE|5 STDEV INTDDELETEEX|5 INTDLOADEXACTUAL|5 INTDLOADEXCUT|5 INTDLOADEXDATES|5 INTDLOADEX|5 INTDLOADEXRELATEDCHANNEL|5 INTDSAVEEX|5 MVLOAD|5 MVLOADACCT|5 MVLOADACCTDATES|5 MVLOADACCTHIST|5 MVLOADDATES|5 MVLOADHIST|5 MVLOADLIST|5 MVLOADLISTDATES|5 MVLOADLISTHIST|5 IF FOR NEXT DONE SELECT END CALL ABORT CLEAR CHANNEL FACTOR LIST NUMBER OVERRIDE SET WEEK DISTRIBUTIONNODE ELSE WHEN THEN OTHERWISE IENUM CSV INCLUDE LEAVE RIDER SAVE DELETE NOVALUE SECTION WARN SAVE_UPDATE DETERMINANT LABEL REPORT REVENUE EACH IN FROM TOTAL CHARGE BLOCK AND OR CSV_FILE RATE_CODE AUXILIARY_DEMAND UIDACCOUNT RS BILL_PERIOD_SELECT HOURS_PER_MONTH INTD_ERROR_STOP SEASON_SCHEDULE_NAME ACCOUNTFACTOR ARRAYUPPERBOUND CALLSTOREDPROC GETADOCONNECTION GETCONNECT GETDATASOURCE GETQUALIFIER GETUSERID HASVALUE LISTCOUNT LISTOP LISTUPDATE LISTVALUE PRORATEFACTOR RSPRORATE SETBINPATH SETDBMONITOR WQ_OPEN BILLINGHOURS DATE DATEFROMFLOAT DATETIMEFROMSTRING DATETIMETOSTRING DATETOFLOAT DAY DAYDIFF DAYNAME DBDATETIME HOUR MINUTE MONTH MONTHDIFF MONTHHOURS MONTHNAME ROUNDDATE SAMEWEEKDAYLASTYEAR SECOND WEEKDAY WEEKDIFF YEAR YEARDAY YEARSTR COMPSUM HISTCOUNT HISTMAX HISTMIN HISTMINNZ HISTVALUE MAXNRANGE MAXRANGE MINRANGE COMPIKVA COMPKVA COMPKVARFROMKQKW COMPLF IDATTR FLAG LF2KW LF2KWH MAXKW POWERFACTOR READING2USAGE AVGSEASON MAXSEASON MONTHLYMERGE SEASONVALUE SUMSEASON ACCTREADDATES ACCTTABLELOAD CONFIGADD CONFIGGET CREATEOBJECT CREATEREPORT EMAILCLIENT EXPBLKMDMUSAGE EXPMDMUSAGE EXPORT_USAGE FACTORINEFFECT GETUSERSPECIFIEDSTOP INEFFECT ISHOLIDAY RUNRATE SAVE_PROFILE SETREPORTTITLE USEREXIT WATFORRUNRATE TO TABLE ACOS ASIN ATAN ATAN2 BITAND CEIL COS COSECANT COSH COTANGENT DIVQUOT DIVREM EXP FABS FLOOR FMOD FREPM FREXPN LOG LOG10 MAX MAXN MIN MINNZ MODF POW ROUND ROUND2VALUE ROUNDINT SECANT SIN SINH SQROOT TAN TANH FLOAT2STRING FLOAT2STRINGNC INSTR LEFT LEN LTRIM MID RIGHT RTRIM STRING STRINGNC TOLOWER TOUPPER TRIM NUMDAYS READ_DATE STAGING",built_in:"IDENTIFIER OPTIONS XML_ELEMENT XML_OP XML_ELEMENT_OF DOMDOCCREATE DOMDOCLOADFILE DOMDOCLOADXML DOMDOCSAVEFILE DOMDOCGETROOT DOMDOCADDPI DOMNODEGETNAME DOMNODEGETTYPE DOMNODEGETVALUE DOMNODEGETCHILDCT DOMNODEGETFIRSTCHILD DOMNODEGETSIBLING DOMNODECREATECHILDELEMENT DOMNODESETATTRIBUTE DOMNODEGETCHILDELEMENTCT DOMNODEGETFIRSTCHILDELEMENT DOMNODEGETSIBLINGELEMENT DOMNODEGETATTRIBUTECT DOMNODEGETATTRIBUTEI DOMNODEGETATTRIBUTEBYNAME DOMNODEGETBYNAME"},c:[a.CLCM,a.CBCM,a.ASM,a.QSM,a.CNM,{cN:"array",b:"#[a-zA-Z .]+"}]}});hljs.registerLanguage("rib",function(a){return{k:"ArchiveRecord AreaLightSource Atmosphere Attribute AttributeBegin AttributeEnd Basis Begin Blobby Bound Clipping ClippingPlane Color ColorSamples ConcatTransform Cone CoordinateSystem CoordSysTransform CropWindow Curves Cylinder DepthOfField Detail DetailRange Disk Displacement Display End ErrorHandler Exposure Exterior Format FrameAspectRatio FrameBegin FrameEnd GeneralPolygon GeometricApproximation Geometry Hider Hyperboloid Identity Illuminate Imager Interior LightSource MakeCubeFaceEnvironment MakeLatLongEnvironment MakeShadow MakeTexture Matte MotionBegin MotionEnd NuPatch ObjectBegin ObjectEnd ObjectInstance Opacity Option Orientation Paraboloid Patch PatchMesh Perspective PixelFilter PixelSamples PixelVariance Points PointsGeneralPolygons PointsPolygons Polygon Procedural Projection Quantize ReadArchive RelativeDetail ReverseOrientation Rotate Scale ScreenWindow ShadingInterpolation ShadingRate Shutter Sides Skew SolidBegin SolidEnd Sphere SubdivisionMesh Surface TextureCoordinates Torus Transform TransformBegin TransformEnd TransformPoints Translate TrimCurve WorldBegin WorldEnd",i:"",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"blockquote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"`.+?`"},{b:"^( {4}|\t)",e:"$",r:0}]},{cN:"horizontal_rule",b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:true,c:[{cN:"link_label",b:"\\[",e:"\\]",eB:true,rE:true,r:0},{cN:"link_url",b:"\\]\\(",e:"\\)",eB:true,eE:true},{cN:"link_reference",b:"\\]\\[",e:"\\]",eB:true,eE:true}],r:10},{b:"^\\[.+\\]:",rB:true,c:[{cN:"link_reference",b:"\\[",e:"\\]:",eB:true,eE:true,starts:{cN:"link_url",e:"$"}}]}]}});hljs.registerLanguage("dart",function(b){var d={cN:"subst",b:"\\$\\{",e:"}",k:"true false null this is new super"};var c={cN:"string",v:[{b:"r'''",e:"'''"},{b:'r"""',e:'"""'},{b:"r'",e:"'",i:"\\n"},{b:'r"',e:'"',i:"\\n"},{b:"'''",e:"'''",c:[b.BE,d]},{b:'"""',e:'"""',c:[b.BE,d]},{b:"'",e:"'",i:"\\n",c:[b.BE,d]},{b:'"',e:'"',i:"\\n",c:[b.BE,d]}]};d.c=[b.CNM,c];var a={keyword:"assert break case catch class const continue default do else enum extends false final finally for if in is new null rethrow return super switch this throw true try var void while with",literal:"abstract as dynamic export external factory get implements import library operator part set static typedef",built_in:"print Comparable DateTime Duration Function Iterable Iterator List Map Match Null Object Pattern RegExp Set Stopwatch String StringBuffer StringSink Symbol Type Uri bool double int num document window querySelector querySelectorAll Element ElementList"};return{k:a,c:[c,{cN:"dartdoc",b:"/\\*\\*",e:"\\*/",sL:"markdown",subLanguageMode:"continuous"},{cN:"dartdoc",b:"///",e:"$",sL:"markdown",subLanguageMode:"continuous"},b.CLCM,b.CBCM,{cN:"class",bK:"class interface",e:"{",eE:true,c:[{bK:"extends implements"},b.UTM]},b.CNM,{cN:"annotation",b:"@[A-Za-z]+"},{b:"=>"}]}});hljs.registerLanguage("haml",function(a){return{cI:true,c:[{cN:"doctype",b:"^!!!( (5|1\\.1|Strict|Frameset|Basic|Mobile|RDFa|XML\\b.*))?$",r:10},{cN:"comment",b:"^\\s*(!=#|=#|-#|/).*$",r:0},{b:"^\\s*(-|=|!=)(?!#)",starts:{e:"\\n",sL:"ruby"}},{cN:"tag",b:"^\\s*%",c:[{cN:"title",b:"\\w+"},{cN:"value",b:"[#\\.]\\w+"},{b:"{\\s*",e:"\\s*}",eE:true,c:[{b:":\\w+\\s*=>",e:",\\s+",rB:true,eW:true,c:[{cN:"symbol",b:":\\w+"},{cN:"string",b:'"',e:'"'},{cN:"string",b:"'",e:"'"},{b:"\\w+",r:0}]}]},{b:"\\(\\s*",e:"\\s*\\)",eE:true,c:[{b:"\\w+\\s*=",e:"\\s+",rB:true,eW:true,c:[{cN:"attribute",b:"\\w+",r:0},{cN:"string",b:'"',e:'"'},{cN:"string",b:"'",e:"'"},{b:"\\w+",r:0}]}]}]},{cN:"bullet",b:"^\\s*[=~]\\s*",r:0},{b:"#{",starts:{e:"}",sL:"ruby"}}]}});hljs.registerLanguage("javascript",function(a){return{aliases:["js"],k:{keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document"},c:[{cN:"pi",b:/^\s*('|")use strict('|")/,r:10},a.ASM,a.QSM,a.CLCM,a.CBCM,a.CNM,{b:"("+a.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[a.CLCM,a.CBCM,a.RM,{b:/;/,r:0,sL:"xml"}],r:0},{cN:"function",bK:"function",e:/\{/,eE:true,c:[a.inherit(a.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,c:[a.CLCM,a.CBCM],i:/["'\(]/}],i:/\[|%/},{b:/\$[(.]/},{b:"\\."+a.IR,r:0}]}});hljs.registerLanguage("xml",function(a){var c="[A-Za-z0-9\\._:-]+";var d={b:/<\?(php)?(?!\w)/,e:/\?>/,sL:"php",subLanguageMode:"continuous"};var b={eW:true,i:/]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xsl","plist"],cI:true,c:[{cN:"doctype",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"|$)",e:">",k:{title:"style"},c:[b],starts:{e:"",rE:true,sL:"css"}},{cN:"tag",b:"|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},d,{cN:"pi",b:/<\?\w+/,e:/\?>/,r:10},{cN:"tag",b:"",c:[{cN:"title",b:/[^ \/><\n\t]+/,r:0},b]}]}});hljs.registerLanguage("dust",function(b){var a="if eq ne lt lte gt gte select default math sep";return{aliases:["dst"],cI:true,sL:"xml",subLanguageMode:"continuous",c:[{cN:"expression",b:"{",e:"}",r:0,c:[{cN:"begin-block",b:"#[a-zA-Z- .]+",k:a},{cN:"string",b:'"',e:'"'},{cN:"end-block",b:"\\/[a-zA-Z- .]+",k:a},{cN:"variable",b:"[a-zA-Z-.]+",k:a,r:0}]}]}});hljs.registerLanguage("glsl",function(a){return{k:{keyword:"atomic_uint attribute bool break bvec2 bvec3 bvec4 case centroid coherent const continue default discard dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 dmat4x4 do double dvec2 dvec3 dvec4 else flat float for highp if iimage1D iimage1DArray iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBuffer iimageCube iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect image3D imageBuffer imageCube imageCubeArray in inout int invariant isampler1D isampler1DArray isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 layout lowp mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 mediump noperspective out patch precision readonly restrict return sample sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow smooth struct subroutine switch uimage1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint uniform usampler1D usampler1DArray usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D usamplerBuffer usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 varying vec2 vec3 vec4 void volatile while writeonly",built_in:"gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial gl_FrontSecondaryColor gl_InstanceID gl_InvocationID gl_Layer gl_LightModel gl_LightSource gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs gl_MaxCombinedTextureImageUnits gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexTextureImageUnits gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffsetgl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix gl_NormalScale gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn gl_PerVertex gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID gl_ViewportIndex gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive abs acos acosh all any asin asinh atan atanh atomicCounter atomicCounterDecrement atomicCounterIncrement barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan greaterThanEqual imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageStore imulExtended intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod textureProjLodOffset textureProjOffset textureQueryLod textureSize transpose trunc uaddCarry uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 unpackUnorm2x16 unpackUnorm4x8 usubBorrow gl_TextureMatrix gl_TextureMatrixInverse",literal:"true false"},i:'"',c:[a.CLCM,a.CBCM,a.CNM,{cN:"preprocessor",b:"#",e:"$"}]}});hljs.registerLanguage("rsl",function(a){return{k:{keyword:"float color point normal vector matrix while for if do return else break extern continue",built_in:"abs acos ambient area asin atan atmosphere attribute calculatenormal ceil cellnoise clamp comp concat cos degrees depth Deriv diffuse distance Du Dv environment exp faceforward filterstep floor format fresnel incident length lightsource log match max min mod noise normalize ntransform opposite option phong pnoise pow printf ptlined radians random reflect refract renderinfo round setcomp setxcomp setycomp setzcomp shadow sign sin smoothstep specular specularbrdf spline sqrt step tan texture textureinfo trace transform vtransform xcomp ycomp zcomp"},i:"\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*";var m="(\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s)(\\+|\\-)?\\d+)?";var k={cN:"shebang",b:"^#!",e:"$"};var b={cN:"literal",b:"\\b(t{1}|nil)\\b"};var e={cN:"number",v:[{b:m,r:0},{b:"#b[0-1]+(/[0-1]+)?"},{b:"#o[0-7]+(/[0-7]+)?"},{b:"#x[0-9a-f]+(/[0-9a-f]+)?"},{b:"#c\\("+m+" +"+m,e:"\\)"}]};var h=i.inherit(i.QSM,{i:null});var n={cN:"comment",b:";",e:"$",r:0};var g={cN:"variable",b:"\\*",e:"\\*"};var o={cN:"keyword",b:"[:&]"+l};var d={b:"\\(",e:"\\)",c:["self",b,h,e]};var a={cN:"quoted",c:[e,h,g,o,d],v:[{b:"['`]\\(",e:"\\)"},{b:"\\(quote ",e:"\\)",k:"quote"}]};var c={cN:"quoted",b:"'"+l};var j={cN:"list",b:"\\(",e:"\\)"};var f={eW:true,r:0};j.c=[{cN:"keyword",b:l},f];f.c=[a,c,j,b,e,h,n,g,o];return{i:/\S/,c:[e,k,b,h,n,a,c,j]}});hljs.registerLanguage("profile",function(a){return{c:[a.CNM,{cN:"built_in",b:"{",e:"}$",eB:true,eE:true,c:[a.ASM,a.QSM],r:0},{cN:"filename",b:"[a-zA-Z_][\\da-zA-Z_]+\\.[\\da-zA-Z_]{1,3}",e:":",eE:true},{cN:"header",b:"(ncalls|tottime|cumtime)",e:"$",k:"ncalls tottime|10 cumtime|10 filename",r:10},{cN:"summary",b:"function calls",e:"$",c:[a.CNM],r:10},a.ASM,a.QSM,{cN:"function",b:"\\(",e:"\\)$",c:[a.UTM],r:0}]}});hljs.registerLanguage("http",function(a){return{i:"\\S",c:[{cN:"status",b:"^HTTP/[0-9\\.]+",e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{cN:"request",b:"^[A-Z]+ (.*?) HTTP/[0-9\\.]+$",rB:true,e:"$",c:[{cN:"string",b:" ",e:" ",eB:true,eE:true}]},{cN:"attribute",b:"^\\w",e:": ",eE:true,i:"\\n|\\s|=",starts:{cN:"string",e:"$"}},{b:"\\n\\n",starts:{sL:"",eW:true}}]}});hljs.registerLanguage("java",function(c){var b=c.UIR+"(<"+c.UIR+">)?";var a="false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private";return{aliases:["jsp"],k:a,i:/<\//,c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",r:0,c:[{cN:"javadoctag",b:"(^|\\s)@[A-Za-z]+"}]},c.CLCM,c.CBCM,c.ASM,c.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:true,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},c.UTM]},{bK:"new",e:/\s/,r:0},{cN:"function",b:"("+b+"\\s+)+"+c.UIR+"\\s*\\(",rB:true,e:/[{;=]/,eE:true,k:a,c:[{b:c.UIR+"\\s*\\(",rB:true,c:[c.UTM]},{cN:"params",b:/\(/,e:/\)/,k:a,c:[c.ASM,c.QSM,c.CNM,c.CBCM]},c.CLCM,c.CBCM]},c.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("gherkin",function(a){return{aliases:["feature"],k:"Feature Background Ability Business Need Scenario Scenarios Scenario Outline Scenario Template Examples Given And Then But When",c:[{cN:"keyword",b:"\\*"},{cN:"comment",b:"@[^@\r\n\t ]+",e:"$"},{cN:"string",b:"\\|",e:"\\$"},{cN:"variable",b:"<",e:">",},a.HCM,{cN:"string",b:'"""',e:'"""'},a.QSM]}});hljs.registerLanguage("fsharp",function(a){var b={b:"<",e:">",c:[a.inherit(a.TM,{b:/'[a-zA-Z0-9_]+/})]};return{aliases:["fs"],k:"yield! return! let! do!abstract and as assert base begin class default delegate do done downcast downto elif else end exception extern false finally for fun function global if in inherit inline interface internal lazy let match member module mutable namespace new null of open or override private public rec return sig static struct then to true try type upcast use val void when while with yield",c:[{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},{cN:"string",b:'"""',e:'"""'},{cN:"comment",b:"\\(\\*",e:"\\*\\)"},{cN:"class",bK:"type",e:"\\(|=|$",eE:true,c:[a.UTM,b]},{cN:"annotation",b:"\\[<",e:">\\]",r:10},{cN:"attribute",b:"\\B('[A-Za-z])\\b",c:[a.BE]},a.CLCM,a.inherit(a.QSM,{i:null}),a.CNM]}});hljs.registerLanguage("mathematica",function(a){return{aliases:["mma"],l:"(\\$|\\b)"+a.IR+"\\b",k:"AbelianGroup Abort AbortKernels AbortProtect Above Abs Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Active ActiveItem ActiveStyle AcyclicGraphQ AddOnHelpPath AddTo AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AffineTransform After AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowedDimensions AllowGroupClose AllowInlineCells AllowKernelInitialization AllowReverseGroupClose AllowScriptLevelChange AlphaChannel AlternatingGroup AlternativeHypothesis Alternatives AmbientLight Analytic AnchoredSearch And AndersonDarlingTest AngerJ AngleBracket AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotation Annuity AnnuityDue Antialiasing Antisymmetric Apart ApartSquareFree Appearance AppearanceElements AppellF1 Append AppendTo Apply ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess ARProcess Array ArrayComponents ArrayDepth ArrayFlatten ArrayPad ArrayPlot ArrayQ ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads AspectRatio AspectRatioFixed Assert Assuming Assumptions AstronomicalData Asynchronous AsynchronousTaskObject AsynchronousTasks AtomQ Attributes AugmentedSymmetricPolynomial AutoAction AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords Axes AxesEdge AxesLabel AxesOrigin AxesStyle Axis BabyMonsterGroupB Back Background BackgroundTasksSettings Backslash Backsubstitution Backward Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseForm Baseline BaselinePosition BaseStyle BatesDistribution BattleLemarieWavelet Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized BetweennessCentrality BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms Booleans BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryStyle Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BubbleChart BubbleChart3D BubbleScale BubbleSizes BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteCount ByteOrdering C CachedValue CacheGraphics CalendarData CalendarType CallPacket CanberraDistance Cancel CancelButton CandlestickChart Cap CapForm CapitalDifferentialD CardinalBSplineBasis CarmichaelLambda Cases Cashflow Casoratian Catalan CatalanNumber Catch CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterDot CentralMoment CentralMomentGeneratingFunction CForm ChampernowneNumber ChanVeseBinarize Character CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop Circle CircleBox CircleDot CircleMinus CirclePlus CircleTimes CirculantGraph CityData Clear ClearAll ClearAttributes ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent ClusteringComponents CMYKColor Coarse Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorCombine ColorConvert ColorData ColorDataFunction ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorSpace Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CommonDefaultFormatTypes Commonest CommonestFilter CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledFunction Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries Composition CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath Congruent Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphQ ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray Constants ConstrainedMax ConstrainedMin ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFilename ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean Control ControlActive ControlAlignment ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateDialog CreateDirectory CreateDocument CreateIntermediateDirectories CreatePalette CreatePalettePacket CreateScheduledTask CreateTemporary CreateWindow CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossingDetect CrossMatrix Csc Csch CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrentImage CurrentlySpeakingPacket CurrentValue CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecomposition D DagumDistribution DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DataCompression DataDistribution DataRange DataReversed Date DateDelimiters DateDifference DateFunction DateList DateListLogPlot DateListPlot DatePattern DatePlus DateRange DateString DateTicksFormat DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayMatchQ DayName DayPlus DayRange DayRound DeBruijnGraph Debug DebugTag Decimal DeclareKnownSymbols DeclarePackage Decompose Decrement DedekindEta Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic Deinitialization Del Deletable Delete DeleteBorderComponents DeleteCases DeleteContents DeleteDirectory DeleteDuplicates DeleteFile DeleteSmallComponents DeleteWithContents DeletionWarning Delimiter DelimiterFlashTime DelimiterMatching Delimiters Denominator DensityGraphics DensityHistogram DensityPlot DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DescriptorStateSpace DesignMatrix Det DGaussianWavelet DiacriticalPositioning Diagonal DiagonalMatrix Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DifferenceDelta DifferenceOrder DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralGroup Dilation Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletCharacter DirichletConvolve DirichletDistribution DirichletL DirichletTransform DirichletWindow DisableConsolePrintPacket DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform Discriminant Disjunction Disk DiskBox DiskMatrix Dispatch DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentNotebook DominantColors DOSTextFormat Dot DotDashed DotEqual Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DSolve Dt DualLinearProgramming DualSystemsModel DumpGet DumpSave DuplicateFreeQ Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptions E EccentricityCentrality EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeCost EdgeCount EdgeCoverQ EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData Eliminate EliminationOrder EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EnableConsolePrintPacket Enabled Encode End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfFile EndOfLine EndOfString EndPackage EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entropy EntropyFilter Environment Epilog Equal EqualColumns EqualRows EqualTilde EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerE EulerGamma EulerianGraphQ EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluationCell EvaluationCompletionAction EvaluationElements EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpToTrig ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalCall ExternalDataCharacterEncoding Extract ExtractArchive ExtremeValueDistribution FaceForm FaceGrids FaceGridsStyle Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail FailureDistribution False FARIMAProcess FEDisableConsolePrintPacket FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket Fibonacci FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileDate FileExistsQ FileExtension FileFormat FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileType FilledCurve FilledCurveBox Filling FillingStyle FillingTransform FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindArgMax FindArgMin FindClique FindClusters FindCurvePath FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEulerianCycle FindFaces FindFile FindFit FindGeneratingFunction FindGeoLocation FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMaximum FindMaximumFlow FindMaxValue FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindPermutation FindPostmanTour FindProcessParameters FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindThreshold FindVertexCover FindVertexCut Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstPassageTimeDistribution FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FittedModel FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlatTopWindow FlipView Floor FlushPrintOutputPacket Fold FoldList Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrequencySamplingFilterKernel FresnelC FresnelS Friday FrobeniusNumber FrobeniusSolve FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullOptions FullSimplify Function FunctionExpand FunctionInterpolation FunctionSpace FussellVeselyImportance GaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins Gamma GammaDistribution GammaRegularized GapPenalty Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateConditions GeneratedCell GeneratedParameters GeneratingFunction Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDistance GeoGridPosition GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoPosition GeoPositionENU GeoPositionXYZ GeoProjectionData GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter Graph GraphAssortativity GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel GreatCircleDistance Greater GreaterEqual GreaterEqualLess GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterTilde Green Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain Gudermannian GumbelDistribution HaarWavelet HadamardMatrix HalfNormalDistribution HamiltonianGraphQ HammingDistance HammingWindow HankelH1 HankelH2 HankelMatrix HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash HashTable Haversine HazardFunction Head HeadCompose Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenSurface HighlightGraph HighlightImage HighpassFilter HigmanSimsGroupHS HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HitMissTransform HITSCentrality HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HotellingTSquareDistribution HoytDistribution HTMLSave Hue HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestData I Identity IdentityMatrix If IgnoreCase Im Image Image3D Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageAspectRatio ImageAssemble ImageCache ImageCacheValid ImageCapture ImageChannels ImageClip ImageColorSpace ImageCompose ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDataPacket ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDistance ImageEffect ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageForestingComponents ImageForwardTransformation ImageHistogram ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarkers ImageMeasurements ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImageQ ImageRangeCache ImageReflect ImageRegion ImageResize ImageResolution ImageRotate ImageRotated ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions Implies Import ImportAutoReplacements ImportString ImprovementImportance In IncidenceGraph IncidenceList IncidenceMatrix IncludeConstantBasis IncludeFileExtension IncludePods IncludeSingularTerm Increment Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentUnit IndependentVertexSetQ Indeterminate IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers Infinity Infix Information Inherited InheritScope Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InlineCounterAssignments InlineCounterIncrements InlineRules Inner Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionPointObject InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Install InstallService InString Integer IntegerDigits IntegerExponent IntegerLength IntegerPart IntegerPartitions IntegerQ Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction InterpretTemplate InterquartileRange Interrupt InterruptSettings Intersection Interval IntervalIntersection IntervalMemberQ IntervalUnion Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHaversine InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InversePermutation InverseRadon InverseSeries InverseSurvivalFunction InverseWaveletTransform InverseWeierstrassP InverseZTransform Invisible InvisibleApplication InvisibleTimes IrreduciblePolynomialQ IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcess JaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join Joined JoinedCurve JoinedCurveBox JoinForm JordanDecomposition JordanModelDecomposition K KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelMixtureDistribution KernelObject Kernels Ket Khinchin KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnightTourGraph KnotData KnownUnitQ KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter Label Labeled LabeledSlider LabelingFunction LabelStyle LaguerreL LambdaComponents LambertW LanczosWindow LandauDistribution Language LanguageCategory LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCM LeafCount LeapYearQ LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessFullEqual LessGreater LessLess LessSlantEqual LessTilde LetterCharacter LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox LinearFilter LinearFractionalTransform LinearModelFit LinearOffsetFunction LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBreak LinebreakAdjustments LineBreakChart LineBreakWithin LineColor LineForm LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRead LinkReadHeld LinkReadyQ Links LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot Listen ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalClusteringCoefficient LocalizeVariables LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestAscendingSequence LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow Loopback LoopFreeGraphQ LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LyapunovSolve LyonsGroupLy MachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules MangoldtLambda ManhattanDistance Manipulate Manipulator MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixPlot MatrixPower MatrixQ MatrixRank Max MaxBend MaxDetect MaxExtraBandwidths MaxExtraConditions MaxFeatures MaxFilter Maximize MaxIterations MaxMemoryUsed MaxMixtureKernels MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxValue MaxwellDistribution McLaughlinGroupMcL Mean MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter Median MedianDeviation MedianFilter Medium MeijerG MeixnerDistribution MemberQ MemoryConstrained MemoryInUse Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuPacket MenuSortingValue MenuStyle MenuView MergeDifferences Mesh MeshFunctions MeshRange MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation Method MethodOptions MexicanHatWavelet MeyerWavelet Min MinDetect MinFilter MinimalPolynomial MinimalStateSpaceModel Minimize Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingDataMethod MittagLefflerE MixedRadix MixedRadixQuantity MixtureDistribution Mod Modal Mode Modular ModularLambda Module Modulus MoebiusMu Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction Monday Monitor MonomialList MonomialOrder MonsterGroupM MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform Most MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovingAverage MovingMedian MoyalDistribution MultiedgeStyle MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistribution N NakagamiDistribution NameQ Names NamespaceBox Nand NArgMax NArgMin NBernoulliB NCache NDSolve NDSolveValue Nearest NearestFunction NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeMultinomialDistribution NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestList NestWhile NestWhileList NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextPrime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants None NonlinearModelFit NonlocalMeansFilter NonNegative NonPositive Nor NorlundB Norm Normal NormalDistribution NormalGrouping Normalize NormalizedSquaredEuclideanDistance NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde NotHumpDownHump NotHumpEqual NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms Null NullRecords NullSpace NullWords Number NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlot O ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OddQ Off Offset OLEData On ONanGroupON OneIdentity Opacity Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering Orderless OrnsteinUhlenbeckProcess Orthogonalize Out Outer OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OwenT OwnValues PackingMethod PaddedForm Padding PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageWidth PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParetoDistribution Part PartialCorrelationFunction PartialD ParticleData Partition PartitionsP PartitionsQ ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PerformanceGoal PeriodicInterpolation Periodogram PeriodogramArray PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PERTDistribution PetersenGraph PhaseMargins Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest Pink Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarGraphQ Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangePadding PlotRegion PlotStyle Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox PointBox PointFigureChart PointForm PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonBox PolygonBoxOptions PolygonHoleScale PolygonIntersections PolygonScale PolyhedronData PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position Positive PositiveDefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement PredictionRoot PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependTo PreserveImageOptions Previous PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitiveRoot PrincipalComponents PrincipalValue Print PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessEstimator ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptions QBinomial QFactorial QGamma QHypergeometricPFQ QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ Quantile QuantilePlot Quantity QuantityForm QuantityMagnitude QuantityQ QuantityUnit Quartics QuartileDeviation Quartiles QuartileSkewness QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainder RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Random RandomChoice RandomComplex RandomFunction RandomGraph RandomImage RandomInteger RandomPermutation RandomPrime RandomReal RandomSample RandomSeed RandomVariate RandomWalkProcess Range RangeFilter RangeSpecification RankedMax RankedMin Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios Raw RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadList ReadProtected Real RealBlockDiagonalForm RealDigits RealExponent Reals Reap Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate RegionBinarize RegionFunction RegionPlot RegionPlot3D RegularExpression Regularization Reinstall Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot Remove RemoveAlphaChannel RemoveAsynchronousTask Removed RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart Repeated RepeatedNull RepeatedString Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated Resampling Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask Residue Resolve Rest Resultant ResumePacket Return ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulerUnits Run RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilarity SameQ SameTest SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveDefinitions SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTaskActiveQ ScheduledTaskData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition Sec Sech SechDistribution SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemialgebraicComponentInstances SendMail Sequence SequenceAlignment SequenceForm SequenceHold SequenceLimit Series SeriesCoefficient SeriesData SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPrecision SetProperty SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share Sharpen ShearingMatrix ShearingTransform ShenCastanMatrix Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortUpArrow Show ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiegelTheta SiegelTukeyTest Sign Signature SignedRankTest SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution Skip SliceDistribution Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SocialMediaData Socket SokalSneathDissimilarity Solve SolveAlways SolveDelayed Sort SortBy Sound SoundAndGraphics SoundNote SoundVolume Sow Space SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution Speak SpeakTextPacket SpearmanRankTest SpearmanRho Spectrogram SpectrogramArray Specularity SpellingCorrection SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackInhibit StandardDeviation StandardDeviationFilter StandardForm Standardize StandbyDistribution Star StarGraph StartAsynchronousTask StartingStepSize StartOfLine StartOfString StartScheduledTask StartupSound StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringCount StringDrop StringExpression StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPosition StringQ StringReplace StringReplaceList StringReplacePart StringReverse StringRotateLeft StringRotateRight StringSkeleton StringSplit StringTake StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleBoxOptions StyleData StyleDefinitions StyleForm StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subset SubsetEqual Subsets SubStar Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde SuchThat Sum SumConvergence Sunday SuperDagger SuperMinus SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceColor SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SystemDialogInput SystemException SystemHelpPath SystemInformation SystemInformationData SystemOpen SystemOptions SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemStub Tab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeWhile Tally Tan Tanh TargetFunctions TargetUnits TautologyQ TelegraphProcess TemplateBox TemplateBoxOptions TemplateSlotSequence TemporalData Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCell TextClipboardType TextData TextForm TextJustification TextLine TextPacket TextParagraph TextRecognize TextRendering TextStyle Texture TextureCoordinateFunction TextureCoordinateScaling Therefore ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreeJSymbol Threshold Through Throw Thumbnail Thursday Ticks TicksStyle Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint Times TimesBy TimeSeriesForecast TimeSeriesInvertibility TimeUsed TimeValue TimeZone Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate ToDiscreteTimeModel ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform TopologicalSort ToRadicals ToRules ToString Total TotalHeight TotalVariationFilter TotalWidth TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField Translate TranslationTransform TransparentColor Transpose TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle TriangleWave TriangularDistribution Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean True TrueQ TruncatedDistribution TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow Tuples TuranGraph TuringMachine Transparent UnateQ Uncompress Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UndirectedEdge UndirectedGraph UndirectedGraphQ UndocumentedTestFEParserPacket UndocumentedTestGetSelectionPacket Unequal Unevaluated UniformDistribution UniformGraphDistribution UniformSumDistribution Uninstall Union UnionPlus Unique UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitTriangle UnitVector Unprotect UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpValues URL URLFetch URLFetchAsynchronous URLSave URLSaveAsynchronous UseGraphicsRange Using UsingFrontEnd V2Get ValidationLength Value ValueBox ValueBoxOptions ValueForm ValueQ ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerifyConvergence VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoigtDistribution VonMisesDistribution WaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeberE Wedge Wednesday WeibullDistribution WeierstrassHalfPeriods WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WilksW WilksWTest WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult Word WordBoundary WordCharacter WordData WordSearch WordSeparators WorkingPrecision Write WriteString Wronskian XMLElement XMLObject Xnor Xor Yellow YuleDissimilarity ZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZipfDistribution ZTest ZTransform $Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AssertFunction $Assumptions $AsynchronousTask $BaseDirectory $BatchInput $BatchOutput $BoxForms $ByteOrdering $Canceled $CharacterEncoding $CharacterEncodings $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $CreationDate $CurrentLink $DateStringFormat $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $Epilog $ExportFormats $Failed $FinancialDataSource $FormatType $FrontEnd $FrontEndSession $GeoLocation $HistoryLength $HomeDirectory $HTTPCookies $IgnoreEOF $ImagingDevices $ImportFormats $InitialDirectory $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $ModuleNumber $NetworkLicense $NewMessage $NewSymbol $Notebooks $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $PipeSupported $Post $Pre $PreferencesDirectory $PrePrint $PreRead $PrintForms $PrintLiteral $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $RandomState $RecursionLimit $ReleaseNumber $RootDirectory $ScheduledTask $ScriptCommandLine $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemWordLength $TemporaryDirectory $TemporaryPrefix $TextStyle $TimedOut $TimeUnit $TimeZone $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $Urgent $UserAddOnsDirectory $UserBaseDirectory $UserDocumentsDirectory $UserName $Version $VersionNumber",c:[{cN:"comment",b:/\(\*/,e:/\*\)/},a.ASM,a.QSM,a.CNM,{cN:"list",b:/\{/,e:/\}/,i:/:/}]}});hljs.registerLanguage("swift",function(a){var e={keyword:"class deinit enum extension func import init let protocol static struct subscript typealias var break case continue default do else fallthrough if in for return switch where while as dynamicType is new super self Self Type __COLUMN__ __FILE__ __FUNCTION__ __LINE__ associativity didSet get infix inout left mutating none nonmutating operator override postfix precedence prefix right set unowned unowned safe unsafe weak willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue assert bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal false filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced join lexicographicalCompare map max maxElement min minElement nil numericCast partition posix print println quickSort reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith strideof strideofValue swap swift toString transcode true underestimateCount unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafePointers withVaList"};var g={cN:"type",b:"\\b[A-Z][\\w']*",r:0};var b={cN:"comment",b:"/\\*",e:"\\*/",c:[a.PWM,"self"]};var c={cN:"subst",b:/\\\(/,e:"\\)",k:e,c:[]};var f={cN:"number",b:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",r:0};var d=a.inherit(a.QSM,{c:[c,a.BE]});c.c=[f];return{k:e,c:[d,a.CLCM,b,g,f,{cN:"func",bK:"func",e:"{",eE:true,c:[a.inherit(a.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/,i:/\(/}),{cN:"generics",b:/\/,i:/\>/},{cN:"params",b:/\(/,e:/\)/,k:e,c:["self",f,d,a.CBCM,{b:":"}],i:/["']/}],i:/\[|%/},{cN:"class",k:"struct protocol class extension enum",b:"(struct|protocol|class(?! (func|var))|extension|enum)",e:"\\{",eE:true,c:[a.inherit(a.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/})]},{cN:"preprocessor",b:"(@assignment|@class_protocol|@exported|@final|@lazy|@noreturn|@NSCopying|@NSManaged|@objc|@optional|@required|@auto_closure|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix)"},]}});hljs.registerLanguage("scheme",function(k){var m="[^\\(\\)\\[\\]\\{\\}\",'`;#|\\\\\\s]+";var d="(\\-|\\+)?\\d+([./]\\d+)?";var h=d+"[+\\-]"+d+"i";var e={built_in:"case-lambda call/cc class define-class exit-handler field import inherit init-field interface let*-values let-values let/ec mixin opt-lambda override protect provide public rename require require-for-syntax syntax syntax-case syntax-error unit/sig unless when with-syntax and begin call-with-current-continuation call-with-input-file call-with-output-file case cond define define-syntax delay do dynamic-wind else for-each if lambda let let* let-syntax letrec letrec-syntax map or syntax-rules ' * + , ,@ - ... / ; < <= = => > >= ` abs acos angle append apply asin assoc assq assv atan boolean? caar cadr call-with-input-file call-with-output-file call-with-values car cdddar cddddr cdr ceiling char->integer char-alphabetic? char-ci<=? char-ci=? char-ci>? char-downcase char-lower-case? char-numeric? char-ready? char-upcase char-upper-case? char-whitespace? char<=? char=? char>? char? close-input-port close-output-port complex? cons cos current-input-port current-output-port denominator display eof-object? eq? equal? eqv? eval even? exact->inexact exact? exp expt floor force gcd imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment lcm length list list->string list->vector list-ref list-tail list? load log magnitude make-polar make-rectangular make-string make-vector max member memq memv min modulo negative? newline not null-environment null? number->string number? numerator odd? open-input-file open-output-file output-port? pair? peek-char port? positive? procedure? quasiquote quote quotient rational? rationalize read read-char real-part real? remainder reverse round scheme-report-environment set! set-car! set-cdr! sin sqrt string string->list string->number string->symbol string-append string-ci<=? string-ci=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string=? string>? string? substring symbol->string symbol? tan transcript-off transcript-on truncate values vector vector->list vector-fill! vector-length vector-ref vector-set! with-input-from-file with-output-to-file write write-char zero?"};var n={cN:"shebang",b:"^#!",e:"$"};var f={cN:"literal",b:"(#t|#f|#\\\\"+m+"|#\\\\.)"};var g={cN:"number",v:[{b:d,r:0},{b:h,r:0},{b:"#b[0-1]+(/[0-1]+)?"},{b:"#o[0-7]+(/[0-7]+)?"},{b:"#x[0-9a-f]+(/[0-9a-f]+)?"}]};var j=k.QSM;var b={cN:"regexp",b:'#[pr]x"',e:'[^\\\\]"'};var o={cN:"comment",v:[{b:";",e:"$",r:0},{b:"#\\|",e:"\\|#"}]};var c={b:m,r:0};var a={cN:"variable",b:"'"+m};var i={eW:true,r:0};var l={cN:"list",v:[{b:"\\(",e:"\\)"},{b:"\\[",e:"\\]"}],c:[{cN:"keyword",b:m,l:m,k:e},i]};i.c=[f,g,j,o,c,a,l];return{i:/\S/,c:[n,g,j,o,a,l]}});hljs.registerLanguage("php",function(b){var e={cN:"variable",b:"(\\$|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"};var a={cN:"preprocessor",b:/<\?(php)?|\?>/};var c={cN:"string",c:[b.BE,a],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},b.inherit(b.ASM,{i:null}),b.inherit(b.QSM,{i:null})]};var d={v:[b.BNM,b.CNM]};return{aliases:["php3","php4","php5","php6"],cI:true,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[b.CLCM,b.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+"},a]},{cN:"comment",b:"__halt_compiler.+?;",eW:true,k:"__halt_compiler",l:b.UIR},{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[b.BE]},a,e,{cN:"function",bK:"function",e:/[;{]/,eE:true,i:"\\$|\\[|%",c:[b.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",e,b.CBCM,c,d]}]},{cN:"class",bK:"class interface",e:"{",eE:true,i:/[:\(\$"]/,c:[{bK:"extends implements"},b.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[b.UTM]},{bK:"use",e:";",c:[b.UTM]},{b:"=>"},c,d]}});hljs.registerLanguage("haskell",function(f){var g={cN:"comment",v:[{b:"--",e:"$"},{b:"{-",e:"-}",c:["self"]}]};var e={cN:"pragma",b:"{-#",e:"#-}"};var b={cN:"preprocessor",b:"^#",e:"$"};var d={cN:"type",b:"\\b[A-Z][\\w']*",r:0};var c={cN:"container",b:"\\(",e:"\\)",i:'"',c:[e,g,b,{cN:"type",b:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},f.inherit(f.TM,{b:"[_a-z][\\w']*"})]};var a={cN:"container",b:"{",e:"}",c:c.c};return{aliases:["hs"],k:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",c:[{cN:"module",b:"\\bmodule\\b",e:"where",k:"module where",c:[c,g],i:"\\W\\.|;"},{cN:"import",b:"\\bimport\\b",e:"$",k:"import|0 qualified as hiding",c:[c,g],i:"\\W\\.|;"},{cN:"class",b:"^(\\s*)?(class|instance)\\b",e:"where",k:"class family instance where",c:[d,c,g]},{cN:"typedef",b:"\\b(data|(new)?type)\\b",e:"$",k:"data family type newtype deriving",c:[e,g,d,c,a]},{cN:"default",bK:"default",e:"$",c:[d,c,g]},{cN:"infix",bK:"infix infixl infixr",e:"$",c:[f.CNM,g]},{cN:"foreign",b:"\\bforeign\\b",e:"$",k:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",c:[d,f.QSM,g]},{cN:"shebang",b:"#!\\/usr\\/bin\\/env runhaskell",e:"$"},e,g,b,f.QSM,f.CNM,d,f.inherit(f.TM,{b:"^[_a-z][\\w']*"}),{b:"->|<-"}]}});hljs.registerLanguage("1c",function(b){var f="[a-zA-Zа-яА-Я][a-zA-Z0-9_а-яА-Я]*";var c="возврат дата для если и или иначе иначеесли исключение конецесли конецпопытки конецпроцедуры конецфункции конеццикла константа не перейти перем перечисление по пока попытка прервать продолжить процедура строка тогда фс функция цикл число экспорт";var e="ansitooem oemtoansi ввестивидсубконто ввестидату ввестизначение ввестиперечисление ввестипериод ввестиплансчетов ввестистроку ввестичисло вопрос восстановитьзначение врег выбранныйплансчетов вызватьисключение датагод датамесяц датачисло добавитьмесяц завершитьработусистемы заголовоксистемы записьжурналарегистрации запуститьприложение зафиксироватьтранзакцию значениевстроку значениевстрокувнутр значениевфайл значениеизстроки значениеизстрокивнутр значениеизфайла имякомпьютера имяпользователя каталогвременныхфайлов каталогиб каталогпользователя каталогпрограммы кодсимв командасистемы конгода конецпериодаби конецрассчитанногопериодаби конецстандартногоинтервала конквартала конмесяца коннедели лев лог лог10 макс максимальноеколичествосубконто мин монопольныйрежим названиеинтерфейса названиенабораправ назначитьвид назначитьсчет найти найтипомеченныенаудаление найтиссылки началопериодаби началостандартногоинтервала начатьтранзакцию начгода начквартала начмесяца начнедели номерднягода номерднянедели номернеделигода нрег обработкаожидания окр описаниеошибки основнойжурналрасчетов основнойплансчетов основнойязык открытьформу открытьформумодально отменитьтранзакцию очиститьокносообщений периодстр полноеимяпользователя получитьвремята получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта получитьпустоезначение получитьта прав праводоступа предупреждение префиксавтонумерации пустаястрока пустоезначение рабочаядаттьпустоезначение рабочаядата разделительстраниц разделительстрок разм разобратьпозициюдокумента рассчитатьрегистрына рассчитатьрегистрыпо сигнал симв символтабуляции создатьобъект сокрл сокрлп сокрп сообщить состояние сохранитьзначение сред статусвозврата стрдлина стрзаменить стрколичествострок стрполучитьстроку стрчисловхождений сформироватьпозициюдокумента счетпокоду текущаядата текущеевремя типзначения типзначениястр удалитьобъекты установитьтана установитьтапо фиксшаблон формат цел шаблон";var a={cN:"dquote",b:'""'};var d={cN:"string",b:'"',e:'"|$',c:[a]};var g={cN:"string",b:"\\|",e:'"|$',c:[a]};return{cI:true,l:f,k:{keyword:c,built_in:e},c:[b.CLCM,b.NM,d,g,{cN:"function",b:"(процедура|функция)",e:"$",l:f,k:"процедура функция",c:[b.inherit(b.TM,{b:f}),{cN:"tail",eW:true,c:[{cN:"params",b:"\\(",e:"\\)",l:f,k:"знач",c:[d,g]},{cN:"export",b:"экспорт",eW:true,l:f,k:"экспорт",c:[b.CLCM]}]},b.CLCM]},{cN:"preprocessor",b:"#",e:"$"},{cN:"date",b:"'\\d{2}\\.\\d{2}\\.(\\d{2}|\\d{4})'"}]}});hljs.registerLanguage("x86asm",function(a){return{cI:true,l:"\\.?"+a.IR,k:{keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",literal:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l",pseudo:"db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times",preprocessor:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public ",built_in:"bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},c:[{cN:"comment",b:";",e:"$",r:0},{cN:"number",b:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",r:0},{cN:"number",b:"\\$[0-9][0-9A-Fa-f]*",r:0},{cN:"number",b:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[HhXx]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{cN:"number",b:"\\b(?:0[HhXx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"},a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",r:0},{cN:"string",b:"`",e:"[^\\\\]`",r:0},{cN:"string",b:"\\.[A-Za-z0-9]+",r:0},{cN:"label",b:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)",r:0},{cN:"label",b:"^\\s*%%[A-Za-z0-9_$#@~.?]*:",r:0},{cN:"argument",b:"%[0-9]+",r:0},{cN:"built_in",b:"%!S+",r:0}]}});hljs.registerLanguage("python",function(a){var f={cN:"prompt",b:/^(>>>|\.\.\.) /};var b={cN:"string",c:[a.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[f],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[f],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},a.ASM,a.QSM]};var d={cN:"number",r:0,v:[{b:a.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:a.CNR+"[lLjJ]?"}]};var e={cN:"params",b:/\(/,e:/\)/,c:["self",f,d,b]};var c={e:/:/,i:/[${=;\n]/,c:[a.UTM,e]};return{aliases:["py","gyp"],k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},i:/(<\/|->|\?)/,c:[f,d,b,a.HCM,a.inherit(c,{cN:"function",bK:"def",r:10}),a.inherit(c,{cN:"class",bK:"class"}),{cN:"decorator",b:/@/,e:/$/},{b:/\b(print|exec)\(/}]}});hljs.registerLanguage("smalltalk",function(a){var b="[a-z][a-zA-Z0-9_]*";var d={cN:"char",b:"\\$.{1}"};var c={cN:"symbol",b:"#"+a.UIR};return{aliases:["st"],k:"self super nil true false thisContext",c:[{cN:"comment",b:'"',e:'"'},a.ASM,{cN:"class",b:"\\b[A-Z][A-Za-z0-9_]*",r:0},{cN:"method",b:b+":",r:0},a.CNM,c,d,{cN:"localvars",b:"\\|[ ]*"+b+"([ ]+"+b+")*[ ]*\\|",rB:true,e:/\|/,i:/\S/,c:[{b:"(\\|[ ]*)?"+b}]},{cN:"array",b:"\\#\\(",e:"\\)",c:[a.ASM,d,a.CNM,c]}]}});hljs.registerLanguage("tex",function(a){var d={cN:"command",b:"\\\\[a-zA-Zа-яА-я]+[\\*]?"};var c={cN:"command",b:"\\\\[^a-zA-Zа-яА-я0-9]"};var b={cN:"special",b:"[{}\\[\\]\\&#~]",r:0};return{c:[{b:"\\\\[a-zA-Zа-яА-я]+[\\*]? *= *-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",rB:true,c:[d,c,{cN:"number",b:" *=",e:"-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",eB:true}],r:10},d,c,b,{cN:"formula",b:"\\$\\$",e:"\\$\\$",c:[d,c,b],r:0},{cN:"formula",b:"\\$",e:"\\$",c:[d,c,b],r:0},{cN:"comment",b:"%",e:"$",r:0}]}});hljs.registerLanguage("actionscript",function(a){var c="[a-zA-Z_$][a-zA-Z0-9_$]*";var b="([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)";var d={cN:"rest_arg",b:"[.]{3}",e:c,r:10};return{aliases:["as"],k:{keyword:"as break case catch class const continue default delete do dynamic each else extends final finally for function get if implements import in include instanceof interface internal is namespace native new override package private protected public return set static super switch this throw try typeof use var void while with",literal:"true false null undefined"},c:[a.ASM,a.QSM,a.CLCM,a.CBCM,a.CNM,{cN:"package",bK:"package",e:"{",c:[a.TM]},{cN:"class",bK:"class interface",e:"{",eE:true,c:[{bK:"extends implements"},a.TM]},{cN:"preprocessor",bK:"import include",e:";"},{cN:"function",bK:"function",e:"[{;]",eE:true,i:"\\S",c:[a.TM,{cN:"params",b:"\\(",e:"\\)",c:[a.ASM,a.QSM,a.CLCM,a.CBCM,d]},{cN:"type",b:":",e:b,r:10}]}]}});hljs.registerLanguage("sql",function(a){var b={cN:"comment",b:"--",e:"$"};return{cI:true,i:/[<>]/,c:[{cN:"operator",bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate savepoint release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup",e:/;/,eW:true,k:{keyword:"abs absolute acos action add adddate addtime aes_decrypt aes_encrypt after aggregate all allocate alter analyze and any are as asc ascii asin assertion at atan atan2 atn2 authorization authors avg backup before begin benchmark between bin binlog bit_and bit_count bit_length bit_or bit_xor both by cache call cascade cascaded case cast catalog ceil ceiling chain change changed char_length character_length charindex charset check checksum checksum_agg choose close coalesce coercibility collate collation collationproperty column columns columns_updated commit compress concat concat_ws concurrent connect connection connection_id consistent constraint constraints continue contributors conv convert convert_tz corresponding cos cot count count_big crc32 create cross cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime data database databases datalength date_add date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts datetimeoffsetfromparts day dayname dayofmonth dayofweek dayofyear deallocate declare decode default deferrable deferred degrees delayed delete des_decrypt des_encrypt des_key_file desc describe descriptor diagnostics difference disconnect distinct distinctrow div do domain double drop dumpfile each else elt enclosed encode encrypt end end-exec engine engines eomonth errors escape escaped event eventdata events except exception exec execute exists exp explain export_set extended external extract fast fetch field fields find_in_set first first_value floor flush for force foreign format found found_rows from from_base64 from_days from_unixtime full function get get_format get_lock getdate getutcdate global go goto grant grants greatest group group_concat grouping grouping_id gtid_subset gtid_subtract handler having help hex high_priority hosts hour ident_current ident_incr ident_seed identified identity if ifnull ignore iif ilike immediate in index indicator inet6_aton inet6_ntoa inet_aton inet_ntoa infile initially inner innodb input insert install instr intersect into is is_free_lock is_ipv4 is_ipv4_compat is_ipv4_mapped is_not is_not_null is_used_lock isdate isnull isolation join key kill language last last_day last_insert_id last_value lcase lead leading least leaves left len lenght level like limit lines ln load load_file local localtime localtimestamp locate lock log log10 log2 logfile logs low_priority lower lpad ltrim make_set makedate maketime master master_pos_wait match matched max md5 medium merge microsecond mid min minute mod mode module month monthname mutex name_const names national natural nchar next no no_write_to_binlog not now nullif nvarchar oct octet_length of old_password on only open optimize option optionally or ord order outer outfile output pad parse partial partition password patindex percent_rank percentile_cont percentile_disc period_add period_diff pi plugin position pow power pragma precision prepare preserve primary prior privileges procedure procedure_analyze processlist profile profiles public publishingservername purge quarter query quick quote quotename radians rand read references regexp relative relaylog release release_lock rename repair repeat replace replicate reset restore restrict return returns reverse revoke right rlike rollback rollup round row row_count rows rpad rtrim savepoint schema scroll sec_to_time second section select serializable server session session_user set sha sha1 sha2 share show sign sin size slave sleep smalldatetimefromparts snapshot some soname soundex sounds_like space sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sql_variant_property sqlstate sqrt square start starting status std stddev stddev_pop stddev_samp stdev stdevp stop str str_to_date straight_join strcmp string stuff subdate substr substring subtime subtring_index sum switchoffset sysdate sysdatetime sysdatetimeoffset system_user sysutcdatetime table tables tablespace tan temporary terminated tertiary_weights then time time_format time_to_sec timediff timefromparts timestamp timestampadd timestampdiff timezone_hour timezone_minute to to_base64 to_days to_seconds todatetimeoffset trailing transaction translation trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse ucase uncompress uncompressed_length unhex unicode uninstall union unique unix_timestamp unknown unlock update upgrade upped upper usage use user user_resources using utc_date utc_time utc_timestamp uuid uuid_short validate_password_strength value values var var_pop var_samp variables variance varp version view warnings week weekday weekofyear weight_string when whenever where with work write xml xor year yearweek zon",literal:"true false null",built_in:"array bigint binary bit blob boolean char character date dec decimal float int integer interval number numeric real serial smallint varchar varying int8 serial8 text"},c:[{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[a.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[a.BE]},a.CNM,a.CBCM,b]},a.CBCM,b]}});hljs.registerLanguage("nix",function(b){var a={keyword:"rec with let in inherit assert if else then",constant:"true false or and null",built_in:"import abort baseNameOf dirOf isNull builtins map removeAttrs throw toString derivation"};var g={cN:"subst",b:/\$\{/,e:/\}/,k:a};var d={cN:"variable",b:/[a-zA-Z0-9-_]+(\s*=)/};var e={cN:"string",b:"''",e:"''",c:[g]};var f={cN:"string",b:'"',e:'"',c:[g]};var c=[b.NM,b.HCM,b.CBCM,e,f,d];g.c=c;return{aliases:["nixos"],k:a,c:c}});hljs.registerLanguage("handlebars",function(b){var a="each in with if else unless bindattr action collection debugger log outlet template unbound view yield";return{aliases:["hbs","html.hbs","html.handlebars"],cI:true,sL:"xml",subLanguageMode:"continuous",c:[{cN:"expression",b:"{{",e:"}}",c:[{cN:"begin-block",b:"#[a-zA-Z- .]+",k:a},{cN:"string",b:'"',e:'"'},{cN:"end-block",b:"\\/[a-zA-Z- .]+",k:a},{cN:"variable",b:"[a-zA-Z-.]+",k:a}]}]}});hljs.registerLanguage("thrift",function(a){var b="bool byte i16 i32 i64 double string binary";return{k:{keyword:"namespace const typedef struct enum service exception void oneway set list map required optional",built_in:b,literal:"true false"},c:[a.QSM,a.NM,a.CLCM,a.CBCM,{cN:"class",bK:"struct enum service exception",e:/\{/,i:/\n/,c:[a.inherit(a.TM,{starts:{eW:true,eE:true}})]},{cN:"stl_container",b:"\\b(set|list|map)\\s*<",e:">",k:b,c:["self"]}]}});hljs.registerLanguage("vala",function(a){return{k:{keyword:"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var",built_in:"DBus GLib CCode Gee Object",literal:"false true null"},c:[{cN:"class",bK:"class interface delegate namespace",e:"{",eE:true,i:"[^,:\\n\\s\\.]",c:[a.UTM]},a.CLCM,a.CBCM,{cN:"string",b:'"""',e:'"""',r:5},a.ASM,a.QSM,a.CNM,{cN:"preprocessor",b:"^#",e:"$",r:2},{cN:"constant",b:" [A-Z_]+ ",r:0}]}});hljs.registerLanguage("gradle",function(a){return{cI:true,k:{keyword:"task project allprojects subprojects artifacts buildscript configurations dependencies repositories sourceSets description delete from into include exclude source classpath destinationDir includes options sourceCompatibility targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant def abstract break case catch continue default do else extends final finally for if implements instanceof native new private protected public return static switch synchronized throw throws transient try volatile while strictfp package import false null super this true antlrtask checkstyle codenarc copy boolean byte char class double float int interface long short void compile runTime file fileTree abs any append asList asWritable call collect compareTo count div dump each eachByte eachFile eachLine every find findAll flatten getAt getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter newReader newWriter next plus pop power previous print println push putAt read readBytes readLines reverse reverseEach round size sort splitEachLine step subMap times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader withStream withWriter withWriterAppend write writeLine"},c:[a.CLCM,a.CBCM,a.ASM,a.QSM,a.NM,a.RM]}});hljs.registerLanguage("ini",function(a){return{cI:true,i:/\S/,c:[{cN:"comment",b:";",e:"$"},{cN:"title",b:"^\\[",e:"\\]"},{cN:"setting",b:"^[a-z0-9\\[\\]_-]+[ \\t]*=[ \\t]*",e:"$",c:[{cN:"value",eW:true,k:"on off true false yes no",c:[a.QSM,a.NM],r:0}]}]}});hljs.registerLanguage("livecodeserver",function(a){var e={cN:"variable",b:"\\b[gtps][A-Z]+[A-Za-z0-9_\\-]*\\b|\\$_[A-Z]+",r:0};var b={cN:"comment",e:"$",v:[a.CBCM,a.HCM,{b:"--"},{b:"[^:]//"}]};var d=a.inherit(a.TM,{v:[{b:"\\b_*rig[A-Z]+[A-Za-z0-9_\\-]*"},{b:"\\b_[a-z0-9\\-]+"}]});var c=a.inherit(a.TM,{b:"\\b([A-Za-z0-9_\\-]+)\\b"});return{cI:false,k:{keyword:"after byte bytes english the until http forever descending using line real8 with seventh for stdout finally element word fourth before black ninth sixth characters chars stderr uInt1 uInt1s uInt2 uInt2s stdin string lines relative rel any fifth items from middle mid at else of catch then third it file milliseconds seconds second secs sec int1 int1s int4 int4s internet int2 int2s normal text item last long detailed effective uInt4 uInt4s repeat end repeat URL in try into switch to words https token binfile each tenth as ticks tick system real4 by dateItems without char character ascending eighth whole dateTime numeric short first ftp integer abbreviated abbr abbrev private case while if",constant:"SIX TEN FORMFEED NINE ZERO NONE SPACE FOUR FALSE COLON CRLF PI COMMA ENDOFFILE EOF EIGHT FIVE QUOTE EMPTY ONE TRUE RETURN CR LINEFEED RIGHT BACKSLASH NULL SEVEN TAB THREE TWO six ten formfeed nine zero none space four false colon crlf pi comma endoffile eof eight five quote empty one true return cr linefeed right backslash null seven tab three two RIVERSION RISTATE FILE_READ_MODE FILE_WRITE_MODE FILE_WRITE_MODE DIR_WRITE_MODE FILE_READ_UMASK FILE_WRITE_UMASK DIR_READ_UMASK DIR_WRITE_UMASK",operator:"div mod wrap and or bitAnd bitNot bitOr bitXor among not in a an within contains ends with begins the keys of keys",built_in:"put abs acos aliasReference annuity arrayDecode arrayEncode asin atan atan2 average avg base64Decode base64Encode baseConvert binaryDecode binaryEncode byteToNum cachedURL cachedURLs charToNum cipherNames commandNames compound compress constantNames cos date dateFormat decompress directories diskSpace DNSServers exp exp1 exp2 exp10 extents files flushEvents folders format functionNames global globals hasMemory hostAddress hostAddressToName hostName hostNameToAddress isNumber ISOToMac itemOffset keys len length libURLErrorData libUrlFormData libURLftpCommand libURLLastHTTPHeaders libURLLastRHHeaders libUrlMultipartFormAddPart libUrlMultipartFormData libURLVersion lineOffset ln ln1 localNames log log2 log10 longFilePath lower macToISO matchChunk matchText matrixMultiply max md5Digest median merge millisec millisecs millisecond milliseconds min monthNames num number numToByte numToChar offset open openfiles openProcesses openProcessIDs openSockets paramCount param params peerAddress pendingMessages platform processID random randomBytes replaceText result revCreateXMLTree revCreateXMLTreeFromFile revCurrentRecord revCurrentRecordIsFirst revCurrentRecordIsLast revDatabaseColumnCount revDatabaseColumnIsNull revDatabaseColumnLengths revDatabaseColumnNames revDatabaseColumnNamed revDatabaseColumnNumbered revDatabaseColumnTypes revDatabaseConnectResult revDatabaseCursors revDatabaseID revDatabaseTableNames revDatabaseType revDataFromQuery revdb_closeCursor revdb_columnbynumber revdb_columncount revdb_columnisnull revdb_columnlengths revdb_columnnames revdb_columntypes revdb_commit revdb_connect revdb_connections revdb_connectionerr revdb_currentrecord revdb_cursorconnection revdb_cursorerr revdb_cursors revdb_dbtype revdb_disconnect revdb_execute revdb_iseof revdb_isbof revdb_movefirst revdb_movelast revdb_movenext revdb_moveprev revdb_query revdb_querylist revdb_recordcount revdb_rollback revdb_tablenames revGetDatabaseDriverPath revNumberOfRecords revOpenDatabase revOpenDatabases revQueryDatabase revQueryDatabaseBlob revQueryResult revQueryIsAtStart revQueryIsAtEnd revUnixFromMacPath revXMLAttribute revXMLAttributes revXMLAttributeValues revXMLChildContents revXMLChildNames revXMLFirstChild revXMLMatchingNode revXMLNextSibling revXMLNodeContents revXMLNumberOfChildren revXMLParent revXMLPreviousSibling revXMLRootNode revXMLRPC_CreateRequest revXMLRPC_Documents revXMLRPC_Error revXMLRPC_Execute revXMLRPC_GetHost revXMLRPC_GetMethod revXMLRPC_GetParam revXMLText revXMLRPC_GetParamCount revXMLRPC_GetParamNode revXMLRPC_GetParamType revXMLRPC_GetPath revXMLRPC_GetPort revXMLRPC_GetProtocol revXMLRPC_GetRequest revXMLRPC_GetResponse revXMLRPC_GetSocket revXMLTree revXMLTrees revXMLValidateDTD revZipDescribeItem revZipEnumerateItems revZipOpenArchives round sec secs seconds sha1Digest shell shortFilePath sin specialFolderPath sqrt standardDeviation statRound stdDev sum sysError systemVersion tan tempName tick ticks time to toLower toUpper transpose trunc uniDecode uniEncode upper URLDecode URLEncode URLStatus value variableNames version waitDepth weekdayNames wordOffset add breakpoint cancel clear local variable file word line folder directory URL close socket process combine constant convert create new alias folder directory decrypt delete variable word line folder directory URL dispatch divide do encrypt filter get include intersect kill libURLDownloadToFile libURLFollowHttpRedirects libURLftpUpload libURLftpUploadFile libURLresetAll libUrlSetAuthCallback libURLSetCustomHTTPHeaders libUrlSetExpect100 libURLSetFTPListCommand libURLSetFTPMode libURLSetFTPStopTime libURLSetStatusCallback load multiply socket process post seek rel relative read from process rename replace require resetAll revAddXMLNode revAppendXML revCloseCursor revCloseDatabase revCommitDatabase revCopyFile revCopyFolder revCopyXMLNode revDeleteFolder revDeleteXMLNode revDeleteAllXMLTrees revDeleteXMLTree revExecuteSQL revGoURL revInsertXMLNode revMoveFolder revMoveToFirstRecord revMoveToLastRecord revMoveToNextRecord revMoveToPreviousRecord revMoveToRecord revMoveXMLNode revPutIntoXMLNode revRollBackDatabase revSetDatabaseDriverPath revSetXMLAttribute revXMLRPC_AddParam revXMLRPC_DeleteAllDocuments revXMLAddDTD revXMLRPC_Free revXMLRPC_FreeAll revXMLRPC_DeleteDocument revXMLRPC_DeleteParam revXMLRPC_SetHost revXMLRPC_SetMethod revXMLRPC_SetPort revXMLRPC_SetProtocol revXMLRPC_SetSocket revZipAddItemWithData revZipAddItemWithFile revZipAddUncompressedItemWithData revZipAddUncompressedItemWithFile revZipCancel revZipCloseArchive revZipDeleteItem revZipExtractItemToFile revZipExtractItemToVariable revZipSetProgressCallback revZipRenameItem revZipReplaceItemWithData revZipReplaceItemWithFile revZipOpenArchive send set sort split subtract union unload wait write"},c:[e,{cN:"keyword",b:"\\bend\\sif\\b"},{cN:"function",bK:"function",e:"$",c:[e,c,a.ASM,a.QSM,a.BNM,a.CNM,d]},{cN:"function",bK:"end",e:"$",c:[c,d]},{cN:"command",bK:"command on",e:"$",c:[e,c,a.ASM,a.QSM,a.BNM,a.CNM,d]},{cN:"command",bK:"end",e:"$",c:[c,d]},{cN:"preprocessor",b:"<\\?rev|<\\?lc|<\\?livecode",r:10},{cN:"preprocessor",b:"<\\?"},{cN:"preprocessor",b:"\\?>"},b,a.ASM,a.QSM,a.BNM,a.CNM,d],i:";$|^\\[|^="}});hljs.registerLanguage("d",function(x){var b={keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"};var c="(0|[1-9][\\d_]*)",q="(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)",h="0[bB][01_]+",v="([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)",y="0[xX]"+v,p="([eE][+-]?"+q+")",o="("+q+"(\\.\\d*|"+p+")|\\d+\\."+q+q+"|\\."+c+p+"?)",k="(0[xX]("+v+"\\."+v+"|\\.?"+v+")[pP][+-]?"+q+")",l="("+c+"|"+h+"|"+y+")",n="("+k+"|"+o+")";var z="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};";var m={cN:"number",b:"\\b"+l+"(L|u|U|Lu|LU|uL|UL)?",r:0};var j={cN:"number",b:"\\b("+n+"([fF]|L|i|[fF]i|Li)?|"+l+"(i|[fF]i|Li))",r:0};var s={cN:"string",b:"'("+z+"|.)",e:"'",i:"."};var r={b:z,r:0};var w={cN:"string",b:'"',c:[r],e:'"[cwd]?'};var f={cN:"string",b:'[rq]"',e:'"[cwd]?',r:5};var u={cN:"string",b:"`",e:"`[cwd]?"};var i={cN:"string",b:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',r:10};var t={cN:"string",b:'q"\\{',e:'\\}"'};var e={cN:"shebang",b:"^#!",e:"$",r:5};var g={cN:"preprocessor",b:"#(line)",e:"$",r:5};var d={cN:"keyword",b:"@[a-zA-Z_][a-zA-Z_\\d]*"};var a={cN:"comment",b:"\\/\\+",c:["self"],e:"\\+\\/",r:10};return{l:x.UIR,k:b,c:[x.CLCM,x.CBCM,a,i,w,f,u,t,j,m,s,e,g,d]}});hljs.registerLanguage("vbnet",function(a){return{aliases:["vb"],cI:true,k:{keyword:"addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass namespace narrowing new next not notinheritable notoverridable of off on operator option optional or order orelse overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim rem removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly xor",built_in:"boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype date decimal directcast double gettype getxmlnamespace iif integer long object sbyte short single string trycast typeof uinteger ulong ushort",literal:"true false nothing"},i:"//|{|}|endif|gosub|variant|wend",c:[a.inherit(a.QSM,{c:[{b:'""'}]}),{cN:"comment",b:"'",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"'''|"},{cN:"xmlDocTag",b:""}]},a.CNM,{cN:"preprocessor",b:"#",e:"$",k:"if else elseif end region externalsource"}]}});hljs.registerLanguage("axapta",function(a){return{k:"false int abstract private char boolean static null if for true while long throw finally protected final return void enum else break new catch byte super case short default double public try this switch continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count order group by asc desc index hint like dispaly edit client server ttsbegin ttscommit str real date container anytype common div mod",c:[a.CLCM,a.CBCM,a.ASM,a.QSM,a.CNM,{cN:"preprocessor",b:"#",e:"$"},{cN:"class",bK:"class interface",e:"{",eE:true,i:":",c:[{bK:"extends implements"},a.UTM]}]}});hljs.registerLanguage("groovy",function(a){return{k:{typename:"byte short char int long boolean float double void",literal:"true false null",keyword:"def as in assert trait super this abstract static volatile transient public private protected synchronized final class interface enum if else for while switch case break default continue throw throws try catch finally implements extends new import package return instanceof"},c:[a.CLCM,{cN:"javadoc",b:"/\\*\\*",e:"\\*//*",c:[{cN:"javadoctag",b:"@[A-Za-z]+"}]},a.CBCM,{cN:"string",b:'"""',e:'"""'},{cN:"string",b:"'''",e:"'''"},{cN:"string",b:"\\$/",e:"/\\$",r:10},a.ASM,{cN:"regexp",b:/~?\/[^\/\n]+\//,c:[a.BE]},a.QSM,{cN:"shebang",b:"^#!/usr/bin/env",e:"$",i:"\n"},a.BNM,{cN:"class",bK:"class interface trait enum",e:"{",i:":",c:[{bK:"extends implements"},a.UTM,]},a.CNM,{cN:"annotation",b:"@[A-Za-z]+"},{cN:"string",b:/[^\?]{0}[A-Za-z0-9_$]+ *:/},{b:/\?/,e:/\:/},{cN:"label",b:"^\\s*[A-Za-z0-9_$]+:"},]}});hljs.registerLanguage("perl",function(c){var d="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when";var f={cN:"subst",b:"[$@]\\{",e:"\\}",k:d};var g={b:"->{",e:"}"};var a={cN:"variable",v:[{b:/\$\d/},{b:/[\$\%\@](\^\w\b|#\w+(\:\:\w+)*|{\w+}|\w+(\:\:\w*)*)/},{b:/[\$\%\@][^\s\w{]/,r:0}]};var e={cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5};var h=[c.BE,f,a];var b=[a,c.HCM,e,{cN:"comment",b:"^\\=\\w",e:"\\=cut",eW:true},g,{cN:"string",c:h,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[c.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[c.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+c.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[c.HCM,e,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[c.BE],r:0}]},{cN:"sub",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",r:5},{cN:"operator",b:"-\\w\\b",r:0}];f.c=b;g.c=b;return{aliases:["pl"],k:d,c:b}});hljs.registerLanguage("scala",function(d){var b={cN:"annotation",b:"@[A-Za-z]+"};var c={cN:"string",b:'u?r?"""',e:'"""',r:10};var a={cN:"symbol",b:"'\\w[\\w\\d_]*(?!')"};var e={cN:"type",b:"\\b[A-Z][A-Za-z0-9_]*",r:0};var h={cN:"title",b:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,r:0};var i={cN:"class",bK:"class object trait type",e:/[:={\[(\n;]/,c:[{cN:"keyword",bK:"extends with",r:10},h]};var g={cN:"function",bK:"def val",e:/[:={\[(\n;]/,c:[h]};var f={cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"@[A-Za-z]+"}],r:10};return{k:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},c:[d.CLCM,d.CBCM,c,d.QSM,a,e,g,i,d.CNM,b]}});hljs.registerLanguage("cmake",function(a){return{aliases:["cmake.in"],cI:true,k:{keyword:"add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory break build_command cmake_minimum_required cmake_policy configure_file create_test_sourcelist define_property else elseif enable_language enable_testing endforeach endfunction endif endmacro endwhile execute_process export find_file find_library find_package find_path find_program fltk_wrap_ui foreach function get_cmake_property get_directory_property get_filename_component get_property get_source_file_property get_target_property get_test_property if include include_directories include_external_msproject include_regular_expression install link_directories load_cache load_command macro mark_as_advanced message option output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return separate_arguments set set_directory_properties set_property set_source_files_properties set_target_properties set_tests_properties site_name source_group string target_link_libraries try_compile try_run unset variable_watch while build_name exec_program export_library_dependencies install_files install_programs install_targets link_libraries make_directory remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or",operator:"equal less greater strless strgreater strequal matches"},c:[{cN:"envvar",b:"\\${",e:"}"},a.HCM,a.QSM,a.NM]}});hljs.registerLanguage("ocaml",function(a){return{aliases:["ml"],k:{keyword:"and as assert asr begin class constraint do done downto else end exception external false for fun function functor if in include inherit initializer land lazy let lor lsl lsr lxor match method mod module mutable new object of open or private rec ref sig struct then to true try type val virtual when while with parser value",built_in:"bool char float int list unit array exn option int32 int64 nativeint format4 format6 lazy_t in_channel out_channel string"},i:/\/\//,c:[{cN:"string",b:'"""',e:'"""'},{cN:"comment",b:"\\(\\*",e:"\\*\\)",c:["self"]},{cN:"class",bK:"type",e:"\\(|=|$",eE:true,c:[a.UTM]},{cN:"annotation",b:"\\[<",e:">\\]"},a.CBCM,a.inherit(a.ASM,{i:null}),a.inherit(a.QSM,{i:null}),a.CNM]}});hljs.registerLanguage("autohotkey",function(b){var d={cN:"escape",b:"`[\\s\\S]"};var c={cN:"comment",b:";",e:"$",r:0};var a=[{cN:"built_in",b:"A_[a-zA-Z0-9]+"},{cN:"built_in",bK:"ComSpec Clipboard ClipboardAll ErrorLevel"}];return{cI:true,k:{keyword:"Break Continue Else Gosub If Loop Return While",literal:"A true false NOT AND OR"},c:a.concat([d,b.inherit(b.QSM,{c:[d]}),c,{cN:"number",b:b.NR,r:0},{cN:"var_expand",b:"%",e:"%",i:"\\n",c:[d]},{cN:"label",c:[d],v:[{b:'^[^\\n";]+::(?!=)'},{b:'^[^\\n";]+:(?!=)',r:0}]},{b:",\\s*,",r:10}])}});hljs.registerLanguage("objectivec",function(a){var d={keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"NSString NSData NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView NSView NSViewController NSWindow NSWindowController NSSet NSUUID NSIndexSet UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController UINavigationBar UINavigationController UITabBarController UIPopoverController UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor UIFont UIApplication NSNotFound NSNotificationCenter NSNotification UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection NSURLSession NSURLSessionDataTask NSURLSessionDownloadTask NSURLSessionUploadTask NSURLResponseUIInterfaceOrientation MPMoviePlayerController dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"};var c=/[a-zA-Z@][a-zA-Z0-9_]*/;var b="@interface @class @protocol @implementation";return{aliases:["m","mm","objc","obj-c"],k:d,l:c,i:""}]}]},{cN:"class",b:"("+b.split(" ").join("|")+")\\b",e:"({|$)",eE:true,k:b,l:c,c:[a.UTM]},{cN:"variable",b:"\\."+a.UIR,r:0}]}});hljs.registerLanguage("avrasm",function(a){return{cI:true,l:"\\.?"+a.IR,k:{keyword:"adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub subi swap tst wdr",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf",preprocessor:".byte .cseg .db .def .device .dseg .dw .endmacro .equ .eseg .exit .include .list .listmac .macro .nolist .org .set"},c:[a.CBCM,{cN:"comment",b:";",e:"$",r:0},a.CNM,a.BNM,{cN:"number",b:"\\b(\\$[a-zA-Z0-9]+|0o[0-7]+)"},a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"label",b:"^[A-Za-z0-9_.$]+:"},{cN:"preprocessor",b:"#",e:"$"},{cN:"localvars",b:"@[0-9]+"}]}});hljs.registerLanguage("vhdl",function(a){return{cI:true,k:{keyword:"abs access after alias all and architecture array assert attribute begin block body buffer bus case component configuration constant context cover disconnect downto default else elsif end entity exit fairness file for force function generate generic group guarded if impure in inertial inout is label library linkage literal loop map mod nand new next nor not null of on open or others out package port postponed procedure process property protected pure range record register reject release rem report restrict restrict_guarantee return rol ror select sequence severity shared signal sla sll sra srl strong subtype then to transport type unaffected units until use variable vmode vprop vunit wait when while with xnor xor",typename:"boolean bit character severity_level integer time delay_length natural positive string bit_vector file_open_kind file_open_status std_ulogic std_ulogic_vector std_logic std_logic_vector unsigned signed boolean_vector integer_vector real_vector time_vector"},i:"{",c:[a.CBCM,{cN:"comment",b:"--",e:"$"},a.QSM,a.CNM,{cN:"literal",b:"'(U|X|0|1|Z|W|L|H|-)'",c:[a.BE]},{cN:"attribute",b:"'[A-Za-z](_?[A-Za-z0-9])*",c:[a.BE]}]}});hljs.registerLanguage("coffeescript",function(c){var b={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",reserved:"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf",built_in:"npm require console print module global window document"};var a="[A-Za-z$_][0-9A-Za-z$_]*";var f=c.inherit(c.TM,{b:a});var e={cN:"subst",b:/#\{/,e:/}/,k:b};var d=[c.BNM,c.inherit(c.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[c.BE]},{b:/'/,e:/'/,c:[c.BE]},{b:/"""/,e:/"""/,c:[c.BE,e]},{b:/"/,e:/"/,c:[c.BE,e]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[e,c.HCM]},{b:"//[gim]*",r:0},{b:/\/(?![ *])(\\\/|.)*?\/[gim]*(?=\W|$)/}]},{cN:"property",b:"@"+a},{b:"`",e:"`",eB:true,eE:true,sL:"javascript"}];e.c=d;return{aliases:["coffee","cson","iced"],k:b,i:/\/\*/,c:d.concat([{cN:"comment",b:"###",e:"###"},c.HCM,{cN:"function",b:"(^\\s*|\\B)("+a+"\\s*=\\s*)?(\\(.*\\))?\\s*\\B[-=]>",e:"[-=]>",rB:true,c:[f,{cN:"params",b:"\\([^\\(]",rB:true,c:[{b:/\(/,e:/\)/,k:b,c:["self"].concat(d)}]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:true,i:/[:="\[\]]/,c:[f]},f]},{cN:"attribute",b:a+":",e:":",rB:true,eE:true,r:0}])}});hljs.registerLanguage("mizar",function(a){return{k:["environ vocabularies notations constructors definitions registrations theorems schemes requirements","begin end definition registration cluster existence pred func defpred deffunc theorem proof","let take assume then thus hence ex for st holds consider reconsider such that and in provided of as from","be being by means equals implies iff redefine define now not or attr is mode suppose per cases set","thesis contradiction scheme reserve struct","correctness compatibility coherence symmetry assymetry reflexivity irreflexivity","connectedness uniqueness commutativity idempotence involutiveness projectivity"].join(" "),c:[{cN:"comment",b:"::",e:"$"}]}});hljs.registerLanguage("nginx",function(c){var b={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+c.UIR}]};var a={eW:true,l:"[a-z/_]+",k:{built_in:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[c.HCM,{cN:"string",c:[c.BE,b],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{cN:"url",b:"([a-z]+):/",e:"\\s",eW:true,eE:true,c:[b]},{cN:"regexp",c:[c.BE,b],v:[{b:"\\s\\^",e:"\\s|{|;",rE:true},{b:"~\\*?\\s+",e:"\\s|{|;",rE:true},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},b]};return{aliases:["nginxconf"],c:[c.HCM,{b:c.UIR+"\\s",e:";|{",rB:true,c:[{cN:"title",b:c.UIR,starts:a}],r:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("erlang-repl",function(a){return{k:{special_functions:"spawn spawn_link self",reserved:"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor"},c:[{cN:"prompt",b:"^[0-9]+> ",r:10},{cN:"comment",b:"%",e:"$"},{cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},a.ASM,a.QSM,{cN:"constant",b:"\\?(::)?([A-Z]\\w*(::)?)+"},{cN:"arrow",b:"->"},{cN:"ok",b:"ok"},{cN:"exclamation_mark",b:"!"},{cN:"function_or_atom",b:"(\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\b[a-z'][a-zA-Z0-9_']*)",r:0},{cN:"variable",b:"[A-Z][a-zA-Z0-9_']*",r:0}]}});hljs.registerLanguage("r",function(a){var b="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{c:[a.HCM,{b:b,l:b,k:{keyword:"function if in break next repeat else for return switch while try tryCatch|10 stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...|10",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},r:0},{cN:"number",b:"0[xX][0-9a-fA-F]+[Li]?\\b",r:0},{cN:"number",b:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",r:0},{cN:"number",b:"\\d+\\.(?!\\d)(?:i\\b)?",r:0},{cN:"number",b:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{b:"`",e:"`",r:0},{cN:"string",c:[a.BE],v:[{b:'"',e:'"'},{b:"'",e:"'"}]}]}});hljs.registerLanguage("json",function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{c:d,k:e,i:"\\S"}});hljs.registerLanguage("django",function(a){var b={cN:"filter",b:/\|[A-Za-z]+\:?/,k:"truncatewords removetags linebreaksbr yesno get_digit timesince random striptags filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort dictsortreversed default_if_none pluralize lower join center default truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize localtime utc timezone",c:[{cN:"argument",b:/"/,e:/"/},{cN:"argument",b:/'/,e:/'/}]};return{aliases:["jinja"],cI:true,sL:"xml",subLanguageMode:"continuous",c:[{cN:"template_comment",b:/\{%\s*comment\s*%}/,e:/\{%\s*endcomment\s*%}/},{cN:"template_comment",b:/\{#/,e:/#}/},{cN:"template_tag",b:/\{%/,e:/%}/,k:"comment endcomment load templatetag ifchanged endifchanged if endif firstof for endfor in ifnotequal endifnotequal widthratio extends include spaceless endspaceless regroup by as ifequal endifequal ssi now with cycle url filter endfilter debug block endblock else autoescape endautoescape csrf_token empty elif endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix plural get_current_language language get_available_languages get_current_language_bidi get_language_info get_language_info_list localize endlocalize localtime endlocaltime timezone endtimezone get_current_timezone verbatim",c:[b]},{cN:"variable",b:/\{\{/,e:/}}/,c:[b]}]}});hljs.registerLanguage("delphi",function(b){var a="exports register file shl array record property for mod while set ally label uses raise not stored class safecall var interface or private static exit index inherited to else stdcall override shr asm far resourcestring finalization packed virtual out and protected library do xorwrite goto near function end div overload object unit begin string on inline repeat until destructor write message program with read initialization except default nil if case cdecl in downto threadvar of try pascal const external constructor type public then implementation finally published procedure";var e={cN:"comment",v:[{b:/\{/,e:/\}/,r:0},{b:/\(\*/,e:/\*\)/,r:10}]};var c={cN:"string",b:/'/,e:/'/,c:[{b:/''/}]};var d={cN:"string",b:/(#\d+)+/};var f={b:b.IR+"\\s*=\\s*class\\s*\\(",rB:true,c:[b.TM]};var g={cN:"function",bK:"function constructor destructor procedure",e:/[:;]/,k:"function constructor|10 destructor|10 procedure|10",c:[b.TM,{cN:"params",b:/\(/,e:/\)/,k:a,c:[c,d]},e]};return{cI:true,k:a,i:/("|\$[G-Zg-z]|\/\*|<\/)/,c:[e,b.CLCM,c,d,b.NM,f,g]}});hljs.registerLanguage("vbscript",function(a){return{aliases:["vbs"],cI:true,k:{keyword:"call class const dim do loop erase execute executeglobal exit for each next function if then else on error option explicit new private property let get public randomize redim rem select case set stop sub while wend with end to elseif is or xor and not class_initialize class_terminate default preserve in me byval byref step resume goto",built_in:"lcase month vartype instrrev ubound setlocale getobject rgb getref string weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency conversions csng timevalue second year space abs clng timeserial fixs len asc isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion scriptengine split scriptengineminorversion cint sin datepart ltrim sqr scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw chrw regexp server response request cstr err",literal:"true false null nothing empty"},i:"//",c:[a.inherit(a.QSM,{c:[{b:'""'}]}),{cN:"comment",b:/'/,e:/$/,r:0},a.CNM]}});hljs.registerLanguage("oxygene",function(b){var g="abstract add and array as asc aspect assembly async begin break block by case class concat const copy constructor continue create default delegate desc distinct div do downto dynamic each else empty end ensure enum equals event except exit extension external false final finalize finalizer finally flags for forward from function future global group has if implementation implements implies in index inherited inline interface into invariants is iterator join locked locking loop matching method mod module namespace nested new nil not notify nullable of old on operator or order out override parallel params partial pinned private procedure property protected public queryable raise read readonly record reintroduce remove repeat require result reverse sealed select self sequence set shl shr skip static step soft take then to true try tuple type union unit unsafe until uses using var virtual raises volatile where while with write xor yield await mapped deprecated stdcall cdecl pascal register safecall overload library platform reference packed strict published autoreleasepool selector strong weak unretained";var a={cN:"comment",b:"{",e:"}",r:0};var e={cN:"comment",b:"\\(\\*",e:"\\*\\)",r:10};var c={cN:"string",b:"'",e:"'",c:[{b:"''"}]};var d={cN:"string",b:"(#\\d+)+"};var f={cN:"function",bK:"function constructor destructor procedure method",e:"[:;]",k:"function constructor|10 destructor|10 procedure|10 method|10",c:[b.TM,{cN:"params",b:"\\(",e:"\\)",k:g,c:[c,d]},a,e]};return{cI:true,k:g,i:'("|\\$[G-Zg-z]|\\/\\*|"},{cN:"keyword",b:/\w+/,r:0,k:{common:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"sqbracket",b:"\\s\\[",e:"\\]$"},{cN:"cbracket",b:"[\\$%]\\{",e:"\\}",c:["self",b]},b,a.QSM]}}],i:/\S/}});hljs.registerLanguage("scss",function(a){var c="[a-zA-Z-][a-zA-Z0-9_-]*";var f={cN:"variable",b:"(\\$"+c+")\\b"};var d={cN:"function",b:c+"\\(",rB:true,eE:true,e:"\\("};var b={cN:"hexcolor",b:"#[0-9A-Fa-f]+"};var e={cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[d,b,a.CSSNM,a.QSM,a.ASM,a.CBCM,{cN:"important",b:"!important"}]}};return{cI:true,i:"[=/|']",c:[a.CLCM,a.CBCM,d,{cN:"id",b:"\\#[A-Za-z0-9_-]+",r:0},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"tag",b:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",r:0},{cN:"pseudo",b:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{cN:"pseudo",b:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},f,{cN:"attribute",b:"\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",i:"[^\\s]"},{cN:"value",b:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{cN:"value",b:":",e:";",c:[d,f,b,a.CSSNM,a.QSM,a.ASM,{cN:"important",b:"!important"}]},{cN:"at_rule",b:"@",e:"[{;]",k:"mixin include extend for if else each while charset import debug media page content font-face namespace warn",c:[d,f,a.QSM,a.ASM,b,a.CSSNM,{cN:"preprocessor",b:"\\s[A-Za-z0-9_.-]+",r:0}]}]}});hljs.registerLanguage("monkey",function(a){var b={v:[{cN:"number",b:"[$][a-fA-F0-9]+"},a.NM]};return{cI:true,k:{keyword:"public private property continue exit extern new try catch eachin not abstract final select case default const local global field end if then else elseif endif while wend repeat until forever for to step next return module inline throw",built_in:"DebugLog DebugStop Error Print ACos ACosr ASin ASinr ATan ATan2 ATan2r ATanr Abs Abs Ceil Clamp Clamp Cos Cosr Exp Floor Log Max Max Min Min Pow Sgn Sgn Sin Sinr Sqrt Tan Tanr Seed PI HALFPI TWOPI",literal:"true false null and or shl shr mod"},c:[{cN:"comment",b:"#rem",e:"#end"},{cN:"comment",b:"'",e:"$",r:0},{cN:"function",bK:"function method",e:"[(=:]|$",i:/\n/,c:[a.UTM,]},{cN:"class",bK:"class interface",e:"$",c:[{bK:"extends implements"},a.UTM]},{cN:"variable",b:"\\b(self|super)\\b"},{cN:"preprocessor",bK:"import",e:"$"},{cN:"preprocessor",b:"\\s*#",e:"$",k:"if else elseif endif end then"},{cN:"pi",b:"^\\s*strict\\b"},{bK:"alias",e:"=",c:[a.UTM]},a.QSM,b]}});hljs.registerLanguage("applescript",function(a){var b=a.inherit(a.QSM,{i:""});var d={cN:"params",b:"\\(",e:"\\)",c:["self",a.CNM,b]};var c=[{cN:"comment",b:"--",e:"$"},{cN:"comment",b:"\\(\\*",e:"\\*\\)",c:["self",{b:"--",e:"$"}]},a.HCM];return{aliases:["osascript"],k:{keyword:"about above after against and around as at back before beginning behind below beneath beside between but by considering contain contains continue copy div does eighth else end equal equals error every exit fifth first for fourth from front get given global if ignoring in into is it its last local me middle mod my ninth not of on onto or over prop property put ref reference repeat returning script second set seventh since sixth some tell tenth that the|0 then third through thru timeout times to transaction try until where while whose with without",constant:"AppleScript false linefeed return pi quote result space tab true",type:"alias application boolean class constant date file integer list number real record string text",command:"activate beep count delay launch log offset read round run say summarize write",property:"character characters contents day frontmost id item length month name paragraph paragraphs rest reverse running time version weekday word words year"},c:[b,a.CNM,{cN:"type",b:"\\bPOSIX file\\b"},{cN:"command",b:"\\b(clipboard info|the clipboard|info for|list (disks|folder)|mount volume|path to|(close|open for) access|(get|set) eof|current date|do shell script|get volume settings|random number|set volume|system attribute|system info|time to GMT|(load|run|store) script|scripting components|ASCII (character|number)|localized string|choose (application|color|file|file name|folder|from list|remote application|URL)|display (alert|dialog))\\b|^\\s*return\\b"},{cN:"constant",b:"\\b(text item delimiters|current application|missing value)\\b"},{cN:"keyword",b:"\\b(apart from|aside from|instead of|out of|greater than|isn't|(doesn't|does not) (equal|come before|come after|contain)|(greater|less) than( or equal)?|(starts?|ends|begins?) with|contained by|comes (before|after)|a (ref|reference))\\b"},{cN:"property",b:"\\b(POSIX path|(date|time) string|quoted form)\\b"},{cN:"function_start",bK:"on",i:"[${=;\\n]",c:[a.UTM,d]}].concat(c),i:"//"}});hljs.registerLanguage("lasso",function(d){var b="[a-zA-Z_][a-zA-Z0-9_.]*";var i="<\\?(lasso(script)?|=)";var c="\\]|\\?>";var g={literal:"true false none minimal full all void and or not bw nbw ew new cn ncn lt lte gt gte eq neq rx nrx ft",built_in:"array date decimal duration integer map pair string tag xml null bytes list queue set stack staticarray tie local var variable global data self inherited",keyword:"error_code error_msg error_pop error_push error_reset cache database_names database_schemanames database_tablenames define_tag define_type email_batch encode_set html_comment handle handle_error header if inline iterate ljax_target link link_currentaction link_currentgroup link_currentrecord link_detail link_firstgroup link_firstrecord link_lastgroup link_lastrecord link_nextgroup link_nextrecord link_prevgroup link_prevrecord log loop namespace_using output_none portal private protect records referer referrer repeating resultset rows search_args search_arguments select sort_args sort_arguments thread_atomic value_list while abort case else if_empty if_false if_null if_true loop_abort loop_continue loop_count params params_up return return_value run_children soap_definetag soap_lastrequest soap_lastresponse tag_name ascending average by define descending do equals frozen group handle_failure import in into join let match max min on order parent protected provide public require returnhome skip split_thread sum take thread to trait type where with yield yieldhome"};var a={cN:"comment",b:"",r:0};var j={cN:"preprocessor",b:"\\[noprocess\\]",starts:{cN:"markup",e:"\\[/noprocess\\]",rE:true,c:[a]}};var e={cN:"preprocessor",b:"\\[/noprocess|"+i};var h={cN:"variable",b:"'"+b+"'"};var f=[d.CLCM,{cN:"javadoc",b:"/\\*\\*!",e:"\\*/",c:[d.PWM]},d.CBCM,d.inherit(d.CNM,{b:d.CNR+"|-?(infinity|nan)\\b"}),d.inherit(d.ASM,{i:null}),d.inherit(d.QSM,{i:null}),{cN:"string",b:"`",e:"`"},{cN:"variable",v:[{b:"[#$]"+b},{b:"#",e:"\\d+",i:"\\W"}]},{cN:"tag",b:"::\\s*",e:b,i:"\\W"},{cN:"attribute",v:[{b:"-"+d.UIR,r:0},{b:"(\\.\\.\\.)"}]},{cN:"subst",v:[{b:"->\\s*",c:[h]},{b:":=|/(?!\\w)=?|[-+*%=<>&|!?\\\\]+",r:0}]},{cN:"built_in",b:"\\.\\.?",r:0,c:[h]},{cN:"class",bK:"define",rE:true,e:"\\(|=>",c:[d.inherit(d.TM,{b:d.UIR+"(=(?!>))?"})]}];return{aliases:["ls","lassoscript"],cI:true,l:b+"|&[lg]t;",k:g,c:[{cN:"preprocessor",b:c,r:0,starts:{cN:"markup",e:"\\[|"+i,rE:true,r:0,c:[a]}},j,e,{cN:"preprocessor",b:"\\[no_square_brackets",starts:{e:"\\[/no_square_brackets\\]",l:b+"|&[lg]t;",k:g,c:[{cN:"preprocessor",b:c,r:0,starts:{cN:"markup",e:i,rE:true,c:[a]}},j,e].concat(f)}},{cN:"preprocessor",b:"\\[",r:0},{cN:"shebang",b:"^#!.+lasso9\\b",r:10}].concat(f)}});hljs.registerLanguage("cpp",function(a){var b={keyword:"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex _Complex _Imaginary",built_in:"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf"};return{aliases:["c","h","c++","h++"],k:b,i:""]',k:"include",i:"\\n"},a.CLCM]},{cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:b,c:["self"]},{b:a.IR+"::"}]}});hljs.registerLanguage("matlab",function(a){var b=[a.CNM,{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}]}];return{k:{keyword:"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while",built_in:"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson"},i:'(//|"|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function",e:"$",c:[a.UTM,{cN:"params",b:"\\(",e:"\\)"},{cN:"params",b:"\\[",e:"\\]"}]},{cN:"transposed_variable",b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:"",r:0},{cN:"matrix",b:"\\[",e:"\\]'*[\\.']*",c:b,r:0},{cN:"cell",b:"\\{",c:b,i:/:/,v:[{e:/\}'[\.']*/},{e:/\}/,r:0}]},{cN:"comment",b:"\\%",e:"$"}].concat(b)}});hljs.registerLanguage("scilab",function(a){var b=[a.CNM,{cN:"string",b:"'|\"",e:"'|\"",c:[a.BE,{b:"''"}]}];return{aliases:["sci"],k:{keyword:"abort break case clear catch continue do elseif else endfunction end for functionglobal if pause return resume select try then while%f %F %t %T %pi %eps %inf %nan %e %i %z %s",built_in:"abs and acos asin atan ceil cd chdir clearglobal cosh cos cumprod deff disp errorexec execstr exists exp eye gettext floor fprintf fread fsolve imag isdef isemptyisinfisnan isvector lasterror length load linspace list listfiles log10 log2 logmax min msprintf mclose mopen ones or pathconvert poly printf prod pwd rand realround sinh sin size gsort sprintf sqrt strcat strcmps tring sum system tanh tantype typename warning zeros matrix"},i:'("|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function endfunction",e:"$",k:"function endfunction|10",c:[a.UTM,{cN:"params",b:"\\(",e:"\\)"}]},{cN:"transposed_variable",b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:"",r:0},{cN:"matrix",b:"\\[",e:"\\]'*[\\.']*",r:0,c:b},{cN:"comment",b:"//",e:"$"}].concat(b)}});hljs.registerLanguage("makefile",function(a){var b={cN:"variable",b:/\$\(/,e:/\)/,c:[a.BE]};return{aliases:["mk","mak"],c:[a.HCM,{b:/^\w+\s*\W*=/,rB:true,r:0,starts:{cN:"constant",e:/\s*\W*=/,eE:true,starts:{e:/$/,r:0,c:[b]}}},{cN:"title",b:/^[\w]+:\s*$/},{cN:"phony",b:/^\.PHONY:/,e:/$/,k:".PHONY",l:/[\.\w]+/},{b:/^\t+/,e:/$/,r:0,c:[a.QSM,b]}]}});hljs.registerLanguage("q",function(a){var b={keyword:"do while select delete by update from",constant:"0b 1b",built_in:"neg not null string reciprocal floor ceiling signum mod xbar xlog and or each scan over prior mmu lsq inv md5 ltime gtime count first var dev med cov cor all any rand sums prds mins maxs fills deltas ratios avgs differ prev next rank reverse iasc idesc asc desc msum mcount mavg mdev xrank mmin mmax xprev rotate distinct group where flip type key til get value attr cut set upsert raze union inter except cross sv vs sublist enlist read0 read1 hopen hclose hdel hsym hcount peach system ltrim rtrim trim lower upper ssr view tables views cols xcols keys xkey xcol xasc xdesc fkeys meta lj aj aj0 ij pj asof uj ww wj wj1 fby xgroup ungroup ej save load rsave rload show csv parse eval min max avg wavg wsum sin cos tan sum",typename:"`float `double int `timestamp `timespan `datetime `time `boolean `symbol `char `byte `short `long `real `month `date `minute `second `guid"};return{aliases:["k","kdb"],k:b,l:/\b(`?)[A-Za-z0-9_]+\b/,c:[a.CLCM,a.QSM,a.CNM]}});hljs.registerLanguage("asciidoc",function(a){return{c:[{cN:"comment",b:"^/{4,}\\n",e:"\\n/{4,}$",r:10},{cN:"comment",b:"^//",e:"$",r:0},{cN:"title",b:"^\\.\\w.*$"},{b:"^[=\\*]{4,}\\n",e:"\\n^[=\\*]{4,}$",r:10},{cN:"header",b:"^(={1,5}) .+?( \\1)?$",r:10},{cN:"header",b:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$",r:10},{cN:"attribute",b:"^:.+?:",e:"\\s",eE:true,r:10},{cN:"attribute",b:"^\\[.+?\\]$",r:0},{cN:"blockquote",b:"^_{4,}\\n",e:"\\n_{4,}$",r:10},{cN:"code",b:"^[\\-\\.]{4,}\\n",e:"\\n[\\-\\.]{4,}$",r:10},{b:"^\\+{4,}\\n",e:"\\n\\+{4,}$",c:[{b:"<",e:">",sL:"xml",r:0}],r:10},{cN:"bullet",b:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{cN:"label",b:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",r:10},{cN:"strong",b:"\\B\\*(?![\\*\\s])",e:"(\\n{2}|\\*)",c:[{b:"\\\\*\\w",r:0}]},{cN:"emphasis",b:"\\B'(?!['\\s])",e:"(\\n{2}|')",c:[{b:"\\\\'\\w",r:0}],r:0},{cN:"emphasis",b:"_(?![_\\s])",e:"(\\n{2}|_)",r:0},{cN:"smartquote",b:"``.+?''",r:10},{cN:"smartquote",b:"`.+?'",r:10},{cN:"code",b:"(`.+?`|\\+.+?\\+)",r:0},{cN:"code",b:"^[ \\t]",e:"$",r:0},{cN:"horizontal_rule",b:"^'{3,}[ \\t]*$",r:10},{b:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",rB:true,c:[{b:"(link|image:?):",r:0},{cN:"link_url",b:"\\w",e:"[^\\[]+",r:0},{cN:"link_label",b:"\\[",e:"\\]",eB:true,eE:true,r:0}],r:10}]}});hljs.registerLanguage("parser3",function(a){return{sL:"xml",r:0,c:[{cN:"comment",b:"^#",e:"$"},{cN:"comment",b:"\\^rem{",e:"}",r:10,c:[{b:"{",e:"}",c:["self"]}]},{cN:"preprocessor",b:"^@(?:BASE|USE|CLASS|OPTIONS)$",r:10},{cN:"title",b:"@[\\w\\-]+\\[[\\w^;\\-]*\\](?:\\[[\\w^;\\-]*\\])?(?:.*)$"},{cN:"variable",b:"\\$\\{?[\\w\\-\\.\\:]+\\}?"},{cN:"keyword",b:"\\^[\\w\\-\\.\\:]+"},{cN:"number",b:"\\^#[0-9a-fA-F]+"},a.CNM]}});hljs.registerLanguage("clojure",function(j){var e={built_in:"def cond apply if-not if-let if not not= = < > <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for dosync and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize"};var f="[a-zA-Z_0-9\\!\\.\\?\\-\\+\\*\\/\\<\\=\\>\\&\\#\\$';]+";var a="[\\s:\\(\\{]+\\d+(\\.\\d+)?";var d={cN:"number",b:a,r:0};var i=j.inherit(j.QSM,{i:null});var n={cN:"comment",b:";",e:"$",r:0};var m={cN:"collection",b:"[\\[\\{]",e:"[\\]\\}]"};var c={cN:"comment",b:"\\^"+f};var b={cN:"comment",b:"\\^\\{",e:"\\}"};var h={cN:"attribute",b:"[:]"+f};var l={cN:"list",b:"\\(",e:"\\)"};var g={eW:true,k:{literal:"true false nil"},r:0};var o={k:e,l:f,cN:"keyword",b:f,starts:g};l.c=[{cN:"comment",b:"comment"},o,g];g.c=[l,i,c,b,n,h,m,d];m.c=[l,i,c,n,h,m,d];return{aliases:["clj"],i:/\S/,c:[n,l,{cN:"prompt",b:/^=> /,starts:{e:/\n\n|\Z/}}]}});hljs.registerLanguage("elixir",function(e){var f="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var g="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var i="and false then defined module in return redo retry end for true self when next until do begin unless nil break not case cond alias while ensure or include use alias fn quote";var c={cN:"subst",b:"#\\{",e:"}",l:f,k:i};var d={cN:"string",c:[e.BE,c],v:[{b:/'/,e:/'/},{b:/"/,e:/"/}]};var b={eW:true,rE:true,l:f,k:i,r:0};var h={cN:"function",bK:"def defmacro",e:/\bdo\b/,c:[e.inherit(e.TM,{b:g,starts:b})]};var j=e.inherit(h,{cN:"class",bK:"defmodule defrecord",e:/\bdo\b|$|;/});var a=[d,e.HCM,j,h,{cN:"constant",b:"(\\b[A-Z_]\\w*(.)?)+",r:0},{cN:"symbol",b:":",c:[d,{b:g}],r:0},{cN:"symbol",b:f+":",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"->"},{b:"("+e.RSR+")\\s*",c:[e.HCM,{cN:"regexp",i:"\\n",c:[e.BE,c],v:[{b:"/",e:"/[a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}],r:0}];c.c=a;b.c=a;return{l:f,k:i,c:a}});hljs.registerLanguage("typescript",function(a){return{aliases:["ts"],k:{keyword:"in if for while finally var new function|0 do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class public private get set super interface extendsstatic constructor implements enum export import declare",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document any number boolean string void",},c:[{cN:"pi",b:/^\s*('|")use strict('|")/,r:0},a.ASM,a.QSM,a.CLCM,a.CBCM,a.CNM,{b:"("+a.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[a.CLCM,a.CBCM,a.RM,{b:/;/,r:0,sL:"xml"}],r:0},{cN:"function",bK:"function",e:/\{/,eE:true,c:[a.inherit(a.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,c:[a.CLCM,a.CBCM],i:/["'\(]/}],i:/\[|%/,r:0},{cN:"constructor",bK:"constructor",e:/\{/,eE:true,r:10},{cN:"module",bK:"module",e:/\{/,eE:true,},{cN:"interface",bK:"interface",e:/\{/,eE:true,},{b:/\$[(.]/},{b:"\\."+a.IR,r:0}]}});hljs.registerLanguage("go",function(a){var b={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer",constant:"true false iota nil",typename:"bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{aliases:["golang"],k:b,i:"=this.size)return undefined;if(i>=this._buf.length)return undefined;return this._buf[(this.pos-i-1)%this.size]};CircularBuffer.prototype.push=function(o){this._buf[this.pos%this.size]=o;return this.pos++}},{}],3:[function(require,module,exports){var Connection=module.exports=require("./base_connection");Connection.prototype.setupSocket=function(){var connection=this;var socket=new WebSocket(this.getUrl());socket.onopen=function(){connection.handleOpen()};socket.onmessage=function(message){connection.handleData(message.data)};socket.onclose=function(){connection.handleClose()};return socket};Connection.prototype.startHeartbeat=function(){if(!this.protocol.sendHeartbeat||this.heartbeatTimer)return;var connection=this;var propertyName=null;if(typeof document.hidden!=="undefined"){propertyName="hidden"}else if(typeof document.mozHidden!=="undefined"){propertyName="mozHidden"}else if(typeof document.msHidden!=="undefined"){propertyName="msHidden"}else if(typeof document.webkitHidden!=="undefined"){propertyName="webkitHidden"}else{propertyName=undefined}var windowVisible=true;var focusListener=window.addEventListener("focus",function(e){windowVisible=true});var blurListener=window.addEventListener("blur",function(e){windowVisible=false});this.on("disconnect",function(){if(connection.heartbeatTimer){clearTimeout(connection.heartbeatTimer);delete connection.heartbeatTimer}window.removeEventListener(focusListener);window.removeEventListener(blurListener)});this.heartbeatTimer=setInterval(function(){var isVisible=propertyName===undefined?true:document[propertyName]===false;if(isVisible&&windowVisible){connection.sendHeartbeat()}else{connection.setHeartbeatState(false)}},this.opts.heartbeatInterval)}},{"./base_connection":1}],4:[function(require,module,exports){!function(process){var Frame=require("./frame"),CircularBuffer=require("./circular_buffer"),Pipeline=require("./pipeline"),EventEmitter=require("events").EventEmitter,gestureListener=require("./gesture").gestureListener,_=require("underscore");var Controller=module.exports=function(opts){var inNode=typeof process!=="undefined"&&process.title==="node";opts=_.defaults(opts||{},{inNode:inNode});this.inNode=opts.inNode;opts=_.defaults(opts||{},{frameEventName:this.useAnimationLoop()?"animationFrame":"deviceFrame",supressAnimationLoop:false});this.supressAnimationLoop=opts.supressAnimationLoop;this.frameEventName=opts.frameEventName;this.history=new CircularBuffer(200);this.lastFrame=Frame.Invalid;this.lastValidFrame=Frame.Invalid;this.lastConnectionFrame=Frame.Invalid;this.accumulatedGestures=[];if(opts.connectionType===undefined){this.connectionType=this.inBrowser()?require("./connection"):require("./node_connection")}else{this.connectionType=opts.connectionType}this.connection=new this.connectionType(opts);this.setupConnectionEvents()};Controller.prototype.gesture=function(type,cb){var creator=gestureListener(this,type);if(cb!==undefined){creator.stop(cb)}return creator};Controller.prototype.inBrowser=function(){return!this.inNode};Controller.prototype.useAnimationLoop=function(){return this.inBrowser()&&typeof chrome==="undefined"};Controller.prototype.connect=function(){var controller=this;if(this.connection.connect()&&this.inBrowser()&&!controller.supressAnimationLoop){var callback=function(){controller.emit("animationFrame",controller.lastConnectionFrame);window.requestAnimFrame(callback)};window.requestAnimFrame(callback)}};Controller.prototype.disconnect=function(){this.connection.disconnect()};Controller.prototype.frame=function(num){return this.history.get(num)||Frame.Invalid};Controller.prototype.loop=function(callback){switch(callback.length){case 1:this.on(this.frameEventName,callback);break;case 2:var controller=this;var scheduler=null;var immediateRunnerCallback=function(frame){callback(frame,function(){if(controller.lastFrame!=frame){immediateRunnerCallback(controller.lastFrame)}else{controller.once(controller.frameEventName,immediateRunnerCallback)}})};this.once(this.frameEventName,immediateRunnerCallback);break}this.connect()};Controller.prototype.addStep=function(step){if(!this.pipeline)this.pipeline=new Pipeline(this);this.pipeline.addStep(step)};Controller.prototype.processFrame=function(frame){if(frame.gestures){this.accumulatedGestures=this.accumulatedGestures.concat(frame.gestures)}if(this.pipeline){frame=this.pipeline.run(frame);if(!frame)frame=Frame.Invalid}this.lastConnectionFrame=frame;this.emit("deviceFrame",frame)};Controller.prototype.processFinishedFrame=function(frame){this.lastFrame=frame;if(frame.valid){this.lastValidFrame=frame}frame.controller=this;frame.historyIdx=this.history.push(frame);if(frame.gestures){frame.gestures=this.accumulatedGestures;this.accumulatedGestures=[];for(var gestureIdx=0;gestureIdx!=frame.gestures.length;gestureIdx++){this.emit("gesture",frame.gestures[gestureIdx],frame)}}this.emit("frame",frame)};Controller.prototype.setupConnectionEvents=function(){var controller=this;this.connection.on("frame",function(frame){controller.processFrame(frame)});this.on(this.frameEventName,function(frame){controller.processFinishedFrame(frame)});this.connection.on("disconnect",function(){controller.emit("disconnect")});this.connection.on("ready",function(){controller.emit("ready")});this.connection.on("connect",function(){controller.emit("connect")});this.connection.on("focus",function(){controller.emit("focus")});this.connection.on("blur",function(){controller.emit("blur")});this.connection.on("protocol",function(protocol){controller.emit("protocol",protocol)});this.connection.on("deviceConnect",function(evt){controller.emit(evt.state?"deviceConnected":"deviceDisconnected")})};_.extend(Controller.prototype,EventEmitter.prototype)}(require("__browserify_process"))},{"./circular_buffer":2,"./connection":3,"./frame":5,"./gesture":6,"./node_connection":16,"./pipeline":10,__browserify_process:18,events:17,underscore:20}],5:[function(require,module,exports){var Hand=require("./hand"),Pointable=require("./pointable"),createGesture=require("./gesture").createGesture,glMatrix=require("gl-matrix"),mat3=glMatrix.mat3,vec3=glMatrix.vec3,InteractionBox=require("./interaction_box"),_=require("underscore");var Frame=module.exports=function(data){this.valid=true;this.id=data.id;this.timestamp=data.timestamp;this.hands=[];this.handsMap={};this.pointables=[];this.tools=[];this.fingers=[];if(data.interactionBox){this.interactionBox=new InteractionBox(data.interactionBox)}this.gestures=[];this.pointablesMap={};this._translation=data.t;this._rotation=_.flatten(data.r);this._scaleFactor=data.s;this.data=data;this.type="frame";this.currentFrameRate=data.currentFrameRate;var handMap={};for(var handIdx=0,handCount=data.hands.length;handIdx!=handCount;handIdx++){var hand=new Hand(data.hands[handIdx]);hand.frame=this;this.hands.push(hand);this.handsMap[hand.id]=hand;handMap[hand.id]=handIdx}for(var pointableIdx=0,pointableCount=data.pointables.length;pointableIdx!=pointableCount;pointableIdx++){var pointable=new Pointable(data.pointables[pointableIdx]);pointable.frame=this;this.pointables.push(pointable);this.pointablesMap[pointable.id]=pointable;(pointable.tool?this.tools:this.fingers).push(pointable);if(pointable.handId!==undefined&&handMap.hasOwnProperty(pointable.handId)){var hand=this.hands[handMap[pointable.handId]];hand.pointables.push(pointable);(pointable.tool?hand.tools:hand.fingers).push(pointable)}}if(data.gestures){for(var gestureIdx=0,gestureCount=data.gestures.length;gestureIdx!=gestureCount;gestureIdx++){this.gestures.push(createGesture(data.gestures[gestureIdx]))}}};Frame.prototype.tool=function(id){var pointable=this.pointable(id);return pointable.tool?pointable:Pointable.Invalid};Frame.prototype.pointable=function(id){return this.pointablesMap[id]||Pointable.Invalid};Frame.prototype.finger=function(id){var pointable=this.pointable(id);return!pointable.tool?pointable:Pointable.Invalid};Frame.prototype.hand=function(id){return this.handsMap[id]||Hand.Invalid};Frame.prototype.rotationAngle=function(sinceFrame,axis){if(!this.valid||!sinceFrame.valid)return 0;var rot=this.rotationMatrix(sinceFrame);var cs=(rot[0]+rot[4]+rot[8]-1)*.5;var angle=Math.acos(cs);angle=isNaN(angle)?0:angle;if(axis!==undefined){var rotAxis=this.rotationAxis(sinceFrame);angle*=vec3.dot(rotAxis,vec3.normalize(vec3.create(),axis))}return angle};Frame.prototype.rotationAxis=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();return vec3.normalize(vec3.create(),[this._rotation[7]-sinceFrame._rotation[5],this._rotation[2]-sinceFrame._rotation[6],this._rotation[3]-sinceFrame._rotation[1]])};Frame.prototype.rotationMatrix=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return mat3.create();var transpose=mat3.transpose(mat3.create(),this._rotation);return mat3.multiply(mat3.create(),sinceFrame._rotation,transpose)};Frame.prototype.scaleFactor=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return 1;return Math.exp(this._scaleFactor-sinceFrame._scaleFactor)};Frame.prototype.translation=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();return vec3.subtract(vec3.create(),this._translation,sinceFrame._translation)};Frame.prototype.toString=function(){var str="Frame [ id:"+this.id+" | timestamp:"+this.timestamp+" | Hand count:("+this.hands.length+") | Pointable count:("+this.pointables.length+")";if(this.gestures)str+=" | Gesture count:("+this.gestures.length+")";str+=" ]";return str};Frame.prototype.dump=function(){var out="";out+="Frame Info:
";out+=this.toString();out+="

Hands:
";for(var handIdx=0,handCount=this.hands.length;handIdx!=handCount;handIdx++){out+=" "+this.hands[handIdx].toString()+"
"}out+="

Pointables:
";for(var pointableIdx=0,pointableCount=this.pointables.length;pointableIdx!=pointableCount;pointableIdx++){out+=" "+this.pointables[pointableIdx].toString()+"
"}if(this.gestures){out+="

Gestures:
";for(var gestureIdx=0,gestureCount=this.gestures.length;gestureIdx!=gestureCount;gestureIdx++){out+=" "+this.gestures[gestureIdx].toString()+"
"}}out+="

Raw JSON:
";out+=JSON.stringify(this.data);return out};Frame.Invalid={valid:false,hands:[],fingers:[],tools:[],gestures:[],pointables:[],pointable:function(){return Pointable.Invalid},finger:function(){return Pointable.Invalid},hand:function(){return Hand.Invalid},toString:function(){return"invalid frame"},dump:function(){return this.toString()},rotationAngle:function(){return 0},rotationMatrix:function(){return mat3.create()},rotationAxis:function(){return vec3.create()},scaleFactor:function(){return 1},translation:function(){return vec3.create()}}},{"./gesture":6,"./hand":7,"./interaction_box":9,"./pointable":11,"gl-matrix":19,underscore:20}],6:[function(require,module,exports){var glMatrix=require("gl-matrix"),vec3=glMatrix.vec3,EventEmitter=require("events").EventEmitter,_=require("underscore");var createGesture=exports.createGesture=function(data){var gesture;switch(data.type){case"circle":gesture=new CircleGesture(data);break;case"swipe":gesture=new SwipeGesture(data);break;case"screenTap":gesture=new ScreenTapGesture(data);break;case"keyTap":gesture=new KeyTapGesture(data);break;default:throw"unkown gesture type"}gesture.id=data.id;gesture.handIds=data.handIds;gesture.pointableIds=data.pointableIds;gesture.duration=data.duration;gesture.state=data.state;gesture.type=data.type;return gesture};var gestureListener=exports.gestureListener=function(controller,type){var handlers={};var gestureMap={};var gestureCreator=function(){var candidateGesture=gestureMap[gesture.id];if(candidateGesture!==undefined)gesture.update(gesture,frame);if(gesture.state=="start"||gesture.state=="stop"){if(type==gesture.type&&gestureMap[gesture.id]===undefined){gestureMap[gesture.id]=new Gesture(gesture,frame);gesture.update(gesture,frame)}if(gesture.state=="stop"){delete gestureMap[gesture.id]}}};controller.on("gesture",function(gesture,frame){if(gesture.type==type){if(gesture.state=="start"||gesture.state=="stop"){if(gestureMap[gesture.id]===undefined){var gestureTracker=new Gesture(gesture,frame);gestureMap[gesture.id]=gestureTracker;_.each(handlers,function(cb,name){gestureTracker.on(name,cb)})}}gestureMap[gesture.id].update(gesture,frame);if(gesture.state=="stop"){delete gestureMap[gesture.id]}}});var builder={start:function(cb){handlers["start"]=cb;return builder},stop:function(cb){handlers["stop"]=cb;return builder},complete:function(cb){handlers["stop"]=cb;return builder},update:function(cb){handlers["update"]=cb;return builder}};return builder};var Gesture=exports.Gesture=function(gesture,frame){this.gestures=[gesture];this.frames=[frame]};Gesture.prototype.update=function(gesture,frame){this.gestures.push(gesture);this.frames.push(frame);this.emit(gesture.state,this)};_.extend(Gesture.prototype,EventEmitter.prototype);var CircleGesture=function(data){this.center=data.center;this.normal=data.normal;this.progress=data.progress;this.radius=data.radius};CircleGesture.prototype.toString=function(){return"CircleGesture ["+JSON.stringify(this)+"]"};var SwipeGesture=function(data){this.startPosition=data.startPosition;this.position=data.position;this.direction=data.direction;this.speed=data.speed};SwipeGesture.prototype.toString=function(){return"SwipeGesture ["+JSON.stringify(this)+"]"};var ScreenTapGesture=function(data){this.position=data.position;this.direction=data.direction;this.progress=data.progress};ScreenTapGesture.prototype.toString=function(){return"ScreenTapGesture ["+JSON.stringify(this)+"]"};var KeyTapGesture=function(data){this.position=data.position;this.direction=data.direction;this.progress=data.progress};KeyTapGesture.prototype.toString=function(){return"KeyTapGesture ["+JSON.stringify(this)+"]"}},{events:17,"gl-matrix":19,underscore:20}],7:[function(require,module,exports){var Pointable=require("./pointable"),glMatrix=require("gl-matrix"),mat3=glMatrix.mat3,vec3=glMatrix.vec3,_=require("underscore");var Hand=module.exports=function(data){this.id=data.id;this.palmPosition=data.palmPosition;this.direction=data.direction;this.palmVelocity=data.palmVelocity;this.palmNormal=data.palmNormal;this.sphereCenter=data.sphereCenter;this.sphereRadius=data.sphereRadius;this.valid=true;this.pointables=[];this.fingers=[];this.tools=[];this._translation=data.t;this._rotation=_.flatten(data.r);this._scaleFactor=data.s;this.timeVisible=data.timeVisible;this.stabilizedPalmPosition=data.stabilizedPalmPosition};Hand.prototype.finger=function(id){var finger=this.frame.finger(id);return finger&&finger.handId==this.id?finger:Pointable.Invalid};Hand.prototype.rotationAngle=function(sinceFrame,axis){if(!this.valid||!sinceFrame.valid)return 0;var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return 0;var rot=this.rotationMatrix(sinceFrame);var cs=(rot[0]+rot[4]+rot[8]-1)*.5;var angle=Math.acos(cs);angle=isNaN(angle)?0:angle;if(axis!==undefined){var rotAxis=this.rotationAxis(sinceFrame);angle*=vec3.dot(rotAxis,vec3.normalize(vec3.create(),axis))}return angle};Hand.prototype.rotationAxis=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return vec3.create();return vec3.normalize(vec3.create(),[this._rotation[7]-sinceHand._rotation[5],this._rotation[2]-sinceHand._rotation[6],this._rotation[3]-sinceHand._rotation[1]])};Hand.prototype.rotationMatrix=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return mat3.create();var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return mat3.create();var transpose=mat3.transpose(mat3.create(),this._rotation);var m=mat3.multiply(mat3.create(),sinceHand._rotation,transpose);return m};Hand.prototype.scaleFactor=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return 1;var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return 1;return Math.exp(this._scaleFactor-sinceHand._scaleFactor)};Hand.prototype.translation=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return vec3.create();return[this._translation[0]-sinceHand._translation[0],this._translation[1]-sinceHand._translation[1],this._translation[2]-sinceHand._translation[2]]};Hand.prototype.toString=function(){return"Hand [ id: "+this.id+" | palm velocity:"+this.palmVelocity+" | sphere center:"+this.sphereCenter+" ] "};Hand.Invalid={valid:false,fingers:[],tools:[],pointables:[],pointable:function(){return Pointable.Invalid},finger:function(){return Pointable.Invalid},toString:function(){return"invalid frame"},dump:function(){return this.toString()},rotationAngle:function(){return 0},rotationMatrix:function(){return mat3.create()},rotationAxis:function(){return vec3.create()},scaleFactor:function(){return 1},translation:function(){return vec3.create()}}},{"./pointable":11,"gl-matrix":19,underscore:20}],8:[function(require,module,exports){!function(){module.exports={Controller:require("./controller"),Frame:require("./frame"),Gesture:require("./gesture"),Hand:require("./hand"),Pointable:require("./pointable"),InteractionBox:require("./interaction_box"),Connection:require("./connection"),CircularBuffer:require("./circular_buffer"),UI:require("./ui"),glMatrix:require("gl-matrix"),mat3:require("gl-matrix").mat3,vec3:require("gl-matrix").vec3,loopController:undefined,loop:function(opts,callback){if(callback===undefined){callback=opts;opts={}}if(!this.loopController)this.loopController=new this.Controller(opts);this.loopController.loop(callback)}}}()},{"./circular_buffer":2,"./connection":3,"./controller":4,"./frame":5,"./gesture":6,"./hand":7,"./interaction_box":9,"./pointable":11,"./ui":13,"gl-matrix":19}],9:[function(require,module,exports){var glMatrix=require("gl-matrix"),vec3=glMatrix.vec3;var InteractionBox=module.exports=function(data){this.valid=true;this.center=data.center;this.size=data.size;this.width=data.size[0];this.height=data.size[1];this.depth=data.size[2]};InteractionBox.prototype.denormalizePoint=function(normalizedPosition){return vec3.fromValues((normalizedPosition[0]-.5)*this.size[0]+this.center[0],(normalizedPosition[1]-.5)*this.size[1]+this.center[1],(normalizedPosition[2]-.5)*this.size[2]+this.center[2])};InteractionBox.prototype.normalizePoint=function(position,clamp){var vec=vec3.fromValues((position[0]-this.center[0])/this.size[0]+.5,(position[1]-this.center[1])/this.size[1]+.5,(position[2]-this.center[2])/this.size[2]+.5);if(clamp){vec[0]=Math.min(Math.max(vec[0],0),1);vec[1]=Math.min(Math.max(vec[1],0),1);vec[2]=Math.min(Math.max(vec[2],0),1)}return vec};InteractionBox.prototype.toString=function(){return"InteractionBox [ width:"+this.width+" | height:"+this.height+" | depth:"+this.depth+" ]"};InteractionBox.Invalid={valid:false}},{"gl-matrix":19}],10:[function(require,module,exports){var Pipeline=module.exports=function(){this.steps=[]};Pipeline.prototype.addStep=function(step){this.steps.push(step)};Pipeline.prototype.run=function(frame){var stepsLength=this.steps.length;for(var i=0;i!=stepsLength;i++){if(!frame)break;frame=this.steps[i](frame)}return frame}},{}],11:[function(require,module,exports){var glMatrix=require("gl-matrix"),vec3=glMatrix.vec3;var Pointable=module.exports=function(data){this.valid=true;this.id=data.id;this.handId=data.handId;this.length=data.length;this.tool=data.tool;this.width=data.width;this.direction=data.direction;this.stabilizedTipPosition=data.stabilizedTipPosition;this.tipPosition=data.tipPosition;this.tipVelocity=data.tipVelocity;this.touchZone=data.touchZone;this.touchDistance=data.touchDistance;this.timeVisible=data.timeVisible};Pointable.prototype.toString=function(){if(this.tool==true){return"Pointable [ id:"+this.id+" "+this.length+"mmx | with:"+this.width+"mm | direction:"+this.direction+" ]"}else{return"Pointable [ id:"+this.id+" "+this.length+"mmx | direction: "+this.direction+" ]"}};Pointable.Invalid={valid:false}},{"gl-matrix":19}],12:[function(require,module,exports){var Frame=require("./frame");var Event=function(data){this.type=data.type;this.state=data.state};var chooseProtocol=exports.chooseProtocol=function(header){var protocol;switch(header.version){case 1:protocol=JSONProtocol(1,function(data){return new Frame(data)});break;case 2:protocol=JSONProtocol(2,function(data){return new Frame(data)});protocol.sendHeartbeat=function(connection){connection.send(protocol.encode({heartbeat:true}))};break;case 3:protocol=JSONProtocol(3,function(data){return data.event?new Event(data.event):new Frame(data)});protocol.sendHeartbeat=function(connection){connection.send(protocol.encode({heartbeat:true}))};break;default:throw"unrecognized version"}return protocol};var JSONProtocol=function(version,cb){var protocol=cb;protocol.encode=function(message){return JSON.stringify(message)};protocol.version=version;protocol.versionLong="Version "+version;protocol.type="protocol";return protocol}},{"./frame":5}],13:[function(require,module,exports){exports.UI={Region:require("./ui/region"),Cursor:require("./ui/cursor")}},{"./ui/cursor":14,"./ui/region":15}],14:[function(require,module,exports){var Cursor=module.exports=function(){return function(frame){var pointable=frame.pointables.sort(function(a,b){return a.z-b.z})[0];if(pointable&&pointable.valid){frame.cursorPosition=pointable.tipPosition}return frame}}},{}],15:[function(require,module,exports){var EventEmitter=require("events").EventEmitter,_=require("underscore");var Region=module.exports=function(start,end){this.start=new Vector(start);this.end=new Vector(end);this.enteredFrame=null};Region.prototype.hasPointables=function(frame){for(var i=0;i!=frame.pointables.length;i++){var position=frame.pointables[i].tipPosition;if(position.x>=this.start.x&&position.x<=this.end.x&&position.y>=this.start.y&&position.y<=this.end.y&&position.z>=this.start.z&&position.z<=this.end.z){return true}}return false};Region.prototype.listener=function(opts){var region=this;if(opts&&opts.nearThreshold)this.setupNearRegion(opts.nearThreshold);return function(frame){return region.updatePosition(frame)}};Region.prototype.clipper=function(){var region=this;return function(frame){region.updatePosition(frame);return region.enteredFrame?frame:null}};Region.prototype.setupNearRegion=function(distance){var nearRegion=this.nearRegion=new Region([this.start.x-distance,this.start.y-distance,this.start.z-distance],[this.end.x+distance,this.end.y+distance,this.end.z+distance]);var region=this;nearRegion.on("enter",function(frame){region.emit("near",frame)});nearRegion.on("exit",function(frame){region.emit("far",frame)});region.on("exit",function(frame){region.emit("near",frame)})};Region.prototype.updatePosition=function(frame){if(this.nearRegion)this.nearRegion.updatePosition(frame);if(this.hasPointables(frame)&&this.enteredFrame==null){this.enteredFrame=frame;this.emit("enter",this.enteredFrame)}else if(!this.hasPointables(frame)&&this.enteredFrame!=null){this.enteredFrame=null;this.emit("exit",this.enteredFrame)}return frame};Region.prototype.normalize=function(position){return new Vector([(position.x-this.start.x)/(this.end.x-this.start.x),(position.y-this.start.y)/(this.end.y-this.start.y),(position.z-this.start.z)/(this.end.z-this.start.z)])};Region.prototype.mapToXY=function(position,width,height){var normalized=this.normalize(position);var x=normalized.x,y=normalized.y;if(x>1)x=1;else if(x<-1)x=-1;if(y>1)y=1;else if(y<-1)y=-1;return[(x+1)/2*width,(1-y)/2*height,normalized.z]};_.extend(Region.prototype,EventEmitter.prototype)},{events:17,underscore:20}],16:[function(require,module,exports){},{}],17:[function(require,module,exports){!function(process){if(!process.EventEmitter)process.EventEmitter=function(){};var EventEmitter=exports.EventEmitter=process.EventEmitter;var isArray=typeof Array.isArray==="function"?Array.isArray:function(xs){return Object.prototype.toString.call(xs)==="[object Array]"};function indexOf(xs,x){if(xs.indexOf)return xs.indexOf(x);for(var i=0;i0&&this._events[type].length>m){this._events[type].warned=true;console.error("(node) warning: possible EventEmitter memory "+"leak detected. %d listeners added. "+"Use emitter.setMaxListeners() to increase limit.",this._events[type].length);console.trace()}}this._events[type].push(listener)}else{this._events[type]=[this._events[type],listener]}return this};EventEmitter.prototype.on=EventEmitter.prototype.addListener;EventEmitter.prototype.once=function(type,listener){var self=this;self.on(type,function g(){self.removeListener(type,g);listener.apply(this,arguments)});return this};EventEmitter.prototype.removeListener=function(type,listener){if("function"!==typeof listener){throw new Error("removeListener only takes instances of Function")}if(!this._events||!this._events[type])return this;var list=this._events[type];if(isArray(list)){var i=indexOf(list,listener);if(i<0)return this;list.splice(i,1);if(list.length==0)delete this._events[type]}else if(this._events[type]===listener){delete this._events[type]}return this};EventEmitter.prototype.removeAllListeners=function(type){if(arguments.length===0){this._events={};return this}if(type&&this._events&&this._events[type])this._events[type]=null;return this};EventEmitter.prototype.listeners=function(type){if(!this._events)this._events={};if(!this._events[type])this._events[type]=[];if(!isArray(this._events[type])){this._events[type]=[this._events[type]]}return this._events[type]}}(require("__browserify_process"))},{__browserify_process:18}],18:[function(require,module,exports){var process=module.exports={};process.nextTick=function(){var canSetImmediate=typeof window!=="undefined"&&window.setImmediate;var canPost=typeof window!=="undefined"&&window.postMessage&&window.addEventListener;if(canSetImmediate){return function(f){return window.setImmediate(f)}}if(canPost){var queue=[];window.addEventListener("message",function(ev){if(ev.source===window&&ev.data==="process-tick"){ev.stopPropagation();if(queue.length>0){var fn=queue.shift();fn()}}},true);return function nextTick(fn){queue.push(fn);window.postMessage("process-tick","*")}}return function nextTick(fn){setTimeout(fn,0)}}();process.title="browser";process.browser=true;process.env={};process.argv=[];process.binding=function(name){throw new Error("process.binding is not supported")};process.cwd=function(){return"/"};process.chdir=function(dir){throw new Error("process.chdir is not supported")}},{}],19:[function(require,module,exports){!function(){!function(){"use strict";var shim={};if(typeof exports==="undefined"){if(typeof define=="function"&&typeof define.amd=="object"&&define.amd){shim.exports={};define(function(){return shim.exports})}else{shim.exports=window}}else{shim.exports=exports}!function(exports){var vec2={};if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}vec2.create=function(){return new Float32Array(2)};vec2.clone=function(a){var out=new Float32Array(2);out[0]=a[0];out[1]=a[1];return out};vec2.fromValues=function(x,y){var out=new Float32Array(2);out[0]=x;out[1]=y;return out};vec2.copy=function(out,a){out[0]=a[0];out[1]=a[1];return out};vec2.set=function(out,x,y){out[0]=x;out[1]=y;return out};vec2.add=function(out,a,b){out[0]=a[0]+b[0];out[1]=a[1]+b[1];return out};vec2.sub=vec2.subtract=function(out,a,b){out[0]=a[0]-b[0];out[1]=a[1]-b[1];return out};vec2.mul=vec2.multiply=function(out,a,b){out[0]=a[0]*b[0];out[1]=a[1]*b[1];return out};vec2.div=vec2.divide=function(out,a,b){out[0]=a[0]/b[0];out[1]=a[1]/b[1];return out};vec2.min=function(out,a,b){out[0]=Math.min(a[0],b[0]); out[1]=Math.min(a[1],b[1]);return out};vec2.max=function(out,a,b){out[0]=Math.max(a[0],b[0]);out[1]=Math.max(a[1],b[1]);return out};vec2.scale=function(out,a,b){out[0]=a[0]*b;out[1]=a[1]*b;return out};vec2.dist=vec2.distance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1];return Math.sqrt(x*x+y*y)};vec2.sqrDist=vec2.squaredDistance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1];return x*x+y*y};vec2.len=vec2.length=function(a){var x=a[0],y=a[1];return Math.sqrt(x*x+y*y)};vec2.sqrLen=vec2.squaredLength=function(a){var x=a[0],y=a[1];return x*x+y*y};vec2.negate=function(out,a){out[0]=-a[0];out[1]=-a[1];return out};vec2.normalize=function(out,a){var x=a[0],y=a[1];var len=x*x+y*y;if(len>0){len=1/Math.sqrt(len);out[0]=a[0]*len;out[1]=a[1]*len}return out};vec2.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]};vec2.cross=function(out,a,b){var z=a[0]*b[1]-a[1]*b[0];out[0]=out[1]=0;out[2]=z;return out};vec2.lerp=function(out,a,b,t){var ax=a[0],ay=a[1];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);return out};vec2.transformMat2=function(out,a,m){var x=a[0],y=a[1];out[0]=x*m[0]+y*m[1];out[1]=x*m[2]+y*m[3];return out};vec2.forEach=function(){var vec=new Float32Array(2);return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=2}if(!offset){offset=0}if(count){l=Math.min(count*stride+offset,a.length)}else{l=a.length}for(i=offset;i0){len=1/Math.sqrt(len);out[0]=a[0]*len;out[1]=a[1]*len;out[2]=a[2]*len}return out};vec3.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]};vec3.cross=function(out,a,b){var ax=a[0],ay=a[1],az=a[2],bx=b[0],by=b[1],bz=b[2];out[0]=ay*bz-az*by;out[1]=az*bx-ax*bz;out[2]=ax*by-ay*bx;return out};vec3.lerp=function(out,a,b,t){var ax=a[0],ay=a[1],az=a[2];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);out[2]=az+t*(b[2]-az);return out};vec3.transformMat4=function(out,a,m){var x=a[0],y=a[1],z=a[2];out[0]=m[0]*x+m[4]*y+m[8]*z+m[12];out[1]=m[1]*x+m[5]*y+m[9]*z+m[13];out[2]=m[2]*x+m[6]*y+m[10]*z+m[14];return out};vec3.transformQuat=function(out,a,q){var x=a[0],y=a[1],z=a[2],qx=q[0],qy=q[1],qz=q[2],qw=q[3],ix=qw*x+qy*z-qz*y,iy=qw*y+qz*x-qx*z,iz=qw*z+qx*y-qy*x,iw=-qx*x-qy*y-qz*z;out[0]=ix*qw+iw*-qx+iy*-qz-iz*-qy;out[1]=iy*qw+iw*-qy+iz*-qx-ix*-qz;out[2]=iz*qw+iw*-qz+ix*-qy-iy*-qx;return out};vec3.forEach=function(){var vec=new Float32Array(3);return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=3}if(!offset){offset=0}if(count){l=Math.min(count*stride+offset,a.length)}else{l=a.length}for(i=offset;i0){len=1/Math.sqrt(len);out[0]=a[0]*len;out[1]=a[1]*len;out[2]=a[2]*len;out[3]=a[3]*len}return out};vec4.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3]};vec4.lerp=function(out,a,b,t){var ax=a[0],ay=a[1],az=a[2],aw=a[3];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);out[2]=az+t*(b[2]-az);out[3]=aw+t*(b[3]-aw);return out};vec4.transformMat4=function(out,a,m){var x=a[0],y=a[1],z=a[2],w=a[3];out[0]=m[0]*x+m[4]*y+m[8]*z+m[12]*w;out[1]=m[1]*x+m[5]*y+m[9]*z+m[13]*w;out[2]=m[2]*x+m[6]*y+m[10]*z+m[14]*w;out[3]=m[3]*x+m[7]*y+m[11]*z+m[15]*w;return out};vec4.transformQuat=function(out,a,q){var x=a[0],y=a[1],z=a[2],qx=q[0],qy=q[1],qz=q[2],qw=q[3],ix=qw*x+qy*z-qz*y,iy=qw*y+qz*x-qx*z,iz=qw*z+qx*y-qy*x,iw=-qx*x-qy*y-qz*z;out[0]=ix*qw+iw*-qx+iy*-qz-iz*-qy;out[1]=iy*qw+iw*-qy+iz*-qx-ix*-qz;out[2]=iz*qw+iw*-qz+ix*-qy-iy*-qx;return out};vec4.forEach=function(){var vec=new Float32Array(4);return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=4}if(!offset){offset=0}if(count){l=Math.min(count*stride+offset,a.length)}else{l=a.length}for(i=offset;i=1){if(out!==a){out[0]=ax;out[1]=ay;out[2]=az;out[3]=aw}return out}halfTheta=Math.acos(cosHalfTheta);sinHalfTheta=Math.sqrt(1-cosHalfTheta*cosHalfTheta);if(Math.abs(sinHalfTheta)<.001){out[0]=ax*.5+bx*.5;out[1]=ay*.5+by*.5;out[2]=az*.5+bz*.5;out[3]=aw*.5+bw*.5;return out}ratioA=Math.sin((1-t)*halfTheta)/sinHalfTheta;ratioB=Math.sin(t*halfTheta)/sinHalfTheta;out[0]=ax*ratioA+bx*ratioB;out[1]=ay*ratioA+by*ratioB;out[2]=az*ratioA+bz*ratioB;out[3]=aw*ratioA+bw*ratioB;return out};quat.invert=function(out,a){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],dot=a0*a0+a1*a1+a2*a2+a3*a3,invDot=dot?1/dot:0;out[0]=-a0*invDot;out[1]=-a1*invDot;out[2]=-a2*invDot;out[3]=a3*invDot;return out};quat.conjugate=function(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];out[3]=a[3];return out};quat.len=quat.length=vec4.length;quat.sqrLen=quat.squaredLength=vec4.squaredLength;quat.normalize=vec4.normalize;quat.str=function(a){return"quat("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};if(typeof exports!=="undefined"){exports.quat=quat}}(shim.exports)}()}()},{}],20:[function(require,module,exports){!function(){!function(){var root=this;var previousUnderscore=root._;var breaker={};var ArrayProto=Array.prototype,ObjProto=Object.prototype,FuncProto=Function.prototype;var push=ArrayProto.push,slice=ArrayProto.slice,concat=ArrayProto.concat,toString=ObjProto.toString,hasOwnProperty=ObjProto.hasOwnProperty;var nativeForEach=ArrayProto.forEach,nativeMap=ArrayProto.map,nativeReduce=ArrayProto.reduce,nativeReduceRight=ArrayProto.reduceRight,nativeFilter=ArrayProto.filter,nativeEvery=ArrayProto.every,nativeSome=ArrayProto.some,nativeIndexOf=ArrayProto.indexOf,nativeLastIndexOf=ArrayProto.lastIndexOf,nativeIsArray=Array.isArray,nativeKeys=Object.keys,nativeBind=FuncProto.bind;var _=function(obj){if(obj instanceof _)return obj;if(!(this instanceof _))return new _(obj);this._wrapped=obj};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports){exports=module.exports=_}exports._=_}else{root._=_}_.VERSION="1.4.4";var each=_.each=_.forEach=function(obj,iterator,context){if(obj==null)return;if(nativeForEach&&obj.forEach===nativeForEach){obj.forEach(iterator,context)}else if(obj.length===+obj.length){for(var i=0,l=obj.length;i2;if(obj==null)obj=[];if(nativeReduce&&obj.reduce===nativeReduce){if(context)iterator=_.bind(iterator,context);return initial?obj.reduce(iterator,memo):obj.reduce(iterator)}each(obj,function(value,index,list){if(!initial){memo=value;initial=true}else{memo=iterator.call(context,memo,value,index,list)}});if(!initial)throw new TypeError(reduceError);return memo};_.reduceRight=_.foldr=function(obj,iterator,memo,context){var initial=arguments.length>2;if(obj==null)obj=[];if(nativeReduceRight&&obj.reduceRight===nativeReduceRight){if(context)iterator=_.bind(iterator,context);return initial?obj.reduceRight(iterator,memo):obj.reduceRight(iterator)}var length=obj.length;if(length!==+length){var keys=_.keys(obj);length=keys.length}each(obj,function(value,index,list){index=keys?keys[--length]:--length;if(!initial){memo=obj[index];initial=true}else{memo=iterator.call(context,memo,obj[index],index,list)}});if(!initial)throw new TypeError(reduceError);return memo};_.find=_.detect=function(obj,iterator,context){var result;any(obj,function(value,index,list){if(iterator.call(context,value,index,list)){result=value;return true}});return result};_.filter=_.select=function(obj,iterator,context){var results=[];if(obj==null)return results;if(nativeFilter&&obj.filter===nativeFilter)return obj.filter(iterator,context);each(obj,function(value,index,list){if(iterator.call(context,value,index,list))results[results.length]=value});return results};_.reject=function(obj,iterator,context){return _.filter(obj,function(value,index,list){return!iterator.call(context,value,index,list)},context)};_.every=_.all=function(obj,iterator,context){iterator||(iterator=_.identity);var result=true;if(obj==null)return result;if(nativeEvery&&obj.every===nativeEvery)return obj.every(iterator,context);each(obj,function(value,index,list){if(!(result=result&&iterator.call(context,value,index,list)))return breaker});return!!result};var any=_.some=_.any=function(obj,iterator,context){iterator||(iterator=_.identity);var result=false;if(obj==null)return result;if(nativeSome&&obj.some===nativeSome)return obj.some(iterator,context);each(obj,function(value,index,list){if(result||(result=iterator.call(context,value,index,list)))return breaker});return!!result};_.contains=_.include=function(obj,target){if(obj==null)return false;if(nativeIndexOf&&obj.indexOf===nativeIndexOf)return obj.indexOf(target)!=-1;return any(obj,function(value){return value===target})};_.invoke=function(obj,method){var args=slice.call(arguments,2);var isFunc=_.isFunction(method);return _.map(obj,function(value){return(isFunc?method:value[method]).apply(value,args)})};_.pluck=function(obj,key){return _.map(obj,function(value){return value[key]})};_.where=function(obj,attrs,first){if(_.isEmpty(attrs))return first?null:[];return _[first?"find":"filter"](obj,function(value){for(var key in attrs){if(attrs[key]!==value[key])return false}return true})};_.findWhere=function(obj,attrs){return _.where(obj,attrs,true)};_.max=function(obj,iterator,context){if(!iterator&&_.isArray(obj)&&obj[0]===+obj[0]&&obj.length<65535){return Math.max.apply(Math,obj)}if(!iterator&&_.isEmpty(obj))return-Infinity;var result={computed:-Infinity,value:-Infinity};each(obj,function(value,index,list){var computed=iterator?iterator.call(context,value,index,list):value;computed>=result.computed&&(result={value:value,computed:computed})});return result.value};_.min=function(obj,iterator,context){if(!iterator&&_.isArray(obj)&&obj[0]===+obj[0]&&obj.length<65535){return Math.min.apply(Math,obj)}if(!iterator&&_.isEmpty(obj))return Infinity;var result={computed:Infinity,value:Infinity};each(obj,function(value,index,list){var computed=iterator?iterator.call(context,value,index,list):value;computedb||a===void 0)return 1;if(a>>1;iterator.call(context,array[mid])=0})})};_.difference=function(array){var rest=concat.apply(ArrayProto,slice.call(arguments,1));return _.filter(array,function(value){return!_.contains(rest,value)})};_.zip=function(){var args=slice.call(arguments);var length=_.max(_.pluck(args,"length"));var results=new Array(length);for(var i=0;i=0;i--){args=[funcs[i].apply(this,args)]}return args[0]}};_.after=function(times,func){if(times<=0)return func();return function(){if(--times<1){return func.apply(this,arguments)}}};_.keys=nativeKeys||function(obj){if(obj!==Object(obj))throw new TypeError("Invalid object");var keys=[];for(var key in obj)if(_.has(obj,key))keys[keys.length]=key;return keys};_.values=function(obj){var values=[];for(var key in obj)if(_.has(obj,key))values.push(obj[key]);return values};_.pairs=function(obj){var pairs=[];for(var key in obj)if(_.has(obj,key))pairs.push([key,obj[key]]);return pairs};_.invert=function(obj){var result={};for(var key in obj)if(_.has(obj,key))result[obj[key]]=key;return result};_.functions=_.methods=function(obj){var names=[];for(var key in obj){if(_.isFunction(obj[key]))names.push(key)}return names.sort()};_.extend=function(obj){each(slice.call(arguments,1),function(source){if(source){for(var prop in source){obj[prop]=source[prop]}}});return obj};_.pick=function(obj){var copy={};var keys=concat.apply(ArrayProto,slice.call(arguments,1));each(keys,function(key){if(key in obj)copy[key]=obj[key]});return copy};_.omit=function(obj){var copy={};var keys=concat.apply(ArrayProto,slice.call(arguments,1));for(var key in obj){if(!_.contains(keys,key))copy[key]=obj[key]}return copy};_.defaults=function(obj){each(slice.call(arguments,1),function(source){if(source){for(var prop in source){if(obj[prop]==null)obj[prop]=source[prop]}}});return obj};_.clone=function(obj){if(!_.isObject(obj))return obj;return _.isArray(obj)?obj.slice():_.extend({},obj)};_.tap=function(obj,interceptor){interceptor(obj);return obj};var eq=function(a,b,aStack,bStack){if(a===b)return a!==0||1/a==1/b;if(a==null||b==null)return a===b;if(a instanceof _)a=a._wrapped;if(b instanceof _)b=b._wrapped;var className=toString.call(a);if(className!=toString.call(b))return false;switch(className){case"[object String]":return a==String(b);case"[object Number]":return a!=+a?b!=+b:a==0?1/a==1/b:a==+b;case"[object Date]":case"[object Boolean]":return+a==+b;case"[object RegExp]":return a.source==b.source&&a.global==b.global&&a.multiline==b.multiline&&a.ignoreCase==b.ignoreCase}if(typeof a!="object"||typeof b!="object")return false;var length=aStack.length;while(length--){if(aStack[length]==a)return bStack[length]==b}aStack.push(a);bStack.push(b);var size=0,result=true;if(className=="[object Array]"){size=a.length;result=size==b.length;if(result){while(size--){if(!(result=eq(a[size],b[size],aStack,bStack)))break}}}else{var aCtor=a.constructor,bCtor=b.constructor;if(aCtor!==bCtor&&!(_.isFunction(aCtor)&&aCtor instanceof aCtor&&_.isFunction(bCtor)&&bCtor instanceof bCtor)){return false}for(var key in a){if(_.has(a,key)){size++;if(!(result=_.has(b,key)&&eq(a[key],b[key],aStack,bStack)))break}}if(result){for(key in b){if(_.has(b,key)&&!size--)break}result=!size}}aStack.pop();bStack.pop();return result};_.isEqual=function(a,b){return eq(a,b,[],[])};_.isEmpty=function(obj){if(obj==null)return true;if(_.isArray(obj)||_.isString(obj))return obj.length===0;for(var key in obj)if(_.has(obj,key))return false;return true};_.isElement=function(obj){return!!(obj&&obj.nodeType===1)};_.isArray=nativeIsArray||function(obj){return toString.call(obj)=="[object Array]"};_.isObject=function(obj){return obj===Object(obj)};each(["Arguments","Function","String","Number","Date","RegExp"],function(name){_["is"+name]=function(obj){return toString.call(obj)=="[object "+name+"]"}});if(!_.isArguments(arguments)){_.isArguments=function(obj){return!!(obj&&_.has(obj,"callee"))}}if(typeof/./!=="function"){_.isFunction=function(obj){return typeof obj==="function"}}_.isFinite=function(obj){return isFinite(obj)&&!isNaN(parseFloat(obj))};_.isNaN=function(obj){return _.isNumber(obj)&&obj!=+obj};_.isBoolean=function(obj){return obj===true||obj===false||toString.call(obj)=="[object Boolean]"};_.isNull=function(obj){return obj===null};_.isUndefined=function(obj){return obj===void 0};_.has=function(obj,key){return hasOwnProperty.call(obj,key)};_.noConflict=function(){root._=previousUnderscore;return this};_.identity=function(value){return value};_.times=function(n,iterator,context){var accum=Array(n);for(var i=0;i":">",'"':""","'":"'","/":"/"}};entityMap.unescape=_.invert(entityMap.escape);var entityRegexes={escape:new RegExp("["+_.keys(entityMap.escape).join("")+"]","g"),unescape:new RegExp("("+_.keys(entityMap.unescape).join("|")+")","g")};_.each(["escape","unescape"],function(method){_[method]=function(string){if(string==null)return"";return(""+string).replace(entityRegexes[method],function(match){return entityMap[method][match]})}});_.result=function(object,property){if(object==null)return null;var value=object[property];return _.isFunction(value)?value.call(object):value};_.mixin=function(obj){each(_.functions(obj),function(name){var func=_[name]=obj[name];_.prototype[name]=function(){var args=[this._wrapped];push.apply(args,arguments);return result.call(this,func.apply(_,args))}})};var idCounter=0;_.uniqueId=function(prefix){var id=++idCounter+"";return prefix?prefix+id:id};_.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var noMatch=/(.)^/;var escapes={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"};var escaper=/\\|'|\r|\n|\t|\u2028|\u2029/g;_.template=function(text,data,settings){var render;settings=_.defaults({},settings,_.templateSettings);var matcher=new RegExp([(settings.escape||noMatch).source,(settings.interpolate||noMatch).source,(settings.evaluate||noMatch).source].join("|")+"|$","g");var index=0;var source="__p+='";text.replace(matcher,function(match,escape,interpolate,evaluate,offset){source+=text.slice(index,offset).replace(escaper,function(match){return"\\"+escapes[match]});if(escape){source+="'+\n((__t=("+escape+"))==null?'':_.escape(__t))+\n'"}if(interpolate){source+="'+\n((__t=("+interpolate+"))==null?'':__t)+\n'"}if(evaluate){source+="';\n"+evaluate+"\n__p+='"}index=offset+match.length;return match});source+="';\n";if(!settings.variable)source="with(obj||{}){\n"+source+"}\n";source="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+source+"return __p;\n";try{render=new Function(settings.variable||"obj","_",source)}catch(e){e.source=source;throw e}if(data)return render(data,_);var template=function(data){return render.call(this,data,_)};template.source="function("+(settings.variable||"obj")+"){\n"+source+"}";return template};_.chain=function(obj){return _(obj).chain()};var result=function(obj){return this._chain?_(obj).chain():obj};_.mixin(_);each(["pop","push","reverse","shift","sort","splice","unshift"],function(name){var method=ArrayProto[name];_.prototype[name]=function(){var obj=this._wrapped;method.apply(obj,arguments);if((name=="shift"||name=="splice")&&obj.length===0)delete obj[0];return result.call(this,obj)}});each(["concat","join","slice"],function(name){var method=ArrayProto[name];_.prototype[name]=function(){return result.call(this,method.apply(this._wrapped,arguments))}});_.extend(_.prototype,{chain:function(){this._chain=true;return this},value:function(){return this._wrapped}})}.call(this)}()},{}],21:[function(require,module,exports){window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){window.setTimeout(callback,1e3/60)}}();Leap=require("../lib/index")},{"../lib/index":8}]},{},[21]); /* * Leap Motion integration for Reveal.js. * James Sun [sun16] * Rory Hardy [gneatgeek] */ (function () { var body = document.body, controller = new Leap.Controller({ enableGestures: true }), lastGesture = 0, leapConfig = Reveal.getConfig().leap, pointer = document.createElement( 'div' ), config = { autoCenter : true, // Center pointer around detected position. gestureDelay : 500, // How long to delay between gestures. naturalSwipe : true, // Swipe as if it were a touch screen. pointerColor : '#00aaff', // Default color of the pointer. pointerOpacity : 0.7, // Default opacity of the pointer. pointerSize : 15, // Default minimum height/width of the pointer. pointerTolerance : 120 // Bigger = slower pointer. }, entered, enteredPosition, now, size, tipPosition; // Other vars we need later, but don't need to redeclare. // Merge user defined settings with defaults if( leapConfig ) { for( key in leapConfig ) { config[key] = leapConfig[key]; } } pointer.id = 'leap'; pointer.style.position = 'absolute'; pointer.style.visibility = 'hidden'; pointer.style.zIndex = 50; pointer.style.opacity = config.pointerOpacity; pointer.style.backgroundColor = config.pointerColor; body.appendChild( pointer ); // Leap's loop controller.on( 'frame', function ( frame ) { // Timing code to rate limit gesture execution now = new Date().getTime(); // Pointer: 1 to 2 fingers. Strictly one finger works but may cause innaccuracies. // The innaccuracies were observed on a development model and may not be an issue with consumer models. if( frame.fingers.length > 0 && frame.fingers.length < 3 ) { // Invert direction and multiply by 3 for greater effect. size = -3 * frame.fingers[0].tipPosition[2]; if( size < config.pointerSize ) { size = config.pointerSize; } pointer.style.width = size + 'px'; pointer.style.height = size + 'px'; pointer.style.borderRadius = size - 5 + 'px'; pointer.style.visibility = 'visible'; tipPosition = frame.fingers[0].tipPosition; if( config.autoCenter ) { // Check whether the finger has entered the z range of the Leap Motion. Used for the autoCenter option. if( !entered ) { entered = true; enteredPosition = frame.fingers[0].tipPosition; } pointer.style.top = (-1 * (( tipPosition[1] - enteredPosition[1] ) * body.offsetHeight / config.pointerTolerance )) + ( body.offsetHeight / 2 ) + 'px'; pointer.style.left = (( tipPosition[0] - enteredPosition[0] ) * body.offsetWidth / config.pointerTolerance ) + ( body.offsetWidth / 2 ) + 'px'; } else { pointer.style.top = ( 1 - (( tipPosition[1] - 50) / config.pointerTolerance )) * body.offsetHeight + 'px'; pointer.style.left = ( tipPosition[0] * body.offsetWidth / config.pointerTolerance ) + ( body.offsetWidth / 2 ) + 'px'; } } else { // Hide pointer on exit entered = false; pointer.style.visibility = 'hidden'; } // Gestures if( frame.gestures.length > 0 && (now - lastGesture) > config.gestureDelay ) { var gesture = frame.gestures[0]; // One hand gestures if( frame.hands.length === 1 ) { // Swipe gestures. 3+ fingers. if( frame.fingers.length > 2 && gesture.type === 'swipe' ) { // Define here since some gestures will throw undefined for these. var x = gesture.direction[0], y = gesture.direction[1]; // Left/right swipe gestures if( Math.abs( x ) > Math.abs( y )) { if( x > 0 ) { config.naturalSwipe ? Reveal.left() : Reveal.right(); } else { config.naturalSwipe ? Reveal.right() : Reveal.left(); } } // Up/down swipe gestures else { if( y > 0 ) { config.naturalSwipe ? Reveal.down() : Reveal.up(); } else { config.naturalSwipe ? Reveal.up() : Reveal.down(); } } lastGesture = now; } } // Two hand gestures else if( frame.hands.length === 2 ) { // Upward two hand swipe gesture if( gesture.type === 'swipe' && gesture.direction[1] > 0 ) { Reveal.toggleOverview(); } lastGesture = now; } } }); controller.connect(); })(); ================================================ FILE: presentation/plugin/markdown/example.html ================================================ reveal.js - Markdown Demo
================================================ FILE: presentation/plugin/markdown/example.md ================================================ # Markdown Demo ## External 1.1 Content 1.1 Note: This will only appear in the speaker notes window. ## External 1.2 Content 1.2 ## External 2 Content 2.1 ## External 3.1 Content 3.1 ## External 3.2 Content 3.2 ================================================ FILE: presentation/plugin/markdown/markdown.js ================================================ /** * The reveal.js markdown plugin. Handles parsing of * markdown inside of presentations as well as loading * of external markdown documents. */ (function( root, factory ) { if( typeof exports === 'object' ) { module.exports = factory( require( './marked' ) ); } else { // Browser globals (root is window) root.RevealMarkdown = factory( root.marked ); root.RevealMarkdown.initialize(); } }( this, function( marked ) { if( typeof marked === 'undefined' ) { throw 'The reveal.js Markdown plugin requires marked to be loaded'; } if( typeof hljs !== 'undefined' ) { marked.setOptions({ highlight: function( lang, code ) { return hljs.highlightAuto( lang, code ).value; } }); } var DEFAULT_SLIDE_SEPARATOR = '^\n---\n$', DEFAULT_NOTES_SEPARATOR = 'note:', DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR = '\\\.element\\\s*?(.+?)$', DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR = '\\\.slide:\\\s*?(\\\S.+?)$'; /** * Retrieves the markdown contents of a slide section * element. Normalizes leading tabs/whitespace. */ function getMarkdownFromSlide( section ) { var template = section.querySelector( 'script' ); // strip leading whitespace so it isn't evaluated as code var text = ( template || section ).textContent; var leadingWs = text.match( /^\n?(\s*)/ )[1].length, leadingTabs = text.match( /^\n?(\t*)/ )[1].length; if( leadingTabs > 0 ) { text = text.replace( new RegExp('\\n?\\t{' + leadingTabs + '}','g'), '\n' ); } else if( leadingWs > 1 ) { text = text.replace( new RegExp('\\n? {' + leadingWs + '}'), '\n' ); } return text; } /** * Given a markdown slide section element, this will * return all arguments that aren't related to markdown * parsing. Used to forward any other user-defined arguments * to the output markdown slide. */ function getForwardedAttributes( section ) { var attributes = section.attributes; var result = []; for( var i = 0, len = attributes.length; i < len; i++ ) { var name = attributes[i].name, value = attributes[i].value; // disregard attributes that are used for markdown loading/parsing if( /data\-(markdown|separator|vertical|notes)/gi.test( name ) ) continue; if( value ) { result.push( name + '=' + value ); } else { result.push( name ); } } return result.join( ' ' ); } /** * Inspects the given options and fills out default * values for what's not defined. */ function getSlidifyOptions( options ) { options = options || {}; options.separator = options.separator || DEFAULT_SLIDE_SEPARATOR; options.notesSeparator = options.notesSeparator || DEFAULT_NOTES_SEPARATOR; options.attributes = options.attributes || ''; return options; } /** * Helper function for constructing a markdown slide. */ function createMarkdownSlide( content, options ) { options = getSlidifyOptions( options ); var notesMatch = content.split( new RegExp( options.notesSeparator, 'mgi' ) ); if( notesMatch.length === 2 ) { content = notesMatch[0] + ''; } return ''; } /** * Parses a data string into multiple slides based * on the passed in separator arguments. */ function slidify( markdown, options ) { options = getSlidifyOptions( options ); var separatorRegex = new RegExp( options.separator + ( options.verticalSeparator ? '|' + options.verticalSeparator : '' ), 'mg' ), horizontalSeparatorRegex = new RegExp( options.separator ); var matches, lastIndex = 0, isHorizontal, wasHorizontal = true, content, sectionStack = []; // iterate until all blocks between separators are stacked up while( matches = separatorRegex.exec( markdown ) ) { notes = null; // determine direction (horizontal by default) isHorizontal = horizontalSeparatorRegex.test( matches[0] ); if( !isHorizontal && wasHorizontal ) { // create vertical stack sectionStack.push( [] ); } // pluck slide content from markdown input content = markdown.substring( lastIndex, matches.index ); if( isHorizontal && wasHorizontal ) { // add to horizontal stack sectionStack.push( content ); } else { // add to vertical stack sectionStack[sectionStack.length-1].push( content ); } lastIndex = separatorRegex.lastIndex; wasHorizontal = isHorizontal; } // add the remaining slide ( wasHorizontal ? sectionStack : sectionStack[sectionStack.length-1] ).push( markdown.substring( lastIndex ) ); var markdownSections = ''; // flatten the hierarchical stack, and insert
tags for( var i = 0, len = sectionStack.length; i < len; i++ ) { // vertical if( sectionStack[i] instanceof Array ) { markdownSections += '
'; sectionStack[i].forEach( function( child ) { markdownSections += '
' + createMarkdownSlide( child, options ) + '
'; } ); markdownSections += '
'; } else { markdownSections += '
' + createMarkdownSlide( sectionStack[i], options ) + '
'; } } return markdownSections; } /** * Parses any current data-markdown slides, splits * multi-slide markdown into separate sections and * handles loading of external markdown. */ function processSlides() { var sections = document.querySelectorAll( '[data-markdown]'), section; for( var i = 0, len = sections.length; i < len; i++ ) { section = sections[i]; if( section.getAttribute( 'data-markdown' ).length ) { var xhr = new XMLHttpRequest(), url = section.getAttribute( 'data-markdown' ); datacharset = section.getAttribute( 'data-charset' ); // see https://developer.mozilla.org/en-US/docs/Web/API/element.getAttribute#Notes if( datacharset != null && datacharset != '' ) { xhr.overrideMimeType( 'text/html; charset=' + datacharset ); } xhr.onreadystatechange = function() { if( xhr.readyState === 4 ) { // file protocol yields status code 0 (useful for local debug, mobile applications etc.) if ( ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status === 0 ) { section.outerHTML = slidify( xhr.responseText, { separator: section.getAttribute( 'data-separator' ), verticalSeparator: section.getAttribute( 'data-separator-vertical' ), notesSeparator: section.getAttribute( 'data-separator-notes' ), attributes: getForwardedAttributes( section ) }); } else { section.outerHTML = '
' + 'ERROR: The attempt to fetch ' + url + ' failed with HTTP status ' + xhr.status + '.' + 'Check your browser\'s JavaScript console for more details.' + '

Remember that you need to serve the presentation HTML from a HTTP server.

' + '
'; } } }; xhr.open( 'GET', url, false ); try { xhr.send(); } catch ( e ) { alert( 'Failed to get the Markdown file ' + url + '. Make sure that the presentation and the file are served by a HTTP server and the file can be found there. ' + e ); } } else if( section.getAttribute( 'data-separator' ) || section.getAttribute( 'data-separator-vertical' ) || section.getAttribute( 'data-separator-notes' ) ) { section.outerHTML = slidify( getMarkdownFromSlide( section ), { separator: section.getAttribute( 'data-separator' ), verticalSeparator: section.getAttribute( 'data-separator-vertical' ), notesSeparator: section.getAttribute( 'data-separator-notes' ), attributes: getForwardedAttributes( section ) }); } else { section.innerHTML = createMarkdownSlide( getMarkdownFromSlide( section ) ); } } } /** * Check if a node value has the attributes pattern. * If yes, extract it and add that value as one or several attributes * the the terget element. * * You need Cache Killer on Chrome to see the effect on any FOM transformation * directly on refresh (F5) * http://stackoverflow.com/questions/5690269/disabling-chrome-cache-for-website-development/7000899#answer-11786277 */ function addAttributeInElement( node, elementTarget, separator ) { var mardownClassesInElementsRegex = new RegExp( separator, 'mg' ); var mardownClassRegex = new RegExp( "([^\"= ]+?)=\"([^\"=]+?)\"", 'mg' ); var nodeValue = node.nodeValue; if( matches = mardownClassesInElementsRegex.exec( nodeValue ) ) { var classes = matches[1]; nodeValue = nodeValue.substring( 0, matches.index ) + nodeValue.substring( mardownClassesInElementsRegex.lastIndex ); node.nodeValue = nodeValue; while( matchesClass = mardownClassRegex.exec( classes ) ) { elementTarget.setAttribute( matchesClass[1], matchesClass[2] ); } return true; } return false; } /** * Add attributes to the parent element of a text node, * or the element of an attribute node. */ function addAttributes( section, element, previousElement, separatorElementAttributes, separatorSectionAttributes ) { if ( element != null && element.childNodes != undefined && element.childNodes.length > 0 ) { previousParentElement = element; for( var i = 0; i < element.childNodes.length; i++ ) { childElement = element.childNodes[i]; if ( i > 0 ) { j = i - 1; while ( j >= 0 ) { aPreviousChildElement = element.childNodes[j]; if ( typeof aPreviousChildElement.setAttribute == 'function' && aPreviousChildElement.tagName != "BR" ) { previousParentElement = aPreviousChildElement; break; } j = j - 1; } } parentSection = section; if( childElement.nodeName == "section" ) { parentSection = childElement ; previousParentElement = childElement ; } if ( typeof childElement.setAttribute == 'function' || childElement.nodeType == Node.COMMENT_NODE ) { addAttributes( parentSection, childElement, previousParentElement, separatorElementAttributes, separatorSectionAttributes ); } } } if ( element.nodeType == Node.COMMENT_NODE ) { if ( addAttributeInElement( element, previousElement, separatorElementAttributes ) == false ) { addAttributeInElement( element, section, separatorSectionAttributes ); } } } /** * Converts any current data-markdown slides in the * DOM to HTML. */ function convertSlides() { var sections = document.querySelectorAll( '[data-markdown]'); for( var i = 0, len = sections.length; i < len; i++ ) { var section = sections[i]; // Only parse the same slide once if( !section.getAttribute( 'data-markdown-parsed' ) ) { section.setAttribute( 'data-markdown-parsed', true ) var notes = section.querySelector( 'aside.notes' ); var markdown = getMarkdownFromSlide( section ); section.innerHTML = marked( markdown ); addAttributes( section, section, null, section.getAttribute( 'data-element-attributes' ) || section.parentNode.getAttribute( 'data-element-attributes' ) || DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR, section.getAttribute( 'data-attributes' ) || section.parentNode.getAttribute( 'data-attributes' ) || DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR); // If there were notes, we need to re-add them after // having overwritten the section's HTML if( notes ) { section.appendChild( notes ); } } } } // API return { initialize: function() { processSlides(); convertSlides(); }, // TODO: Do these belong in the API? processSlides: processSlides, convertSlides: convertSlides, slidify: slidify }; })); ================================================ FILE: presentation/plugin/markdown/marked.js ================================================ /** * marked - a markdown parser * Copyright (c) 2011-2013, Christopher Jeffrey. (MIT Licensed) * https://github.com/chjj/marked */ (function(){var block={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:noop,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:noop,lheading:/^([^\n]+)\n *(=|-){3,} *\n*/,blockquote:/^( *>[^\n]+(\n[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment|closed|closing) *(?:\n{2,}|\s*$)/,def:/^ *\[([^\]]+)\]: *]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:noop,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/, text:/^[^\n]+/};block.bullet=/(?:[*+-]|\d+\.)/;block.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;block.item=replace(block.item,"gm")(/bull/g,block.bullet)();block.list=replace(block.list)(/bull/g,block.bullet)("hr",/\n+(?=(?: *[-*_]){3,} *(?:\n+|$))/)();block._tag="(?!(?:"+"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code"+"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo"+"|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|@)\\b";block.html=replace(block.html)("comment",/\x3c!--[\s\S]*?--\x3e/)("closed", /<(tag)[\s\S]+?<\/\1>/)("closing",/])*?>/)(/tag/g,block._tag)();block.paragraph=replace(block.paragraph)("hr",block.hr)("heading",block.heading)("lheading",block.lheading)("blockquote",block.blockquote)("tag","<"+block._tag)("def",block.def)();block.normal=merge({},block);block.gfm=merge({},block.normal,{fences:/^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,paragraph:/^/});block.gfm.paragraph=replace(block.paragraph)("(?!","(?!"+block.gfm.fences.source.replace("\\1", "\\2")+"|")();block.tables=merge({},block.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/});function Lexer(options){this.tokens=[];this.tokens.links={};this.options=options||marked.defaults;this.rules=block.normal;if(this.options.gfm)if(this.options.tables)this.rules=block.tables;else this.rules=block.gfm}Lexer.rules=block;Lexer.lex=function(src,options){var lexer=new Lexer(options);return lexer.lex(src)}; Lexer.prototype.lex=function(src){src=src.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n");return this.token(src,true)};Lexer.prototype.token=function(src,top){var src=src.replace(/^ +$/gm,""),next,loose,cap,bull,b,item,space,i,l;while(src){if(cap=this.rules.newline.exec(src)){src=src.substring(cap[0].length);if(cap[0].length>1)this.tokens.push({type:"space"})}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);cap=cap[0].replace(/^ {4}/gm, "");this.tokens.push({type:"code",text:!this.options.pedantic?cap.replace(/\n+$/,""):cap});continue}if(cap=this.rules.fences.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"code",lang:cap[2],text:cap[3]});continue}if(cap=this.rules.heading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[1].length,text:cap[2]});continue}if(top&&(cap=this.rules.nptable.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g, "").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/\n$/,"").split("\n")};for(i=0;i ?/gm,"");this.token(cap,top);this.tokens.push({type:"blockquote_end"});continue}if(cap=this.rules.list.exec(src)){src=src.substring(cap[0].length); bull=cap[2];this.tokens.push({type:"list_start",ordered:bull.length>1});cap=cap[0].match(this.rules.item);next=false;l=cap.length;i=0;for(;i1&&b.length>1)){src=cap.slice(i+ 1).join("\n")+src;i=l-1}}loose=next||/\n\n(?!\s*$)/.test(item);if(i!==l-1){next=item[item.length-1]==="\n";if(!loose)loose=next}this.tokens.push({type:loose?"loose_item_start":"list_item_start"});this.token(item,false);this.tokens.push({type:"list_item_end"})}this.tokens.push({type:"list_end"});continue}if(cap=this.rules.html.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:cap[1]==="pre"||cap[1]==="script",text:cap[0]});continue}if(top&& (cap=this.rules.def.exec(src))){src=src.substring(cap[0].length);this.tokens.links[cap[1].toLowerCase()]={href:cap[2],title:cap[3]};continue}if(top&&(cap=this.rules.table.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/(?: *\| *)?\n$/,"").split("\n")};for(i=0;i])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:noop,tag:/^\x3c!--[\s\S]*?--\x3e|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/, code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:noop,text:/^[\s\S]+?(?=[\\?(?:\s+['"]([\s\S]*?)['"])?\s*/;inline.link=replace(inline.link)("inside",inline._inside)("href",inline._href)();inline.reflink=replace(inline.reflink)("inside",inline._inside)();inline.normal=merge({},inline);inline.pedantic=merge({},inline.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/, em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/});inline.gfm=merge({},inline.normal,{escape:replace(inline.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:replace(inline.text)("]|","~]|")("|","|https?://|")()});inline.breaks=merge({},inline.gfm,{br:replace(inline.br)("{2,}","*")(),text:replace(inline.gfm.text)("{2,}","*")()});function InlineLexer(links,options){this.options=options||marked.defaults;this.links=links;this.rules=inline.normal; if(!this.links)throw new Error("Tokens array requires a `links` property.");if(this.options.gfm)if(this.options.breaks)this.rules=inline.breaks;else this.rules=inline.gfm;else if(this.options.pedantic)this.rules=inline.pedantic}InlineLexer.rules=inline;InlineLexer.output=function(src,links,options){var inline=new InlineLexer(links,options);return inline.output(src)};InlineLexer.prototype.output=function(src){var out="",link,text,href,cap;while(src){if(cap=this.rules.escape.exec(src)){src=src.substring(cap[0].length); out+=cap[1];continue}if(cap=this.rules.autolink.exec(src)){src=src.substring(cap[0].length);if(cap[2]==="@"){text=cap[1][6]===":"?this.mangle(cap[1].substring(7)):this.mangle(cap[1]);href=this.mangle("mailto:")+text}else{text=escape(cap[1]);href=text}out+=''+text+"";continue}if(cap=this.rules.url.exec(src)){src=src.substring(cap[0].length);text=escape(cap[1]);href=text;out+=''+text+"";continue}if(cap=this.rules.tag.exec(src)){src=src.substring(cap[0].length); out+=this.options.sanitize?escape(cap[0]):cap[0];continue}if(cap=this.rules.link.exec(src)){src=src.substring(cap[0].length);out+=this.outputLink(cap,{href:cap[2],title:cap[3]});continue}if((cap=this.rules.reflink.exec(src))||(cap=this.rules.nolink.exec(src))){src=src.substring(cap[0].length);link=(cap[2]||cap[1]).replace(/\s+/g," ");link=this.links[link.toLowerCase()];if(!link||!link.href){out+=cap[0][0];src=cap[0].substring(1)+src;continue}out+=this.outputLink(cap,link);continue}if(cap=this.rules.strong.exec(src)){src= src.substring(cap[0].length);out+=""+this.output(cap[2]||cap[1])+"";continue}if(cap=this.rules.em.exec(src)){src=src.substring(cap[0].length);out+=""+this.output(cap[2]||cap[1])+"";continue}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);out+=""+escape(cap[2],true)+"";continue}if(cap=this.rules.br.exec(src)){src=src.substring(cap[0].length);out+="
";continue}if(cap=this.rules.del.exec(src)){src=src.substring(cap[0].length);out+=""+ this.output(cap[1])+"";continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);out+=escape(cap[0]);continue}if(src)throw new Error("Infinite loop on byte: "+src.charCodeAt(0));}return out};InlineLexer.prototype.outputLink=function(cap,link){if(cap[0][0]!=="!")return'"+this.output(cap[1])+"";else return''+escape(cap[1])+'"};InlineLexer.prototype.smartypants=function(text){if(!this.options.smartypants)return text;return text.replace(/--/g,"\u2014").replace(/'([^']*)'/g,"\u2018$1\u2019").replace(/"([^"]*)"/g,"\u201c$1\u201d").replace(/\.{3}/g,"\u2026")};InlineLexer.prototype.mangle=function(text){var out="",l=text.length,i=0,ch;for(;i0.5)ch="x"+ch.toString(16);out+="&#"+ch+";"}return out};function Parser(options){this.tokens=[];this.token=null; this.options=options||marked.defaults}Parser.parse=function(src,options){var parser=new Parser(options);return parser.parse(src)};Parser.prototype.parse=function(src){this.inline=new InlineLexer(src.links,this.options);this.tokens=src.reverse();var out="";while(this.next())out+=this.tok();return out};Parser.prototype.next=function(){return this.token=this.tokens.pop()};Parser.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};Parser.prototype.parseText=function(){var body=this.token.text; while(this.peek().type==="text")body+="\n"+this.next().text;return this.inline.output(body)};Parser.prototype.tok=function(){switch(this.token.type){case "space":return"";case "hr":return"
\n";case "heading":return""+this.inline.output(this.token.text)+"\n";case "code":if(this.options.highlight){var code=this.options.highlight(this.token.text,this.token.lang);if(code!=null&&code!==this.token.text){this.token.escaped=true;this.token.text=code}}if(!this.token.escaped)this.token.text= escape(this.token.text,true);return"
"+this.token.text+"
\n";case "table":var body="",heading,i,row,cell,j;body+="\n\n";for(i=0;i'+heading+"\n":""+heading+"\n"}body+="\n\n";body+="\n";for(i=0;i'+cell+"\n":""+cell+"\n"}body+="\n"}body+="\n";return"\n"+body+"
\n";case "blockquote_start":var body="";while(this.next().type!=="blockquote_end")body+=this.tok();return"
\n"+body+"
\n";case "list_start":var type=this.token.ordered?"ol":"ul",body="";while(this.next().type!=="list_end")body+= this.tok();return"<"+type+">\n"+body+"\n";case "list_item_start":var body="";while(this.next().type!=="list_item_end")body+=this.token.type==="text"?this.parseText():this.tok();return"
  • "+body+"
  • \n";case "loose_item_start":var body="";while(this.next().type!=="list_item_end")body+=this.tok();return"
  • "+body+"
  • \n";case "html":return!this.token.pre&&!this.options.pedantic?this.inline.output(this.token.text):this.token.text;case "paragraph":return"

    "+this.inline.output(this.token.text)+ "

    \n";case "text":return"

    "+this.parseText()+"

    \n"}};function escape(html,encode){return html.replace(!encode?/&(?!#?\w+;)/g:/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function replace(regex,opt){regex=regex.source;opt=opt||"";return function self(name,val){if(!name)return new RegExp(regex,opt);val=val.source||val;val=val.replace(/(^|[^\[])\^/g,"$1");regex=regex.replace(name,val);return self}}function noop(){}noop.exec=noop;function merge(obj){var i= 1,target,key;for(;iAn error occured:

    "+escape(e.message+"",true)+"
    ";throw e;}}marked.options=marked.setOptions=function(opt){merge(marked.defaults,opt);return marked};marked.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,smartLists:false,silent:false,highlight:null,langPrefix:""};marked.Parser=Parser;marked.parser=Parser.parse;marked.Lexer=Lexer;marked.lexer=Lexer.lex;marked.InlineLexer=InlineLexer;marked.inlineLexer=InlineLexer.output; marked.parse=marked;if(typeof exports==="object")module.exports=marked;else if(typeof define==="function"&&define.amd)define(function(){return marked});else this.marked=marked}).call(function(){return this||(typeof window!=="undefined"?window:global)}()); ================================================ FILE: presentation/plugin/math/math.js ================================================ /** * A plugin which enables rendering of math equations inside * of reveal.js slides. Essentially a thin wrapper for MathJax. * * @author Hakim El Hattab */ var RevealMath = window.RevealMath || (function(){ var options = Reveal.getConfig().math || {}; options.mathjax = options.mathjax || 'http://cdn.mathjax.org/mathjax/latest/MathJax.js'; options.config = options.config || 'TeX-AMS_HTML-full'; loadScript( options.mathjax + '?config=' + options.config, function() { MathJax.Hub.Config({ messageStyle: 'none', tex2jax: { inlineMath: [['$','$'],['\\(','\\)']] }, skipStartupTypeset: true }); // Typeset followed by an immediate reveal.js layout since // the typesetting process could affect slide height MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub ] ); MathJax.Hub.Queue( Reveal.layout ); // Reprocess equations in slides when they turn visible Reveal.addEventListener( 'slidechanged', function( event ) { MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub, event.currentSlide ] ); } ); } ); function loadScript( url, callback ) { var head = document.querySelector( 'head' ); var script = document.createElement( 'script' ); script.type = 'text/javascript'; script.src = url; // Wrapper for callback to make sure it only fires once var finish = function() { if( typeof callback === 'function' ) { callback.call(); callback = null; } } script.onload = finish; // IE script.onreadystatechange = function() { if ( this.readyState === 'loaded' ) { finish(); } } // Normal browsers head.appendChild( script ); } })(); ================================================ FILE: presentation/plugin/multiplex/client.js ================================================ (function() { var multiplex = Reveal.getConfig().multiplex; var socketId = multiplex.id; var socket = io.connect(multiplex.url); socket.on(multiplex.id, function(data) { // ignore data from sockets that aren't ours if (data.socketId !== socketId) { return; } if( window.location.host === 'localhost:1947' ) return; Reveal.slide(data.indexh, data.indexv, data.indexf, 'remote'); }); }()); ================================================ FILE: presentation/plugin/multiplex/index.js ================================================ var express = require('express'); var fs = require('fs'); var io = require('socket.io'); var crypto = require('crypto'); var app = express.createServer(); var staticDir = express.static; io = io.listen(app); var opts = { port: 1948, baseDir : __dirname + '/../../' }; io.sockets.on('connection', function(socket) { socket.on('slidechanged', function(slideData) { if (typeof slideData.secret == 'undefined' || slideData.secret == null || slideData.secret === '') return; if (createHash(slideData.secret) === slideData.socketId) { slideData.secret = null; socket.broadcast.emit(slideData.socketId, slideData); }; }); }); app.configure(function() { [ 'css', 'js', 'plugin', 'lib' ].forEach(function(dir) { app.use('/' + dir, staticDir(opts.baseDir + dir)); }); }); app.get("/", function(req, res) { res.writeHead(200, {'Content-Type': 'text/html'}); fs.createReadStream(opts.baseDir + '/index.html').pipe(res); }); app.get("/token", function(req,res) { var ts = new Date().getTime(); var rand = Math.floor(Math.random()*9999999); var secret = ts.toString() + rand.toString(); res.send({secret: secret, socketId: createHash(secret)}); }); var createHash = function(secret) { var cipher = crypto.createCipher('blowfish', secret); return(cipher.final('hex')); }; // Actually listen app.listen(opts.port || null); var brown = '\033[33m', green = '\033[32m', reset = '\033[0m'; console.log( brown + "reveal.js:" + reset + " Multiplex running on port " + green + opts.port + reset ); ================================================ FILE: presentation/plugin/multiplex/master.js ================================================ (function() { // Don't emit events from inside of notes windows if ( window.location.search.match( /receiver/gi ) ) { return; } var multiplex = Reveal.getConfig().multiplex; var socket = io.connect(multiplex.url); var notify = function( slideElement, indexh, indexv, origin ) { if( typeof origin === 'undefined' && origin !== 'remote' ) { var nextindexh; var nextindexv; var fragmentindex = Reveal.getIndices().f; if (typeof fragmentindex == 'undefined') { fragmentindex = 0; } if (slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION') { nextindexh = indexh; nextindexv = indexv + 1; } else { nextindexh = indexh + 1; nextindexv = 0; } var slideData = { indexh : indexh, indexv : indexv, indexf : fragmentindex, nextindexh : nextindexh, nextindexv : nextindexv, secret: multiplex.secret, socketId : multiplex.id }; socket.emit('slidechanged', slideData); } } Reveal.addEventListener( 'slidechanged', function( event ) { notify( event.currentSlide, event.indexh, event.indexv, event.origin ); } ); var fragmentNotify = function( event ) { notify( Reveal.getCurrentSlide(), Reveal.getIndices().h, Reveal.getIndices().v, event.origin ); }; Reveal.addEventListener( 'fragmentshown', fragmentNotify ); Reveal.addEventListener( 'fragmenthidden', fragmentNotify ); }()); ================================================ FILE: presentation/plugin/notes/notes.html ================================================ reveal.js - Slide Notes
    UPCOMING:

    Time Click to Reset

    0:00 AM
    00:00:00
    ================================================ FILE: presentation/plugin/notes/notes.js ================================================ /** * Handles opening of and synchronization with the reveal.js * notes window. * * Handshake process: * 1. This window posts 'connect' to notes window * - Includes URL of presentation to show * 2. Notes window responds with 'connected' when it is available * 3. This window proceeds to send the current presentation state * to the notes window */ var RevealNotes = (function() { function openNotes() { var jsFileLocation = document.querySelector('script[src$="notes.js"]').src; // this js file path jsFileLocation = jsFileLocation.replace(/notes\.js(\?.*)?$/, ''); // the js folder path var notesPopup = window.open( jsFileLocation + 'notes.html', 'reveal.js - Notes', 'width=1100,height=700' ); /** * Connect to the notes window through a postmessage handshake. * Using postmessage enables us to work in situations where the * origins differ, such as a presentation being opened from the * file system. */ function connect() { // Keep trying to connect until we get a 'connected' message back var connectInterval = setInterval( function() { notesPopup.postMessage( JSON.stringify( { namespace: 'reveal-notes', type: 'connect', url: window.location.protocol + '//' + window.location.host + window.location.pathname, state: Reveal.getState() } ), '*' ); }, 500 ); window.addEventListener( 'message', function( event ) { var data = JSON.parse( event.data ); if( data && data.namespace === 'reveal-notes' && data.type === 'connected' ) { clearInterval( connectInterval ); onConnected(); } } ); } /** * Posts the current slide data to the notes window */ function post() { var slideElement = Reveal.getCurrentSlide(), notesElement = slideElement.querySelector( 'aside.notes' ); var messageData = { namespace: 'reveal-notes', type: 'state', notes: '', markdown: false, state: Reveal.getState() }; // Look for notes defined in a slide attribute if( slideElement.hasAttribute( 'data-notes' ) ) { messageData.notes = slideElement.getAttribute( 'data-notes' ); } // Look for notes defined in an aside element if( notesElement ) { messageData.notes = notesElement.innerHTML; messageData.markdown = typeof notesElement.getAttribute( 'data-markdown' ) === 'string'; } notesPopup.postMessage( JSON.stringify( messageData ), '*' ); } /** * Called once we have established a connection to the notes * window. */ function onConnected() { // Monitor events that trigger a change in state Reveal.addEventListener( 'slidechanged', post ); Reveal.addEventListener( 'fragmentshown', post ); Reveal.addEventListener( 'fragmenthidden', post ); Reveal.addEventListener( 'overviewhidden', post ); Reveal.addEventListener( 'overviewshown', post ); Reveal.addEventListener( 'paused', post ); Reveal.addEventListener( 'resumed', post ); // Post the initial state post(); } connect(); } if( !/receiver/i.test( window.location.search ) ) { // If the there's a 'notes' query set, open directly if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) { openNotes(); } // Open the notes when the 's' key is hit document.addEventListener( 'keydown', function( event ) { // Disregard the event if the target is editable or a // modifier is present if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return; if( event.keyCode === 83 ) { event.preventDefault(); openNotes(); } }, false ); } return { open: openNotes }; })(); ================================================ FILE: presentation/plugin/notes-server/client.js ================================================ (function() { // don't emit events from inside the previews themselves if( window.location.search.match( /receiver/gi ) ) { return; } var socket = io.connect( window.location.origin ), socketId = Math.random().toString().slice( 2 ); console.log( 'View slide notes at ' + window.location.origin + '/notes/' + socketId ); window.open( window.location.origin + '/notes/' + socketId, 'notes-' + socketId ); /** * Posts the current slide data to the notes window */ function post() { var slideElement = Reveal.getCurrentSlide(), notesElement = slideElement.querySelector( 'aside.notes' ); var messageData = { notes: '', markdown: false, socketId: socketId, state: Reveal.getState() }; // Look for notes defined in a slide attribute if( slideElement.hasAttribute( 'data-notes' ) ) { messageData.notes = slideElement.getAttribute( 'data-notes' ); } // Look for notes defined in an aside element if( notesElement ) { messageData.notes = notesElement.innerHTML; messageData.markdown = typeof notesElement.getAttribute( 'data-markdown' ) === 'string'; } socket.emit( 'statechanged', messageData ); } // When a new notes window connects, post our current state socket.on( 'connect', function( data ) { post(); } ); // Monitor events that trigger a change in state Reveal.addEventListener( 'slidechanged', post ); Reveal.addEventListener( 'fragmentshown', post ); Reveal.addEventListener( 'fragmenthidden', post ); Reveal.addEventListener( 'overviewhidden', post ); Reveal.addEventListener( 'overviewshown', post ); Reveal.addEventListener( 'paused', post ); Reveal.addEventListener( 'resumed', post ); // Post the initial state post(); }()); ================================================ FILE: presentation/plugin/notes-server/index.js ================================================ var express = require('express'); var fs = require('fs'); var io = require('socket.io'); var _ = require('underscore'); var Mustache = require('mustache'); var app = express.createServer(); var staticDir = express.static; io = io.listen(app); var opts = { port : 1947, baseDir : __dirname + '/../../' }; io.sockets.on( 'connection', function( socket ) { socket.on( 'connect', function( data ) { socket.broadcast.emit( 'connect', data ); }); socket.on( 'statechanged', function( data ) { socket.broadcast.emit( 'statechanged', data ); }); }); app.configure( function() { [ 'css', 'js', 'images', 'plugin', 'lib' ].forEach( function( dir ) { app.use( '/' + dir, staticDir( opts.baseDir + dir ) ); }); }); app.get('/', function( req, res ) { res.writeHead( 200, { 'Content-Type': 'text/html' } ); fs.createReadStream( opts.baseDir + '/index.html' ).pipe( res ); }); app.get( '/notes/:socketId', function( req, res ) { fs.readFile( opts.baseDir + 'plugin/notes-server/notes.html', function( err, data ) { res.send( Mustache.to_html( data.toString(), { socketId : req.params.socketId })); }); }); // Actually listen app.listen( opts.port || null ); var brown = '\033[33m', green = '\033[32m', reset = '\033[0m'; var slidesLocation = 'http://localhost' + ( opts.port ? ( ':' + opts.port ) : '' ); console.log( brown + 'reveal.js - Speaker Notes' + reset ); console.log( '1. Open the slides at ' + green + slidesLocation + reset ); console.log( '2. Click on the link your JS console to go to the notes page' ); console.log( '3. Advance through your slides and your notes will advance automatically' ); ================================================ FILE: presentation/plugin/notes-server/notes.html ================================================ reveal.js - Slide Notes
    UPCOMING:

    Time Click to Reset

    0:00 AM
    00:00:00
    ================================================ FILE: presentation/plugin/print-pdf/print-pdf.js ================================================ /** * phantomjs script for printing presentations to PDF. * * Example: * phantomjs print-pdf.js "http://lab.hakim.se/reveal-js?print-pdf" reveal-demo.pdf * * By Manuel Bieh (https://github.com/manuelbieh) */ // html2pdf.js var page = new WebPage(); var system = require( 'system' ); var slideWidth = system.args[3] ? system.args[3].split( 'x' )[0] : 960; var slideHeight = system.args[3] ? system.args[3].split( 'x' )[1] : 700; page.viewportSize = { width: slideWidth, height: slideHeight }; // TODO // Something is wrong with these config values. An input // paper width of 1920px actually results in a 756px wide // PDF. page.paperSize = { width: Math.round( slideWidth * 2 ), height: Math.round( slideHeight * 2 ), border: 0 }; var inputFile = system.args[1] || 'index.html?print-pdf'; var outputFile = system.args[2] || 'slides.pdf'; if( outputFile.match( /\.pdf$/gi ) === null ) { outputFile += '.pdf'; } console.log( 'Printing PDF (Paper size: '+ page.paperSize.width + 'x' + page.paperSize.height +')' ); page.open( inputFile, function( status ) { window.setTimeout( function() { console.log( 'Printed succesfully' ); page.render( outputFile ); phantom.exit(); }, 1000 ); } ); ================================================ FILE: presentation/plugin/remotes/remotes.js ================================================ /** * Touch-based remote controller for your presentation courtesy * of the folks at http://remotes.io */ (function(window){ /** * Detects if we are dealing with a touch enabled device (with some false positives) * Borrowed from modernizr: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touch.js */ var hasTouch = (function(){ return ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch; })(); /** * Detects if notes are enable and the current page is opened inside an /iframe * this prevents loading Remotes.io several times */ var isNotesAndIframe = (function(){ return window.RevealNotes && !(self == top); })(); if(!hasTouch && !isNotesAndIframe){ head.ready( 'remotes.ne.min.js', function() { new Remotes("preview") .on("swipe-left", function(e){ Reveal.right(); }) .on("swipe-right", function(e){ Reveal.left(); }) .on("swipe-up", function(e){ Reveal.down(); }) .on("swipe-down", function(e){ Reveal.up(); }) .on("tap", function(e){ Reveal.next(); }) .on("zoom-out", function(e){ Reveal.toggleOverview(true); }) .on("zoom-in", function(e){ Reveal.toggleOverview(false); }) ; } ); head.js('https://hakim-static.s3.amazonaws.com/reveal-js/remotes.ne.min.js'); } })(window); ================================================ FILE: presentation/plugin/search/search.js ================================================ /* * Handles finding a text string anywhere in the slides and showing the next occurrence to the user * by navigatating to that slide and highlighting it. * * By Jon Snyder , February 2013 */ var RevealSearch = (function() { var matchedSlides; var currentMatchedIndex; var searchboxDirty; var myHilitor; // Original JavaScript code by Chirp Internet: www.chirp.com.au // Please acknowledge use of this code by including this header. // 2/2013 jon: modified regex to display any match, not restricted to word boundaries. function Hilitor(id, tag) { var targetNode = document.getElementById(id) || document.body; var hiliteTag = tag || "EM"; var skipTags = new RegExp("^(?:" + hiliteTag + "|SCRIPT|FORM|SPAN)$"); var colors = ["#ff6", "#a0ffff", "#9f9", "#f99", "#f6f"]; var wordColor = []; var colorIdx = 0; var matchRegex = ""; var matchingSlides = []; this.setRegex = function(input) { input = input.replace(/^[^\w]+|[^\w]+$/g, "").replace(/[^\w'-]+/g, "|"); matchRegex = new RegExp("(" + input + ")","i"); } this.getRegex = function() { return matchRegex.toString().replace(/^\/\\b\(|\)\\b\/i$/g, "").replace(/\|/g, " "); } // recursively apply word highlighting this.hiliteWords = function(node) { if(node == undefined || !node) return; if(!matchRegex) return; if(skipTags.test(node.nodeName)) return; if(node.hasChildNodes()) { for(var i=0; i < node.childNodes.length; i++) this.hiliteWords(node.childNodes[i]); } if(node.nodeType == 3) { // NODE_TEXT if((nv = node.nodeValue) && (regs = matchRegex.exec(nv))) { //find the slide's section element and save it in our list of matching slides var secnode = node.parentNode; while (secnode.nodeName != 'SECTION') { secnode = secnode.parentNode; } var slideIndex = Reveal.getIndices(secnode); var slidelen = matchingSlides.length; var alreadyAdded = false; for (var i=0; i < slidelen; i++) { if ( (matchingSlides[i].h === slideIndex.h) && (matchingSlides[i].v === slideIndex.v) ) { alreadyAdded = true; } } if (! alreadyAdded) { matchingSlides.push(slideIndex); } if(!wordColor[regs[0].toLowerCase()]) { wordColor[regs[0].toLowerCase()] = colors[colorIdx++ % colors.length]; } var match = document.createElement(hiliteTag); match.appendChild(document.createTextNode(regs[0])); match.style.backgroundColor = wordColor[regs[0].toLowerCase()]; match.style.fontStyle = "inherit"; match.style.color = "#000"; var after = node.splitText(regs.index); after.nodeValue = after.nodeValue.substring(regs[0].length); node.parentNode.insertBefore(match, after); } } }; // remove highlighting this.remove = function() { var arr = document.getElementsByTagName(hiliteTag); while(arr.length && (el = arr[0])) { el.parentNode.replaceChild(el.firstChild, el); } }; // start highlighting at target node this.apply = function(input) { if(input == undefined || !input) return; this.remove(); this.setRegex(input); this.hiliteWords(targetNode); return matchingSlides; }; } function openSearch() { //ensure the search term input dialog is visible and has focus: var inputbox = document.getElementById("searchinput"); inputbox.style.display = "inline"; inputbox.focus(); inputbox.select(); } function toggleSearch() { var inputbox = document.getElementById("searchinput"); if (inputbox.style.display !== "inline") { openSearch(); } else { inputbox.style.display = "none"; myHilitor.remove(); } } function doSearch() { //if there's been a change in the search term, perform a new search: if (searchboxDirty) { var searchstring = document.getElementById("searchinput").value; //find the keyword amongst the slides myHilitor = new Hilitor("slidecontent"); matchedSlides = myHilitor.apply(searchstring); currentMatchedIndex = 0; } //navigate to the next slide that has the keyword, wrapping to the first if necessary if (matchedSlides.length && (matchedSlides.length <= currentMatchedIndex)) { currentMatchedIndex = 0; } if (matchedSlides.length > currentMatchedIndex) { Reveal.slide(matchedSlides[currentMatchedIndex].h, matchedSlides[currentMatchedIndex].v); currentMatchedIndex++; } } var dom = {}; dom.wrapper = document.querySelector( '.reveal' ); if( !dom.wrapper.querySelector( '.searchbox' ) ) { var searchElement = document.createElement( 'div' ); searchElement.id = "searchinputdiv"; searchElement.classList.add( 'searchdiv' ); searchElement.style.position = 'absolute'; searchElement.style.top = '10px'; searchElement.style.left = '10px'; //embedded base64 search icon Designed by Sketchdock - http://www.sketchdock.com/: searchElement.innerHTML = ''; dom.wrapper.appendChild( searchElement ); } document.getElementById("searchbutton").addEventListener( 'click', function(event) { doSearch(); }, false ); document.getElementById("searchinput").addEventListener( 'keyup', function( event ) { switch (event.keyCode) { case 13: event.preventDefault(); doSearch(); searchboxDirty = false; break; default: searchboxDirty = true; } }, false ); // Open the search when the 's' key is hit (yes, this conflicts with the notes plugin, disabling for now) /* document.addEventListener( 'keydown', function( event ) { // Disregard the event if the target is editable or a // modifier is present if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return; if( event.keyCode === 83 ) { event.preventDefault(); openSearch(); } }, false ); */ return { open: openSearch }; })(); ================================================ FILE: presentation/plugin/zoom-js/zoom.js ================================================ // Custom reveal.js integration (function(){ var isEnabled = true; document.querySelector( '.reveal' ).addEventListener( 'mousedown', function( event ) { var modifier = ( Reveal.getConfig().zoomKey ? Reveal.getConfig().zoomKey : 'alt' ) + 'Key'; var zoomPadding = 20; var revealScale = Reveal.getScale(); if( event[ modifier ] && isEnabled ) { event.preventDefault(); var bounds = event.target.getBoundingClientRect(); zoom.to({ x: ( bounds.left * revealScale ) - zoomPadding, y: ( bounds.top * revealScale ) - zoomPadding, width: ( bounds.width * revealScale ) + ( zoomPadding * 2 ), height: ( bounds.height * revealScale ) + ( zoomPadding * 2 ), pan: false }); } } ); Reveal.addEventListener( 'overviewshown', function() { isEnabled = false; } ); Reveal.addEventListener( 'overviewhidden', function() { isEnabled = true; } ); })(); /*! * zoom.js 0.3 (modified for use with reveal.js) * http://lab.hakim.se/zoom-js * MIT licensed * * Copyright (C) 2011-2014 Hakim El Hattab, http://hakim.se */ var zoom = (function(){ // The current zoom level (scale) var level = 1; // The current mouse position, used for panning var mouseX = 0, mouseY = 0; // Timeout before pan is activated var panEngageTimeout = -1, panUpdateInterval = -1; // Check for transform support so that we can fallback otherwise var supportsTransforms = 'WebkitTransform' in document.body.style || 'MozTransform' in document.body.style || 'msTransform' in document.body.style || 'OTransform' in document.body.style || 'transform' in document.body.style; if( supportsTransforms ) { // The easing that will be applied when we zoom in/out document.body.style.transition = 'transform 0.8s ease'; document.body.style.OTransition = '-o-transform 0.8s ease'; document.body.style.msTransition = '-ms-transform 0.8s ease'; document.body.style.MozTransition = '-moz-transform 0.8s ease'; document.body.style.WebkitTransition = '-webkit-transform 0.8s ease'; } // Zoom out if the user hits escape document.addEventListener( 'keyup', function( event ) { if( level !== 1 && event.keyCode === 27 ) { zoom.out(); } } ); // Monitor mouse movement for panning document.addEventListener( 'mousemove', function( event ) { if( level !== 1 ) { mouseX = event.clientX; mouseY = event.clientY; } } ); /** * Applies the CSS required to zoom in, prefers the use of CSS3 * transforms but falls back on zoom for IE. * * @param {Object} rect * @param {Number} scale */ function magnify( rect, scale ) { var scrollOffset = getScrollOffset(); // Ensure a width/height is set rect.width = rect.width || 1; rect.height = rect.height || 1; // Center the rect within the zoomed viewport rect.x -= ( window.innerWidth - ( rect.width * scale ) ) / 2; rect.y -= ( window.innerHeight - ( rect.height * scale ) ) / 2; if( supportsTransforms ) { // Reset if( scale === 1 ) { document.body.style.transform = ''; document.body.style.OTransform = ''; document.body.style.msTransform = ''; document.body.style.MozTransform = ''; document.body.style.WebkitTransform = ''; } // Scale else { var origin = scrollOffset.x +'px '+ scrollOffset.y +'px', transform = 'translate('+ -rect.x +'px,'+ -rect.y +'px) scale('+ scale +')'; document.body.style.transformOrigin = origin; document.body.style.OTransformOrigin = origin; document.body.style.msTransformOrigin = origin; document.body.style.MozTransformOrigin = origin; document.body.style.WebkitTransformOrigin = origin; document.body.style.transform = transform; document.body.style.OTransform = transform; document.body.style.msTransform = transform; document.body.style.MozTransform = transform; document.body.style.WebkitTransform = transform; } } else { // Reset if( scale === 1 ) { document.body.style.position = ''; document.body.style.left = ''; document.body.style.top = ''; document.body.style.width = ''; document.body.style.height = ''; document.body.style.zoom = ''; } // Scale else { document.body.style.position = 'relative'; document.body.style.left = ( - ( scrollOffset.x + rect.x ) / scale ) + 'px'; document.body.style.top = ( - ( scrollOffset.y + rect.y ) / scale ) + 'px'; document.body.style.width = ( scale * 100 ) + '%'; document.body.style.height = ( scale * 100 ) + '%'; document.body.style.zoom = scale; } } level = scale; if( document.documentElement.classList ) { if( level !== 1 ) { document.documentElement.classList.add( 'zoomed' ); } else { document.documentElement.classList.remove( 'zoomed' ); } } } /** * Pan the document when the mosue cursor approaches the edges * of the window. */ function pan() { var range = 0.12, rangeX = window.innerWidth * range, rangeY = window.innerHeight * range, scrollOffset = getScrollOffset(); // Up if( mouseY < rangeY ) { window.scroll( scrollOffset.x, scrollOffset.y - ( 1 - ( mouseY / rangeY ) ) * ( 14 / level ) ); } // Down else if( mouseY > window.innerHeight - rangeY ) { window.scroll( scrollOffset.x, scrollOffset.y + ( 1 - ( window.innerHeight - mouseY ) / rangeY ) * ( 14 / level ) ); } // Left if( mouseX < rangeX ) { window.scroll( scrollOffset.x - ( 1 - ( mouseX / rangeX ) ) * ( 14 / level ), scrollOffset.y ); } // Right else if( mouseX > window.innerWidth - rangeX ) { window.scroll( scrollOffset.x + ( 1 - ( window.innerWidth - mouseX ) / rangeX ) * ( 14 / level ), scrollOffset.y ); } } function getScrollOffset() { return { x: window.scrollX !== undefined ? window.scrollX : window.pageXOffset, y: window.scrollY !== undefined ? window.scrollY : window.pageYOffset } } return { /** * Zooms in on either a rectangle or HTML element. * * @param {Object} options * - element: HTML element to zoom in on * OR * - x/y: coordinates in non-transformed space to zoom in on * - width/height: the portion of the screen to zoom in on * - scale: can be used instead of width/height to explicitly set scale */ to: function( options ) { // Due to an implementation limitation we can't zoom in // to another element without zooming out first if( level !== 1 ) { zoom.out(); } else { options.x = options.x || 0; options.y = options.y || 0; // If an element is set, that takes precedence if( !!options.element ) { // Space around the zoomed in element to leave on screen var padding = 20; var bounds = options.element.getBoundingClientRect(); options.x = bounds.left - padding; options.y = bounds.top - padding; options.width = bounds.width + ( padding * 2 ); options.height = bounds.height + ( padding * 2 ); } // If width/height values are set, calculate scale from those values if( options.width !== undefined && options.height !== undefined ) { options.scale = Math.max( Math.min( window.innerWidth / options.width, window.innerHeight / options.height ), 1 ); } if( options.scale > 1 ) { options.x *= options.scale; options.y *= options.scale; magnify( options, options.scale ); if( options.pan !== false ) { // Wait with engaging panning as it may conflict with the // zoom transition panEngageTimeout = setTimeout( function() { panUpdateInterval = setInterval( pan, 1000 / 60 ); }, 800 ); } } } }, /** * Resets the document zoom state to its default. */ out: function() { clearTimeout( panEngageTimeout ); clearInterval( panUpdateInterval ); magnify( { x: 0, y: 0 }, 1 ); level = 1; }, // Alias magnify: function( options ) { this.to( options ) }, reset: function() { this.out() }, zoomLevel: function() { return level; } } })(); ================================================ FILE: requirements.txt ================================================ -i https://pypi.python.org/simple alabaster==0.7.12 apipkg==1.5 atomicwrites==1.3.0 attrs==19.1.0 babel==2.7.0 brotli==1.0.7 certifi==2019.6.16 chardet==3.0.4 coverage==4.5.4 coveralls==1.5.1 dateparser==0.7.0 django-cors-headers==2.4.0 django-crispy-forms==1.7.2 django-extensions==2.1.4 django-filter==2.1.0 django==2.0.10 djangoql==0.12.3 djangorestframework==3.9.1 docopt==0.6.2 docutils==0.15.2 execnet==1.6.1 factory-boy==2.11.1 faker==2.0.0 filelock==3.0.12 filemagic==1.6 fuzzywuzzy[speedup]==0.15.0 gunicorn==20.0.4 idna==2.8 imagesize==1.1.0 importlib-metadata==0.19 inotify-simple==1.1.8; sys_platform == 'linux' jinja2==2.10.1 langdetect==1.0.7 markupsafe==1.1.1 more-itertools==7.2.0 packaging==19.1 pdftotext==2.1.1 pillow==5.4.1 pluggy==0.12.0 ply==3.11 psycopg2==2.8.4 py==1.8.0 pycodestyle==2.4.0 pygments==2.4.2 pyocr==0.5.3 pyparsing==2.4.2 pytest-cov==2.6.1 pytest-django==3.4.5 pytest-env==0.6.2 pytest-forked==1.0.2 pytest-sugar==0.9.2 pytest-xdist==1.26.0 pytest==4.1.1 python-dateutil==2.7.5 python-dotenv==0.10.1 python-gnupg==0.4.4 python-levenshtein==0.12.0 pytz==2018.9 regex==2019.6.8 requests==2.22.0 six==1.12.0 snowballstemmer==1.9.0 sphinx==1.8.3 sphinxcontrib-applehelp==1.0.1 sphinxcontrib-devhelp==1.0.1 sphinxcontrib-htmlhelp==1.0.2 sphinxcontrib-jsmath==1.0.1 sphinxcontrib-qthelp==1.0.2 sphinxcontrib-serializinghtml==1.1.3 termcolor==1.1.0 text-unidecode==1.2 toml==0.10.0 tox==3.7.0 tzlocal==2.0.0 urllib3==1.25.3 virtualenv==16.7.2 wcwidth==0.1.7 whitenoise==4.1.3 zipp==0.5.2 ================================================ FILE: resources/logo/print/eps/Black logo - no background.eps ================================================ %!PS-Adobe-3.0 EPSF-3.0 %Produced by poppler pdftops version: 0.59.0 (http://poppler.freedesktop.org) %%Creator: Chromium %%LanguageLevel: 3 %%DocumentSuppliedResources: (atend) %%BoundingBox: 0 0 2409 909 %%HiResBoundingBox: 0 0 2409 909 %%DocumentSuppliedResources: (atend) %%EndComments %%BeginProlog %%BeginResource: procset xpdf 3.00 0 %%Copyright: Copyright 1996-2011 Glyph & Cog, LLC /xpdf 75 dict def xpdf begin % PDF special state /pdfDictSize 15 def /pdfSetup { /setpagedevice where { pop 2 dict begin /Policies 1 dict dup begin /PageSize 6 def end def { /Duplex true def } if currentdict end setpagedevice } { pop } ifelse } def /pdfSetupPaper { % Change paper size, but only if different from previous paper size otherwise % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size % so we use the same when checking if the size changes. /setpagedevice where { pop currentpagedevice /PageSize known { 2 copy currentpagedevice /PageSize get aload pop exch 4 1 roll sub abs 5 gt 3 1 roll sub abs 5 gt or } { true } ifelse { 2 array astore 2 dict begin /PageSize exch def /ImagingBBox null def currentdict end setpagedevice } { pop pop } ifelse } { pop } ifelse } def /pdfStartPage { pdfDictSize dict begin /pdfFillCS [] def /pdfFillXform {} def /pdfStrokeCS [] def /pdfStrokeXform {} def /pdfFill [0] def /pdfStroke [0] def /pdfFillOP false def /pdfStrokeOP false def /pdfOPM false def /pdfLastFill false def /pdfLastStroke false def /pdfTextMat [1 0 0 1 0 0] def /pdfFontSize 0 def /pdfCharSpacing 0 def /pdfTextRender 0 def /pdfPatternCS false def /pdfTextRise 0 def /pdfWordSpacing 0 def /pdfHorizScaling 1 def /pdfTextClipPath [] def } def /pdfEndPage { end } def % PDF color state /opm { dup /pdfOPM exch def /setoverprintmode where{pop setoverprintmode}{pop}ifelse } def /cs { /pdfFillXform exch def dup /pdfFillCS exch def setcolorspace } def /CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def setcolorspace } def /sc { pdfLastFill not { pdfFillCS setcolorspace } if dup /pdfFill exch def aload pop pdfFillXform setcolor /pdfLastFill true def /pdfLastStroke false def } def /SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if dup /pdfStroke exch def aload pop pdfStrokeXform setcolor /pdfLastStroke true def /pdfLastFill false def } def /op { /pdfFillOP exch def pdfLastFill { pdfFillOP setoverprint } if } def /OP { /pdfStrokeOP exch def pdfLastStroke { pdfStrokeOP setoverprint } if } def /fCol { pdfLastFill not { pdfFillCS setcolorspace pdfFill aload pop pdfFillXform setcolor pdfFillOP setoverprint /pdfLastFill true def /pdfLastStroke false def } if } def /sCol { pdfLastStroke not { pdfStrokeCS setcolorspace pdfStroke aload pop pdfStrokeXform setcolor pdfStrokeOP setoverprint /pdfLastStroke true def /pdfLastFill false def } if } def % build a font /pdfMakeFont { 4 3 roll findfont 4 2 roll matrix scale makefont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /Encoding exch def currentdict end definefont pop } def /pdfMakeFont16 { exch findfont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /WMode exch def currentdict end definefont pop } def /pdfMakeFont16L3 { 1 index /CIDFont resourcestatus { pop pop 1 index /CIDFont findresource /CIDFontType known } { false } ifelse { 0 eq { /Identity-H } { /Identity-V } ifelse exch 1 array astore composefont pop } { pdfMakeFont16 } ifelse } def % graphics state operators /q { gsave pdfDictSize dict begin } def /Q { end grestore /pdfLastFill where { pop pdfLastFill { pdfFillOP setoverprint } { pdfStrokeOP setoverprint } ifelse } if /pdfOPM where { pop pdfOPM /setoverprintmode where{pop setoverprintmode}{pop}ifelse } if } def /cm { concat } def /d { setdash } def /i { setflat } def /j { setlinejoin } def /J { setlinecap } def /M { setmiterlimit } def /w { setlinewidth } def % path segment operators /m { moveto } def /l { lineto } def /c { curveto } def /re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath } def /h { closepath } def % path painting operators /S { sCol stroke } def /Sf { fCol stroke } def /f { fCol fill } def /f* { fCol eofill } def % clipping operators /W { clip newpath } def /W* { eoclip newpath } def /Ws { strokepath clip newpath } def % text state operators /Tc { /pdfCharSpacing exch def } def /Tf { dup /pdfFontSize exch def dup pdfHorizScaling mul exch matrix scale pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put exch findfont exch makefont setfont } def /Tr { /pdfTextRender exch def } def /Tp { /pdfPatternCS exch def } def /Ts { /pdfTextRise exch def } def /Tw { /pdfWordSpacing exch def } def /Tz { /pdfHorizScaling exch def } def % text positioning operators /Td { pdfTextMat transform moveto } def /Tm { /pdfTextMat exch def } def % text string operators /xyshow where { pop /xyshow2 { dup length array 0 2 2 index length 1 sub { 2 index 1 index 2 copy get 3 1 roll 1 add get pdfTextMat dtransform 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put } for exch pop xyshow } def }{ /xyshow2 { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval show moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval show moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /cshow where { pop /xycp { 0 3 2 roll { pop pop currentpoint 3 2 roll 1 string dup 0 4 3 roll put false charpath moveto 2 copy get 2 index 2 index 1 add get pdfTextMat dtransform rmoveto 2 add } exch cshow pop pop } def }{ /xycp { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval false charpath moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval false charpath moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /Tj { fCol 0 pdfTextRise pdfTextMat dtransform rmoveto currentpoint 4 2 roll pdfTextRender 1 and 0 eq { 2 copy xyshow2 } if pdfTextRender 3 and dup 1 eq exch 2 eq or { 3 index 3 index moveto 2 copy currentfont /FontType get 3 eq { fCol } { sCol } ifelse xycp currentpoint stroke moveto } if pdfTextRender 4 and 0 ne { 4 2 roll moveto xycp /pdfTextClipPath [ pdfTextClipPath aload pop {/moveto cvx} {/lineto cvx} {/curveto cvx} {/closepath cvx} pathforall ] def currentpoint newpath moveto } { pop pop pop pop } ifelse 0 pdfTextRise neg pdfTextMat dtransform rmoveto } def /TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 pdfTextMat dtransform rmoveto } def /TJmV { 0.001 mul pdfFontSize mul neg 0 exch pdfTextMat dtransform rmoveto } def /Tclip { pdfTextClipPath cvx exec clip newpath /pdfTextClipPath [] def } def /Tclip* { pdfTextClipPath cvx exec eoclip newpath /pdfTextClipPath [] def } def % Level 2/3 image operators /pdfImBuf 100 string def /pdfImStr { 2 copy exch length lt { 2 copy get exch 1 add exch } { () } ifelse } def /skipEOD { { currentfile pdfImBuf readline not { pop exit } if (%-EOD-) eq { exit } if } loop } def /pdfIm { image skipEOD } def /pdfMask { /ReusableStreamDecode filter skipEOD /maskStream exch def } def /pdfMaskEnd { maskStream closefile } def /pdfMaskInit { /maskArray exch def /maskIdx 0 def } def /pdfMaskSrc { maskIdx maskArray length lt { maskArray maskIdx get /maskIdx maskIdx 1 add def } { () } ifelse } def /pdfImM { fCol imagemask skipEOD } def /pr { 2 index 2 index 3 2 roll putinterval 4 add } def /pdfImClip { gsave 0 2 4 index length 1 sub { dup 4 index exch 2 copy get 5 index div put 1 add 3 index exch 2 copy get 3 index div put } for pop pop rectclip } def /pdfImClipEnd { grestore } def % shading operators /colordelta { false 0 1 3 index length 1 sub { dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { pop true } if } for exch pop exch pop } def /funcCol { func n array astore } def /funcSH { dup 0 eq { true } { dup 6 eq { false } { 4 index 4 index funcCol dup 6 index 4 index funcCol dup 3 1 roll colordelta 3 1 roll 5 index 5 index funcCol dup 3 1 roll colordelta 3 1 roll 6 index 8 index funcCol dup 3 1 roll colordelta 3 1 roll colordelta or or or } ifelse } ifelse { 1 add 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch 6 index 6 index 4 index 4 index 4 index funcSH 2 index 6 index 6 index 4 index 4 index funcSH 6 index 2 index 4 index 6 index 4 index funcSH 5 3 roll 3 2 roll funcSH pop pop } { pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul funcCol sc dup 4 index exch mat transform m 3 index 3 index mat transform l 1 index 3 index mat transform l mat transform l pop pop h f* } ifelse } def /axialCol { dup 0 lt { pop t0 } { dup 1 gt { pop t1 } { dt mul t0 add } ifelse } ifelse func n array astore } def /axialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index axialCol 2 index axialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index axialSH exch 3 2 roll axialSH } { pop 2 copy add 0.5 mul axialCol sc exch dup dx mul x0 add exch dy mul y0 add 3 2 roll dup dx mul x0 add exch dy mul y0 add dx abs dy abs ge { 2 copy yMin sub dy mul dx div add yMin m yMax sub dy mul dx div add yMax l 2 copy yMax sub dy mul dx div add yMax l yMin sub dy mul dx div add yMin l h f* } { exch 2 copy xMin sub dx mul dy div add xMin exch m xMax sub dx mul dy div add xMax exch l exch 2 copy xMax sub dx mul dy div add xMax exch l xMin sub dx mul dy div add xMin exch l h f* } ifelse } ifelse } def /radialCol { dup t0 lt { pop t0 } { dup t1 gt { pop t1 } if } ifelse func n array astore } def /radialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index dt mul t0 add radialCol 2 index dt mul t0 add radialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index radialSH exch 3 2 roll radialSH } { pop 2 copy add 0.5 mul dt mul t0 add radialCol sc encl { exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 0 360 arc h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 360 0 arcn h f } { 2 copy dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arcn dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arcn h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arc dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arc h f } ifelse } ifelse } def end %%EndResource /CIDInit /ProcSet findresource begin 10 dict begin begincmap /CMapType 1 def /CMapName /Identity-H def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Identity) def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 0 usefont 1 begincidrange <0000> 0 endcidrange endcmap currentdict CMapName exch /CMap defineresource pop end 10 dict begin begincmap /CMapType 1 def /CMapName /Identity-V def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Identity) def /Supplement 0 def end def /WMode 1 def 1 begincodespacerange <0000> endcodespacerange 0 usefont 1 begincidrange <0000> 0 endcidrange endcmap currentdict CMapName exch /CMap defineresource pop end end %%EndProlog %%BeginSetup xpdf begin %%EndSetup pdfStartPage %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer 0 0 2409 909 re W q [1 0 0 -1 0 909] cm q 0 0 2409 908.7038 re W* q [0.747904 0 0 0.747904 0 -908.7038] cm /DeviceRGB {} CS [1 1 1] SC /DeviceRGB {} cs [1 1 1] sc 0 0 3221 2436 re f Q Q q 5.983235 0 2403.0168 907.20795 re W* q [0.822879 0 0 0.822978 95.330643 145.991699] cm /DeviceRGB {} CS [0.09 0.329 0.122] SC /DeviceRGB {} cs [0.09 0.329 0.122] sc 231 798 m 227 779 219 741 218 741 c 49 640 69 465 125 365 c 137 491 360 578 230 732 c 229 734 236 758 242 780 c 268 736 307 683 305 678 c 145 288 645 258 749 16 c 796 250 725 612 323 704 c 321 705 250 830 247 831 c 247 829 217 830 221 820 c 223 814 227 806 231 798 c h 330 625 m 267 476 452 312 544 271 c 356 439 324 564 330 625 c h 226 704 m 277 645 217 544 181 511 c 242 616 238 677 226 704 c h f Q q [26.582434 0 0 26.585632 866.89978 103.116905] cm 6.5 8.62 m 6.513333 8.940001 6.52 9.303333 6.52 9.71 c 6.52 10.116667 6.513333 10.473333 6.5 10.78 c 6.5 11.139999 6.436667 11.496666 6.31 11.849999 c 6.183333 12.203333 5.993333 12.52 5.74 12.799999 c 5.486666 13.079999 5.17 13.299999 4.79 13.459999 c 4.41 13.619999 3.973334 13.699999 3.48 13.699999 c 2.46 13.699999 l 2.46 18.919998 l 2.46 19.106665 2.486667 19.243332 2.54 19.329998 c 2.593333 19.416664 2.646667 19.466663 2.7 19.479998 c 2.78 19.519997 2.866667 19.519997 2.96 19.479998 c 2.96 19.999998 l 0.54 19.999998 l 0.54 19.479998 l 0.646667 19.519997 0.726667 19.519997 0.78 19.479998 c 0.846667 19.466663 0.913333 19.416664 0.98 19.329998 c 1.046667 19.243332 1.08 19.106665 1.08 18.919998 c 1.08 6.779998 l 1.08 6.579998 1.046667 6.436665 0.98 6.349998 c 0.913333 6.263331 0.846667 6.206665 0.78 6.179998 c 0.726667 6.153331 0.646667 6.153331 0.54 6.179998 c 0.54 5.699998 l 3.48 5.699998 l 3.973334 5.699998 4.41 5.779998 4.79 5.939998 c 5.17 6.099998 5.486666 6.319997 5.74 6.599998 c 5.993333 6.879998 6.183333 7.193331 6.31 7.539998 c 6.436667 7.886664 6.5 8.246664 6.5 8.619998 c 6.5 8.62 l h 5.08 8.18 m 5.08 7.833334 5.023333 7.533334 4.91 7.28 c 4.796667 7.026667 4.663333 6.826667 4.51 6.68 c 4.356667 6.533334 4.196666 6.416667 4.03 6.33 c 3.863333 6.243334 3.72 6.2 3.6 6.2 c 2.46 6.2 l 2.46 13.16 l 3.599999 13.16 l 3.72 13.16 3.863333 13.126666 4.029999 13.06 c 4.196666 12.993333 4.356666 12.876666 4.509999 12.709999 c 4.663333 12.543332 4.796666 12.339999 4.909999 12.099999 c 5.023333 11.86 5.079999 11.56 5.079999 11.2 c 5.079999 8.18 l 5.08 8.18 l h 14.58 19.139999 m 14.58 19.246666 14.553333 19.356667 14.5 19.469999 c 14.446667 19.583332 14.37 19.689999 14.270001 19.789999 c 14.170001 19.889999 14.043334 19.98 13.89 20.059999 c 13.736667 20.139999 13.56 20.18 13.360001 20.18 c 13.040001 20.18 12.753334 20.106667 12.500001 19.960001 c 12.246668 19.813335 12.073335 19.620001 11.980001 19.380001 c 11.900002 19.246668 11.840001 19.093334 11.800001 18.920002 c 11.626668 19.280003 11.363335 19.580002 11.010001 19.820002 c 10.656668 20.060001 10.266668 20.18 9.840001 20.180002 c 9.306667 20.180002 8.840001 19.98667 8.440002 19.600002 c 8.213335 19.400003 8.026669 19.140003 7.880002 18.820002 c 7.733335 18.5 7.646668 18.133333 7.620002 17.720001 c 7.606669 17.680002 7.600002 17.600002 7.600002 17.480001 c 7.600002 17.460001 l 7.613335 17.233334 7.653335 16.996668 7.720002 16.750002 c 7.786668 16.503336 7.890002 16.25667 8.030002 16.010002 c 8.170002 15.763335 8.336668 15.530002 8.530002 15.310002 c 8.723335 15.090003 8.933335 14.900003 9.160002 14.740003 c 9.213335 14.713336 9.256668 14.683336 9.290002 14.650003 c 9.323336 14.616669 9.373335 14.580003 9.440002 14.540003 c 9.500002 14.510003 l 9.560002 14.480003 l 9.800002 14.333337 10.010002 14.200004 10.190002 14.080004 c 10.370003 13.960004 10.533336 13.846671 10.680002 13.740004 c 10.760002 13.68667 10.840002 13.62667 10.920002 13.560003 c 11.000002 13.493337 11.086669 13.42667 11.180002 13.360004 c 11.300002 13.280004 11.413336 13.18667 11.520002 13.080004 c 11.626669 12.973337 11.706669 12.84667 11.760002 12.700004 c 11.840002 12.56667 11.880002 12.406671 11.880002 12.220003 c 11.880002 12.033336 11.860002 11.86667 11.820002 11.720003 c 11.766668 11.42667 11.630002 11.173337 11.410002 10.960003 c 11.190002 10.746669 10.946669 10.606669 10.680002 10.540003 c 10.560002 10.500003 10.446669 10.480002 10.340002 10.480002 c 9.966668 10.480002 9.646668 10.546669 9.380002 10.680002 c 9.206669 10.760002 9.080002 10.850002 9.000002 10.950003 c 8.920002 11.050003 8.876669 11.143336 8.870002 11.230002 c 8.863335 11.316669 8.880002 11.386668 8.920002 11.440002 c 8.960002 11.493337 9.013335 11.533337 9.080002 11.560002 c 9.106669 11.573336 9.123335 11.580003 9.130002 11.580003 c 9.136669 11.580003 9.153336 11.58667 9.180002 11.600003 c 9.353335 11.66667 9.496669 11.783337 9.610003 11.950004 c 9.723336 12.116671 9.780003 12.300004 9.780003 12.500004 c 9.780003 12.753337 9.690002 12.970004 9.510002 13.150003 c 9.330002 13.330003 9.113336 13.420003 8.860003 13.420004 c 8.593336 13.420004 8.36667 13.330004 8.180002 13.150003 c 7.993335 12.970003 7.900002 12.753337 7.900002 12.500004 c 7.900002 12.273337 7.930002 12.036671 7.990002 11.790004 c 8.050002 11.543337 8.140002 11.320004 8.260002 11.120004 c 8.513335 10.74667 8.816669 10.47667 9.170002 10.310003 c 9.523336 10.143336 9.913335 10.060003 10.340002 10.060003 c 10.660002 10.060003 10.976668 10.120004 11.290002 10.240004 c 11.603335 10.360004 11.883335 10.530004 12.130002 10.750004 c 12.376669 10.970004 12.583335 11.233337 12.750002 11.540004 c 12.916669 11.84667 13.000002 12.200004 13.000002 12.600004 c 13.000002 18.480003 l 13.000002 18.720003 13.003335 18.876671 13.010002 18.950003 c 13.016669 19.023335 13.020002 19.073336 13.020002 19.100002 c 13.020002 19.273336 13.073336 19.413336 13.180002 19.520002 c 13.286669 19.626669 13.413336 19.680002 13.560002 19.680002 c 13.733335 19.680002 13.873336 19.630003 13.980002 19.530003 c 14.086669 19.430002 14.146669 19.300003 14.160003 19.140003 c 14.580003 19.140003 l 14.58 19.139999 l h 11.44 18.639999 m 11.546666 18.453333 11.61 18.253332 11.629999 18.039999 c 11.649999 17.826666 11.659999 17.626665 11.659999 17.439999 c 11.659999 13.739999 l 11.606666 13.793332 11.549999 13.843332 11.489999 13.889998 c 11.429998 13.936665 11.366666 13.993332 11.299999 14.059999 c 10.913333 14.339998 10.583333 14.596665 10.31 14.829998 c 10.036666 15.063331 9.806666 15.303331 9.619999 15.549998 c 9.433332 15.796665 9.286665 16.06 9.179999 16.339998 c 9.073334 16.619999 9.006667 16.939999 8.98 17.299999 c 8.98 17.599998 l 8.993333 18.106665 9.13 18.503332 9.389999 18.789999 c 9.649999 19.076666 10.019999 19.219999 10.499999 19.219999 c 10.713332 19.219999 10.906666 19.166666 11.079999 19.059999 c 11.253332 18.939999 11.373332 18.799999 11.439999 18.639999 c 11.44 18.639999 l h 18.32 10.08 m 19.08 10.093333 19.686666 10.323334 20.139999 10.770001 c 20.593332 11.216667 20.82 11.926667 20.82 12.900001 c 20.82 17.380001 l 20.82 18.353334 20.593332 19.059999 20.139999 19.5 c 19.686666 19.940001 19.08 20.173334 18.32 20.200001 c 18.26 20.200001 l 18.033333 20.200001 17.826666 20.173334 17.639999 20.120001 c 17.619999 20.120001 l 17.606665 20.120001 17.599998 20.113335 17.599998 20.1 c 17.293333 19.993334 17.026667 19.846666 16.799999 19.66 c 16.609999 19.469999 l 16.609999 19.469999 16.56 19.4 16.459999 19.26 c 16.459999 22.58 l 16.459999 22.766666 16.486666 22.903334 16.539999 22.99 c 16.593332 23.076666 16.646666 23.133333 16.699999 23.16 c 16.779999 23.199999 16.866667 23.199999 16.959999 23.16 c 16.959999 23.66 l 14.539999 23.66 l 14.539999 23.16 l 14.646666 23.199999 14.726666 23.199999 14.779999 23.16 c 14.846665 23.133333 14.909999 23.076666 14.969998 22.99 c 15.029998 22.903334 15.059998 22.766666 15.059999 22.58 c 15.059999 11.3 l 15.059999 11.113334 15.029999 10.976667 14.969998 10.89 c 14.909998 10.803333 14.846665 10.746667 14.779999 10.72 c 14.726666 10.693334 14.646666 10.693334 14.539999 10.72 c 14.539999 10.24 l 16.459999 10.24 l 16.459999 11.02 l 16.553331 10.873333 16.666666 10.74 16.799999 10.62 c 17.026667 10.42 17.293333 10.273334 17.599998 10.18 c 17.599998 10.166667 17.606665 10.16 17.619999 10.16 c 17.639999 10.16 l 17.853333 10.106667 18.059999 10.08 18.26 10.08 c 18.32 10.08 l h 19.32 12.46 m 19.32 12.44 l 19.306665 11.76 19.223333 11.28 19.07 11 c 18.916666 10.72 18.666666 10.566667 18.32 10.54 c 18.08 10.526667 17.853333 10.556666 17.639999 10.63 c 17.426666 10.703334 17.24 10.826667 17.08 11 c 16.92 11.173333 16.786667 11.406666 16.68 11.7 c 16.573334 11.993334 16.5 12.34 16.460001 12.74 c 16.460001 17.540001 l 16.5 17.953335 16.573334 18.303335 16.68 18.59 c 16.786667 18.876665 16.92 19.103333 17.08 19.27 c 17.24 19.436668 17.426666 19.560001 17.639999 19.640001 c 17.853333 19.720001 18.08 19.753334 18.32 19.740002 c 18.666666 19.713335 18.916666 19.560001 19.07 19.280003 c 19.223333 19.000004 19.306665 18.520004 19.32 17.840002 c 19.32 17.820002 l 19.32 12.460001 l 19.32 12.46 l h 24.379999 10.08 m 24.686665 10.08 24.999998 10.133333 25.32 10.24 c 25.640001 10.346666 25.926668 10.513333 26.18 10.74 c 26.433332 10.966666 26.636667 11.253333 26.790001 11.599999 c 26.943335 11.946666 27.020002 12.359999 27.02 12.839999 c 27.02 14.859999 l 27.02 14.919999 l 27.02 15.379999 l 23.040001 15.379999 l 23.040001 17.439999 l 23.040001 18.266665 23.183334 18.856665 23.470001 19.209999 c 23.756668 19.563334 24.113335 19.733334 24.540001 19.719999 c 24.793333 19.706665 25.043333 19.663332 25.290001 19.59 c 25.536669 19.516668 25.750002 19.393333 25.93 19.219999 c 26.109999 19.046665 26.26 18.799997 26.380001 18.48 c 26.500002 18.160002 26.560003 17.740002 26.560001 17.219999 c 27.02 17.219999 l 27.02 17.5 l 27.02 17.860001 26.98 18.203335 26.9 18.530001 c 26.82 18.856667 26.679998 19.140001 26.48 19.380001 c 26.280001 19.620001 26.023333 19.810001 25.709999 19.950001 c 25.396666 20.09 25.013332 20.166666 24.559999 20.18 c 24.24 20.18 23.913334 20.120001 23.58 20 c 23.246666 19.879999 22.946667 19.699999 22.68 19.459999 c 22.413334 19.219999 22.193335 18.936665 22.02 18.609999 c 21.846666 18.283333 21.76 17.913332 21.76 17.499998 c 21.76 17.029999 l 21.76 17.029999 21.756666 16.773333 21.75 16.259998 c 21.743334 15.746665 21.74 15.429998 21.74 15.309999 c 21.74 15.189999 21.736666 14.859999 21.73 14.319999 c 21.723333 13.779999 21.719999 13.489999 21.719999 13.449999 c 21.719999 12.859999 l 21.719999 12.379998 21.803333 11.963332 21.969999 11.609999 c 22.136665 11.256665 22.343332 10.969999 22.59 10.749999 c 22.836668 10.529999 23.116667 10.363333 23.43 10.249999 c 23.743334 10.136665 24.059999 10.079999 24.380001 10.079999 c 24.379999 10.08 l h 25.68 14.86 m 25.68 13.28 l 25.68 12.773333 25.646667 12.349999 25.58 12.01 c 25.513332 11.670001 25.423332 11.396668 25.309999 11.190001 c 25.196667 10.983334 25.059999 10.84 24.9 10.76 c 24.74 10.68 24.559999 10.64 24.359999 10.64 c 23.933332 10.64 23.609999 10.826667 23.389999 11.200001 c 23.17 11.573335 23.059999 12.266667 23.059999 13.280001 c 23.059999 14.860001 l 25.68 14.860001 l 25.68 14.86 l h 33.540001 11.66 m 33.540001 11.686667 33.546669 11.74 33.560001 11.82 c 33.573334 11.9 33.573334 11.966666 33.560001 12.02 c 33.546669 12.299999 33.450001 12.53 33.27 12.709999 c 33.09 12.889998 32.873333 12.979999 32.619999 12.98 c 32.353333 12.98 32.129997 12.886666 31.949999 12.7 c 31.77 12.513333 31.68 12.286667 31.679998 12.02 c 31.679998 11.686667 31.806665 11.433332 32.059998 11.259999 c 32.086666 11.246666 32.103333 11.236666 32.109997 11.23 c 32.139996 11.2 l 32.23333 11.133333 32.293327 11.036666 32.319996 10.91 c 32.346664 10.783334 32.266663 10.673333 32.079994 10.58 c 31.959993 10.513333 31.839994 10.48 31.719994 10.48 c 31.319994 10.453333 30.96666 10.573333 30.659994 10.839999 c 30.353329 11.106666 30.146662 11.573332 30.039993 12.239999 c 30.039993 18.919998 l 30.039993 19.106665 30.06666 19.243332 30.119993 19.329998 c 30.173326 19.416664 30.22666 19.466663 30.279993 19.479998 c 30.359993 19.519997 30.446661 19.519997 30.539993 19.479998 c 30.539993 19.999998 l 28.119993 19.999998 l 28.119993 19.479998 l 28.22666 19.519997 28.30666 19.519997 28.359993 19.479998 c 28.426661 19.466663 28.493326 19.416664 28.559994 19.329998 c 28.626661 19.243332 28.659994 19.106665 28.659994 18.919998 c 28.659994 11.299998 l 28.659994 11.113332 28.626661 10.976666 28.559994 10.889998 c 28.493326 10.803331 28.426661 10.746665 28.359993 10.719998 c 28.30666 10.693332 28.22666 10.693332 28.119993 10.719998 c 28.119993 10.219998 l 30.039993 10.219998 l 30.039993 11.039998 l 30.133326 10.893332 30.22666 10.756664 30.319994 10.629998 c 30.413328 10.503332 30.523329 10.396666 30.649994 10.309999 c 30.776659 10.223331 30.923326 10.153332 31.089994 10.099999 c 31.256662 10.046665 31.466661 10.019999 31.719994 10.019999 c 32.106663 10.019999 32.466663 10.159999 32.799995 10.439999 c 33.133327 10.719998 33.379997 11.126665 33.539997 11.659999 c 33.540001 11.66 l h 36.240002 18.92 m 36.240002 19.106667 36.27 19.243334 36.330002 19.33 c 36.390003 19.416666 36.446667 19.466665 36.5 19.48 c 36.566666 19.519999 36.653332 19.519999 36.759998 19.48 c 36.759998 20 l 34.339996 20 l 34.339996 19.48 l 34.446663 19.519999 34.539997 19.519999 34.619995 19.48 c 34.659996 19.466665 34.713329 19.416666 34.779995 19.33 c 34.846661 19.243334 34.879993 19.106667 34.879993 18.92 c 34.879993 6.8 l 34.879993 6.6 34.846661 6.456667 34.779995 6.37 c 34.713329 6.283334 34.659996 6.226667 34.619995 6.2 c 34.539997 6.16 34.446663 6.16 34.339996 6.2 c 34.339996 5.72 l 36.239998 5.72 l 36.239998 6.8 l 36.239998 18.92 l 36.240002 18.92 l h 40.580002 10.08 m 40.886669 10.08 41.200001 10.133333 41.52 10.24 c 41.84 10.346666 42.126667 10.513333 42.380001 10.74 c 42.633335 10.966666 42.83667 11.253333 42.990002 11.599999 c 43.143333 11.946666 43.220001 12.359999 43.220001 12.839999 c 43.220001 14.859999 l 43.220001 14.919999 l 43.220001 15.379999 l 39.240002 15.379999 l 39.240002 17.439999 l 39.240002 18.266665 39.383335 18.856665 39.670002 19.209999 c 39.956669 19.563334 40.313335 19.733334 40.740002 19.719999 c 40.993336 19.706665 41.243336 19.663332 41.490002 19.59 c 41.736668 19.516668 41.950001 19.393333 42.130001 19.219999 c 42.310001 19.046665 42.460003 18.799997 42.580002 18.48 c 42.700001 18.160002 42.760002 17.740002 42.760002 17.219999 c 43.220001 17.219999 l 43.220001 17.5 l 43.220001 17.860001 43.18 18.203335 43.100002 18.530001 c 43.020004 18.856667 42.880005 19.140001 42.680004 19.380001 c 42.480003 19.620001 42.223339 19.810001 41.910004 19.950001 c 41.596668 20.09 41.213337 20.166666 40.760002 20.18 c 40.440002 20.18 40.113335 20.120001 39.780003 20 c 39.446671 19.879999 39.146667 19.699999 38.880001 19.459999 c 38.613335 19.219999 38.393333 18.936665 38.220001 18.609999 c 38.046669 18.283333 37.960003 17.913332 37.960003 17.499998 c 37.960003 17.029999 l 37.960003 17.029999 37.956669 16.773333 37.950005 16.259998 c 37.94334 15.746665 37.940006 15.429998 37.940006 15.309999 c 37.940006 15.189999 37.936672 14.859999 37.930008 14.319999 c 37.923344 13.779999 37.92001 13.489999 37.92001 13.449999 c 37.92001 12.859999 l 37.92001 12.379998 38.003342 11.963332 38.17001 11.609999 c 38.336678 11.256665 38.543343 10.969999 38.790009 10.749999 c 39.036674 10.529999 39.316673 10.363333 39.630009 10.249999 c 39.943344 10.136665 40.26001 10.079999 40.580009 10.079999 c 40.580002 10.08 l h 41.880001 14.86 m 41.880001 13.28 l 41.880001 12.773333 41.846668 12.349999 41.780003 12.01 c 41.713337 11.670001 41.623337 11.396668 41.510002 11.190001 c 41.396667 10.983334 41.260002 10.84 41.100002 10.76 c 40.940002 10.68 40.760002 10.64 40.560001 10.64 c 40.133335 10.64 39.810001 10.826667 39.59 11.200001 c 39.369999 11.573335 39.259998 12.266667 39.259998 13.280001 c 39.259998 14.860001 l 41.879997 14.860001 l 41.880001 14.86 l h 47.880001 19.879999 m 47.866669 19.893333 47.856667 19.9 47.850002 19.9 c 47.843338 19.9 47.833336 19.906666 47.820004 19.92 c 47.800003 19.940001 l 47.773335 19.953335 47.743336 19.966667 47.710003 19.980001 c 47.67667 19.993336 47.646671 20.006668 47.620003 20.020002 c 47.340004 20.140003 47.013336 20.200003 46.640003 20.200003 c 46.42667 20.200003 46.220005 20.150003 46.020004 20.050003 c 45.820004 19.950003 45.646671 19.866671 45.500004 19.800003 c 45.353336 19.733335 45.230003 19.703337 45.130005 19.710003 c 45.030006 19.716669 44.980007 19.813337 44.980003 20.000004 c 44.600002 20.000004 l 44.600002 17.600004 l 45.080002 17.600004 l 45.053333 18.02667 45.100002 18.393337 45.220001 18.700005 c 45.299999 18.966671 45.456669 19.216671 45.690002 19.450005 c 45.923336 19.683338 46.273338 19.800005 46.740002 19.800005 c 47.046669 19.800005 47.299999 19.746672 47.5 19.640005 c 47.846668 19.466671 48.083332 19.260004 48.209999 19.020004 c 48.336666 18.780005 48.386665 18.530005 48.360001 18.270004 c 48.333336 18.010004 48.236668 17.753338 48.07 17.500004 c 47.903332 17.24667 47.699997 17.013336 47.459999 16.800003 c 47.299999 16.680002 47.133331 16.553337 46.959999 16.420004 c 46.786667 16.286671 46.613335 16.146671 46.439999 16.000004 c 45.973331 15.62667 45.603333 15.290004 45.329998 14.990004 c 45.056664 14.690003 44.846664 14.410004 44.699997 14.150003 c 44.553329 13.890003 44.453331 13.643336 44.399998 13.410004 c 44.346664 13.176671 44.32 12.926671 44.319996 12.660004 c 44.319996 12.500004 44.329994 12.353337 44.349995 12.220004 c 44.369995 12.086671 44.393326 11.966671 44.419994 11.860004 c 44.459995 11.633338 44.526661 11.413338 44.619995 11.200005 c 44.713329 10.986671 44.846661 10.796672 45.019997 10.630005 c 45.193333 10.463338 45.406666 10.326672 45.659996 10.220005 c 45.913326 10.113339 46.219994 10.060005 46.579994 10.060005 c 46.779995 10.060005 46.979992 10.103338 47.179993 10.190005 c 47.379993 10.276672 47.559994 10.356672 47.719994 10.430005 c 47.879993 10.503338 48.00666 10.536672 48.099995 10.530006 c 48.193329 10.523339 48.239994 10.420006 48.239994 10.220005 c 48.619995 10.220005 l 48.619995 12.700005 l 48.099995 12.700005 l 48.113327 12.300004 48.066662 11.940004 47.959995 11.620005 c 47.866661 11.340005 47.703327 11.086671 47.469994 10.860004 c 47.23666 10.633338 46.893326 10.520004 46.439995 10.520004 c 46.079994 10.520004 45.786659 10.600004 45.559994 10.760004 c 45.439995 10.853337 45.336658 10.990005 45.249992 11.170004 c 45.163326 11.350003 45.113323 11.54667 45.099991 11.760004 c 45.086658 11.973338 45.119991 12.203338 45.199989 12.450005 c 45.279987 12.696671 45.439987 12.926671 45.679989 13.140005 c 45.706657 13.180005 45.743324 13.220005 45.789989 13.260005 c 45.836655 13.300005 45.886658 13.333338 45.939991 13.360005 c 45.979992 13.386672 46.013325 13.413339 46.039989 13.440005 c 46.119991 13.520005 l 46.266659 13.640005 46.41666 13.760005 46.569992 13.880005 c 46.723324 14.000005 46.879993 14.120005 47.039993 14.240005 c 47.413326 14.560005 47.723328 14.850005 47.969994 15.110004 c 48.21666 15.370004 48.423325 15.613338 48.589993 15.840004 c 48.75666 16.066671 48.879993 16.280004 48.959991 16.480003 c 49.039989 16.680002 49.086658 16.873337 49.099991 17.060003 c 49.233326 17.673336 49.209991 18.190002 49.029991 18.610003 c 48.849991 19.030003 48.619991 19.360003 48.339993 19.600002 c 48.319992 19.600002 l 48.319992 19.626669 48.30666 19.640003 48.279991 19.640003 c 48.253323 19.66667 48.226658 19.68667 48.199989 19.700003 c 48.07999 19.780003 l 48.07999 19.780003 48.039989 19.800003 47.959991 19.840002 c 47.959991 19.860003 l 47.946659 19.860003 47.933323 19.863337 47.919991 19.870003 c 47.906658 19.876669 47.893322 19.880003 47.87999 19.880003 c 47.880001 19.879999 l h 53.82 19.879999 m 53.806667 19.893333 53.796665 19.9 53.790001 19.9 c 53.783337 19.9 53.773335 19.906666 53.760002 19.92 c 53.740002 19.940001 l 53.713333 19.953335 53.683334 19.966667 53.650002 19.980001 c 53.616669 19.993336 53.58667 20.006668 53.560001 20.020002 c 53.280003 20.140003 52.953335 20.200003 52.580002 20.200003 c 52.366669 20.200003 52.160004 20.150003 51.960003 20.050003 c 51.760002 19.950003 51.58667 19.866671 51.440002 19.800003 c 51.293335 19.733335 51.170002 19.703337 51.070004 19.710003 c 50.970005 19.716669 50.920006 19.813337 50.920002 20.000004 c 50.540001 20.000004 l 50.540001 17.600004 l 51.02 17.600004 l 50.993332 18.02667 51.040001 18.393337 51.16 18.700005 c 51.239998 18.966671 51.396667 19.216671 51.630001 19.450005 c 51.863335 19.683338 52.213337 19.800005 52.68 19.800005 c 52.986668 19.800005 53.239998 19.746672 53.439999 19.640005 c 53.786667 19.466671 54.023331 19.260004 54.149998 19.020004 c 54.276665 18.780005 54.326664 18.530005 54.299999 18.270004 c 54.273335 18.010004 54.176666 17.753338 54.009998 17.500004 c 53.84333 17.24667 53.639996 17.013336 53.399998 16.800003 c 53.239998 16.680002 53.07333 16.553337 52.899998 16.420004 c 52.726665 16.286671 52.553333 16.146671 52.379997 16.000004 c 51.91333 15.62667 51.543331 15.290004 51.269997 14.990004 c 50.996662 14.690003 50.786663 14.410004 50.639996 14.150003 c 50.493328 13.890003 50.39333 13.643336 50.339996 13.410004 c 50.286663 13.176671 50.259998 12.926671 50.259995 12.660004 c 50.259995 12.500004 50.269993 12.353337 50.289993 12.220004 c 50.309994 12.086671 50.333324 11.966671 50.359993 11.860004 c 50.399994 11.633338 50.46666 11.413338 50.559994 11.200005 c 50.653328 10.986671 50.786659 10.796672 50.959995 10.630005 c 51.133331 10.463338 51.346664 10.326672 51.599995 10.220005 c 51.853325 10.113339 52.159992 10.060005 52.519993 10.060005 c 52.719994 10.060005 52.919991 10.103338 53.119991 10.190005 c 53.319992 10.276672 53.499992 10.356672 53.659992 10.430005 c 53.819992 10.503338 53.946659 10.536672 54.039993 10.530006 c 54.133327 10.523339 54.179993 10.420006 54.179993 10.220005 c 54.559994 10.220005 l 54.559994 12.700005 l 54.039993 12.700005 l 54.053326 12.300004 54.00666 11.940004 53.899994 11.620005 c 53.80666 11.340005 53.643326 11.086671 53.409992 10.860004 c 53.176659 10.633338 52.833324 10.520004 52.379993 10.520004 c 52.019993 10.520004 51.726658 10.600004 51.499992 10.760004 c 51.379993 10.853337 51.276657 10.990005 51.189991 11.170004 c 51.103325 11.350003 51.053322 11.54667 51.039989 11.760004 c 51.026657 11.973338 51.05999 12.203338 51.139988 12.450005 c 51.219986 12.696671 51.379986 12.926671 51.619987 13.140005 c 51.646656 13.180005 51.683323 13.220005 51.729988 13.260005 c 51.776653 13.300005 51.826656 13.333338 51.87999 13.360005 c 51.919991 13.386672 51.953323 13.413339 51.979988 13.440005 c 52.05999 13.520005 l 52.206657 13.640005 52.356659 13.760005 52.509991 13.880005 c 52.663322 14.000005 52.819992 14.120005 52.979992 14.240005 c 53.353325 14.560005 53.663326 14.850005 53.909992 15.110004 c 54.156658 15.370004 54.363323 15.613338 54.529991 15.840004 c 54.696659 16.066671 54.819992 16.280004 54.89999 16.480003 c 54.979988 16.680002 55.026657 16.873337 55.039989 17.060003 c 55.173325 17.673336 55.14999 18.190002 54.96999 18.610003 c 54.789989 19.030003 54.55999 19.360003 54.279991 19.600002 c 54.259991 19.600002 l 54.259991 19.626669 54.246658 19.640003 54.21999 19.640003 c 54.193321 19.66667 54.166656 19.68667 54.139988 19.700003 c 54.019989 19.780003 l 54.019989 19.780003 53.979988 19.800003 53.89999 19.840002 c 53.89999 19.860003 l 53.886658 19.860003 53.873322 19.863337 53.859989 19.870003 c 53.846657 19.876669 53.833321 19.880003 53.819988 19.880003 c 53.82 19.879999 l h f Q Q Q showpage %%PageTrailer pdfEndPage %%Trailer end %%DocumentSuppliedResources: %%EOF ================================================ FILE: resources/logo/print/eps/Color logo - no background.eps ================================================ %!PS-Adobe-3.0 EPSF-3.0 %Produced by poppler pdftops version: 0.59.0 (http://poppler.freedesktop.org) %%Creator: Chromium %%LanguageLevel: 3 %%DocumentSuppliedResources: (atend) %%BoundingBox: 0 0 2409 909 %%HiResBoundingBox: 0 0 2409 909 %%DocumentSuppliedResources: (atend) %%EndComments %%BeginProlog %%BeginResource: procset xpdf 3.00 0 %%Copyright: Copyright 1996-2011 Glyph & Cog, LLC /xpdf 75 dict def xpdf begin % PDF special state /pdfDictSize 15 def /pdfSetup { /setpagedevice where { pop 2 dict begin /Policies 1 dict dup begin /PageSize 6 def end def { /Duplex true def } if currentdict end setpagedevice } { pop } ifelse } def /pdfSetupPaper { % Change paper size, but only if different from previous paper size otherwise % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size % so we use the same when checking if the size changes. /setpagedevice where { pop currentpagedevice /PageSize known { 2 copy currentpagedevice /PageSize get aload pop exch 4 1 roll sub abs 5 gt 3 1 roll sub abs 5 gt or } { true } ifelse { 2 array astore 2 dict begin /PageSize exch def /ImagingBBox null def currentdict end setpagedevice } { pop pop } ifelse } { pop } ifelse } def /pdfStartPage { pdfDictSize dict begin /pdfFillCS [] def /pdfFillXform {} def /pdfStrokeCS [] def /pdfStrokeXform {} def /pdfFill [0] def /pdfStroke [0] def /pdfFillOP false def /pdfStrokeOP false def /pdfOPM false def /pdfLastFill false def /pdfLastStroke false def /pdfTextMat [1 0 0 1 0 0] def /pdfFontSize 0 def /pdfCharSpacing 0 def /pdfTextRender 0 def /pdfPatternCS false def /pdfTextRise 0 def /pdfWordSpacing 0 def /pdfHorizScaling 1 def /pdfTextClipPath [] def } def /pdfEndPage { end } def % PDF color state /opm { dup /pdfOPM exch def /setoverprintmode where{pop setoverprintmode}{pop}ifelse } def /cs { /pdfFillXform exch def dup /pdfFillCS exch def setcolorspace } def /CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def setcolorspace } def /sc { pdfLastFill not { pdfFillCS setcolorspace } if dup /pdfFill exch def aload pop pdfFillXform setcolor /pdfLastFill true def /pdfLastStroke false def } def /SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if dup /pdfStroke exch def aload pop pdfStrokeXform setcolor /pdfLastStroke true def /pdfLastFill false def } def /op { /pdfFillOP exch def pdfLastFill { pdfFillOP setoverprint } if } def /OP { /pdfStrokeOP exch def pdfLastStroke { pdfStrokeOP setoverprint } if } def /fCol { pdfLastFill not { pdfFillCS setcolorspace pdfFill aload pop pdfFillXform setcolor pdfFillOP setoverprint /pdfLastFill true def /pdfLastStroke false def } if } def /sCol { pdfLastStroke not { pdfStrokeCS setcolorspace pdfStroke aload pop pdfStrokeXform setcolor pdfStrokeOP setoverprint /pdfLastStroke true def /pdfLastFill false def } if } def % build a font /pdfMakeFont { 4 3 roll findfont 4 2 roll matrix scale makefont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /Encoding exch def currentdict end definefont pop } def /pdfMakeFont16 { exch findfont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /WMode exch def currentdict end definefont pop } def /pdfMakeFont16L3 { 1 index /CIDFont resourcestatus { pop pop 1 index /CIDFont findresource /CIDFontType known } { false } ifelse { 0 eq { /Identity-H } { /Identity-V } ifelse exch 1 array astore composefont pop } { pdfMakeFont16 } ifelse } def % graphics state operators /q { gsave pdfDictSize dict begin } def /Q { end grestore /pdfLastFill where { pop pdfLastFill { pdfFillOP setoverprint } { pdfStrokeOP setoverprint } ifelse } if /pdfOPM where { pop pdfOPM /setoverprintmode where{pop setoverprintmode}{pop}ifelse } if } def /cm { concat } def /d { setdash } def /i { setflat } def /j { setlinejoin } def /J { setlinecap } def /M { setmiterlimit } def /w { setlinewidth } def % path segment operators /m { moveto } def /l { lineto } def /c { curveto } def /re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath } def /h { closepath } def % path painting operators /S { sCol stroke } def /Sf { fCol stroke } def /f { fCol fill } def /f* { fCol eofill } def % clipping operators /W { clip newpath } def /W* { eoclip newpath } def /Ws { strokepath clip newpath } def % text state operators /Tc { /pdfCharSpacing exch def } def /Tf { dup /pdfFontSize exch def dup pdfHorizScaling mul exch matrix scale pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put exch findfont exch makefont setfont } def /Tr { /pdfTextRender exch def } def /Tp { /pdfPatternCS exch def } def /Ts { /pdfTextRise exch def } def /Tw { /pdfWordSpacing exch def } def /Tz { /pdfHorizScaling exch def } def % text positioning operators /Td { pdfTextMat transform moveto } def /Tm { /pdfTextMat exch def } def % text string operators /xyshow where { pop /xyshow2 { dup length array 0 2 2 index length 1 sub { 2 index 1 index 2 copy get 3 1 roll 1 add get pdfTextMat dtransform 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put } for exch pop xyshow } def }{ /xyshow2 { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval show moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval show moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /cshow where { pop /xycp { 0 3 2 roll { pop pop currentpoint 3 2 roll 1 string dup 0 4 3 roll put false charpath moveto 2 copy get 2 index 2 index 1 add get pdfTextMat dtransform rmoveto 2 add } exch cshow pop pop } def }{ /xycp { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval false charpath moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval false charpath moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /Tj { fCol 0 pdfTextRise pdfTextMat dtransform rmoveto currentpoint 4 2 roll pdfTextRender 1 and 0 eq { 2 copy xyshow2 } if pdfTextRender 3 and dup 1 eq exch 2 eq or { 3 index 3 index moveto 2 copy currentfont /FontType get 3 eq { fCol } { sCol } ifelse xycp currentpoint stroke moveto } if pdfTextRender 4 and 0 ne { 4 2 roll moveto xycp /pdfTextClipPath [ pdfTextClipPath aload pop {/moveto cvx} {/lineto cvx} {/curveto cvx} {/closepath cvx} pathforall ] def currentpoint newpath moveto } { pop pop pop pop } ifelse 0 pdfTextRise neg pdfTextMat dtransform rmoveto } def /TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 pdfTextMat dtransform rmoveto } def /TJmV { 0.001 mul pdfFontSize mul neg 0 exch pdfTextMat dtransform rmoveto } def /Tclip { pdfTextClipPath cvx exec clip newpath /pdfTextClipPath [] def } def /Tclip* { pdfTextClipPath cvx exec eoclip newpath /pdfTextClipPath [] def } def % Level 2/3 image operators /pdfImBuf 100 string def /pdfImStr { 2 copy exch length lt { 2 copy get exch 1 add exch } { () } ifelse } def /skipEOD { { currentfile pdfImBuf readline not { pop exit } if (%-EOD-) eq { exit } if } loop } def /pdfIm { image skipEOD } def /pdfMask { /ReusableStreamDecode filter skipEOD /maskStream exch def } def /pdfMaskEnd { maskStream closefile } def /pdfMaskInit { /maskArray exch def /maskIdx 0 def } def /pdfMaskSrc { maskIdx maskArray length lt { maskArray maskIdx get /maskIdx maskIdx 1 add def } { () } ifelse } def /pdfImM { fCol imagemask skipEOD } def /pr { 2 index 2 index 3 2 roll putinterval 4 add } def /pdfImClip { gsave 0 2 4 index length 1 sub { dup 4 index exch 2 copy get 5 index div put 1 add 3 index exch 2 copy get 3 index div put } for pop pop rectclip } def /pdfImClipEnd { grestore } def % shading operators /colordelta { false 0 1 3 index length 1 sub { dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { pop true } if } for exch pop exch pop } def /funcCol { func n array astore } def /funcSH { dup 0 eq { true } { dup 6 eq { false } { 4 index 4 index funcCol dup 6 index 4 index funcCol dup 3 1 roll colordelta 3 1 roll 5 index 5 index funcCol dup 3 1 roll colordelta 3 1 roll 6 index 8 index funcCol dup 3 1 roll colordelta 3 1 roll colordelta or or or } ifelse } ifelse { 1 add 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch 6 index 6 index 4 index 4 index 4 index funcSH 2 index 6 index 6 index 4 index 4 index funcSH 6 index 2 index 4 index 6 index 4 index funcSH 5 3 roll 3 2 roll funcSH pop pop } { pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul funcCol sc dup 4 index exch mat transform m 3 index 3 index mat transform l 1 index 3 index mat transform l mat transform l pop pop h f* } ifelse } def /axialCol { dup 0 lt { pop t0 } { dup 1 gt { pop t1 } { dt mul t0 add } ifelse } ifelse func n array astore } def /axialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index axialCol 2 index axialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index axialSH exch 3 2 roll axialSH } { pop 2 copy add 0.5 mul axialCol sc exch dup dx mul x0 add exch dy mul y0 add 3 2 roll dup dx mul x0 add exch dy mul y0 add dx abs dy abs ge { 2 copy yMin sub dy mul dx div add yMin m yMax sub dy mul dx div add yMax l 2 copy yMax sub dy mul dx div add yMax l yMin sub dy mul dx div add yMin l h f* } { exch 2 copy xMin sub dx mul dy div add xMin exch m xMax sub dx mul dy div add xMax exch l exch 2 copy xMax sub dx mul dy div add xMax exch l xMin sub dx mul dy div add xMin exch l h f* } ifelse } ifelse } def /radialCol { dup t0 lt { pop t0 } { dup t1 gt { pop t1 } if } ifelse func n array astore } def /radialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index dt mul t0 add radialCol 2 index dt mul t0 add radialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index radialSH exch 3 2 roll radialSH } { pop 2 copy add 0.5 mul dt mul t0 add radialCol sc encl { exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 0 360 arc h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 360 0 arcn h f } { 2 copy dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arcn dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arcn h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arc dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arc h f } ifelse } ifelse } def end %%EndResource /CIDInit /ProcSet findresource begin 10 dict begin begincmap /CMapType 1 def /CMapName /Identity-H def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Identity) def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 0 usefont 1 begincidrange <0000> 0 endcidrange endcmap currentdict CMapName exch /CMap defineresource pop end 10 dict begin begincmap /CMapType 1 def /CMapName /Identity-V def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Identity) def /Supplement 0 def end def /WMode 1 def 1 begincodespacerange <0000> endcodespacerange 0 usefont 1 begincidrange <0000> 0 endcidrange endcmap currentdict CMapName exch /CMap defineresource pop end end %%EndProlog %%BeginSetup xpdf begin %%EndSetup pdfStartPage %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer 0 0 2409 909 re W q [1 0 0 -1 0 909] cm q 0 0 2409 908.7038 re W* q [0.747904 0 0 0.747904 0 -908.7038] cm /DeviceRGB {} CS [1 1 1] SC /DeviceRGB {} cs [1 1 1] sc 0 0 3221 2436 re f Q Q q 5.983235 0 2403.0168 907.20795 re W* q [0.822879 0 0 0.822978 95.330643 145.991699] cm /DeviceRGB {} CS [0.09 0.329 0.122] SC /DeviceRGB {} cs [0.09 0.329 0.122] sc 231 798 m 227 779 219 741 218 741 c 49 640 69 465 125 365 c 137 491 360 578 230 732 c 229 734 236 758 242 780 c 268 736 307 683 305 678 c 145 288 645 258 749 16 c 796 250 725 612 323 704 c 321 705 250 830 247 831 c 247 829 217 830 221 820 c 223 814 227 806 231 798 c h 330 625 m 267 476 452 312 544 271 c 356 439 324 564 330 625 c h 226 704 m 277 645 217 544 181 511 c 242 616 238 677 226 704 c h f Q q [26.582434 0 0 26.585632 866.89978 103.116905] cm /DeviceRGB {} CS [0.145 0.22 0.059] SC /DeviceRGB {} cs [0.145 0.22 0.059] sc 6.5 8.62 m 6.513333 8.940001 6.52 9.303333 6.52 9.71 c 6.52 10.116667 6.513333 10.473333 6.5 10.78 c 6.5 11.139999 6.436667 11.496666 6.31 11.849999 c 6.183333 12.203333 5.993333 12.52 5.74 12.799999 c 5.486666 13.079999 5.17 13.299999 4.79 13.459999 c 4.41 13.619999 3.973334 13.699999 3.48 13.699999 c 2.46 13.699999 l 2.46 18.919998 l 2.46 19.106665 2.486667 19.243332 2.54 19.329998 c 2.593333 19.416664 2.646667 19.466663 2.7 19.479998 c 2.78 19.519997 2.866667 19.519997 2.96 19.479998 c 2.96 19.999998 l 0.54 19.999998 l 0.54 19.479998 l 0.646667 19.519997 0.726667 19.519997 0.78 19.479998 c 0.846667 19.466663 0.913333 19.416664 0.98 19.329998 c 1.046667 19.243332 1.08 19.106665 1.08 18.919998 c 1.08 6.779998 l 1.08 6.579998 1.046667 6.436665 0.98 6.349998 c 0.913333 6.263331 0.846667 6.206665 0.78 6.179998 c 0.726667 6.153331 0.646667 6.153331 0.54 6.179998 c 0.54 5.699998 l 3.48 5.699998 l 3.973334 5.699998 4.41 5.779998 4.79 5.939998 c 5.17 6.099998 5.486666 6.319997 5.74 6.599998 c 5.993333 6.879998 6.183333 7.193331 6.31 7.539998 c 6.436667 7.886664 6.5 8.246664 6.5 8.619998 c 6.5 8.62 l h 5.08 8.18 m 5.08 7.833334 5.023333 7.533334 4.91 7.28 c 4.796667 7.026667 4.663333 6.826667 4.51 6.68 c 4.356667 6.533334 4.196666 6.416667 4.03 6.33 c 3.863333 6.243334 3.72 6.2 3.6 6.2 c 2.46 6.2 l 2.46 13.16 l 3.599999 13.16 l 3.72 13.16 3.863333 13.126666 4.029999 13.06 c 4.196666 12.993333 4.356666 12.876666 4.509999 12.709999 c 4.663333 12.543332 4.796666 12.339999 4.909999 12.099999 c 5.023333 11.86 5.079999 11.56 5.079999 11.2 c 5.079999 8.18 l 5.08 8.18 l h 14.58 19.139999 m 14.58 19.246666 14.553333 19.356667 14.5 19.469999 c 14.446667 19.583332 14.37 19.689999 14.270001 19.789999 c 14.170001 19.889999 14.043334 19.98 13.89 20.059999 c 13.736667 20.139999 13.56 20.18 13.360001 20.18 c 13.040001 20.18 12.753334 20.106667 12.500001 19.960001 c 12.246668 19.813335 12.073335 19.620001 11.980001 19.380001 c 11.900002 19.246668 11.840001 19.093334 11.800001 18.920002 c 11.626668 19.280003 11.363335 19.580002 11.010001 19.820002 c 10.656668 20.060001 10.266668 20.18 9.840001 20.180002 c 9.306667 20.180002 8.840001 19.98667 8.440002 19.600002 c 8.213335 19.400003 8.026669 19.140003 7.880002 18.820002 c 7.733335 18.5 7.646668 18.133333 7.620002 17.720001 c 7.606669 17.680002 7.600002 17.600002 7.600002 17.480001 c 7.600002 17.460001 l 7.613335 17.233334 7.653335 16.996668 7.720002 16.750002 c 7.786668 16.503336 7.890002 16.25667 8.030002 16.010002 c 8.170002 15.763335 8.336668 15.530002 8.530002 15.310002 c 8.723335 15.090003 8.933335 14.900003 9.160002 14.740003 c 9.213335 14.713336 9.256668 14.683336 9.290002 14.650003 c 9.323336 14.616669 9.373335 14.580003 9.440002 14.540003 c 9.500002 14.510003 l 9.560002 14.480003 l 9.800002 14.333337 10.010002 14.200004 10.190002 14.080004 c 10.370003 13.960004 10.533336 13.846671 10.680002 13.740004 c 10.760002 13.68667 10.840002 13.62667 10.920002 13.560003 c 11.000002 13.493337 11.086669 13.42667 11.180002 13.360004 c 11.300002 13.280004 11.413336 13.18667 11.520002 13.080004 c 11.626669 12.973337 11.706669 12.84667 11.760002 12.700004 c 11.840002 12.56667 11.880002 12.406671 11.880002 12.220003 c 11.880002 12.033336 11.860002 11.86667 11.820002 11.720003 c 11.766668 11.42667 11.630002 11.173337 11.410002 10.960003 c 11.190002 10.746669 10.946669 10.606669 10.680002 10.540003 c 10.560002 10.500003 10.446669 10.480002 10.340002 10.480002 c 9.966668 10.480002 9.646668 10.546669 9.380002 10.680002 c 9.206669 10.760002 9.080002 10.850002 9.000002 10.950003 c 8.920002 11.050003 8.876669 11.143336 8.870002 11.230002 c 8.863335 11.316669 8.880002 11.386668 8.920002 11.440002 c 8.960002 11.493337 9.013335 11.533337 9.080002 11.560002 c 9.106669 11.573336 9.123335 11.580003 9.130002 11.580003 c 9.136669 11.580003 9.153336 11.58667 9.180002 11.600003 c 9.353335 11.66667 9.496669 11.783337 9.610003 11.950004 c 9.723336 12.116671 9.780003 12.300004 9.780003 12.500004 c 9.780003 12.753337 9.690002 12.970004 9.510002 13.150003 c 9.330002 13.330003 9.113336 13.420003 8.860003 13.420004 c 8.593336 13.420004 8.36667 13.330004 8.180002 13.150003 c 7.993335 12.970003 7.900002 12.753337 7.900002 12.500004 c 7.900002 12.273337 7.930002 12.036671 7.990002 11.790004 c 8.050002 11.543337 8.140002 11.320004 8.260002 11.120004 c 8.513335 10.74667 8.816669 10.47667 9.170002 10.310003 c 9.523336 10.143336 9.913335 10.060003 10.340002 10.060003 c 10.660002 10.060003 10.976668 10.120004 11.290002 10.240004 c 11.603335 10.360004 11.883335 10.530004 12.130002 10.750004 c 12.376669 10.970004 12.583335 11.233337 12.750002 11.540004 c 12.916669 11.84667 13.000002 12.200004 13.000002 12.600004 c 13.000002 18.480003 l 13.000002 18.720003 13.003335 18.876671 13.010002 18.950003 c 13.016669 19.023335 13.020002 19.073336 13.020002 19.100002 c 13.020002 19.273336 13.073336 19.413336 13.180002 19.520002 c 13.286669 19.626669 13.413336 19.680002 13.560002 19.680002 c 13.733335 19.680002 13.873336 19.630003 13.980002 19.530003 c 14.086669 19.430002 14.146669 19.300003 14.160003 19.140003 c 14.580003 19.140003 l 14.58 19.139999 l h 11.44 18.639999 m 11.546666 18.453333 11.61 18.253332 11.629999 18.039999 c 11.649999 17.826666 11.659999 17.626665 11.659999 17.439999 c 11.659999 13.739999 l 11.606666 13.793332 11.549999 13.843332 11.489999 13.889998 c 11.429998 13.936665 11.366666 13.993332 11.299999 14.059999 c 10.913333 14.339998 10.583333 14.596665 10.31 14.829998 c 10.036666 15.063331 9.806666 15.303331 9.619999 15.549998 c 9.433332 15.796665 9.286665 16.06 9.179999 16.339998 c 9.073334 16.619999 9.006667 16.939999 8.98 17.299999 c 8.98 17.599998 l 8.993333 18.106665 9.13 18.503332 9.389999 18.789999 c 9.649999 19.076666 10.019999 19.219999 10.499999 19.219999 c 10.713332 19.219999 10.906666 19.166666 11.079999 19.059999 c 11.253332 18.939999 11.373332 18.799999 11.439999 18.639999 c 11.44 18.639999 l h 18.32 10.08 m 19.08 10.093333 19.686666 10.323334 20.139999 10.770001 c 20.593332 11.216667 20.82 11.926667 20.82 12.900001 c 20.82 17.380001 l 20.82 18.353334 20.593332 19.059999 20.139999 19.5 c 19.686666 19.940001 19.08 20.173334 18.32 20.200001 c 18.26 20.200001 l 18.033333 20.200001 17.826666 20.173334 17.639999 20.120001 c 17.619999 20.120001 l 17.606665 20.120001 17.599998 20.113335 17.599998 20.1 c 17.293333 19.993334 17.026667 19.846666 16.799999 19.66 c 16.609999 19.469999 l 16.609999 19.469999 16.56 19.4 16.459999 19.26 c 16.459999 22.58 l 16.459999 22.766666 16.486666 22.903334 16.539999 22.99 c 16.593332 23.076666 16.646666 23.133333 16.699999 23.16 c 16.779999 23.199999 16.866667 23.199999 16.959999 23.16 c 16.959999 23.66 l 14.539999 23.66 l 14.539999 23.16 l 14.646666 23.199999 14.726666 23.199999 14.779999 23.16 c 14.846665 23.133333 14.909999 23.076666 14.969998 22.99 c 15.029998 22.903334 15.059998 22.766666 15.059999 22.58 c 15.059999 11.3 l 15.059999 11.113334 15.029999 10.976667 14.969998 10.89 c 14.909998 10.803333 14.846665 10.746667 14.779999 10.72 c 14.726666 10.693334 14.646666 10.693334 14.539999 10.72 c 14.539999 10.24 l 16.459999 10.24 l 16.459999 11.02 l 16.553331 10.873333 16.666666 10.74 16.799999 10.62 c 17.026667 10.42 17.293333 10.273334 17.599998 10.18 c 17.599998 10.166667 17.606665 10.16 17.619999 10.16 c 17.639999 10.16 l 17.853333 10.106667 18.059999 10.08 18.26 10.08 c 18.32 10.08 l h 19.32 12.46 m 19.32 12.44 l 19.306665 11.76 19.223333 11.28 19.07 11 c 18.916666 10.72 18.666666 10.566667 18.32 10.54 c 18.08 10.526667 17.853333 10.556666 17.639999 10.63 c 17.426666 10.703334 17.24 10.826667 17.08 11 c 16.92 11.173333 16.786667 11.406666 16.68 11.7 c 16.573334 11.993334 16.5 12.34 16.460001 12.74 c 16.460001 17.540001 l 16.5 17.953335 16.573334 18.303335 16.68 18.59 c 16.786667 18.876665 16.92 19.103333 17.08 19.27 c 17.24 19.436668 17.426666 19.560001 17.639999 19.640001 c 17.853333 19.720001 18.08 19.753334 18.32 19.740002 c 18.666666 19.713335 18.916666 19.560001 19.07 19.280003 c 19.223333 19.000004 19.306665 18.520004 19.32 17.840002 c 19.32 17.820002 l 19.32 12.460001 l 19.32 12.46 l h 24.379999 10.08 m 24.686665 10.08 24.999998 10.133333 25.32 10.24 c 25.640001 10.346666 25.926668 10.513333 26.18 10.74 c 26.433332 10.966666 26.636667 11.253333 26.790001 11.599999 c 26.943335 11.946666 27.020002 12.359999 27.02 12.839999 c 27.02 14.859999 l 27.02 14.919999 l 27.02 15.379999 l 23.040001 15.379999 l 23.040001 17.439999 l 23.040001 18.266665 23.183334 18.856665 23.470001 19.209999 c 23.756668 19.563334 24.113335 19.733334 24.540001 19.719999 c 24.793333 19.706665 25.043333 19.663332 25.290001 19.59 c 25.536669 19.516668 25.750002 19.393333 25.93 19.219999 c 26.109999 19.046665 26.26 18.799997 26.380001 18.48 c 26.500002 18.160002 26.560003 17.740002 26.560001 17.219999 c 27.02 17.219999 l 27.02 17.5 l 27.02 17.860001 26.98 18.203335 26.9 18.530001 c 26.82 18.856667 26.679998 19.140001 26.48 19.380001 c 26.280001 19.620001 26.023333 19.810001 25.709999 19.950001 c 25.396666 20.09 25.013332 20.166666 24.559999 20.18 c 24.24 20.18 23.913334 20.120001 23.58 20 c 23.246666 19.879999 22.946667 19.699999 22.68 19.459999 c 22.413334 19.219999 22.193335 18.936665 22.02 18.609999 c 21.846666 18.283333 21.76 17.913332 21.76 17.499998 c 21.76 17.029999 l 21.76 17.029999 21.756666 16.773333 21.75 16.259998 c 21.743334 15.746665 21.74 15.429998 21.74 15.309999 c 21.74 15.189999 21.736666 14.859999 21.73 14.319999 c 21.723333 13.779999 21.719999 13.489999 21.719999 13.449999 c 21.719999 12.859999 l 21.719999 12.379998 21.803333 11.963332 21.969999 11.609999 c 22.136665 11.256665 22.343332 10.969999 22.59 10.749999 c 22.836668 10.529999 23.116667 10.363333 23.43 10.249999 c 23.743334 10.136665 24.059999 10.079999 24.380001 10.079999 c 24.379999 10.08 l h 25.68 14.86 m 25.68 13.28 l 25.68 12.773333 25.646667 12.349999 25.58 12.01 c 25.513332 11.670001 25.423332 11.396668 25.309999 11.190001 c 25.196667 10.983334 25.059999 10.84 24.9 10.76 c 24.74 10.68 24.559999 10.64 24.359999 10.64 c 23.933332 10.64 23.609999 10.826667 23.389999 11.200001 c 23.17 11.573335 23.059999 12.266667 23.059999 13.280001 c 23.059999 14.860001 l 25.68 14.860001 l 25.68 14.86 l h 33.540001 11.66 m 33.540001 11.686667 33.546669 11.74 33.560001 11.82 c 33.573334 11.9 33.573334 11.966666 33.560001 12.02 c 33.546669 12.299999 33.450001 12.53 33.27 12.709999 c 33.09 12.889998 32.873333 12.979999 32.619999 12.98 c 32.353333 12.98 32.129997 12.886666 31.949999 12.7 c 31.77 12.513333 31.68 12.286667 31.679998 12.02 c 31.679998 11.686667 31.806665 11.433332 32.059998 11.259999 c 32.086666 11.246666 32.103333 11.236666 32.109997 11.23 c 32.139996 11.2 l 32.23333 11.133333 32.293327 11.036666 32.319996 10.91 c 32.346664 10.783334 32.266663 10.673333 32.079994 10.58 c 31.959993 10.513333 31.839994 10.48 31.719994 10.48 c 31.319994 10.453333 30.96666 10.573333 30.659994 10.839999 c 30.353329 11.106666 30.146662 11.573332 30.039993 12.239999 c 30.039993 18.919998 l 30.039993 19.106665 30.06666 19.243332 30.119993 19.329998 c 30.173326 19.416664 30.22666 19.466663 30.279993 19.479998 c 30.359993 19.519997 30.446661 19.519997 30.539993 19.479998 c 30.539993 19.999998 l 28.119993 19.999998 l 28.119993 19.479998 l 28.22666 19.519997 28.30666 19.519997 28.359993 19.479998 c 28.426661 19.466663 28.493326 19.416664 28.559994 19.329998 c 28.626661 19.243332 28.659994 19.106665 28.659994 18.919998 c 28.659994 11.299998 l 28.659994 11.113332 28.626661 10.976666 28.559994 10.889998 c 28.493326 10.803331 28.426661 10.746665 28.359993 10.719998 c 28.30666 10.693332 28.22666 10.693332 28.119993 10.719998 c 28.119993 10.219998 l 30.039993 10.219998 l 30.039993 11.039998 l 30.133326 10.893332 30.22666 10.756664 30.319994 10.629998 c 30.413328 10.503332 30.523329 10.396666 30.649994 10.309999 c 30.776659 10.223331 30.923326 10.153332 31.089994 10.099999 c 31.256662 10.046665 31.466661 10.019999 31.719994 10.019999 c 32.106663 10.019999 32.466663 10.159999 32.799995 10.439999 c 33.133327 10.719998 33.379997 11.126665 33.539997 11.659999 c 33.540001 11.66 l h 36.240002 18.92 m 36.240002 19.106667 36.27 19.243334 36.330002 19.33 c 36.390003 19.416666 36.446667 19.466665 36.5 19.48 c 36.566666 19.519999 36.653332 19.519999 36.759998 19.48 c 36.759998 20 l 34.339996 20 l 34.339996 19.48 l 34.446663 19.519999 34.539997 19.519999 34.619995 19.48 c 34.659996 19.466665 34.713329 19.416666 34.779995 19.33 c 34.846661 19.243334 34.879993 19.106667 34.879993 18.92 c 34.879993 6.8 l 34.879993 6.6 34.846661 6.456667 34.779995 6.37 c 34.713329 6.283334 34.659996 6.226667 34.619995 6.2 c 34.539997 6.16 34.446663 6.16 34.339996 6.2 c 34.339996 5.72 l 36.239998 5.72 l 36.239998 6.8 l 36.239998 18.92 l 36.240002 18.92 l h 40.580002 10.08 m 40.886669 10.08 41.200001 10.133333 41.52 10.24 c 41.84 10.346666 42.126667 10.513333 42.380001 10.74 c 42.633335 10.966666 42.83667 11.253333 42.990002 11.599999 c 43.143333 11.946666 43.220001 12.359999 43.220001 12.839999 c 43.220001 14.859999 l 43.220001 14.919999 l 43.220001 15.379999 l 39.240002 15.379999 l 39.240002 17.439999 l 39.240002 18.266665 39.383335 18.856665 39.670002 19.209999 c 39.956669 19.563334 40.313335 19.733334 40.740002 19.719999 c 40.993336 19.706665 41.243336 19.663332 41.490002 19.59 c 41.736668 19.516668 41.950001 19.393333 42.130001 19.219999 c 42.310001 19.046665 42.460003 18.799997 42.580002 18.48 c 42.700001 18.160002 42.760002 17.740002 42.760002 17.219999 c 43.220001 17.219999 l 43.220001 17.5 l 43.220001 17.860001 43.18 18.203335 43.100002 18.530001 c 43.020004 18.856667 42.880005 19.140001 42.680004 19.380001 c 42.480003 19.620001 42.223339 19.810001 41.910004 19.950001 c 41.596668 20.09 41.213337 20.166666 40.760002 20.18 c 40.440002 20.18 40.113335 20.120001 39.780003 20 c 39.446671 19.879999 39.146667 19.699999 38.880001 19.459999 c 38.613335 19.219999 38.393333 18.936665 38.220001 18.609999 c 38.046669 18.283333 37.960003 17.913332 37.960003 17.499998 c 37.960003 17.029999 l 37.960003 17.029999 37.956669 16.773333 37.950005 16.259998 c 37.94334 15.746665 37.940006 15.429998 37.940006 15.309999 c 37.940006 15.189999 37.936672 14.859999 37.930008 14.319999 c 37.923344 13.779999 37.92001 13.489999 37.92001 13.449999 c 37.92001 12.859999 l 37.92001 12.379998 38.003342 11.963332 38.17001 11.609999 c 38.336678 11.256665 38.543343 10.969999 38.790009 10.749999 c 39.036674 10.529999 39.316673 10.363333 39.630009 10.249999 c 39.943344 10.136665 40.26001 10.079999 40.580009 10.079999 c 40.580002 10.08 l h 41.880001 14.86 m 41.880001 13.28 l 41.880001 12.773333 41.846668 12.349999 41.780003 12.01 c 41.713337 11.670001 41.623337 11.396668 41.510002 11.190001 c 41.396667 10.983334 41.260002 10.84 41.100002 10.76 c 40.940002 10.68 40.760002 10.64 40.560001 10.64 c 40.133335 10.64 39.810001 10.826667 39.59 11.200001 c 39.369999 11.573335 39.259998 12.266667 39.259998 13.280001 c 39.259998 14.860001 l 41.879997 14.860001 l 41.880001 14.86 l h 47.880001 19.879999 m 47.866669 19.893333 47.856667 19.9 47.850002 19.9 c 47.843338 19.9 47.833336 19.906666 47.820004 19.92 c 47.800003 19.940001 l 47.773335 19.953335 47.743336 19.966667 47.710003 19.980001 c 47.67667 19.993336 47.646671 20.006668 47.620003 20.020002 c 47.340004 20.140003 47.013336 20.200003 46.640003 20.200003 c 46.42667 20.200003 46.220005 20.150003 46.020004 20.050003 c 45.820004 19.950003 45.646671 19.866671 45.500004 19.800003 c 45.353336 19.733335 45.230003 19.703337 45.130005 19.710003 c 45.030006 19.716669 44.980007 19.813337 44.980003 20.000004 c 44.600002 20.000004 l 44.600002 17.600004 l 45.080002 17.600004 l 45.053333 18.02667 45.100002 18.393337 45.220001 18.700005 c 45.299999 18.966671 45.456669 19.216671 45.690002 19.450005 c 45.923336 19.683338 46.273338 19.800005 46.740002 19.800005 c 47.046669 19.800005 47.299999 19.746672 47.5 19.640005 c 47.846668 19.466671 48.083332 19.260004 48.209999 19.020004 c 48.336666 18.780005 48.386665 18.530005 48.360001 18.270004 c 48.333336 18.010004 48.236668 17.753338 48.07 17.500004 c 47.903332 17.24667 47.699997 17.013336 47.459999 16.800003 c 47.299999 16.680002 47.133331 16.553337 46.959999 16.420004 c 46.786667 16.286671 46.613335 16.146671 46.439999 16.000004 c 45.973331 15.62667 45.603333 15.290004 45.329998 14.990004 c 45.056664 14.690003 44.846664 14.410004 44.699997 14.150003 c 44.553329 13.890003 44.453331 13.643336 44.399998 13.410004 c 44.346664 13.176671 44.32 12.926671 44.319996 12.660004 c 44.319996 12.500004 44.329994 12.353337 44.349995 12.220004 c 44.369995 12.086671 44.393326 11.966671 44.419994 11.860004 c 44.459995 11.633338 44.526661 11.413338 44.619995 11.200005 c 44.713329 10.986671 44.846661 10.796672 45.019997 10.630005 c 45.193333 10.463338 45.406666 10.326672 45.659996 10.220005 c 45.913326 10.113339 46.219994 10.060005 46.579994 10.060005 c 46.779995 10.060005 46.979992 10.103338 47.179993 10.190005 c 47.379993 10.276672 47.559994 10.356672 47.719994 10.430005 c 47.879993 10.503338 48.00666 10.536672 48.099995 10.530006 c 48.193329 10.523339 48.239994 10.420006 48.239994 10.220005 c 48.619995 10.220005 l 48.619995 12.700005 l 48.099995 12.700005 l 48.113327 12.300004 48.066662 11.940004 47.959995 11.620005 c 47.866661 11.340005 47.703327 11.086671 47.469994 10.860004 c 47.23666 10.633338 46.893326 10.520004 46.439995 10.520004 c 46.079994 10.520004 45.786659 10.600004 45.559994 10.760004 c 45.439995 10.853337 45.336658 10.990005 45.249992 11.170004 c 45.163326 11.350003 45.113323 11.54667 45.099991 11.760004 c 45.086658 11.973338 45.119991 12.203338 45.199989 12.450005 c 45.279987 12.696671 45.439987 12.926671 45.679989 13.140005 c 45.706657 13.180005 45.743324 13.220005 45.789989 13.260005 c 45.836655 13.300005 45.886658 13.333338 45.939991 13.360005 c 45.979992 13.386672 46.013325 13.413339 46.039989 13.440005 c 46.119991 13.520005 l 46.266659 13.640005 46.41666 13.760005 46.569992 13.880005 c 46.723324 14.000005 46.879993 14.120005 47.039993 14.240005 c 47.413326 14.560005 47.723328 14.850005 47.969994 15.110004 c 48.21666 15.370004 48.423325 15.613338 48.589993 15.840004 c 48.75666 16.066671 48.879993 16.280004 48.959991 16.480003 c 49.039989 16.680002 49.086658 16.873337 49.099991 17.060003 c 49.233326 17.673336 49.209991 18.190002 49.029991 18.610003 c 48.849991 19.030003 48.619991 19.360003 48.339993 19.600002 c 48.319992 19.600002 l 48.319992 19.626669 48.30666 19.640003 48.279991 19.640003 c 48.253323 19.66667 48.226658 19.68667 48.199989 19.700003 c 48.07999 19.780003 l 48.07999 19.780003 48.039989 19.800003 47.959991 19.840002 c 47.959991 19.860003 l 47.946659 19.860003 47.933323 19.863337 47.919991 19.870003 c 47.906658 19.876669 47.893322 19.880003 47.87999 19.880003 c 47.880001 19.879999 l h 53.82 19.879999 m 53.806667 19.893333 53.796665 19.9 53.790001 19.9 c 53.783337 19.9 53.773335 19.906666 53.760002 19.92 c 53.740002 19.940001 l 53.713333 19.953335 53.683334 19.966667 53.650002 19.980001 c 53.616669 19.993336 53.58667 20.006668 53.560001 20.020002 c 53.280003 20.140003 52.953335 20.200003 52.580002 20.200003 c 52.366669 20.200003 52.160004 20.150003 51.960003 20.050003 c 51.760002 19.950003 51.58667 19.866671 51.440002 19.800003 c 51.293335 19.733335 51.170002 19.703337 51.070004 19.710003 c 50.970005 19.716669 50.920006 19.813337 50.920002 20.000004 c 50.540001 20.000004 l 50.540001 17.600004 l 51.02 17.600004 l 50.993332 18.02667 51.040001 18.393337 51.16 18.700005 c 51.239998 18.966671 51.396667 19.216671 51.630001 19.450005 c 51.863335 19.683338 52.213337 19.800005 52.68 19.800005 c 52.986668 19.800005 53.239998 19.746672 53.439999 19.640005 c 53.786667 19.466671 54.023331 19.260004 54.149998 19.020004 c 54.276665 18.780005 54.326664 18.530005 54.299999 18.270004 c 54.273335 18.010004 54.176666 17.753338 54.009998 17.500004 c 53.84333 17.24667 53.639996 17.013336 53.399998 16.800003 c 53.239998 16.680002 53.07333 16.553337 52.899998 16.420004 c 52.726665 16.286671 52.553333 16.146671 52.379997 16.000004 c 51.91333 15.62667 51.543331 15.290004 51.269997 14.990004 c 50.996662 14.690003 50.786663 14.410004 50.639996 14.150003 c 50.493328 13.890003 50.39333 13.643336 50.339996 13.410004 c 50.286663 13.176671 50.259998 12.926671 50.259995 12.660004 c 50.259995 12.500004 50.269993 12.353337 50.289993 12.220004 c 50.309994 12.086671 50.333324 11.966671 50.359993 11.860004 c 50.399994 11.633338 50.46666 11.413338 50.559994 11.200005 c 50.653328 10.986671 50.786659 10.796672 50.959995 10.630005 c 51.133331 10.463338 51.346664 10.326672 51.599995 10.220005 c 51.853325 10.113339 52.159992 10.060005 52.519993 10.060005 c 52.719994 10.060005 52.919991 10.103338 53.119991 10.190005 c 53.319992 10.276672 53.499992 10.356672 53.659992 10.430005 c 53.819992 10.503338 53.946659 10.536672 54.039993 10.530006 c 54.133327 10.523339 54.179993 10.420006 54.179993 10.220005 c 54.559994 10.220005 l 54.559994 12.700005 l 54.039993 12.700005 l 54.053326 12.300004 54.00666 11.940004 53.899994 11.620005 c 53.80666 11.340005 53.643326 11.086671 53.409992 10.860004 c 53.176659 10.633338 52.833324 10.520004 52.379993 10.520004 c 52.019993 10.520004 51.726658 10.600004 51.499992 10.760004 c 51.379993 10.853337 51.276657 10.990005 51.189991 11.170004 c 51.103325 11.350003 51.053322 11.54667 51.039989 11.760004 c 51.026657 11.973338 51.05999 12.203338 51.139988 12.450005 c 51.219986 12.696671 51.379986 12.926671 51.619987 13.140005 c 51.646656 13.180005 51.683323 13.220005 51.729988 13.260005 c 51.776653 13.300005 51.826656 13.333338 51.87999 13.360005 c 51.919991 13.386672 51.953323 13.413339 51.979988 13.440005 c 52.05999 13.520005 l 52.206657 13.640005 52.356659 13.760005 52.509991 13.880005 c 52.663322 14.000005 52.819992 14.120005 52.979992 14.240005 c 53.353325 14.560005 53.663326 14.850005 53.909992 15.110004 c 54.156658 15.370004 54.363323 15.613338 54.529991 15.840004 c 54.696659 16.066671 54.819992 16.280004 54.89999 16.480003 c 54.979988 16.680002 55.026657 16.873337 55.039989 17.060003 c 55.173325 17.673336 55.14999 18.190002 54.96999 18.610003 c 54.789989 19.030003 54.55999 19.360003 54.279991 19.600002 c 54.259991 19.600002 l 54.259991 19.626669 54.246658 19.640003 54.21999 19.640003 c 54.193321 19.66667 54.166656 19.68667 54.139988 19.700003 c 54.019989 19.780003 l 54.019989 19.780003 53.979988 19.800003 53.89999 19.840002 c 53.89999 19.860003 l 53.886658 19.860003 53.873322 19.863337 53.859989 19.870003 c 53.846657 19.876669 53.833321 19.880003 53.819988 19.880003 c 53.82 19.879999 l h f Q Q Q showpage %%PageTrailer pdfEndPage %%Trailer end %%DocumentSuppliedResources: %%EOF ================================================ FILE: resources/logo/print/eps/Color logo with background.eps ================================================ %!PS-Adobe-3.0 EPSF-3.0 %Produced by poppler pdftops version: 0.59.0 (http://poppler.freedesktop.org) %%Creator: Chromium %%LanguageLevel: 3 %%DocumentSuppliedResources: (atend) %%BoundingBox: 0 0 2409 909 %%HiResBoundingBox: 0 0 2409 909 %%DocumentSuppliedResources: (atend) %%EndComments %%BeginProlog %%BeginResource: procset xpdf 3.00 0 %%Copyright: Copyright 1996-2011 Glyph & Cog, LLC /xpdf 75 dict def xpdf begin % PDF special state /pdfDictSize 15 def /pdfSetup { /setpagedevice where { pop 2 dict begin /Policies 1 dict dup begin /PageSize 6 def end def { /Duplex true def } if currentdict end setpagedevice } { pop } ifelse } def /pdfSetupPaper { % Change paper size, but only if different from previous paper size otherwise % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size % so we use the same when checking if the size changes. /setpagedevice where { pop currentpagedevice /PageSize known { 2 copy currentpagedevice /PageSize get aload pop exch 4 1 roll sub abs 5 gt 3 1 roll sub abs 5 gt or } { true } ifelse { 2 array astore 2 dict begin /PageSize exch def /ImagingBBox null def currentdict end setpagedevice } { pop pop } ifelse } { pop } ifelse } def /pdfStartPage { pdfDictSize dict begin /pdfFillCS [] def /pdfFillXform {} def /pdfStrokeCS [] def /pdfStrokeXform {} def /pdfFill [0] def /pdfStroke [0] def /pdfFillOP false def /pdfStrokeOP false def /pdfOPM false def /pdfLastFill false def /pdfLastStroke false def /pdfTextMat [1 0 0 1 0 0] def /pdfFontSize 0 def /pdfCharSpacing 0 def /pdfTextRender 0 def /pdfPatternCS false def /pdfTextRise 0 def /pdfWordSpacing 0 def /pdfHorizScaling 1 def /pdfTextClipPath [] def } def /pdfEndPage { end } def % PDF color state /opm { dup /pdfOPM exch def /setoverprintmode where{pop setoverprintmode}{pop}ifelse } def /cs { /pdfFillXform exch def dup /pdfFillCS exch def setcolorspace } def /CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def setcolorspace } def /sc { pdfLastFill not { pdfFillCS setcolorspace } if dup /pdfFill exch def aload pop pdfFillXform setcolor /pdfLastFill true def /pdfLastStroke false def } def /SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if dup /pdfStroke exch def aload pop pdfStrokeXform setcolor /pdfLastStroke true def /pdfLastFill false def } def /op { /pdfFillOP exch def pdfLastFill { pdfFillOP setoverprint } if } def /OP { /pdfStrokeOP exch def pdfLastStroke { pdfStrokeOP setoverprint } if } def /fCol { pdfLastFill not { pdfFillCS setcolorspace pdfFill aload pop pdfFillXform setcolor pdfFillOP setoverprint /pdfLastFill true def /pdfLastStroke false def } if } def /sCol { pdfLastStroke not { pdfStrokeCS setcolorspace pdfStroke aload pop pdfStrokeXform setcolor pdfStrokeOP setoverprint /pdfLastStroke true def /pdfLastFill false def } if } def % build a font /pdfMakeFont { 4 3 roll findfont 4 2 roll matrix scale makefont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /Encoding exch def currentdict end definefont pop } def /pdfMakeFont16 { exch findfont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /WMode exch def currentdict end definefont pop } def /pdfMakeFont16L3 { 1 index /CIDFont resourcestatus { pop pop 1 index /CIDFont findresource /CIDFontType known } { false } ifelse { 0 eq { /Identity-H } { /Identity-V } ifelse exch 1 array astore composefont pop } { pdfMakeFont16 } ifelse } def % graphics state operators /q { gsave pdfDictSize dict begin } def /Q { end grestore /pdfLastFill where { pop pdfLastFill { pdfFillOP setoverprint } { pdfStrokeOP setoverprint } ifelse } if /pdfOPM where { pop pdfOPM /setoverprintmode where{pop setoverprintmode}{pop}ifelse } if } def /cm { concat } def /d { setdash } def /i { setflat } def /j { setlinejoin } def /J { setlinecap } def /M { setmiterlimit } def /w { setlinewidth } def % path segment operators /m { moveto } def /l { lineto } def /c { curveto } def /re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath } def /h { closepath } def % path painting operators /S { sCol stroke } def /Sf { fCol stroke } def /f { fCol fill } def /f* { fCol eofill } def % clipping operators /W { clip newpath } def /W* { eoclip newpath } def /Ws { strokepath clip newpath } def % text state operators /Tc { /pdfCharSpacing exch def } def /Tf { dup /pdfFontSize exch def dup pdfHorizScaling mul exch matrix scale pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put exch findfont exch makefont setfont } def /Tr { /pdfTextRender exch def } def /Tp { /pdfPatternCS exch def } def /Ts { /pdfTextRise exch def } def /Tw { /pdfWordSpacing exch def } def /Tz { /pdfHorizScaling exch def } def % text positioning operators /Td { pdfTextMat transform moveto } def /Tm { /pdfTextMat exch def } def % text string operators /xyshow where { pop /xyshow2 { dup length array 0 2 2 index length 1 sub { 2 index 1 index 2 copy get 3 1 roll 1 add get pdfTextMat dtransform 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put } for exch pop xyshow } def }{ /xyshow2 { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval show moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval show moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /cshow where { pop /xycp { 0 3 2 roll { pop pop currentpoint 3 2 roll 1 string dup 0 4 3 roll put false charpath moveto 2 copy get 2 index 2 index 1 add get pdfTextMat dtransform rmoveto 2 add } exch cshow pop pop } def }{ /xycp { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval false charpath moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval false charpath moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /Tj { fCol 0 pdfTextRise pdfTextMat dtransform rmoveto currentpoint 4 2 roll pdfTextRender 1 and 0 eq { 2 copy xyshow2 } if pdfTextRender 3 and dup 1 eq exch 2 eq or { 3 index 3 index moveto 2 copy currentfont /FontType get 3 eq { fCol } { sCol } ifelse xycp currentpoint stroke moveto } if pdfTextRender 4 and 0 ne { 4 2 roll moveto xycp /pdfTextClipPath [ pdfTextClipPath aload pop {/moveto cvx} {/lineto cvx} {/curveto cvx} {/closepath cvx} pathforall ] def currentpoint newpath moveto } { pop pop pop pop } ifelse 0 pdfTextRise neg pdfTextMat dtransform rmoveto } def /TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 pdfTextMat dtransform rmoveto } def /TJmV { 0.001 mul pdfFontSize mul neg 0 exch pdfTextMat dtransform rmoveto } def /Tclip { pdfTextClipPath cvx exec clip newpath /pdfTextClipPath [] def } def /Tclip* { pdfTextClipPath cvx exec eoclip newpath /pdfTextClipPath [] def } def % Level 2/3 image operators /pdfImBuf 100 string def /pdfImStr { 2 copy exch length lt { 2 copy get exch 1 add exch } { () } ifelse } def /skipEOD { { currentfile pdfImBuf readline not { pop exit } if (%-EOD-) eq { exit } if } loop } def /pdfIm { image skipEOD } def /pdfMask { /ReusableStreamDecode filter skipEOD /maskStream exch def } def /pdfMaskEnd { maskStream closefile } def /pdfMaskInit { /maskArray exch def /maskIdx 0 def } def /pdfMaskSrc { maskIdx maskArray length lt { maskArray maskIdx get /maskIdx maskIdx 1 add def } { () } ifelse } def /pdfImM { fCol imagemask skipEOD } def /pr { 2 index 2 index 3 2 roll putinterval 4 add } def /pdfImClip { gsave 0 2 4 index length 1 sub { dup 4 index exch 2 copy get 5 index div put 1 add 3 index exch 2 copy get 3 index div put } for pop pop rectclip } def /pdfImClipEnd { grestore } def % shading operators /colordelta { false 0 1 3 index length 1 sub { dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { pop true } if } for exch pop exch pop } def /funcCol { func n array astore } def /funcSH { dup 0 eq { true } { dup 6 eq { false } { 4 index 4 index funcCol dup 6 index 4 index funcCol dup 3 1 roll colordelta 3 1 roll 5 index 5 index funcCol dup 3 1 roll colordelta 3 1 roll 6 index 8 index funcCol dup 3 1 roll colordelta 3 1 roll colordelta or or or } ifelse } ifelse { 1 add 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch 6 index 6 index 4 index 4 index 4 index funcSH 2 index 6 index 6 index 4 index 4 index funcSH 6 index 2 index 4 index 6 index 4 index funcSH 5 3 roll 3 2 roll funcSH pop pop } { pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul funcCol sc dup 4 index exch mat transform m 3 index 3 index mat transform l 1 index 3 index mat transform l mat transform l pop pop h f* } ifelse } def /axialCol { dup 0 lt { pop t0 } { dup 1 gt { pop t1 } { dt mul t0 add } ifelse } ifelse func n array astore } def /axialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index axialCol 2 index axialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index axialSH exch 3 2 roll axialSH } { pop 2 copy add 0.5 mul axialCol sc exch dup dx mul x0 add exch dy mul y0 add 3 2 roll dup dx mul x0 add exch dy mul y0 add dx abs dy abs ge { 2 copy yMin sub dy mul dx div add yMin m yMax sub dy mul dx div add yMax l 2 copy yMax sub dy mul dx div add yMax l yMin sub dy mul dx div add yMin l h f* } { exch 2 copy xMin sub dx mul dy div add xMin exch m xMax sub dx mul dy div add xMax exch l exch 2 copy xMax sub dx mul dy div add xMax exch l xMin sub dx mul dy div add xMin exch l h f* } ifelse } ifelse } def /radialCol { dup t0 lt { pop t0 } { dup t1 gt { pop t1 } if } ifelse func n array astore } def /radialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index dt mul t0 add radialCol 2 index dt mul t0 add radialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index radialSH exch 3 2 roll radialSH } { pop 2 copy add 0.5 mul dt mul t0 add radialCol sc encl { exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 0 360 arc h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 360 0 arcn h f } { 2 copy dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arcn dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arcn h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arc dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arc h f } ifelse } ifelse } def end %%EndResource /CIDInit /ProcSet findresource begin 10 dict begin begincmap /CMapType 1 def /CMapName /Identity-H def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Identity) def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 0 usefont 1 begincidrange <0000> 0 endcidrange endcmap currentdict CMapName exch /CMap defineresource pop end 10 dict begin begincmap /CMapType 1 def /CMapName /Identity-V def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Identity) def /Supplement 0 def end def /WMode 1 def 1 begincodespacerange <0000> endcodespacerange 0 usefont 1 begincidrange <0000> 0 endcidrange endcmap currentdict CMapName exch /CMap defineresource pop end end %%EndProlog %%BeginSetup xpdf begin %%EndSetup pdfStartPage %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer 0 0 2409 909 re W q [1 0 0 -1 0 909] cm q 0 0 2409 908.7038 re W* q [0.747904 0 0 0.747904 0 -908.7038] cm /DeviceRGB {} CS [1 1 1] SC /DeviceRGB {} cs [1 1 1] sc 0 0 3221 2436 re f Q Q q 5.983235 0 2403.0168 907.20795 re W* q [0.747959 0 0 0.748049 5.983235 0] cm /DeviceRGB {} CS [1 1 1] SC /DeviceRGB {} cs [1 1 1] sc 0 0 3212.7659 1212.76599 re f Q q [0.822879 0 0 0.822978 95.330643 145.991699] cm /DeviceRGB {} CS [0.09 0.329 0.122] SC /DeviceRGB {} cs [0.09 0.329 0.122] sc 231 798 m 227 779 219 741 218 741 c 49 640 69 465 125 365 c 137 491 360 578 230 732 c 229 734 236 758 242 780 c 268 736 307 683 305 678 c 145 288 645 258 749 16 c 796 250 725 612 323 704 c 321 705 250 830 247 831 c 247 829 217 830 221 820 c 223 814 227 806 231 798 c h 330 625 m 267 476 452 312 544 271 c 356 439 324 564 330 625 c h 226 704 m 277 645 217 544 181 511 c 242 616 238 677 226 704 c h f Q q [26.582434 0 0 26.585632 866.89978 103.116905] cm /DeviceRGB {} CS [0.145 0.22 0.059] SC /DeviceRGB {} cs [0.145 0.22 0.059] sc 6.5 8.62 m 6.513333 8.940001 6.52 9.303333 6.52 9.71 c 6.52 10.116667 6.513333 10.473333 6.5 10.78 c 6.5 11.139999 6.436667 11.496666 6.31 11.849999 c 6.183333 12.203333 5.993333 12.52 5.74 12.799999 c 5.486666 13.079999 5.17 13.299999 4.79 13.459999 c 4.41 13.619999 3.973334 13.699999 3.48 13.699999 c 2.46 13.699999 l 2.46 18.919998 l 2.46 19.106665 2.486667 19.243332 2.54 19.329998 c 2.593333 19.416664 2.646667 19.466663 2.7 19.479998 c 2.78 19.519997 2.866667 19.519997 2.96 19.479998 c 2.96 19.999998 l 0.54 19.999998 l 0.54 19.479998 l 0.646667 19.519997 0.726667 19.519997 0.78 19.479998 c 0.846667 19.466663 0.913333 19.416664 0.98 19.329998 c 1.046667 19.243332 1.08 19.106665 1.08 18.919998 c 1.08 6.779998 l 1.08 6.579998 1.046667 6.436665 0.98 6.349998 c 0.913333 6.263331 0.846667 6.206665 0.78 6.179998 c 0.726667 6.153331 0.646667 6.153331 0.54 6.179998 c 0.54 5.699998 l 3.48 5.699998 l 3.973334 5.699998 4.41 5.779998 4.79 5.939998 c 5.17 6.099998 5.486666 6.319997 5.74 6.599998 c 5.993333 6.879998 6.183333 7.193331 6.31 7.539998 c 6.436667 7.886664 6.5 8.246664 6.5 8.619998 c 6.5 8.62 l h 5.08 8.18 m 5.08 7.833334 5.023333 7.533334 4.91 7.28 c 4.796667 7.026667 4.663333 6.826667 4.51 6.68 c 4.356667 6.533334 4.196666 6.416667 4.03 6.33 c 3.863333 6.243334 3.72 6.2 3.6 6.2 c 2.46 6.2 l 2.46 13.16 l 3.599999 13.16 l 3.72 13.16 3.863333 13.126666 4.029999 13.06 c 4.196666 12.993333 4.356666 12.876666 4.509999 12.709999 c 4.663333 12.543332 4.796666 12.339999 4.909999 12.099999 c 5.023333 11.86 5.079999 11.56 5.079999 11.2 c 5.079999 8.18 l 5.08 8.18 l h 14.58 19.139999 m 14.58 19.246666 14.553333 19.356667 14.5 19.469999 c 14.446667 19.583332 14.37 19.689999 14.270001 19.789999 c 14.170001 19.889999 14.043334 19.98 13.89 20.059999 c 13.736667 20.139999 13.56 20.18 13.360001 20.18 c 13.040001 20.18 12.753334 20.106667 12.500001 19.960001 c 12.246668 19.813335 12.073335 19.620001 11.980001 19.380001 c 11.900002 19.246668 11.840001 19.093334 11.800001 18.920002 c 11.626668 19.280003 11.363335 19.580002 11.010001 19.820002 c 10.656668 20.060001 10.266668 20.18 9.840001 20.180002 c 9.306667 20.180002 8.840001 19.98667 8.440002 19.600002 c 8.213335 19.400003 8.026669 19.140003 7.880002 18.820002 c 7.733335 18.5 7.646668 18.133333 7.620002 17.720001 c 7.606669 17.680002 7.600002 17.600002 7.600002 17.480001 c 7.600002 17.460001 l 7.613335 17.233334 7.653335 16.996668 7.720002 16.750002 c 7.786668 16.503336 7.890002 16.25667 8.030002 16.010002 c 8.170002 15.763335 8.336668 15.530002 8.530002 15.310002 c 8.723335 15.090003 8.933335 14.900003 9.160002 14.740003 c 9.213335 14.713336 9.256668 14.683336 9.290002 14.650003 c 9.323336 14.616669 9.373335 14.580003 9.440002 14.540003 c 9.500002 14.510003 l 9.560002 14.480003 l 9.800002 14.333337 10.010002 14.200004 10.190002 14.080004 c 10.370003 13.960004 10.533336 13.846671 10.680002 13.740004 c 10.760002 13.68667 10.840002 13.62667 10.920002 13.560003 c 11.000002 13.493337 11.086669 13.42667 11.180002 13.360004 c 11.300002 13.280004 11.413336 13.18667 11.520002 13.080004 c 11.626669 12.973337 11.706669 12.84667 11.760002 12.700004 c 11.840002 12.56667 11.880002 12.406671 11.880002 12.220003 c 11.880002 12.033336 11.860002 11.86667 11.820002 11.720003 c 11.766668 11.42667 11.630002 11.173337 11.410002 10.960003 c 11.190002 10.746669 10.946669 10.606669 10.680002 10.540003 c 10.560002 10.500003 10.446669 10.480002 10.340002 10.480002 c 9.966668 10.480002 9.646668 10.546669 9.380002 10.680002 c 9.206669 10.760002 9.080002 10.850002 9.000002 10.950003 c 8.920002 11.050003 8.876669 11.143336 8.870002 11.230002 c 8.863335 11.316669 8.880002 11.386668 8.920002 11.440002 c 8.960002 11.493337 9.013335 11.533337 9.080002 11.560002 c 9.106669 11.573336 9.123335 11.580003 9.130002 11.580003 c 9.136669 11.580003 9.153336 11.58667 9.180002 11.600003 c 9.353335 11.66667 9.496669 11.783337 9.610003 11.950004 c 9.723336 12.116671 9.780003 12.300004 9.780003 12.500004 c 9.780003 12.753337 9.690002 12.970004 9.510002 13.150003 c 9.330002 13.330003 9.113336 13.420003 8.860003 13.420004 c 8.593336 13.420004 8.36667 13.330004 8.180002 13.150003 c 7.993335 12.970003 7.900002 12.753337 7.900002 12.500004 c 7.900002 12.273337 7.930002 12.036671 7.990002 11.790004 c 8.050002 11.543337 8.140002 11.320004 8.260002 11.120004 c 8.513335 10.74667 8.816669 10.47667 9.170002 10.310003 c 9.523336 10.143336 9.913335 10.060003 10.340002 10.060003 c 10.660002 10.060003 10.976668 10.120004 11.290002 10.240004 c 11.603335 10.360004 11.883335 10.530004 12.130002 10.750004 c 12.376669 10.970004 12.583335 11.233337 12.750002 11.540004 c 12.916669 11.84667 13.000002 12.200004 13.000002 12.600004 c 13.000002 18.480003 l 13.000002 18.720003 13.003335 18.876671 13.010002 18.950003 c 13.016669 19.023335 13.020002 19.073336 13.020002 19.100002 c 13.020002 19.273336 13.073336 19.413336 13.180002 19.520002 c 13.286669 19.626669 13.413336 19.680002 13.560002 19.680002 c 13.733335 19.680002 13.873336 19.630003 13.980002 19.530003 c 14.086669 19.430002 14.146669 19.300003 14.160003 19.140003 c 14.580003 19.140003 l 14.58 19.139999 l h 11.44 18.639999 m 11.546666 18.453333 11.61 18.253332 11.629999 18.039999 c 11.649999 17.826666 11.659999 17.626665 11.659999 17.439999 c 11.659999 13.739999 l 11.606666 13.793332 11.549999 13.843332 11.489999 13.889998 c 11.429998 13.936665 11.366666 13.993332 11.299999 14.059999 c 10.913333 14.339998 10.583333 14.596665 10.31 14.829998 c 10.036666 15.063331 9.806666 15.303331 9.619999 15.549998 c 9.433332 15.796665 9.286665 16.06 9.179999 16.339998 c 9.073334 16.619999 9.006667 16.939999 8.98 17.299999 c 8.98 17.599998 l 8.993333 18.106665 9.13 18.503332 9.389999 18.789999 c 9.649999 19.076666 10.019999 19.219999 10.499999 19.219999 c 10.713332 19.219999 10.906666 19.166666 11.079999 19.059999 c 11.253332 18.939999 11.373332 18.799999 11.439999 18.639999 c 11.44 18.639999 l h 18.32 10.08 m 19.08 10.093333 19.686666 10.323334 20.139999 10.770001 c 20.593332 11.216667 20.82 11.926667 20.82 12.900001 c 20.82 17.380001 l 20.82 18.353334 20.593332 19.059999 20.139999 19.5 c 19.686666 19.940001 19.08 20.173334 18.32 20.200001 c 18.26 20.200001 l 18.033333 20.200001 17.826666 20.173334 17.639999 20.120001 c 17.619999 20.120001 l 17.606665 20.120001 17.599998 20.113335 17.599998 20.1 c 17.293333 19.993334 17.026667 19.846666 16.799999 19.66 c 16.609999 19.469999 l 16.609999 19.469999 16.56 19.4 16.459999 19.26 c 16.459999 22.58 l 16.459999 22.766666 16.486666 22.903334 16.539999 22.99 c 16.593332 23.076666 16.646666 23.133333 16.699999 23.16 c 16.779999 23.199999 16.866667 23.199999 16.959999 23.16 c 16.959999 23.66 l 14.539999 23.66 l 14.539999 23.16 l 14.646666 23.199999 14.726666 23.199999 14.779999 23.16 c 14.846665 23.133333 14.909999 23.076666 14.969998 22.99 c 15.029998 22.903334 15.059998 22.766666 15.059999 22.58 c 15.059999 11.3 l 15.059999 11.113334 15.029999 10.976667 14.969998 10.89 c 14.909998 10.803333 14.846665 10.746667 14.779999 10.72 c 14.726666 10.693334 14.646666 10.693334 14.539999 10.72 c 14.539999 10.24 l 16.459999 10.24 l 16.459999 11.02 l 16.553331 10.873333 16.666666 10.74 16.799999 10.62 c 17.026667 10.42 17.293333 10.273334 17.599998 10.18 c 17.599998 10.166667 17.606665 10.16 17.619999 10.16 c 17.639999 10.16 l 17.853333 10.106667 18.059999 10.08 18.26 10.08 c 18.32 10.08 l h 19.32 12.46 m 19.32 12.44 l 19.306665 11.76 19.223333 11.28 19.07 11 c 18.916666 10.72 18.666666 10.566667 18.32 10.54 c 18.08 10.526667 17.853333 10.556666 17.639999 10.63 c 17.426666 10.703334 17.24 10.826667 17.08 11 c 16.92 11.173333 16.786667 11.406666 16.68 11.7 c 16.573334 11.993334 16.5 12.34 16.460001 12.74 c 16.460001 17.540001 l 16.5 17.953335 16.573334 18.303335 16.68 18.59 c 16.786667 18.876665 16.92 19.103333 17.08 19.27 c 17.24 19.436668 17.426666 19.560001 17.639999 19.640001 c 17.853333 19.720001 18.08 19.753334 18.32 19.740002 c 18.666666 19.713335 18.916666 19.560001 19.07 19.280003 c 19.223333 19.000004 19.306665 18.520004 19.32 17.840002 c 19.32 17.820002 l 19.32 12.460001 l 19.32 12.46 l h 24.379999 10.08 m 24.686665 10.08 24.999998 10.133333 25.32 10.24 c 25.640001 10.346666 25.926668 10.513333 26.18 10.74 c 26.433332 10.966666 26.636667 11.253333 26.790001 11.599999 c 26.943335 11.946666 27.020002 12.359999 27.02 12.839999 c 27.02 14.859999 l 27.02 14.919999 l 27.02 15.379999 l 23.040001 15.379999 l 23.040001 17.439999 l 23.040001 18.266665 23.183334 18.856665 23.470001 19.209999 c 23.756668 19.563334 24.113335 19.733334 24.540001 19.719999 c 24.793333 19.706665 25.043333 19.663332 25.290001 19.59 c 25.536669 19.516668 25.750002 19.393333 25.93 19.219999 c 26.109999 19.046665 26.26 18.799997 26.380001 18.48 c 26.500002 18.160002 26.560003 17.740002 26.560001 17.219999 c 27.02 17.219999 l 27.02 17.5 l 27.02 17.860001 26.98 18.203335 26.9 18.530001 c 26.82 18.856667 26.679998 19.140001 26.48 19.380001 c 26.280001 19.620001 26.023333 19.810001 25.709999 19.950001 c 25.396666 20.09 25.013332 20.166666 24.559999 20.18 c 24.24 20.18 23.913334 20.120001 23.58 20 c 23.246666 19.879999 22.946667 19.699999 22.68 19.459999 c 22.413334 19.219999 22.193335 18.936665 22.02 18.609999 c 21.846666 18.283333 21.76 17.913332 21.76 17.499998 c 21.76 17.029999 l 21.76 17.029999 21.756666 16.773333 21.75 16.259998 c 21.743334 15.746665 21.74 15.429998 21.74 15.309999 c 21.74 15.189999 21.736666 14.859999 21.73 14.319999 c 21.723333 13.779999 21.719999 13.489999 21.719999 13.449999 c 21.719999 12.859999 l 21.719999 12.379998 21.803333 11.963332 21.969999 11.609999 c 22.136665 11.256665 22.343332 10.969999 22.59 10.749999 c 22.836668 10.529999 23.116667 10.363333 23.43 10.249999 c 23.743334 10.136665 24.059999 10.079999 24.380001 10.079999 c 24.379999 10.08 l h 25.68 14.86 m 25.68 13.28 l 25.68 12.773333 25.646667 12.349999 25.58 12.01 c 25.513332 11.670001 25.423332 11.396668 25.309999 11.190001 c 25.196667 10.983334 25.059999 10.84 24.9 10.76 c 24.74 10.68 24.559999 10.64 24.359999 10.64 c 23.933332 10.64 23.609999 10.826667 23.389999 11.200001 c 23.17 11.573335 23.059999 12.266667 23.059999 13.280001 c 23.059999 14.860001 l 25.68 14.860001 l 25.68 14.86 l h 33.540001 11.66 m 33.540001 11.686667 33.546669 11.74 33.560001 11.82 c 33.573334 11.9 33.573334 11.966666 33.560001 12.02 c 33.546669 12.299999 33.450001 12.53 33.27 12.709999 c 33.09 12.889998 32.873333 12.979999 32.619999 12.98 c 32.353333 12.98 32.129997 12.886666 31.949999 12.7 c 31.77 12.513333 31.68 12.286667 31.679998 12.02 c 31.679998 11.686667 31.806665 11.433332 32.059998 11.259999 c 32.086666 11.246666 32.103333 11.236666 32.109997 11.23 c 32.139996 11.2 l 32.23333 11.133333 32.293327 11.036666 32.319996 10.91 c 32.346664 10.783334 32.266663 10.673333 32.079994 10.58 c 31.959993 10.513333 31.839994 10.48 31.719994 10.48 c 31.319994 10.453333 30.96666 10.573333 30.659994 10.839999 c 30.353329 11.106666 30.146662 11.573332 30.039993 12.239999 c 30.039993 18.919998 l 30.039993 19.106665 30.06666 19.243332 30.119993 19.329998 c 30.173326 19.416664 30.22666 19.466663 30.279993 19.479998 c 30.359993 19.519997 30.446661 19.519997 30.539993 19.479998 c 30.539993 19.999998 l 28.119993 19.999998 l 28.119993 19.479998 l 28.22666 19.519997 28.30666 19.519997 28.359993 19.479998 c 28.426661 19.466663 28.493326 19.416664 28.559994 19.329998 c 28.626661 19.243332 28.659994 19.106665 28.659994 18.919998 c 28.659994 11.299998 l 28.659994 11.113332 28.626661 10.976666 28.559994 10.889998 c 28.493326 10.803331 28.426661 10.746665 28.359993 10.719998 c 28.30666 10.693332 28.22666 10.693332 28.119993 10.719998 c 28.119993 10.219998 l 30.039993 10.219998 l 30.039993 11.039998 l 30.133326 10.893332 30.22666 10.756664 30.319994 10.629998 c 30.413328 10.503332 30.523329 10.396666 30.649994 10.309999 c 30.776659 10.223331 30.923326 10.153332 31.089994 10.099999 c 31.256662 10.046665 31.466661 10.019999 31.719994 10.019999 c 32.106663 10.019999 32.466663 10.159999 32.799995 10.439999 c 33.133327 10.719998 33.379997 11.126665 33.539997 11.659999 c 33.540001 11.66 l h 36.240002 18.92 m 36.240002 19.106667 36.27 19.243334 36.330002 19.33 c 36.390003 19.416666 36.446667 19.466665 36.5 19.48 c 36.566666 19.519999 36.653332 19.519999 36.759998 19.48 c 36.759998 20 l 34.339996 20 l 34.339996 19.48 l 34.446663 19.519999 34.539997 19.519999 34.619995 19.48 c 34.659996 19.466665 34.713329 19.416666 34.779995 19.33 c 34.846661 19.243334 34.879993 19.106667 34.879993 18.92 c 34.879993 6.8 l 34.879993 6.6 34.846661 6.456667 34.779995 6.37 c 34.713329 6.283334 34.659996 6.226667 34.619995 6.2 c 34.539997 6.16 34.446663 6.16 34.339996 6.2 c 34.339996 5.72 l 36.239998 5.72 l 36.239998 6.8 l 36.239998 18.92 l 36.240002 18.92 l h 40.580002 10.08 m 40.886669 10.08 41.200001 10.133333 41.52 10.24 c 41.84 10.346666 42.126667 10.513333 42.380001 10.74 c 42.633335 10.966666 42.83667 11.253333 42.990002 11.599999 c 43.143333 11.946666 43.220001 12.359999 43.220001 12.839999 c 43.220001 14.859999 l 43.220001 14.919999 l 43.220001 15.379999 l 39.240002 15.379999 l 39.240002 17.439999 l 39.240002 18.266665 39.383335 18.856665 39.670002 19.209999 c 39.956669 19.563334 40.313335 19.733334 40.740002 19.719999 c 40.993336 19.706665 41.243336 19.663332 41.490002 19.59 c 41.736668 19.516668 41.950001 19.393333 42.130001 19.219999 c 42.310001 19.046665 42.460003 18.799997 42.580002 18.48 c 42.700001 18.160002 42.760002 17.740002 42.760002 17.219999 c 43.220001 17.219999 l 43.220001 17.5 l 43.220001 17.860001 43.18 18.203335 43.100002 18.530001 c 43.020004 18.856667 42.880005 19.140001 42.680004 19.380001 c 42.480003 19.620001 42.223339 19.810001 41.910004 19.950001 c 41.596668 20.09 41.213337 20.166666 40.760002 20.18 c 40.440002 20.18 40.113335 20.120001 39.780003 20 c 39.446671 19.879999 39.146667 19.699999 38.880001 19.459999 c 38.613335 19.219999 38.393333 18.936665 38.220001 18.609999 c 38.046669 18.283333 37.960003 17.913332 37.960003 17.499998 c 37.960003 17.029999 l 37.960003 17.029999 37.956669 16.773333 37.950005 16.259998 c 37.94334 15.746665 37.940006 15.429998 37.940006 15.309999 c 37.940006 15.189999 37.936672 14.859999 37.930008 14.319999 c 37.923344 13.779999 37.92001 13.489999 37.92001 13.449999 c 37.92001 12.859999 l 37.92001 12.379998 38.003342 11.963332 38.17001 11.609999 c 38.336678 11.256665 38.543343 10.969999 38.790009 10.749999 c 39.036674 10.529999 39.316673 10.363333 39.630009 10.249999 c 39.943344 10.136665 40.26001 10.079999 40.580009 10.079999 c 40.580002 10.08 l h 41.880001 14.86 m 41.880001 13.28 l 41.880001 12.773333 41.846668 12.349999 41.780003 12.01 c 41.713337 11.670001 41.623337 11.396668 41.510002 11.190001 c 41.396667 10.983334 41.260002 10.84 41.100002 10.76 c 40.940002 10.68 40.760002 10.64 40.560001 10.64 c 40.133335 10.64 39.810001 10.826667 39.59 11.200001 c 39.369999 11.573335 39.259998 12.266667 39.259998 13.280001 c 39.259998 14.860001 l 41.879997 14.860001 l 41.880001 14.86 l h 47.880001 19.879999 m 47.866669 19.893333 47.856667 19.9 47.850002 19.9 c 47.843338 19.9 47.833336 19.906666 47.820004 19.92 c 47.800003 19.940001 l 47.773335 19.953335 47.743336 19.966667 47.710003 19.980001 c 47.67667 19.993336 47.646671 20.006668 47.620003 20.020002 c 47.340004 20.140003 47.013336 20.200003 46.640003 20.200003 c 46.42667 20.200003 46.220005 20.150003 46.020004 20.050003 c 45.820004 19.950003 45.646671 19.866671 45.500004 19.800003 c 45.353336 19.733335 45.230003 19.703337 45.130005 19.710003 c 45.030006 19.716669 44.980007 19.813337 44.980003 20.000004 c 44.600002 20.000004 l 44.600002 17.600004 l 45.080002 17.600004 l 45.053333 18.02667 45.100002 18.393337 45.220001 18.700005 c 45.299999 18.966671 45.456669 19.216671 45.690002 19.450005 c 45.923336 19.683338 46.273338 19.800005 46.740002 19.800005 c 47.046669 19.800005 47.299999 19.746672 47.5 19.640005 c 47.846668 19.466671 48.083332 19.260004 48.209999 19.020004 c 48.336666 18.780005 48.386665 18.530005 48.360001 18.270004 c 48.333336 18.010004 48.236668 17.753338 48.07 17.500004 c 47.903332 17.24667 47.699997 17.013336 47.459999 16.800003 c 47.299999 16.680002 47.133331 16.553337 46.959999 16.420004 c 46.786667 16.286671 46.613335 16.146671 46.439999 16.000004 c 45.973331 15.62667 45.603333 15.290004 45.329998 14.990004 c 45.056664 14.690003 44.846664 14.410004 44.699997 14.150003 c 44.553329 13.890003 44.453331 13.643336 44.399998 13.410004 c 44.346664 13.176671 44.32 12.926671 44.319996 12.660004 c 44.319996 12.500004 44.329994 12.353337 44.349995 12.220004 c 44.369995 12.086671 44.393326 11.966671 44.419994 11.860004 c 44.459995 11.633338 44.526661 11.413338 44.619995 11.200005 c 44.713329 10.986671 44.846661 10.796672 45.019997 10.630005 c 45.193333 10.463338 45.406666 10.326672 45.659996 10.220005 c 45.913326 10.113339 46.219994 10.060005 46.579994 10.060005 c 46.779995 10.060005 46.979992 10.103338 47.179993 10.190005 c 47.379993 10.276672 47.559994 10.356672 47.719994 10.430005 c 47.879993 10.503338 48.00666 10.536672 48.099995 10.530006 c 48.193329 10.523339 48.239994 10.420006 48.239994 10.220005 c 48.619995 10.220005 l 48.619995 12.700005 l 48.099995 12.700005 l 48.113327 12.300004 48.066662 11.940004 47.959995 11.620005 c 47.866661 11.340005 47.703327 11.086671 47.469994 10.860004 c 47.23666 10.633338 46.893326 10.520004 46.439995 10.520004 c 46.079994 10.520004 45.786659 10.600004 45.559994 10.760004 c 45.439995 10.853337 45.336658 10.990005 45.249992 11.170004 c 45.163326 11.350003 45.113323 11.54667 45.099991 11.760004 c 45.086658 11.973338 45.119991 12.203338 45.199989 12.450005 c 45.279987 12.696671 45.439987 12.926671 45.679989 13.140005 c 45.706657 13.180005 45.743324 13.220005 45.789989 13.260005 c 45.836655 13.300005 45.886658 13.333338 45.939991 13.360005 c 45.979992 13.386672 46.013325 13.413339 46.039989 13.440005 c 46.119991 13.520005 l 46.266659 13.640005 46.41666 13.760005 46.569992 13.880005 c 46.723324 14.000005 46.879993 14.120005 47.039993 14.240005 c 47.413326 14.560005 47.723328 14.850005 47.969994 15.110004 c 48.21666 15.370004 48.423325 15.613338 48.589993 15.840004 c 48.75666 16.066671 48.879993 16.280004 48.959991 16.480003 c 49.039989 16.680002 49.086658 16.873337 49.099991 17.060003 c 49.233326 17.673336 49.209991 18.190002 49.029991 18.610003 c 48.849991 19.030003 48.619991 19.360003 48.339993 19.600002 c 48.319992 19.600002 l 48.319992 19.626669 48.30666 19.640003 48.279991 19.640003 c 48.253323 19.66667 48.226658 19.68667 48.199989 19.700003 c 48.07999 19.780003 l 48.07999 19.780003 48.039989 19.800003 47.959991 19.840002 c 47.959991 19.860003 l 47.946659 19.860003 47.933323 19.863337 47.919991 19.870003 c 47.906658 19.876669 47.893322 19.880003 47.87999 19.880003 c 47.880001 19.879999 l h 53.82 19.879999 m 53.806667 19.893333 53.796665 19.9 53.790001 19.9 c 53.783337 19.9 53.773335 19.906666 53.760002 19.92 c 53.740002 19.940001 l 53.713333 19.953335 53.683334 19.966667 53.650002 19.980001 c 53.616669 19.993336 53.58667 20.006668 53.560001 20.020002 c 53.280003 20.140003 52.953335 20.200003 52.580002 20.200003 c 52.366669 20.200003 52.160004 20.150003 51.960003 20.050003 c 51.760002 19.950003 51.58667 19.866671 51.440002 19.800003 c 51.293335 19.733335 51.170002 19.703337 51.070004 19.710003 c 50.970005 19.716669 50.920006 19.813337 50.920002 20.000004 c 50.540001 20.000004 l 50.540001 17.600004 l 51.02 17.600004 l 50.993332 18.02667 51.040001 18.393337 51.16 18.700005 c 51.239998 18.966671 51.396667 19.216671 51.630001 19.450005 c 51.863335 19.683338 52.213337 19.800005 52.68 19.800005 c 52.986668 19.800005 53.239998 19.746672 53.439999 19.640005 c 53.786667 19.466671 54.023331 19.260004 54.149998 19.020004 c 54.276665 18.780005 54.326664 18.530005 54.299999 18.270004 c 54.273335 18.010004 54.176666 17.753338 54.009998 17.500004 c 53.84333 17.24667 53.639996 17.013336 53.399998 16.800003 c 53.239998 16.680002 53.07333 16.553337 52.899998 16.420004 c 52.726665 16.286671 52.553333 16.146671 52.379997 16.000004 c 51.91333 15.62667 51.543331 15.290004 51.269997 14.990004 c 50.996662 14.690003 50.786663 14.410004 50.639996 14.150003 c 50.493328 13.890003 50.39333 13.643336 50.339996 13.410004 c 50.286663 13.176671 50.259998 12.926671 50.259995 12.660004 c 50.259995 12.500004 50.269993 12.353337 50.289993 12.220004 c 50.309994 12.086671 50.333324 11.966671 50.359993 11.860004 c 50.399994 11.633338 50.46666 11.413338 50.559994 11.200005 c 50.653328 10.986671 50.786659 10.796672 50.959995 10.630005 c 51.133331 10.463338 51.346664 10.326672 51.599995 10.220005 c 51.853325 10.113339 52.159992 10.060005 52.519993 10.060005 c 52.719994 10.060005 52.919991 10.103338 53.119991 10.190005 c 53.319992 10.276672 53.499992 10.356672 53.659992 10.430005 c 53.819992 10.503338 53.946659 10.536672 54.039993 10.530006 c 54.133327 10.523339 54.179993 10.420006 54.179993 10.220005 c 54.559994 10.220005 l 54.559994 12.700005 l 54.039993 12.700005 l 54.053326 12.300004 54.00666 11.940004 53.899994 11.620005 c 53.80666 11.340005 53.643326 11.086671 53.409992 10.860004 c 53.176659 10.633338 52.833324 10.520004 52.379993 10.520004 c 52.019993 10.520004 51.726658 10.600004 51.499992 10.760004 c 51.379993 10.853337 51.276657 10.990005 51.189991 11.170004 c 51.103325 11.350003 51.053322 11.54667 51.039989 11.760004 c 51.026657 11.973338 51.05999 12.203338 51.139988 12.450005 c 51.219986 12.696671 51.379986 12.926671 51.619987 13.140005 c 51.646656 13.180005 51.683323 13.220005 51.729988 13.260005 c 51.776653 13.300005 51.826656 13.333338 51.87999 13.360005 c 51.919991 13.386672 51.953323 13.413339 51.979988 13.440005 c 52.05999 13.520005 l 52.206657 13.640005 52.356659 13.760005 52.509991 13.880005 c 52.663322 14.000005 52.819992 14.120005 52.979992 14.240005 c 53.353325 14.560005 53.663326 14.850005 53.909992 15.110004 c 54.156658 15.370004 54.363323 15.613338 54.529991 15.840004 c 54.696659 16.066671 54.819992 16.280004 54.89999 16.480003 c 54.979988 16.680002 55.026657 16.873337 55.039989 17.060003 c 55.173325 17.673336 55.14999 18.190002 54.96999 18.610003 c 54.789989 19.030003 54.55999 19.360003 54.279991 19.600002 c 54.259991 19.600002 l 54.259991 19.626669 54.246658 19.640003 54.21999 19.640003 c 54.193321 19.66667 54.166656 19.68667 54.139988 19.700003 c 54.019989 19.780003 l 54.019989 19.780003 53.979988 19.800003 53.89999 19.840002 c 53.89999 19.860003 l 53.886658 19.860003 53.873322 19.863337 53.859989 19.870003 c 53.846657 19.876669 53.833321 19.880003 53.819988 19.880003 c 53.82 19.879999 l h f Q Q Q showpage %%PageTrailer pdfEndPage %%Trailer end %%DocumentSuppliedResources: %%EOF ================================================ FILE: resources/logo/print/eps/White logo - no background.eps ================================================ %!PS-Adobe-3.0 EPSF-3.0 %Produced by poppler pdftops version: 0.59.0 (http://poppler.freedesktop.org) %%Creator: Chromium %%LanguageLevel: 3 %%DocumentSuppliedResources: (atend) %%BoundingBox: 0 0 2409 909 %%HiResBoundingBox: 0 0 2409 909 %%DocumentSuppliedResources: (atend) %%EndComments %%BeginProlog %%BeginResource: procset xpdf 3.00 0 %%Copyright: Copyright 1996-2011 Glyph & Cog, LLC /xpdf 75 dict def xpdf begin % PDF special state /pdfDictSize 15 def /pdfSetup { /setpagedevice where { pop 2 dict begin /Policies 1 dict dup begin /PageSize 6 def end def { /Duplex true def } if currentdict end setpagedevice } { pop } ifelse } def /pdfSetupPaper { % Change paper size, but only if different from previous paper size otherwise % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size % so we use the same when checking if the size changes. /setpagedevice where { pop currentpagedevice /PageSize known { 2 copy currentpagedevice /PageSize get aload pop exch 4 1 roll sub abs 5 gt 3 1 roll sub abs 5 gt or } { true } ifelse { 2 array astore 2 dict begin /PageSize exch def /ImagingBBox null def currentdict end setpagedevice } { pop pop } ifelse } { pop } ifelse } def /pdfStartPage { pdfDictSize dict begin /pdfFillCS [] def /pdfFillXform {} def /pdfStrokeCS [] def /pdfStrokeXform {} def /pdfFill [0] def /pdfStroke [0] def /pdfFillOP false def /pdfStrokeOP false def /pdfOPM false def /pdfLastFill false def /pdfLastStroke false def /pdfTextMat [1 0 0 1 0 0] def /pdfFontSize 0 def /pdfCharSpacing 0 def /pdfTextRender 0 def /pdfPatternCS false def /pdfTextRise 0 def /pdfWordSpacing 0 def /pdfHorizScaling 1 def /pdfTextClipPath [] def } def /pdfEndPage { end } def % PDF color state /opm { dup /pdfOPM exch def /setoverprintmode where{pop setoverprintmode}{pop}ifelse } def /cs { /pdfFillXform exch def dup /pdfFillCS exch def setcolorspace } def /CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def setcolorspace } def /sc { pdfLastFill not { pdfFillCS setcolorspace } if dup /pdfFill exch def aload pop pdfFillXform setcolor /pdfLastFill true def /pdfLastStroke false def } def /SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if dup /pdfStroke exch def aload pop pdfStrokeXform setcolor /pdfLastStroke true def /pdfLastFill false def } def /op { /pdfFillOP exch def pdfLastFill { pdfFillOP setoverprint } if } def /OP { /pdfStrokeOP exch def pdfLastStroke { pdfStrokeOP setoverprint } if } def /fCol { pdfLastFill not { pdfFillCS setcolorspace pdfFill aload pop pdfFillXform setcolor pdfFillOP setoverprint /pdfLastFill true def /pdfLastStroke false def } if } def /sCol { pdfLastStroke not { pdfStrokeCS setcolorspace pdfStroke aload pop pdfStrokeXform setcolor pdfStrokeOP setoverprint /pdfLastStroke true def /pdfLastFill false def } if } def % build a font /pdfMakeFont { 4 3 roll findfont 4 2 roll matrix scale makefont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /Encoding exch def currentdict end definefont pop } def /pdfMakeFont16 { exch findfont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /WMode exch def currentdict end definefont pop } def /pdfMakeFont16L3 { 1 index /CIDFont resourcestatus { pop pop 1 index /CIDFont findresource /CIDFontType known } { false } ifelse { 0 eq { /Identity-H } { /Identity-V } ifelse exch 1 array astore composefont pop } { pdfMakeFont16 } ifelse } def % graphics state operators /q { gsave pdfDictSize dict begin } def /Q { end grestore /pdfLastFill where { pop pdfLastFill { pdfFillOP setoverprint } { pdfStrokeOP setoverprint } ifelse } if /pdfOPM where { pop pdfOPM /setoverprintmode where{pop setoverprintmode}{pop}ifelse } if } def /cm { concat } def /d { setdash } def /i { setflat } def /j { setlinejoin } def /J { setlinecap } def /M { setmiterlimit } def /w { setlinewidth } def % path segment operators /m { moveto } def /l { lineto } def /c { curveto } def /re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath } def /h { closepath } def % path painting operators /S { sCol stroke } def /Sf { fCol stroke } def /f { fCol fill } def /f* { fCol eofill } def % clipping operators /W { clip newpath } def /W* { eoclip newpath } def /Ws { strokepath clip newpath } def % text state operators /Tc { /pdfCharSpacing exch def } def /Tf { dup /pdfFontSize exch def dup pdfHorizScaling mul exch matrix scale pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put exch findfont exch makefont setfont } def /Tr { /pdfTextRender exch def } def /Tp { /pdfPatternCS exch def } def /Ts { /pdfTextRise exch def } def /Tw { /pdfWordSpacing exch def } def /Tz { /pdfHorizScaling exch def } def % text positioning operators /Td { pdfTextMat transform moveto } def /Tm { /pdfTextMat exch def } def % text string operators /xyshow where { pop /xyshow2 { dup length array 0 2 2 index length 1 sub { 2 index 1 index 2 copy get 3 1 roll 1 add get pdfTextMat dtransform 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put } for exch pop xyshow } def }{ /xyshow2 { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval show moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval show moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /cshow where { pop /xycp { 0 3 2 roll { pop pop currentpoint 3 2 roll 1 string dup 0 4 3 roll put false charpath moveto 2 copy get 2 index 2 index 1 add get pdfTextMat dtransform rmoveto 2 add } exch cshow pop pop } def }{ /xycp { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval false charpath moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval false charpath moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /Tj { fCol 0 pdfTextRise pdfTextMat dtransform rmoveto currentpoint 4 2 roll pdfTextRender 1 and 0 eq { 2 copy xyshow2 } if pdfTextRender 3 and dup 1 eq exch 2 eq or { 3 index 3 index moveto 2 copy currentfont /FontType get 3 eq { fCol } { sCol } ifelse xycp currentpoint stroke moveto } if pdfTextRender 4 and 0 ne { 4 2 roll moveto xycp /pdfTextClipPath [ pdfTextClipPath aload pop {/moveto cvx} {/lineto cvx} {/curveto cvx} {/closepath cvx} pathforall ] def currentpoint newpath moveto } { pop pop pop pop } ifelse 0 pdfTextRise neg pdfTextMat dtransform rmoveto } def /TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 pdfTextMat dtransform rmoveto } def /TJmV { 0.001 mul pdfFontSize mul neg 0 exch pdfTextMat dtransform rmoveto } def /Tclip { pdfTextClipPath cvx exec clip newpath /pdfTextClipPath [] def } def /Tclip* { pdfTextClipPath cvx exec eoclip newpath /pdfTextClipPath [] def } def % Level 2/3 image operators /pdfImBuf 100 string def /pdfImStr { 2 copy exch length lt { 2 copy get exch 1 add exch } { () } ifelse } def /skipEOD { { currentfile pdfImBuf readline not { pop exit } if (%-EOD-) eq { exit } if } loop } def /pdfIm { image skipEOD } def /pdfMask { /ReusableStreamDecode filter skipEOD /maskStream exch def } def /pdfMaskEnd { maskStream closefile } def /pdfMaskInit { /maskArray exch def /maskIdx 0 def } def /pdfMaskSrc { maskIdx maskArray length lt { maskArray maskIdx get /maskIdx maskIdx 1 add def } { () } ifelse } def /pdfImM { fCol imagemask skipEOD } def /pr { 2 index 2 index 3 2 roll putinterval 4 add } def /pdfImClip { gsave 0 2 4 index length 1 sub { dup 4 index exch 2 copy get 5 index div put 1 add 3 index exch 2 copy get 3 index div put } for pop pop rectclip } def /pdfImClipEnd { grestore } def % shading operators /colordelta { false 0 1 3 index length 1 sub { dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { pop true } if } for exch pop exch pop } def /funcCol { func n array astore } def /funcSH { dup 0 eq { true } { dup 6 eq { false } { 4 index 4 index funcCol dup 6 index 4 index funcCol dup 3 1 roll colordelta 3 1 roll 5 index 5 index funcCol dup 3 1 roll colordelta 3 1 roll 6 index 8 index funcCol dup 3 1 roll colordelta 3 1 roll colordelta or or or } ifelse } ifelse { 1 add 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch 6 index 6 index 4 index 4 index 4 index funcSH 2 index 6 index 6 index 4 index 4 index funcSH 6 index 2 index 4 index 6 index 4 index funcSH 5 3 roll 3 2 roll funcSH pop pop } { pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul funcCol sc dup 4 index exch mat transform m 3 index 3 index mat transform l 1 index 3 index mat transform l mat transform l pop pop h f* } ifelse } def /axialCol { dup 0 lt { pop t0 } { dup 1 gt { pop t1 } { dt mul t0 add } ifelse } ifelse func n array astore } def /axialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index axialCol 2 index axialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index axialSH exch 3 2 roll axialSH } { pop 2 copy add 0.5 mul axialCol sc exch dup dx mul x0 add exch dy mul y0 add 3 2 roll dup dx mul x0 add exch dy mul y0 add dx abs dy abs ge { 2 copy yMin sub dy mul dx div add yMin m yMax sub dy mul dx div add yMax l 2 copy yMax sub dy mul dx div add yMax l yMin sub dy mul dx div add yMin l h f* } { exch 2 copy xMin sub dx mul dy div add xMin exch m xMax sub dx mul dy div add xMax exch l exch 2 copy xMax sub dx mul dy div add xMax exch l xMin sub dx mul dy div add xMin exch l h f* } ifelse } ifelse } def /radialCol { dup t0 lt { pop t0 } { dup t1 gt { pop t1 } if } ifelse func n array astore } def /radialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index dt mul t0 add radialCol 2 index dt mul t0 add radialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index radialSH exch 3 2 roll radialSH } { pop 2 copy add 0.5 mul dt mul t0 add radialCol sc encl { exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 0 360 arc h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 360 0 arcn h f } { 2 copy dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arcn dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arcn h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arc dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arc h f } ifelse } ifelse } def end %%EndResource /CIDInit /ProcSet findresource begin 10 dict begin begincmap /CMapType 1 def /CMapName /Identity-H def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Identity) def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 0 usefont 1 begincidrange <0000> 0 endcidrange endcmap currentdict CMapName exch /CMap defineresource pop end 10 dict begin begincmap /CMapType 1 def /CMapName /Identity-V def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Identity) def /Supplement 0 def end def /WMode 1 def 1 begincodespacerange <0000> endcodespacerange 0 usefont 1 begincidrange <0000> 0 endcidrange endcmap currentdict CMapName exch /CMap defineresource pop end end %%EndProlog %%BeginSetup xpdf begin %%EndSetup pdfStartPage %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer 0 0 2409 909 re W q [1 0 0 -1 0 909] cm q 0 0 2409 908.7038 re W* q [0.747904 0 0 0.747904 0 -908.7038] cm /DeviceRGB {} CS [1 1 1] SC /DeviceRGB {} cs [1 1 1] sc 0 0 3221 2436 re f Q Q q 5.983235 0 2403.0168 907.20795 re W* q [0.822879 0 0 0.822978 95.330643 145.991699] cm /DeviceRGB {} CS [0.09 0.329 0.122] SC /DeviceRGB {} cs [0.09 0.329 0.122] sc 231 798 m 227 779 219 741 218 741 c 49 640 69 465 125 365 c 137 491 360 578 230 732 c 229 734 236 758 242 780 c 268 736 307 683 305 678 c 145 288 645 258 749 16 c 796 250 725 612 323 704 c 321 705 250 830 247 831 c 247 829 217 830 221 820 c 223 814 227 806 231 798 c h 330 625 m 267 476 452 312 544 271 c 356 439 324 564 330 625 c h 226 704 m 277 645 217 544 181 511 c 242 616 238 677 226 704 c h f Q q [26.582434 0 0 26.585632 866.89978 103.116905] cm /DeviceRGB {} CS [1 1 1] SC /DeviceRGB {} cs [1 1 1] sc 6.5 8.62 m 6.513333 8.940001 6.52 9.303333 6.52 9.71 c 6.52 10.116667 6.513333 10.473333 6.5 10.78 c 6.5 11.139999 6.436667 11.496666 6.31 11.849999 c 6.183333 12.203333 5.993333 12.52 5.74 12.799999 c 5.486666 13.079999 5.17 13.299999 4.79 13.459999 c 4.41 13.619999 3.973334 13.699999 3.48 13.699999 c 2.46 13.699999 l 2.46 18.919998 l 2.46 19.106665 2.486667 19.243332 2.54 19.329998 c 2.593333 19.416664 2.646667 19.466663 2.7 19.479998 c 2.78 19.519997 2.866667 19.519997 2.96 19.479998 c 2.96 19.999998 l 0.54 19.999998 l 0.54 19.479998 l 0.646667 19.519997 0.726667 19.519997 0.78 19.479998 c 0.846667 19.466663 0.913333 19.416664 0.98 19.329998 c 1.046667 19.243332 1.08 19.106665 1.08 18.919998 c 1.08 6.779998 l 1.08 6.579998 1.046667 6.436665 0.98 6.349998 c 0.913333 6.263331 0.846667 6.206665 0.78 6.179998 c 0.726667 6.153331 0.646667 6.153331 0.54 6.179998 c 0.54 5.699998 l 3.48 5.699998 l 3.973334 5.699998 4.41 5.779998 4.79 5.939998 c 5.17 6.099998 5.486666 6.319997 5.74 6.599998 c 5.993333 6.879998 6.183333 7.193331 6.31 7.539998 c 6.436667 7.886664 6.5 8.246664 6.5 8.619998 c 6.5 8.62 l h 5.08 8.18 m 5.08 7.833334 5.023333 7.533334 4.91 7.28 c 4.796667 7.026667 4.663333 6.826667 4.51 6.68 c 4.356667 6.533334 4.196666 6.416667 4.03 6.33 c 3.863333 6.243334 3.72 6.2 3.6 6.2 c 2.46 6.2 l 2.46 13.16 l 3.599999 13.16 l 3.72 13.16 3.863333 13.126666 4.029999 13.06 c 4.196666 12.993333 4.356666 12.876666 4.509999 12.709999 c 4.663333 12.543332 4.796666 12.339999 4.909999 12.099999 c 5.023333 11.86 5.079999 11.56 5.079999 11.2 c 5.079999 8.18 l 5.08 8.18 l h 14.58 19.139999 m 14.58 19.246666 14.553333 19.356667 14.5 19.469999 c 14.446667 19.583332 14.37 19.689999 14.270001 19.789999 c 14.170001 19.889999 14.043334 19.98 13.89 20.059999 c 13.736667 20.139999 13.56 20.18 13.360001 20.18 c 13.040001 20.18 12.753334 20.106667 12.500001 19.960001 c 12.246668 19.813335 12.073335 19.620001 11.980001 19.380001 c 11.900002 19.246668 11.840001 19.093334 11.800001 18.920002 c 11.626668 19.280003 11.363335 19.580002 11.010001 19.820002 c 10.656668 20.060001 10.266668 20.18 9.840001 20.180002 c 9.306667 20.180002 8.840001 19.98667 8.440002 19.600002 c 8.213335 19.400003 8.026669 19.140003 7.880002 18.820002 c 7.733335 18.5 7.646668 18.133333 7.620002 17.720001 c 7.606669 17.680002 7.600002 17.600002 7.600002 17.480001 c 7.600002 17.460001 l 7.613335 17.233334 7.653335 16.996668 7.720002 16.750002 c 7.786668 16.503336 7.890002 16.25667 8.030002 16.010002 c 8.170002 15.763335 8.336668 15.530002 8.530002 15.310002 c 8.723335 15.090003 8.933335 14.900003 9.160002 14.740003 c 9.213335 14.713336 9.256668 14.683336 9.290002 14.650003 c 9.323336 14.616669 9.373335 14.580003 9.440002 14.540003 c 9.500002 14.510003 l 9.560002 14.480003 l 9.800002 14.333337 10.010002 14.200004 10.190002 14.080004 c 10.370003 13.960004 10.533336 13.846671 10.680002 13.740004 c 10.760002 13.68667 10.840002 13.62667 10.920002 13.560003 c 11.000002 13.493337 11.086669 13.42667 11.180002 13.360004 c 11.300002 13.280004 11.413336 13.18667 11.520002 13.080004 c 11.626669 12.973337 11.706669 12.84667 11.760002 12.700004 c 11.840002 12.56667 11.880002 12.406671 11.880002 12.220003 c 11.880002 12.033336 11.860002 11.86667 11.820002 11.720003 c 11.766668 11.42667 11.630002 11.173337 11.410002 10.960003 c 11.190002 10.746669 10.946669 10.606669 10.680002 10.540003 c 10.560002 10.500003 10.446669 10.480002 10.340002 10.480002 c 9.966668 10.480002 9.646668 10.546669 9.380002 10.680002 c 9.206669 10.760002 9.080002 10.850002 9.000002 10.950003 c 8.920002 11.050003 8.876669 11.143336 8.870002 11.230002 c 8.863335 11.316669 8.880002 11.386668 8.920002 11.440002 c 8.960002 11.493337 9.013335 11.533337 9.080002 11.560002 c 9.106669 11.573336 9.123335 11.580003 9.130002 11.580003 c 9.136669 11.580003 9.153336 11.58667 9.180002 11.600003 c 9.353335 11.66667 9.496669 11.783337 9.610003 11.950004 c 9.723336 12.116671 9.780003 12.300004 9.780003 12.500004 c 9.780003 12.753337 9.690002 12.970004 9.510002 13.150003 c 9.330002 13.330003 9.113336 13.420003 8.860003 13.420004 c 8.593336 13.420004 8.36667 13.330004 8.180002 13.150003 c 7.993335 12.970003 7.900002 12.753337 7.900002 12.500004 c 7.900002 12.273337 7.930002 12.036671 7.990002 11.790004 c 8.050002 11.543337 8.140002 11.320004 8.260002 11.120004 c 8.513335 10.74667 8.816669 10.47667 9.170002 10.310003 c 9.523336 10.143336 9.913335 10.060003 10.340002 10.060003 c 10.660002 10.060003 10.976668 10.120004 11.290002 10.240004 c 11.603335 10.360004 11.883335 10.530004 12.130002 10.750004 c 12.376669 10.970004 12.583335 11.233337 12.750002 11.540004 c 12.916669 11.84667 13.000002 12.200004 13.000002 12.600004 c 13.000002 18.480003 l 13.000002 18.720003 13.003335 18.876671 13.010002 18.950003 c 13.016669 19.023335 13.020002 19.073336 13.020002 19.100002 c 13.020002 19.273336 13.073336 19.413336 13.180002 19.520002 c 13.286669 19.626669 13.413336 19.680002 13.560002 19.680002 c 13.733335 19.680002 13.873336 19.630003 13.980002 19.530003 c 14.086669 19.430002 14.146669 19.300003 14.160003 19.140003 c 14.580003 19.140003 l 14.58 19.139999 l h 11.44 18.639999 m 11.546666 18.453333 11.61 18.253332 11.629999 18.039999 c 11.649999 17.826666 11.659999 17.626665 11.659999 17.439999 c 11.659999 13.739999 l 11.606666 13.793332 11.549999 13.843332 11.489999 13.889998 c 11.429998 13.936665 11.366666 13.993332 11.299999 14.059999 c 10.913333 14.339998 10.583333 14.596665 10.31 14.829998 c 10.036666 15.063331 9.806666 15.303331 9.619999 15.549998 c 9.433332 15.796665 9.286665 16.06 9.179999 16.339998 c 9.073334 16.619999 9.006667 16.939999 8.98 17.299999 c 8.98 17.599998 l 8.993333 18.106665 9.13 18.503332 9.389999 18.789999 c 9.649999 19.076666 10.019999 19.219999 10.499999 19.219999 c 10.713332 19.219999 10.906666 19.166666 11.079999 19.059999 c 11.253332 18.939999 11.373332 18.799999 11.439999 18.639999 c 11.44 18.639999 l h 18.32 10.08 m 19.08 10.093333 19.686666 10.323334 20.139999 10.770001 c 20.593332 11.216667 20.82 11.926667 20.82 12.900001 c 20.82 17.380001 l 20.82 18.353334 20.593332 19.059999 20.139999 19.5 c 19.686666 19.940001 19.08 20.173334 18.32 20.200001 c 18.26 20.200001 l 18.033333 20.200001 17.826666 20.173334 17.639999 20.120001 c 17.619999 20.120001 l 17.606665 20.120001 17.599998 20.113335 17.599998 20.1 c 17.293333 19.993334 17.026667 19.846666 16.799999 19.66 c 16.609999 19.469999 l 16.609999 19.469999 16.56 19.4 16.459999 19.26 c 16.459999 22.58 l 16.459999 22.766666 16.486666 22.903334 16.539999 22.99 c 16.593332 23.076666 16.646666 23.133333 16.699999 23.16 c 16.779999 23.199999 16.866667 23.199999 16.959999 23.16 c 16.959999 23.66 l 14.539999 23.66 l 14.539999 23.16 l 14.646666 23.199999 14.726666 23.199999 14.779999 23.16 c 14.846665 23.133333 14.909999 23.076666 14.969998 22.99 c 15.029998 22.903334 15.059998 22.766666 15.059999 22.58 c 15.059999 11.3 l 15.059999 11.113334 15.029999 10.976667 14.969998 10.89 c 14.909998 10.803333 14.846665 10.746667 14.779999 10.72 c 14.726666 10.693334 14.646666 10.693334 14.539999 10.72 c 14.539999 10.24 l 16.459999 10.24 l 16.459999 11.02 l 16.553331 10.873333 16.666666 10.74 16.799999 10.62 c 17.026667 10.42 17.293333 10.273334 17.599998 10.18 c 17.599998 10.166667 17.606665 10.16 17.619999 10.16 c 17.639999 10.16 l 17.853333 10.106667 18.059999 10.08 18.26 10.08 c 18.32 10.08 l h 19.32 12.46 m 19.32 12.44 l 19.306665 11.76 19.223333 11.28 19.07 11 c 18.916666 10.72 18.666666 10.566667 18.32 10.54 c 18.08 10.526667 17.853333 10.556666 17.639999 10.63 c 17.426666 10.703334 17.24 10.826667 17.08 11 c 16.92 11.173333 16.786667 11.406666 16.68 11.7 c 16.573334 11.993334 16.5 12.34 16.460001 12.74 c 16.460001 17.540001 l 16.5 17.953335 16.573334 18.303335 16.68 18.59 c 16.786667 18.876665 16.92 19.103333 17.08 19.27 c 17.24 19.436668 17.426666 19.560001 17.639999 19.640001 c 17.853333 19.720001 18.08 19.753334 18.32 19.740002 c 18.666666 19.713335 18.916666 19.560001 19.07 19.280003 c 19.223333 19.000004 19.306665 18.520004 19.32 17.840002 c 19.32 17.820002 l 19.32 12.460001 l 19.32 12.46 l h 24.379999 10.08 m 24.686665 10.08 24.999998 10.133333 25.32 10.24 c 25.640001 10.346666 25.926668 10.513333 26.18 10.74 c 26.433332 10.966666 26.636667 11.253333 26.790001 11.599999 c 26.943335 11.946666 27.020002 12.359999 27.02 12.839999 c 27.02 14.859999 l 27.02 14.919999 l 27.02 15.379999 l 23.040001 15.379999 l 23.040001 17.439999 l 23.040001 18.266665 23.183334 18.856665 23.470001 19.209999 c 23.756668 19.563334 24.113335 19.733334 24.540001 19.719999 c 24.793333 19.706665 25.043333 19.663332 25.290001 19.59 c 25.536669 19.516668 25.750002 19.393333 25.93 19.219999 c 26.109999 19.046665 26.26 18.799997 26.380001 18.48 c 26.500002 18.160002 26.560003 17.740002 26.560001 17.219999 c 27.02 17.219999 l 27.02 17.5 l 27.02 17.860001 26.98 18.203335 26.9 18.530001 c 26.82 18.856667 26.679998 19.140001 26.48 19.380001 c 26.280001 19.620001 26.023333 19.810001 25.709999 19.950001 c 25.396666 20.09 25.013332 20.166666 24.559999 20.18 c 24.24 20.18 23.913334 20.120001 23.58 20 c 23.246666 19.879999 22.946667 19.699999 22.68 19.459999 c 22.413334 19.219999 22.193335 18.936665 22.02 18.609999 c 21.846666 18.283333 21.76 17.913332 21.76 17.499998 c 21.76 17.029999 l 21.76 17.029999 21.756666 16.773333 21.75 16.259998 c 21.743334 15.746665 21.74 15.429998 21.74 15.309999 c 21.74 15.189999 21.736666 14.859999 21.73 14.319999 c 21.723333 13.779999 21.719999 13.489999 21.719999 13.449999 c 21.719999 12.859999 l 21.719999 12.379998 21.803333 11.963332 21.969999 11.609999 c 22.136665 11.256665 22.343332 10.969999 22.59 10.749999 c 22.836668 10.529999 23.116667 10.363333 23.43 10.249999 c 23.743334 10.136665 24.059999 10.079999 24.380001 10.079999 c 24.379999 10.08 l h 25.68 14.86 m 25.68 13.28 l 25.68 12.773333 25.646667 12.349999 25.58 12.01 c 25.513332 11.670001 25.423332 11.396668 25.309999 11.190001 c 25.196667 10.983334 25.059999 10.84 24.9 10.76 c 24.74 10.68 24.559999 10.64 24.359999 10.64 c 23.933332 10.64 23.609999 10.826667 23.389999 11.200001 c 23.17 11.573335 23.059999 12.266667 23.059999 13.280001 c 23.059999 14.860001 l 25.68 14.860001 l 25.68 14.86 l h 33.540001 11.66 m 33.540001 11.686667 33.546669 11.74 33.560001 11.82 c 33.573334 11.9 33.573334 11.966666 33.560001 12.02 c 33.546669 12.299999 33.450001 12.53 33.27 12.709999 c 33.09 12.889998 32.873333 12.979999 32.619999 12.98 c 32.353333 12.98 32.129997 12.886666 31.949999 12.7 c 31.77 12.513333 31.68 12.286667 31.679998 12.02 c 31.679998 11.686667 31.806665 11.433332 32.059998 11.259999 c 32.086666 11.246666 32.103333 11.236666 32.109997 11.23 c 32.139996 11.2 l 32.23333 11.133333 32.293327 11.036666 32.319996 10.91 c 32.346664 10.783334 32.266663 10.673333 32.079994 10.58 c 31.959993 10.513333 31.839994 10.48 31.719994 10.48 c 31.319994 10.453333 30.96666 10.573333 30.659994 10.839999 c 30.353329 11.106666 30.146662 11.573332 30.039993 12.239999 c 30.039993 18.919998 l 30.039993 19.106665 30.06666 19.243332 30.119993 19.329998 c 30.173326 19.416664 30.22666 19.466663 30.279993 19.479998 c 30.359993 19.519997 30.446661 19.519997 30.539993 19.479998 c 30.539993 19.999998 l 28.119993 19.999998 l 28.119993 19.479998 l 28.22666 19.519997 28.30666 19.519997 28.359993 19.479998 c 28.426661 19.466663 28.493326 19.416664 28.559994 19.329998 c 28.626661 19.243332 28.659994 19.106665 28.659994 18.919998 c 28.659994 11.299998 l 28.659994 11.113332 28.626661 10.976666 28.559994 10.889998 c 28.493326 10.803331 28.426661 10.746665 28.359993 10.719998 c 28.30666 10.693332 28.22666 10.693332 28.119993 10.719998 c 28.119993 10.219998 l 30.039993 10.219998 l 30.039993 11.039998 l 30.133326 10.893332 30.22666 10.756664 30.319994 10.629998 c 30.413328 10.503332 30.523329 10.396666 30.649994 10.309999 c 30.776659 10.223331 30.923326 10.153332 31.089994 10.099999 c 31.256662 10.046665 31.466661 10.019999 31.719994 10.019999 c 32.106663 10.019999 32.466663 10.159999 32.799995 10.439999 c 33.133327 10.719998 33.379997 11.126665 33.539997 11.659999 c 33.540001 11.66 l h 36.240002 18.92 m 36.240002 19.106667 36.27 19.243334 36.330002 19.33 c 36.390003 19.416666 36.446667 19.466665 36.5 19.48 c 36.566666 19.519999 36.653332 19.519999 36.759998 19.48 c 36.759998 20 l 34.339996 20 l 34.339996 19.48 l 34.446663 19.519999 34.539997 19.519999 34.619995 19.48 c 34.659996 19.466665 34.713329 19.416666 34.779995 19.33 c 34.846661 19.243334 34.879993 19.106667 34.879993 18.92 c 34.879993 6.8 l 34.879993 6.6 34.846661 6.456667 34.779995 6.37 c 34.713329 6.283334 34.659996 6.226667 34.619995 6.2 c 34.539997 6.16 34.446663 6.16 34.339996 6.2 c 34.339996 5.72 l 36.239998 5.72 l 36.239998 6.8 l 36.239998 18.92 l 36.240002 18.92 l h 40.580002 10.08 m 40.886669 10.08 41.200001 10.133333 41.52 10.24 c 41.84 10.346666 42.126667 10.513333 42.380001 10.74 c 42.633335 10.966666 42.83667 11.253333 42.990002 11.599999 c 43.143333 11.946666 43.220001 12.359999 43.220001 12.839999 c 43.220001 14.859999 l 43.220001 14.919999 l 43.220001 15.379999 l 39.240002 15.379999 l 39.240002 17.439999 l 39.240002 18.266665 39.383335 18.856665 39.670002 19.209999 c 39.956669 19.563334 40.313335 19.733334 40.740002 19.719999 c 40.993336 19.706665 41.243336 19.663332 41.490002 19.59 c 41.736668 19.516668 41.950001 19.393333 42.130001 19.219999 c 42.310001 19.046665 42.460003 18.799997 42.580002 18.48 c 42.700001 18.160002 42.760002 17.740002 42.760002 17.219999 c 43.220001 17.219999 l 43.220001 17.5 l 43.220001 17.860001 43.18 18.203335 43.100002 18.530001 c 43.020004 18.856667 42.880005 19.140001 42.680004 19.380001 c 42.480003 19.620001 42.223339 19.810001 41.910004 19.950001 c 41.596668 20.09 41.213337 20.166666 40.760002 20.18 c 40.440002 20.18 40.113335 20.120001 39.780003 20 c 39.446671 19.879999 39.146667 19.699999 38.880001 19.459999 c 38.613335 19.219999 38.393333 18.936665 38.220001 18.609999 c 38.046669 18.283333 37.960003 17.913332 37.960003 17.499998 c 37.960003 17.029999 l 37.960003 17.029999 37.956669 16.773333 37.950005 16.259998 c 37.94334 15.746665 37.940006 15.429998 37.940006 15.309999 c 37.940006 15.189999 37.936672 14.859999 37.930008 14.319999 c 37.923344 13.779999 37.92001 13.489999 37.92001 13.449999 c 37.92001 12.859999 l 37.92001 12.379998 38.003342 11.963332 38.17001 11.609999 c 38.336678 11.256665 38.543343 10.969999 38.790009 10.749999 c 39.036674 10.529999 39.316673 10.363333 39.630009 10.249999 c 39.943344 10.136665 40.26001 10.079999 40.580009 10.079999 c 40.580002 10.08 l h 41.880001 14.86 m 41.880001 13.28 l 41.880001 12.773333 41.846668 12.349999 41.780003 12.01 c 41.713337 11.670001 41.623337 11.396668 41.510002 11.190001 c 41.396667 10.983334 41.260002 10.84 41.100002 10.76 c 40.940002 10.68 40.760002 10.64 40.560001 10.64 c 40.133335 10.64 39.810001 10.826667 39.59 11.200001 c 39.369999 11.573335 39.259998 12.266667 39.259998 13.280001 c 39.259998 14.860001 l 41.879997 14.860001 l 41.880001 14.86 l h 47.880001 19.879999 m 47.866669 19.893333 47.856667 19.9 47.850002 19.9 c 47.843338 19.9 47.833336 19.906666 47.820004 19.92 c 47.800003 19.940001 l 47.773335 19.953335 47.743336 19.966667 47.710003 19.980001 c 47.67667 19.993336 47.646671 20.006668 47.620003 20.020002 c 47.340004 20.140003 47.013336 20.200003 46.640003 20.200003 c 46.42667 20.200003 46.220005 20.150003 46.020004 20.050003 c 45.820004 19.950003 45.646671 19.866671 45.500004 19.800003 c 45.353336 19.733335 45.230003 19.703337 45.130005 19.710003 c 45.030006 19.716669 44.980007 19.813337 44.980003 20.000004 c 44.600002 20.000004 l 44.600002 17.600004 l 45.080002 17.600004 l 45.053333 18.02667 45.100002 18.393337 45.220001 18.700005 c 45.299999 18.966671 45.456669 19.216671 45.690002 19.450005 c 45.923336 19.683338 46.273338 19.800005 46.740002 19.800005 c 47.046669 19.800005 47.299999 19.746672 47.5 19.640005 c 47.846668 19.466671 48.083332 19.260004 48.209999 19.020004 c 48.336666 18.780005 48.386665 18.530005 48.360001 18.270004 c 48.333336 18.010004 48.236668 17.753338 48.07 17.500004 c 47.903332 17.24667 47.699997 17.013336 47.459999 16.800003 c 47.299999 16.680002 47.133331 16.553337 46.959999 16.420004 c 46.786667 16.286671 46.613335 16.146671 46.439999 16.000004 c 45.973331 15.62667 45.603333 15.290004 45.329998 14.990004 c 45.056664 14.690003 44.846664 14.410004 44.699997 14.150003 c 44.553329 13.890003 44.453331 13.643336 44.399998 13.410004 c 44.346664 13.176671 44.32 12.926671 44.319996 12.660004 c 44.319996 12.500004 44.329994 12.353337 44.349995 12.220004 c 44.369995 12.086671 44.393326 11.966671 44.419994 11.860004 c 44.459995 11.633338 44.526661 11.413338 44.619995 11.200005 c 44.713329 10.986671 44.846661 10.796672 45.019997 10.630005 c 45.193333 10.463338 45.406666 10.326672 45.659996 10.220005 c 45.913326 10.113339 46.219994 10.060005 46.579994 10.060005 c 46.779995 10.060005 46.979992 10.103338 47.179993 10.190005 c 47.379993 10.276672 47.559994 10.356672 47.719994 10.430005 c 47.879993 10.503338 48.00666 10.536672 48.099995 10.530006 c 48.193329 10.523339 48.239994 10.420006 48.239994 10.220005 c 48.619995 10.220005 l 48.619995 12.700005 l 48.099995 12.700005 l 48.113327 12.300004 48.066662 11.940004 47.959995 11.620005 c 47.866661 11.340005 47.703327 11.086671 47.469994 10.860004 c 47.23666 10.633338 46.893326 10.520004 46.439995 10.520004 c 46.079994 10.520004 45.786659 10.600004 45.559994 10.760004 c 45.439995 10.853337 45.336658 10.990005 45.249992 11.170004 c 45.163326 11.350003 45.113323 11.54667 45.099991 11.760004 c 45.086658 11.973338 45.119991 12.203338 45.199989 12.450005 c 45.279987 12.696671 45.439987 12.926671 45.679989 13.140005 c 45.706657 13.180005 45.743324 13.220005 45.789989 13.260005 c 45.836655 13.300005 45.886658 13.333338 45.939991 13.360005 c 45.979992 13.386672 46.013325 13.413339 46.039989 13.440005 c 46.119991 13.520005 l 46.266659 13.640005 46.41666 13.760005 46.569992 13.880005 c 46.723324 14.000005 46.879993 14.120005 47.039993 14.240005 c 47.413326 14.560005 47.723328 14.850005 47.969994 15.110004 c 48.21666 15.370004 48.423325 15.613338 48.589993 15.840004 c 48.75666 16.066671 48.879993 16.280004 48.959991 16.480003 c 49.039989 16.680002 49.086658 16.873337 49.099991 17.060003 c 49.233326 17.673336 49.209991 18.190002 49.029991 18.610003 c 48.849991 19.030003 48.619991 19.360003 48.339993 19.600002 c 48.319992 19.600002 l 48.319992 19.626669 48.30666 19.640003 48.279991 19.640003 c 48.253323 19.66667 48.226658 19.68667 48.199989 19.700003 c 48.07999 19.780003 l 48.07999 19.780003 48.039989 19.800003 47.959991 19.840002 c 47.959991 19.860003 l 47.946659 19.860003 47.933323 19.863337 47.919991 19.870003 c 47.906658 19.876669 47.893322 19.880003 47.87999 19.880003 c 47.880001 19.879999 l h 53.82 19.879999 m 53.806667 19.893333 53.796665 19.9 53.790001 19.9 c 53.783337 19.9 53.773335 19.906666 53.760002 19.92 c 53.740002 19.940001 l 53.713333 19.953335 53.683334 19.966667 53.650002 19.980001 c 53.616669 19.993336 53.58667 20.006668 53.560001 20.020002 c 53.280003 20.140003 52.953335 20.200003 52.580002 20.200003 c 52.366669 20.200003 52.160004 20.150003 51.960003 20.050003 c 51.760002 19.950003 51.58667 19.866671 51.440002 19.800003 c 51.293335 19.733335 51.170002 19.703337 51.070004 19.710003 c 50.970005 19.716669 50.920006 19.813337 50.920002 20.000004 c 50.540001 20.000004 l 50.540001 17.600004 l 51.02 17.600004 l 50.993332 18.02667 51.040001 18.393337 51.16 18.700005 c 51.239998 18.966671 51.396667 19.216671 51.630001 19.450005 c 51.863335 19.683338 52.213337 19.800005 52.68 19.800005 c 52.986668 19.800005 53.239998 19.746672 53.439999 19.640005 c 53.786667 19.466671 54.023331 19.260004 54.149998 19.020004 c 54.276665 18.780005 54.326664 18.530005 54.299999 18.270004 c 54.273335 18.010004 54.176666 17.753338 54.009998 17.500004 c 53.84333 17.24667 53.639996 17.013336 53.399998 16.800003 c 53.239998 16.680002 53.07333 16.553337 52.899998 16.420004 c 52.726665 16.286671 52.553333 16.146671 52.379997 16.000004 c 51.91333 15.62667 51.543331 15.290004 51.269997 14.990004 c 50.996662 14.690003 50.786663 14.410004 50.639996 14.150003 c 50.493328 13.890003 50.39333 13.643336 50.339996 13.410004 c 50.286663 13.176671 50.259998 12.926671 50.259995 12.660004 c 50.259995 12.500004 50.269993 12.353337 50.289993 12.220004 c 50.309994 12.086671 50.333324 11.966671 50.359993 11.860004 c 50.399994 11.633338 50.46666 11.413338 50.559994 11.200005 c 50.653328 10.986671 50.786659 10.796672 50.959995 10.630005 c 51.133331 10.463338 51.346664 10.326672 51.599995 10.220005 c 51.853325 10.113339 52.159992 10.060005 52.519993 10.060005 c 52.719994 10.060005 52.919991 10.103338 53.119991 10.190005 c 53.319992 10.276672 53.499992 10.356672 53.659992 10.430005 c 53.819992 10.503338 53.946659 10.536672 54.039993 10.530006 c 54.133327 10.523339 54.179993 10.420006 54.179993 10.220005 c 54.559994 10.220005 l 54.559994 12.700005 l 54.039993 12.700005 l 54.053326 12.300004 54.00666 11.940004 53.899994 11.620005 c 53.80666 11.340005 53.643326 11.086671 53.409992 10.860004 c 53.176659 10.633338 52.833324 10.520004 52.379993 10.520004 c 52.019993 10.520004 51.726658 10.600004 51.499992 10.760004 c 51.379993 10.853337 51.276657 10.990005 51.189991 11.170004 c 51.103325 11.350003 51.053322 11.54667 51.039989 11.760004 c 51.026657 11.973338 51.05999 12.203338 51.139988 12.450005 c 51.219986 12.696671 51.379986 12.926671 51.619987 13.140005 c 51.646656 13.180005 51.683323 13.220005 51.729988 13.260005 c 51.776653 13.300005 51.826656 13.333338 51.87999 13.360005 c 51.919991 13.386672 51.953323 13.413339 51.979988 13.440005 c 52.05999 13.520005 l 52.206657 13.640005 52.356659 13.760005 52.509991 13.880005 c 52.663322 14.000005 52.819992 14.120005 52.979992 14.240005 c 53.353325 14.560005 53.663326 14.850005 53.909992 15.110004 c 54.156658 15.370004 54.363323 15.613338 54.529991 15.840004 c 54.696659 16.066671 54.819992 16.280004 54.89999 16.480003 c 54.979988 16.680002 55.026657 16.873337 55.039989 17.060003 c 55.173325 17.673336 55.14999 18.190002 54.96999 18.610003 c 54.789989 19.030003 54.55999 19.360003 54.279991 19.600002 c 54.259991 19.600002 l 54.259991 19.626669 54.246658 19.640003 54.21999 19.640003 c 54.193321 19.66667 54.166656 19.68667 54.139988 19.700003 c 54.019989 19.780003 l 54.019989 19.780003 53.979988 19.800003 53.89999 19.840002 c 53.89999 19.860003 l 53.886658 19.860003 53.873322 19.863337 53.859989 19.870003 c 53.846657 19.876669 53.833321 19.880003 53.819988 19.880003 c 53.82 19.879999 l h f Q Q Q showpage %%PageTrailer pdfEndPage %%Trailer end %%DocumentSuppliedResources: %%EOF ================================================ FILE: scripts/docker-entrypoint.sh ================================================ #!/bin/bash set -e # Source: https://github.com/sameersbn/docker-gitlab/ map_uidgid() { USERMAP_ORIG_UID=$(id -u paperless) USERMAP_ORIG_GID=$(id -g paperless) USERMAP_NEW_UID=${USERMAP_UID:-$USERMAP_ORIG_UID} USERMAP_NEW_GID=${USERMAP_GID:-${USERMAP_ORIG_GID:-$USERMAP_NEW_UID}} if [[ ${USERMAP_NEW_UID} != "${USERMAP_ORIG_UID}" || ${USERMAP_NEW_GID} != "${USERMAP_ORIG_GID}" ]]; then echo "Mapping UID and GID for paperless:paperless to $USERMAP_NEW_UID:$USERMAP_NEW_GID" usermod -u "${USERMAP_NEW_UID}" paperless groupmod -o -g "${USERMAP_NEW_GID}" paperless fi } set_permissions() { # Set permissions for consumption and export directory for dir in PAPERLESS_CONSUMPTION_DIR PAPERLESS_EXPORT_DIR; do # Extract the name of the current directory from $dir for the error message cur_dir_name=$(echo "$dir" | awk -F'_' '{ print tolower($2); }') chgrp paperless "${!dir}" || { echo "Changing group of ${cur_dir_name} directory:" echo " ${!dir}" echo "failed." echo "" echo "Either try to set it on your host-mounted directory" echo "directly, or make sure that the directory has \`g+wx\`" echo "permissions and the files in it at least \`o+r\`." } >&2 chmod g+wx "${!dir}" || { echo "Changing group permissions of ${cur_dir_name} directory:" echo " ${!dir}" echo "failed." echo "" echo "Either try to set it on your host-mounted directory" echo "directly, or make sure that the directory has \`g+wx\`" echo "permissions and the files in it at least \`o+r\`." } >&2 done # Set permissions for application directory chown -Rh paperless:paperless /usr/src/paperless } migrations() { # A simple lock file in case other containers use this startup LOCKFILE="/usr/src/paperless/data/db.sqlite3.migration" # check for and create lock file in one command if (set -o noclobber; echo "$$" > "${LOCKFILE}") 2> /dev/null then trap 'rm -f "${LOCKFILE}"; exit $?' INT TERM EXIT sudo -HEu paperless "/usr/src/paperless/src/manage.py" "migrate" rm ${LOCKFILE} fi } initialize() { map_uidgid set_permissions migrations } install_languages() { local langs="$1" read -ra langs <<<"$langs" # Check that it is not empty if [ ${#langs[@]} -eq 0 ]; then return fi # Loop over languages to be installed for lang in "${langs[@]}"; do pkg="tesseract-ocr-data-$lang" # English is installed by default if [[ "$lang" == "eng" ]]; then continue fi if apk info -e "$pkg" > /dev/null 2>&1; then continue fi if ! apk --no-cache info "$pkg" > /dev/null 2>&1; then continue fi apk --no-cache --update add "$pkg" done } if [[ "$1" != "/"* ]]; then initialize # Install additional languages if specified if [[ ! -z "$PAPERLESS_OCR_LANGUAGES" ]]; then install_languages "$PAPERLESS_OCR_LANGUAGES" fi if [[ "$1" = "gunicorn" ]]; then shift EXTRA_PARAMS="" SSL_KEY_PATH="/usr/src/paperless/data/ssl.key" SSL_CERT_PATH="/usr/src/paperless/data/ssl.cert" if [ "${PAPERLESS_USE_SSL}" = "true" ]; then if [ -f "${SSL_KEY_PATH}" ] && [ -f "${SSL_CERT_PATH}" ]; then EXTRA_PARAMS="--certfile=${SSL_CERT_PATH} --keyfile=${SSL_KEY_PATH}" else echo "Error: Could not find certfile in ${SSL_CERT_PATH} or keyfile in ${SSL_KEY_PATH}, but \$PAPERLESS_USE_SSL is true. Starting without SSL enabled." fi fi cd /usr/src/paperless/src/ && \ exec sudo -HEu paperless /usr/bin/gunicorn -c /usr/src/paperless/gunicorn.conf ${EXTRA_PARAMS} "$@" paperless.wsgi else exec sudo -HEu paperless "/usr/src/paperless/src/manage.py" "$@" fi fi exec "$@" ================================================ FILE: scripts/gunicorn.conf ================================================ bind = '127.0.0.1:8000' backlog = 2048 workers = 3 worker_class = 'sync' worker_connections = 1000 timeout = 20 keepalive = 2 spew = False daemon = False pidfile = None umask = 0 user = None group = None tmp_upload_dir = None loglevel = 'info' errorlog = '-' accesslog = '-' proc_name = None def pre_fork(server, worker): pass def pre_exec(server): server.log.info("Forked child, re-executing.") def when_ready(server): server.log.info("Server is ready. Spawning workers") def worker_int(worker): worker.log.info("worker received INT or QUIT signal") ## get traceback info import threading, sys, traceback id2name = dict([(th.ident, th.name) for th in threading.enumerate()]) code = [] for threadId, stack in sys._current_frames().items(): code.append("\n# Thread: %s(%d)" % (id2name.get(threadId,""), threadId)) for filename, lineno, name, line in traceback.extract_stack(stack): code.append('File: "%s", line %d, in %s' % (filename, lineno, name)) if line: code.append(" %s" % (line.strip())) worker.log.debug("\n".join(code)) def worker_abort(worker): worker.log.info("worker received SIGABRT signal") ================================================ FILE: scripts/paperless-consumer.service ================================================ [Unit] Description=Paperless consumer [Service] User=paperless Group=paperless ExecStart=/home/paperless/project/virtualenv/bin/python /home/paperless/project/src/manage.py document_consumer [Install] WantedBy=multi-user.target ================================================ FILE: scripts/paperless-webserver.service ================================================ [Unit] Description=Paperless webserver After=network.target Wants=network.target [Service] User=paperless Group=paperless ExecStart=/home/paperless/project/virtualenv/bin/gunicorn --pythonpath=/home/paperless/project/src paperless.wsgi -w 2 [Install] WantedBy=multi-user.target ================================================ FILE: scripts/post-consumption-example.sh ================================================ #!/usr/bin/env bash DOCUMENT_ID=${1} DOCUMENT_FILE_NAME=${2} DOCUMENT_SOURCE_PATH=${3} DOCUMENT_THUMBNAIL_PATH=${4} DOCUMENT_DOWNLOAD_URL=${5} DOCUMENT_THUMBNAIL_URL=${6} DOCUMENT_CORRESPONDENT=${7} DOCUMENT_TAGS=${8} echo " A document with an id of ${DOCUMENT_ID} was just consumed. I know the following additional information about it: * Generated File Name: ${DOCUMENT_FILE_NAME} * Source Path: ${DOCUMENT_SOURCE_PATH} * Thumbnail Path: ${DOCUMENT_THUMBNAIL_PATH} * Download URL: ${DOCUMENT_DOWNLOAD_URL} * Thumbnail URL: ${DOCUMENT_THUMBNAIL_URL} * Correspondent: ${DOCUMENT_CORRESPONDENT} * Tags: ${DOCUMENT_TAGS} It was consumed with the passphrase ${PASSPHRASE} " ================================================ FILE: src/documents/__init__.py ================================================ from .checks import changed_password_check ================================================ FILE: src/documents/actions.py ================================================ from django.contrib import messages from django.contrib.admin import helpers from django.contrib.admin.utils import model_ngettext from django.core.exceptions import PermissionDenied from django.template.response import TemplateResponse from documents.models import Correspondent, Tag def select_action( modeladmin, request, queryset, title, action, modelclass, success_message="", document_action=None, queryset_action=None): opts = modeladmin.model._meta app_label = opts.app_label if not modeladmin.has_change_permission(request): raise PermissionDenied if request.POST.get('post'): n = queryset.count() selected_object = modelclass.objects.get(id=request.POST.get('obj_id')) if n: for document in queryset: if document_action: document_action(document, selected_object) document_display = str(document) modeladmin.log_change(request, document, document_display) if queryset_action: queryset_action(queryset, selected_object) modeladmin.message_user(request, success_message % { "selected_object": selected_object.name, "count": n, "items": model_ngettext(modeladmin.opts, n) }, messages.SUCCESS) # Return None to display the change list page again. return None context = dict( modeladmin.admin_site.each_context(request), title=title, queryset=queryset, opts=opts, action_checkbox_name=helpers.ACTION_CHECKBOX_NAME, media=modeladmin.media, action=action, objects=modelclass.objects.all(), itemname=model_ngettext(modelclass, 1) ) request.current_app = modeladmin.admin_site.name return TemplateResponse( request, "admin/{}/{}/select_object.html".format(app_label, opts.model_name), context ) def simple_action( modeladmin, request, queryset, success_message="", document_action=None, queryset_action=None): if not modeladmin.has_change_permission(request): raise PermissionDenied n = queryset.count() if n: for document in queryset: if document_action: document_action(document) document_display = str(document) modeladmin.log_change(request, document, document_display) if queryset_action: queryset_action(queryset) modeladmin.message_user(request, success_message % { "count": n, "items": model_ngettext(modeladmin.opts, n) }, messages.SUCCESS) # Return None to display the change list page again. return None def add_tag_to_selected(modeladmin, request, queryset): return select_action( modeladmin=modeladmin, request=request, queryset=queryset, title="Add tag to multiple documents", action="add_tag_to_selected", modelclass=Tag, success_message="Successfully added tag %(selected_object)s to " "%(count)d %(items)s.", document_action=lambda doc, tag: doc.tags.add(tag) ) def remove_tag_from_selected(modeladmin, request, queryset): return select_action( modeladmin=modeladmin, request=request, queryset=queryset, title="Remove tag from multiple documents", action="remove_tag_from_selected", modelclass=Tag, success_message="Successfully removed tag %(selected_object)s from " "%(count)d %(items)s.", document_action=lambda doc, tag: doc.tags.remove(tag) ) def set_correspondent_on_selected(modeladmin, request, queryset): return select_action( modeladmin=modeladmin, request=request, queryset=queryset, title="Set correspondent on multiple documents", action="set_correspondent_on_selected", modelclass=Correspondent, success_message="Successfully set correspondent %(selected_object)s " "on %(count)d %(items)s.", queryset_action=lambda qs, corr: qs.update(correspondent=corr) ) def remove_correspondent_from_selected(modeladmin, request, queryset): return simple_action( modeladmin=modeladmin, request=request, queryset=queryset, success_message="Successfully removed correspondent from %(count)d " "%(items)s.", queryset_action=lambda qs: qs.update(correspondent=None) ) add_tag_to_selected.short_description = "Add tag to selected documents" remove_tag_from_selected.short_description = \ "Remove tag from selected documents" set_correspondent_on_selected.short_description = \ "Set correspondent on selected documents" remove_correspondent_from_selected.short_description = \ "Remove correspondent from selected documents" ================================================ FILE: src/documents/admin.py ================================================ from datetime import datetime, timedelta from django.conf import settings from django.contrib import admin, messages from django.contrib.admin.templatetags.admin_urls import add_preserved_filters from django.contrib.auth.models import Group, User from django.db import models from django.http import HttpResponseRedirect from django.templatetags.static import static from django.urls import reverse from django.utils.html import format_html, format_html_join from django.utils.http import urlquote from django.utils.safestring import mark_safe from djangoql.admin import DjangoQLSearchMixin from documents.actions import ( add_tag_to_selected, remove_correspondent_from_selected, remove_tag_from_selected, set_correspondent_on_selected ) from .models import Correspondent, Document, Log, Tag class FinancialYearFilter(admin.SimpleListFilter): title = "Financial Year" parameter_name = "fy" _fy_wraps = None def _fy_start(self, year): """Return date of the start of financial year for the given year.""" fy_start = "{}-{}".format(str(year), settings.FY_START) return datetime.strptime(fy_start, "%Y-%m-%d").date() def _fy_end(self, year): """Return date of the end of financial year for the given year.""" fy_end = "{}-{}".format(str(year), settings.FY_END) return datetime.strptime(fy_end, "%Y-%m-%d").date() def _fy_does_wrap(self): """Return whether the financial year spans across two years.""" if self._fy_wraps is None: start = "{}".format(settings.FY_START) start = datetime.strptime(start, "%m-%d").date() end = "{}".format(settings.FY_END) end = datetime.strptime(end, "%m-%d").date() self._fy_wraps = end < start return self._fy_wraps def _determine_fy(self, date): """Return a (query, display) financial year tuple of the given date.""" if self._fy_does_wrap(): fy_start = self._fy_start(date.year) if date.date() >= fy_start: query = "{}-{}".format(date.year, date.year + 1) else: query = "{}-{}".format(date.year - 1, date.year) # To keep it simple we use the same string for both # query parameter and the display. return query, query else: query = "{0}-{0}".format(date.year) display = "{}".format(date.year) return query, display def lookups(self, request, model_admin): if not settings.FY_START or not settings.FY_END: return None r = [] for document in Document.objects.all(): r.append(self._determine_fy(document.created)) return sorted(set(r), key=lambda x: x[0], reverse=True) def queryset(self, request, queryset): if not self.value() or not settings.FY_START or not settings.FY_END: return None start, end = self.value().split("-") return queryset.filter(created__gte=self._fy_start(start), created__lte=self._fy_end(end)) class RecentCorrespondentFilter(admin.RelatedFieldListFilter): """ If PAPERLESS_RECENT_CORRESPONDENT_YEARS is set, we limit the available correspondents to documents sent our way over the past ``n`` years. """ def field_choices(self, field, request, model_admin): years = settings.PAPERLESS_RECENT_CORRESPONDENT_YEARS correspondents = Correspondent.objects.all() if years and years > 0: self.title = "Correspondent (Recent)" days = 365 * years correspondents = correspondents.filter( documents__created__gte=datetime.now() - timedelta(days=days) ).distinct() return [(c.id, c.name) for c in correspondents] class CommonAdmin(admin.ModelAdmin): list_per_page = settings.PAPERLESS_LIST_PER_PAGE class CorrespondentAdmin(CommonAdmin): list_display = ( "name", "match", "matching_algorithm", "document_count", "last_correspondence" ) list_filter = ("matching_algorithm",) list_editable = ("match", "matching_algorithm") readonly_fields = ("slug",) def get_queryset(self, request): qs = super(CorrespondentAdmin, self).get_queryset(request) qs = qs.annotate( document_count=models.Count("documents"), last_correspondence=models.Max("documents__created") ) return qs def document_count(self, obj): return obj.document_count document_count.admin_order_field = "document_count" def last_correspondence(self, obj): return obj.last_correspondence last_correspondence.admin_order_field = "last_correspondence" class TagAdmin(CommonAdmin): list_display = ( "name", "colour", "match", "matching_algorithm", "document_count") list_filter = ("colour", "matching_algorithm") list_editable = ("colour", "match", "matching_algorithm") readonly_fields = ("slug",) class Media: js = ("js/colours.js",) def get_queryset(self, request): qs = super(TagAdmin, self).get_queryset(request) qs = qs.annotate(document_count=models.Count("documents")) return qs def document_count(self, obj): return obj.document_count document_count.admin_order_field = "document_count" class DocumentAdmin(DjangoQLSearchMixin, CommonAdmin): class Media: css = { "all": ("paperless.css",) } search_fields = ("correspondent__name", "title", "content", "tags__name") readonly_fields = ("added", "file_type", "storage_type",) list_display = ("title", "created", "added", "thumbnail", "correspondent", "tags_") list_filter = ( "tags", ("correspondent", RecentCorrespondentFilter), FinancialYearFilter ) filter_horizontal = ("tags",) ordering = ["-created", "correspondent"] actions = [ add_tag_to_selected, remove_tag_from_selected, set_correspondent_on_selected, remove_correspondent_from_selected ] date_hierarchy = "created" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.document_queue = [] def has_add_permission(self, request): return False def created_(self, obj): return obj.created.date().strftime("%Y-%m-%d") created_.short_description = "Created" def changelist_view(self, request, extra_context=None): response = super().changelist_view( request, extra_context=extra_context ) if request.method == "GET": cl = self.get_changelist_instance(request) self.document_queue = [doc.id for doc in cl.queryset] return response def change_view(self, request, object_id=None, form_url='', extra_context=None): extra_context = extra_context or {} if self.document_queue and object_id: if int(object_id) in self.document_queue: # There is a queue of documents current_index = self.document_queue.index(int(object_id)) if current_index < len(self.document_queue) - 1: # ... and there are still documents in the queue extra_context["next_object"] = self.document_queue[ current_index + 1 ] return super(DocumentAdmin, self).change_view( request, object_id, form_url, extra_context=extra_context, ) def response_change(self, request, obj): # This is mostly copied from ModelAdmin.response_change() opts = self.model._meta preserved_filters = self.get_preserved_filters(request) msg_dict = { "name": opts.verbose_name, "obj": format_html( '{}', urlquote(request.path), obj ), } if "_saveandeditnext" in request.POST: msg = format_html( 'The {name} "{obj}" was changed successfully. ' 'Editing next object.', **msg_dict ) self.message_user(request, msg, messages.SUCCESS) redirect_url = reverse( "admin:{}_{}_change".format(opts.app_label, opts.model_name), args=(request.POST["_next_object"],), current_app=self.admin_site.name ) redirect_url = add_preserved_filters( { "preserved_filters": preserved_filters, "opts": opts }, redirect_url ) return HttpResponseRedirect(redirect_url) return super().response_change(request, obj) @mark_safe def thumbnail(self, obj): return self._html_tag( "a", self._html_tag( "img", src=reverse("fetch", kwargs={"kind": "thumb", "pk": obj.pk}), width=180, alt="Thumbnail of {}".format(obj.file_name), title=obj.file_name ), href=obj.download_url ) @mark_safe def tags_(self, obj): r = "" for tag in obj.tags.all(): colour = tag.get_colour_display() r += self._html_tag( "a", tag.slug, **{ "class": "tag", "style": "background-color: {};".format(colour), "href": "{}?tags__id__exact={}".format( reverse("admin:documents_document_changelist"), tag.pk ) } ) return r @mark_safe def document(self, obj): # TODO: is this method even used anymore? return self._html_tag( "a", self._html_tag( "img", src=static("documents/img/{}.png".format(obj.file_type)), width=22, height=22, alt=obj.file_type, title=obj.file_name ), href=obj.download_url ) @staticmethod def _html_tag(kind, inside=None, **kwargs): attributes = format_html_join(' ', '{}="{}"', kwargs.items()) if inside is not None: return format_html("<{kind} {attributes}>{inside}", kind=kind, attributes=attributes, inside=inside) return format_html("<{} {}/>", kind, attributes) class LogAdmin(CommonAdmin): list_display = ("created", "message", "level",) list_filter = ("level", "created",) admin.site.register(Correspondent, CorrespondentAdmin) admin.site.register(Tag, TagAdmin) admin.site.register(Document, DocumentAdmin) admin.site.register(Log, LogAdmin) # Unless we implement multi-user, these default registrations don't make sense. admin.site.unregister(Group) admin.site.unregister(User) ================================================ FILE: src/documents/apps.py ================================================ from django.apps import AppConfig from django.db.models.signals import post_delete class DocumentsConfig(AppConfig): name = "documents" def ready(self): from .signals import document_consumption_started from .signals import document_consumption_finished from .signals.handlers import ( set_correspondent, set_tags, run_pre_consume_script, run_post_consume_script, cleanup_document_deletion, set_log_entry ) document_consumption_started.connect(run_pre_consume_script) document_consumption_finished.connect(set_tags) document_consumption_finished.connect(set_correspondent) document_consumption_finished.connect(set_log_entry) document_consumption_finished.connect(run_post_consume_script) post_delete.connect(cleanup_document_deletion) AppConfig.ready(self) ================================================ FILE: src/documents/checks.py ================================================ import textwrap from django.conf import settings from django.core.checks import Error, register from django.db.utils import OperationalError, ProgrammingError @register() def changed_password_check(app_configs, **kwargs): from documents.models import Document from paperless.db import GnuPG try: encrypted_doc = Document.objects.filter( storage_type=Document.STORAGE_TYPE_GPG).first() except (OperationalError, ProgrammingError): return [] # No documents table yet if encrypted_doc: if not settings.PASSPHRASE: return [Error( "The database contains encrypted documents but no password " "is set." )] if not GnuPG.decrypted(encrypted_doc.source_file): return [Error(textwrap.dedent( """ The current password doesn't match the password of the existing documents. If you intend to change your password, you must first export all of the old documents, start fresh with the new password and then re-import them." """))] return [] ================================================ FILE: src/documents/consumer.py ================================================ from django.db import transaction import datetime import hashlib import logging import os import re import time import uuid from operator import itemgetter from django.conf import settings from django.utils import timezone from paperless.db import GnuPG from .models import Document, FileInfo, Tag from .parsers import ParseError from .signals import ( document_consumer_declaration, document_consumption_finished, document_consumption_started ) class ConsumerError(Exception): pass class Consumer: """ Loop over every file found in CONSUMPTION_DIR and: 1. Convert it to a greyscale pnm 2. Use tesseract on the pnm 3. Store the document in the MEDIA_ROOT with optional encryption 4. Store the OCR'd text in the database 5. Delete the document and image(s) """ # Files are considered ready for consumption if they have been unmodified # for this duration FILES_MIN_UNMODIFIED_DURATION = 0.5 def __init__(self, consume=settings.CONSUMPTION_DIR, scratch=settings.SCRATCH_DIR): self.logger = logging.getLogger(__name__) self.logging_group = None self._ignore = [] self.consume = consume self.scratch = scratch os.makedirs(self.scratch, exist_ok=True) self.storage_type = Document.STORAGE_TYPE_UNENCRYPTED if settings.PASSPHRASE: self.storage_type = Document.STORAGE_TYPE_GPG if not self.consume: raise ConsumerError( "The CONSUMPTION_DIR settings variable does not appear to be " "set." ) if not os.path.exists(self.consume): raise ConsumerError( "Consumption directory {} does not exist".format(self.consume)) self.parsers = [] for response in document_consumer_declaration.send(self): self.parsers.append(response[1]) if not self.parsers: raise ConsumerError( "No parsers could be found, not even the default. " "This is a problem." ) def log(self, level, message): getattr(self.logger, level)(message, extra={ "group": self.logging_group }) def consume_new_files(self): """ Find non-ignored files in consumption dir and consume them if they have been unmodified for FILES_MIN_UNMODIFIED_DURATION. """ ignored_files = [] files = [] for entry in os.scandir(self.consume): if entry.is_file(): file = (entry.path, entry.stat().st_mtime) if file in self._ignore: ignored_files.append(file) else: files.append(file) else: self.logger.warning( "Skipping %s as it is not a file", entry.path ) if not files: return # Set _ignore to only include files that still exist. # This keeps it from growing indefinitely. self._ignore[:] = ignored_files files_old_to_new = sorted(files, key=itemgetter(1)) time.sleep(self.FILES_MIN_UNMODIFIED_DURATION) for file, mtime in files_old_to_new: if mtime == os.path.getmtime(file): # File has not been modified and can be consumed if not self.try_consume_file(file): self._ignore.append((file, mtime)) @transaction.atomic def try_consume_file(self, file): """ Return True if file was consumed """ if not re.match(FileInfo.REGEXES["title"], file): return False doc = file if self._is_duplicate(doc): self.log( "info", "Skipping {} as it appears to be a duplicate".format(doc) ) return False parser_class = self._get_parser_class(doc) if not parser_class: self.log( "error", "No parsers could be found for {}".format(doc)) return False self.logging_group = uuid.uuid4() self.log("info", "Consuming {}".format(doc)) document_consumption_started.send( sender=self.__class__, filename=doc, logging_group=self.logging_group ) parsed_document = parser_class(doc) try: thumbnail = parsed_document.get_optimised_thumbnail() date = parsed_document.get_date() document = self._store( parsed_document.get_text(), doc, thumbnail, date ) except ParseError as e: self.log("error", "PARSE FAILURE for {}: {}".format(doc, e)) parsed_document.cleanup() return False else: parsed_document.cleanup() self._cleanup_doc(doc) self.log( "info", "Document {} consumption finished".format(document) ) document_consumption_finished.send( sender=self.__class__, document=document, logging_group=self.logging_group ) return True def _get_parser_class(self, doc): """ Determine the appropriate parser class based on the file """ options = [] for parser in self.parsers: result = parser(doc) if result: options.append(result) self.log( "info", "Parsers available: {}".format( ", ".join([str(o["parser"].__name__) for o in options]) ) ) if not options: return None # Return the parser with the highest weight. return sorted( options, key=lambda _: _["weight"], reverse=True)[0]["parser"] def _store(self, text, doc, thumbnail, date): file_info = FileInfo.from_path(doc) stats = os.stat(doc) self.log("debug", "Saving record to database") created = file_info.created or date or timezone.make_aware( datetime.datetime.fromtimestamp(stats.st_mtime)) with open(doc, "rb") as f: document = Document.objects.create( correspondent=file_info.correspondent, title=file_info.title, content=text, file_type=file_info.extension, checksum=hashlib.md5(f.read()).hexdigest(), created=created, modified=created, storage_type=self.storage_type ) relevant_tags = set(list(Tag.match_all(text)) + list(file_info.tags)) if relevant_tags: tag_names = ", ".join([t.slug for t in relevant_tags]) self.log("debug", "Tagging with {}".format(tag_names)) document.tags.add(*relevant_tags) # Create directory to store document in document.create_source_directory() # Safe document and thumbnail self._write(document, doc, document.source_path) self._write(document, thumbnail, document.thumbnail_path) document.set_filename(document.source_filename) document.save() self.log("info", "Completed") return document def _write(self, document, source, target): with open(source, "rb") as read_file: with open(target, "wb") as write_file: if document.storage_type == Document.STORAGE_TYPE_UNENCRYPTED: write_file.write(read_file.read()) return self.log("debug", "Encrypting") write_file.write(GnuPG.encrypted(read_file)) def _cleanup_doc(self, doc): self.log("debug", "Deleting document {}".format(doc)) os.unlink(doc) @staticmethod def _is_duplicate(doc): with open(doc, "rb") as f: checksum = hashlib.md5(f.read()).hexdigest() return Document.objects.filter(checksum=checksum).exists() ================================================ FILE: src/documents/filters.py ================================================ from django_filters.rest_framework import BooleanFilter, FilterSet from .models import Correspondent, Document, Tag CHAR_KWARGS = ( "startswith", "endswith", "contains", "istartswith", "iendswith", "icontains" ) class CorrespondentFilterSet(FilterSet): class Meta: model = Correspondent fields = { "name": [ "startswith", "endswith", "contains", "istartswith", "iendswith", "icontains" ], "slug": ["istartswith", "iendswith", "icontains"] } class TagFilterSet(FilterSet): class Meta: model = Tag fields = { "name": [ "startswith", "endswith", "contains", "istartswith", "iendswith", "icontains" ], "slug": ["istartswith", "iendswith", "icontains"] } class DocumentFilterSet(FilterSet): tags_empty = BooleanFilter( label="Is tagged", field_name="tags", lookup_expr="isnull", exclude=True ) class Meta: model = Document fields = { "title": CHAR_KWARGS, "content": ("contains", "icontains"), "correspondent__name": CHAR_KWARGS, "correspondent__slug": CHAR_KWARGS, "tags__name": CHAR_KWARGS, "tags__slug": CHAR_KWARGS, } ================================================ FILE: src/documents/forms.py ================================================ import magic import os from datetime import datetime from time import mktime from django import forms from django.conf import settings from .models import Document, Correspondent class UploadForm(forms.Form): TYPE_LOOKUP = { "application/pdf": Document.TYPE_PDF, "image/png": Document.TYPE_PNG, "image/jpeg": Document.TYPE_JPG, "image/gif": Document.TYPE_GIF, "image/tiff": Document.TYPE_TIF, } correspondent = forms.CharField( max_length=Correspondent._meta.get_field("name").max_length, required=False ) title = forms.CharField( max_length=Document._meta.get_field("title").max_length, required=False ) document = forms.FileField() def __init__(self, *args, **kwargs): forms.Form.__init__(self, *args, **kwargs) self._file_type = None def clean_correspondent(self): """ I suppose it might look cleaner to use .get_or_create() here, but that would also allow someone to fill up the db with bogus correspondents before all validation was met. """ corresp = self.cleaned_data.get("correspondent") if not corresp: return None if not Correspondent.SAFE_REGEX.match(corresp) or " - " in corresp: raise forms.ValidationError( "That correspondent name is suspicious.") return corresp def clean_title(self): title = self.cleaned_data.get("title") if not title: return None if not Correspondent.SAFE_REGEX.match(title) or " - " in title: raise forms.ValidationError("That title is suspicious.") return title def clean_document(self): document = self.cleaned_data.get("document").read() with magic.Magic(flags=magic.MAGIC_MIME_TYPE) as m: file_type = m.id_buffer(document) if file_type not in self.TYPE_LOOKUP: raise forms.ValidationError("The file type is invalid.") self._file_type = self.TYPE_LOOKUP[file_type] return document def save(self): """ Since the consumer already does a lot of work, it's easier just to save to-be-consumed files to the consumption directory rather than have the form do that as well. Think of it as a poor-man's queue server. """ correspondent = self.cleaned_data.get("correspondent") title = self.cleaned_data.get("title") document = self.cleaned_data.get("document") t = int(mktime(datetime.now().timetuple())) file_name = os.path.join( settings.CONSUMPTION_DIR, "{} - {}.{}".format(correspondent, title, self._file_type) ) with open(file_name, "wb") as f: f.write(document) os.utime(file_name, times=(t, t)) ================================================ FILE: src/documents/loggers.py ================================================ import logging class PaperlessLogger(logging.StreamHandler): """ A logger smart enough to know to log some kinds of messages to the database for later retrieval in a pretty interface. """ def emit(self, record): logging.StreamHandler.emit(self, record) # We have to do the import here or Django will barf when it tries to # load this because the apps aren't loaded at that point from .models import Log kwargs = {"message": record.msg, "level": record.levelno} if hasattr(record, "group"): kwargs["group"] = record.group Log.objects.create(**kwargs) ================================================ FILE: src/documents/mail.py ================================================ import datetime import imaplib import logging import os import re import time import uuid from base64 import b64decode from email import policy from email.parser import BytesParser from dateutil import parser from django.conf import settings from .models import Correspondent class MailFetcherError(Exception): pass class InvalidMessageError(MailFetcherError): pass class Loggable(object): def __init__(self, group=None): self.logger = logging.getLogger(__name__) self.logging_group = group or uuid.uuid4() def log(self, level, message): getattr(self.logger, level)(message, extra={ "group": self.logging_group }) class Message(Loggable): """ A crude, but simple email message class. We assume that there's a subject and n attachments, and that we don't care about the message body. """ SECRET = os.getenv("PAPERLESS_EMAIL_SECRET") def __init__(self, data, group=None): """ Cribbed heavily from https://www.ianlewis.org/en/parsing-email-attachments-python """ Loggable.__init__(self, group=group) self.subject = None self.time = None self.attachment = None message = BytesParser(policy=policy.default).parsebytes(data) self.subject = str(message["Subject"]).replace("\r\n", "") self.body = str(message.get_body()) self.check_subject() self.check_body() self._set_time(message) self.log("info", 'Importing email: "{}"'.format(self.subject)) attachments = [] for part in message.walk(): content_disposition = part.get("Content-Disposition") if not content_disposition: continue dispositions = content_disposition.strip().split(";") if len(dispositions) < 2: continue if not dispositions[0].lower() == "attachment" and \ "filename" not in dispositions[1].lower(): continue file_data = part.get_payload() attachments.append(Attachment( b64decode(file_data), content_type=part.get_content_type())) if len(attachments) == 0: raise InvalidMessageError( "There don't appear to be any attachments to this message") if len(attachments) > 1: raise InvalidMessageError( "There's more than one attachment to this message. It cannot " "be indexed automatically." ) self.attachment = attachments[0] def __bool__(self): return bool(self.attachment) def check_subject(self): if self.subject is None: raise InvalidMessageError("Message does not have a subject") if not Correspondent.SAFE_REGEX.match(self.subject): raise InvalidMessageError("Message subject is unsafe: {}".format( self.subject)) def check_body(self): if self.SECRET not in self.body: raise InvalidMessageError("The secret wasn't in the body") def _set_time(self, message): self.time = datetime.datetime.now() message_time = message.get("Date") if message_time: try: self.time = parser.parse(message_time) except (ValueError, AttributeError): pass # We assume that "now" is ok @property def file_name(self): return "{}.{}".format(self.subject, self.attachment.suffix) class Attachment(object): SAFE_SUFFIX_REGEX = re.compile( r"^(application/(pdf))|(image/(png|jpeg|gif|tiff))$") def __init__(self, data, content_type): self.content_type = content_type self.data = data self.suffix = None m = self.SAFE_SUFFIX_REGEX.match(self.content_type) if not m: raise MailFetcherError( "Not-awesome file type: {}".format(self.content_type)) self.suffix = m.group(2) or m.group(4) def read(self): return self.data class MailFetcher(Loggable): def __init__(self, consume=settings.CONSUMPTION_DIR): Loggable.__init__(self) self._connection = None self._host = os.getenv("PAPERLESS_CONSUME_MAIL_HOST") self._port = os.getenv("PAPERLESS_CONSUME_MAIL_PORT") self._username = os.getenv("PAPERLESS_CONSUME_MAIL_USER") self._password = os.getenv("PAPERLESS_CONSUME_MAIL_PASS") self._inbox = os.getenv("PAPERLESS_CONSUME_MAIL_INBOX", "INBOX") self._enabled = bool(self._host) if self._enabled and Message.SECRET is None: raise MailFetcherError("No PAPERLESS_EMAIL_SECRET defined") self.last_checked = time.time() self.consume = consume def pull(self): """ Fetch all available mail at the target address and store it locally in the consumption directory so that the file consumer can pick it up and do its thing. """ if self._enabled: # Reset the grouping id for each fetch self.logging_group = uuid.uuid4() self.log("debug", "Checking mail") for message in self._get_messages(): self.log("info", 'Storing email: "{}"'.format(message.subject)) t = int(time.mktime(message.time.timetuple())) file_name = os.path.join(self.consume, message.file_name) with open(file_name, "wb") as f: f.write(message.attachment.data) os.utime(file_name, times=(t, t)) self.last_checked = time.time() def _get_messages(self): r = [] try: self._connect() self._login() for message in self._fetch(): if message: r.append(message) self._connection.expunge() self._connection.close() self._connection.logout() except MailFetcherError as e: self.log("error", str(e)) return r def _connect(self): try: self._connection = imaplib.IMAP4_SSL(self._host, self._port) except OSError as e: msg = "Problem connecting to {}: {}".format(self._host, e.strerror) raise MailFetcherError(msg) def _login(self): login = self._connection.login(self._username, self._password) if not login[0] == "OK": raise MailFetcherError("Can't log into mail: {}".format(login[1])) inbox = self._connection.select(self._inbox) if not inbox[0] == "OK": raise MailFetcherError("Can't find the inbox: {}".format(inbox[1])) def _fetch(self): for num in self._connection.search(None, "ALL")[1][0].split(): __, data = self._connection.fetch(num, "(RFC822)") message = None try: message = Message(data[0][1], self.logging_group) except InvalidMessageError as e: self.log("error", str(e)) else: self._connection.store(num, "+FLAGS", "\\Deleted") if message: yield message ================================================ FILE: src/documents/management/__init__.py ================================================ ================================================ FILE: src/documents/management/commands/__init__.py ================================================ ================================================ FILE: src/documents/management/commands/change_storage_type.py ================================================ import os from django.conf import settings from django.core.management.base import BaseCommand, CommandError from termcolor import colored as coloured from documents.models import Document from paperless.db import GnuPG class Command(BaseCommand): help = ( "This is how you migrate your stored documents from an encrypted " "state to an unencrypted one (or vice-versa)" ) def add_arguments(self, parser): parser.add_argument( "from", choices=("gpg", "unencrypted"), help="The state you want to change your documents from" ) parser.add_argument( "to", choices=("gpg", "unencrypted"), help="The state you want to change your documents to" ) parser.add_argument( "--passphrase", help="If PAPERLESS_PASSPHRASE isn't set already, you need to " "specify it here" ) def handle(self, *args, **options): try: print(coloured( "\n\nWARNING: This script is going to work directly on your " "document originals, so\nWARNING: you probably shouldn't run " "this unless you've got a recent backup\nWARNING: handy. It " "*should* work without a hitch, but be safe and backup your\n" "WARNING: stuff first.\n\nHit Ctrl+C to exit now, or Enter to " "continue.\n\n", "yellow", attrs=("bold",) )) __ = input() except KeyboardInterrupt: return if options["from"] == options["to"]: raise CommandError( 'The "from" and "to" values can\'t be the same.' ) passphrase = options["passphrase"] or settings.PASSPHRASE if not passphrase: raise CommandError( "Passphrase not defined. Please set it with --passphrase or " "by declaring it in your environment or your config." ) if options["from"] == "gpg" and options["to"] == "unencrypted": self.__gpg_to_unencrypted(passphrase) elif options["from"] == "unencrypted" and options["to"] == "gpg": self.__unencrypted_to_gpg(passphrase) @staticmethod def __gpg_to_unencrypted(passphrase): encrypted_files = Document.objects.filter( storage_type=Document.STORAGE_TYPE_GPG) for document in encrypted_files: print(coloured("Decrypting {}".format( document).encode('utf-8'), "green")) old_paths = [document.source_path, document.thumbnail_path] raw_document = GnuPG.decrypted(document.source_file, passphrase) raw_thumb = GnuPG.decrypted(document.thumbnail_file, passphrase) document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED with open(document.source_path, "wb") as f: f.write(raw_document) with open(document.thumbnail_path, "wb") as f: f.write(raw_thumb) document.save(update_fields=("storage_type",)) for path in old_paths: os.unlink(path) @staticmethod def __unencrypted_to_gpg(passphrase): unencrypted_files = Document.objects.filter( storage_type=Document.STORAGE_TYPE_UNENCRYPTED) for document in unencrypted_files: print(coloured("Encrypting {}".format(document), "green")) old_paths = [document.source_path, document.thumbnail_path] with open(document.source_path, "rb") as raw_document: with open(document.thumbnail_path, "rb") as raw_thumb: document.storage_type = Document.STORAGE_TYPE_GPG with open(document.source_path, "wb") as f: f.write(GnuPG.encrypted(raw_document, passphrase)) with open(document.thumbnail_path, "wb") as f: f.write(GnuPG.encrypted(raw_thumb, passphrase)) document.save(update_fields=("storage_type",)) for path in old_paths: os.unlink(path) ================================================ FILE: src/documents/management/commands/document_consumer.py ================================================ import logging import os import time from django.conf import settings from django.core.management.base import BaseCommand, CommandError from ...consumer import Consumer, ConsumerError from ...mail import MailFetcher, MailFetcherError try: from inotify_simple import INotify, flags except ImportError: INotify = flags = None class Command(BaseCommand): """ On every iteration of an infinite loop, consume what we can from the consumption directory, and fetch any mail available. """ ORIGINAL_DOCS = os.path.join(settings.MEDIA_ROOT, "documents", "originals") THUMB_DOCS = os.path.join(settings.MEDIA_ROOT, "documents", "thumbnails") def __init__(self, *args, **kwargs): self.verbosity = 0 self.logger = logging.getLogger(__name__) self.file_consumer = None self.mail_fetcher = None self.first_iteration = True BaseCommand.__init__(self, *args, **kwargs) def add_arguments(self, parser): parser.add_argument( "directory", default=settings.CONSUMPTION_DIR, nargs="?", help="The consumption directory." ) parser.add_argument( "--loop-time", default=settings.CONSUMER_LOOP_TIME, type=int, help="Wait time between each loop (in seconds)." ) parser.add_argument( "--mail-delta", default=10, type=int, help="Wait time between each mail fetch (in minutes)." ) parser.add_argument( "--oneshot", action="store_true", help="Run only once." ) parser.add_argument( "--no-inotify", action="store_true", help="Don't use inotify, even if it's available.", default=False ) def handle(self, *args, **options): self.verbosity = options["verbosity"] directory = options["directory"] loop_time = options["loop_time"] mail_delta = options["mail_delta"] * 60 use_inotify = INotify is not None and options["no_inotify"] is False try: self.file_consumer = Consumer(consume=directory) self.mail_fetcher = MailFetcher(consume=directory) except (ConsumerError, MailFetcherError) as e: raise CommandError(e) for d in (self.ORIGINAL_DOCS, self.THUMB_DOCS): os.makedirs(d, exist_ok=True) logging.getLogger(__name__).info( "Starting document consumer at {}{}".format( directory, " with inotify" if use_inotify else "" ) ) if options["oneshot"]: self.loop_step(mail_delta) else: try: if use_inotify: self.loop_inotify(mail_delta) else: self.loop(loop_time, mail_delta) except KeyboardInterrupt: print("Exiting") def loop(self, loop_time, mail_delta): while True: start_time = time.time() if self.verbosity > 1: print(".", int(start_time)) self.loop_step(mail_delta, start_time) # Sleep until the start of the next loop step time.sleep(max(0, start_time + loop_time - time.time())) def loop_step(self, mail_delta, time_now=None): # Occasionally fetch mail and store it to be consumed on the next loop # We fetch email when we first start up so that it is not necessary to # wait for 10 minutes after making changes to the config file. next_mail_time = self.mail_fetcher.last_checked + mail_delta if self.first_iteration or time_now > next_mail_time: self.first_iteration = False self.mail_fetcher.pull() self.file_consumer.consume_new_files() def loop_inotify(self, mail_delta): directory = self.file_consumer.consume inotify = INotify() inotify.add_watch(directory, flags.CLOSE_WRITE | flags.MOVED_TO) # Run initial mail fetch and consume all currently existing documents self.loop_step(mail_delta) next_mail_time = self.mail_fetcher.last_checked + mail_delta while True: # Consume documents until next_mail_time while True: delta = next_mail_time - time.time() if delta > 0: for event in inotify.read(timeout=delta): file = os.path.join(directory, event.name) if os.path.isfile(file): self.file_consumer.try_consume_file(file) else: self.logger.warning( "Skipping %s as it is not a file", file ) else: break self.mail_fetcher.pull() next_mail_time = self.mail_fetcher.last_checked + mail_delta ================================================ FILE: src/documents/management/commands/document_correspondents.py ================================================ import sys from django.core.management.base import BaseCommand from documents.models import Correspondent, Document from ...mixins import Renderable class Command(Renderable, BaseCommand): help = """ Using the current set of correspondent rules, apply said rules to all documents in the database, effectively allowing you to back-tag all previously indexed documents with correspondent created (or modified) after their initial import. """.replace(" ", "") TOO_MANY_CONTINUE = ( "Detected {} potential correspondents for {}, so we've opted for {}") TOO_MANY_SKIP = ( "Detected {} potential correspondents for {}, so we're skipping it") CHANGE_MESSAGE = ( 'Document {}: "{}" was given the correspondent id {}: "{}"') def __init__(self, *args, **kwargs): self.verbosity = 0 BaseCommand.__init__(self, *args, **kwargs) def add_arguments(self, parser): parser.add_argument( "--use-first", default=False, action="store_true", help="By default this command won't try to assign a correspondent " "if more than one matches the document. Use this flag if " "you'd rather it just pick the first one it finds." ) def handle(self, *args, **options): self.verbosity = options["verbosity"] for document in Document.objects.filter(correspondent__isnull=True): potential_correspondents = list( Correspondent.match_all(document.content)) if not potential_correspondents: continue potential_count = len(potential_correspondents) correspondent = potential_correspondents[0] if potential_count > 1: if not options["use_first"]: print( self.TOO_MANY_SKIP.format(potential_count, document), file=sys.stderr ) continue print( self.TOO_MANY_CONTINUE.format( potential_count, document, correspondent ), file=sys.stderr ) document.correspondent = correspondent document.save(update_fields=("correspondent",)) print( self.CHANGE_MESSAGE.format( document.pk, document.title, correspondent.pk, correspondent.name ), file=sys.stderr ) ================================================ FILE: src/documents/management/commands/document_exporter.py ================================================ import json import os import time import shutil from django.core.management.base import BaseCommand, CommandError from django.core import serializers from documents.models import Document, Correspondent, Tag from paperless.db import GnuPG from ...mixins import Renderable from documents.settings import EXPORTER_FILE_NAME, EXPORTER_THUMBNAIL_NAME class Command(Renderable, BaseCommand): help = """ Decrypt and rename all files in our collection into a given target directory. And include a manifest file containing document data for easy import. """.replace(" ", "") def add_arguments(self, parser): parser.add_argument("target") parser.add_argument( "--legacy", action="store_true", help="Don't try to export all of the document data, just dump the " "original document files out in a format that makes " "re-consuming them easy." ) def __init__(self, *args, **kwargs): BaseCommand.__init__(self, *args, **kwargs) self.target = None def handle(self, *args, **options): self.target = options["target"] if not os.path.exists(self.target): raise CommandError("That path doesn't exist") if not os.access(self.target, os.W_OK): raise CommandError("That path doesn't appear to be writable") if options["legacy"]: self.dump_legacy() else: self.dump() def dump(self): documents = Document.objects.all() document_map = {d.pk: d for d in documents} manifest = json.loads(serializers.serialize("json", documents)) for index, document_dict in enumerate(manifest): # Force output to unencrypted as that will be the current state. # The importer will make the decision to encrypt or not. manifest[index]["fields"]["storage_type"] = Document.STORAGE_TYPE_UNENCRYPTED # NOQA: E501 document = document_map[document_dict["pk"]] file_target = os.path.join(self.target, document.file_name) thumbnail_name = document.file_name + "-thumbnail.png" thumbnail_target = os.path.join(self.target, thumbnail_name) document_dict[EXPORTER_FILE_NAME] = document.file_name document_dict[EXPORTER_THUMBNAIL_NAME] = thumbnail_name print("Exporting: {}".format(file_target)) t = int(time.mktime(document.created.timetuple())) if document.storage_type == Document.STORAGE_TYPE_GPG: with open(file_target, "wb") as f: f.write(GnuPG.decrypted(document.source_file)) os.utime(file_target, times=(t, t)) with open(thumbnail_target, "wb") as f: f.write(GnuPG.decrypted(document.thumbnail_file)) os.utime(thumbnail_target, times=(t, t)) else: shutil.copy(document.source_path, file_target) shutil.copy(document.thumbnail_path, thumbnail_target) manifest += json.loads( serializers.serialize("json", Correspondent.objects.all())) manifest += json.loads(serializers.serialize( "json", Tag.objects.all())) with open(os.path.join(self.target, "manifest.json"), "w") as f: json.dump(manifest, f, indent=2) def dump_legacy(self): for document in Document.objects.all(): target = os.path.join( self.target, self._get_legacy_file_name(document)) print("Exporting: {}".format(target)) with open(target, "wb") as f: f.write(GnuPG.decrypted(document.source_file)) t = int(time.mktime(document.created.timetuple())) os.utime(target, times=(t, t)) @staticmethod def _get_legacy_file_name(doc): if not doc.correspondent and not doc.title: return os.path.basename(doc.source_path) created = doc.created.strftime("%Y%m%d%H%M%SZ") tags = ",".join([t.slug for t in doc.tags.all()]) if tags: return "{} - {} - {} - {}.{}".format( created, doc.correspondent, doc.title, tags, doc.file_type) return "{} - {} - {}.{}".format( created, doc.correspondent, doc.title, doc.file_type) ================================================ FILE: src/documents/management/commands/document_importer.py ================================================ import json import os import shutil from django.conf import settings from django.core.management.base import BaseCommand, CommandError from django.core.management import call_command from documents.models import Document from paperless.db import GnuPG from ...mixins import Renderable from documents.settings import EXPORTER_FILE_NAME, EXPORTER_THUMBNAIL_NAME class Command(Renderable, BaseCommand): help = """ Using a manifest.json file, load the data from there, and import the documents it refers to. """.replace(" ", "") def add_arguments(self, parser): parser.add_argument("source") def __init__(self, *args, **kwargs): BaseCommand.__init__(self, *args, **kwargs) self.source = None self.manifest = None def handle(self, *args, **options): self.source = options["source"] if not os.path.exists(self.source): raise CommandError("That path doesn't exist") if not os.access(self.source, os.R_OK): raise CommandError("That path doesn't appear to be readable") manifest_path = os.path.join(self.source, "manifest.json") self._check_manifest_exists(manifest_path) with open(manifest_path) as f: self.manifest = json.load(f) self._check_manifest() # Fill up the database with whatever is in the manifest call_command("loaddata", manifest_path) self._import_files_from_manifest() @staticmethod def _check_manifest_exists(path): if not os.path.exists(path): raise CommandError( "That directory doesn't appear to contain a manifest.json " "file." ) def _check_manifest(self): for record in self.manifest: if not record["model"] == "documents.document": continue if EXPORTER_FILE_NAME not in record: raise CommandError( 'The manifest file contains a record which does not ' 'refer to an actual document file.' ) doc_file = record[EXPORTER_FILE_NAME] if not os.path.exists(os.path.join(self.source, doc_file)): raise CommandError( 'The manifest file refers to "{}" which does not ' 'appear to be in the source directory.'.format(doc_file) ) def _import_files_from_manifest(self): for record in self.manifest: if not record["model"] == "documents.document": continue doc_file = record[EXPORTER_FILE_NAME] thumb_file = record[EXPORTER_THUMBNAIL_NAME] document = Document.objects.get(pk=record["pk"]) document_path = os.path.join(self.source, doc_file) thumbnail_path = os.path.join(self.source, thumb_file) if settings.PASSPHRASE: with open(document_path, "rb") as unencrypted: with open(document.source_path, "wb") as encrypted: print("Encrypting {} and saving it to {}".format( doc_file, document.source_path)) encrypted.write(GnuPG.encrypted(unencrypted)) with open(thumbnail_path, "rb") as unencrypted: with open(document.thumbnail_path, "wb") as encrypted: print("Encrypting {} and saving it to {}".format( thumb_file, document.thumbnail_path)) encrypted.write(GnuPG.encrypted(unencrypted)) else: shutil.copy(document_path, document.source_path) shutil.copy(thumbnail_path, document.thumbnail_path) # Reset the storage type to whatever we've used while importing storage_type = Document.STORAGE_TYPE_UNENCRYPTED if settings.PASSPHRASE: storage_type = Document.STORAGE_TYPE_GPG Document.objects.filter( pk__in=[r["pk"] for r in self.manifest] ).update( storage_type=storage_type ) ================================================ FILE: src/documents/management/commands/document_logs.py ================================================ from django.core.management.base import BaseCommand from documents.models import Log class Command(BaseCommand): help = "A quick & dirty way to see what's in the logs" def handle(self, *args, **options): for l in Log.objects.order_by("pk"): print(l) ================================================ FILE: src/documents/management/commands/document_renamer.py ================================================ from django.core.management.base import BaseCommand from documents.models import Document, Tag from ...mixins import Renderable class Command(Renderable, BaseCommand): help = """ This will rename all documents to match the latest filename format. """.replace(" ", "") def __init__(self, *args, **kwargs): self.verbosity = 0 BaseCommand.__init__(self, *args, **kwargs) def handle(self, *args, **options): self.verbosity = options["verbosity"] for document in Document.objects.all(): # Saving the document again will generate a new filename and rename document.save() ================================================ FILE: src/documents/management/commands/document_retagger.py ================================================ from django.core.management.base import BaseCommand from documents.models import Document, Tag from ...mixins import Renderable class Command(Renderable, BaseCommand): help = """ Using the current set of tagging rules, apply said rules to all documents in the database, effectively allowing you to back-tag all previously indexed documents with tags created (or modified) after their initial import. """.replace(" ", "") def __init__(self, *args, **kwargs): self.verbosity = 0 BaseCommand.__init__(self, *args, **kwargs) def handle(self, *args, **options): self.verbosity = options["verbosity"] for document in Document.objects.all(): tags = Tag.objects.exclude( pk__in=document.tags.values_list("pk", flat=True)) for tag in Tag.match_all(document.content, tags): print('Tagging {} with "{}"'.format(document, tag)) document.tags.add(tag) ================================================ FILE: src/documents/management/commands/loaddata_stdin.py ================================================ import sys from django.core.management.commands.loaddata import Command as LoadDataCommand class Command(LoadDataCommand): """ Allow the loading of data from standard in. Sourced originally from: https://gist.github.com/bmispelon/ad5a2c333443b3a1d051 (MIT licensed) """ def parse_name(self, fixture_name): self.compression_formats['stdin'] = (lambda x, y: sys.stdin, None) if fixture_name == '-': return '-', 'json', 'stdin' def find_fixtures(self, fixture_label): if fixture_label == '-': return [('-', None, '-')] return super(Command, self).find_fixtures(fixture_label) ================================================ FILE: src/documents/managers.py ================================================ from django.conf import settings from django.db import models from django.db.models.aggregates import Max class GroupConcat(models.Aggregate): """ Theoretically, this should work in Sqlite, PostgreSQL, and MySQL, but I've only ever tested it in Sqlite. """ ENGINE_SQLITE = 1 ENGINE_POSTGRESQL = 2 ENGINE_MYSQL = 3 ENGINES = { "django.db.backends.sqlite3": ENGINE_SQLITE, "django.db.backends.postgresql_psycopg2": ENGINE_POSTGRESQL, "django.db.backends.postgresql": ENGINE_POSTGRESQL, "django.db.backends.mysql": ENGINE_MYSQL } def __init__(self, expression, separator="\n", **extra): self.engine = self._get_engine() self.function = self._get_function() self.template = self._get_template(separator) models.Aggregate.__init__( self, expression, output_field=models.CharField(), **extra ) def _get_engine(self): engine = settings.DATABASES["default"]["ENGINE"] try: return self.ENGINES[engine] except KeyError: raise NotImplementedError( "There's currently no support for {} when it comes to group " "concatenation in Paperless".format(engine) ) def _get_function(self): if self.engine == self.ENGINE_POSTGRESQL: return "STRING_AGG" return "GROUP_CONCAT" def _get_template(self, separator): if self.engine == self.ENGINE_MYSQL: return "%(function)s(%(expressions)s SEPARATOR '{}')".format( separator) return "%(function)s(%(expressions)s, '{}')".format(separator) class LogQuerySet(models.query.QuerySet): def by_group(self): return self.values("group").annotate( time=Max("modified"), messages=GroupConcat("message"), ).order_by("-time") class LogManager(models.Manager): def get_queryset(self): return LogQuerySet(self.model, using=self._db) ================================================ FILE: src/documents/migrations/0001_initial.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9 on 2015-12-20 19:10 from __future__ import unicode_literals from django.db import migrations, models from django.conf import settings class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='Document', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('sender', models.CharField(blank=True, db_index=True, max_length=128)), ('title', models.CharField(blank=True, db_index=True, max_length=128)), ('content', models.TextField(db_index=("mysql" not in settings.DATABASES["default"]["ENGINE"]))), ('created', models.DateTimeField(auto_now_add=True)), ('modified', models.DateTimeField(auto_now=True)), ], ), ] ================================================ FILE: src/documents/migrations/0002_auto_20151226_1316.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9 on 2015-12-26 13:16 from __future__ import unicode_literals from django.db import migrations, models import django.utils.timezone class Migration(migrations.Migration): dependencies = [ ('documents', '0001_initial'), ] operations = [ migrations.AlterModelOptions( name='document', options={'ordering': ('sender', 'title')}, ), migrations.AlterField( model_name='document', name='created', field=models.DateTimeField(default=django.utils.timezone.now, editable=False), ), ] ================================================ FILE: src/documents/migrations/0003_sender.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9 on 2016-01-11 12:21 from __future__ import unicode_literals from django.db import migrations, models from django.template.defaultfilters import slugify import django.db.models.deletion DOCUMENT_SENDER_MAP = {} def move_sender_strings_to_sender_model(apps, schema_editor): sender_model = apps.get_model("documents", "Sender") document_model = apps.get_model("documents", "Document") # Create the sender and log the relationship with the document for document in document_model.objects.all(): if document.sender: DOCUMENT_SENDER_MAP[document.pk], created = sender_model.objects.get_or_create( name=document.sender, defaults={"slug": slugify(document.sender)} ) def realign_senders(apps, schema_editor): document_model = apps.get_model("documents", "Document") for pk, sender in DOCUMENT_SENDER_MAP.items(): document_model.objects.filter(pk=pk).update(sender=sender) class Migration(migrations.Migration): dependencies = [ ('documents', '0002_auto_20151226_1316'), ] operations = [ migrations.CreateModel( name='Sender', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=128, unique=True)), ('slug', models.SlugField()), ], ), migrations.RunPython(move_sender_strings_to_sender_model), migrations.RemoveField( model_name='document', name='sender', ), migrations.AddField( model_name='document', name='sender', field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='documents.Sender'), ), migrations.RunPython(realign_senders), ] ================================================ FILE: src/documents/migrations/0004_auto_20160114_1844.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9 on 2016-01-14 18:44 from __future__ import unicode_literals from django.db import migrations, models import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ ('documents', '0003_sender'), ] operations = [ migrations.AlterField( model_name='document', name='sender', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='documents', to='documents.Sender'), ), ] ================================================ FILE: src/documents/migrations/0005_auto_20160123_0313.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9 on 2016-01-23 03:13 from __future__ import unicode_literals from django.db import migrations class Migration(migrations.Migration): dependencies = [ ('documents', '0004_auto_20160114_1844'), ] operations = [ migrations.AlterModelOptions( name='sender', options={'ordering': ('name',)}, ), ] ================================================ FILE: src/documents/migrations/0006_auto_20160123_0430.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9 on 2016-01-23 04:30 from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('documents', '0005_auto_20160123_0313'), ] operations = [ migrations.CreateModel( name='Tag', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=128, unique=True)), ('slug', models.SlugField(blank=True)), ('colour', models.PositiveIntegerField(choices=[(1, '#a6cee3'), (2, '#1f78b4'), (3, '#b2df8a'), (4, '#33a02c'), (5, '#fb9a99'), (6, '#e31a1c'), (7, '#fdbf6f'), (8, '#ff7f00'), (9, '#cab2d6'), (10, '#6a3d9a'), (11, '#ffff99'), (12, '#b15928'), (13, '#000000'), (14, '#cccccc')], default=1)), ], options={ 'abstract': False, }, ), migrations.AlterField( model_name='sender', name='slug', field=models.SlugField(blank=True), ), migrations.AddField( model_name='document', name='tags', field=models.ManyToManyField(related_name='documents', to='documents.Tag'), ), ] ================================================ FILE: src/documents/migrations/0007_auto_20160126_2114.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9 on 2016-01-26 21:14 from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('documents', '0006_auto_20160123_0430'), ] operations = [ migrations.AddField( model_name='tag', name='match', field=models.CharField(blank=True, max_length=256), ), migrations.AddField( model_name='tag', name='matching_algorithm', field=models.PositiveIntegerField(blank=True, choices=[(1, 'Any'), (2, 'All'), (3, 'Literal'), (4, 'Regular Expression')], help_text='Which algorithm you want to use when matching text to the OCR\'d PDF. Here, "any" looks for any occurrence of any word provided in the PDF, while "all" requires that every word provided appear in the PDF, albeit not in the order provided. A "literal" match means that the text you enter must appear in the PDF exactly as you\'ve entered it, and "regular expression" uses a regex to match the PDF. If you don\'t know what a regex is, you probably don\'t want this option.', null=True), ), migrations.AlterField( model_name='tag', name='colour', field=models.PositiveIntegerField(choices=[(1, '#a6cee3'), (2, '#1f78b4'), (3, '#b2df8a'), (4, '#33a02c'), (5, '#fb9a99'), (6, '#e31a1c'), (7, '#fdbf6f'), (8, '#ff7f00'), (9, '#cab2d6'), (10, '#6a3d9a'), (11, '#b15928'), (12, '#000000'), (13, '#cccccc')], default=1), ), ] ================================================ FILE: src/documents/migrations/0008_document_file_type.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9 on 2016-01-29 22:58 from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('documents', '0007_auto_20160126_2114'), ] operations = [ migrations.AddField( model_name='document', name='file_type', field=models.CharField(choices=[('pdf', 'PDF'), ('png', 'PNG'), ('jpg', 'JPG'), ('gif', 'GIF'), ('tiff', 'TIFF')], default='pdf', editable=False, max_length=4), preserve_default=False, ), migrations.AlterField( model_name='document', name='tags', field=models.ManyToManyField(blank=True, related_name='documents', to='documents.Tag'), ), ] ================================================ FILE: src/documents/migrations/0009_auto_20160214_0040.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9 on 2016-02-14 00:40 from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('documents', '0008_document_file_type'), ] operations = [ migrations.AlterField( model_name='tag', name='matching_algorithm', field=models.PositiveIntegerField(choices=[(1, 'Any'), (2, 'All'), (3, 'Literal'), (4, 'Regular Expression')], default=1, help_text='Which algorithm you want to use when matching text to the OCR\'d PDF. Here, "any" looks for any occurrence of any word provided in the PDF, while "all" requires that every word provided appear in the PDF, albeit not in the order provided. A "literal" match means that the text you enter must appear in the PDF exactly as you\'ve entered it, and "regular expression" uses a regex to match the PDF. If you don\'t know what a regex is, you probably don\'t want this option.'), ), ] ================================================ FILE: src/documents/migrations/0010_log.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9 on 2016-02-27 17:54 from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('documents', '0009_auto_20160214_0040'), ] operations = [ migrations.CreateModel( name='Log', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('group', models.UUIDField(blank=True)), ('message', models.TextField()), ('level', models.PositiveIntegerField(choices=[(10, 'Debugging'), (20, 'Informational'), (30, 'Warning'), (40, 'Error'), (50, 'Critical')], default=20)), ('component', models.PositiveIntegerField(choices=[(1, 'Consumer'), (2, 'Mail Fetcher')])), ('created', models.DateTimeField(auto_now_add=True)), ('modified', models.DateTimeField(auto_now=True)), ], options={ 'ordering': ('-modified',), }, ), ] ================================================ FILE: src/documents/migrations/0011_auto_20160303_1929.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9.2 on 2016-03-03 19:29 from __future__ import unicode_literals from django.db import migrations class Migration(migrations.Migration): atomic = False dependencies = [ ('documents', '0010_log'), ] operations = [ migrations.RenameModel( old_name='Sender', new_name='Correspondent', ), migrations.AlterModelOptions( name='document', options={'ordering': ('correspondent', 'title')}, ), migrations.RenameField( model_name='document', old_name='sender', new_name='correspondent', ), ] ================================================ FILE: src/documents/migrations/0012_auto_20160305_0040.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9.2 on 2016-03-05 00:40 from __future__ import unicode_literals import gnupg import os import re import shutil import subprocess import tempfile from django.conf import settings from django.db import migrations from django.utils.termcolors import colorize as colourise # Spelling hurts me class GnuPG(object): """ A handy singleton to use when handling encrypted files. """ gpg = gnupg.GPG(gnupghome=settings.GNUPG_HOME) @classmethod def decrypted(cls, file_handle): return cls.gpg.decrypt_file( file_handle, passphrase=settings.PASSPHRASE).data @classmethod def encrypted(cls, file_handle): return cls.gpg.encrypt_file( file_handle, recipients=None, passphrase=settings.PASSPHRASE, symmetric=True ).data def move_documents_and_create_thumbnails(apps, schema_editor): os.makedirs(os.path.join(settings.MEDIA_ROOT, "documents", "originals"), exist_ok=True) os.makedirs(os.path.join(settings.MEDIA_ROOT, "documents", "thumbnails"), exist_ok=True) documents = os.listdir(os.path.join(settings.MEDIA_ROOT, "documents")) if set(documents) == {"originals", "thumbnails"}: return print(colourise( "\n\n" " This is a one-time only migration to generate thumbnails for all of your\n" " documents so that future UIs will have something to work with. If you have\n" " a lot of documents though, this may take a while, so a coffee break may be\n" " in order." "\n", opts=("bold",) )) try: os.makedirs(settings.SCRATCH_DIR) except FileExistsError: pass for f in sorted(documents): if not f.endswith("gpg"): continue print(" {} {} {}".format( colourise("*", fg="green"), colourise("Generating a thumbnail for", fg="white"), colourise(f, fg="cyan") )) thumb_temp = tempfile.mkdtemp( prefix="paperless", dir=settings.SCRATCH_DIR) orig_temp = tempfile.mkdtemp( prefix="paperless", dir=settings.SCRATCH_DIR) orig_source = os.path.join(settings.MEDIA_ROOT, "documents", f) orig_target = os.path.join(orig_temp, f.replace(".gpg", "")) with open(orig_source, "rb") as encrypted: with open(orig_target, "wb") as unencrypted: unencrypted.write(GnuPG.decrypted(encrypted)) subprocess.Popen(( settings.CONVERT_BINARY, "-scale", "500x5000", "-alpha", "remove", orig_target, os.path.join(thumb_temp, "convert-%04d.png") )).wait() thumb_source = os.path.join(thumb_temp, "convert-0000.png") thumb_target = os.path.join( settings.MEDIA_ROOT, "documents", "thumbnails", re.sub(r"(\d+)\.\w+(\.gpg)", "\\1.png\\2", f) ) with open(thumb_source, "rb") as unencrypted: with open(thumb_target, "wb") as encrypted: encrypted.write(GnuPG.encrypted(unencrypted)) shutil.rmtree(thumb_temp) shutil.rmtree(orig_temp) shutil.move( os.path.join(settings.MEDIA_ROOT, "documents", f), os.path.join(settings.MEDIA_ROOT, "documents", "originals", f), ) class Migration(migrations.Migration): dependencies = [ ('documents', '0011_auto_20160303_1929'), ] operations = [ migrations.RunPython(move_documents_and_create_thumbnails), ] ================================================ FILE: src/documents/migrations/0013_auto_20160325_2111.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9.4 on 2016-03-25 21:11 from __future__ import unicode_literals from django.db import migrations, models import django.utils.timezone class Migration(migrations.Migration): dependencies = [ ('documents', '0012_auto_20160305_0040'), ] operations = [ migrations.AddField( model_name='correspondent', name='match', field=models.CharField(blank=True, max_length=256), ), migrations.AddField( model_name='correspondent', name='matching_algorithm', field=models.PositiveIntegerField(choices=[(1, 'Any'), (2, 'All'), (3, 'Literal'), (4, 'Regular Expression')], default=1, help_text='Which algorithm you want to use when matching text to the OCR\'d PDF. Here, "any" looks for any occurrence of any word provided in the PDF, while "all" requires that every word provided appear in the PDF, albeit not in the order provided. A "literal" match means that the text you enter must appear in the PDF exactly as you\'ve entered it, and "regular expression" uses a regex to match the PDF. If you don\'t know what a regex is, you probably don\'t want this option.'), ), migrations.AlterField( model_name='document', name='created', field=models.DateTimeField(default=django.utils.timezone.now), ), migrations.RemoveField( model_name='log', name='component', ), ] ================================================ FILE: src/documents/migrations/0014_document_checksum.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9.4 on 2016-03-28 19:09 from __future__ import unicode_literals import gnupg import hashlib import os import django.utils.timezone from django.conf import settings from django.db import migrations, models from django.template.defaultfilters import slugify from django.utils.termcolors import colorize as colourise # Spelling hurts me class GnuPG(object): """ A handy singleton to use when handling encrypted files. """ gpg = gnupg.GPG(gnupghome=settings.GNUPG_HOME) @classmethod def decrypted(cls, file_handle): return cls.gpg.decrypt_file( file_handle, passphrase=settings.PASSPHRASE).data @classmethod def encrypted(cls, file_handle): return cls.gpg.encrypt_file( file_handle, recipients=None, passphrase=settings.PASSPHRASE, symmetric=True ).data class Document(object): """ Django's migrations restrict access to model methods, so this is a snapshot of the methods that existed at the time this migration was written, since we need to make use of a lot of these shortcuts here. """ def __init__(self, doc): self.pk = doc.pk self.correspondent = doc.correspondent self.title = doc.title self.file_type = doc.file_type self.tags = doc.tags self.created = doc.created def __str__(self): created = self.created.strftime("%Y%m%d%H%M%S") if self.correspondent and self.title: return "{}: {} - {}".format( created, self.correspondent, self.title) if self.correspondent or self.title: return "{}: {}".format(created, self.correspondent or self.title) return str(created) @property def source_path(self): return os.path.join( settings.MEDIA_ROOT, "documents", "originals", "{:07}.{}.gpg".format(self.pk, self.file_type) ) @property def source_file(self): return open(self.source_path, "rb") @property def file_name(self): return slugify(str(self)) + "." + self.file_type def set_checksums(apps, schema_editor): document_model = apps.get_model("documents", "Document") if not document_model.objects.all().exists(): return print(colourise( "\n\n" " This is a one-time only migration to generate checksums for all\n" " of your existing documents. If you have a lot of documents\n" " though, this may take a while, so a coffee break may be in\n" " order." "\n", opts=("bold",) )) sums = {} for d in document_model.objects.all(): document = Document(d) print(" {} {} {}".format( colourise("*", fg="green"), colourise("Generating a checksum for", fg="white"), colourise(document.file_name, fg="cyan") )) with document.source_file as encrypted: checksum = hashlib.md5(GnuPG.decrypted(encrypted)).hexdigest() if checksum in sums: error = "\n{line}{p1}\n\n{doc1}\n{doc2}\n\n{p2}\n\n{code}\n\n{p3}{line}".format( p1=colourise("It appears that you have two identical documents in your collection and \nPaperless no longer supports this (see issue #97). The documents in question\nare:", fg="yellow"), p2=colourise("To fix this problem, you'll have to remove one of them from the database, a task\nmost easily done by running the following command in the same\ndirectory as manage.py:", fg="yellow"), p3=colourise("When that's finished, re-run the migrate, and provided that there aren't any\nother duplicates, you should be good to go.", fg="yellow"), doc1=colourise(" * {} (id: {})".format(sums[checksum][1], sums[checksum][0]), fg="red"), doc2=colourise(" * {} (id: {})".format(document.file_name, document.pk), fg="red"), code=colourise(" $ echo 'DELETE FROM documents_document WHERE id = {pk};' | ./manage.py dbshell".format(pk=document.pk), fg="green"), line=colourise("\n{}\n".format("=" * 80), fg="white", opts=("bold",)) ) raise RuntimeError(error) sums[checksum] = (document.pk, document.file_name) document_model.objects.filter(pk=document.pk).update(checksum=checksum) def do_nothing(apps, schema_editor): pass class Migration(migrations.Migration): dependencies = [ ('documents', '0013_auto_20160325_2111'), ] operations = [ migrations.AddField( model_name='document', name='checksum', field=models.CharField( default='-', db_index=True, editable=False, max_length=32, help_text='The checksum of the original document (before it ' 'was encrypted). We use this to prevent duplicate ' 'document imports.', ), preserve_default=False, ), migrations.RunPython(set_checksums, do_nothing), migrations.AlterField( model_name='document', name='created', field=models.DateTimeField(db_index=True, default=django.utils.timezone.now), ), migrations.AlterField( model_name='document', name='modified', field=models.DateTimeField(auto_now=True, db_index=True), ), ] ================================================ FILE: src/documents/migrations/0015_add_insensitive_to_match.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.10.2 on 2016-10-05 21:38 from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('documents', '0014_document_checksum'), ] operations = [ migrations.AlterField( model_name='document', name='checksum', field=models.CharField(editable=False, help_text='The checksum of the original document (before it was encrypted). We use this to prevent duplicate document imports.', max_length=32, unique=True), ), migrations.AddField( model_name='correspondent', name='is_insensitive', field=models.BooleanField(default=True), ), migrations.AddField( model_name='tag', name='is_insensitive', field=models.BooleanField(default=True), ), ] ================================================ FILE: src/documents/migrations/0016_auto_20170325_1558.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.10.5 on 2017-03-25 15:58 from __future__ import unicode_literals from django.db import migrations, models from django.conf import settings class Migration(migrations.Migration): dependencies = [ ('documents', '0015_add_insensitive_to_match'), ] operations = [ migrations.AlterField( model_name='document', name='content', field=models.TextField(blank=True, db_index=("mysql" not in settings.DATABASES["default"]["ENGINE"]), help_text='The raw, text-only data of the document. This field is primarily used for searching.'), ), ] ================================================ FILE: src/documents/migrations/0017_auto_20170512_0507.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.10.5 on 2017-05-12 05:07 from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('documents', '0016_auto_20170325_1558'), ] operations = [ migrations.AlterField( model_name='correspondent', name='matching_algorithm', field=models.PositiveIntegerField(choices=[(1, 'Any'), (2, 'All'), (3, 'Literal'), (4, 'Regular Expression'), (5, 'Fuzzy Match')], default=1, help_text='Which algorithm you want to use when matching text to the OCR\'d PDF. Here, "any" looks for any occurrence of any word provided in the PDF, while "all" requires that every word provided appear in the PDF, albeit not in the order provided. A "literal" match means that the text you enter must appear in the PDF exactly as you\'ve entered it, and "regular expression" uses a regex to match the PDF. (If you don\'t know what a regex is, you probably don\'t want this option.) Finally, a "fuzzy match" looks for words or phrases that are mostly—but not exactly—the same, which can be useful for matching against documents containg imperfections that foil accurate OCR.'), ), migrations.AlterField( model_name='tag', name='matching_algorithm', field=models.PositiveIntegerField(choices=[(1, 'Any'), (2, 'All'), (3, 'Literal'), (4, 'Regular Expression'), (5, 'Fuzzy Match')], default=1, help_text='Which algorithm you want to use when matching text to the OCR\'d PDF. Here, "any" looks for any occurrence of any word provided in the PDF, while "all" requires that every word provided appear in the PDF, albeit not in the order provided. A "literal" match means that the text you enter must appear in the PDF exactly as you\'ve entered it, and "regular expression" uses a regex to match the PDF. (If you don\'t know what a regex is, you probably don\'t want this option.) Finally, a "fuzzy match" looks for words or phrases that are mostly—but not exactly—the same, which can be useful for matching against documents containg imperfections that foil accurate OCR.'), ), ] ================================================ FILE: src/documents/migrations/0018_auto_20170715_1712.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.10.5 on 2017-07-15 17:12 from __future__ import unicode_literals from django.db import migrations, models import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ ('documents', '0017_auto_20170512_0507'), ] operations = [ migrations.AlterField( model_name='document', name='correspondent', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='documents', to='documents.Correspondent'), ), ] ================================================ FILE: src/documents/migrations/0019_add_consumer_user.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.10.5 on 2017-07-15 17:12 from __future__ import unicode_literals from django.contrib.auth.models import User from django.db import migrations def forwards_func(apps, schema_editor): User.objects.create(username="consumer") def reverse_func(apps, schema_editor): User.objects.get(username="consumer").delete() class Migration(migrations.Migration): dependencies = [ ('documents', '0018_auto_20170715_1712'), ] operations = [ migrations.RunPython(forwards_func, reverse_func), ] ================================================ FILE: src/documents/migrations/0020_document_added.py ================================================ # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import migrations, models import django.utils.timezone def set_added_time_to_created_time(apps, schema_editor): Document = apps.get_model("documents", "Document") for doc in Document.objects.all(): doc.added = doc.created doc.save() class Migration(migrations.Migration): dependencies = [ ('documents', '0019_add_consumer_user'), ] operations = [ migrations.AddField( model_name='document', name='added', field=models.DateTimeField(db_index=True, default=django.utils.timezone.now, editable=False), ), migrations.RunPython(set_added_time_to_created_time) ] ================================================ FILE: src/documents/migrations/0021_document_storage_type.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.11.10 on 2018-02-04 13:07 from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('documents', '0020_document_added'), ] operations = [ # Add the field with the default GPG-encrypted value migrations.AddField( model_name='document', name='storage_type', field=models.CharField(choices=[('unencrypted', 'Unencrypted'), ('gpg', 'Encrypted with GNU Privacy Guard')], default='gpg', editable=False, max_length=11), ), # Now that the field is added, change the default to unencrypted migrations.AlterField( model_name='document', name='storage_type', field=models.CharField(choices=[('unencrypted', 'Unencrypted'), ('gpg', 'Encrypted with GNU Privacy Guard')], default='unencrypted', editable=False, max_length=11), ), ] ================================================ FILE: src/documents/migrations/0022_auto_20181007_1420.py ================================================ # Generated by Django 2.0.8 on 2018-10-07 14:20 from django.db import migrations, models from django.utils.text import slugify def re_slug_all_the_things(apps, schema_editor): """ Rewrite all slug values to make sure they're actually slugs before we brand them as uneditable. """ Tag = apps.get_model("documents", "Tag") Correspondent = apps.get_model("documents", "Correspondent") for klass in (Tag, Correspondent): for instance in klass.objects.all(): klass.objects.filter( pk=instance.pk ).update( slug=slugify(instance.slug) ) class Migration(migrations.Migration): dependencies = [ ('documents', '0021_document_storage_type'), ] operations = [ migrations.AlterModelOptions( name='tag', options={'ordering': ('name',)}, ), migrations.AlterField( model_name='correspondent', name='slug', field=models.SlugField(blank=True, editable=False), ), migrations.AlterField( model_name='document', name='file_type', field=models.CharField(choices=[('pdf', 'PDF'), ('png', 'PNG'), ('jpg', 'JPG'), ('gif', 'GIF'), ('tiff', 'TIFF'), ('txt', 'TXT'), ('csv', 'CSV'), ('md', 'MD')], editable=False, max_length=4), ), migrations.AlterField( model_name='tag', name='slug', field=models.SlugField(blank=True, editable=False), ), migrations.RunPython(re_slug_all_the_things, migrations.RunPython.noop) ] ================================================ FILE: src/documents/migrations/0023_document_current_filename.py ================================================ # Generated by Django 2.0.10 on 2019-04-26 18:57 from django.db import migrations, models def set_filename(apps, schema_editor): Document = apps.get_model("documents", "Document") for doc in Document.objects.all(): file_name = "{:07}.{}".format(doc.pk, doc.file_type) if doc.storage_type == "gpg": file_name += ".gpg" # Set filename doc.filename = file_name # Save document doc.save() class Migration(migrations.Migration): dependencies = [ ('documents', '0022_auto_20181007_1420'), ] operations = [ migrations.AddField( model_name='document', name='filename', field=models.FilePathField(default=None, null=True, editable=False, help_text='Current filename in storage', max_length=256), ), migrations.RunPython(set_filename) ] ================================================ FILE: src/documents/migrations/__init__.py ================================================ ================================================ FILE: src/documents/mixins.py ================================================ class Renderable: """ A handy mixin to make it easier/cleaner to print output based on a verbosity value. """ def _render(self, text, verbosity): if self.verbosity >= verbosity: print(text) ================================================ FILE: src/documents/models.py ================================================ # coding=utf-8 import logging import os import re import uuid from collections import OrderedDict import dateutil.parser from django.dispatch import receiver from django.conf import settings from django.db import models from django.template.defaultfilters import slugify from django.utils import timezone from django.utils.text import slugify from fuzzywuzzy import fuzz from collections import defaultdict from .managers import LogManager try: from django.core.urlresolvers import reverse except ImportError: from django.urls import reverse class MatchingModel(models.Model): MATCH_ANY = 1 MATCH_ALL = 2 MATCH_LITERAL = 3 MATCH_REGEX = 4 MATCH_FUZZY = 5 MATCHING_ALGORITHMS = ( (MATCH_ANY, "Any"), (MATCH_ALL, "All"), (MATCH_LITERAL, "Literal"), (MATCH_REGEX, "Regular Expression"), (MATCH_FUZZY, "Fuzzy Match"), ) name = models.CharField(max_length=128, unique=True) slug = models.SlugField(blank=True, editable=False) match = models.CharField(max_length=256, blank=True) matching_algorithm = models.PositiveIntegerField( choices=MATCHING_ALGORITHMS, default=MATCH_ANY, help_text=( "Which algorithm you want to use when matching text to the OCR'd " "PDF. Here, \"any\" looks for any occurrence of any word " "provided in the PDF, while \"all\" requires that every word " "provided appear in the PDF, albeit not in the order provided. A " "\"literal\" match means that the text you enter must appear in " "the PDF exactly as you've entered it, and \"regular expression\" " "uses a regex to match the PDF. (If you don't know what a regex " "is, you probably don't want this option.) Finally, a \"fuzzy " "match\" looks for words or phrases that are mostly—but not " "exactly—the same, which can be useful for matching against " "documents containg imperfections that foil accurate OCR." ) ) is_insensitive = models.BooleanField(default=True) class Meta: abstract = True ordering = ("name",) def __str__(self): return self.name @property def conditions(self): return "{}: \"{}\" ({})".format( self.name, self.match, self.get_matching_algorithm_display()) @classmethod def match_all(cls, text, tags=None): if tags is None: tags = cls.objects.all() text = text.lower() for tag in tags: if tag.matches(text): yield tag def matches(self, text): search_kwargs = {} # Check that match is not empty if self.match.strip() == "": return False if self.is_insensitive: search_kwargs = {"flags": re.IGNORECASE} if self.matching_algorithm == self.MATCH_ALL: for word in self._split_match(): search_result = re.search( r"\b{}\b".format(word), text, **search_kwargs) if not search_result: return False return True if self.matching_algorithm == self.MATCH_ANY: for word in self._split_match(): if re.search(r"\b{}\b".format(word), text, **search_kwargs): return True return False if self.matching_algorithm == self.MATCH_LITERAL: return bool(re.search( r"\b{}\b".format(self.match), text, **search_kwargs)) if self.matching_algorithm == self.MATCH_REGEX: return bool(re.search( re.compile(self.match, **search_kwargs), text)) if self.matching_algorithm == self.MATCH_FUZZY: match = re.sub(r'[^\w\s]', '', self.match) text = re.sub(r'[^\w\s]', '', text) if self.is_insensitive: match = match.lower() text = text.lower() return True if fuzz.partial_ratio(match, text) >= 90 else False raise NotImplementedError("Unsupported matching algorithm") def _split_match(self): """ Splits the match to individual keywords, getting rid of unnecessary spaces and grouping quoted words together. Example: ' some random words "with quotes " and spaces' ==> ["some", "random", "words", "with+quotes", "and", "spaces"] """ findterms = re.compile(r'"([^"]+)"|(\S+)').findall normspace = re.compile(r"\s+").sub return [ normspace(" ", (t[0] or t[1]).strip()).replace(" ", r"\s+") for t in findterms(self.match) ] def save(self, *args, **kwargs): self.match = self.match.lower() self.slug = slugify(self.name) models.Model.save(self, *args, **kwargs) class Correspondent(MatchingModel): # This regex is probably more restrictive than it needs to be, but it's # better safe than sorry. SAFE_REGEX = re.compile(r"^[\w\- ,.']+$") class Meta: ordering = ("name",) class Tag(MatchingModel): COLOURS = ( (1, "#a6cee3"), (2, "#1f78b4"), (3, "#b2df8a"), (4, "#33a02c"), (5, "#fb9a99"), (6, "#e31a1c"), (7, "#fdbf6f"), (8, "#ff7f00"), (9, "#cab2d6"), (10, "#6a3d9a"), (11, "#b15928"), (12, "#000000"), (13, "#cccccc") ) colour = models.PositiveIntegerField(choices=COLOURS, default=1) class Document(models.Model): TYPE_PDF = "pdf" TYPE_PNG = "png" TYPE_JPG = "jpg" TYPE_GIF = "gif" TYPE_TIF = "tiff" TYPE_TXT = "txt" TYPE_CSV = "csv" TYPE_MD = "md" TYPES = (TYPE_PDF, TYPE_PNG, TYPE_JPG, TYPE_GIF, TYPE_TIF, TYPE_TXT, TYPE_CSV, TYPE_MD) STORAGE_TYPE_UNENCRYPTED = "unencrypted" STORAGE_TYPE_GPG = "gpg" STORAGE_TYPES = ( (STORAGE_TYPE_UNENCRYPTED, "Unencrypted"), (STORAGE_TYPE_GPG, "Encrypted with GNU Privacy Guard") ) correspondent = models.ForeignKey( Correspondent, blank=True, null=True, related_name="documents", on_delete=models.SET_NULL ) title = models.CharField(max_length=128, blank=True, db_index=True) content = models.TextField( db_index=True, blank=True, help_text="The raw, text-only data of the document. This field is " "primarily used for searching." ) file_type = models.CharField( max_length=4, editable=False, choices=tuple([(t, t.upper()) for t in TYPES]) ) tags = models.ManyToManyField( Tag, related_name="documents", blank=True) checksum = models.CharField( max_length=32, editable=False, unique=True, help_text="The checksum of the original document (before it was " "encrypted). We use this to prevent duplicate document " "imports." ) created = models.DateTimeField( default=timezone.now, db_index=True) modified = models.DateTimeField( auto_now=True, editable=False, db_index=True) storage_type = models.CharField( max_length=11, choices=STORAGE_TYPES, default=STORAGE_TYPE_UNENCRYPTED, editable=False ) added = models.DateTimeField( default=timezone.now, editable=False, db_index=True) filename = models.FilePathField( max_length=256, editable=False, default=None, null=True, help_text="Current filename in storage" ) class Meta: ordering = ("correspondent", "title") def __str__(self): created = self.created.strftime("%Y%m%d%H%M%S") if self.correspondent and self.title: return "{}: {} - {}".format( created, self.correspondent, self.title) if self.correspondent or self.title: return "{}: {}".format(created, self.correspondent or self.title) return str(created) def find_renamed_document(self, subdirectory=""): suffix = "%07i.%s" % (self.pk, self.file_type) # Append .gpg for encrypted files if self.storage_type == self.STORAGE_TYPE_GPG: suffix += ".gpg" # Start with the (optinally) supplied subdirectory, go up in the # directory hierarchy and try to find the file in question root = os.path.normpath(Document.filename_to_path(subdirectory)) # Check if root really exists and return otherwise if not os.path.isdir(root): return None for filename in os.listdir(root): if filename.endswith(suffix): return os.path.join(subdirectory, filename) fullname = os.path.join(subdirectory, filename) if os.path.isdir(Document.filename_to_path(fullname)): return self.find_renamed_document(fullname) return None @property def source_filename(self): # Initial filename generation (for new documents) if self.filename is None: self.filename = self.generate_source_filename() # Check if document is still available under filename elif not os.path.isfile(Document.filename_to_path(self.filename)): recovered_filename = self.find_renamed_document() # If we have found the file so update the filename if recovered_filename is not None: logger = logging.getLogger(__name__) logger.warning("Filename of document " + str(self.id) + " has changed and was successfully updated") self.filename = recovered_filename # Remove all empty subdirectories from MEDIA_ROOT Document.delete_all_empty_subdirectories( Document.filename_to_path("")) else: logger = logging.getLogger(__name__) logger.error("File of document " + str(self.id) + " has " + "gone and could not be recovered") return self.filename @staticmethod def many_to_dictionary(field): # Converts ManyToManyField to dictionary by assuming, that field # entries contain an _ or - which will be used as a delimiter mydictionary = dict() for index, t in enumerate(field.all()): # Populate tag names by index mydictionary[index] = slugify(t.name) # Find delimiter delimiter = t.name.find('_') if delimiter == -1: delimiter = t.name.find('-') if delimiter == -1: continue key = t.name[:delimiter] value = t.name[delimiter+1:] mydictionary[slugify(key)] = slugify(value) return mydictionary def generate_source_filename(self): # Create filename based on configured format if settings.PAPERLESS_FILENAME_FORMAT is not None: tags = defaultdict(lambda: slugify(None), self.many_to_dictionary(self.tags)) path = settings.PAPERLESS_FILENAME_FORMAT.format( correspondent=slugify(self.correspondent), title=slugify(self.title), created=slugify(self.created), added=slugify(self.added), tags=tags) else: path = "" # Always append the primary key to guarantee uniqueness of filename if len(path) > 0: filename = "%s-%07i.%s" % (path, self.pk, self.file_type) else: filename = "%07i.%s" % (self.pk, self.file_type) # Append .gpg for encrypted files if self.storage_type == self.STORAGE_TYPE_GPG: filename += ".gpg" return filename def create_source_directory(self): new_filename = self.generate_source_filename() # Determine the full "target" path dir_new = Document.filename_to_path(os.path.dirname(new_filename)) # Create new path os.makedirs(dir_new, exist_ok=True) @property def source_path(self): return Document.filename_to_path(self.source_filename) @staticmethod def filename_to_path(filename): return os.path.join( settings.MEDIA_ROOT, "documents", "originals", filename ) @property def source_file(self): return open(self.source_path, "rb") @property def file_name(self): return slugify(str(self)) + "." + self.file_type @property def download_url(self): return reverse("fetch", kwargs={"kind": "doc", "pk": self.pk}) @property def thumbnail_path(self): file_name = "{:07}.png".format(self.pk) if self.storage_type == self.STORAGE_TYPE_GPG: file_name += ".gpg" return os.path.join( settings.MEDIA_ROOT, "documents", "thumbnails", file_name ) @property def thumbnail_file(self): return open(self.thumbnail_path, "rb") @property def thumbnail_url(self): return reverse("fetch", kwargs={"kind": "thumb", "pk": self.pk}) def set_filename(self, filename): if os.path.isfile(Document.filename_to_path(filename)): self.filename = filename @staticmethod def try_delete_empty_directories(directory): # Go up in the directory hierarchy and try to delete all directories directory = os.path.normpath(directory) root = os.path.normpath(Document.filename_to_path("")) while directory != root: # Try to delete the current directory try: os.rmdir(directory) except os.error: # Directory not empty, no need to go further up return # Cut off actual directory and go one level up directory, _ = os.path.split(directory) directory = os.path.normpath(directory) @staticmethod def delete_all_empty_subdirectories(directory): # Go through all folders and try to delete all directories root = os.path.normpath(Document.filename_to_path(directory)) for filename in os.listdir(root): fullname = os.path.join(directory, filename) if not os.path.isdir(Document.filename_to_path(fullname)): continue # Go into subdirectory to see, if there is more to delete Document.delete_all_empty_subdirectories( os.path.join(directory, filename)) # Try to delete the directory try: os.rmdir(Document.filename_to_path(fullname)) continue except os.error: # Directory not empty, no need to go further up continue @receiver(models.signals.m2m_changed, sender=Document.tags.through) @receiver(models.signals.post_save, sender=Document) def update_filename(sender, instance, **kwargs): # Skip if document has not been saved yet if instance.filename is None: return # Check is file exists and update filename otherwise if not os.path.isfile(Document.filename_to_path(instance.filename)): instance.filename = instance.source_filename # Build the new filename new_filename = instance.generate_source_filename() # If the filename is the same, then nothing needs to be done if instance.filename == new_filename: return # Determine the full "target" path path_new = instance.filename_to_path(new_filename) dir_new = instance.filename_to_path(os.path.dirname(new_filename)) # Create new path instance.create_source_directory() # Determine the full "current" path path_current = instance.filename_to_path(instance.source_filename) # Move file try: os.rename(path_current, path_new) except PermissionError: # Do not update filename in object return except FileNotFoundError: logger = logging.getLogger(__name__) logger.error("Renaming of document " + str(instance.id) + " failed " + "as file " + instance.filename + " was no longer present") return # Delete empty directory old_dir = os.path.dirname(instance.filename) old_path = instance.filename_to_path(old_dir) Document.try_delete_empty_directories(old_path) instance.filename = new_filename # Save instance # This will not cause a cascade of post_save signals, as next time # nothing needs to be renamed instance.save() @receiver(models.signals.post_delete, sender=Document) def delete_files(sender, instance, **kwargs): if instance.filename is None: return # Remove the document old_file = instance.filename_to_path(instance.filename) try: os.remove(old_file) except FileNotFoundError: logger = logging.getLogger(__name__) logger.warning("Deleted document " + str(instance.id) + " but file " + old_file + " was no longer present") # And remove the directory (if applicable) old_dir = os.path.dirname(instance.filename) old_path = instance.filename_to_path(old_dir) Document.try_delete_empty_directories(old_path) class Log(models.Model): LEVELS = ( (logging.DEBUG, "Debugging"), (logging.INFO, "Informational"), (logging.WARNING, "Warning"), (logging.ERROR, "Error"), (logging.CRITICAL, "Critical"), ) group = models.UUIDField(blank=True) message = models.TextField() level = models.PositiveIntegerField(choices=LEVELS, default=logging.INFO) created = models.DateTimeField(auto_now_add=True) modified = models.DateTimeField(auto_now=True) objects = LogManager() class Meta: ordering = ("-modified",) def __str__(self): return self.message def save(self, *args, **kwargs): """ To allow for the case where we don't want to group the message, we shouldn't force the caller to specify a one-time group value. However, allowing group=None means that the manager can't differentiate the different un-grouped messages, so instead we set a random one here. """ if not self.group: self.group = uuid.uuid4() models.Model.save(self, *args, **kwargs) class FileInfo: # This epic regex *almost* worked for our needs, so I'm keeping it here for # posterity, in the hopes that we might find a way to make it work one day. ALMOST_REGEX = re.compile( r"^((?P\d\d\d\d\d\d\d\d\d\d\d\d\d\dZ){separator})?" r"((?P{non_separated_word}+){separator})??" r"(?P{non_separated_word}+)" r"({separator}(?P<tags>[a-z,0-9-]+))?" r"\.(?P<extension>[a-zA-Z.-]+)$".format( separator=r"\s+-\s+", non_separated_word=r"([\w,. ]|([^\s]-))" ) ) formats = "pdf|jpe?g|png|gif|tiff?|te?xt|md|csv" REGEXES = OrderedDict([ ("created-correspondent-title-tags", re.compile( r"^(?P<created>\d\d\d\d\d\d\d\d(\d\d\d\d\d\d)?Z) - " r"(?P<correspondent>.*) - " r"(?P<title>.*) - " r"(?P<tags>[a-z0-9\-,]*)" r"\.(?P<extension>{})$".format(formats), flags=re.IGNORECASE )), ("created-title-tags", re.compile( r"^(?P<created>\d\d\d\d\d\d\d\d(\d\d\d\d\d\d)?Z) - " r"(?P<title>.*) - " r"(?P<tags>[a-z0-9\-,]*)" r"\.(?P<extension>{})$".format(formats), flags=re.IGNORECASE )), ("created-correspondent-title", re.compile( r"^(?P<created>\d\d\d\d\d\d\d\d(\d\d\d\d\d\d)?Z) - " r"(?P<correspondent>.*) - " r"(?P<title>.*)" r"\.(?P<extension>{})$".format(formats), flags=re.IGNORECASE )), ("created-title", re.compile( r"^(?P<created>\d\d\d\d\d\d\d\d(\d\d\d\d\d\d)?Z) - " r"(?P<title>.*)" r"\.(?P<extension>{})$".format(formats), flags=re.IGNORECASE )), ("correspondent-title-tags", re.compile( r"(?P<correspondent>.*) - " r"(?P<title>.*) - " r"(?P<tags>[a-z0-9\-,]*)" r"\.(?P<extension>{})$".format(formats), flags=re.IGNORECASE )), ("correspondent-title", re.compile( r"(?P<correspondent>.*) - " r"(?P<title>.*)?" r"\.(?P<extension>{})$".format(formats), flags=re.IGNORECASE )), ("title", re.compile( r"(?P<title>.*)" r"\.(?P<extension>{})$".format(formats), flags=re.IGNORECASE )) ]) def __init__(self, created=None, correspondent=None, title=None, tags=(), extension=None): self.created = created self.title = title self.extension = extension self.correspondent = correspondent self.tags = tags @classmethod def _get_created(cls, created): try: return dateutil.parser.parse("{:0<14}Z".format(created[:-1])) except ValueError: return None @classmethod def _get_correspondent(cls, name): if not name: return None return Correspondent.objects.get_or_create(name=name, defaults={ "slug": slugify(name) })[0] @classmethod def _get_title(cls, title): return title @classmethod def _get_tags(cls, tags): r = [] for t in tags.split(","): r.append(Tag.objects.get_or_create( slug=slugify(t), defaults={"name": t} )[0]) return tuple(r) @classmethod def _get_extension(cls, extension): r = extension.lower() if r == "jpeg": return "jpg" if r == "tif": return "tiff" return r @classmethod def _mangle_property(cls, properties, name): if name in properties: properties[name] = getattr(cls, "_get_{}".format(name))( properties[name] ) @classmethod def from_path(cls, path): """ We use a crude naming convention to make handling the correspondent, title, and tags easier: "<date> - <correspondent> - <title> - <tags>.<suffix>" "<correspondent> - <title> - <tags>.<suffix>" "<correspondent> - <title>.<suffix>" "<title>.<suffix>" """ filename = os.path.basename(path) # Mutate filename in-place before parsing its components # by applying at most one of the configured transformations. for (pattern, repl) in settings.FILENAME_PARSE_TRANSFORMS: (filename, count) = pattern.subn(repl, filename) if count: break # Parse filename components. for regex in cls.REGEXES.values(): m = regex.match(filename) if m: properties = m.groupdict() cls._mangle_property(properties, "created") cls._mangle_property(properties, "correspondent") cls._mangle_property(properties, "title") cls._mangle_property(properties, "tags") cls._mangle_property(properties, "extension") return cls(**properties) ================================================ FILE: src/documents/parsers.py ================================================ import logging import os import re import shutil import subprocess import tempfile import dateparser from django.conf import settings from django.utils import timezone # This regular expression will try to find dates in the document at # hand and will match the following formats: # - XX.YY.ZZZZ with XX + YY being 1 or 2 and ZZZZ being 2 or 4 digits # - XX/YY/ZZZZ with XX + YY being 1 or 2 and ZZZZ being 2 or 4 digits # - XX-YY-ZZZZ with XX + YY being 1 or 2 and ZZZZ being 2 or 4 digits # - ZZZZ.XX.YY with XX + YY being 1 or 2 and ZZZZ being 2 or 4 digits # - ZZZZ/XX/YY with XX + YY being 1 or 2 and ZZZZ being 2 or 4 digits # - ZZZZ-XX-YY with XX + YY being 1 or 2 and ZZZZ being 2 or 4 digits # - XX. MONTH ZZZZ with XX being 1 or 2 and ZZZZ being 2 or 4 digits # - MONTH ZZZZ, with ZZZZ being 4 digits # - MONTH XX, ZZZZ with XX being 1 or 2 and ZZZZ being 4 digits DATE_REGEX = re.compile( r'(\b|(?!=([_-])))([0-9]{1,2})[\.\/-]([0-9]{1,2})[\.\/-]([0-9]{4}|[0-9]{2})(\b|(?=([_-])))|' + # NOQA: E501 r'(\b|(?!=([_-])))([0-9]{4}|[0-9]{2})[\.\/-]([0-9]{1,2})[\.\/-]([0-9]{1,2})(\b|(?=([_-])))|' + # NOQA: E501 r'(\b|(?!=([_-])))([0-9]{1,2}[\. ]+[^ ]{3,9} ([0-9]{4}|[0-9]{2}))(\b|(?=([_-])))|' + # NOQA: E501 r'(\b|(?!=([_-])))([^\W\d_]{3,9} [0-9]{1,2}, ([0-9]{4}))(\b|(?=([_-])))|' + r'(\b|(?!=([_-])))([^\W\d_]{3,9} [0-9]{4})(\b|(?=([_-])))' ) class ParseError(Exception): pass class DocumentParser: """ Subclass this to make your own parser. Have a look at `paperless_tesseract.parsers` for inspiration. """ def __init__(self, path): self.document_path = path self.tempdir = tempfile.mkdtemp(prefix="paperless-", dir=settings.SCRATCH_DIR) self.logger = logging.getLogger(__name__) self.logging_group = None def get_thumbnail(self): """ Returns the path to a file we can use as a thumbnail for this document. """ raise NotImplementedError() def optimise_thumbnail(self, in_path): out_path = os.path.join(self.tempdir, "optipng.png") args = (settings.OPTIPNG_BINARY, "-o5", in_path, "-out", out_path) if not subprocess.Popen(args).wait() == 0: raise ParseError("Optipng failed at {}".format(args)) return out_path def get_optimised_thumbnail(self): return self.optimise_thumbnail(self.get_thumbnail()) def get_text(self): """ Returns the text from the document and only the text. """ raise NotImplementedError() def get_date(self): """ Returns the date of the document. """ def __parser(ds, date_order): """ Call dateparser.parse with a particular date ordering """ return dateparser.parse( ds, settings={ "DATE_ORDER": date_order, "PREFER_DAY_OF_MONTH": "first", "RETURN_AS_TIMEZONE_AWARE": True } ) date = None date_string = None next_year = timezone.now().year + 5 # Arbitrary 5 year future limit title = os.path.basename(self.document_path) # if filename date parsing is enabled, search there first: if settings.FILENAME_DATE_ORDER: self.log("info", "Checking document title for date") for m in re.finditer(DATE_REGEX, title): date_string = m.group(0) try: date = __parser(date_string, settings.FILENAME_DATE_ORDER) except (TypeError, ValueError): # Skip all matches that do not parse to a proper date continue if date is not None and next_year > date.year > 1900: self.log( "info", "Detected document date {} based on string {} " "from document title" "".format(date.isoformat(), date_string) ) return date try: # getting text after checking filename will save time if only # looking at the filename instead of the whole text text = self.get_text() except ParseError: return None # Iterate through all regex matches in text and try to parse the date for m in re.finditer(DATE_REGEX, text): date_string = m.group(0) try: date = __parser(date_string, settings.DATE_ORDER) except (TypeError, ValueError): # Skip all matches that do not parse to a proper date continue if date is not None and next_year > date.year > 1900: break else: date = None if date is not None: self.log( "info", "Detected document date {} based on string {}".format( date.isoformat(), date_string ) ) else: self.log("info", "Unable to detect date for document") return date def log(self, level, message): getattr(self.logger, level)(message, extra={ "group": self.logging_group }) def cleanup(self): self.log("debug", "Deleting directory {}".format(self.tempdir)) shutil.rmtree(self.tempdir) ================================================ FILE: src/documents/serialisers.py ================================================ from rest_framework import serializers from .models import Correspondent, Tag, Document, Log class CorrespondentSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Correspondent fields = ( "id", "slug", "name", "match", "matching_algorithm", "is_insensitive" ) class TagSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Tag fields = ( "id", "slug", "name", "colour", "match", "matching_algorithm", "is_insensitive" ) class CorrespondentField(serializers.HyperlinkedRelatedField): def get_queryset(self): return Correspondent.objects.all() class TagsField(serializers.HyperlinkedRelatedField): def get_queryset(self): return Tag.objects.all() class DocumentSerializer(serializers.ModelSerializer): correspondent = CorrespondentField( view_name="drf:correspondent-detail", allow_null=True) tags = TagsField(view_name="drf:tag-detail", many=True) class Meta: model = Document fields = ( "id", "correspondent", "title", "content", "file_type", "tags", "checksum", "created", "modified", "added", "file_name", "download_url", "thumbnail_url", ) class LogSerializer(serializers.ModelSerializer): time = serializers.DateTimeField() messages = serializers.CharField() class Meta: model = Log fields = ( "time", "messages" ) ================================================ FILE: src/documents/settings.py ================================================ # Defines the names of file/thumbnail for the manifest # for exporting/importing commands EXPORTER_FILE_NAME = "__exported_file_name__" EXPORTER_THUMBNAIL_NAME = "__exported_thumbnail_name__" ================================================ FILE: src/documents/signals/__init__.py ================================================ from django.dispatch import Signal document_consumption_started = Signal(providing_args=["filename"]) document_consumption_finished = Signal(providing_args=["document"]) document_consumer_declaration = Signal(providing_args=[]) ================================================ FILE: src/documents/signals/handlers.py ================================================ import logging import os from subprocess import Popen from django.conf import settings from django.contrib.admin.models import ADDITION, LogEntry from django.contrib.auth.models import User from django.contrib.contenttypes.models import ContentType from django.utils import timezone from ..models import Correspondent, Document, Tag def logger(message, group): logging.getLogger(__name__).debug(message, extra={"group": group}) def set_correspondent(sender, document=None, logging_group=None, **kwargs): # No sense in assigning a correspondent when one is already set. if document.correspondent: return # No matching correspondents, so no need to continue potential_correspondents = list(Correspondent.match_all(document.content)) if not potential_correspondents: return potential_count = len(potential_correspondents) selected = potential_correspondents[0] if potential_count > 1: message = "Detected {} potential correspondents, so we've opted for {}" logger( message.format(potential_count, selected), logging_group ) logger( 'Assigning correspondent "{}" to "{}" '.format(selected, document), logging_group ) document.correspondent = selected document.save(update_fields=("correspondent",)) def set_tags(sender, document=None, logging_group=None, **kwargs): current_tags = set(document.tags.all()) relevant_tags = set(Tag.match_all(document.content)) - current_tags if not relevant_tags: return message = 'Tagging "{}" with "{}"' logger( message.format(document, ", ".join([t.slug for t in relevant_tags])), logging_group ) document.tags.add(*relevant_tags) def run_pre_consume_script(sender, filename, **kwargs): if not settings.PRE_CONSUME_SCRIPT: return Popen((settings.PRE_CONSUME_SCRIPT, filename)).wait() def run_post_consume_script(sender, document, **kwargs): if not settings.POST_CONSUME_SCRIPT: return Popen(( settings.POST_CONSUME_SCRIPT, str(document.id), document.file_name, document.source_path, document.thumbnail_path, document.download_url, document.thumbnail_url, str(document.correspondent), str(",".join(document.tags.all().values_list("slug", flat=True))) )).wait() def cleanup_document_deletion(sender, instance, using, **kwargs): if not isinstance(instance, Document): return for f in (instance.source_path, instance.thumbnail_path): try: os.unlink(f) except FileNotFoundError: pass # The file's already gone, so we're cool with it. def set_log_entry(sender, document=None, logging_group=None, **kwargs): ct = ContentType.objects.get(model="document") user = User.objects.get(username="consumer") LogEntry.objects.create( action_flag=ADDITION, action_time=timezone.now(), content_type=ct, object_id=document.id, user=user, object_repr=document.__str__(), ) ================================================ FILE: src/documents/static/js/colours.js ================================================ // The following jQuery snippet will add a small square next to the selection // drop-down on the `Add tag` page that will update to show the selected tag // color as the drop-down value is changed. django.jQuery(document).ready(function(){ if (django.jQuery("#id_colour").length) { let colour; let colour_num; colour_num = django.jQuery("#id_colour").val() - 1; colour = django.jQuery('#id_colour')[0][colour_num].text; django.jQuery('#id_colour').after('<div class="colour_square"></div>'); django.jQuery('.colour_square').css({ 'float': 'left', 'width': '20px', 'height': '20px', 'margin': '5px', 'border': '1px solid rgba(0, 0, 0, .2)', 'background': colour }); django.jQuery('#id_colour').change(function () { colour_num = django.jQuery("#id_colour").val() - 1; colour = django.jQuery('#id_colour')[0][colour_num].text; django.jQuery('.colour_square').css({'background': colour}); }); } else if (django.jQuery("select[id*='colour']").length) { django.jQuery('select[id*="-colour"]').each(function (index, element) { let id; let loop_colour_num; let loop_colour; id = "colour_square_" + index; django.jQuery(element).after('<div class="colour_square" id="' + id + '"></div>'); loop_colour_num = django.jQuery(element).val() - 1; loop_colour = django.jQuery(element)[0][loop_colour_num].text; django.jQuery("<style type='text/css'>\ .colour_square{ \ float: left; \ width: 20px; \ height: 20px; \ margin: 5px; \ border: 1px solid rgba(0,0,0,.2); \ } </style>").appendTo("head"); django.jQuery('#' + id).css({'background': loop_colour}); console.log(id, loop_colour_num, loop_colour); django.jQuery(element).change(function () { loop_colour_num = django.jQuery(element).val() - 1; loop_colour = django.jQuery(element)[0][loop_colour_num].text; django.jQuery('#' + id).css({'background': loop_colour}); console.log('#' + id, loop_colour) }); }) } }); ================================================ FILE: src/documents/static/paperless.css ================================================ th.column-document, td.field-document { text-align: center; } td a.tag { padding: 0 0.5em; color: #ffffff; border-radius: 0.2em; margin: 1px; display: inline-block; } #result_list th.column-note { text-align: right; } #result_list td.field-note { text-align: right; } #result_list td textarea { width: 90%; height: 5em; } ================================================ FILE: src/documents/templates/admin/base_site.html ================================================ {% extends 'admin/base_site.html' %} {# NOTE: This should probably be extending base.html. See CSS comment below details. #} {% load static %} {% load custom_css from customisation %} {% load custom_js from customisation %} {% block extrahead %} <link rel="icon" type="image/x-icon" href="{% url 'favicon' %}" /> <style> #header { background-color: #90a9b7; line-height: inherit; height: auto; } #branding h1 { font-weight: inherit; font-size: inherit; } .button, .button:active, .button:focus, .button:hover, a.button, .submit-row input, input[type="submit"], input[type="submit"]:active, input[type="submit"]:focus, input[type="submit"]:hover, input[type="button"], input[type="button"]:active, input[type="button"]:focus, input[type="button"]:hover { background-color: #074f57; } .module h2, .module caption, .inline-group h2 { background-color: #90a9b7; } div.breadcrumbs { background-color: #077187; } .module h2, .module caption, .inline-group h2 { background-color: #077187; } </style> {% endblock %} {% block branding %} <h1 id="site-name"> <a href="{% url 'admin:index' %}"><img src="{% static 'paperless/img/logo-light.png' %}" alt="Paperless" /></a> </h1> {% endblock %} {% block blockbots %} {% comment %} This really should be extending `extrastyle`, but the the django-flat-responsive package decided that it wanted to put its CSS in this block, so to make sure that overrides are in fact overriding everything else, we have to do the Wrong Thing here. Once we switch to Django 2.x and drop django-flat-responsive, we should switch this to `extrastyle` where it should be. {% endcomment %} {{ block.super }} {% custom_css %} {% endblock blockbots %} {% block footer %} {% comment %} The Django admin doesn't have a block for Javascript you'd want placed in the footer, so we have to use this one instead. {% endcomment %} {{ block.super }} {% custom_js %} {% endblock footer %} ================================================ FILE: src/documents/templates/admin/documents/document/change_form.html ================================================ {% extends 'admin/change_form.html' %} {% block content %} {{ block.super }} <div class="side-preview"> <h2>Preview</h2> <object data="/fetch/preview/{{object_id}}"></object> </div> {% if next_object %} <script type="text/javascript">//<![CDATA[ (function($){ $('<input type="submit" value="Save and edit next" name="_saveandeditnext" />') .prependTo('div.submit-row'); $('<input type="hidden" value="{{next_object}}" name="_next_object" />') .prependTo('div.submit-row'); })(django.jQuery); //]]></script> {% endif %} {% endblock content %} {% block extrastyle %} {{ block.super }} <style> .side-preview { width: 100%; height: 800px; clear: both; } .side-preview object { height: 100%; width: 100%; } @media screen and (min-width: 1500px) { #content-main { width: 50%; } #footer { padding: 0; } .side-preview { float: right; width: 40%; height: 80vh; clear: none; } } </style> {% endblock %} {% block footer %} {{ block.super }} {# Hack to force Django to make the created date a date input rather than `text` (the default) #} <script> django.jQuery(".field-created input").first().attr("type", "date") </script> {% endblock footer %} ================================================ FILE: src/documents/templates/admin/documents/document/change_list.html ================================================ {% extends 'admin/change_list.html' %} {% load admin_actions from admin_list%} {% load result_list from hacks %} {% block result_list %} {% if action_form and actions_on_top and cl.show_admin_actions %}{% admin_actions %}{% endif %} {% result_list cl %} {% if action_form and actions_on_bottom and cl.show_admin_actions %}{% admin_actions %}{% endif %} {% endblock %} ================================================ FILE: src/documents/templates/admin/documents/document/change_list_results.html ================================================ {% load i18n %} <style> .grid *, .grid *:after, .grid *:before { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .box { width: 12.5%; padding: 1em; float: left; opacity: 0.7; transition: all 0.5s; } .box:hover { opacity: 1; transition: all 0.5s; } .box:last-of-type { padding-right: 0; } .result { border: 1px solid #cccccc; border-radius: 2%; overflow: hidden; height: 300px; } .result .header { padding: 5px; background-color: #90a9b7; position: relative; } .result .header .checkbox { width: 5%; float: left; position: absolute; z-index: 2; } .result .header .info { margin-left: 10%; position: relative; } .headerLink { cursor: pointer; opacity: 0; z-index: 1; position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .header > a { z-index: 2; margin-left: 10%; position: relative; } .result .header a, .result a.tag { color: #ffffff; } .result .date { padding: 5px; } .result .tags { float: left; } .result .tags a.tag { padding: 2px 5px; border-radius: 2px; display: inline-block; margin: 2px; } .result .date { float: right; color: #cccccc; } .result .image img { width: 100%; } .grid { margin-right: 260px; } .grid:after { content: ""; display: table; clear: both; } @media (max-width: 1600px) { .box { width: 25% } } @media (max-width: 991px) { .grid { margin-right: 220px; } .box { width: 50% } } @media (max-width: 767px) { .grid { margin-right: 0; } } @media (max-width: 500px) { .box { width: 100% } } </style> {# This is just copypasta from the parent change_list_results.html file #} <table id="result_list"> <thead> <tr> {% for header in result_headers %} <th scope="col" {{ header.class_attrib }}> {% if header.sortable %} {% if header.sort_priority > 0 %} <div class="sortoptions"> <a class="sortremove" href="{{ header.url_remove }}" title="{% trans "Remove from sorting" %}"></a> {% if num_sorted_fields > 1 %}<span class="sortpriority" title="{% blocktrans with priority_number=header.sort_priority %}Sorting priority: {{ priority_number }}{% endblocktrans %}">{{ header.sort_priority }}</span>{% endif %} <a href="{{ header.url_toggle }}" class="toggle {% if header.ascending %}ascending{% else %}descending{% endif %}" title="{% trans "Toggle sorting" %}"></a> </div> {% endif %} {% endif %} <div class="text">{% if header.sortable %}<a href="{{ header.url_primary }}">{{ header.text|capfirst }}</a>{% else %}<span>{{ header.text|capfirst }}</span>{% endif %}</div> <div class="clear"></div> </th>{% endfor %} </tr> </thead> </table> {# /copypasta #} <div class="grid"> {% for result in results %} {# 0: Checkbox #} {# 1: Title #} {# 2: Date #} {# 3: Added #} {# 4: Image #} {# 5: Correspondent #} {# 6: Tags #} {# 7: Document edit url #} <div class="box"> <div class="result"> <div class="header"> {% comment %} The purpose of 'headerLink' is to make the whole header background clickable. We use an onclick handler here instead of a native link ('<a>') to allow selecting (and copying) the overlying doc title text with the mouse cursor. If the title link were layered upon another link ('<a>'), title text selection would not be possible with mouse click + drag. Instead, the underlying link would be dragged. {% endcomment %} <div class="headerLink" onclick="location.href='{{ result.7 }}';"></div> <div class="checkbox">{{ result.0 }}</div> <div class="info"> {{ result.5 }} </div> {{ result.1 }} <div style="clear: both;"></div> </div> <div class="tags">{{ result.6 }}</div> <div class="date">{{ result.2 }}</div> <div style="clear: both;"></div> <div class="image">{{ result.4 }}</div> </div> </div> {% endfor %} </div> <script> // We need to re-build the select-all functionality as the old logic pointed // to a table and we're using divs now. django.jQuery("#action-toggle").on("change", function(){ django.jQuery(".grid .box .result .checkbox input") .prop("checked", this.checked); }); </script> ================================================ FILE: src/documents/templates/admin/documents/document/select_object.html ================================================ {% extends "admin/base_site.html" %} {% load i18n l10n admin_urls static %} {% load staticfiles %} {% block extrahead %} {{ block.super }} {{ media }} <script type="text/javascript" src="{% static 'admin/js/cancel.js' %}"></script> {% endblock %} {% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} delete-confirmation delete-selected-confirmation{% endblock %} {% block breadcrumbs %} <div class="breadcrumbs"> <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> › <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a> › <a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a> › {{ title }} </div> {% endblock %} {% block content %} <p>Please select the {{itemname}}.</p> <form method="post">{% csrf_token %} <div> {% for obj in queryset %} <input type="hidden" name="{{ action_checkbox_name }}" value="{{ obj.pk|unlocalize }}"/> {% endfor %} <p> <select name="obj_id"> {% for obj in objects %} <option value="{{ obj.id }}">{{ obj.name }}</option> {% endfor %} </select> </p> <input type="hidden" name="action" value="{{ action }}"/> <input type="hidden" name="post" value="yes" /> <p> <input type="submit" value="{% trans 'Confirm' %}" /> <a href="#" class="button cancel-link">{% trans "Go back" %}</a> </p> </div> </form> {% endblock %} ================================================ FILE: src/documents/templates/admin/index.html ================================================ {% extends "admin/index.html" %} {% load i18n static %} {# This block adds a search form on the admin start page and on the module start page so that #} {# the user can quickly search for documents #} {% block pretitle %} <div> <h3>{% trans 'Search documents' %}</h3> <div id="toolbar"><form id="changelist-search" method="get" action="{% url 'admin:documents_document_changelist' %}"> <div><!-- DIV needed for valid HTML --> <label for="searchbar"><img src="{% static "admin/img/search.svg" %}" alt="Search"></label> <input type="text" size="40" name="q" value="" id="searchbar" autofocus=""> <input type="submit" value="{% trans 'Search' %}"> </div> </form> </div> </div> {% endblock %} {# This whole block is here just to override the `get_admin_log` line so #} {# that the log entries aren't limited to the current user #} {% block sidebar %} <div id="content-related"> <div class="module" id="recent-actions-module"> <h2>{% trans 'Recent actions' %}</h2> <h3>{% trans 'My actions' %}</h3> {% load log %} {% get_admin_log 10 as admin_log %} {% if not admin_log %} <p>{% trans 'None available' %}</p> {% else %} <ul class="actionlist"> {% for entry in admin_log %} <li class="{% if entry.is_addition %}addlink{% endif %}{% if entry.is_change %}changelink{% endif %}{% if entry.is_deletion %}deletelink{% endif %}"> {% if entry.is_deletion or not entry.get_admin_url %} {{ entry.object_repr }} {% else %} <a href="{{ entry.get_admin_url }}">{{ entry.object_repr }}</a> {% endif %} <br/> {% if entry.content_type %} <span class="mini quiet">{% filter capfirst %}{{ entry.content_type }}{% endfilter %}</span> {% else %} <span class="mini quiet">{% trans 'Unknown content' %}</span> {% endif %} </li> {% endfor %} </ul> {% endif %} </div> </div> {% endblock %} ================================================ FILE: src/documents/templates/documents/index.html ================================================ <!DOCTYPE html> <html lang="en-gb"> <head> <title>Paperless {# One day someone (maybe even myself) is going to write a proper web front-end for Paperless, and this is where it'll start. #} ================================================ FILE: src/documents/templatetags/__init__.py ================================================ ================================================ FILE: src/documents/templatetags/customisation.py ================================================ import os from django import template from django.conf import settings from django.utils.safestring import mark_safe register = template.Library() @register.simple_tag() def custom_css(): theme_path = os.path.join( settings.MEDIA_ROOT, "overrides.css" ) if os.path.exists(theme_path): return mark_safe( ''.format( os.path.join(settings.MEDIA_URL, "overrides.css") ) ) return "" @register.simple_tag() def custom_js(): theme_path = os.path.join( settings.MEDIA_ROOT, "overrides.js" ) if os.path.exists(theme_path): return mark_safe( ''.format( os.path.join(settings.MEDIA_URL, "overrides.js") ) ) return "" ================================================ FILE: src/documents/templatetags/hacks.py ================================================ import re from django.contrib.admin.templatetags.admin_list import ( result_headers, result_hidden_fields, results ) from django.template import Library EXTRACT_URL = re.compile(r'href="(.*?)"') register = Library() @register.inclusion_tag("admin/documents/document/change_list_results.html") def result_list(cl): """ Copy/pasted from django.contrib.admin.templatetags.admin_list just so I can modify the value passed to `.inclusion_tag()` in the decorator here. There must be a cleaner way... right? """ headers = list(result_headers(cl)) num_sorted_fields = 0 for h in headers: if h['sortable'] and h['sorted']: num_sorted_fields += 1 return {'cl': cl, 'result_hidden_fields': list(result_hidden_fields(cl)), 'result_headers': headers, 'num_sorted_fields': num_sorted_fields, 'results': map(add_doc_edit_url, results(cl))} def add_doc_edit_url(result): """ Make the document edit URL accessible to the view as a separate item """ title = result[1] match = re.search(EXTRACT_URL, title) edit_doc_url = match.group(1) result.append(edit_doc_url) return result ================================================ FILE: src/documents/tests/__init__.py ================================================ ================================================ FILE: src/documents/tests/factories.py ================================================ import factory from ..models import Document, Correspondent class CorrespondentFactory(factory.DjangoModelFactory): class Meta: model = Correspondent name = factory.Faker("name") class DocumentFactory(factory.DjangoModelFactory): class Meta: model = Document ================================================ FILE: src/documents/tests/samples/inline_mail.txt ================================================ Return-Path: Received: from mout.mailhost.com ([212.227.17.22]) by mx-ha.mailhost.com (mx101) with ESMTPS (Nemesis) id 0M22yt-1bePTC1Tkx-00u3T3 for ; Thu, 14 Apr 2016 16:26:53 +0200 Received: from [192.168.178.11] ([65.50.20.247]) by mail.mailhost.com (mr101) with ESMTPSA (Nemesis) id 0MB2G8-1ayNjv3pA4-009xHi for ; Thu, 14 Apr 2016 16:26:53 +0200 From: Florian Harr Content-Type: multipart/alternative; boundary="Apple-Mail=_E0BA9ABB-7689-4507-B940-34AA2DDB3DCC" Subject: Paperless Inline Image Message-Id: Date: Thu, 14 Apr 2016 10:26:36 -0400 To: Florian Harr Mime-Version: 1.0 (Mac OS X Mail 9.3 \(3124\)) X-Mailer: Apple Mail (2.3124) Envelope-To: --Apple-Mail=_E0BA9ABB-7689-4507-B940-34AA2DDB3DCC Content-Transfer-Encoding: 7BIT Content-Type: TEXT/plain; charset=us-ascii The secret word is "paperless" :-) --Apple-Mail=_E0BA9ABB-7689-4507-B940-34AA2DDB3DCC Content-Type: multipart/related; boundary="Apple-Mail=_4D0B5162-526C-4D33-95B0-7037924B5757"; type="text/html" --Apple-Mail=_4D0B5162-526C-4D33-95B0-7037924B5757 Content-Transfer-Encoding: 7BIT Content-Type: TEXT/html; charset=us-ascii
    The secret word is "paperless" :-)

    --Apple-Mail=_4D0B5162-526C-4D33-95B0-7037924B5757 Content-Transfer-Encoding: BASE64 Content-Disposition: inline; filename=screenshot.png Content-Type: IMAGE/png; name=screenshot.png; x-unix-mode=0600 Content-Id: <8536D9B0-0634-4B01-8584-BE7C49F413E3> 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 0lDXS5xzNM2eNvbTxaKM13HAGMUw2PiQfdQqZzoel3UC7HaHeHxmZvNlDKDE3E2fSYzhuhFQWZnN UfvkrtPeCyAj442argPp2wIWBm8hSDJrVMArg9IG1DYDGQAAIABJREFUbzUEiydQ1JZKl6zKJevF knfv3nFzcyMgfbtFG482nq5rWCykjTcXq+iUXKJUAWFEq2RaMdAPntG1eC3XalUXFD6W72o9lcbO 4JtBKYvRHqOLWTtzIcn/PCYM080njX2ngPJRG8tVHK/5GYw6vRHmY8Dpzet0fM5B9u8LHWuRVQRR VOTmke4LKDQKo4WRZrXBKI1Rcj0vNmUcP0qMTm0RKMu4KufcBPx5n/qQyBh471kWF0c3ybzdpP91 cZxMN3UYhnFadJEEWxOCw3uFc+DcXD4r/VduyMk9XRJ64n4fa/6dMr8+BgQ9Ni6ffvb0npxr8CWQ uKoqFguRb0jM3LRvj4Eief9IGqEJDM3Hazn/Mzjl3cfLYD90jLNUwwy85hOix8DJD8VjK5ynfTtv o8c+n4eLSKbSWT/OSrJDLLWX9Yc4qVTxb4W42j/SBqfg7wfDfNhQJYQg24zmW2k/JoN0LUDgcRz/ bayO10WYriP3gTnBnzL6vuc3v/kNZVnyb/7Nv6FpGv72b/+W7XaLMYavv/6axWLBy5cvp7Ydx5Hf /va37Pd7vvjiC1arFe/evePNmzdcX1+z2Wz46U9/ilKKf/fv/p3MB7znzZs3EyiYJCPu7u548+YN T58+5fnz5zjn+Id/+AeGYeCLL75AJAhaLi8vJ3f4qqp48+YN+/2eFy9eYIzhu+++48mTJzx//py2 bfnmm28YhoEf//jHjOPI/f092+1W7jGbDX/7t39L0zRcXFzExb0t//E//ke+/PJL/uW//Jfc3d3x u9/9jmfPnvHq1atpfjMMA7/+9a8ZhoEXL14QgkjmfP311wD86Ec/om1bXr9+Tdd1U1XAzc0NXdex 3W55+fIlm82G29tbfvvb33J1dcVyueTq6or7+3u++eYbnj17xsuXL48A1nOc4xznOMc5/hwjnyPm INt//+///YhEFoKQ07766it+/vOf88knn/DJJ5/w5s2b6b7a9z2/+MUvcM7xV3/1V1RVxfv379nv 93z22Wfs93t+9atf8dlnn/Hs2TO++eYbtNY0jcilffnll9zc3PCLX/yCf/7P/znb7Zarq6tpvvGT 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 --Apple-Mail=_4D0B5162-526C-4D33-95B0-7037924B5757-- --Apple-Mail=_E0BA9ABB-7689-4507-B940-34AA2DDB3DCC-- ================================================ FILE: src/documents/tests/samples/mail.txt ================================================ Return-Path: X-Original-To: sender@mailbox4.mailhost.com Delivered-To: sender@mailbox4.mailhost.com Received: from mx8.mailhost.com (mail8.mailhost.com [75.126.24.68]) by mailbox4.mailhost.com (Postfix) with ESMTP id B62BD5498001 for ; Thu, 4 Feb 2016 22:01:17 +0000 (UTC) Received: from localhost (localhost.localdomain [127.0.0.1]) by mx8.mailhost.com (Postfix) with ESMTP id B41796F190D for ; Thu, 4 Feb 2016 22:01:17 +0000 (UTC) X-Spam-Flag: NO X-Spam-Score: 0 X-Spam-Level: X-Spam-Status: No, score=0 tagged_above=-999 required=3 tests=[RCVD_IN_DNSWL_NONE=-0.0001] Received: from mx8.mailhost.com ([127.0.0.1]) by localhost (mail8.mailhost.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 3cj6d28FXsS3 for ; Thu, 4 Feb 2016 22:01:17 +0000 (UTC) Received: from smtp.mailhost.com (smtp.mailhost.com [74.55.86.74]) by mx8.mailhost.com (Postfix) with ESMTP id 527D76F1529 for ; Thu, 4 Feb 2016 22:01:17 +0000 (UTC) Received: from [10.114.0.19] (nl3x.mullvad.net [46.166.136.162]) by smtp.mailhost.com (Postfix) with ESMTP id 9C52420C6FDA for ; Thu, 4 Feb 2016 22:01:16 +0000 (UTC) To: paperless@example.com From: Daniel Quinn Subject: Test 0 Message-ID: <56B3CA2A.6030806@example.com> Date: Thu, 4 Feb 2016 22:01:14 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------090701020702030809070008" This is a multi-part message in MIME format. --------------090701020702030809070008 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit The secret word is "paperless" :-) --------------090701020702030809070008 Content-Type: application/pdf; name="test0.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="test0.pdf" JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0ZpbHRlci9GbGF0 ZURlY29kZT4+CnN0cmVhbQp4nFWLQQvCMAyF7/kVOQutSdeuHZSA0+3gbVDwIN6c3gR38e/b bF4kkPfyvReyjB94IyFVF7pgG0ze4TLDZYevLamzPKEvEFqbMEZfq+WO+5GRHZbHNROLy+So UfFi6g7/RyusEpUl9VsQxQTlHR2oV3wUEzOdhOnXG1aw/o1yK2cYCkww4RdbUCevCmVuZHN0 cmVhbQplbmRvYmoKCjMgMCBvYmoKMTM5CmVuZG9iagoKNSAwIG9iago8PC9MZW5ndGggNiAw IFIvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aDEgMTA4MjQ+PgpzdHJlYW0KeJzlOWt0G9WZ 95uRbNmWLckPWY4SaRTFedmybI8T4rw8sS3ZiZ1YfqWSCbFkS7YEtiQkJSE8GlNeOQ5pUmh5 Zkt2l+XQNl3GhLaBpcWw0D19UGALLRRS0gM9nD0lxVBK9wCx97tXI0UJAc727L8d+c587/u9 7p0rOZXYEyJaMkV4Io1OBuLOqmqBEPJLQqB0dG9K2NRTsQHhM4Rw/zkWH5+870e7PiRE9Rgh +Y+NT+wf+/b3e4YI0YYJKX41HAoEfxj6vUjIIgltrA0jYef8/nzEr0F8WXgydY2bP7QO8WOI SxOx0cDxxbUmxN9AfOlk4Jr4apWLI8SMKBGigcmQpYXrRBx9KtobjyVTQbJsgZDl91B+PBGK d9838hzipwjhjyIN8EMvLYJ5FOd4lTovX1NQWKQtLtGR/3eX+jCpIJ3qTURH4ux+wcWfIFXk XkIW3qXY+ft898LH/5deaNKPe8hD5DFymLxGrlAYbuIhEbIHKbnX0+QlpNLLQ4bId8n055g9 QU4hPy3nJ0doJJe8PORucpL8xwWzeMgkuQ59+QF5DRrIz7BVYuQD0JAbyXNo9QOkbb+UKa4E b2MMHMuhvk7u5w6RbdzbiNxLOZyT05NnyTHYjZZTGOfhbMQbP2P0NnID3vtJmOxFmF3qTZ/+ jhQs/AWjuoFsI18jW8hEjsaT8ABfiPUbIA9gTp9mNGeGmd/JX8n9kOPO3YnIN8g4jgBg7Nxh fsvnZOh/ffGDpBhW8dWk4FJcrono5j/mGhc+5JeRQjK4MJehLXQt/IUPzEdVw6rF6k2qX3zR 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 Fpt7cad50ChWDBpAN6gXdYMcYKFFMujULeg4nW5Yd0DH60gL4aaMoIZTcHRmoL+mputU/kJf l6zxXC7DQbm6n96l3iE576BMBocu984AfN13y+HDpHVJl9zY75X9S3xdchABiQJTCOiXzBhJ qy+ZTNWwC2pqEN6Dd1KzpwaJu5NpKsnySU0SkrhHJZkS1FCBNA54r6E8JFA9QO3dSUJvlFmT VqLaScUcU07fGGDa/T/LhW2oCmVuZHN0cmVhbQplbmRvYmoKCjYgMCBvYmoKNjI5MQplbmRv YmoKCjcgMCBvYmoKPDwvVHlwZS9Gb250RGVzY3JpcHRvci9Gb250TmFtZS9CQUFBQUErTGli ZXJhdGlvblNlcmlmCi9GbGFncyA0Ci9Gb250QkJveFstNTQzIC0zMDMgMTI3NyA5ODFdL0l0 YWxpY0FuZ2xlIDAKL0FzY2VudCA4OTEKL0Rlc2NlbnQgLTIxNgovQ2FwSGVpZ2h0IDk4MQov U3RlbVYgODAKL0ZvbnRGaWxlMiA1IDAgUgo+PgplbmRvYmoKCjggMCBvYmoKPDwvTGVuZ3Ro IDI5Mi9GaWx0ZXIvRmxhdGVEZWNvZGU+PgpzdHJlYW0KeJxdkctuwyAQRfd8Bct0EfmROA/J spQmseRFH6rbD3BgnCLVGGGy8N+XmUlbqQvQmZl7BxiSY3NqrAnJqx9VC0H2xmoP03jzCuQF rsaKLJfaqHCPaFdD50QSve08BRga249lKZK3WJuCn+XioMcLPIjkxWvwxl7l4uPYxri9OfcF A9ggU1FVUkMf+zx17rkbICHXstGxbMK8jJY/wfvsQOYUZ3wVNWqYXKfAd/YKokzTSpZ1XQmw +l8tK9hy6dVn56M0i9I0LdZV5Jx4s0NeMe+R18TbFXJBnKfIG9ZkyFvWUJ8d5wvkPTPlD8w1 8iMz9Tyyl/Qnzp+Qz8xn5JrPPdOj7rfH5+H8f8Ym1c37ODL6JJoVTslY+P1HNzp00foG7l+O gwplbmRzdHJlYW0KZW5kb2JqCgo5IDAgb2JqCjw8L1R5cGUvRm9udC9TdWJ0eXBlL1RydWVU eXBlL0Jhc2VGb250L0JBQUFBQStMaWJlcmF0aW9uU2VyaWYKL0ZpcnN0Q2hhciAwCi9MYXN0 Q2hhciAxNQovV2lkdGhzWzc3NyA2MTAgNTAwIDI3NyAzODkgMjUwIDQ0MyAyNzcgNDQzIDUw MCA1MDAgNDQzIDUwMCA3NzcgNTAwIDI1MApdCi9Gb250RGVzY3JpcHRvciA3IDAgUgovVG9V bmljb2RlIDggMCBSCj4+CmVuZG9iagoKMTAgMCBvYmoKPDwvRjEgOSAwIFIKPj4KZW5kb2Jq CgoxMSAwIG9iago8PC9Gb250IDEwIDAgUgovUHJvY1NldFsvUERGL1RleHRdCj4+CmVuZG9i agoKMSAwIG9iago8PC9UeXBlL1BhZ2UvUGFyZW50IDQgMCBSL1Jlc291cmNlcyAxMSAwIFIv TWVkaWFCb3hbMCAwIDU5NSA4NDJdL0dyb3VwPDwvUy9UcmFuc3BhcmVuY3kvQ1MvRGV2aWNl UkdCL0kgdHJ1ZT4+L0NvbnRlbnRzIDIgMCBSPj4KZW5kb2JqCgo0IDAgb2JqCjw8L1R5cGUv UGFnZXMKL1Jlc291cmNlcyAxMSAwIFIKL01lZGlhQm94WyAwIDAgNTk1IDg0MiBdCi9LaWRz WyAxIDAgUiBdCi9Db3VudCAxPj4KZW5kb2JqCgoxMiAwIG9iago8PC9UeXBlL0NhdGFsb2cv UGFnZXMgNCAwIFIKL09wZW5BY3Rpb25bMSAwIFIgL1hZWiBudWxsIG51bGwgMF0KL0xhbmco ZW4tR0IpCj4+CmVuZG9iagoKMTMgMCBvYmoKPDwvQ3JlYXRvcjxGRUZGMDA1NzAwNzIwMDY5 MDA3NDAwNjUwMDcyPgovUHJvZHVjZXI8RkVGRjAwNEMwMDY5MDA2MjAwNzIwMDY1MDA0RjAw NjYwMDY2MDA2OTAwNjMwMDY1MDAyMDAwMzUwMDJFMDAzMD4KL0NyZWF0aW9uRGF0ZShEOjIw MTYwMjA0MjIwMDAyWicpPj4KZW5kb2JqCgp4cmVmCjAgMTQKMDAwMDAwMDAwMCA2NTUzNSBm IAowMDAwMDA3NTA5IDAwMDAwIG4gCjAwMDAwMDAwMTkgMDAwMDAgbiAKMDAwMDAwMDIyOSAw MDAwMCBuIAowMDAwMDA3NjUyIDAwMDAwIG4gCjAwMDAwMDAyNDkgMDAwMDAgbiAKMDAwMDAw NjYyNSAwMDAwMCBuIAowMDAwMDA2NjQ2IDAwMDAwIG4gCjAwMDAwMDY4NDEgMDAwMDAgbiAK MDAwMDAwNzIwMiAwMDAwMCBuIAowMDAwMDA3NDIyIDAwMDAwIG4gCjAwMDAwMDc0NTQgMDAw MDAgbiAKMDAwMDAwNzc1MSAwMDAwMCBuIAowMDAwMDA3ODQ4IDAwMDAwIG4gCnRyYWlsZXIK PDwvU2l6ZSAxNC9Sb290IDEyIDAgUgovSW5mbyAxMyAwIFIKL0lEIFsgPDRFN0ZCMEZCMjA4 ODBCNURBQkIzQTNEOTQxNDlBRTQ3Pgo8NEU3RkIwRkIyMDg4MEI1REFCQjNBM0Q5NDE0OUFF NDc+IF0KL0RvY0NoZWNrc3VtIC8yQTY0RDMzNzRFQTVEODMwNTRDNEI2RDFEMUY4QzU1RQo+ PgpzdGFydHhyZWYKODAxOAolJUVPRgo= --------------090701020702030809070008-- ================================================ FILE: src/documents/tests/test_checks.py ================================================ import unittest from django.test import TestCase from ..checks import changed_password_check from ..models import Document from .factories import DocumentFactory class ChecksTestCase(TestCase): def test_changed_password_check_empty_db(self): self.assertEqual(changed_password_check(None), []) def test_changed_password_check_no_encryption(self): DocumentFactory.create(storage_type=Document.STORAGE_TYPE_UNENCRYPTED) self.assertEqual(changed_password_check(None), []) @unittest.skip("I don't know how to test this") def test_changed_password_check_gpg_encryption_with_good_password(self): pass @unittest.skip("I don't know how to test this") def test_changed_password_check_fail(self): pass ================================================ FILE: src/documents/tests/test_consumer.py ================================================ import re import os import shutil from django.conf import settings from django.test import TestCase, override_settings from tempfile import TemporaryDirectory from unittest import mock from ..consumer import Consumer from ..models import FileInfo, Tag class TestConsumer(TestCase): SAMPLE_FILES = os.path.join(os.path.dirname(__file__), "samples") def setUp(self): self.storage = TemporaryDirectory() os.makedirs(os.path.join(self.storage.name, "documents", "originals"), exist_ok=True) os.makedirs(os.path.join(self.storage.name, "documents", "thumbnails"), exist_ok=True) self.storage_override = override_settings(MEDIA_ROOT=self.storage.name) self.storage_override.enable() self.tmpdir = TemporaryDirectory() self.tmpdir_override = override_settings( CONVERT_TMPDIR=self.tmpdir.name) self.tmpdir_override.enable() self.scratchdir = TemporaryDirectory() self.scratchdir_override = override_settings( SCRATCH_DIR=self.scratchdir.name) self.scratchdir_override.enable() self.consumptiondir = TemporaryDirectory() self.consumptiondir_override = override_settings( CONSUMPTION_DIR=self.consumptiondir.name) self.consumptiondir_override.enable() def tearDown(self): self.storage.cleanup() self.storage_override.disable() self.tmpdir.cleanup() self.tmpdir_override.disable() self.scratchdir.cleanup() self.scratchdir_override.disable() self.consumptiondir.cleanup() self.consumptiondir_override.disable() @override_settings(PAPERLESS_FILENAME_FORMAT="{correspondent}/{title}") def test_file_consumption(self): myConsumer = Consumer(consume=settings.CONSUMPTION_DIR, scratch=settings.SCRATCH_DIR) # Put sample document into consumption folder shutil.copyfile(os.path.join(self.SAMPLE_FILES, "letter.pdf"), os.path.join(settings.CONSUMPTION_DIR, "letter.pdf")) myConsumer.consume_new_files() # Check if consumed file has been stored correctly self.assertEqual(os.path.isfile(os.path.join( settings.MEDIA_ROOT, "documents", "originals", "none", "letter-0000001.pdf.gpg")), True) @override_settings(PAPERLESS_FILENAME_FORMAT="{correspondent}/dummy") def test_duplicate_file_consumption(self): myConsumer = Consumer(consume=settings.CONSUMPTION_DIR, scratch=settings.SCRATCH_DIR) # Put sample document into consumption folder shutil.copyfile(os.path.join(self.SAMPLE_FILES, "letter.pdf"), os.path.join(settings.CONSUMPTION_DIR, "letter.pdf")) shutil.copyfile(os.path.join(self.SAMPLE_FILES, "letter.pdf"), os.path.join(settings.CONSUMPTION_DIR, "letter2.pdf")) myConsumer.consume_new_files() # Check if consumed file has been stored correctly self.assertEqual(os.path.isfile(os.path.join( settings.MEDIA_ROOT, "documents", "originals", "none", "dummy-0000001.pdf.gpg")), True) self.assertEqual(os.path.isfile(os.path.join( settings.MEDIA_ROOT, "documents", "originals", "none", "dummy-0000002.pdf.gpg")), False) class DummyParser(object): pass def test__get_parser_class_1_parser(self): self.assertEqual( self._get_consumer()._get_parser_class("doc.pdf"), self.DummyParser ) @mock.patch("documents.consumer.os.makedirs") @mock.patch("documents.consumer.os.path.exists", return_value=True) @mock.patch("documents.consumer.document_consumer_declaration.send") def test__get_parser_class_n_parsers(self, m, *args): class DummyParser1(object): pass class DummyParser2(object): pass m.return_value = ( (None, lambda _: {"weight": 0, "parser": DummyParser1}), (None, lambda _: {"weight": 1, "parser": DummyParser2}), ) with TemporaryDirectory() as tmpdir: self.assertEqual( Consumer(consume=tmpdir)._get_parser_class("doc.pdf"), DummyParser2 ) @mock.patch("documents.consumer.os.makedirs") @mock.patch("documents.consumer.os.path.exists", return_value=True) @mock.patch("documents.consumer.document_consumer_declaration.send") def test__get_parser_class_0_parsers(self, m, *args): m.return_value = ((None, lambda _: None),) with TemporaryDirectory() as tmpdir: self.assertIsNone( Consumer(consume=tmpdir)._get_parser_class("doc.pdf") ) @mock.patch("documents.consumer.os.makedirs") @mock.patch("documents.consumer.os.path.exists", return_value=True) @mock.patch("documents.consumer.document_consumer_declaration.send") def _get_consumer(self, m, *args): m.return_value = ( (None, lambda _: {"weight": 0, "parser": self.DummyParser}), ) with TemporaryDirectory() as tmpdir: return Consumer(consume=tmpdir) class TestAttributes(TestCase): TAGS = ("tag1", "tag2", "tag3") EXTENSIONS = ( "pdf", "png", "jpg", "jpeg", "gif", "tiff", "tif", "PDF", "PNG", "JPG", "JPEG", "GIF", "TIFF", "TIF", "PdF", "PnG", "JpG", "JPeG", "GiF", "TiFf", "TiF", ) def _test_guess_attributes_from_name(self, path, sender, title, tags): for extension in self.EXTENSIONS: f = path.format(extension) file_info = FileInfo.from_path(f) if sender: self.assertEqual(file_info.correspondent.name, sender, f) else: self.assertIsNone(file_info.correspondent, f) self.assertEqual(file_info.title, title, f) self.assertEqual(tuple([t.slug for t in file_info.tags]), tags, f) if extension.lower() == "jpeg": self.assertEqual(file_info.extension, "jpg", f) elif extension.lower() == "tif": self.assertEqual(file_info.extension, "tiff", f) else: self.assertEqual(file_info.extension, extension.lower(), f) def test_guess_attributes_from_name0(self): self._test_guess_attributes_from_name( "/path/to/Sender - Title.{}", "Sender", "Title", ()) def test_guess_attributes_from_name1(self): self._test_guess_attributes_from_name( "/path/to/Spaced Sender - Title.{}", "Spaced Sender", "Title", ()) def test_guess_attributes_from_name2(self): self._test_guess_attributes_from_name( "/path/to/Sender - Spaced Title.{}", "Sender", "Spaced Title", ()) def test_guess_attributes_from_name3(self): self._test_guess_attributes_from_name( "/path/to/Dashed-Sender - Title.{}", "Dashed-Sender", "Title", ()) def test_guess_attributes_from_name4(self): self._test_guess_attributes_from_name( "/path/to/Sender - Dashed-Title.{}", "Sender", "Dashed-Title", ()) def test_guess_attributes_from_name5(self): self._test_guess_attributes_from_name( "/path/to/Sender - Title - tag1,tag2,tag3.{}", "Sender", "Title", self.TAGS ) def test_guess_attributes_from_name6(self): self._test_guess_attributes_from_name( "/path/to/Spaced Sender - Title - tag1,tag2,tag3.{}", "Spaced Sender", "Title", self.TAGS ) def test_guess_attributes_from_name7(self): self._test_guess_attributes_from_name( "/path/to/Sender - Spaced Title - tag1,tag2,tag3.{}", "Sender", "Spaced Title", self.TAGS ) def test_guess_attributes_from_name8(self): self._test_guess_attributes_from_name( "/path/to/Dashed-Sender - Title - tag1,tag2,tag3.{}", "Dashed-Sender", "Title", self.TAGS ) def test_guess_attributes_from_name9(self): self._test_guess_attributes_from_name( "/path/to/Sender - Dashed-Title - tag1,tag2,tag3.{}", "Sender", "Dashed-Title", self.TAGS ) def test_guess_attributes_from_name10(self): self._test_guess_attributes_from_name( "/path/to/Σενδερ - Τιτλε - tag1,tag2,tag3.{}", "Σενδερ", "Τιτλε", self.TAGS ) def test_guess_attributes_from_name_when_correspondent_empty(self): self._test_guess_attributes_from_name( '/path/to/ - weird empty correspondent but should not break.{}', None, 'weird empty correspondent but should not break', () ) def test_guess_attributes_from_name_when_title_starts_with_dash(self): self._test_guess_attributes_from_name( '/path/to/- weird but should not break.{}', None, '- weird but should not break', () ) def test_guess_attributes_from_name_when_title_ends_with_dash(self): self._test_guess_attributes_from_name( '/path/to/weird but should not break -.{}', None, 'weird but should not break -', () ) def test_guess_attributes_from_name_when_title_is_empty(self): self._test_guess_attributes_from_name( '/path/to/weird correspondent but should not break - .{}', 'weird correspondent but should not break', '', () ) def test_case_insensitive_tag_creation(self): """ Tags should be detected and created as lower case. :return: """ path = "Title - Correspondent - tAg1,TAG2.pdf" self.assertEqual(len(FileInfo.from_path(path).tags), 2) path = "Title - Correspondent - tag1,tag2.pdf" self.assertEqual(len(FileInfo.from_path(path).tags), 2) self.assertEqual(Tag.objects.all().count(), 2) class TestFieldPermutations(TestCase): valid_dates = ( "20150102030405Z", "20150102Z", ) valid_correspondents = [ "timmy", "Dr. McWheelie", "Dash Gor-don", "ο Θερμαστής", "" ] valid_titles = ["title", "Title w Spaces", "Title a-dash", "Τίτλος", ""] valid_tags = ["tag", "tig,tag", "tag1,tag2,tag-3"] valid_extensions = ["pdf", "png", "jpg", "jpeg", "gif"] def _test_guessed_attributes(self, filename, created=None, correspondent=None, title=None, extension=None, tags=None): info = FileInfo.from_path(filename) # Created if created is None: self.assertIsNone(info.created, filename) else: self.assertEqual(info.created.year, int(created[:4]), filename) self.assertEqual(info.created.month, int(created[4:6]), filename) self.assertEqual(info.created.day, int(created[6:8]), filename) # Correspondent if correspondent: self.assertEqual(info.correspondent.name, correspondent, filename) else: self.assertEqual(info.correspondent, None, filename) # Title self.assertEqual(info.title, title, filename) # Tags if tags is None: self.assertEqual(info.tags, (), filename) else: self.assertEqual( [t.slug for t in info.tags], tags.split(','), filename ) # Extension if extension == 'jpeg': extension = 'jpg' self.assertEqual(info.extension, extension, filename) def test_just_title(self): template = '/path/to/{title}.{extension}' for title in self.valid_titles: for extension in self.valid_extensions: spec = dict(title=title, extension=extension) filename = template.format(**spec) self._test_guessed_attributes(filename, **spec) def test_title_and_correspondent(self): template = '/path/to/{correspondent} - {title}.{extension}' for correspondent in self.valid_correspondents: for title in self.valid_titles: for extension in self.valid_extensions: spec = dict(correspondent=correspondent, title=title, extension=extension) filename = template.format(**spec) self._test_guessed_attributes(filename, **spec) def test_title_and_correspondent_and_tags(self): template = '/path/to/{correspondent} - {title} - {tags}.{extension}' for correspondent in self.valid_correspondents: for title in self.valid_titles: for tags in self.valid_tags: for extension in self.valid_extensions: spec = dict(correspondent=correspondent, title=title, tags=tags, extension=extension) filename = template.format(**spec) self._test_guessed_attributes(filename, **spec) def test_created_and_correspondent_and_title_and_tags(self): template = ( "/path/to/{created} - " "{correspondent} - " "{title} - " "{tags}" ".{extension}" ) for created in self.valid_dates: for correspondent in self.valid_correspondents: for title in self.valid_titles: for tags in self.valid_tags: for extension in self.valid_extensions: spec = { "created": created, "correspondent": correspondent, "title": title, "tags": tags, "extension": extension } self._test_guessed_attributes( template.format(**spec), **spec) def test_created_and_correspondent_and_title(self): template = "/path/to/{created} - {correspondent} - {title}.{extension}" for created in self.valid_dates: for correspondent in self.valid_correspondents: for title in self.valid_titles: # Skip cases where title looks like a tag as we can't # accommodate such cases. if title.lower() == title: continue for extension in self.valid_extensions: spec = { "created": created, "correspondent": correspondent, "title": title, "extension": extension } self._test_guessed_attributes( template.format(**spec), **spec) def test_created_and_title(self): template = "/path/to/{created} - {title}.{extension}" for created in self.valid_dates: for title in self.valid_titles: for extension in self.valid_extensions: spec = { "created": created, "title": title, "extension": extension } self._test_guessed_attributes( template.format(**spec), **spec) def test_created_and_title_and_tags(self): template = "/path/to/{created} - {title} - {tags}.{extension}" for created in self.valid_dates: for title in self.valid_titles: for tags in self.valid_tags: for extension in self.valid_extensions: spec = { "created": created, "title": title, "tags": tags, "extension": extension } self._test_guessed_attributes( template.format(**spec), **spec) def test_invalid_date_format(self): info = FileInfo.from_path("/path/to/06112017Z - title.pdf") self.assertEqual(info.title, "title") self.assertIsNone(info.created) def test_filename_parse_transforms(self): path = "/some/path/to/tag1,tag2_20190908_180610_0001.pdf" all_patt = re.compile("^.*$") none_patt = re.compile("$a") exact_patt = re.compile("^([a-z0-9,]+)_(\\d{8})_(\\d{6})_([0-9]+)\\.") repl1 = " - \\4 - \\1." # (empty) corrspondent, title and tags repl2 = "\\2Z - " + repl1 # creation date + repl1 # No transformations configured (= default) info = FileInfo.from_path(path) self.assertEqual(info.title, "tag1,tag2_20190908_180610_0001") self.assertEqual(info.extension, "pdf") self.assertEqual(info.tags, ()) self.assertIsNone(info.created) # Pattern doesn't match (filename unaltered) with self.settings( FILENAME_PARSE_TRANSFORMS=[(none_patt, "none.gif")]): info = FileInfo.from_path(path) self.assertEqual(info.title, "tag1,tag2_20190908_180610_0001") self.assertEqual(info.extension, "pdf") # Simple transformation (match all) with self.settings( FILENAME_PARSE_TRANSFORMS=[(all_patt, "all.gif")]): info = FileInfo.from_path(path) self.assertEqual(info.title, "all") self.assertEqual(info.extension, "gif") # Multiple transformations configured (first pattern matches) with self.settings( FILENAME_PARSE_TRANSFORMS=[ (all_patt, "all.gif"), (all_patt, "anotherall.gif")]): info = FileInfo.from_path(path) self.assertEqual(info.title, "all") self.assertEqual(info.extension, "gif") # Multiple transformations configured (second pattern matches) with self.settings( FILENAME_PARSE_TRANSFORMS=[ (none_patt, "none.gif"), (all_patt, "anotherall.gif")]): info = FileInfo.from_path(path) self.assertEqual(info.title, "anotherall") self.assertEqual(info.extension, "gif") # Complex transformation without date in replacement string with self.settings( FILENAME_PARSE_TRANSFORMS=[(exact_patt, repl1)]): info = FileInfo.from_path(path) self.assertEqual(info.title, "0001") self.assertEqual(info.extension, "pdf") self.assertEqual(len(info.tags), 2) self.assertEqual(info.tags[0].slug, "tag1") self.assertEqual(info.tags[1].slug, "tag2") self.assertIsNone(info.created) # Complex transformation with date in replacement string with self.settings( FILENAME_PARSE_TRANSFORMS=[ (none_patt, "none.gif"), (exact_patt, repl2), # <-- matches (exact_patt, repl1), (all_patt, "all.gif")]): info = FileInfo.from_path(path) self.assertEqual(info.title, "0001") self.assertEqual(info.extension, "pdf") self.assertEqual(len(info.tags), 2) self.assertEqual(info.tags[0].slug, "tag1") self.assertEqual(info.tags[1].slug, "tag2") self.assertEqual(info.created.year, 2019) self.assertEqual(info.created.month, 9) self.assertEqual(info.created.day, 8) ================================================ FILE: src/documents/tests/test_document_model.py ================================================ from unittest import mock from django.test import TestCase from ..models import Document, Correspondent class TestDocument(TestCase): def test_file_deletion(self): document = Document.objects.create( correspondent=Correspondent.objects.create(name="Test0"), title="Title", content="content", checksum="checksum", ) file_path = document.source_path thumb_path = document.thumbnail_path with mock.patch("documents.signals.handlers.os.unlink") as mock_unlink: document.delete() mock_unlink.assert_any_call(file_path) mock_unlink.assert_any_call(thumb_path) self.assertEqual(mock_unlink.call_count, 2) ================================================ FILE: src/documents/tests/test_file_handling.py ================================================ import datetime import os from dateutil import tz from django.conf import settings from django.test import TestCase, override_settings from django.utils.text import slugify from pathlib import Path from tempfile import TemporaryDirectory from unittest import mock from ..models import Tag, Document, Correspondent class TestDate(TestCase): def setUp(self): self.storage = TemporaryDirectory() os.makedirs(os.path.join(self.storage.name, "documents", "originals"), exist_ok=True) os.makedirs(os.path.join(self.storage.name, "documents", "thumbnails"), exist_ok=True) self.storage_override = override_settings(MEDIA_ROOT=self.storage.name) self.storage_override.enable() def tearDown(self): self.storage.cleanup() self.storage_override.disable() @override_settings(PAPERLESS_FILENAME_FORMAT="") def test_source_filename(self): document = Document() document.file_type = "pdf" document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED document.save() self.assertEqual(document.source_filename, "0000001.pdf") document.filename = "test.pdf" self.assertEqual(document.source_filename, "test.pdf") @override_settings(PAPERLESS_FILENAME_FORMAT="") def test_generate_source_filename(self): document = Document() document.file_type = "pdf" document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED document.save() self.assertEqual(document.generate_source_filename(), "0000001.pdf") document.storage_type = Document.STORAGE_TYPE_GPG self.assertEqual(document.generate_source_filename(), "0000001.pdf.gpg") @override_settings(PAPERLESS_FILENAME_FORMAT="{correspondent}/" + "{correspondent}") def test_file_renaming(self): document = Document() document.file_type = "pdf" document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED document.save() # Ensure that filename is properly generated self.assertEqual(document.generate_source_filename(), "none/none-0000001.pdf") document.create_source_directory() Path(document.source_path).touch() # Test source_path self.assertEqual(document.source_path, settings.MEDIA_ROOT + "/documents/originals/none/none-0000001.pdf") # Enable encryption and check again document.storage_type = Document.STORAGE_TYPE_GPG self.assertEqual(document.generate_source_filename(), "none/none-0000001.pdf.gpg") document.save() self.assertEqual(os.path.isdir(settings.MEDIA_ROOT + "/documents/originals/none"), True) # Set a correspondent and save the document document.correspondent = Correspondent.objects.get_or_create( name="test")[0] document.save() # Check proper handling of files self.assertEqual(os.path.isdir(settings.MEDIA_ROOT + "/documents/originals/test"), True) self.assertEqual(os.path.isdir(settings.MEDIA_ROOT + "/documents/originals/none"), False) self.assertEqual(os.path.isfile(settings.MEDIA_ROOT + "/documents/" + "originals/test/test-0000001.pdf.gpg"), True) self.assertEqual(document.generate_source_filename(), "test/test-0000001.pdf.gpg") @override_settings(PAPERLESS_FILENAME_FORMAT="{correspondent}/" + "{correspondent}") def test_file_renaming_missing_permissions(self): document = Document() document.file_type = "pdf" document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED document.save() # Ensure that filename is properly generated self.assertEqual(document.generate_source_filename(), "none/none-0000001.pdf") document.create_source_directory() Path(document.source_path).touch() # Test source_path self.assertEqual(document.source_path, settings.MEDIA_ROOT + "/documents/originals/none/none-0000001.pdf") # Make the folder read- and execute-only (no writing and no renaming) os.chmod(settings.MEDIA_ROOT + "/documents/originals/none", 0o555) # Set a correspondent and save the document document.correspondent = Correspondent.objects.get_or_create( name="test")[0] document.save() # Check proper handling of files self.assertEqual(os.path.isfile(settings.MEDIA_ROOT + "/documents/" + "originals/none/none-0000001.pdf"), True) self.assertEqual(document.source_filename, "none/none-0000001.pdf") os.chmod(settings.MEDIA_ROOT + "/documents/originals/none", 0o777) @override_settings(PAPERLESS_FILENAME_FORMAT="{correspondent}/" + "{correspondent}") def test_document_delete(self): document = Document() document.file_type = "pdf" document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED document.save() # Ensure that filename is properly generated self.assertEqual(document.generate_source_filename(), "none/none-0000001.pdf") document.create_source_directory() Path(document.source_path).touch() # Ensure file deletion after delete document.delete() self.assertEqual(os.path.isfile(settings.MEDIA_ROOT + "/documents/originals/none/none-0000001.pdf"), False) self.assertEqual(os.path.isdir(settings.MEDIA_ROOT + "/documents/originals/none"), False) @override_settings(PAPERLESS_FILENAME_FORMAT="{correspondent}/" + "{correspondent}") def test_document_delete_nofile(self): document = Document() document.file_type = "pdf" document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED document.save() document.delete() @override_settings(PAPERLESS_FILENAME_FORMAT="{correspondent}/" + "{correspondent}") def test_directory_not_empty(self): document = Document() document.file_type = "pdf" document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED document.save() # Ensure that filename is properly generated self.assertEqual(document.generate_source_filename(), "none/none-0000001.pdf") document.create_source_directory() Path(document.source_path).touch() Path(document.source_path + "test").touch() # Set a correspondent and save the document document.correspondent = Correspondent.objects.get_or_create( name="test")[0] document.save() # Check proper handling of files self.assertEqual(os.path.isdir(settings.MEDIA_ROOT + "/documents/originals/test"), True) self.assertEqual(os.path.isdir(settings.MEDIA_ROOT + "/documents/originals/none"), True) # Cleanup os.remove(settings.MEDIA_ROOT + "/documents/originals/none/none-0000001.pdftest") os.rmdir(settings.MEDIA_ROOT + "/documents/originals/none") @override_settings(PAPERLESS_FILENAME_FORMAT="{tags[type]}") def test_tags_with_underscore(self): document = Document() document.file_type = "pdf" document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED document.save() # Add tag to document document.tags.create(name="type_demo") document.tags.create(name="foo_bar") document.save() # Ensure that filename is properly generated self.assertEqual(document.generate_source_filename(), "demo-0000001.pdf") document.create_source_directory() Path(document.source_path).touch() document.delete() @override_settings(PAPERLESS_FILENAME_FORMAT="{tags[type]}") def test_tags_with_dash(self): document = Document() document.file_type = "pdf" document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED document.save() # Add tag to document document.tags.create(name="type-demo") document.tags.create(name="foo-bar") document.save() # Ensure that filename is properly generated self.assertEqual(document.generate_source_filename(), "demo-0000001.pdf") document.create_source_directory() Path(document.source_path).touch() document.delete() @override_settings(PAPERLESS_FILENAME_FORMAT="{tags[type]}") def test_tags_malformed(self): document = Document() document.file_type = "pdf" document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED document.save() # Add tag to document document.tags.create(name="type:demo") document.tags.create(name="foo:bar") document.save() # Ensure that filename is properly generated self.assertEqual(document.generate_source_filename(), "none-0000001.pdf") document.create_source_directory() Path(document.source_path).touch() document.delete() @override_settings(PAPERLESS_FILENAME_FORMAT="{tags[0]}") def test_tags_all(self): document = Document() document.file_type = "pdf" document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED document.save() # Add tag to document document.tags.create(name="demo") document.save() # Ensure that filename is properly generated self.assertEqual(document.generate_source_filename(), "demo-0000001.pdf") document.create_source_directory() Path(document.source_path).touch() document.delete() @override_settings(PAPERLESS_FILENAME_FORMAT="{tags[0]}") def test_tags_out_of_bounds_0(self): document = Document() document.file_type = "pdf" document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED document.save() # Ensure that filename is properly generated self.assertEqual(document.generate_source_filename(), "none-0000001.pdf") document.create_source_directory() Path(document.source_path).touch() document.delete() @override_settings(PAPERLESS_FILENAME_FORMAT="{tags[10000000]}") def test_tags_out_of_bounds_10000000(self): document = Document() document.file_type = "pdf" document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED document.save() # Ensure that filename is properly generated self.assertEqual(document.generate_source_filename(), "none-0000001.pdf") document.create_source_directory() Path(document.source_path).touch() document.delete() @override_settings(PAPERLESS_FILENAME_FORMAT="{tags[99]}") def test_tags_out_of_bounds_99(self): document = Document() document.file_type = "pdf" document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED document.save() # Ensure that filename is properly generated self.assertEqual(document.generate_source_filename(), "none-0000001.pdf") document.create_source_directory() Path(document.source_path).touch() document.delete() @override_settings(PAPERLESS_FILENAME_FORMAT="{correspondent}/" + "{correspondent}/{correspondent}") def test_nested_directory_cleanup(self): document = Document() document.file_type = "pdf" document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED document.save() # Ensure that filename is properly generated self.assertEqual(document.generate_source_filename(), "none/none/none-0000001.pdf") document.create_source_directory() Path(document.source_path).touch() # Check proper handling of files self.assertEqual(os.path.isdir(settings.MEDIA_ROOT + "/documents/originals/none/none"), True) document.delete() self.assertEqual(os.path.isfile(settings.MEDIA_ROOT + "/documents/originals/none/none/none-0000001.pdf"), False) self.assertEqual(os.path.isdir(settings.MEDIA_ROOT + "/documents/originals/none/none"), False) self.assertEqual(os.path.isdir(settings.MEDIA_ROOT + "/documents/originals/none"), False) self.assertEqual(os.path.isdir(settings.MEDIA_ROOT + "/documents/originals"), True) @override_settings(PAPERLESS_FILENAME_FORMAT=None) def test_format_none(self): document = Document() document.file_type = "pdf" document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED document.save() self.assertEqual(document.generate_source_filename(), "0000001.pdf") @override_settings(PAPERLESS_FILENAME_FORMAT="{correspondent}/" + "{correspondent}") def test_document_renamed(self): document = Document() document.file_type = "pdf" document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED document.save() # Ensure that filename is properly generated self.assertEqual(document.generate_source_filename(), "none/none-0000001.pdf") document.create_source_directory() Path(document.source_path).touch() # Test source_path self.assertEqual(document.source_path, settings.MEDIA_ROOT + "/documents/originals/none/none-0000001.pdf") # Rename the document "illegaly" os.makedirs(settings.MEDIA_ROOT + "/documents/originals/test") os.rename(settings.MEDIA_ROOT + "/documents/originals/" + "none/none-0000001.pdf", settings.MEDIA_ROOT + "/documents/originals/" + "test/test-0000001.pdf") self.assertEqual(os.path.isfile(settings.MEDIA_ROOT + "/documents/" + "originals/test/test-0000001.pdf"), True) self.assertEqual(os.path.isfile(settings.MEDIA_ROOT + "/documents/" + "originals/none/none-0000001.pdf"), False) # Set new correspondent and expect document to be saved properly document.correspondent = Correspondent.objects.get_or_create( name="foo")[0] document.save() self.assertEqual(os.path.isfile(settings.MEDIA_ROOT + "/documents/" + "originals/foo/foo-0000001.pdf"), True) # Check proper handling of files self.assertEqual(os.path.isdir(settings.MEDIA_ROOT + "/documents/originals/foo"), True) self.assertEqual(os.path.isdir(settings.MEDIA_ROOT + "/documents/originals/none"), False) self.assertEqual(os.path.isdir(settings.MEDIA_ROOT + "/documents/originals/test"), False) self.assertEqual(document.generate_source_filename(), "foo/foo-0000001.pdf") @override_settings(PAPERLESS_FILENAME_FORMAT="{correspondent}/" + "{correspondent}") def test_document_renamed_encrypted(self): document = Document() document.file_type = "pdf" document.storage_type = Document.STORAGE_TYPE_GPG document.save() # Ensure that filename is properly generated self.assertEqual(document.generate_source_filename(), "none/none-0000001.pdf.gpg") document.create_source_directory() Path(document.source_path).touch() # Test source_path self.assertEqual(document.source_path, settings.MEDIA_ROOT + "/documents/originals/none/none-0000001.pdf.gpg") # Rename the document "illegaly" os.makedirs(settings.MEDIA_ROOT + "/documents/originals/test") os.rename(settings.MEDIA_ROOT + "/documents/originals/" + "none/none-0000001.pdf.gpg", settings.MEDIA_ROOT + "/documents/originals/" + "test/test-0000001.pdf.gpg") self.assertEqual(os.path.isfile(settings.MEDIA_ROOT + "/documents/" + "originals/test/test-0000001.pdf.gpg"), True) self.assertEqual(os.path.isfile(settings.MEDIA_ROOT + "/documents/" + "originals/none/none-0000001.pdf"), False) # Set new correspondent and expect document to be saved properly document.correspondent = Correspondent.objects.get_or_create( name="foo")[0] document.save() self.assertEqual(os.path.isfile(settings.MEDIA_ROOT + "/documents/" + "originals/foo/foo-0000001.pdf.gpg"), True) # Check proper handling of files self.assertEqual(os.path.isdir(settings.MEDIA_ROOT + "/documents/originals/foo"), True) self.assertEqual(os.path.isdir(settings.MEDIA_ROOT + "/documents/originals/none"), False) self.assertEqual(os.path.isdir(settings.MEDIA_ROOT + "/documents/originals/test"), False) self.assertEqual(document.generate_source_filename(), "foo/foo-0000001.pdf.gpg") def test_delete_all_empty_subdirectories(self): # Create our working directory tmp = TemporaryDirectory() os.makedirs(os.path.join(tmp.name, "empty")) os.makedirs(os.path.join(tmp.name, "empty", "subdirectory")) os.makedirs(os.path.join(tmp.name, "notempty")) Path(os.path.join(tmp.name, "notempty", "file")).touch() Document.delete_all_empty_subdirectories(tmp.name) self.assertEqual(os.path.isdir( os.path.join(tmp.name, "notempty")), True) self.assertEqual(os.path.isdir(os.path.join(tmp.name, "empty")), False) self.assertEqual(os.path.isfile( os.path.join(tmp.name, "notempty", "file")), True) tmp.cleanup() def test_try_delete_empty_directories(self): # Create our working directory tmp = TemporaryDirectory() os.makedirs(os.path.join(tmp.name, "notempty")) Path(os.path.join(tmp.name, "notempty", "file")).touch() os.makedirs(os.path.join(tmp.name, "notempty", "empty")) Document.try_delete_empty_directories( os.path.join(tmp.name, "notempty", "empty")) self.assertEqual(os.path.isdir( os.path.join(tmp.name, "notempty")), True) self.assertEqual(os.path.isfile( os.path.join(tmp.name, "notempty", "file")), True) self.assertEqual(os.path.isdir( os.path.join(tmp.name, "notempty", "empty")), False) tmp.cleanup() @override_settings(PAPERLESS_FILENAME_FORMAT="{correspondent}/" + "{correspondent}") def test_document_accidentally_deleted(self): document = Document() document.file_type = "pdf" document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED document.save() # Ensure that filename is properly generated self.assertEqual(document.generate_source_filename(), "none/none-0000001.pdf") document.create_source_directory() Path(document.source_path).touch() # Test source_path self.assertEqual(document.source_path, settings.MEDIA_ROOT + "/documents/originals/none/none-0000001.pdf") # Delete the document "illegaly" os.remove(settings.MEDIA_ROOT + "/documents/originals/" + "none/none-0000001.pdf") # Set new correspondent and expect document to be saved properly document.correspondent = Correspondent.objects.get_or_create( name="foo")[0] document.save() # Check proper handling of files self.assertEqual(os.path.isdir(settings.MEDIA_ROOT + "/documents/originals/none"), True) self.assertEqual(document.source_filename, "none/none-0000001.pdf") @override_settings(PAPERLESS_FILENAME_FORMAT="{correspondent}/" + "{correspondent}") def test_set_filename(self): document = Document() document.file_type = "pdf" document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED document.save() # Ensure that filename is properly generated tmp = document.source_filename self.assertEqual(document.generate_source_filename(), "none/none-0000001.pdf") document.create_source_directory() Path(document.source_path).touch() # Set existing filename document.set_filename(tmp) self.assertEqual(document.source_filename, "none/none-0000001.pdf") # Set non-existing filename document.set_filename("doesnotexist") self.assertEqual(document.source_filename, "none/none-0000001.pdf") ================================================ FILE: src/documents/tests/test_importer.py ================================================ from django.core.management.base import CommandError from django.test import TestCase from ..management.commands.document_importer import Command from documents.settings import EXPORTER_FILE_NAME class TestImporter(TestCase): def __init__(self, *args, **kwargs): TestCase.__init__(self, *args, **kwargs) def test_check_manifest_exists(self): cmd = Command() self.assertRaises( CommandError, cmd._check_manifest_exists, "/tmp/manifest.json") def test_check_manifest(self): cmd = Command() cmd.source = "/tmp" cmd.manifest = [{"model": "documents.document"}] with self.assertRaises(CommandError) as cm: cmd._check_manifest() self.assertTrue( 'The manifest file contains a record' in str(cm.exception)) cmd.manifest = [{ "model": "documents.document", EXPORTER_FILE_NAME: "noexist.pdf" }] # self.assertRaises(CommandError, cmd._check_manifest) with self.assertRaises(CommandError) as cm: cmd._check_manifest() self.assertTrue( 'The manifest file refers to "noexist.pdf"' in str(cm.exception)) ================================================ FILE: src/documents/tests/test_logger.py ================================================ import logging import uuid from unittest import mock from django.test import TestCase from ..models import Log class TestPaperlessLog(TestCase): def __init__(self, *args, **kwargs): TestCase.__init__(self, *args, **kwargs) self.logger = logging.getLogger( "documents.management.commands.document_consumer") def test_that_it_saves_at_all(self): kw = {"group": uuid.uuid4()} self.assertEqual(Log.objects.all().count(), 0) with mock.patch("logging.StreamHandler.emit") as __: # Debug messages are ignored by default self.logger.debug("This is a debugging message", extra=kw) self.assertEqual(Log.objects.all().count(), 0) self.logger.info("This is an informational message", extra=kw) self.assertEqual(Log.objects.all().count(), 1) self.logger.warning("This is an warning message", extra=kw) self.assertEqual(Log.objects.all().count(), 2) self.logger.error("This is an error message", extra=kw) self.assertEqual(Log.objects.all().count(), 3) self.logger.critical("This is a critical message", extra=kw) self.assertEqual(Log.objects.all().count(), 4) def test_groups(self): kw1 = {"group": uuid.uuid4()} kw2 = {"group": uuid.uuid4()} self.assertEqual(Log.objects.all().count(), 0) with mock.patch("logging.StreamHandler.emit") as __: # Debug messages are ignored by default self.logger.debug("This is a debugging message", extra=kw1) self.assertEqual(Log.objects.all().count(), 0) self.logger.info("This is an informational message", extra=kw2) self.assertEqual(Log.objects.all().count(), 1) self.assertEqual(Log.objects.filter(group=kw2["group"]).count(), 1) self.logger.warning("This is an warning message", extra=kw1) self.assertEqual(Log.objects.all().count(), 2) self.assertEqual(Log.objects.filter(group=kw1["group"]).count(), 1) self.logger.error("This is an error message", extra=kw2) self.assertEqual(Log.objects.all().count(), 3) self.assertEqual(Log.objects.filter(group=kw2["group"]).count(), 2) self.logger.critical("This is a critical message", extra=kw1) self.assertEqual(Log.objects.all().count(), 4) self.assertEqual(Log.objects.filter(group=kw1["group"]).count(), 2) def test_groupped_query(self): kw = {"group": uuid.uuid4()} with mock.patch("logging.StreamHandler.emit") as __: self.logger.info("Message 0", extra=kw) self.logger.info("Message 1", extra=kw) self.logger.info("Message 2", extra=kw) self.logger.info("Message 3", extra=kw) self.assertEqual(Log.objects.all().by_group().count(), 1) self.assertEqual( Log.objects.all().by_group()[0]["messages"], "Message 0\nMessage 1\nMessage 2\nMessage 3" ) ================================================ FILE: src/documents/tests/test_mail.py ================================================ import base64 import os import magic from hashlib import md5 from unittest import mock from django.conf import settings from django.test import TestCase from ..mail import Message, Attachment class TestMessage(TestCase): def __init__(self, *args, **kwargs): TestCase.__init__(self, *args, **kwargs) self.sample = os.path.join( settings.BASE_DIR, "documents", "tests", "samples", "mail.txt" ) def test_init(self): with open(self.sample, "rb") as f: with mock.patch("logging.StreamHandler.emit") as __: message = Message(f.read()) self.assertTrue(message) self.assertEqual(message.subject, "Test 0") data = message.attachment.read() self.assertEqual( md5(data).hexdigest(), "7c89655f9e9eb7dd8cde8568e8115d59") self.assertEqual( message.attachment.content_type, "application/pdf") with magic.Magic(flags=magic.MAGIC_MIME_TYPE) as m: self.assertEqual(m.id_buffer(data), "application/pdf") class TestInlineMessage(TestCase): def __init__(self, *args, **kwargs): TestCase.__init__(self, *args, **kwargs) self.sample = os.path.join( settings.BASE_DIR, "documents", "tests", "samples", "inline_mail.txt" ) def test_init(self): with open(self.sample, "rb") as f: with mock.patch("logging.StreamHandler.emit") as __: message = Message(f.read()) self.assertTrue(message) self.assertEqual(message.subject, "Paperless Inline Image") data = message.attachment.read() self.assertEqual( md5(data).hexdigest(), "30c00a7b42913e65f7fdb0be40b9eef3") self.assertEqual( message.attachment.content_type, "image/png") with magic.Magic(flags=magic.MAGIC_MIME_TYPE) as m: self.assertEqual(m.id_buffer(data), "image/png") class TestAttachment(TestCase): def test_init(self): data = base64.encodebytes(b"0") self.assertEqual(Attachment(data, "application/pdf").suffix, "pdf") self.assertEqual(Attachment(data, "image/png").suffix, "png") self.assertEqual(Attachment(data, "image/jpeg").suffix, "jpeg") self.assertEqual(Attachment(data, "image/gif").suffix, "gif") self.assertEqual(Attachment(data, "image/tiff").suffix, "tiff") self.assertEqual(Attachment(data, "image/png").read(), data) ================================================ FILE: src/documents/tests/test_matchables.py ================================================ from random import randint from django.contrib.admin.models import LogEntry from django.contrib.auth.models import User from django.test import TestCase, override_settings from ..models import Correspondent, Document, Tag from ..signals import document_consumption_finished class TestMatching(TestCase): def _test_matching(self, text, algorithm, true, false): for klass in (Tag, Correspondent): instance = klass.objects.create( name=str(randint(10000, 99999)), match=text, matching_algorithm=getattr(klass, algorithm) ) for string in true: self.assertTrue( instance.matches(string), '"%s" should match "%s" but it does not' % (text, string) ) for string in false: self.assertFalse( instance.matches(string), '"%s" should not match "%s" but it does' % (text, string) ) def test_match_all(self): self._test_matching( "alpha charlie gamma", "MATCH_ALL", ("I have alpha, charlie, and gamma in me",), ( "I have alpha in me", "I have charlie in me", "I have gamma in me", "I have alpha and charlie in me", "I have alphas, charlie, and gamma in me", "I have alphas in me", "I have bravo in me", ) ) self._test_matching( "12 34 56", "MATCH_ALL", ( "I have 12 34, and 56 in me", ), ( "I have 12 in me", "I have 34 in me", "I have 56 in me", "I have 12 and 34 in me", "I have 120, 34, and 56 in me", "I have 123456 in me", "I have 01234567 in me", ) ) self._test_matching( 'brown fox "lazy dogs"', "MATCH_ALL", ( "the quick brown fox jumped over the lazy dogs", "the quick brown fox jumped over the lazy dogs", ), ( "the quick fox jumped over the lazy dogs", "the quick brown wolf jumped over the lazy dogs", "the quick brown fox jumped over the fat dogs", "the quick brown fox jumped over the lazy... dogs", ) ) def test_match_any(self): self._test_matching( "alpha charlie gamma", "MATCH_ANY", ( "I have alpha in me", "I have charlie in me", "I have gamma in me", "I have alpha, charlie, and gamma in me", "I have alpha and charlie in me", ), ( "I have alphas in me", "I have bravo in me", ) ) self._test_matching( "12 34 56", "MATCH_ANY", ( "I have 12 in me", "I have 34 in me", "I have 56 in me", "I have 12 and 34 in me", "I have 12, 34, and 56 in me", "I have 120, 34, and 56 in me", ), ( "I have 123456 in me", "I have 01234567 in me", ) ) self._test_matching( '"brown fox" " lazy dogs "', "MATCH_ANY", ( "the quick brown fox", "jumped over the lazy dogs.", ), ( "the lazy fox jumped over the brown dogs", ) ) def test_match_literal(self): self._test_matching( "alpha charlie gamma", "MATCH_LITERAL", ( "I have 'alpha charlie gamma' in me", ), ( "I have alpha in me", "I have charlie in me", "I have gamma in me", "I have alpha and charlie in me", "I have alpha, charlie, and gamma in me", "I have alphas, charlie, and gamma in me", "I have alphas in me", "I have bravo in me", ) ) self._test_matching( "12 34 56", "MATCH_LITERAL", ( "I have 12 34 56 in me", ), ( "I have 12 in me", "I have 34 in me", "I have 56 in me", "I have 12 and 34 in me", "I have 12 34, and 56 in me", "I have 120, 34, and 560 in me", "I have 120, 340, and 560 in me", "I have 123456 in me", "I have 01234567 in me", ) ) def test_match_regex(self): self._test_matching( r"alpha\w+gamma", "MATCH_REGEX", ( "I have alpha_and_gamma in me", "I have alphas_and_gamma in me", ), ( "I have alpha in me", "I have gamma in me", "I have alpha and charlie in me", "I have alpha,and,gamma in me", "I have alpha and gamma in me", "I have alpha, charlie, and gamma in me", "I have alphas, charlie, and gamma in me", "I have alphas in me", ) ) def test_match_fuzzy(self): self._test_matching( "Springfield, Miss.", "MATCH_FUZZY", ( "1220 Main Street, Springf eld, Miss.", "1220 Main Street, Spring field, Miss.", "1220 Main Street, Springfeld, Miss.", "1220 Main Street Springfield Miss", ), ( "1220 Main Street, Springfield, Mich.", ) ) @override_settings(POST_CONSUME_SCRIPT=None) class TestDocumentConsumptionFinishedSignal(TestCase): """ We make use of document_consumption_finished, so we should test that it's doing what we expect wrt to tag & correspondent matching. """ def setUp(self): TestCase.setUp(self) User.objects.create_user(username='test_consumer', password='12345') self.doc_contains = Document.objects.create( content="I contain the keyword.", file_type="pdf") def test_tag_applied_any(self): t1 = Tag.objects.create( name="test", match="keyword", matching_algorithm=Tag.MATCH_ANY) document_consumption_finished.send( sender=self.__class__, document=self.doc_contains) self.assertTrue(list(self.doc_contains.tags.all()) == [t1]) def test_tag_not_applied(self): Tag.objects.create( name="test", match="no-match", matching_algorithm=Tag.MATCH_ANY) document_consumption_finished.send( sender=self.__class__, document=self.doc_contains) self.assertTrue(list(self.doc_contains.tags.all()) == []) def test_correspondent_applied(self): correspondent = Correspondent.objects.create( name="test", match="keyword", matching_algorithm=Correspondent.MATCH_ANY ) document_consumption_finished.send( sender=self.__class__, document=self.doc_contains) self.assertTrue(self.doc_contains.correspondent == correspondent) def test_correspondent_not_applied(self): Tag.objects.create( name="test", match="no-match", matching_algorithm=Correspondent.MATCH_ANY ) document_consumption_finished.send( sender=self.__class__, document=self.doc_contains) self.assertEqual(self.doc_contains.correspondent, None) def test_logentry_created(self): document_consumption_finished.send( sender=self.__class__, document=self.doc_contains) self.assertEqual(LogEntry.objects.count(), 1) ================================================ FILE: src/documents/tests/test_models.py ================================================ from django.test import TestCase from ..models import Document, Correspondent from .factories import DocumentFactory, CorrespondentFactory class CorrespondentTestCase(TestCase): def test___str__(self): for s in ("test", "οχι", "test with fun_charÅc'\"terß"): correspondent = CorrespondentFactory.create(name=s) self.assertEqual(str(correspondent), s) class DocumentTestCase(TestCase): def test_correspondent_deletion_does_not_cascade(self): self.assertEqual(Correspondent.objects.all().count(), 0) correspondent = CorrespondentFactory.create() self.assertEqual(Correspondent.objects.all().count(), 1) self.assertEqual(Document.objects.all().count(), 0) DocumentFactory.create(correspondent=correspondent) self.assertEqual(Document.objects.all().count(), 1) self.assertIsNotNone(Document.objects.all().first().correspondent) correspondent.delete() self.assertEqual(Correspondent.objects.all().count(), 0) self.assertEqual(Document.objects.all().count(), 1) self.assertIsNone(Document.objects.all().first().correspondent) ================================================ FILE: src/documents/views.py ================================================ from django.http import HttpResponse, HttpResponseBadRequest from django.views.generic import DetailView, FormView, TemplateView from django_filters.rest_framework import DjangoFilterBackend from django.conf import settings from django.utils import cache from paperless.db import GnuPG from paperless.mixins import SessionOrBasicAuthMixin from paperless.views import StandardPagination from rest_framework.filters import OrderingFilter, SearchFilter from rest_framework.mixins import ( DestroyModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin ) from rest_framework.permissions import IsAuthenticated from rest_framework.viewsets import ( GenericViewSet, ModelViewSet, ReadOnlyModelViewSet ) from .filters import CorrespondentFilterSet, DocumentFilterSet, TagFilterSet from .forms import UploadForm from .models import Correspondent, Document, Log, Tag from .serialisers import ( CorrespondentSerializer, DocumentSerializer, LogSerializer, TagSerializer ) class IndexView(TemplateView): template_name = "documents/index.html" class FetchView(SessionOrBasicAuthMixin, DetailView): model = Document def render_to_response(self, context, **response_kwargs): """ Override the default to return the unencrypted image/PDF as raw data. """ content_types = { Document.TYPE_PDF: "application/pdf", Document.TYPE_PNG: "image/png", Document.TYPE_JPG: "image/jpeg", Document.TYPE_GIF: "image/gif", Document.TYPE_TIF: "image/tiff", Document.TYPE_CSV: "text/csv", Document.TYPE_MD: "text/markdown", Document.TYPE_TXT: "text/plain" } if self.kwargs["kind"] == "thumb": response = HttpResponse( self._get_raw_data(self.object.thumbnail_file), content_type=content_types[Document.TYPE_PNG] ) cache.patch_cache_control(response, max_age=31536000, private=True) return response response = HttpResponse( self._get_raw_data(self.object.source_file), content_type=content_types[self.object.file_type] ) DISPOSITION = ( 'inline' if settings.INLINE_DOC or self.kwargs["kind"] == 'preview' else 'attachment' ) response["Content-Disposition"] = '{}; filename="{}"'.format( DISPOSITION, self.object.file_name) return response def _get_raw_data(self, file_handle): if self.object.storage_type == Document.STORAGE_TYPE_UNENCRYPTED: return file_handle return GnuPG.decrypted(file_handle) class PushView(SessionOrBasicAuthMixin, FormView): """ A crude REST-ish API for creating documents. """ form_class = UploadForm def form_valid(self, form): form.save() return HttpResponse("1", status=202) def form_invalid(self, form): return HttpResponseBadRequest(str(form.errors)) class CorrespondentViewSet(ModelViewSet): model = Correspondent queryset = Correspondent.objects.all() serializer_class = CorrespondentSerializer pagination_class = StandardPagination permission_classes = (IsAuthenticated,) filter_backends = (DjangoFilterBackend, OrderingFilter) filter_class = CorrespondentFilterSet ordering_fields = ("name", "slug") class TagViewSet(ModelViewSet): model = Tag queryset = Tag.objects.all() serializer_class = TagSerializer pagination_class = StandardPagination permission_classes = (IsAuthenticated,) filter_backends = (DjangoFilterBackend, OrderingFilter) filter_class = TagFilterSet ordering_fields = ("name", "slug") class DocumentViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, ListModelMixin, GenericViewSet): model = Document queryset = Document.objects.all() serializer_class = DocumentSerializer pagination_class = StandardPagination permission_classes = (IsAuthenticated,) filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter) filter_class = DocumentFilterSet search_fields = ("title", "correspondent__name", "content") ordering_fields = ( "id", "title", "correspondent__name", "created", "modified", "added") class LogViewSet(ReadOnlyModelViewSet): model = Log queryset = Log.objects.all().by_group() serializer_class = LogSerializer pagination_class = StandardPagination permission_classes = (IsAuthenticated,) filter_backends = (DjangoFilterBackend, OrderingFilter) ordering_fields = ("time",) ================================================ FILE: src/manage.py ================================================ #!/usr/bin/env python3 import os import sys if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "paperless.settings") from django.core.management import execute_from_command_line execute_from_command_line(sys.argv) ================================================ FILE: src/paperless/__init__.py ================================================ from .checks import paths_check, binaries_check ================================================ FILE: src/paperless/checks.py ================================================ import os import shutil from django.conf import settings from django.core.checks import Error, Warning, register @register() def paths_check(app_configs, **kwargs): """ Check the various paths for existence, readability and writeability """ check_messages = [] exists_message = "{} is set but doesn't exist." exists_hint = "Create a directory at {}" writeable_message = "{} is not writeable" writeable_hint = ( "Set the permissions of {} to be writeable by the user running the " "Paperless services" ) directory = os.getenv("PAPERLESS_DBDIR") if directory: if not os.path.exists(directory): check_messages.append(Error( exists_message.format("PAPERLESS_DBDIR"), exists_hint.format(directory) )) if not check_messages: if not os.access(directory, os.W_OK | os.X_OK): check_messages.append(Error( writeable_message.format("PAPERLESS_DBDIR"), writeable_hint.format(directory) )) directory = os.getenv("PAPERLESS_MEDIADIR") if directory: if not os.path.exists(directory): check_messages.append(Error( exists_message.format("PAPERLESS_MEDIADIR"), exists_hint.format(directory) )) if not check_messages: if not os.access(directory, os.W_OK | os.X_OK): check_messages.append(Error( writeable_message.format("PAPERLESS_MEDIADIR"), writeable_hint.format(directory) )) directory = os.getenv("PAPERLESS_STATICDIR") if directory: if not os.path.exists(directory): check_messages.append(Error( exists_message.format("PAPERLESS_STATICDIR"), exists_hint.format(directory) )) if not check_messages: if not os.access(directory, os.W_OK | os.X_OK): check_messages.append(Error( writeable_message.format("PAPERLESS_STATICDIR"), writeable_hint.format(directory) )) return check_messages @register() def binaries_check(app_configs, **kwargs): """ Paperless requires the existence of a few binaries, so we do some checks for those here. """ error = "Paperless can't find {}. Without it, consumption is impossible." hint = "Either it's not in your ${PATH} or it's not installed." binaries = ( settings.CONVERT_BINARY, settings.OPTIPNG_BINARY, settings.UNPAPER_BINARY, "tesseract" ) check_messages = [] for binary in binaries: if shutil.which(binary) is None: check_messages.append(Warning(error.format(binary), hint)) return check_messages ================================================ FILE: src/paperless/db.py ================================================ import gnupg from django.conf import settings class GnuPG: """ A handy singleton to use when handling encrypted files. """ gpg = gnupg.GPG(gnupghome=settings.GNUPG_HOME) @classmethod def decrypted(cls, file_handle, passphrase=None): if not passphrase: passphrase = settings.PASSPHRASE return cls.gpg.decrypt_file(file_handle, passphrase=passphrase).data @classmethod def encrypted(cls, file_handle, passphrase=None): if not passphrase: passphrase = settings.PASSPHRASE return cls.gpg.encrypt_file( file_handle, recipients=None, passphrase=passphrase, symmetric=True ).data ================================================ FILE: src/paperless/middleware.py ================================================ from django.utils.deprecation import MiddlewareMixin from .models import User class Middleware(MiddlewareMixin): """ This is a dummy authentication middleware class that creates what is roughly an Anonymous authenticated user so we can disable login and not interfere with existing user ID's. It's only used if login is disabled in paperless.conf (default is to require login) """ def process_request(self, request): request.user = User() ================================================ FILE: src/paperless/mixins.py ================================================ from django.contrib.auth.mixins import AccessMixin from django.contrib.auth import authenticate, login import base64 class SessionOrBasicAuthMixin(AccessMixin): """ Session or Basic Authentication mixin for Django. It determines if the requester is already logged in or if they have provided proper http-authorization and returning the view if all goes well, otherwise responding with a 401. Base for mixin found here: https://djangosnippets.org/snippets/3073/ """ def dispatch(self, request, *args, **kwargs): # check if user is authenticated via the session if request.user.is_authenticated: # Already logged in, just return the view. return super(SessionOrBasicAuthMixin, self).dispatch( request, *args, **kwargs ) # apparently not authenticated via session, maybe via HTTP Basic? if 'HTTP_AUTHORIZATION' in request.META: auth = request.META['HTTP_AUTHORIZATION'].split() if len(auth) == 2: # NOTE: Support for only basic authentication if auth[0].lower() == "basic": authString = base64.b64decode(auth[1]).decode('utf-8') uname, passwd = authString.split(':') user = authenticate(username=uname, password=passwd) if user is not None: if user.is_active: login(request, user) request.user = user return super( SessionOrBasicAuthMixin, self ).dispatch( request, *args, **kwargs ) # nope, really not authenticated return self.handle_no_permission() ================================================ FILE: src/paperless/models.py ================================================ from django.contrib.auth.models import User as DjangoUser class User: """ This is a dummy django User used with our middleware to disable login authentication if that is configured in paperless.conf """ is_superuser = True is_active = True is_staff = True is_authenticated = True @property def id(self): return DjangoUser.objects.order_by("pk").first().pk @property def pk(self): return self.id """ NOTE: These are here as a hack instead of being in the User definition NOTE: above due to the way pycodestyle handles lamdbdas. NOTE: See https://github.com/PyCQA/pycodestyle/issues/379 for more. """ User.has_module_perms = lambda *_: True User.has_perm = lambda *_: True ================================================ FILE: src/paperless/settings.py ================================================ """ Django settings for paperless project. Generated by 'django-admin startproject' using Django 1.9. For more information on this file, see https://docs.djangoproject.com/en/1.10/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/1.10/ref/settings/ """ import json import os import re from dotenv import load_dotenv # Tap paperless.conf if it's available if os.path.exists("/etc/paperless.conf"): load_dotenv("/etc/paperless.conf") elif os.path.exists("/usr/local/etc/paperless.conf"): load_dotenv("/usr/local/etc/paperless.conf") def __get_boolean(key, default="NO"): """ Return a boolean value based on whatever the user has supplied in the environment based on whether the value "looks like" it's True or not. """ return bool(os.getenv(key, default).lower() in ("yes", "y", "1", "t", "true")) # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/ # The secret key has a default that should be fine so long as you're hosting # Paperless on a closed network. However, if you're putting this anywhere # public, you should change the key to something unique and verbose. SECRET_KEY = os.getenv( "PAPERLESS_SECRET_KEY", "e11fl1oa-*ytql8p)(06fbj4ukrlo+n7k&q5+$1md7i+mge=ee" ) # SECURITY WARNING: don't run with debug turned on in production! DEBUG = __get_boolean("PAPERLESS_DEBUG", "YES") LOGIN_URL = "admin:login" ALLOWED_HOSTS = ["*"] _allowed_hosts = os.getenv("PAPERLESS_ALLOWED_HOSTS") if _allowed_hosts: ALLOWED_HOSTS = _allowed_hosts.split(",") FORCE_SCRIPT_NAME = os.getenv("PAPERLESS_FORCE_SCRIPT_NAME") # Application definition INSTALLED_APPS = [ "whitenoise.runserver_nostatic", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", "corsheaders", "django_extensions", "paperless", "documents.apps.DocumentsConfig", "reminders.apps.RemindersConfig", "paperless_tesseract.apps.PaperlessTesseractConfig", "paperless_text.apps.PaperlessTextConfig", "django.contrib.admin", "rest_framework", "crispy_forms", "django_filters", "djangoql", ] if os.getenv("PAPERLESS_INSTALLED_APPS"): INSTALLED_APPS += os.getenv("PAPERLESS_INSTALLED_APPS").split(",") MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'whitenoise.middleware.WhiteNoiseMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] # Enable whitenoise compression and caching STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' # We allow CORS from localhost:8080 CORS_ORIGIN_WHITELIST = tuple(os.getenv("PAPERLESS_CORS_ALLOWED_HOSTS", "http://localhost:8080,https://localhost:8080").split(",")) # If auth is disabled, we just use our "bypass" authentication middleware if bool(os.getenv("PAPERLESS_DISABLE_LOGIN", "false").lower() in ("yes", "y", "1", "t", "true")): _index = MIDDLEWARE.index("django.contrib.auth.middleware.AuthenticationMiddleware") MIDDLEWARE[_index] = "paperless.middleware.Middleware" ROOT_URLCONF = 'paperless.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'paperless.wsgi.application' # Database # https://docs.djangoproject.com/en/1.10/ref/settings/#databases DATABASES = { "default": { "ENGINE": "django.db.backends.sqlite3", "NAME": os.path.join( os.getenv( "PAPERLESS_DBDIR", os.path.join(BASE_DIR, "..", "data") ), "db.sqlite3" ) } } if os.getenv("PAPERLESS_DBUSER"): DATABASES["default"] = { "ENGINE": "django.db.backends.postgresql_psycopg2", "NAME": os.getenv("PAPERLESS_DBNAME", "paperless"), "USER": os.getenv("PAPERLESS_DBUSER"), } if os.getenv("PAPERLESS_DBPASS"): DATABASES["default"]["PASSWORD"] = os.getenv("PAPERLESS_DBPASS") if os.getenv("PAPERLESS_DBHOST"): DATABASES["default"]["HOST"] = os.getenv("PAPERLESS_DBHOST") if os.getenv("PAPERLESS_DBPORT"): DATABASES["default"]["PORT"] = os.getenv("PAPERLESS_DBPORT") # Password validation # https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] # Internationalization # https://docs.djangoproject.com/en/1.10/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = os.getenv("PAPERLESS_TIME_ZONE", "UTC") USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.10/howto/static-files/ STATIC_ROOT = os.getenv( "PAPERLESS_STATICDIR", os.path.join(BASE_DIR, "..", "static")) MEDIA_ROOT = os.getenv( "PAPERLESS_MEDIADIR", os.path.join(BASE_DIR, "..", "media")) STATIC_URL = os.getenv("PAPERLESS_STATIC_URL", "/static/") MEDIA_URL = os.getenv("PAPERLESS_MEDIA_URL", "/media/") # Other # Disable Django's artificial limit on the number of form fields to submit at # once. This is a protection against overloading the server, but since this is # a self-hosted sort of gig, the benefits of being able to mass-delete a tonne # of log entries outweight the benefits of such a safeguard. DATA_UPLOAD_MAX_NUMBER_FIELDS = None # Paperless-specific stuff # You shouldn't have to edit any of these values. Rather, you can set these # values in /etc/paperless.conf instead. # ---------------------------------------------------------------------------- # Logging LOGGING = { "version": 1, "disable_existing_loggers": False, "handlers": { "consumer": { "class": "documents.loggers.PaperlessLogger", } }, "loggers": { "documents": { "handlers": ["consumer"], "level": os.getenv("PAPERLESS_CONSUMER_LOG_LEVEL", "INFO"), }, }, } # The default language that tesseract will attempt to use when parsing # documents. It should be a 3-letter language code consistent with ISO 639. OCR_LANGUAGE = os.getenv("PAPERLESS_OCR_LANGUAGE", "eng") # The amount of threads to use for OCR OCR_THREADS = os.getenv("PAPERLESS_OCR_THREADS") # OCR all documents? OCR_ALWAYS = __get_boolean("PAPERLESS_OCR_ALWAYS") # If this is true, any failed attempts to OCR a PDF will result in the PDF # being indexed anyway, with whatever we could get. If it's False, the file # will simply be left in the CONSUMPTION_DIR. FORGIVING_OCR = __get_boolean("PAPERLESS_FORGIVING_OCR") # GNUPG needs a home directory for some reason GNUPG_HOME = os.getenv("HOME", "/tmp") # Convert is part of the ImageMagick package CONVERT_BINARY = os.getenv("PAPERLESS_CONVERT_BINARY", "convert") CONVERT_TMPDIR = os.getenv("PAPERLESS_CONVERT_TMPDIR") CONVERT_MEMORY_LIMIT = os.getenv("PAPERLESS_CONVERT_MEMORY_LIMIT") CONVERT_DENSITY = os.getenv("PAPERLESS_CONVERT_DENSITY") # Ghostscript GS_BINARY = os.getenv("PAPERLESS_GS_BINARY", "gs") # OptiPNG OPTIPNG_BINARY = os.getenv("PAPERLESS_OPTIPNG_BINARY", "optipng") # Unpaper UNPAPER_BINARY = os.getenv("PAPERLESS_UNPAPER_BINARY", "unpaper") # This will be created if it doesn't exist SCRATCH_DIR = os.getenv("PAPERLESS_SCRATCH_DIR", "/tmp/paperless") # This is where Paperless will look for PDFs to index CONSUMPTION_DIR = os.getenv("PAPERLESS_CONSUMPTION_DIR") # (This setting is ignored on Linux where inotify is used instead of a # polling loop.) # The number of seconds that Paperless will wait between checking # CONSUMPTION_DIR. If you tend to write documents to this directory very # slowly, you may want to use a higher value than the default. CONSUMER_LOOP_TIME = int(os.getenv("PAPERLESS_CONSUMER_LOOP_TIME", 10)) # Pre-2.x versions of Paperless stored your documents locally with GPG # encryption, but that is no longer the default. This behaviour is still # available, but it must be explicitly enabled by setting # `PAPERLESS_PASSPHRASE` in your environment or config file. The default is to # store these files unencrypted. # # Translation: # * If you're a new user, you can safely ignore this setting. # * If you're upgrading from 1.x, this must be set, OR you can run # `./manage.py change_storage_type gpg unencrypted` to decrypt your files, # after which you can unset this value. PASSPHRASE = os.getenv("PAPERLESS_PASSPHRASE") # Trigger a script after every successful document consumption? PRE_CONSUME_SCRIPT = os.getenv("PAPERLESS_PRE_CONSUME_SCRIPT") POST_CONSUME_SCRIPT = os.getenv("PAPERLESS_POST_CONSUME_SCRIPT") # Whether to display a selected document inline, or download it as attachment: INLINE_DOC = __get_boolean("PAPERLESS_INLINE_DOC") # The number of items on each page in the web UI. This value must be a # positive integer, but if you don't define one in paperless.conf, a default of # 100 will be used. PAPERLESS_LIST_PER_PAGE = int(os.getenv("PAPERLESS_LIST_PER_PAGE", 100)) FY_START = os.getenv("PAPERLESS_FINANCIAL_YEAR_START") FY_END = os.getenv("PAPERLESS_FINANCIAL_YEAR_END") # Specify the default date order (for autodetected dates) DATE_ORDER = os.getenv("PAPERLESS_DATE_ORDER", "DMY") FILENAME_DATE_ORDER = os.getenv("PAPERLESS_FILENAME_DATE_ORDER") # Transformations applied before filename parsing FILENAME_PARSE_TRANSFORMS = [] for t in json.loads(os.getenv("PAPERLESS_FILENAME_PARSE_TRANSFORMS", "[]")): FILENAME_PARSE_TRANSFORMS.append((re.compile(t["pattern"]), t["repl"])) # Specify for how many years a correspondent is considered recent. Recent # correspondents will be shown in a separate "Recent correspondents" filter as # well. Set to 0 to disable this filter. PAPERLESS_RECENT_CORRESPONDENT_YEARS = int(os.getenv( "PAPERLESS_RECENT_CORRESPONDENT_YEARS", 0)) # Specify the filename format for out files PAPERLESS_FILENAME_FORMAT = os.getenv("PAPERLESS_FILENAME_FORMAT") ================================================ FILE: src/paperless/urls.py ================================================ from django.conf import settings from django.conf.urls import include, static, url from django.contrib import admin from django.urls import reverse_lazy from django.views.decorators.csrf import csrf_exempt from django.views.generic import RedirectView from rest_framework.routers import DefaultRouter from paperless.views import FaviconView from documents.views import ( CorrespondentViewSet, DocumentViewSet, FetchView, LogViewSet, PushView, TagViewSet ) from reminders.views import ReminderViewSet router = DefaultRouter() router.register(r"correspondents", CorrespondentViewSet) router.register(r"documents", DocumentViewSet) router.register(r"logs", LogViewSet) router.register(r"reminders", ReminderViewSet) router.register(r"tags", TagViewSet) urlpatterns = [ # API url( r"^api/auth/", include( ('rest_framework.urls', 'rest_framework'), namespace="rest_framework") ), url(r"^api/", include((router.urls, 'drf'), namespace="drf")), # File downloads url( r"^fetch/(?Pdoc|thumb|preview)/(?P\d+)$", FetchView.as_view(), name="fetch" ), # File uploads url(r"^push$", csrf_exempt(PushView.as_view()), name="push"), # Favicon url(r"^favicon.ico$", FaviconView.as_view(), name="favicon"), # The Django admin url(r"admin/", admin.site.urls), # Redirect / to /admin url(r"^$", RedirectView.as_view( permanent=True, url=reverse_lazy("admin:index"))), ] + static.static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) # Text in each page's

    (and above login form). admin.site.site_header = 'Paperless' # Text at the end of each page's . admin.site.site_title = 'Paperless' # Text at the top of the admin index page. admin.site.index_title = 'Paperless administration' ================================================ FILE: src/paperless/version.py ================================================ __version__ = (2, 6, 1) ================================================ FILE: src/paperless/views.py ================================================ import os from django.http import HttpResponse from django.views.generic import View from rest_framework.pagination import PageNumberPagination class StandardPagination(PageNumberPagination): page_size = 25 page_size_query_param = "page-size" max_page_size = 100000 class FaviconView(View): def get(self, request, *args, **kwargs): favicon = os.path.join( os.path.dirname(__file__), "static", "paperless", "img", "favicon.ico" ) with open(favicon, "rb") as f: return HttpResponse(f, content_type="image/x-icon") ================================================ FILE: src/paperless/wsgi.py ================================================ """ WSGI config for paperless project. It exposes the WSGI callable as a module-level variable named ``application``. For more information on this file, see https://docs.djangoproject.com/en/1.10/howto/deployment/wsgi/ """ import os from django.core.wsgi import get_wsgi_application os.environ.setdefault("DJANGO_SETTINGS_MODULE", "paperless.settings") application = get_wsgi_application() ================================================ FILE: src/paperless_tesseract/__init__.py ================================================ ================================================ FILE: src/paperless_tesseract/apps.py ================================================ from django.apps import AppConfig class PaperlessTesseractConfig(AppConfig): name = "paperless_tesseract" def ready(self): from documents.signals import document_consumer_declaration from .signals import ConsumerDeclaration document_consumer_declaration.connect(ConsumerDeclaration.handle) AppConfig.ready(self) ================================================ FILE: src/paperless_tesseract/languages.py ================================================ # Thanks to the Library of Congress and some creative use of sed and awk: # http://www.loc.gov/standards/iso639-2/php/English_list.php ISO639 = { "aa": "aar", "ab": "abk", "ae": "ave", "af": "afr", "ak": "aka", "am": "amh", "an": "arg", "ar": "ara", "as": "asm", "av": "ava", "ay": "aym", "az": "aze", "ba": "bak", "be": "bel", "bg": "bul", "bh": "bih", "bi": "bis", "bm": "bam", "bn": "ben", "bo": "bod", "br": "bre", "bs": "bos", "ca": "cat", "ce": "che", "ch": "cha", "co": "cos", "cr": "cre", "cs": "ces", "cu": "chu", "cv": "chv", "cy": "cym", "da": "dan", "de": "deu", "dv": "div", "dz": "dzo", "ee": "ewe", "el": "ell", "en": "eng", "eo": "epo", "es": "spa", "et": "est", "eu": "eus", "fa": "fas", "ff": "ful", "fi": "fin", "fj": "fij", "fo": "fao", "fr": "fra", "fy": "fry", "ga": "gle", "gd": "gla", "gl": "glg", "gn": "grn", "gu": "guj", "gv": "glv", "ha": "hau", "he": "heb", "hi": "hin", "ho": "hmo", "hr": "hrv", "ht": "hat", "hu": "hun", "hy": "hye", "hz": "her", "ia": "ina", "id": "ind", "ie": "ile", "ig": "ibo", "ii": "iii", "ik": "ipk", "io": "ido", "is": "isl", "it": "ita", "iu": "iku", "ja": "jpn", "jv": "jav", "ka": "kat", "kg": "kon", "ki": "kik", "kj": "kua", "kk": "kaz", "kl": "kal", "km": "khm", "kn": "kan", "ko": "kor", "kr": "kau", "ks": "kas", "ku": "kur", "kv": "kom", "kw": "cor", "ky": "kir", "la": "lat", "lb": "ltz", "lg": "lug", "li": "lim", "ln": "lin", "lo": "lao", "lt": "lit", "lu": "lub", "lv": "lav", "mg": "mlg", "mh": "mah", "mi": "mri", "mk": "mkd", "ml": "mal", "mn": "mon", "mr": "mar", "ms": "msa", "mt": "mlt", "my": "mya", "na": "nau", "nb": "nob", "nd": "nde", "ne": "nep", "ng": "ndo", "nl": "nld", "no": "nor", "nr": "nbl", "nv": "nav", "ny": "nya", "oc": "oci", "oj": "oji", "om": "orm", "or": "ori", "os": "oss", "pa": "pan", "pi": "pli", "pl": "pol", "ps": "pus", "pt": "por", "qu": "que", "rm": "roh", "rn": "run", "ro": "ron", "ru": "rus", "rw": "kin", "sa": "san", "sc": "srd", "sd": "snd", "se": "sme", "sg": "sag", "si": "sin", "sk": "slk", "sl": "slv", "sm": "smo", "sn": "sna", "so": "som", "sq": "sqi", "sr": "srp", "ss": "ssw", "st": "sot", "su": "sun", "sv": "swe", "sw": "swa", "ta": "tam", "te": "tel", "tg": "tgk", "th": "tha", "ti": "tir", "tk": "tuk", "tl": "tgl", "tn": "tsn", "to": "ton", "tr": "tur", "ts": "tso", "tt": "tat", "tw": "twi", "ty": "tah", "ug": "uig", "uk": "ukr", "ur": "urd", "uz": "uzb", "ve": "ven", "vi": "vie", "vo": "vol", "wa": "wln", "wo": "wol", "xh": "xho", "yi": "yid", "yo": "yor", "za": "zha", # Tessdata contains two values for Chinese, "chi_sim" and "chi_tra". I # have no idea which one is better, so I just picked the bigger file. "zh": "chi_tra", "zu": "zul" } ================================================ FILE: src/paperless_tesseract/parsers.py ================================================ import itertools import os import re import subprocess from multiprocessing.pool import Pool import langdetect import pyocr from django.conf import settings from PIL import Image from pyocr.libtesseract.tesseract_raw import \ TesseractError as OtherTesseractError from pyocr.tesseract import TesseractError import pdftotext from documents.parsers import DocumentParser, ParseError from .languages import ISO639 class OCRError(Exception): pass class RasterisedDocumentParser(DocumentParser): """ This parser uses Tesseract to try and get some text out of a rasterised image, whether it's a PDF, or other graphical format (JPEG, TIFF, etc.) """ CONVERT = settings.CONVERT_BINARY GHOSTSCRIPT = settings.GS_BINARY DENSITY = settings.CONVERT_DENSITY if settings.CONVERT_DENSITY else 300 THREADS = int(settings.OCR_THREADS) if settings.OCR_THREADS else None UNPAPER = settings.UNPAPER_BINARY DEFAULT_OCR_LANGUAGE = settings.OCR_LANGUAGE OCR_ALWAYS = settings.OCR_ALWAYS def __init__(self, path): super().__init__(path) self._text = None def get_thumbnail(self): """ The thumbnail of a PDF is just a 500px wide image of the first page. """ out_path = os.path.join(self.tempdir, "convert.png") # Run convert to get a decent thumbnail try: run_convert( self.CONVERT, "-scale", "500x5000", "-alpha", "remove", "-strip", "-trim", "{}[0]".format(self.document_path), out_path ) except ParseError: # if convert fails, fall back to extracting # the first PDF page as a PNG using Ghostscript self.log( "warning", "Thumbnail generation with ImageMagick failed, " "falling back to Ghostscript." ) gs_out_path = os.path.join(self.tempdir, "gs_out.png") cmd = [self.GHOSTSCRIPT, "-q", "-sDEVICE=pngalpha", "-o", gs_out_path, self.document_path] if not subprocess.Popen(cmd).wait() == 0: raise ParseError("Thumbnail (gs) failed at {}".format(cmd)) # then run convert on the output from gs run_convert( self.CONVERT, "-scale", "500x5000", "-alpha", "remove", "-strip", "-trim", gs_out_path, out_path ) return out_path def _is_ocred(self): # Extract text from PDF using pdftotext text = get_text_from_pdf(self.document_path) # We assume, that a PDF with at least 50 characters contains text # (so no OCR required) return len(text) > 50 def get_text(self): if self._text is not None: return self._text if not self.OCR_ALWAYS and self._is_ocred(): self.log("info", "Skipping OCR, using Text from PDF") self._text = get_text_from_pdf(self.document_path) return self._text images = self._get_greyscale() try: self._text = self._get_ocr(images) return self._text except OCRError as e: raise ParseError(e) def _get_greyscale(self): """ Greyscale images are easier for Tesseract to OCR """ # Convert PDF to multiple PNMs pnm = os.path.join(self.tempdir, "convert-%04d.pnm") run_convert( self.CONVERT, "-density", str(self.DENSITY), "-depth", "8", "-type", "grayscale", self.document_path, pnm, ) # Get a list of converted images pnms = [] for f in os.listdir(self.tempdir): if f.endswith(".pnm"): pnms.append(os.path.join(self.tempdir, f)) # Run unpaper in parallel on converted images with Pool(processes=self.THREADS) as pool: pool.map(run_unpaper, itertools.product([self.UNPAPER], pnms)) # Return list of converted images, processed with unpaper pnms = [] for f in os.listdir(self.tempdir): if f.endswith(".unpaper.pnm"): pnms.append(os.path.join(self.tempdir, f)) return sorted(filter(lambda __: os.path.isfile(__), pnms)) def _guess_language(self, text): try: guess = langdetect.detect(text) self.log("debug", "Language detected: {}".format(guess)) return guess except Exception as e: self.log("warning", "Language detection error: {}".format(e)) def _get_ocr(self, imgs): """ Attempts to do the best job possible OCR'ing the document based on simple language detection trial & error. """ if not imgs: raise OCRError("No images found") self.log("info", "OCRing the document") # Since the division gets rounded down by int, this calculation works # for every edge-case, i.e. 1 middle = int(len(imgs) / 2) raw_text = self._ocr([imgs[middle]], self.DEFAULT_OCR_LANGUAGE) guessed_language = self._guess_language(raw_text) if not guessed_language or guessed_language not in ISO639: self.log("warning", "Language detection failed!") if settings.FORGIVING_OCR: self.log( "warning", "As FORGIVING_OCR is enabled, we're going to make the " "best with what we have." ) raw_text = self._assemble_ocr_sections(imgs, middle, raw_text) return raw_text error_msg = ("Language detection failed. Set " "PAPERLESS_FORGIVING_OCR in config file to continue " "anyway.") raise OCRError(error_msg) if ISO639[guessed_language] == self.DEFAULT_OCR_LANGUAGE: raw_text = self._assemble_ocr_sections(imgs, middle, raw_text) return raw_text try: return self._ocr(imgs, ISO639[guessed_language]) except pyocr.pyocr.tesseract.TesseractError: if settings.FORGIVING_OCR: self.log( "warning", "OCR for {} failed, but we're going to stick with what " "we've got since FORGIVING_OCR is enabled.".format( guessed_language ) ) raw_text = self._assemble_ocr_sections(imgs, middle, raw_text) return raw_text raise OCRError( "The guessed language ({}) is not available in this instance " "of Tesseract.".format(guessed_language) ) def _ocr(self, imgs, lang): """ Performs a single OCR attempt. """ if not imgs: return "" self.log("info", "Parsing for {}".format(lang)) with Pool(processes=self.THREADS) as pool: r = pool.map(image_to_string, itertools.product(imgs, [lang])) r = " ".join(r) # Strip out excess white space to allow matching to go smoother return strip_excess_whitespace(r) def _assemble_ocr_sections(self, imgs, middle, text): """ Given a `middle` value and the text that middle page represents, we OCR the remainder of the document and return the whole thing. """ text = self._ocr(imgs[:middle], self.DEFAULT_OCR_LANGUAGE) + text text += self._ocr(imgs[middle + 1:], self.DEFAULT_OCR_LANGUAGE) return text def run_convert(*args): environment = os.environ.copy() if settings.CONVERT_MEMORY_LIMIT: environment["MAGICK_MEMORY_LIMIT"] = settings.CONVERT_MEMORY_LIMIT if settings.CONVERT_TMPDIR: environment["MAGICK_TMPDIR"] = settings.CONVERT_TMPDIR if not subprocess.Popen(args, env=environment).wait() == 0: raise ParseError("Convert failed at {}".format(args)) def run_unpaper(args): unpaper, pnm = args command_args = (unpaper, "--overwrite", pnm, pnm.replace(".pnm", ".unpaper.pnm")) if not subprocess.Popen(command_args).wait() == 0: raise ParseError("Unpaper failed at {}".format(command_args)) def strip_excess_whitespace(text): collapsed_spaces = re.sub(r"([^\S\r\n]+)", " ", text) no_leading_whitespace = re.sub( r"([\n\r]+)([^\S\n\r]+)", '\\1', collapsed_spaces) no_trailing_whitespace = re.sub( r"([^\S\n\r]+)$", '', no_leading_whitespace) return no_trailing_whitespace def image_to_string(args): img, lang = args ocr = pyocr.get_available_tools()[0] with Image.open(os.path.join(settings.SCRATCH_DIR, img)) as f: if ocr.can_detect_orientation(): try: orientation = ocr.detect_orientation(f, lang=lang) f = f.rotate(orientation["angle"], expand=1) except (TesseractError, OtherTesseractError, AttributeError): pass return ocr.image_to_string(f, lang=lang) def get_text_from_pdf(pdf_file): with open(pdf_file, "rb") as f: try: pdf = pdftotext.PDF(f) except pdftotext.Error: return "" return "\n".join(pdf).strip() ================================================ FILE: src/paperless_tesseract/signals.py ================================================ import re from .parsers import RasterisedDocumentParser class ConsumerDeclaration: MATCHING_FILES = re.compile(r"^.*\.(pdf|jpe?g|gif|png|tiff?|pnm|bmp)$") @classmethod def handle(cls, sender, **kwargs): return cls.test @classmethod def test(cls, doc): if cls.MATCHING_FILES.match(doc.lower()): return { "parser": RasterisedDocumentParser, "weight": 0 } return None ================================================ FILE: src/paperless_tesseract/tests/__init__.py ================================================ ================================================ FILE: src/paperless_tesseract/tests/test_date.py ================================================ import datetime import os import shutil from dateutil import tz from django.conf import settings from django.test import TestCase, override_settings from tempfile import TemporaryDirectory from unittest import mock from ..parsers import RasterisedDocumentParser class TestDate(TestCase): SAMPLE_FILES = os.path.join(os.path.dirname(__file__), "samples") def setUp(self): self.scratchdir = TemporaryDirectory() scratchdir_override = override_settings( SCRATCH_DIR=self.scratchdir.name) scratchdir_override.enable() def tearDown(self): self.scratchdir.cleanup() def test_date_format_1(self): input_file = os.path.join(self.SAMPLE_FILES, "") document = RasterisedDocumentParser(input_file) document._text = "lorem ipsum 130218 lorem ipsum" self.assertEqual(document.get_date(), None) def test_date_format_2(self): input_file = os.path.join(self.SAMPLE_FILES, "") document = RasterisedDocumentParser(input_file) document._text = "lorem ipsum 2018 lorem ipsum" self.assertEqual(document.get_date(), None) def test_date_format_3(self): input_file = os.path.join(self.SAMPLE_FILES, "") document = RasterisedDocumentParser(input_file) document._text = "lorem ipsum 20180213 lorem ipsum" self.assertEqual(document.get_date(), None) def test_date_format_4(self): input_file = os.path.join(self.SAMPLE_FILES, "") document = RasterisedDocumentParser(input_file) document._text = "lorem ipsum 13.02.2018 lorem ipsum" date = document.get_date() self.assertEqual( date, datetime.datetime( 2018, 2, 13, 0, 0, tzinfo=tz.gettz(settings.TIME_ZONE) ) ) def test_date_format_5(self): input_file = os.path.join(self.SAMPLE_FILES, "") document = RasterisedDocumentParser(input_file) document._text = ( "lorem ipsum 130218, 2018, 20180213 and lorem 13.02.2018 lorem " "ipsum" ) date = document.get_date() self.assertEqual( date, datetime.datetime( 2018, 2, 13, 0, 0, tzinfo=tz.gettz(settings.TIME_ZONE) ) ) def test_date_format_6(self): input_file = os.path.join(self.SAMPLE_FILES, "") document = RasterisedDocumentParser(input_file) document._text = ( "lorem ipsum\n" "Wohnort\n" "3100\n" "IBAN\n" "AT87 4534\n" "1234\n" "1234 5678\n" "BIC\n" "lorem ipsum" ) self.assertEqual(document.get_date(), None) def test_date_format_7(self): input_file = os.path.join(self.SAMPLE_FILES, "") document = RasterisedDocumentParser(input_file) document._text = ( "lorem ipsum\n" "März 2019\n" "lorem ipsum" ) date = document.get_date() self.assertEqual( date, datetime.datetime( 2019, 3, 1, 0, 0, tzinfo=tz.gettz(settings.TIME_ZONE) ) ) def test_date_format_8(self): input_file = os.path.join(self.SAMPLE_FILES, "") document = RasterisedDocumentParser(input_file) document._text = ( "lorem ipsum\n" "Wohnort\n" "3100\n" "IBAN\n" "AT87 4534\n" "1234\n" "1234 5678\n" "BIC\n" "lorem ipsum\n" "März 2020" ) self.assertEqual( document.get_date(), datetime.datetime( 2020, 3, 1, 0, 0, tzinfo=tz.gettz(settings.TIME_ZONE) ) ) def test_date_format_9(self): input_file = os.path.join(self.SAMPLE_FILES, "") document = RasterisedDocumentParser(input_file) document._text = ( "lorem ipsum\n" "27. Nullmonth 2020\n" "März 2020\n" "lorem ipsum" ) self.assertEqual( document.get_date(), datetime.datetime( 2020, 3, 1, 0, 0, tzinfo=tz.gettz(settings.TIME_ZONE) ) ) @mock.patch( "paperless_tesseract.parsers.RasterisedDocumentParser.get_text", return_value="01-07-0590 00:00:00" ) def test_crazy_date_past(self, *args): document = RasterisedDocumentParser("/dev/null") document.get_text() self.assertIsNone(document.get_date()) @mock.patch( "paperless_tesseract.parsers.RasterisedDocumentParser.get_text", return_value="01-07-2350 00:00:00" ) def test_crazy_date_future(self, *args): document = RasterisedDocumentParser("/dev/null") document.get_text() self.assertIsNone(document.get_date()) @mock.patch( "paperless_tesseract.parsers.RasterisedDocumentParser.get_text", return_value="20 408000l 2475" ) def test_crazy_date_with_spaces(self, *args): document = RasterisedDocumentParser("/dev/null") document.get_text() self.assertIsNone(document.get_date()) @mock.patch( "paperless_tesseract.parsers.RasterisedDocumentParser.get_text", return_value="No date in here" ) @override_settings(FILENAME_DATE_ORDER="YMD") def test_filename_date_parse_invalid(self, *args): document = RasterisedDocumentParser("/tmp/20 408000l 2475 - test.pdf") document.get_text() self.assertIsNone(document.get_date()) ================================================ FILE: src/paperless_tesseract/tests/test_ocr.py ================================================ import os import pyocr from django.test import TestCase, override_settings from pyocr.libtesseract.tesseract_raw import \ TesseractError as OtherTesseractError from tempfile import TemporaryDirectory from unittest import mock, skipIf from ..parsers import image_to_string, strip_excess_whitespace class FakeTesseract(object): @staticmethod def can_detect_orientation(): return True @staticmethod def detect_orientation(file_handle, lang): raise OtherTesseractError("arbitrary status", "message") @staticmethod def image_to_string(file_handle, lang): return "This is test text" class FakePyOcr(object): @staticmethod def get_available_tools(): return [FakeTesseract] @override_settings(SCRATCH_DIR=os.path.join( os.path.dirname(__file__), "samples")) class TestOCR(TestCase): text_cases = [ ("simple string", "simple string"), ( "simple newline\n testing string", "simple newline\ntesting string" ), ( "utf-8 строка с пробелами в конце ", "utf-8 строка с пробелами в конце" ) ] TESSERACT_INSTALLED = bool(pyocr.get_available_tools()) def test_strip_excess_whitespace(self): for source, result in self.text_cases: actual_result = strip_excess_whitespace(source) self.assertEqual( result, actual_result, "strip_exceess_whitespace({}) != '{}', but '{}'".format( source, result, actual_result ) ) @skipIf(not TESSERACT_INSTALLED, "Tesseract not installed. Skipping") @mock.patch("paperless_tesseract.parsers.pyocr", FakePyOcr) def test_image_to_string_with_text_free_page(self): """ This test is sort of silly, since it's really just reproducing an odd exception thrown by pyocr when it encounters a page with no text. Actually running this test against an installation of Tesseract results in a segmentation fault rooted somewhere deep inside pyocr where I don't care to dig. Regardless, if you run the consumer normally, text-free pages are now handled correctly so long as we work around this weird exception. """ image_to_string(["no-text.png", "en"]) ================================================ FILE: src/paperless_tesseract/tests/test_signals.py ================================================ from django.test import TestCase from ..signals import ConsumerDeclaration class SignalsTestCase(TestCase): def test_test_handles_various_file_names_true(self): prefixes = ( "doc", "My Document", "Μυ Γρεεκ Δοψθμεντ", "Doc -with - tags", "A document with a . in it", "Doc with -- in it" ) suffixes = ( "pdf", "jpg", "jpeg", "gif", "png", "tiff", "tif", "pnm", "bmp", "PDF", "JPG", "JPEG", "GIF", "PNG", "TIFF", "TIF", "PNM", "BMP", "pDf", "jPg", "jpEg", "gIf", "pNg", "tIff", "tIf", "pNm", "bMp", ) for prefix in prefixes: for suffix in suffixes: name = "{}.{}".format(prefix, suffix) self.assertTrue(ConsumerDeclaration.test(name)) def test_test_handles_various_file_names_false(self): prefixes = ("doc",) suffixes = ("txt", "markdown", "",) for prefix in prefixes: for suffix in suffixes: name = "{}.{}".format(prefix, suffix) self.assertFalse(ConsumerDeclaration.test(name)) self.assertFalse(ConsumerDeclaration.test("")) self.assertFalse(ConsumerDeclaration.test("doc")) ================================================ FILE: src/paperless_text/__init__.py ================================================ ================================================ FILE: src/paperless_text/apps.py ================================================ from django.apps import AppConfig class PaperlessTextConfig(AppConfig): name = "paperless_text" def ready(self): from documents.signals import document_consumer_declaration from .signals import ConsumerDeclaration document_consumer_declaration.connect(ConsumerDeclaration.handle) AppConfig.ready(self) ================================================ FILE: src/paperless_text/parsers.py ================================================ import os import subprocess from django.conf import settings from documents.parsers import DocumentParser, ParseError class TextDocumentParser(DocumentParser): """ This parser directly parses a text document (.txt, .md, or .csv) """ CONVERT = settings.CONVERT_BINARY THREADS = int(settings.OCR_THREADS) if settings.OCR_THREADS else None UNPAPER = settings.UNPAPER_BINARY DEFAULT_OCR_LANGUAGE = settings.OCR_LANGUAGE OCR_ALWAYS = settings.OCR_ALWAYS def __init__(self, path): super().__init__(path) self._text = None def get_thumbnail(self): """ The thumbnail of a text file is just a 500px wide image of the text rendered onto a letter-sized page. """ # The below is heavily cribbed from https://askubuntu.com/a/590951 bg_color = "white" # bg color text_color = "black" # text color psize = [500, 647] # icon size n_lines = 50 # number of lines to show out_path = os.path.join(self.tempdir, "convert.png") temp_bg = os.path.join(self.tempdir, "bg.png") temp_txlayer = os.path.join(self.tempdir, "tx.png") picsize = "x".join([str(n) for n in psize]) txsize = "x".join([str(n - 8) for n in psize]) def create_bg(): work_size = ",".join([str(n - 1) for n in psize]) r = str(round(psize[0] / 10)) rounded = ",".join([r, r]) run_command( self.CONVERT, "-size ", picsize, ' xc:none -draw ', '"fill ', bg_color, ' roundrectangle 0,0,', work_size, ",", rounded, '" ', # NOQA: E501 temp_bg ) def read_text(): with open(self.document_path, 'r') as src: lines = [l.strip() for l in src.readlines()] text = "\n".join([l for l in lines[:n_lines]]) return text.replace('"', "'") def create_txlayer(): run_command( self.CONVERT, "-background none", "-fill", text_color, "-pointsize", "12", "-border 4 -bordercolor none", "-size ", txsize, ' caption:"', read_text(), '" ', temp_txlayer ) create_txlayer() create_bg() run_command( self.CONVERT, temp_bg, temp_txlayer, "-background None -layers merge ", out_path ) return out_path def get_text(self): if self._text is not None: return self._text with open(self.document_path, 'r') as f: self._text = f.read() return self._text def run_command(*args): environment = os.environ.copy() if settings.CONVERT_MEMORY_LIMIT: environment["MAGICK_MEMORY_LIMIT"] = settings.CONVERT_MEMORY_LIMIT if settings.CONVERT_TMPDIR: environment["MAGICK_TMPDIR"] = settings.CONVERT_TMPDIR if not subprocess.Popen(' '.join(args), env=environment, shell=True).wait() == 0: raise ParseError("Convert failed at {}".format(args)) ================================================ FILE: src/paperless_text/signals.py ================================================ import re from .parsers import TextDocumentParser class ConsumerDeclaration: MATCHING_FILES = re.compile(r"^.*\.(te?xt|md|csv)$") @classmethod def handle(cls, sender, **kwargs): return cls.test @classmethod def test(cls, doc): if cls.MATCHING_FILES.match(doc.lower()): return { "parser": TextDocumentParser, "weight": 10 } return None ================================================ FILE: src/reminders/__init__.py ================================================ ================================================ FILE: src/reminders/admin.py ================================================ from django.conf import settings from django.contrib import admin from .models import Reminder class ReminderAdmin(admin.ModelAdmin): class Media: css = { "all": ("paperless.css",) } list_per_page = settings.PAPERLESS_LIST_PER_PAGE list_display = ("date", "document", "note") list_filter = ("date",) list_editable = ("note",) admin.site.register(Reminder, ReminderAdmin) ================================================ FILE: src/reminders/apps.py ================================================ from django.apps import AppConfig class RemindersConfig(AppConfig): name = "reminders" ================================================ FILE: src/reminders/filters.py ================================================ from django_filters.rest_framework import CharFilter, FilterSet from .models import Reminder class ReminderFilterSet(FilterSet): class Meta(object): model = Reminder fields = { "document": ["exact"], "date": ["gt", "lt", "gte", "lte", "exact"], "note": ["istartswith", "iendswith", "icontains"] } ================================================ FILE: src/reminders/migrations/0001_initial.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.10.5 on 2017-03-25 15:58 from __future__ import unicode_literals from django.db import migrations, models import django.db.models.deletion class Migration(migrations.Migration): initial = True dependencies = [ ('documents', '0016_auto_20170325_1558'), ] operations = [ migrations.CreateModel( name='Reminder', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('date', models.DateTimeField()), ('note', models.TextField(blank=True)), ('document', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='documents.Document')), ], ), ] ================================================ FILE: src/reminders/migrations/0002_auto_20181007_1420.py ================================================ # Generated by Django 2.0.8 on 2018-10-07 14:20 from django.db import migrations, models import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ ('reminders', '0001_initial'), ] operations = [ migrations.AlterField( model_name='reminder', name='document', field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='documents.Document'), ), ] ================================================ FILE: src/reminders/migrations/__init__.py ================================================ ================================================ FILE: src/reminders/models.py ================================================ from django.db import models class Reminder(models.Model): document = models.ForeignKey( "documents.Document", on_delete=models.PROTECT) date = models.DateTimeField() note = models.TextField(blank=True) ================================================ FILE: src/reminders/serialisers.py ================================================ from documents.models import Document from rest_framework import serializers from .models import Reminder class ReminderSerializer(serializers.HyperlinkedModelSerializer): document = serializers.HyperlinkedRelatedField( view_name="drf:document-detail", queryset=Document.objects) class Meta(object): model = Reminder fields = ("id", "document", "date", "note") ================================================ FILE: src/reminders/tests.py ================================================ from django.test import TestCase # Create your tests here. ================================================ FILE: src/reminders/views.py ================================================ from django_filters.rest_framework import DjangoFilterBackend from rest_framework.filters import OrderingFilter from rest_framework.permissions import IsAuthenticated from rest_framework.viewsets import ( ModelViewSet, ) from .filters import ReminderFilterSet from .models import Reminder from .serialisers import ReminderSerializer from paperless.views import StandardPagination class ReminderViewSet(ModelViewSet): model = Reminder queryset = Reminder.objects serializer_class = ReminderSerializer pagination_class = StandardPagination permission_classes = (IsAuthenticated,) filter_backends = (DjangoFilterBackend, OrderingFilter) filter_class = ReminderFilterSet ordering_fields = ("date", "document") ================================================ FILE: src/setup.cfg ================================================ [pycodestyle] exclude = migrations, paperless/settings.py, .tox [tool:pytest] DJANGO_SETTINGS_MODULE=paperless.settings addopts = --pythonwarnings=all -n auto env = PAPERLESS_PASSPHRASE=THISISNOTASECRET PAPERLESS_SECRET=paperless PAPERLESS_EMAIL_SECRET=paperless [coverage:run] source = ./ omit = */tests ================================================ FILE: src/tox.ini ================================================ # Tox (http://tox.testrun.org/) is a tool for running tests # in multiple virtualenvs. This configuration file will run the # test suite on all supported python versions. To use it, "pip install tox" # and then run "tox" from this directory. [tox] skipsdist = True envlist = py34, py35, py36, py37, pycodestyle, doc [testenv] commands = pytest deps = -r{toxinidir}/../requirements.txt [testenv:pycodestyle] commands=pycodestyle deps=pycodestyle [testenv:doc] deps = -r {toxinidir}/../requirements.txt commands=sphinx-build -b html ../docs ../docs/_build -W